You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/08/13 15:02:43 UTC

[1/2] isis git commit: ISIS-848: consolidated the discovery of domain services, entities and fixture scripts ...

Repository: isis
Updated Branches:
  refs/heads/master 9af2734ee -> 04b3f0ec8


ISIS-848: consolidated the discovery of domain services, entities and fixture scripts ...

... so that when an AppManifest is present these are eagerly discovered and are held in the (slightly hacky) AppManifest.Registry singleton.

The ServicesInstallerFromAnnotation, RegisterEntities and ClassDiscoveryServiceUsingReflections service have all been updated to look at this singleton and use if present, else the original behaviour


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/9ebdbfc7
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/9ebdbfc7
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/9ebdbfc7

Branch: refs/heads/master
Commit: 9ebdbfc780dfeb857ed5b30b4a1275e2eee9503d
Parents: 9af2734
Author: Jeroen van der Wal <je...@stromboli.it>
Authored: Thu Aug 13 14:05:25 2015 +0200
Committer: Jeroen van der Wal <je...@stromboli.it>
Committed: Thu Aug 13 14:06:30 2015 +0200

----------------------------------------------------------------------
 .../org/apache/isis/applib/AppManifest.java     | 171 +++++++++++++++++++
 .../applib/fixturescripts/FixtureScripts.java   |  11 +-
 .../ClassDiscoveryServiceUsingReflections.java  | 118 ++-----------
 .../FixtureScriptsSpecification.java            |   5 +-
 .../IsisComponentProviderDefault.java           |   4 +-
 .../ServicesInstallerFromAnnotation.java        |  30 ++--
 .../IsisComponentProviderAbstract.java          |  44 ++++-
 .../IsisComponentProviderUsingInstallers.java   |   4 +-
 .../jdo/service/RegisterEntities.java           |  34 ++--
 9 files changed, 265 insertions(+), 156 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
index 906fb6d..642854d 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/AppManifest.java
@@ -19,13 +19,27 @@
 
 package org.apache.isis.applib;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.jdo.annotations.PersistenceCapable;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+
+import org.reflections.vfs.SystemDir;
+import org.reflections.vfs.Vfs;
+
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryServiceUsingReflections;
 
 /**
  * Programmatic specification of the constituent parts of an application, most specifically the modules that contain
@@ -148,4 +162,161 @@ public interface AppManifest {
      */
     public Map<String,String> getConfigurationProperties();
 
+
+    /**
+     * Holds the set of domain services, persistent entities and fixture scripts.services
+     */
+    public static class Registry {
+
+        public final static List<String> FRAMEWORK_PROVIDED_SERVICES = Collections.unmodifiableList(Arrays.asList(
+                "org.apache.isis.applib",
+                "org.apache.isis.core.wrapper" ,
+                "org.apache.isis.core.metamodel.services" ,
+                "org.apache.isis.core.runtime.services" ,
+                "org.apache.isis.objectstore.jdo.applib.service" ,
+                "org.apache.isis.viewer.restfulobjects.rendering.service" ,
+                "org.apache.isis.objectstore.jdo.datanucleus.service.support" ,
+                "org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" ,
+                "org.apache.isis.viewer.wicket.viewer.services"));
+
+        private static Registry instance = new Registry();
+        public static Registry instance() {
+            return instance;
+        }
+
+        private Set<Class<?>> persistenceCapableTypes;
+        public Set<Class<?>> getPersistenceCapableTypes() {
+            return persistenceCapableTypes;
+        }
+        public void setPersistenceCapableTypes(final Set<Class<?>> persistenceCapableTypes) {
+            this.persistenceCapableTypes = persistenceCapableTypes;
+        }
+
+        private Set<Class<? extends FixtureScript>> fixtureScriptTypes;
+        public Set<Class<? extends FixtureScript>> getFixtureScriptTypes() {
+            return fixtureScriptTypes;
+        }
+        public void setFixtureScriptTypes(final Set<Class<? extends FixtureScript>> fixtureScriptTypes) {
+            this.fixtureScriptTypes = fixtureScriptTypes;
+        }
+
+        private Set<Class<?>> domainServiceTypes;
+        public Set<Class<?>> getDomainServiceTypes() {
+            return domainServiceTypes;
+        }
+        public void setDomainServiceTypes(final Set<Class<?>> domainServiceTypes) {
+            this.domainServiceTypes = domainServiceTypes;
+        }
+
+        public List<Vfs.UrlType> getUrlTypes() {
+            final List<Vfs.UrlType> urlTypes = Lists.newArrayList();
+            urlTypes.add(new EmptyIfFileEndingsUrlType(".pom", ".jnilib", "QTJava.zip"));
+            urlTypes.add(new JettyConsoleUrlType());
+            urlTypes.addAll(Arrays.asList(Vfs.DefaultUrlTypes.values()));
+
+            return urlTypes;
+        }
+
+        private static class EmptyIfFileEndingsUrlType implements Vfs.UrlType {
+
+            private final List<String> fileEndings;
+
+            private EmptyIfFileEndingsUrlType(final String... fileEndings) {
+                this.fileEndings = Lists.newArrayList(fileEndings);
+            }
+
+            public boolean matches(URL url) {
+                final String protocol = url.getProtocol();
+                final String externalForm = url.toExternalForm();
+                if (!protocol.equals("file")) {
+                    return false;
+                }
+                for (String fileEnding : fileEndings) {
+                    if (externalForm.endsWith(fileEnding))
+                        return true;
+                }
+                return false;
+            }
+
+            public Vfs.Dir createDir(final URL url) throws Exception {
+                return emptyVfsDir(url);
+            }
+
+            private static Vfs.Dir emptyVfsDir(final URL url) {
+                return new Vfs.Dir() {
+                    @Override
+                    public String getPath() {
+                        return url.toExternalForm();
+                    }
+
+                    @Override
+                    public Iterable<Vfs.File> getFiles() {
+                        return Collections.emptyList();
+                    }
+
+                    @Override
+                    public void close() {
+                        //
+                    }
+                };
+            }
+        }
+
+
+        private static class JettyConsoleUrlType implements Vfs.UrlType {
+            public boolean matches(URL url) {
+                final String protocol = url.getProtocol();
+                final String externalForm = url.toExternalForm();
+                final boolean matches = protocol.equals("file") && externalForm.contains("jetty-console") && externalForm.contains("-any-") && externalForm.endsWith("webapp/WEB-INF/classes/");
+                return matches;
+            }
+
+            public Vfs.Dir createDir(final URL url) throws Exception {
+                return new SystemDir(getFile(url));
+            }
+
+            /**
+             * try to get {@link java.io.File} from url
+             *
+             * <p>
+             *     Copied from {@link Vfs} (not publicly accessible)
+             * </p>
+             */
+            static java.io.File getFile(URL url) {
+                java.io.File file;
+                String path;
+
+                try {
+                    path = url.toURI().getSchemeSpecificPart();
+                    if ((file = new java.io.File(path)).exists()) return file;
+                } catch (URISyntaxException e) {
+                }
+
+                try {
+                    path = URLDecoder.decode(url.getPath(), "UTF-8");
+                    if (path.contains(".jar!")) path = path.substring(0, path.lastIndexOf(".jar!") + ".jar".length());
+                    if ((file = new java.io.File(path)).exists()) return file;
+
+                } catch (UnsupportedEncodingException e) {
+                }
+
+                try {
+                    path = url.toExternalForm();
+                    if (path.startsWith("jar:")) path = path.substring("jar:".length());
+                    if (path.startsWith("file:")) path = path.substring("file:".length());
+                    if (path.contains(".jar!")) path = path.substring(0, path.indexOf(".jar!") + ".jar".length());
+                    if ((file = new java.io.File(path)).exists()) return file;
+
+                    path = path.replace("%20", " ");
+                    if ((file = new java.io.File(path)).exists()) return file;
+
+                } catch (Exception e) {
+                }
+
+                return null;
+            }
+        }
+
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index 185ecb1..e8c2292 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -125,7 +125,7 @@ public abstract class FixtureScripts extends AbstractService {
      * defaults {@link #getMultipleExecutionStrategy()} to {@link FixtureScripts.MultipleExecutionStrategy#IGNORE ignore}
      * if multiple instances of the same fixture script class are encountered.
      *
-     * @param packagePrefix - to search for fixture script implementations, eg "com.mycompany"
+     * @param packagePrefix - to search for fixture script implementations, eg "com.mycompany".  Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
      *
      * @deprecated - use {@link #FixtureScripts(FixtureScriptsSpecification)} instead.
      */
@@ -139,7 +139,7 @@ public abstract class FixtureScripts extends AbstractService {
      * Defaults to {@link FixtureScripts.NonPersistedObjectsStrategy#PERSIST persist}
      * strategy (if non-persisted objects are {@link FixtureScripts#newFixtureResult(FixtureScript, String, Object, boolean) added} to a {@link FixtureResultList}).
      *
-     * @param packagePrefix - to search for fixture script implementations, eg "com.mycompany"
+     * @param packagePrefix - to search for fixture script implementations, eg "com.mycompany".    Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
      * @param multipleExecutionStrategy - whether more than one instance of the same fixture script class can be run multiple times
      *
      * @deprecated - use {@link #FixtureScripts(FixtureScriptsSpecification)} instead.
@@ -157,7 +157,7 @@ public abstract class FixtureScripts extends AbstractService {
      * Defaults {@link #getMultipleExecutionStrategy()} to {@link FixtureScripts.MultipleExecutionStrategy#IGNORE ignore}
      * if multiple instances of the same fixture script class are encountered.
      *
-     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany"
+     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany".    Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
      * @param nonPersistedObjectsStrategy - how to handle any non-persisted objects that are {@link #newFixtureResult(FixtureScript, String, Object, boolean) added} to a {@link org.apache.isis.applib.fixturescripts.FixtureResultList}.
      *
      * @deprecated - use {@link #FixtureScripts(FixtureScriptsSpecification)} instead.
@@ -171,7 +171,7 @@ public abstract class FixtureScripts extends AbstractService {
     }
 
     /**
-     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany"
+     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany".    Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
      * @param nonPersistedObjectsStrategy - how to handle any non-persisted objects that are {@link #newFixtureResult(FixtureScript, String, Object, boolean) added} to a {@link org.apache.isis.applib.fixturescripts.FixtureResultList}.
      * @param multipleExecutionStrategy - whether more than one instance of the same fixture script class can be run multiple times
      *
@@ -271,7 +271,7 @@ public abstract class FixtureScripts extends AbstractService {
         Collections.sort(fixtureScripts, new Comparator<FixtureScript>() {
             @Override
             public int compare(final FixtureScript o1, final FixtureScript o2) {
-                return ObjectContracts.compare(o1, o2, "friendlyName,qualifiedName");
+                return ObjectContracts.compare(o1, o2, "friendlyName","qualifiedName");
             }
         });
         return fixtureScripts;
@@ -346,6 +346,7 @@ public abstract class FixtureScripts extends AbstractService {
                     public boolean apply(final FixtureScript input) {
                         return contains(input.getFriendlyName()) || contains(input.getLocalName());
                     }
+
                     private boolean contains(final String str) {
                         return str != null && str.contains(arg);
                     }

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/applib/src/main/java/org/apache/isis/applib/services/classdiscovery/ClassDiscoveryServiceUsingReflections.java
----------------------------------------------------------------------
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/ClassDiscoveryServiceUsingReflections.java
index aac7541..8eb333d 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/ClassDiscoveryServiceUsingReflections.java
@@ -33,9 +33,11 @@ import org.reflections.util.ClasspathHelper;
 import org.reflections.vfs.SystemDir;
 import org.reflections.vfs.Vfs;
 import org.apache.isis.applib.AbstractService;
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
 
 /**
  * This utility service supports the dynamic discovery of classes from the classpath.  One service that uses this
@@ -54,7 +56,6 @@ public class ClassDiscoveryServiceUsingReflections
             extends AbstractService 
             implements ClassDiscoveryService2 {
 
-
     @Programmatic
     @Override
     public <T> Set<Class<? extends T>> findSubTypesOfClasses(Class<T> type) {
@@ -71,6 +72,13 @@ public class ClassDiscoveryServiceUsingReflections
     @Programmatic
     @Override
     public <T> Set<Class<? extends T>> findSubTypesOfClasses(Class<T> type, String packagePrefix) {
+
+        if(type == FixtureScript.class) {
+            Set fixtureScriptTypes = AppManifest.Registry.instance().getFixtureScriptTypes();
+            return fixtureScriptTypes;
+        }
+
+        // no appManifest or not asking for FixtureScripts
         Vfs.setDefaultURLTypes(getUrlTypes());
 
         final Reflections reflections = new Reflections(
@@ -88,113 +96,7 @@ public class ClassDiscoveryServiceUsingReflections
      * Has <tt>public</tt> visibility only so can be reused by other services (including Isis runtime itself).
      */
     public static List<Vfs.UrlType> getUrlTypes() {
-        final List<Vfs.UrlType> urlTypes = Lists.newArrayList();
-        urlTypes.add(new EmptyIfFileEndingsUrlType(".pom", ".jnilib", "QTJava.zip"));
-        urlTypes.add(new JettyConsoleUrlType());
-        urlTypes.addAll(Arrays.asList(Vfs.DefaultUrlTypes.values()));
-
-        return urlTypes;
-    }
-
-
-    private static class EmptyIfFileEndingsUrlType implements Vfs.UrlType {
-
-        private final List<String> fileEndings;
-
-        private EmptyIfFileEndingsUrlType(final String... fileEndings) {
-            this.fileEndings = Lists.newArrayList(fileEndings);
-        }
-
-        public boolean matches(URL url) {
-            final String protocol = url.getProtocol();
-            final String externalForm = url.toExternalForm();
-            if (!protocol.equals("file")) {
-                return false;
-            }
-            for (String fileEnding : fileEndings) {
-                if (externalForm.endsWith(fileEnding))
-                    return true;
-            }
-            return false;
-        }
-
-        public Vfs.Dir createDir(final URL url) throws Exception {
-            return emptyVfsDir(url);
-        }
-
-        private static Vfs.Dir emptyVfsDir(final URL url) {
-            return new Vfs.Dir() {
-                @Override
-                public String getPath() {
-                    return url.toExternalForm();
-                }
-
-                @Override
-                public Iterable<Vfs.File> getFiles() {
-                    return Collections.emptyList();
-                }
-
-                @Override
-                public void close() {
-                    //
-                }
-            };
-        }
-    }
-
-
-    public static class JettyConsoleUrlType implements Vfs.UrlType {
-        public boolean matches(URL url) {
-            final String protocol = url.getProtocol();
-            final String externalForm = url.toExternalForm();
-            final boolean matches = protocol.equals("file") && externalForm.contains("jetty-console") && externalForm.contains("-any-") && externalForm.endsWith("webapp/WEB-INF/classes/");
-            return matches;
-        }
-
-        public Vfs.Dir createDir(final URL url) throws Exception {
-            return new SystemDir(getFile(url));
-        }
-
-        /**
-         * try to get {@link java.io.File} from url
-         *
-         * <p>
-         *     Copied from {@link Vfs} (not publicly accessible)
-         * </p>
-         */
-        static java.io.File getFile(URL url) {
-            java.io.File file;
-            String path;
-
-            try {
-                path = url.toURI().getSchemeSpecificPart();
-                if ((file = new java.io.File(path)).exists()) return file;
-            } catch (URISyntaxException e) {
-            }
-
-            try {
-                path = URLDecoder.decode(url.getPath(), "UTF-8");
-                if (path.contains(".jar!")) path = path.substring(0, path.lastIndexOf(".jar!") + ".jar".length());
-                if ((file = new java.io.File(path)).exists()) return file;
-
-            } catch (UnsupportedEncodingException e) {
-            }
-
-            try {
-                path = url.toExternalForm();
-                if (path.startsWith("jar:")) path = path.substring("jar:".length());
-                if (path.startsWith("file:")) path = path.substring("file:".length());
-                if (path.contains(".jar!")) path = path.substring(0, path.indexOf(".jar!") + ".jar".length());
-                if ((file = new java.io.File(path)).exists()) return file;
-
-                path = path.replace("%20", " ");
-                if ((file = new java.io.File(path)).exists()) return file;
-
-            } catch (Exception e) {
-            }
-
-            return null;
-        }
+        return AppManifest.Registry.instance().getUrlTypes();
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsSpecification.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsSpecification.java b/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsSpecification.java
index 9d8646c..81965bc 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsSpecification.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/fixturespec/FixtureScriptsSpecification.java
@@ -45,7 +45,7 @@ public class FixtureScriptsSpecification {
     /**
      * Typically preferable to use the create using the {@link FixtureScriptsSpecification.Builder}
      * (obtained from {@link #builder(Class)}).
-     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany"
+     * @param packagePrefix  - to search for fixture script implementations, eg "com.mycompany".    Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
      * @param nonPersistedObjectsStrategy - how to handle any non-persisted objects that are {@link FixtureScripts#newFixtureResult(FixtureScript, String, Object, boolean) added} to a {@link FixtureResultList}.
      * @param multipleExecutionStrategy - whether more than one instance of the same fixture script class can be run multiple times
      * @param runScriptDefaultScriptClass - the fixture script to provide as a default in {@link FixtureScripts#runFixtureScript(FixtureScript, String)} action.
@@ -75,6 +75,9 @@ public class FixtureScriptsSpecification {
     private final Class<? extends FixtureScript> runScriptDefaultScriptClass;
     private final DropDownPolicy dropDownPolicy;
 
+    /**
+     * Note that this is ignored if an {@link org.apache.isis.applib.AppManifest} is in use.
+     */
     @Programmatic
     public String getPackagePrefix() {
         return packagePrefix;

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
index 5f8b9c1..d4d25da 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisComponentProviderDefault.java
@@ -81,8 +81,8 @@ public class IsisComponentProviderDefault extends IsisComponentProviderAbstract
         final String fixtureClassNamesCsv;
         if(appManifest != null) {
 
-            putAppManifestKey();
-
+            putAppManifestKey(appManifest);
+            registerPackageNames(appManifest);
             specifyServicesAndRegisteredEntitiesUsing(appManifest);
 
             List<Class<? extends FixtureScript>> fixtureClasses = appManifest.getFixtures();

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServicesInstallerFromAnnotation.java
----------------------------------------------------------------------
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 d049d96..dfc19e7 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
@@ -26,6 +26,7 @@ import java.util.SortedMap;
 import java.util.SortedSet;
 
 import javax.annotation.PreDestroy;
+import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
@@ -37,12 +38,18 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import org.reflections.Reflections;
+import org.reflections.scanners.SubTypesScanner;
+import org.reflections.scanners.TypeAnnotationsScanner;
+import org.reflections.util.ClasspathHelper;
+import org.reflections.util.ConfigurationBuilder;
 import org.reflections.vfs.Vfs;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+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.fixturescripts.FixtureScript;
 import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryServiceUsingReflections;
 
 import static com.google.common.base.Predicates.and;
@@ -67,16 +74,7 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
      *     with the first service found used.
      * </p>
      */
-    public final static String PACKAGE_PREFIX_STANDARD = Joiner.on(",").join(
-                                        "org.apache.isis.applib",
-                                        "org.apache.isis.core.wrapper" ,
-                                        "org.apache.isis.core.metamodel.services" ,
-                                        "org.apache.isis.core.runtime.services" ,
-                                        "org.apache.isis.objectstore.jdo.applib.service" ,
-                                        "org.apache.isis.viewer.restfulobjects.rendering.service" ,
-                                        "org.apache.isis.objectstore.jdo.datanucleus.service.support" ,
-                                        "org.apache.isis.objectstore.jdo.datanucleus.service.eventbus" ,
-                                        "org.apache.isis.viewer.wicket.viewer.services");
+    public final static String PACKAGE_PREFIX_STANDARD = Joiner.on(",").join(AppManifest.Registry.FRAMEWORK_PROVIDED_SERVICES);
 
     private final ServiceInstantiator serviceInstantiator;
 
@@ -206,11 +204,15 @@ public class ServicesInstallerFromAnnotation extends ServicesInstallerAbstract {
 
         final List<String> packagePrefixList = asList(packagePrefixes);
 
-        Vfs.setDefaultURLTypes(ClassDiscoveryServiceUsingReflections.getUrlTypes());
-        final Reflections reflections = new Reflections(packagePrefixList);
+        Set<Class<?>> domainServiceTypes = AppManifest.Registry.instance().getDomainServiceTypes();
+        if(domainServiceTypes == null) {
+            // if no appManifest
+            Vfs.setDefaultURLTypes(ClassDiscoveryServiceUsingReflections.getUrlTypes());
+            final Reflections reflections = new Reflections(packagePrefixList);
+            domainServiceTypes = reflections.getTypesAnnotatedWith(DomainService.class);
+        }
 
-        final Set<Class<?>> typesAnnotatedWith = reflections.getTypesAnnotatedWith(DomainService.class);
-        final List<Class<?>> domainServiceClasses = Lists.newArrayList(Iterables.filter(typesAnnotatedWith, instantiatable()));
+        final List<Class<?>> domainServiceClasses = Lists.newArrayList(Iterables.filter(domainServiceTypes, instantiatable()));
         for (final Class<?> cls : domainServiceClasses) {
 
             final String order = orderOf(cls);

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
index 4c4e75e..0f28adf 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderAbstract.java
@@ -19,16 +19,26 @@
 
 package org.apache.isis.core.runtime.systemusinginstallers;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.annotation.Nullable;
+import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import org.reflections.Reflections;
+import org.reflections.vfs.Vfs;
 
 import org.apache.isis.applib.AppManifest;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.services.classdiscovery.ClassDiscoveryServiceUsingReflections;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.lang.ClassUtil;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
@@ -83,15 +93,12 @@ public abstract class IsisComponentProviderAbstract implements IsisComponentProv
 
     }
 
-    protected void putAppManifestKey() {
-        if (this.appManifest == null) {
-            return;
-        }
+    protected void putAppManifestKey(final AppManifest appManifest) {
         // required to prevent RegisterEntities validation from complaining
         // if it can't find any @PersistenceCapable entities in a module
         // that contains only services.
         putConfigurationProperty(
-                SystemConstants.APP_MANIFEST_KEY, this.appManifest.getClass().getName()
+                SystemConstants.APP_MANIFEST_KEY, appManifest.getClass().getName()
         );
     }
 
@@ -109,7 +116,8 @@ public abstract class IsisComponentProviderAbstract implements IsisComponentProv
 
     //region > appManifest helpers
     protected void specifyServicesAndRegisteredEntitiesUsing(final AppManifest appManifest) {
-        final String packageNamesCsv = modulePackageNamesFrom(appManifest);
+        final Iterable<String> packageNames = modulePackageNamesFrom(appManifest);
+        final String packageNamesCsv = Joiner.on(',').join(packageNames);
 
         putConfigurationProperty(ServicesInstallerFromAnnotation.PACKAGE_PREFIX_KEY, packageNamesCsv);
         putConfigurationProperty(RegisterEntities.PACKAGE_PREFIX_KEY, packageNamesCsv);
@@ -120,16 +128,34 @@ public abstract class IsisComponentProviderAbstract implements IsisComponentProv
         }
     }
 
+    protected void registerPackageNames(final AppManifest appManifest) {
+        final Iterable<String> packageNameList = modulePackageNamesFrom(appManifest);
+        final AppManifest.Registry registry = AppManifest.Registry.instance();
+
+        final List<String> packages = Lists.newArrayList();
+        packages.addAll(AppManifest.Registry.FRAMEWORK_PROVIDED_SERVICES);
+        Iterables.addAll(packages, packageNameList);
+
+        Vfs.setDefaultURLTypes(ClassDiscoveryServiceUsingReflections.getUrlTypes());
+
+        final Reflections reflections = new Reflections(packages);
+        final Set<Class<?>> domainServiceTypes = reflections.getTypesAnnotatedWith(DomainService.class);
+        final Set<Class<?>> persistenceCapableTypes = reflections.getTypesAnnotatedWith(PersistenceCapable.class);
+        final Set<Class<? extends FixtureScript>> fixtureScriptTypes = reflections.getSubTypesOf(FixtureScript.class);
+
+        registry.setDomainServiceTypes(domainServiceTypes);
+        registry.setPersistenceCapableTypes(persistenceCapableTypes);
+        registry.setFixtureScriptTypes(fixtureScriptTypes);
+    }
 
-    private String modulePackageNamesFrom(final AppManifest appManifest) {
+    private Iterable<String> modulePackageNamesFrom(final AppManifest appManifest) {
         List<Class<?>> modules = appManifest.getModules();
         if (modules == null || modules.isEmpty()) {
             throw new IllegalArgumentException(
                     "If an appManifest is provided then it must return a non-empty set of modules");
         }
 
-        final Iterable<String> iter = Iterables.transform(modules, ClassUtil.Functions.packageNameOf());
-        return Joiner.on(',').join(iter);
+        return Iterables.transform(modules, ClassUtil.Functions.packageNameOf());
     }
 
     protected String classNamesFrom(final List<?> objectsOrClasses) {

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
index d1d58a7..7fc8777 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderUsingInstallers.java
@@ -68,8 +68,8 @@ public class IsisComponentProviderUsingInstallers extends IsisComponentProviderA
 
         if(appManifest != null) {
 
-            putAppManifestKey();
-
+            putAppManifestKey(appManifest);
+            registerPackageNames(appManifest);
             specifyServicesAndRegisteredEntitiesUsing(appManifest);
 
             putConfigurationProperty(SystemConstants.SERVICES_INSTALLER_KEY, ServicesInstallerFromConfigurationAndAnnotation.NAME);

http://git-wip-us.apache.org/repos/asf/isis/blob/9ebdbfc7/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
index 8dc6039..88cb750 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
@@ -37,6 +37,7 @@ import org.reflections.Reflections;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.AppManifest;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.runtime.system.SystemConstants;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -89,35 +90,38 @@ public class RegisterEntities {
     }
 
     private static Set<String> scanForEntityTypesIn(final List<String> domPackages, final boolean appManifestSpecified) {
+
         final Set<String> entityTypes = Sets.newLinkedHashSet();
-        for (final String packageName : domPackages) {
-            Reflections reflections = new Reflections(packageName);
 
-            final Set<Class<?>> entityTypesInPackage =
-                    reflections.getTypesAnnotatedWith(PersistenceCapable.class);
+        Set<Class<?>> persistenceCapableTypes = AppManifest.Registry.instance().getPersistenceCapableTypes();
+        if(persistenceCapableTypes == null) {
+            // if no appManifest
+            persistenceCapableTypes = Sets.newLinkedHashSet();
 
-            if(!entitiesIn(entityTypesInPackage)) {
+            for (final String packageName : domPackages) {
+                Reflections reflections = new Reflections(packageName);
+                final Set<Class<?>> entityTypesInPackage =
+                        reflections.getTypesAnnotatedWith(PersistenceCapable.class);
 
-                if(appManifestSpecified) {
-                    if(LOG.isDebugEnabled()) {
-                        LOG.debug("Could not locate any @PersistenceCapable entities in module '%s'; ignoring\n", packageName);
-                    }
-                } else {
+                if(!entitiesIn(entityTypesInPackage)) {
                     throw new IllegalArgumentException(String.format(
                             "Bad configuration.\n\nCould not locate any @PersistenceCapable entities in package '%s'\n" +
                                     "Check value of '%s' key in WEB-INF/*.properties\n",
                             packageName,
                             PACKAGE_PREFIX_KEY));
                 }
+                persistenceCapableTypes.addAll(entityTypesInPackage);
             }
-            for (Class<?> entityType : entityTypesInPackage) {
-                if(ignore(entityType)) {
-                    continue;
-                }
-                entityTypes.add(entityType.getCanonicalName());
+        }
+
+        for (Class<?> persistenceCapableType : persistenceCapableTypes) {
+            if(ignore(persistenceCapableType)) {
+                continue;
             }
+            entityTypes.add(persistenceCapableType.getCanonicalName());
         }
         return entityTypes;
+
     }
 
     private static boolean ignore(final Class<?> entityType) {


[2/2] isis git commit: ISIS-1173: making additional methods of FixtureScripts public so can be invoked programmatically.

Posted by da...@apache.org.
ISIS-1173: making additional methods of FixtureScripts public so can be invoked programmatically.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/04b3f0ec
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/04b3f0ec
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/04b3f0ec

Branch: refs/heads/master
Commit: 04b3f0ec81a65f58561855b1c8c69c4d13177e6f
Parents: 9ebdbfc
Author: Jeroen van der Wal <je...@stromboli.it>
Authored: Thu Aug 13 14:24:05 2015 +0200
Committer: Jeroen van der Wal <je...@stromboli.it>
Committed: Thu Aug 13 14:24:05 2015 +0200

----------------------------------------------------------------------
 .../applib/fixturescripts/FixtureScripts.java   | 23 ++++++++++----------
 1 file changed, 12 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/04b3f0ec/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
index e8c2292..600faeb 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScripts.java
@@ -246,7 +246,8 @@ public abstract class FixtureScripts extends AbstractService {
     //region > fixtureScriptList (lazily built)
 
     private List<FixtureScript> fixtureScriptList;
-    private List<FixtureScript> getFixtureScriptList() {
+    @Programmatic
+    public List<FixtureScript> getFixtureScriptList() {
         if(fixtureScriptList == null) {
             fixtureScriptList = findAndInstantiateFixtureScripts();
         }
@@ -372,6 +373,16 @@ public abstract class FixtureScripts extends AbstractService {
         }
         return null;
     }
+
+    @Programmatic
+    public FixtureScript.ExecutionContext newExecutionContext(final String parameters) {
+        final ExecutionParameters executionParameters =
+                executionParametersService != null
+                        ? executionParametersService.newExecutionParameters(parameters)
+                        : new ExecutionParameters(parameters);
+        return FixtureScript.ExecutionContext.create(executionParameters, this);
+    }
+
     //endregion
 
     //region > hooks
@@ -389,16 +400,6 @@ public abstract class FixtureScripts extends AbstractService {
         return null;
     }
 
-    /**
-     * Optional hook.
-     */
-    protected FixtureScript.ExecutionContext newExecutionContext(final String parameters) {
-        final ExecutionParameters executionParameters =
-                executionParametersService != null
-                        ? executionParametersService.newExecutionParameters(parameters)
-                        : new ExecutionParameters(parameters);
-        return FixtureScript.ExecutionContext.create(executionParameters, this);
-    }
 
 
     //endregion