You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/07/22 11:45:51 UTC

[isis] 01/02: ISIS-2815: some hosuekeeping around resource loading

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 071816d3f1326b8a3c219c7c76dce0c6ea30f8be
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jul 22 13:41:05 2021 +0200

    ISIS-2815: some hosuekeeping around resource loading
---
 .../isis/commons/internal/base/_Optionals.java     |   5 +-
 .../apache/isis/commons/internal/base/_With.java   |  52 +++----
 .../commons/internal/resources/_Resources.java     |  22 ++-
 .../facets/FacetsFacetAnnotationFactoryTest.java   | 152 ---------------------
 4 files changed, 41 insertions(+), 190 deletions(-)

diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java
index 5240b30..a0f67b9 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java
@@ -26,7 +26,10 @@ import lombok.experimental.UtilityClass;
 @UtilityClass
 public class _Optionals {
 
-    // can be replaced by Java 9 firstOptional.or(() -> secondOptional);
+    /**
+     * @deprecated since Java 9 can be replaced with {@code firstOptional.or(() -> secondOptional)};
+     */
+    @Deprecated
     public static <T> Optional<T> or(
             final Optional<? extends T> a,
             final Supplier<Optional<? extends T>> b) {
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java
index 5c52622..fd045ce 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java
@@ -58,7 +58,7 @@ public final class _With<T> {
      * @param orElse (nullable)
      * @return {@code obj!=null ? obj : orElse}
      */
-    public static <X> X ifPresentElse(@Nullable X obj, @Nullable X orElse) {
+    public static <X> X ifPresentElse(@Nullable final X obj, @Nullable final X orElse) {
         return obj!=null ? obj : orElse;
     }
 
@@ -68,7 +68,7 @@ public final class _With<T> {
      * @param elseGet
      * @return {@code obj!=null ? obj : elseGet.get()}
      */
-    public static <X> X ifPresentElseGet(@Nullable X obj, Supplier<X> elseGet) {
+    public static <X> X ifPresentElseGet(@Nullable final X obj, final Supplier<X> elseGet) {
         return obj!=null ? obj : requires(elseGet, "elseGet").get();
     }
 
@@ -80,8 +80,8 @@ public final class _With<T> {
      * @throws E
      */
     public static <X, E extends Exception> X ifPresentElseThrow(
-            @Nullable X obj,
-            Supplier<E> elseThrow)
+            @Nullable final X obj,
+            final Supplier<E> elseThrow)
                     throws E {
         if(obj!=null) {
             return obj;
@@ -97,7 +97,7 @@ public final class _With<T> {
      * @param consumer
      * @return {@code obj}
      */
-    public static <X> X accept(@Nullable X obj, Consumer<X> consumer) {
+    public static <X> X accept(@Nullable final X obj, final Consumer<X> consumer) {
         requires(consumer, "consumer").accept(obj);
         return obj;
     }
@@ -108,7 +108,7 @@ public final class _With<T> {
      * @param ifPresent
      * @return {@code obj}
      */
-    public static <X> X acceptIfPresent(@Nullable X obj, Consumer<X> ifPresent) {
+    public static <X> X acceptIfPresent(@Nullable final X obj, final Consumer<X> ifPresent) {
         if(obj!=null) {
             requires(ifPresent, "ifPresent").accept(obj);
         }
@@ -123,7 +123,7 @@ public final class _With<T> {
      * @param elseRun
      * @return {@code obj}
      */
-    public static <X> X acceptIfPresentElseRun(@Nullable X obj, Consumer<X> ifPresent, Runnable elseRun) {
+    public static <X> X acceptIfPresentElseRun(@Nullable final X obj, final Consumer<X> ifPresent, final Runnable elseRun) {
         if(obj!=null) {
             requires(ifPresent, "ifPresent").accept(obj);
         } else {
@@ -142,7 +142,7 @@ public final class _With<T> {
      * @throws E
      */
     public static <X, E extends Exception> X acceptIfPresentElseThrow(
-            @Nullable X obj, Consumer<X> ifPresent, Supplier<E> elseThrow)
+            @Nullable final X obj, final Consumer<X> ifPresent, final Supplier<E> elseThrow)
                     throws E {
 
         if(obj!=null) {
@@ -160,7 +160,7 @@ public final class _With<T> {
      * @param supplier
      * @return {@code obj!=null ? obj : supplier.get()}
      */
-    public static <X> X computeIfAbsent(@Nullable X obj, Supplier<X> supplier) {
+    public static <X> X computeIfAbsent(@Nullable final X obj, final Supplier<X> supplier) {
         return obj!=null ? obj : requires(supplier, "supplier").get();
     }
 
@@ -173,7 +173,7 @@ public final class _With<T> {
      * @param orElse (nullable)
      * @return {@code obj!=null ? mapper.apply(obj) : orElse}
      */
-    public static <X, R> R mapIfPresentElse(@Nullable X obj, Function<X, R> mapper, @Nullable R orElse) {
+    public static <X, R> R mapIfPresentElse(@Nullable final X obj, final Function<X, R> mapper, @Nullable final R orElse) {
         return obj!=null ? requires(mapper, "mapper").apply(obj) : orElse;
     }
 
@@ -184,7 +184,7 @@ public final class _With<T> {
      * @param elseGet
      * @return {@code obj!=null ? mapper.apply(obj) : elseGet.get()}
      */
-    public static <X, R> R mapIfPresentElseGet(@Nullable X obj, Function<X, R> mapper, Supplier<R> elseGet) {
+    public static <X, R> R mapIfPresentElseGet(@Nullable final X obj, final Function<X, R> mapper, final Supplier<R> elseGet) {
         return obj!=null ? requires(mapper, "mapper").apply(obj) : requires(elseGet, "elseGet").get();
     }
 
@@ -197,9 +197,9 @@ public final class _With<T> {
      * @throws E
      */
     public static <X, R, E extends Exception> R mapIfPresentElseThrow(
-            @Nullable X obj,
-            Function<X, R> mapper,
-            Supplier<E> elseThrow)
+            @Nullable final X obj,
+            final Function<X, R> mapper,
+            final Supplier<E> elseThrow)
                     throws E {
         if(obj!=null) {
             return requires(mapper, "mapper").apply(obj);
@@ -215,8 +215,10 @@ public final class _With<T> {
      * @param paramName to use for the exception message, when the non-null-check fails
      * @return {@code obj!=null ? obj : throw NullPointerException}
      * @throws NullPointerException if {@code obj} is {@code null}
+     * @deprecated use {@code @lombok.NonNull} on the parameter instead
      */
-    public static <T> T requires(@Nullable T obj, String paramName) {
+    @Deprecated
+    public static <T> T requires(@Nullable final T obj, final String paramName) {
         if (obj == null) {
             val msg = String.format("Parameter/Field '%s' is required to be present (not null).", paramName);
             throw new IllegalArgumentException(msg);
@@ -234,7 +236,7 @@ public final class _With<T> {
      * @throws NullPointerException if {@code obj} is {@code null}
      * @throws IllegalArgumentException if {@code obj} is 'empty'
      */
-    public static String requiresNotEmpty(@Nullable String obj, String paramName) {
+    public static String requiresNotEmpty(@Nullable final String obj, final String paramName) {
         if (obj == null) {
             throw new NullPointerException(String.format("Parameter/Field '%s' is required to be present (not null).", paramName));
         }
@@ -252,7 +254,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new Object as provided by {@code factory} after calling the {@code initializer} on it
      */
-    public static <T> T create(Supplier<T> factory, Consumer<T> initializer) {
+    public static <T> T create(final Supplier<T> factory, final Consumer<T> initializer) {
         return accept(factory.get(), initializer);
     }
 
@@ -261,7 +263,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new ArrayList after calling the {@code initializer} on it
      */
-    public static <X> ArrayList<X> arrayList(Consumer<ArrayList<X>> initializer) {
+    public static <X> ArrayList<X> arrayList(final Consumer<ArrayList<X>> initializer) {
         return create(ArrayList::new, initializer);
     }
 
@@ -270,7 +272,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new HashSet after calling the {@code initializer} on it
      */
-    public static <X> HashSet<X> hashSet(Consumer<HashSet<X>> initializer) {
+    public static <X> HashSet<X> hashSet(final Consumer<HashSet<X>> initializer) {
         return create(HashSet::new, initializer);
     }
 
@@ -279,7 +281,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new TreeSet after calling the {@code initializer} on it
      */
-    public static <X> TreeSet<X> treeSet(Consumer<TreeSet<X>> initializer) {
+    public static <X> TreeSet<X> treeSet(final Consumer<TreeSet<X>> initializer) {
         return create(TreeSet::new, initializer);
     }
 
@@ -288,7 +290,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new HashMap after calling the {@code initializer} on it
      */
-    public static <K, V> HashMap<K, V> hashMap(Consumer<HashMap<K, V>> initializer) {
+    public static <K, V> HashMap<K, V> hashMap(final Consumer<HashMap<K, V>> initializer) {
         return accept(new HashMap<K, V>(), initializer);
     }
 
@@ -297,7 +299,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new TreeMap after calling the {@code initializer} on it
      */
-    public static <K, V> TreeMap<K, V> treeMap(Consumer<TreeMap<K, V>> initializer) {
+    public static <K, V> TreeMap<K, V> treeMap(final Consumer<TreeMap<K, V>> initializer) {
         return accept(new TreeMap<K, V>(), initializer);
     }
 
@@ -306,7 +308,7 @@ public final class _With<T> {
      * @param initializer
      * @return a new StringBuilder after calling the {@code initializer} on it
      */
-    public static StringBuilder stringBuilder(Consumer<StringBuilder> initializer) {
+    public static StringBuilder stringBuilder(final Consumer<StringBuilder> initializer) {
         return create(StringBuilder::new, initializer);
     }
 
@@ -316,7 +318,7 @@ public final class _With<T> {
      * Returns Optional of the callable's result after invocation. Any exception during
      * invocation will result in an empty Optional.
      */
-    public static <T> Optional<T> tryCall(Callable<T> callable) {
+    public static <T> Optional<T> tryCall(final Callable<T> callable) {
         try {
             val result = callable.call();
             return Optional.ofNullable(result);
@@ -329,7 +331,7 @@ public final class _With<T> {
      * Returns the callable's result after invocation. Any exception during
      * invocation will result in the defaultValue being returned instead.
      */
-    public static <T> T tryOrDefault(Callable<T> callable, T defaultValue) {
+    public static <T> T tryOrDefault(final Callable<T> callable, final T defaultValue) {
         try {
             return callable.call();
         } catch (Exception e) {
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/resources/_Resources.java b/commons/src/main/java/org/apache/isis/commons/internal/resources/_Resources.java
index a45804c..e569ded 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/resources/_Resources.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/resources/_Resources.java
@@ -30,10 +30,10 @@ import javax.annotation.Nullable;
 
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.commons.internal.base._With;
 import org.apache.isis.commons.internal.context._Context;
 
 import lombok.NonNull;
+import lombok.SneakyThrows;
 import lombok.val;
 
 /**
@@ -57,14 +57,13 @@ public final class _Resources {
      * @param resourceName
      * @return An input stream for reading the resource, or null if the resource could not be found.
      */
+    @SneakyThrows
     public static @Nullable InputStream load(
             final @NonNull Class<?> contextClass,
             final @NonNull String resourceName) {
 
         val absoluteResourceName = resolveName(resourceName, contextClass);
-
-        return _Context.getDefaultClassLoader()
-                .getResourceAsStream(absoluteResourceName);
+        return _Context.getDefaultClassLoader().getResourceAsStream(absoluteResourceName);
     }
 
     /**
@@ -76,7 +75,7 @@ public final class _Resources {
      * @return The resource as a String, or null if the resource could not be found.
      * @throws IOException
      */
-    public static String loadAsString(
+    public static @Nullable String loadAsString(
             final @NonNull Class<?> contextClass,
             final @NonNull String resourceName,
             final @NonNull Charset charset) throws IOException {
@@ -88,7 +87,7 @@ public final class _Resources {
     /**
      * Shortcut using Charset UTF-8, see {@link #loadAsString(Class, String, Charset)}
      */
-    public static String loadAsStringUtf8(
+    public static @Nullable String loadAsStringUtf8(
             final @NonNull Class<?> contextClass,
             final @NonNull String resourceName) throws IOException {
         return loadAsString(contextClass, resourceName, StandardCharsets.UTF_8);
@@ -98,12 +97,12 @@ public final class _Resources {
      * @param resourceName
      * @return The resource location as an URL, or null if the resource could not be found.
      */
-    public static URL getResourceUrl(
+    public static @Nullable URL getResourceUrl(
             final @NonNull Class<?> contextClass,
             final @NonNull String resourceName) {
 
-        _With.requires(resourceName, "resourceName");
         final String absoluteResourceName = resolveName(resourceName, contextClass);
+
         return _Context.getDefaultClassLoader().getResource(absoluteResourceName);
     }
 
@@ -118,8 +117,7 @@ public final class _Resources {
      * to the web-app's context root.
      * @param resourcePath
      */
-    public static boolean isLocalResource(String resourcePath) {
-        _With.requires(resourcePath, "resourcePath");
+    public static boolean isLocalResource(final @NonNull String resourcePath) {
         return !externalResourcePattern.test(resourcePath);
     }
 
@@ -130,7 +128,7 @@ public final class _Resources {
      * @param extendee
      * @param suffix
      */
-    public static String combinePath(@Nullable String extendee, @Nullable String suffix) {
+    public static String combinePath(@Nullable final String extendee, @Nullable final String suffix) {
         return _Strings.combineWithDelimiter(extendee, suffix, "/");
     }
 
@@ -140,7 +138,7 @@ public final class _Resources {
      *
      * Adapted copy of JDK 8 Class::resolveName
      */
-    private static String resolveName(String name, Class<?> contextClass) {
+    private static String resolveName(String name, final Class<?> contextClass) {
         if (name == null) {
             return name;
         }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java
deleted file mode 100644
index 5359eec..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/facets/FacetsFacetAnnotationFactoryTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.object.facets;
-
-import org.apache.isis.applib.annotation.Facets;
-import org.apache.isis.commons.collections.ImmutableEnumSet;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
-import org.apache.isis.core.metamodel.facets.object.facets.annotation.FacetsFacetAnnotation;
-import org.apache.isis.core.metamodel.facets.object.facets.annotation.FacetsFacetAnnotationFactory;
-
-public class FacetsFacetAnnotationFactoryTest extends AbstractFacetFactoryTest {
-
-    private FacetsFacetAnnotationFactory facetFactory;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-
-        facetFactory = new FacetsFacetAnnotationFactory(metaModelContext);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        facetFactory = null;
-        super.tearDown();
-    }
-
-    public static class CustomerFacetFactory implements FacetFactory {
-        @Override
-        public ImmutableEnumSet<FeatureType> getFeatureTypes() {
-            return ImmutableEnumSet.noneOf(FeatureType.class);
-        }
-
-        @Override
-        public void process(final ProcessClassContext processClassContaxt) {
-        }
-
-        @Override
-        public void process(final ProcessMethodContext processMethodContext) {
-        }
-
-        @Override
-        public void processParams(final ProcessParameterContext processParameterContext) {
-        }
-    }
-
-    public static class CustomerFacetFactory2 implements FacetFactory {
-        @Override
-        public ImmutableEnumSet<FeatureType> getFeatureTypes() {
-            return ImmutableEnumSet.noneOf(FeatureType.class);
-        }
-
-        @Override
-        public void process(final ProcessClassContext processClassContaxt) {
-        }
-
-        @Override
-        public void process(final ProcessMethodContext processMethodContext) {
-        }
-
-        @Override
-        public void processParams(final ProcessParameterContext processParameterContext) {
-        }
-    }
-
-    public void testFacetsFactoryNames() {
-        @Facets(facetFactoryNames = { "org.apache.isis.core.metamodel.facets.object.facets.FacetsFacetAnnotationFactoryTest$CustomerFacetFactory", "FacetsFacetAnnotationFactoryTest$CustomerNotAFacetFactory" })
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(FacetsFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof FacetsFacetAnnotation);
-        final FacetsFacetAnnotation facetsFacet = (FacetsFacetAnnotation) facet;
-        final Class<? extends FacetFactory>[] facetFactories = facetsFacet.facetFactories();
-        assertEquals(1, facetFactories.length);
-        assertEquals(CustomerFacetFactory.class, facetFactories[0]);
-
-        assertNoMethodsRemoved();
-    }
-
-    public void testFacetsFactoryClass() {
-        @Facets(facetFactoryClasses = { FacetsFacetAnnotationFactoryTest.CustomerFacetFactory.class, FacetsFacetAnnotationFactoryTest.CustomerNotAFacetFactory.class })
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(FacetsFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof FacetsFacetAnnotation);
-        final FacetsFacetAnnotation facetsFacet = (FacetsFacetAnnotation) facet;
-        final Class<? extends FacetFactory>[] facetFactories = facetsFacet.facetFactories();
-        assertEquals(1, facetFactories.length);
-        assertEquals(CustomerFacetFactory.class, facetFactories[0]);
-    }
-
-    public static class CustomerNotAFacetFactory {
-    }
-
-    public void testFacetsFactoryNameAndClass() {
-        @Facets(facetFactoryNames = { "org.apache.isis.core.metamodel.facets.object.facets.FacetsFacetAnnotationFactoryTest$CustomerFacetFactory" }, facetFactoryClasses = { FacetsFacetAnnotationFactoryTest.CustomerFacetFactory2.class })
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(FacetsFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof FacetsFacetAnnotation);
-        final FacetsFacetAnnotation facetsFacet = (FacetsFacetAnnotation) facet;
-        final Class<? extends FacetFactory>[] facetFactories = facetsFacet.facetFactories();
-        assertEquals(2, facetFactories.length);
-        assertEquals(CustomerFacetFactory.class, facetFactories[0]);
-        assertEquals(CustomerFacetFactory2.class, facetFactories[1]);
-    }
-
-    public void testFacetsFactoryNoop() {
-        @Facets
-        class Customer {
-        }
-
-        facetFactory.process(new ProcessClassContext(Customer.class, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(FacetsFacet.class);
-        assertNull(facet);
-    }
-
-}