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 2018/02/28 15:03:44 UTC

[isis] 02/03: ISIS-1841 make class discovery a plugin

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 f058eacb356a1a8df4a2a397ce70b06d764ff3a0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Feb 28 15:59:06 2018 +0100

    ISIS-1841 make class discovery a plugin
---
 .../isis/applib/internal/discover/_Discover.java   | 85 +++++++++++++++++++++
 .../{reflection => discover}/package-info.java     |  2 +-
 .../isis/applib/internal/reflection/_Reflect.java  | 83 --------------------
 .../classdiscovery/ClassDiscovery.java}            | 43 +++++++++--
 .../classdiscovery/ClassDiscoveryPlugin.java       | 69 +++++++++++++++++
 ...ions.java => ClassDiscoveryServiceDefault.java} |  6 +-
 core/plugins/discovery-reflections/.gitignore      |  1 +
 core/plugins/discovery-reflections/pom.xml         | 89 ++++++++++++++++++++++
 .../ClassDiscoveryUsingReflectionsPlugin.java      | 36 +++++++++
 .../reflections/ReflectDiscovery.java}             | 22 +++---
 .../reflections/ReflectManifest.java}              |  6 +-
 .../services/ServicesInstallerFromAnnotation.java  |  6 +-
 .../IsisComponentProvider.java                     |  6 +-
 .../PersistenceCapableTypeFinder.java              |  4 +-
 14 files changed, 341 insertions(+), 117 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
new file mode 100644
index 0000000..19730b0
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/_Discover.java
@@ -0,0 +1,85 @@
+/*
+ *  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.applib.internal.discover;
+
+import java.util.List;
+import java.util.Set;
+
+import org.apache.isis.applib.internal.context._Context;
+import org.apache.isis.applib.internal.context._Plugin;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscovery;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscoveryPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * <h1>- internal use only -</h1>
+ * <p>
+ * Java reflective utilities.
+ * </p>
+ * <p>
+ * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
+ * These may be changed or removed without notice!
+ * </p>
+ * @since 2.0.0
+ */
+public final class _Discover {
+
+	private _Discover(){}
+	
+	// -- CLASS DISCOVERY VIA PLUGIN
+
+	//TODO missing java-doc
+	public static ClassDiscovery discover(String packageNamePrefix) {
+		return getPlugin().discover(packageNamePrefix);
+	}
+	
+	//TODO missing java-doc
+	public static ClassDiscovery discover(List<String> packageNamePrefixes) {
+		return getPlugin().discover(packageNamePrefixes);
+	}
+	
+	//TODO missing java-doc 
+	public static ClassDiscovery discoverFullscan(String packageNamePrefix) {
+		return getPlugin().discover(packageNamePrefix);
+	}
+	
+	// -- HELPER
+	
+	private static ClassDiscoveryPlugin getPlugin() {
+		return _Context.computeIfAbsent(ClassDiscoveryPlugin.class, __->loadPluginsPickAny());
+	}
+
+	private static ClassDiscoveryPlugin loadPluginsPickAny() {
+		final Set<ClassDiscoveryPlugin> plugins = _Plugin.load(ClassDiscoveryPlugin.class);
+		
+		if(plugins.isEmpty()) {
+			return ClassDiscoveryPlugin.nop();
+		}
+		
+		if(plugins.size()>1) {
+			final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
+			LOG.warn("you have more than one ClassDiscoveryPlugin on your class path, just picking one");
+		}
+		
+		return plugins.iterator().next();
+	}
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/package-info.java
similarity index 95%
copy from core/applib/src/main/java/org/apache/isis/applib/internal/reflection/package-info.java
copy to core/applib/src/main/java/org/apache/isis/applib/internal/discover/package-info.java
index 49537d2..7dccefa 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/package-info.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/discover/package-info.java
@@ -25,4 +25,4 @@
  * Do NOT use any of the classes provided by this package!
  * </p>
  */
-package org.apache.isis.applib.internal.reflection;
\ No newline at end of file
+package org.apache.isis.applib.internal.discover;
\ No newline at end of file
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect.java b/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect.java
deleted file mode 100644
index 589cf31..0000000
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect.java
+++ /dev/null
@@ -1,83 +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.applib.internal.reflection;
-
-import java.lang.annotation.Annotation;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.isis.applib.internal.context._Context;
-import org.reflections.scanners.SubTypesScanner;
-import org.reflections.util.ClasspathHelper;
-
-/**
- * <h1>- internal use only -</h1>
- * <p>
- * Java reflective utilities.
- * </p>
- * <p>
- * <b>WARNING</b>: Do <b>NOT</b> use any of the classes provided by this package! <br/> 
- * These may be changed or removed without notice!
- * </p>
- * @since 2.0.0
- */
-public final class _Reflect {
-
-	private _Reflect(){}
-	
-	// -- REFLECTIVE CLASS DISCOVERY
-	
-	/**
-	 *	Provides search-methods on class hierarchies.  
-	 */
-	public static interface Discovery {
-		
-		//TODO missing java-doc
-		public Set<Class<?>> getTypesAnnotatedWith(Class<? extends Annotation> annotation);
-		
-		//TODO missing java-doc
-		public <T> Set<Class<? extends T>> getSubTypesOf(Class<T> type);
-	}
-
-	//TODO missing java-doc
-	public static Discovery discover(String packageNamePrefix) {
-		_Reflect_Manifest.prepareDiscovery(); 	//TODO [ahuber] REVIEW why is this required?
-		return _Reflect_Discovery.of(packageNamePrefix);
-	}
-	
-	//TODO missing java-doc
-	public static Discovery discover(List<String> packageNamePrefixes) {
-		_Reflect_Manifest.prepareDiscovery();	//TODO [ahuber] REVIEW why is this required?
-		return _Reflect_Discovery.of(packageNamePrefixes);
-	}
-	
-	//TODO missing java-doc 
-	//TODO [ahuber] REVIEW how is this different from discover(String) 
-	public static Discovery discoverFullscan(String packageNamePrefix) {
-		_Reflect_Manifest.prepareDiscovery();	//TODO [ahuber] REVIEW why is this required?
-		return _Reflect_Discovery.of(
-				ClasspathHelper.forClassLoader(_Context.getDefaultClassLoader()),
-				ClasspathHelper.forClass(Object.class),
-				ClasspathHelper.forPackage(packageNamePrefix),
-				new SubTypesScanner(false)
-		);
-	}
-	
-}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/package-info.java b/core/applib/src/main/java/org/apache/isis/applib/plugins/classdiscovery/ClassDiscovery.java
similarity index 50%
rename from core/applib/src/main/java/org/apache/isis/applib/internal/reflection/package-info.java
rename to core/applib/src/main/java/org/apache/isis/applib/plugins/classdiscovery/ClassDiscovery.java
index 49537d2..b9e07f9 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/package-info.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/plugins/classdiscovery/ClassDiscovery.java
@@ -16,13 +16,40 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+
+package org.apache.isis.applib.plugins.classdiscovery;
+
+import java.lang.annotation.Annotation;
+import java.util.Collections;
+import java.util.Set;
+
 /**
- * <h1>Internal API</h1>
- * Internal classes, contributing to the internal proprietary API. 
- * These may be changed or removed without notice!
- * <p>
- * <b>WARNING</b>: 
- * Do NOT use any of the classes provided by this package!
- * </p>
+ * Provides search-methods on class hierarchies.
+ * 
+ * @since 2.0.0
  */
-package org.apache.isis.applib.internal.reflection;
\ No newline at end of file
+public interface ClassDiscovery {
+
+	//TODO missing java-doc
+	public Set<Class<?>> getTypesAnnotatedWith(Class<? extends Annotation> annotation);
+	
+	//TODO missing java-doc
+	public <T> Set<Class<? extends T>> getSubTypesOf(Class<T> type);
+	
+	public static ClassDiscovery empty() {
+		
+		return new ClassDiscovery() {
+			
+			@Override
+			public Set<Class<?>> getTypesAnnotatedWith(Class<? extends Annotation> annotation) {
+				return Collections.emptySet();
+			}
+			
+			@Override
+			public <T> Set<Class<? extends T>> getSubTypesOf(Class<T> type) {
+				return Collections.emptySet();
+			}
+		};
+	}
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/plugins/classdiscovery/ClassDiscoveryPlugin.java b/core/applib/src/main/java/org/apache/isis/applib/plugins/classdiscovery/ClassDiscoveryPlugin.java
new file mode 100644
index 0000000..f320b06
--- /dev/null
+++ b/core/applib/src/main/java/org/apache/isis/applib/plugins/classdiscovery/ClassDiscoveryPlugin.java
@@ -0,0 +1,69 @@
+/*
+ *  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.applib.plugins.classdiscovery;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public interface ClassDiscoveryPlugin {
+	
+	//TODO missing java-doc
+	public ClassDiscovery discover(String packageNamePrefix);
+	
+	//TODO missing java-doc
+	public ClassDiscovery discover(List<String> packageNamePrefixes);
+	
+	//TODO missing java-doc 
+	//TODO [ahuber] REVIEW how is this different from discover(String) 
+	public ClassDiscovery discoverFullscan(String packageNamePrefix);
+	
+	// -- NOP IMPLEMENTATION
+	
+	public static ClassDiscoveryPlugin nop() {
+		return new ClassDiscoveryPlugin() {
+			
+			private final Logger LOG = LoggerFactory.getLogger(ClassDiscoveryPlugin.class);
+			
+			@Override
+			public ClassDiscovery discoverFullscan(String packageNamePrefix) {
+				return warn();
+			}
+			
+			@Override
+			public ClassDiscovery discover(List<String> packageNamePrefixes) {
+				return warn();
+			}
+			
+			@Override
+			public ClassDiscovery discover(String packageNamePrefix) {
+				return warn();
+			}
+			
+			private ClassDiscovery warn() {
+				LOG.error("you need a ClassDiscoveryPlugin on your class path, class discovery will not work");
+				return ClassDiscovery.empty();
+			}
+			
+		};
+	}
+	
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceUsingReflections.java b/core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
similarity index 92%
rename from core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceUsingReflections.java
rename to core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
index ff48a8e..acd27f3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceUsingReflections.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceDefault.java
@@ -28,7 +28,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 import org.apache.isis.applib.internal.base._Casts;
-import org.apache.isis.applib.internal.reflection._Reflect;
+import org.apache.isis.applib.internal.discover._Discover;
 
 /**
  * This utility service supports the dynamic discovery of classes from the classpath.  One service that uses this
@@ -44,7 +44,7 @@ import org.apache.isis.applib.internal.reflection._Reflect;
 		nature = NatureOfService.DOMAIN,
 		menuOrder = "" + Integer.MAX_VALUE
 		)
-public class ClassDiscoveryServiceUsingReflections
+public class ClassDiscoveryServiceDefault
 extends AbstractService 
 implements ClassDiscoveryService {
 
@@ -57,7 +57,7 @@ implements ClassDiscoveryService {
 		}
 
 		// no appManifest or not asking for FixtureScripts
-		return _Reflect.discoverFullscan(packageNamePrefix).getSubTypesOf(type);
+		return _Discover.discoverFullscan(packageNamePrefix).getSubTypesOf(type);
 	}
 
 	// -- HELPER
diff --git a/core/plugins/discovery-reflections/.gitignore b/core/plugins/discovery-reflections/.gitignore
new file mode 100644
index 0000000..a48e45b
--- /dev/null
+++ b/core/plugins/discovery-reflections/.gitignore
@@ -0,0 +1 @@
+/target-ide
diff --git a/core/plugins/discovery-reflections/pom.xml b/core/plugins/discovery-reflections/pom.xml
new file mode 100644
index 0000000..760e67d
--- /dev/null
+++ b/core/plugins/discovery-reflections/pom.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<parent>
+		<groupId>org.apache.isis.core</groupId>
+		<artifactId>isis</artifactId>
+		<version>2.0.0-M1-SNAPSHOT</version>
+	</parent>
+
+	<artifactId>isis-core-plugins-discovery-reflections</artifactId>
+
+	<name>Apache Isis Discovery Plugin</name>
+	<description>
+        Class discovery plugin using reflections.org.
+    </description>
+
+	<properties>
+		<jar-plugin.automaticModuleName>org.apache.isis.plugins.discovery-reflections</jar-plugin.automaticModuleName>
+		<git-plugin.propertiesDir>org/apache/isis/plugins/discovery-reflections</git-plugin.propertiesDir>
+	</properties>
+
+	<build>
+		<resources>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/resources</directory>
+			</resource>
+			<resource>
+				<filtering>false</filtering>
+				<directory>src/main/java</directory>
+				<includes>
+					<include>**</include>
+				</includes>
+				<excludes>
+					<exclude>**/*.java</exclude>
+				</excludes>
+			</resource>
+		</resources>
+	</build>
+
+	<dependencies>
+		<!-- compile dependencies -->
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-core-applib</artifactId>
+			<scope>compile</scope>
+		</dependency>
+		
+	    <!-- as used by internal API, 
+       	also provides com.google.code.findbugs/annotations @Nullable, 
+       	but not transitive -->
+        <dependency>
+            <groupId>org.reflections</groupId>
+            <artifactId>reflections</artifactId>
+            <!--
+            ideally we would like to make this optional (to enforce usage of internal
+             reflective API, with only applib is allowed to access reflections directly.
+              HOWEVER, there is also a runtime dependency on org.reflections.vfs.Vfs.UrlType. -->
+            <optional>false</optional>
+            <exclusions>
+            	<exclusion>
+            	    <!-- whatever reflections is dependent on, it should not be transitive  -->
+            		<groupId>com.google.guava</groupId>
+            		<artifactId>guava</artifactId>
+            	</exclusion>
+            </exclusions>
+        </dependency>
+
+	</dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ClassDiscoveryUsingReflectionsPlugin.java b/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ClassDiscoveryUsingReflectionsPlugin.java
new file mode 100644
index 0000000..54bd85c
--- /dev/null
+++ b/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ClassDiscoveryUsingReflectionsPlugin.java
@@ -0,0 +1,36 @@
+package org.apache.isis.applib.plugins.classdiscovery.reflections;
+
+import java.util.List;
+
+import org.apache.isis.applib.internal.context._Context;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscovery;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscoveryPlugin;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.util.ClasspathHelper;
+
+public class ClassDiscoveryUsingReflectionsPlugin implements ClassDiscoveryPlugin {
+
+	@Override
+	public ClassDiscovery discover(String packageNamePrefix) {
+		ReflectManifest.prepareDiscovery(); 	//TODO [ahuber] REVIEW why is this required?
+		return ReflectDiscovery.of(packageNamePrefix);
+	}
+
+	@Override
+	public ClassDiscovery discover(List<String> packageNamePrefixes) {
+		ReflectManifest.prepareDiscovery();	//TODO [ahuber] REVIEW why is this required?
+		return ReflectDiscovery.of(packageNamePrefixes);
+	}
+
+	@Override
+	public ClassDiscovery discoverFullscan(String packageNamePrefix) {
+		ReflectManifest.prepareDiscovery();	//TODO [ahuber] REVIEW why is this required?
+		return ReflectDiscovery.of(
+				ClasspathHelper.forClassLoader(_Context.getDefaultClassLoader()),
+				ClasspathHelper.forClass(Object.class),
+				ClasspathHelper.forPackage(packageNamePrefix),
+				new SubTypesScanner(false)
+		);
+	}
+
+}
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java b/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ReflectDiscovery.java
similarity index 71%
rename from core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java
rename to core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ReflectDiscovery.java
index 9059e05..0d04799 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java
+++ b/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ReflectDiscovery.java
@@ -1,4 +1,4 @@
-package org.apache.isis.applib.internal.reflection;
+package org.apache.isis.applib.plugins.classdiscovery.reflections;
 
 import java.lang.annotation.Annotation;
 import java.util.HashSet;
@@ -11,35 +11,35 @@ import java.util.stream.Stream;
 import javax.validation.constraints.NotNull;
 
 import org.apache.isis.applib.internal.base._NullSafe;
-import org.apache.isis.applib.internal.reflection._Reflect.Discovery;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscovery;
 import org.reflections.Reflections;
 
 /**
  * 
- * package private mixin for utility class {@link _Reflect}
+ * package private utility class
  *
  */
-class _Reflect_Discovery implements _Reflect.Discovery {
+class ReflectDiscovery implements ClassDiscovery {
 	
 	private final Reflections reflections;
 	
 	// -- CONSTRUCTORS
 	
-	public static Discovery of(List<String> packagePrefixes) {
-		return new _Reflect_Discovery(packagePrefixes);
+	public static ReflectDiscovery of(List<String> packagePrefixes) {
+		return new ReflectDiscovery(packagePrefixes);
 	}
 
-	public static Discovery of(String packageNamePrefix) {
-		return new _Reflect_Discovery(packageNamePrefix);
+	public static ReflectDiscovery of(String packageNamePrefix) {
+		return new ReflectDiscovery(packageNamePrefix);
 	}
 	
-	public static Discovery of(final Object... params) {
-		return new _Reflect_Discovery(params);
+	public static ReflectDiscovery of(final Object... params) {
+		return new ReflectDiscovery(params);
 	}
 	
 	// -- HIDDEN CONSTRUCTOR
 	
-	private _Reflect_Discovery(final Object... params) {
+	private ReflectDiscovery(final Object... params) {
 		this.reflections = new Reflections(params);
 	}
 	
diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Manifest.java b/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ReflectManifest.java
similarity index 96%
rename from core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Manifest.java
rename to core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ReflectManifest.java
index 5deadce..6538d6e 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Manifest.java
+++ b/core/plugins/discovery-reflections/src/main/java/org/apache/isis/applib/plugins/classdiscovery/reflections/ReflectManifest.java
@@ -1,4 +1,4 @@
-package org.apache.isis.applib.internal.reflection;
+package org.apache.isis.applib.plugins.classdiscovery.reflections;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URISyntaxException;
@@ -16,10 +16,10 @@ import com.google.common.collect.Lists;
 
 /**
  * 
- * package private mixin for utility class {@link _Reflect}
+ * package private utility class
  *
  */
-class _Reflect_Manifest {
+class ReflectManifest {
 
 	/*
 	 * If this static reference survives ApplicationScope life-cycles, thats ok.
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
index 1d0a0f3..36c19c8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
@@ -33,8 +33,8 @@ import javax.annotation.PreDestroy;
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
-import org.apache.isis.applib.internal.reflection._Reflect;
-import org.apache.isis.applib.internal.reflection._Reflect.Discovery;
+import org.apache.isis.applib.internal.discover._Discover;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscovery;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceMenuOrder;
 import org.apache.isis.core.metamodel.util.DeweyOrderComparator;
@@ -211,7 +211,7 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
         Set<Class<?>> domainServiceTypes = AppManifest.Registry.instance().getDomainServiceTypes();
         if(domainServiceTypes == null) {
             // if no appManifest
-        	final Discovery discovery = _Reflect.discover(packagePrefixList);
+        	final ClassDiscovery discovery = _Discover.discover(packagePrefixList);
         	
         	domainServiceTypes = discovery.getTypesAnnotatedWith(DomainService.class);
         }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 9b2936a..140f337 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -32,8 +32,8 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Nature;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
-import org.apache.isis.applib.internal.reflection._Reflect;
-import org.apache.isis.applib.internal.reflection._Reflect.Discovery;
+import org.apache.isis.applib.internal.discover._Discover;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscovery;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.commons.factory.InstanceUtil;
@@ -133,7 +133,7 @@ public abstract class IsisComponentProvider {
         moduleAndFrameworkPackages.addAll(AppManifest.Registry.FRAMEWORK_PROVIDED_SERVICES);
         Iterables.addAll(moduleAndFrameworkPackages, modulePackages);
 
-        final Discovery discovery = _Reflect.discover(moduleAndFrameworkPackages);
+        final ClassDiscovery discovery = _Discover.discover(moduleAndFrameworkPackages);
 
         final Set<Class<?>> domainServiceTypes = discovery.getTypesAnnotatedWith(DomainService.class);
         final Set<Class<?>> persistenceCapableTypes = PersistenceCapableTypeFinder.find(discovery);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java
index a736018..32a67e2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java
@@ -26,7 +26,7 @@ import java.util.Set;
 import javax.jdo.annotations.PersistenceCapable;
 
 import org.apache.isis.applib.internal.base._Casts;
-import org.apache.isis.applib.internal.reflection._Reflect.Discovery;
+import org.apache.isis.applib.plugins.classdiscovery.ClassDiscovery;
 
 /**
  * 
@@ -35,7 +35,7 @@ import org.apache.isis.applib.internal.reflection._Reflect.Discovery;
  */
 class PersistenceCapableTypeFinder {
 
-	static Set<Class<?>> find(Discovery discovery) {
+	static Set<Class<?>> find(ClassDiscovery discovery) {
 
 		final Set<Class<?>> types = new LinkedHashSet<>();
 

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.