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())); }