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

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


The following commit(s) were added to refs/heads/v2 by this push:
     new 2acc1da  ISIS-1976: further cleanup ServiceUtil, fixes a NPE regression
2acc1da is described below

commit 2acc1da22593a254f20cdb714e2066aa96f9bdc3
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Thu Oct 11 14:37:51 2018 +0200

    ISIS-1976: further cleanup ServiceUtil, fixes a NPE regression
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 ...jectSpecIdFacetDerivedFromClassNameFactory.java |  3 +-
 .../isis/core/metamodel/services/ServiceUtil.java  | 53 +++++++++++-----------
 .../core/metamodel/services/ServiceUtil_Test.java  |  8 ++--
 3 files changed, 33 insertions(+), 31 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
index 59db0a7..4d3d2ee 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/objectspecid/classname/ObjectSpecIdFacetDerivedFromClassNameFactory.java
@@ -74,7 +74,8 @@ MetaModelValidatorRefiner {
     private static ObjectSpecIdFacet createObjectSpecIdFacet(final FacetHolder 
facetHolder, final Class<?> substitutedClass) {
         final boolean isService = isService(facetHolder);
         if (isService) {
-            final String id = ServiceUtil.idOfType(substitutedClass);
+            
+            final String id = 
ServiceUtil.getExplicitelySpecifiedIdOfType(substitutedClass).orElse(null);
             if (id != null) {
                 return new 
ObjectSpecIdFacetDerivedFromDomainServiceAnnotationElseGetId(id, facetHolder);
             }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
index 0bb7773..769fa6c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServiceUtil.java
@@ -16,11 +16,10 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.services;
 
 import java.lang.reflect.Method;
-import java.util.function.Supplier;
+import java.util.Optional;
 
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.commons.internal.base._Strings;
@@ -33,36 +32,39 @@ public final class ServiceUtil {
     private ServiceUtil() {
     }
 
-    public static String idOfType(final Class<?> serviceClass) {
-        
-        final String serviceType = serviceTypeUsingAnnotation(serviceClass);
-        if (serviceType != null) {
-            return serviceType;
-        }
-
-        return serviceTypeUsingIdGetterOrElseGet(serviceClass, 
()->serviceClass.newInstance(), ()->null);
-    }
-
     public static String idOfPojo(final Object serviceObject) {
         final Class<?> serviceClass = serviceObject.getClass();
-        final String serviceType = serviceTypeUsingAnnotation(serviceClass);
-        if(serviceType != null) {
-            return serviceType;
-        }
-
-        return serviceTypeUsingIdGetterOrElseGet(serviceClass, 
()->serviceObject, ()->normalize(serviceClass));
+        return explicitelySpecifiedIdOfType(serviceClass, ()->serviceObject)
+                .orElseGet(()->normalize(serviceClass));
     }
     
     public static String idOfSpec(final ObjectSpecification serviceSpec) {
-        return idOfType(serviceSpec.getCorrespondingClass());
+        final Class<?> serviceClass = serviceSpec.getCorrespondingClass();
+        return explicitelySpecifiedIdOfType(serviceClass, 
serviceClass::newInstance)
+                .orElseGet(()->normalize(serviceClass));
+    }
+    
+    public static String idOfAdapter(final ManagedObject serviceAdapter) {
+        return idOfPojo(serviceAdapter.getPojo());
     }
     
-    public static String idOfAdapter(final ManagedObject adapter) {
-        return idOfPojo(adapter.getPojo());
+    public static Optional<String> getExplicitelySpecifiedIdOfType(final 
Class<?> serviceClass) {
+        return explicitelySpecifiedIdOfType(serviceClass, 
serviceClass::newInstance);
     }
     
     // -- HELPER
 
+    private static Optional<String> explicitelySpecifiedIdOfType(
+            final Class<?> serviceClass, 
+            final _Functions.CheckedSupplier<Object> serviceInstanceSupplier) {
+        
+        final String serviceType = serviceTypeUsingAnnotation(serviceClass);
+        if (serviceType != null) {
+            return Optional.of(serviceType);
+        }
+        return serviceTypeUsingIdGetter(serviceClass, serviceInstanceSupplier);
+    }
+    
     private static String serviceTypeUsingAnnotation(final Class<?> 
serviceClass) {
         final String serviceType;
         final DomainService domainService = 
serviceClass.getAnnotation(DomainService.class);
@@ -75,17 +77,16 @@ public final class ServiceUtil {
         return null;
     }
 
-    private static String serviceTypeUsingIdGetterOrElseGet(
+    private static Optional<String> serviceTypeUsingIdGetter(
             final Class<?> serviceClass, 
-            final _Functions.CheckedSupplier<Object> objectSupplier,
-            final Supplier<String> orElse
+            final _Functions.CheckedSupplier<Object> serviceInstanceSupplier
             ) {
         
         try {
             final Method m = serviceClass.getMethod("getId");
-            return (String) m.invoke(objectSupplier.get());
+            return Optional.ofNullable((String) 
m.invoke(serviceInstanceSupplier.get()));
         } catch (Exception e) {
-            return orElse.get();
+            return Optional.empty();
         }
     }
     
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceUtil_Test.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceUtil_Test.java
index 4549312..cd266fb 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceUtil_Test.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServiceUtil_Test.java
@@ -63,7 +63,7 @@ public class ServiceUtil_Test {
                 is(equalTo("foo.SomeServiceAnnotated")));
 
         assertThat(
-                ServiceUtil.idOfType(SomeServiceAnnotated.class),
+                
ServiceUtil.getExplicitelySpecifiedIdOfType(SomeServiceAnnotated.class).orElse(null),
                 is(equalTo("foo.SomeServiceAnnotated")));
     }
 
@@ -75,7 +75,7 @@ public class ServiceUtil_Test {
                 is(equalTo("bar.SomeServiceWithId")));
 
         assertThat(
-                ServiceUtil.idOfType(SomeServiceWithId.class),
+                
ServiceUtil.getExplicitelySpecifiedIdOfType(SomeServiceWithId.class).orElse(null),
                 is(equalTo("bar.SomeServiceWithId")));
     }
 
@@ -87,7 +87,7 @@ public class ServiceUtil_Test {
                 is(equalTo("bop.SomeServiceAnnotated")));
 
         assertThat(
-                ServiceUtil.idOfType(SomeServiceAnnotatedAndWithId.class),
+                
ServiceUtil.getExplicitelySpecifiedIdOfType(SomeServiceAnnotatedAndWithId.class).orElse(null),
                 is(equalTo("bop.SomeServiceAnnotated")));
     }
 
@@ -97,7 +97,7 @@ public class ServiceUtil_Test {
                 ServiceUtil.idOfPojo(new SomeServiceWithoutAnnotationOrId()),
                 
is(equalTo("org.apache.isis.core.metamodel.services.ServiceUtil_Test$SomeServiceWithoutAnnotationOrId")));
         assertThat(
-                ServiceUtil.idOfType(SomeServiceWithoutAnnotationOrId.class),
+                
ServiceUtil.getExplicitelySpecifiedIdOfType(SomeServiceWithoutAnnotationOrId.class).orElse(null),
                 is(nullValue()));
     }
 

Reply via email to