diff --git a/ccm-core/pom.xml b/ccm-core/pom.xml
index b4f7099aa..a24058167 100644
--- a/ccm-core/pom.xml
+++ b/ccm-core/pom.xml
@@ -137,6 +137,11 @@
test
+
+ org.apache.maven
+ maven-artifact
+
+
com.h2database
h2
@@ -399,6 +404,7 @@
**/DateFormatter.java
**/DateFormatterConfig.java
**/DateTimeFormatter.java
+ **/DispatcherConfig.java
**/Document.java
**/Element.java
**/EmailParameter.java
@@ -407,13 +413,17 @@
**/ExceptionUnwrapper.java
**/Exceptions.java
**/FileParameter.java
+ **/FormBuilderConfig.java
**/FullDateFormatter.java
+ **/GlobalizationConfig.java
**/IntegerParameter.java
**/JavaPropertyReader.java
**/JavaPropertyWriter.java
**/KernelConfig.java
**/LockableImpl.java
+ **/MailConfig.java
**/MapParameter.java
+ **/NotificationConfig.java
**/Parameter.java
**/ParameterError.java
**/ParameterException.java
@@ -425,8 +435,11 @@
**/SpecificClassParameter.java
**/StringParameter.java
**/TimeFormatter.java
+ **/UIConfig.java
**/UncheckedWrapperException.java
+ **/WorkflowConfig.java
**/XML.java
+ **/XMLConfig.java
diff --git a/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java b/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java
index a7d150fed..688cf8f2c 100644
--- a/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java
+++ b/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java
@@ -21,6 +21,8 @@ package org.libreccm.auditing;
import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;
+import java.util.Objects;
+
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@@ -51,4 +53,31 @@ public class CcmRevision extends DefaultRevisionEntity {
this.userName = userName;
}
+ @Override
+ public int hashCode() {
+ int hash = super.hashCode();
+
+ hash = 17 * hash + Objects.hashCode(this.userName);
+
+ return hash;
+ }
+
+
+
+ @Override
+ public boolean equals(final Object object) {
+ if(!super.equals(object)) {
+ return false;
+ }
+
+ if (!(object instanceof CcmRevision)) {
+ return false;
+ }
+
+ final CcmRevision other = (CcmRevision) object;
+ return userName.equals(other.getUserName());
+ }
+
+
+
}
diff --git a/ccm-core/src/main/java/org/libreccm/jpa/AuditReaderProducer.java b/ccm-core/src/main/java/org/libreccm/jpa/AuditReaderProducer.java
new file mode 100644
index 000000000..9bd4445de
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/jpa/AuditReaderProducer.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.jpa;
+
+import org.hibernate.envers.AuditReader;
+import org.hibernate.envers.AuditReaderFactory;
+
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class AuditReaderProducer {
+
+ @Inject
+ private transient EntityManager entityManager;
+
+ @Produces
+ public AuditReader auditReader() {
+ return AuditReaderFactory.get(entityManager);
+ }
+}
diff --git a/ccm-core/src/main/java/org/libreccm/jpa/EntityManagerProducer.java b/ccm-core/src/main/java/org/libreccm/jpa/EntityManagerProducer.java
index cd2c36572..2226968cb 100644
--- a/ccm-core/src/main/java/org/libreccm/jpa/EntityManagerProducer.java
+++ b/ccm-core/src/main/java/org/libreccm/jpa/EntityManagerProducer.java
@@ -1,8 +1,5 @@
package org.libreccm.jpa;
-import org.hibernate.envers.AuditReader;
-import org.hibernate.envers.AuditReaderFactory;
-
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
@@ -15,12 +12,9 @@ import javax.persistence.PersistenceContext;
@ApplicationScoped
@SuppressWarnings("PMD.UnusedPrivateField")
public class EntityManagerProducer {
-
+
@Produces
@PersistenceContext(name = "LibreCCM")
private EntityManager entityManager;
-
- @Produces
- private AuditReader auditReader = AuditReaderFactory.get(entityManager);
-
+
}
diff --git a/ccm-core/src/main/java/org/libreccm/modules/Bar.java b/ccm-core/src/main/java/org/libreccm/modules/Bar.java
deleted file mode 100644
index 93770758c..000000000
--- a/ccm-core/src/main/java/org/libreccm/modules/Bar.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2015 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package org.libreccm.modules;
-
-/**
- *
- * @author Jens Pelzetter
- */
-public class Bar implements Module {
-
- @Override
- public void prepare() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void uninstall() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void init() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void shutdown() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
-}
diff --git a/ccm-core/src/main/java/org/libreccm/modules/Example.java b/ccm-core/src/main/java/org/libreccm/modules/Example.java
deleted file mode 100644
index 606181e19..000000000
--- a/ccm-core/src/main/java/org/libreccm/modules/Example.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2015 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package org.libreccm.modules;
-
-/**
- *
- * @author Jens Pelzetter
- */
-public class Example implements Module {
-
- @Override
- public void prepare() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void uninstall() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void init() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void shutdown() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
-}
diff --git a/ccm-core/src/main/java/org/libreccm/modules/Foo.java b/ccm-core/src/main/java/org/libreccm/modules/Foo.java
deleted file mode 100644
index 738a25689..000000000
--- a/ccm-core/src/main/java/org/libreccm/modules/Foo.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2015 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package org.libreccm.modules;
-
-import org.libreccm.modules.annotations.RequiredModule;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@org.libreccm.modules.annotations.Module(name = "org.libreccm.foo.Foo",
- version = "1.0.0-beta.1",
- requiredModules = {
- @RequiredModule(module = Bar.class, version = "1.0.0"),
- @RequiredModule(module= Example.class, version = "6.6.7")})
-public class Foo implements Module {
-
- @Override
- public void prepare() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void uninstall() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void init() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
- @Override
- public void shutdown() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
- }
-
-}
diff --git a/ccm-core/src/main/java/org/libreccm/modules/Module.java b/ccm-core/src/main/java/org/libreccm/modules/ModuleDescriptor.java
similarity index 97%
rename from ccm-core/src/main/java/org/libreccm/modules/Module.java
rename to ccm-core/src/main/java/org/libreccm/modules/ModuleDescriptor.java
index d8cf09005..e37b404d9 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/Module.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/ModuleDescriptor.java
@@ -22,7 +22,7 @@ package org.libreccm.modules;
*
* @author Jens Pelzetter
*/
-public interface Module {
+public interface ModuleDescriptor {
/**
* Called by the {@link ModuleManager} after the database tables for the
diff --git a/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java b/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java
index 6731765c1..844684b47 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java
@@ -30,7 +30,7 @@ import javax.inject.Inject;
public class ModuleManager {
@Inject
- private transient Instance modules;
+ private transient Instance modules;
diff --git a/ccm-core/src/main/java/org/libreccm/modules/ModuleUtil.java b/ccm-core/src/main/java/org/libreccm/modules/ModuleUtil.java
index 3a0807bf6..6176524c8 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/ModuleUtil.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/ModuleUtil.java
@@ -18,23 +18,22 @@
*/
package org.libreccm.modules;
+import org.libreccm.modules.annotations.Module;
import org.libreccm.modules.annotations.RequiredModule;
/**
*
* @author Jens Pelzetter
*/
-public class ModuleUtil {
+public final class ModuleUtil {
private ModuleUtil() {
//Nothing
}
- private static org.libreccm.modules.annotations.Module getModuleAnnotation(
- final Module module) {
- final org.libreccm.modules.annotations.Module annotation = module
- .getClass().getAnnotation(
- org.libreccm.modules.annotations.Module.class);
+ private static Module getModuleAnnotation(
+ final ModuleDescriptor module) {
+ final Module annotation = module.getClass().getAnnotation(Module.class);
if (annotation == null) {
throw new IllegalArgumentException(String.format(
@@ -47,21 +46,22 @@ public class ModuleUtil {
}
}
- public static String getModuleName(final Module module) {
+ public static String getModuleName(final ModuleDescriptor module) {
return getModuleAnnotation(module).name();
}
- public static String getVersion(final Module module) {
+ public static String getVersion(final ModuleDescriptor module) {
return getModuleAnnotation(module).version();
}
- public static RequiredModule[] getRequiredModules(final Module module) {
+ public static RequiredModule[] getRequiredModules(final ModuleDescriptor module) {
return getModuleAnnotation(module).requiredModules();
}
- public static String getModuleName(Class extends Module> module) {
- final org.libreccm.modules.annotations.Module annotation = module
- .getAnnotation(org.libreccm.modules.annotations.Module.class);
+ public static String getModuleName(
+ final Class extends ModuleDescriptor> module) {
+
+ final Module annotation = module.getAnnotation(Module.class);
if (annotation == null) {
throw new IllegalArgumentException(String.format(
diff --git a/ccm-core/src/main/java/org/libreccm/modules/annotations/Module.java b/ccm-core/src/main/java/org/libreccm/modules/annotations/Module.java
index 6015af003..486c7a262 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/annotations/Module.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/annotations/Module.java
@@ -18,7 +18,7 @@
*/
package org.libreccm.modules.annotations;
-import org.jboss.as.server.moduleservice.ModuleDefinition;
+import org.libreccm.modules.ModuleDescriptor;
import static java.lang.annotation.ElementType.*;
@@ -30,7 +30,7 @@ import javax.enterprise.util.Nonbinding;
import javax.inject.Qualifier;
/**
- * Annotate an implementation of the {@link ModuleDefinition} interface with
+ * Annotate an implementation of the {@link ModuleDescriptor} interface with
* this annotation to use it as a module.
*
* @author Jens Pelzetter
diff --git a/ccm-core/src/main/java/org/libreccm/modules/annotations/RequiredModule.java b/ccm-core/src/main/java/org/libreccm/modules/annotations/RequiredModule.java
index edc5c7741..a165608b2 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/annotations/RequiredModule.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/annotations/RequiredModule.java
@@ -24,8 +24,10 @@ package org.libreccm.modules.annotations;
*/
public @interface RequiredModule {
- Class extends org.libreccm.modules.Module> module();
+ Class extends org.libreccm.modules.ModuleDescriptor> module();
- String version() default "";
+ String minVersion() default "";
+
+ String maxVersion() default "";
}
diff --git a/ccm-core/src/main/java/org/libreccm/modules/dependencytree/DependencyTreeManager.java b/ccm-core/src/main/java/org/libreccm/modules/dependencytree/DependencyTreeManager.java
index 648fc0660..3c63bd7fb 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/dependencytree/DependencyTreeManager.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/dependencytree/DependencyTreeManager.java
@@ -20,7 +20,8 @@ package org.libreccm.modules.dependencytree;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-import org.libreccm.modules.Module;
+import org.apache.maven.artifact.versioning.ComparableVersion;
+import org.libreccm.modules.ModuleDescriptor;
import org.libreccm.modules.ModuleUtil;
import org.libreccm.modules.annotations.RequiredModule;
@@ -32,6 +33,18 @@ import java.util.Map;
import javax.enterprise.inject.Instance;
/**
+ * This class implements topological sorting to determine the order in which the
+ * modules are loaded and initialised.
+ *
+ * The class is used by creating an instance with the parameterless constructor.
+ * To create the tree/graph call the
+ * {@link #generateTree(javax.enterprise.inject.Instance)} method. With the
+ * returned list of nodes call the the {@link #orderModules(java.util.List)}
+ * method. The list returned by {@link #orderModules(java.util.List)} contains
+ * all modules in order.
+ *
+ * More information about topological sorting:
+ * https://en.wikipedia.org/wiki/Topological_sorting
*
* @author Jens Pelzetter
*/
@@ -40,23 +53,23 @@ public class DependencyTreeManager {
private static final Logger LOGGER = LogManager.getLogger(
DependencyTreeManager.class);
- public List generateTree(final Instance modules) throws
- DependencyException {
+ public List generateTree(final Instance modules)
+ throws DependencyException {
LOGGER.info("Starting to generate dependency tree...");
final Map nodes = new HashMap<>();
- for (final Module module : modules) {
+ for (final ModuleDescriptor module : modules) {
createTreeNode(module, nodes);
}
- for (final Module module : modules) {
+ for (final ModuleDescriptor module : modules) {
addDependencyRelations(module, nodes);
}
final List nodeList = new ArrayList<>();
- for (Map.Entry entry : nodes.entrySet()) {
+ for (final Map.Entry entry : nodes.entrySet()) {
nodeList.add(entry.getValue());
}
@@ -116,7 +129,7 @@ public class DependencyTreeManager {
}
}
- private void createTreeNode(final Module module,
+ private void createTreeNode(final ModuleDescriptor module,
final Map nodes) {
final TreeNode node = new TreeNode(module);
@@ -125,7 +138,7 @@ public class DependencyTreeManager {
nodes.put(ModuleUtil.getModuleName(module), node);
}
- private void addDependencyRelations(final Module module,
+ private void addDependencyRelations(final ModuleDescriptor module,
final Map nodes)
throws DependencyException {
@@ -147,8 +160,9 @@ public class DependencyTreeManager {
final TreeNode node = nodes.get(moduleName);
LOGGER.info("Processing required modules for module \"{}\"...",
ModuleUtil.getModuleName(module));
- for (RequiredModule requiredModule : ModuleUtil.getRequiredModules(
- module)) {
+ for (final RequiredModule requiredModule : ModuleUtil
+ .getRequiredModules(
+ module)) {
LOGGER.info("\tModule \"{}\" requires module \"{}\".",
ModuleUtil.getModuleName(module),
@@ -171,9 +185,84 @@ public class DependencyTreeManager {
final TreeNode dependencyNode = nodes.get(ModuleUtil.getModuleName(
requiredModule.module()));
- node.addDependsOn(node);
+ //Check version
+ if (!validateVersion(ModuleUtil.getVersion(dependencyNode
+ .getModule()),
+ requiredModule.minVersion(),
+ requiredModule.maxVersion())) {
+ throw new DependencyException(String.format(
+ "The required module is avialable but in the correct "
+ + "version. "
+ + "Available version: \"%s\"; "
+ + "minimal required version: \"%s\"; "
+ + "maximum required version: \"%s\"",
+ ModuleUtil.getVersion(dependencyNode.getModule()),
+ requiredModule.minVersion(),
+ requiredModule.maxVersion()));
+ }
+
+ node.addDependsOn(dependencyNode);
dependencyNode.addDependentModule(node);
}
}
+ /**
+ * Helper method for checking if an dependency is available in the required
+ * version.
+ *
+ * @param availableVersion The available version. Can't be {@code null} or
+ * empty.
+ * @param minRequiredVersion The minimal version required. Can be
+ * {@code null} or empty.
+ * @param maxRequiredVersion The maximum version required. Can be
+ * {@code null} or empty.
+ *
+ * @return {@code true} if the available version is in the required range,
+ * {@code false} if not.
+ */
+ //The names are fine. Shorter names would be less readable. Also removing
+ //the parentheses in the ifs would make the conditions less readable.
+ @SuppressWarnings({"PMD.LongVariable",
+ "PMD.UselessParentheses",
+ "PMD.CyclomaticComplexity"})
+ private boolean validateVersion(final String availableVersion,
+ final String minRequiredVersion,
+ final String maxRequiredVersion) {
+ if (availableVersion == null || availableVersion.isEmpty()) {
+ throw new IllegalArgumentException("No available version specified.");
+ }
+
+ if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
+ && (maxRequiredVersion == null || maxRequiredVersion.isEmpty())) {
+ return true;
+ } else if ((minRequiredVersion != null && !minRequiredVersion.isEmpty())
+ && (maxRequiredVersion == null || maxRequiredVersion
+ .isEmpty())) {
+ final ComparableVersion minVersion = new ComparableVersion(
+ minRequiredVersion);
+ final ComparableVersion version = new ComparableVersion(
+ availableVersion);
+
+ return minVersion.compareTo(version) <= 0;
+ } else if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
+ && (maxRequiredVersion != null && !maxRequiredVersion
+ .isEmpty())) {
+ final ComparableVersion maxVersion = new ComparableVersion(
+ maxRequiredVersion);
+ final ComparableVersion version = new ComparableVersion(
+ availableVersion);
+
+ return version.compareTo(maxVersion) <= 0;
+ } else {
+ final ComparableVersion minVersion = new ComparableVersion(
+ minRequiredVersion);
+ final ComparableVersion maxVersion = new ComparableVersion(
+ (maxRequiredVersion));
+ final ComparableVersion version = new ComparableVersion(
+ availableVersion);
+ return minVersion.compareTo(version) <= 0 && version.compareTo(
+ maxVersion) <= 0;
+ }
+ }
+
}
diff --git a/ccm-core/src/main/java/org/libreccm/modules/dependencytree/TreeNode.java b/ccm-core/src/main/java/org/libreccm/modules/dependencytree/TreeNode.java
index 3a5542624..a96580feb 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/dependencytree/TreeNode.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/dependencytree/TreeNode.java
@@ -18,7 +18,7 @@
*/
package org.libreccm.modules.dependencytree;
-import org.libreccm.modules.Module;
+import org.libreccm.modules.ModuleDescriptor;
import org.libreccm.modules.ModuleUtil;
import java.util.ArrayList;
@@ -27,12 +27,15 @@ import java.util.List;
import java.util.Objects;
/**
- *
+ * Represents a node in the dependency tree.
+ *
+ * @see DependencyTreeManager
+ *
* @author Jens Pelzetter
*/
public final class TreeNode {
- private Module module;
+ private ModuleDescriptor module;
private List dependentModules;
private List dependsOn;
@@ -40,20 +43,20 @@ public final class TreeNode {
super();
dependentModules = new ArrayList<>();
- dependentModules = new ArrayList<>();
+ dependsOn = new ArrayList<>();
}
- public TreeNode(final Module module) {
+ public TreeNode(final ModuleDescriptor module) {
this();
this.module = module;
}
- public Module getModule() {
+ public ModuleDescriptor getModule() {
return module;
}
- public void setModule(final Module module) {
+ public void setModule(final ModuleDescriptor module) {
this.module = module;
}
@@ -61,15 +64,15 @@ public final class TreeNode {
return Collections.unmodifiableList(dependentModules);
}
- protected void setDependentModules(final List dependentModules) {
+ void setDependentModules(final List dependentModules) {
this.dependentModules = dependentModules;
}
- protected void addDependentModule(final TreeNode node) {
+ void addDependentModule(final TreeNode node) {
dependentModules.add(node);
}
- protected void removeDependentModule(final TreeNode node) {
+ void removeDependentModule(final TreeNode node) {
dependentModules.remove(node);
}
@@ -77,15 +80,15 @@ public final class TreeNode {
return Collections.unmodifiableList(dependsOn);
}
- protected void setDependsOn(final List dependsOn) {
+ void setDependsOn(final List dependsOn) {
this.dependsOn = dependsOn;
}
- protected void addDependsOn(final TreeNode node) {
+ void addDependsOn(final TreeNode node) {
dependsOn.add(node);
}
- protected void removeDependsOn(final TreeNode node) {
+ void removeDependsOn(final TreeNode node) {
dependsOn.remove(node);
}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/ComparableVersionTest.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/ComparableVersionTest.java
new file mode 100644
index 000000000..70e8b7661
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/ComparableVersionTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree;
+
+import org.apache.maven.artifact.versioning.ComparableVersion;
+
+import static org.hamcrest.Matchers.*;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.libreccm.tests.categories.UnitTest;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@Category(UnitTest.class)
+public class ComparableVersionTest {
+
+ public ComparableVersionTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void compareVersions() {
+ final ComparableVersion version001 = new ComparableVersion("0.0.1");
+ final ComparableVersion version010 = new ComparableVersion("0.1.0");
+ final ComparableVersion version015 = new ComparableVersion("0.1.5");
+ final ComparableVersion version100alpha1 = new ComparableVersion(
+ "1.0.0-alpha.1");
+ final ComparableVersion version100alpha2 = new ComparableVersion(
+ "1.0.0-alpha.2");
+ final ComparableVersion version100beta1 = new ComparableVersion(
+ "1.0.0-beta.1");
+ final ComparableVersion version100beta2 = new ComparableVersion(
+ "1.0.0-beta.2");
+ final ComparableVersion version100 = new ComparableVersion("1.0.0");
+ final ComparableVersion version100final = new ComparableVersion("1.0.0");
+ final ComparableVersion version100ga = new ComparableVersion("1.0.0-ga");
+ final ComparableVersion version157 = new ComparableVersion("1.5.7");
+ final ComparableVersion version273beta3 = new ComparableVersion(
+ "2.7.3-beta.3");
+ final ComparableVersion emptyVersion = new ComparableVersion("");
+
+ final List versions = new ArrayList<>();
+ versions.add(version001);
+ versions.add(version157);
+ versions.add(version100alpha2);
+ versions.add(version100beta2);
+ versions.add(version100alpha1);
+ versions.add(version273beta3);
+ versions.add(version100);
+ versions.add(version010);
+ versions.add(version015);
+ versions.add(version100beta1);
+ versions.add(version100ga);
+ versions.add(version100final);
+ versions.add(emptyVersion);
+
+ Collections.sort(versions);
+
+ assertThat(versions.size(), is(13));
+
+ assertThat(versions,
+ contains(emptyVersion,
+ version001,
+ version010,
+ version015,
+ version100alpha1,
+ version100alpha2,
+ version100beta1,
+ version100beta2,
+ version100final,
+ version100ga,
+ version100,
+ version157,
+ version273beta3));
+ }
+
+}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerCycleTest.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerCycleTest.java
new file mode 100644
index 000000000..21ef69a14
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerCycleTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree;
+
+import static org.hamcrest.Matchers.*;
+
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.ShouldThrowException;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.resolver.api.maven.Maven;
+import org.jboss.shrinkwrap.resolver.api.maven.PomEquippedResolveStage;
+import org.junit.After;
+import org.junit.AfterClass;
+
+import static org.junit.Assert.*;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.libreccm.modules.ModuleDescriptor;
+import org.libreccm.modules.annotations.Module;
+import org.libreccm.modules.dependencytree.test.cycle.TestModuleA;
+import org.libreccm.modules.dependencytree.test.cycle.TestModuleB;
+import org.libreccm.modules.dependencytree.test.cycle.TestModuleC;
+import org.libreccm.modules.dependencytree.test.cycle.TestModuleRoot;
+import org.libreccm.tests.categories.IntegrationTest;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.enterprise.inject.Instance;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@Category(IntegrationTest.class)
+@RunWith(Arquillian.class)
+public class DependencyTreeManagerCycleTest {
+
+ @Inject
+ @Module
+ private transient Instance modules;
+
+ public DependencyTreeManagerCycleTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Deployment
+ public static WebArchive createDeployment() {
+ final PomEquippedResolveStage pom = Maven
+ .resolver()
+ .loadPomFromFile("pom.xml");
+ final PomEquippedResolveStage dependencies = pom
+ .importCompileAndRuntimeDependencies();
+ final File[] libs = dependencies.resolve().withTransitivity().asFile();
+
+ for (File lib : libs) {
+ System.err.printf("Adding file '%s' to test archive...%n",
+ lib.getName());
+ }
+
+ return ShrinkWrap
+ .create(WebArchive.class,
+ "LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManager.war")
+ .addPackage(DependencyTreeManager.class.getPackage())
+ .addPackage(Module.class
+ .getPackage())
+ .addPackage(org.libreccm.tests.categories.IntegrationTest.class
+ .getPackage())
+ .addPackage(
+ org.libreccm.modules.dependencytree.test.cycle.TestModuleRoot.class
+ .getPackage())
+ .addClass(org.libreccm.modules.ModuleDescriptor.class)
+ .addClass(org.libreccm.modules.ModuleUtil.class)
+ .addAsLibraries(libs)
+ .addAsWebInfResource("test-web.xml", "web.xml")
+ .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
+ public void allModulesInjected() {
+ final List> moduleList = new ArrayList<>();
+ for (final ModuleDescriptor module : modules) {
+ moduleList.add((Class) module.getClass());
+ }
+
+ assertThat(moduleList.size(), is(4));
+ assertThat(moduleList, containsInAnyOrder(TestModuleRoot.class,
+ TestModuleA.class,
+ TestModuleB.class,
+ TestModuleC.class));
+ }
+
+ @Test(expected = DependencyException.class)
+ @ShouldThrowException(DependencyException.class)
+ public void verifyModuleOrder() throws DependencyException {
+ final DependencyTreeManager treeManager = new DependencyTreeManager();
+
+ final List tree = treeManager.generateTree(modules);
+ treeManager.orderModules(tree);
+ }
+
+}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerTest.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerTest.java
index 27fb120e8..d13e8d647 100644
--- a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerTest.java
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerTest.java
@@ -18,6 +18,11 @@
*/
package org.libreccm.modules.dependencytree;
+import org.libreccm.modules.dependencytree.test.valid.TestModuleB;
+import org.libreccm.modules.dependencytree.test.valid.TestModuleC;
+import org.libreccm.modules.dependencytree.test.valid.TestModuleA;
+import org.libreccm.modules.dependencytree.test.valid.TestModuleRoot;
+
import static org.hamcrest.Matchers.*;
import org.jboss.arquillian.container.test.api.Deployment;
@@ -37,7 +42,9 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
-import org.libreccm.modules.Module;
+import org.libreccm.modules.ModuleDescriptor;
+import org.libreccm.modules.ModuleUtil;
+import org.libreccm.modules.annotations.Module;
import org.libreccm.tests.categories.IntegrationTest;
import java.io.File;
@@ -56,8 +63,8 @@ import javax.inject.Inject;
public class DependencyTreeManagerTest {
@Inject
- @org.libreccm.modules.annotations.Module
- private transient Instance modules;
+ @Module
+ private transient Instance modules;
public DependencyTreeManagerTest() {
}
@@ -96,12 +103,16 @@ public class DependencyTreeManagerTest {
.create(WebArchive.class,
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManager.war")
.addPackage(DependencyTreeManager.class.getPackage())
- .addPackage(org.libreccm.modules.annotations.Module.class
+ .addPackage(Module.class
.getPackage())
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
.getPackage())
- .addClass(org.libreccm.modules.Module.class)
+ .addPackage(
+ org.libreccm.modules.dependencytree.test.valid.TestModuleRoot.class
+ .getPackage())
+ .addClass(org.libreccm.modules.ModuleDescriptor.class)
.addClass(org.libreccm.modules.ModuleUtil.class)
+ .addAsLibraries(libs)
.addAsWebInfResource("test-web.xml", "web.xml")
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
@@ -109,10 +120,9 @@ public class DependencyTreeManagerTest {
@Test
@SuppressWarnings("unchecked")
public void allModulesInjected() {
-
- final List> moduleList = new ArrayList<>();
- for (final Module module : modules) {
- moduleList.add((Class) module.getClass());
+ final List> moduleList = new ArrayList<>();
+ for (final ModuleDescriptor module : modules) {
+ moduleList.add((Class) module.getClass());
}
assertThat(moduleList.size(), is(4));
@@ -120,7 +130,25 @@ public class DependencyTreeManagerTest {
TestModuleA.class,
TestModuleB.class,
TestModuleC.class));
+ }
+ @Test
+ public void verifyModuleOrder() throws DependencyException {
+ final DependencyTreeManager treeManager = new DependencyTreeManager();
+
+ final List tree = treeManager.generateTree(modules);
+ final List ordered = treeManager.orderModules(tree);
+
+ final List modulesInOrder = new ArrayList<>();
+ for (final TreeNode node : ordered) {
+ modulesInOrder.add(ModuleUtil.getModuleName(node.getModule()));
+ }
+
+ assertThat(modulesInOrder,
+ contains("org.libreccm.core.ccm-testmodule-root",
+ "org.libreccm.core.ccm-testmodule-a",
+ "org.libreccm.core.ccm-testmodule-b",
+ "org.libreccm.core.ccm-testmodule-c"));
}
}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleA.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleA.java
similarity index 86%
rename from ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleA.java
rename to ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleA.java
index 09a007910..44375017a 100644
--- a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleA.java
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleA.java
@@ -16,9 +16,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.libreccm.modules.dependencytree;
+package org.libreccm.modules.dependencytree.test.cycle;
-import org.libreccm.modules.Module;
+import org.libreccm.modules.dependencytree.test.valid.*;
+import org.libreccm.modules.ModuleDescriptor;
import org.libreccm.modules.annotations.RequiredModule;
/**
@@ -29,7 +30,7 @@ import org.libreccm.modules.annotations.RequiredModule;
name = "org.libreccm.core.ccm-testmodule-a", version = "1.0.0",
requiredModules = {
@RequiredModule(module = TestModuleRoot.class)})
-public class TestModuleA implements Module {
+public class TestModuleA implements ModuleDescriptor {
@Override
public void prepare() {
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleB.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleB.java
similarity index 82%
rename from ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleB.java
rename to ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleB.java
index b2fd15e32..1ce7922c5 100644
--- a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleB.java
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleB.java
@@ -16,9 +16,10 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.libreccm.modules.dependencytree;
+package org.libreccm.modules.dependencytree.test.cycle;
-import org.libreccm.modules.Module;
+import org.libreccm.modules.dependencytree.test.valid.*;
+import org.libreccm.modules.ModuleDescriptor;
import org.libreccm.modules.annotations.RequiredModule;
/**
@@ -26,10 +27,10 @@ import org.libreccm.modules.annotations.RequiredModule;
* @author Jens Pelzetter
*/
@org.libreccm.modules.annotations.Module(
- name = "org.libreccm.core.ccm-testmodule-a", version = "1.0.0",
+ name = "org.libreccm.core.ccm-testmodule-b", version = "1.0.0",
requiredModules = {
@RequiredModule(module = TestModuleRoot.class)})
-public class TestModuleB implements Module {
+public class TestModuleB implements ModuleDescriptor {
@Override
public void prepare() {
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleC.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleC.java
new file mode 100644
index 000000000..a83d97bee
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleC.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree.test.cycle;
+
+import org.libreccm.modules.dependencytree.test.valid.*;
+import org.libreccm.modules.ModuleDescriptor;
+import org.libreccm.modules.annotations.RequiredModule;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@org.libreccm.modules.annotations.Module(
+ name = "org.libreccm.core.ccm-testmodule-c", version = "1.0.0",
+ requiredModules = {
+ @RequiredModule(module = TestModuleRoot.class),
+ @RequiredModule(module = TestModuleA.class)})
+public class TestModuleC implements ModuleDescriptor {
+
+ @Override
+ public void prepare() {
+ //Nothing
+ }
+
+ @Override
+ public void uninstall() {
+ //Nothing
+ }
+
+ @Override
+ public void init() {
+ //Nothing
+ }
+
+ @Override
+ public void shutdown() {
+ //Nothing
+ }
+
+}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleRoot.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleRoot.java
new file mode 100644
index 000000000..e5c7aa24e
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/cycle/TestModuleRoot.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree.test.cycle;
+
+import org.libreccm.modules.ModuleDescriptor;
+import org.libreccm.modules.annotations.RequiredModule;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@org.libreccm.modules.annotations.Module(
+ name = "org.libreccm.core.ccm-testmodule-root",
+ version = "1.0.0",
+ requiredModules = {
+ @RequiredModule(module = TestModuleB.class)})
+public class TestModuleRoot implements ModuleDescriptor {
+
+ @Override
+ public void prepare() {
+ //Nothing
+ }
+
+ @Override
+ public void uninstall() {
+ //Nothing
+ }
+
+ @Override
+ public void init() {
+ //Nothing
+ }
+
+ @Override
+ public void shutdown() {
+ //Nothing
+ }
+
+}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleC.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleA.java
similarity index 85%
rename from ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleC.java
rename to ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleA.java
index e11ee48b6..d7cc355ea 100644
--- a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleC.java
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleA.java
@@ -16,9 +16,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.libreccm.modules.dependencytree;
+package org.libreccm.modules.dependencytree.test.valid;
-import org.libreccm.modules.Module;
+import org.libreccm.modules.ModuleDescriptor;
import org.libreccm.modules.annotations.RequiredModule;
/**
@@ -28,9 +28,8 @@ import org.libreccm.modules.annotations.RequiredModule;
@org.libreccm.modules.annotations.Module(
name = "org.libreccm.core.ccm-testmodule-a", version = "1.0.0",
requiredModules = {
- @RequiredModule(module = TestModuleRoot.class),
- @RequiredModule(module = TestModuleA.class)})
-public class TestModuleC implements Module {
+ @RequiredModule(module = TestModuleRoot.class, minVersion = "1.0.0")})
+public class TestModuleA implements ModuleDescriptor {
@Override
public void prepare() {
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleB.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleB.java
new file mode 100644
index 000000000..9c739a7ad
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleB.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree.test.valid;
+
+import org.libreccm.modules.ModuleDescriptor;
+import org.libreccm.modules.annotations.RequiredModule;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@org.libreccm.modules.annotations.Module(
+ name = "org.libreccm.core.ccm-testmodule-b", version = "1.0.0",
+ requiredModules = {
+ @RequiredModule(module = TestModuleRoot.class, minVersion = "1.0.0")})
+public class TestModuleB implements ModuleDescriptor {
+
+ @Override
+ public void prepare() {
+ //Nothing
+ }
+
+ @Override
+ public void uninstall() {
+ //Nothing
+ }
+
+ @Override
+ public void init() {
+ //Nothing
+ }
+
+ @Override
+ public void shutdown() {
+ //Nothing
+ }
+
+}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleC.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleC.java
new file mode 100644
index 000000000..c9086e45f
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleC.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree.test.valid;
+
+import org.libreccm.modules.ModuleDescriptor;
+import org.libreccm.modules.annotations.RequiredModule;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@org.libreccm.modules.annotations.Module(
+ name = "org.libreccm.core.ccm-testmodule-c", version = "1.0.0",
+ requiredModules = {
+ @RequiredModule(module = TestModuleRoot.class, minVersion = "1.0.0"),
+ @RequiredModule(module = TestModuleA.class, minVersion = "1.0.0")})
+public class TestModuleC implements ModuleDescriptor {
+
+ @Override
+ public void prepare() {
+ //Nothing
+ }
+
+ @Override
+ public void uninstall() {
+ //Nothing
+ }
+
+ @Override
+ public void init() {
+ //Nothing
+ }
+
+ @Override
+ public void shutdown() {
+ //Nothing
+ }
+
+}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleRoot.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleRoot.java
similarity index 83%
rename from ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleRoot.java
rename to ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleRoot.java
index 49e7df808..e95cd48b3 100644
--- a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/TestModuleRoot.java
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/test/valid/TestModuleRoot.java
@@ -16,17 +16,17 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
-package org.libreccm.modules.dependencytree;
+package org.libreccm.modules.dependencytree.test.valid;
-import org.libreccm.modules.Module;
+import org.libreccm.modules.ModuleDescriptor;
/**
*
* @author Jens Pelzetter
*/
@org.libreccm.modules.annotations.Module(
- name = "org.libreccm.core.ccm-testmodule-a", version = "1.0.0")
-public class TestModuleRoot implements Module {
+ name = "org.libreccm.core.ccm-testmodule-root", version = "1.0.0")
+public class TestModuleRoot implements ModuleDescriptor {
@Override
public void prepare() {
diff --git a/pom.xml b/pom.xml
index 7fcac0bb0..d0e690a93 100644
--- a/pom.xml
+++ b/pom.xml
@@ -369,7 +369,6 @@
1.46
-
org.imgscalr
imgscalr-lib
@@ -382,6 +381,12 @@
1.8.2
+
+ org.apache.maven
+ maven-artifact
+ 3.3.3
+
+
oro
oro