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 2012/12/03 13:22:20 UTC

[4/4] git commit: ISIS-284: maven plugin

ISIS-284: maven plugin

* first cut attempt, which performs validation of an Isis metamodel
* delegating to helpers
* better error handling


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

Branch: refs/heads/master
Commit: 4fc1336a0f616583605a4cd28a9ceb8bfb129f59
Parents: 73178db
Author: Dan Haywood <da...@apache.org>
Authored: Sun Dec 2 16:42:20 2012 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Sun Dec 2 16:42:20 2012 +0000

----------------------------------------------------------------------
 .../specloader/ObjectReflectorDefault.java         |   16 +-
 .../specloader/validator/ValidationFailures.java   |   28 ++-
 .../isis/core/progmodel/app/IsisMetaModel.java     |    9 +-
 framework/isis-maven-plugin/pom.xml                |  168 +++++++++++
 .../isis/tools/mavenplugin/ValidateMojo.java       |  221 +++++++++++++++
 .../isis/tools/mavenplugin/util/ClassRealms.java   |   26 ++
 .../isis/tools/mavenplugin/util/ClassWorlds.java   |   32 ++
 .../tools/mavenplugin/util/IsisMetaModels.java     |   30 ++
 .../apache/isis/tools/mavenplugin/util/Log4j.java  |   35 +++
 .../isis/tools/mavenplugin/util/MavenProjects.java |   25 ++
 .../isis/tools/mavenplugin/util/Xpp3Doms.java      |   18 ++
 .../dflt/ProgrammingModelFacetsJava5.java          |    2 +-
 framework/tck/tck-dom/pom.xml                      |    9 +
 13 files changed, 608 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index 811bfbb..aced5bf 100644
--- a/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -231,6 +231,17 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
      */
     @Override
     public void init() {
+        ValidationFailures validationFailures = initAndValidate();
+        
+        validationFailures.assertNone();
+        
+        cacheBySpecId();
+    }
+
+    /**
+     * For benefit of <tt>IsisMetaModel</tt>.
+     */
+    public ValidationFailures initAndValidate() {
         if (LOG.isDebugEnabled()) {
             LOG.debug("initialising " + this);
         }
@@ -261,10 +272,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         
         ValidationFailures validationFailures = new ValidationFailures();
         metaModelValidator.validate(validationFailures);
-        
-        validationFailures.assertNone();
-        
-        cacheBySpecId();
+        return validationFailures;
     }
 
 	private void cacheBySpecId() {

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
----------------------------------------------------------------------
diff --git a/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java b/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
index eb8e3af..4e556d1 100644
--- a/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
+++ b/framework/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/validator/ValidationFailures.java
@@ -19,11 +19,13 @@
 package org.apache.isis.core.metamodel.specloader.validator;
 
 import java.text.MessageFormat;
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 import com.google.common.collect.Lists;
 
-public final class ValidationFailures {
+public final class ValidationFailures implements Iterable<String> {
 
     private final List<String> messages = Lists.newArrayList();
     
@@ -33,17 +35,33 @@ public final class ValidationFailures {
     }
 
     public void assertNone() {
-        if (messages.isEmpty()) {
+        if (!occurred()) {
             return;
         }
-        
+        throw new MetaModelInvalidException(getMessages());
+    }
+
+    public boolean occurred() {
+        return !messages.isEmpty();
+    }
+
+    private String getMessages() {
         final StringBuilder buf = new StringBuilder();
         int i=0;
         for (String message : messages) {
             buf.append(++i).append(": ").append(message).append("\n");
         }
-        
-        throw new MetaModelInvalidException(buf.toString());
+        String messages = buf.toString();
+        return messages;
+    }
+
+    public int getNumberOfMessages() {
+        return messages.size();
+    }
+
+    @Override
+    public Iterator<String> iterator() {
+        return Collections.unmodifiableList(messages).iterator();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
----------------------------------------------------------------------
diff --git a/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java b/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
index b53597d..7b204bf 100644
--- a/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
+++ b/framework/core/progmodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
@@ -53,6 +53,7 @@ import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.Collecti
 import org.apache.isis.core.metamodel.specloader.traverser.SpecificationTraverser;
 import org.apache.isis.core.metamodel.specloader.traverser.SpecificationTraverserDefault;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
+import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 import org.apache.isis.core.progmodel.layout.dflt.MemberLayoutArrangerDefault;
 import org.apache.isis.core.progmodel.metamodelvalidator.dflt.MetaModelValidatorDefault;
 
@@ -87,6 +88,8 @@ public class IsisMetaModel implements ApplicationScopedComponent {
 
     private DomainObjectContainer container;
 
+    private ValidationFailures validationFailures;
+
     
     public static class Builder {
         private final RuntimeContext runtimeContext;
@@ -173,7 +176,7 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         runtimeContext.injectInto(reflector);
         reflector.injectInto(runtimeContext);
 
-        reflector.init();
+        validationFailures = reflector.initAndValidate();
         runtimeContext.init();
 
         for (final Object service : services) {
@@ -182,6 +185,10 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         }
         state = State.INITIALIZED;
     }
+    
+    public ValidationFailures getValidationFailures() {
+        return validationFailures;
+    }
 
     @Override
     public void shutdown() {

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/pom.xml b/framework/isis-maven-plugin/pom.xml
new file mode 100644
index 0000000..ca87abf
--- /dev/null
+++ b/framework/isis-maven-plugin/pom.xml
@@ -0,0 +1,168 @@
+<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.maven</groupId>
+		<artifactId>maven-parent</artifactId>
+		<version>22</version>
+	</parent>
+
+	<groupId>org.apache.isis.tools</groupId>
+	<artifactId>isis-maven-plugin</artifactId>
+	<packaging>maven-plugin</packaging>
+	<version>0.3.1-incubating-SNAPSHOT</version>
+
+	<name>isis-maven-plugin Maven Mojo</name>
+	<url>http://maven.apache.org</url>
+
+	<prerequisites>
+		<maven>2.0.9</maven>
+	</prerequisites>
+
+	<properties>
+		<mavenVersion>2.0.9</mavenVersion>
+	</properties>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-plugin-plugin</artifactId>
+				<version>3.2</version>
+				<configuration>
+				      <goalPrefix>configurator</goalPrefix>
+				    </configuration>
+				    <executions>
+				      <execution>
+				        <id>default-descriptor</id>
+				        <goals>
+				          <goal>descriptor</goal>
+				        </goals>
+				        <phase>process-classes</phase>
+				      </execution>
+				      <execution>
+				        <id>help-descriptor</id>
+				        <goals>
+				          <goal>helpmojo</goal>
+				        </goals>
+				        <phase>process-classes</phase>
+				      </execution>
+				    </executions>
+    			</plugin>
+			<!-- 
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-toolchains-plugin</artifactId>
+				<version>1.0</version>
+				<executions>
+					<execution>
+						<phase>validate</phase>
+						<goals>
+							<goal>toolchain</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<toolchains>
+						<jdk>
+							<version>1.5</version>
+						</jdk>
+					</toolchains>
+				</configuration>
+			</plugin>
+			 -->
+		</plugins>
+	</build>
+
+	<dependencies>
+
+		<dependency>
+		    <groupId>org.apache.isis.core</groupId>
+		    <artifactId>runtime</artifactId>
+	        <version>0.3.1-incubating-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+		    <groupId>org.apache.isis.progmodels</groupId>
+		    <artifactId>dflt</artifactId>
+	        <version>0.3.1-incubating-SNAPSHOT</version>
+		</dependency>
+
+		<dependency>
+		      <groupId>org.apache.maven</groupId>
+		      <artifactId>maven-plugin-api</artifactId>
+		      <version>3.0</version>
+	    </dependency>
+
+<!-- 
+	    <dependency>
+		      <groupId>org.sonatype.aether</groupId>
+		      <artifactId>aether-api</artifactId>
+		      <version>1.8</version>
+	    </dependency>
+	    <dependency>
+		      <groupId>org.sonatype.aether</groupId>
+		      <artifactId>aether-util</artifactId>
+		      <version>1.8</version>
+	    </dependency>
+ -->	    
+
+		<dependency>
+			<groupId>org.codehaus.plexus</groupId>
+			<artifactId>plexus-utils</artifactId>
+			<version>3.0</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.maven.plugin-tools</groupId>
+			<artifactId>maven-plugin-annotations</artifactId>
+			<version>3.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-artifact</artifactId>
+			<version>${mavenVersion}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-project</artifactId>
+			<version>${mavenVersion}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-core</artifactId>
+			<version>${mavenVersion}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-toolchain</artifactId>
+			<version>${mavenVersion}</version>
+		</dependency>
+
+
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>3.8.1</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+	<profiles>
+		<profile>
+			<id>m2e</id>
+			<activation>
+				<property>
+					<name>m2e.version</name>
+				</property>
+			</activation>
+			<build>
+				<directory>target-ide</directory>
+			</build>
+		</profile>
+	</profiles>
+
+</project>

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/ValidateMojo.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/ValidateMojo.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/ValidateMojo.java
new file mode 100644
index 0000000..d9685df
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/ValidateMojo.java
@@ -0,0 +1,221 @@
+package org.apache.isis.tools.mavenplugin;
+
+/*
+ * 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.
+ */
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
+import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
+import org.apache.isis.core.progmodel.app.IsisMetaModel;
+import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
+import org.apache.isis.tools.mavenplugin.util.ClassRealms;
+import org.apache.isis.tools.mavenplugin.util.ClassWorlds;
+import org.apache.isis.tools.mavenplugin.util.IsisMetaModels;
+import org.apache.isis.tools.mavenplugin.util.Log4j;
+import org.apache.isis.tools.mavenplugin.util.MavenProjects;
+import org.apache.isis.tools.mavenplugin.util.Xpp3Doms;
+import org.apache.log4j.BasicConfigurator;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.DependencyResolutionRequiredException;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.classworlds.ClassRealm;
+import org.codehaus.classworlds.ClassWorld;
+import org.codehaus.classworlds.DuplicateRealmException;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+
+import com.google.common.collect.Lists;
+
+/**
+ * 
+ * 
+ *
+ */
+@Mojo(name = "validate", defaultPhase = LifecyclePhase.TEST, requiresProject = true, requiresDependencyResolution = ResolutionScope.COMPILE, requiresDependencyCollection = ResolutionScope.COMPILE)
+public class ValidateMojo extends AbstractMojo {
+
+    private static final String CURRENT_PLUGIN_KEY = "org.apache.isis.tools:isis-maven-plugin";
+    private static final String ISIS_REALM = "isis";
+
+    @Component
+    protected MavenProject mavenProject;
+
+    public void execute() throws MojoExecutionException, MojoFailureException {
+
+        Log4j.configureIfRequired();
+
+        ValidationFailures validationFailures = bootIsisThenShutdown();
+
+        if (validationFailures.occurred()) {
+            throwFailureException(validationFailures.getNumberOfMessages() + " problems found.", validationFailures.getMessages());
+        }
+    }
+
+    private ValidationFailures bootIsisThenShutdown() throws MojoExecutionException, MojoFailureException {
+        ClassWorld classWorld = null;
+        IsisMetaModel isisMetaModel = null;
+        try {
+            classWorld = new ClassWorld();
+            final ClassRealm isisRealm = classWorld.newRealm(ISIS_REALM);
+
+            addClassesToRealm(isisRealm);
+
+            List<Object> serviceList = createServicesFromConfiguration(isisRealm);
+
+            isisMetaModel = bootstrapIsis(isisRealm, serviceList);
+            return isisMetaModel.getValidationFailures();
+
+        } catch (DuplicateRealmException e) {
+            throwExecutionException("Error building classworld", e);
+            return null; // never reached, since exception thrown above
+        } finally {
+            ClassWorlds.disposeSafely(classWorld, ISIS_REALM);
+            IsisMetaModels.disposeSafely(isisMetaModel);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private void addClassesToRealm(final ClassRealm isisRealm) throws MojoExecutionException {
+
+        // first add all dependencies (including transitive)...
+        Set<Artifact> artifacts = mavenProject.getArtifacts();
+        for (Artifact artifact : artifacts) {
+            File file = artifact.getFile();
+            try {
+                ClassRealms.addFileToRealm(isisRealm, file, getLog());
+            } catch (MalformedURLException e) {
+                throwExecutionException("Error adding classes for artifact '" + artifact + "' to class realm", e);
+            } catch (IOException e) {
+                throwExecutionException("Error adding classes for artifact '" + artifact + "' to class realm", e);
+            }
+        }
+
+        // ... then all classpath elements
+        // (there is substantial overlap with getArtifacts() here, but neither
+        // appears to
+        // provide the comprehensive set of class path elements).
+        List<String> classpathElements;
+        try {
+            classpathElements = mavenProject.getRuntimeClasspathElements();
+        } catch (DependencyResolutionRequiredException e) {
+            throwExecutionException("Error obtaining runtime classpath", e);
+            return;
+        }
+        for (String classpathElement : classpathElements) {
+            final File file = new File(classpathElement);
+            try {
+                ClassRealms.addFileToRealm(isisRealm, file, getLog());
+            } catch (MalformedURLException e) {
+                throwExecutionException("Error adding classes for classpath element '" + classpathElement + "' to class realm", e);
+            } catch (IOException e) {
+                throwExecutionException("Error adding classes for classpath element '" + classpathElement + "' to class realm", e);
+            }
+        }
+    }
+
+    private List<Object> createServicesFromConfiguration(final ClassRealm isisRealm) throws MojoFailureException {
+        final List<String> serviceEls = getServiceClassNamesFromConfiguration();
+        return createServiceInstances(isisRealm, serviceEls);
+    }
+
+    private List<String> getServiceClassNamesFromConfiguration() throws MojoFailureException {
+        final Xpp3Dom configuration = (Xpp3Dom) MavenProjects.lookupPlugin(mavenProject, CURRENT_PLUGIN_KEY).getConfiguration();
+        if (configuration == null) {
+            throwFailureException("Configuration error", "No <configuration> element found");
+        }
+        final Xpp3Dom servicesEl = configuration.getChild("services");
+        if (servicesEl == null) {
+            throwFailureException("Configuration error", "No <configuration>/<services> element found");
+        }
+        final Xpp3Dom[] serviceEls = servicesEl.getChildren("service");
+        if (serviceEls == null || serviceEls.length == 0) {
+            throwFailureException("Configuration error", "No <configuration>/<services>/<service> elements found");
+        }
+        return Lists.transform(Arrays.asList(serviceEls), Xpp3Doms.GET_VALUE);
+    }
+
+    private List<Object> createServiceInstances(final ClassRealm isisRealm, final List<String> serviceClassNames) throws MojoFailureException {
+        final List<Object> serviceList = Lists.newArrayList();
+        final List<String> logMessages = Lists.newArrayList();
+        for (String serviceClassName : serviceClassNames) {
+            try {
+                serviceList.add(isisRealm.loadClass(serviceClassName).newInstance());
+            } catch (ClassNotFoundException e) {
+                logMessages.add("Error loading class '" + serviceClassName + "' from classrealm");
+            } catch (InstantiationException e) {
+                logMessages.add("Error instantiating loaded class '" + serviceClassName + "'");
+            } catch (IllegalAccessException e) {
+                logMessages.add("Error instantiating loaded class '" + serviceClassName + "'");
+            }
+        }
+        if (!logMessages.isEmpty()) {
+            throwFailureException("Unable to load configured services", logMessages);
+        }
+        return serviceList;
+    }
+
+    private static IsisMetaModel bootstrapIsis(final ClassRealm isisRealm, List<Object> serviceList) {
+        Thread.currentThread().setContextClassLoader(isisRealm.getClassLoader());
+
+        IsisMetaModel isisMetaModel = IsisMetaModel.builder(new RuntimeContextNoRuntime(), new ProgrammingModelFacetsJava5()).withServices(serviceList).build();
+        isisMetaModel.init();
+
+        return isisMetaModel;
+    }
+
+    private void throwFailureException(String errorMessage, List<String> logMessages) throws MojoFailureException {
+        logErrors(logMessages);
+        throw new MojoFailureException(errorMessage);
+    }
+
+    private void throwFailureException(String errorMessage, String... logMessages) throws MojoFailureException {
+        logErrors(logMessages);
+        throw new MojoFailureException(errorMessage);
+    }
+
+    private void throwExecutionException(String errorMessage, Exception e) throws MojoExecutionException {
+        logErrors(errorMessage);
+        throw new MojoExecutionException(errorMessage, e);
+    }
+
+    private void logErrors(String... logMessages) {
+        getLog().error("");
+        for (String logMessage : logMessages) {
+            getLog().error(logMessage);
+        }
+        getLog().error("");
+    }
+
+    private void logErrors(List<String> logMessages) {
+        logErrors(logMessages.toArray(new String[] {}));
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassRealms.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassRealms.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassRealms.java
new file mode 100644
index 0000000..87d6089
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassRealms.java
@@ -0,0 +1,26 @@
+package org.apache.isis.tools.mavenplugin.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.classworlds.ClassRealm;
+
+public final class ClassRealms {
+    
+    private ClassRealms(){}
+
+    public static void addFileToRealm(ClassRealm isisRealm, final File file, Log log) throws IOException, MalformedURLException {
+        log.info(file.getCanonicalPath());
+    
+        final URL url = file.toURI().toURL();
+        isisRealm.addConstituent(url);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassWorlds.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassWorlds.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassWorlds.java
new file mode 100644
index 0000000..6c79e55
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/ClassWorlds.java
@@ -0,0 +1,32 @@
+package org.apache.isis.tools.mavenplugin.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.classworlds.ClassRealm;
+import org.codehaus.classworlds.ClassWorld;
+import org.codehaus.classworlds.NoSuchRealmException;
+
+public final class ClassWorlds {
+    
+    private ClassWorlds(){}
+
+    public static void disposeSafely(ClassWorld classWorld, String realmId) {
+        if (classWorld == null) {
+            return;
+        }
+        try {
+            classWorld.disposeRealm(realmId);
+        } catch (NoSuchRealmException e) {
+            // ignore
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/IsisMetaModels.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/IsisMetaModels.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/IsisMetaModels.java
new file mode 100644
index 0000000..9a8aaaa
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/IsisMetaModels.java
@@ -0,0 +1,30 @@
+package org.apache.isis.tools.mavenplugin.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+
+import org.apache.isis.core.progmodel.app.IsisMetaModel;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.logging.Log;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.classworlds.ClassRealm;
+import org.codehaus.classworlds.ClassWorld;
+import org.codehaus.classworlds.NoSuchRealmException;
+
+public final class IsisMetaModels {
+    
+    private IsisMetaModels(){}
+
+    public static void disposeSafely(IsisMetaModel isisMetaModel) {
+        if (isisMetaModel == null) {
+            return;
+        }
+        isisMetaModel.shutdown();
+    }
+
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Log4j.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Log4j.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Log4j.java
new file mode 100644
index 0000000..010d279
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Log4j.java
@@ -0,0 +1,35 @@
+package org.apache.isis.tools.mavenplugin.util;
+
+import java.util.Enumeration;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+
+public final class Log4j {
+    
+    private Log4j(){}
+
+    public static void configureIfRequired() {
+        if(isConfigured()) return;
+        BasicConfigurator.configure();
+        LogManager.getRootLogger().setLevel(Level.INFO);
+    }
+    
+    private static boolean isConfigured() {
+        Enumeration<?> appenders = LogManager.getRootLogger().getAllAppenders();
+        if (appenders.hasMoreElements()) {
+            return true;
+        } 
+        Enumeration<?> loggers = LogManager.getCurrentLoggers();
+        while (loggers.hasMoreElements()) {
+            Logger c = (Logger) loggers.nextElement();
+            if (c.getAllAppenders().hasMoreElements())
+                return true;
+        }
+        return false;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/MavenProjects.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/MavenProjects.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/MavenProjects.java
new file mode 100644
index 0000000..2b08085
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/MavenProjects.java
@@ -0,0 +1,25 @@
+package org.apache.isis.tools.mavenplugin.util;
+
+import java.util.List;
+
+import org.apache.maven.model.Plugin;
+import org.apache.maven.project.MavenProject;
+
+public final class MavenProjects {
+    
+    private MavenProjects(){}
+
+    public static Plugin lookupPlugin(MavenProject mavenProject, String key) {
+    
+        @SuppressWarnings("unchecked")
+        List<Plugin> plugins = mavenProject.getBuildPlugins();
+    
+        for (Plugin plugin : plugins) {
+            if (key.equalsIgnoreCase(plugin.getKey())) {
+                return plugin;
+            }
+        }
+        return null;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Xpp3Doms.java
----------------------------------------------------------------------
diff --git a/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Xpp3Doms.java b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Xpp3Doms.java
new file mode 100644
index 0000000..5f94609
--- /dev/null
+++ b/framework/isis-maven-plugin/src/main/java/org/apache/isis/tools/mavenplugin/util/Xpp3Doms.java
@@ -0,0 +1,18 @@
+package org.apache.isis.tools.mavenplugin.util;
+
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+
+import com.google.common.base.Function;
+
+public final class Xpp3Doms {
+    
+    private Xpp3Doms(){}
+
+    public static Function<Xpp3Dom, String> GET_VALUE = new Function<Xpp3Dom, String>(){
+
+        public String apply(Xpp3Dom el) {
+            return el.getValue();
+        }};
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
----------------------------------------------------------------------
diff --git a/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java b/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
index 3f9a4fd..fbff124 100644
--- a/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
+++ b/framework/progmodels/dflt/src/main/java/org/apache/isis/progmodels/dflt/ProgrammingModelFacetsJava5.java
@@ -194,7 +194,7 @@ import org.apache.isis.core.progmodel.facets.value.timestampsql.JavaSqlTimeStamp
 public final class ProgrammingModelFacetsJava5 extends ProgrammingModelAbstract {
 
     public ProgrammingModelFacetsJava5() {
-
+        
         // must be first, so any Facets created can be replaced by other
         // FacetFactorys later.
         addFactory(FallbackFacetFactory.class);

http://git-wip-us.apache.org/repos/asf/isis/blob/4fc1336a/framework/tck/tck-dom/pom.xml
----------------------------------------------------------------------
diff --git a/framework/tck/tck-dom/pom.xml b/framework/tck/tck-dom/pom.xml
index 7f7cca4..4b1b06a 100644
--- a/framework/tck/tck-dom/pom.xml
+++ b/framework/tck/tck-dom/pom.xml
@@ -49,6 +49,15 @@
                     </execution>
                 </executions>
             </plugin>
+            
+            <!-- 
+            <plugin>
+				<groupId>org.apache.isis.tools</groupId>
+				<artifactId>isis-maven-plugin</artifactId>
+				<version>0.3.1-SNAPSHOT</version>
+			</plugin>
+             -->
+            
 		</plugins>
 		<pluginManagement>
 			<plugins>