CCM NG: Some code clean up
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3591 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
0d967f6832
commit
2f95086fe9
|
|
@ -31,6 +31,8 @@ public class DependencyException extends Exception {
|
||||||
* message.
|
* message.
|
||||||
*/
|
*/
|
||||||
public DependencyException() {
|
public DependencyException() {
|
||||||
|
super();
|
||||||
|
//Nothin more
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -45,10 +45,10 @@ import org.apache.maven.artifact.versioning.ComparableVersion;
|
||||||
final class DependencyTreeManager {
|
final class DependencyTreeManager {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger(
|
private static final Logger LOGGER = LogManager.getLogger(
|
||||||
DependencyTreeManager.class);
|
DependencyTreeManager.class);
|
||||||
|
|
||||||
public List<TreeNode> generateTree(final Iterable<CcmModule> modules)
|
public List<TreeNode> generateTree(final Iterable<CcmModule> modules)
|
||||||
throws DependencyException {
|
throws DependencyException {
|
||||||
|
|
||||||
LOGGER.info("Starting to generate dependency tree...");
|
LOGGER.info("Starting to generate dependency tree...");
|
||||||
|
|
||||||
|
|
@ -57,6 +57,11 @@ final class DependencyTreeManager {
|
||||||
for (final CcmModule module : modules) {
|
for (final CcmModule module : modules) {
|
||||||
createTreeNode(module, nodes);
|
createTreeNode(module, nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (final CcmModule module : modules) {
|
||||||
|
addDependencyRelations(module, nodes);
|
||||||
|
}
|
||||||
|
|
||||||
final List<TreeNode> nodeList = new ArrayList<>();
|
final List<TreeNode> nodeList = new ArrayList<>();
|
||||||
for (final Map.Entry<String, TreeNode> entry : nodes.entrySet()) {
|
for (final Map.Entry<String, TreeNode> entry : nodes.entrySet()) {
|
||||||
nodeList.add(entry.getValue());
|
nodeList.add(entry.getValue());
|
||||||
|
|
@ -68,22 +73,19 @@ final class DependencyTreeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TreeNode> orderModules(final List<TreeNode> dependencyTree)
|
public List<TreeNode> orderModules(final List<TreeNode> dependencyTree)
|
||||||
throws DependencyException {
|
throws DependencyException {
|
||||||
LOGGER.info("Creating an ordered list from the dependency tree...");
|
LOGGER.info("Creating an ordered list from the dependency tree...");
|
||||||
|
|
||||||
final List<TreeNode> orderedModules = new ArrayList<>();
|
final List<TreeNode> orderedModules = new ArrayList<>();
|
||||||
final List<TreeNode> resolvedModules = new ArrayList<>();
|
final List<TreeNode> resolvedModules = new ArrayList<>();
|
||||||
|
|
||||||
LOGGER.info("Looking for modules which do not depend on any other "
|
LOGGER.info("Looking for modules which do not depend on any other "
|
||||||
+ "modules...");
|
+ "modules...");
|
||||||
for (final TreeNode node : dependencyTree) {
|
for (final TreeNode node : dependencyTree) {
|
||||||
if (node.getDependsOn().isEmpty()) {
|
if (node.getDependsOn().isEmpty()) {
|
||||||
// LOGGER.info(
|
|
||||||
// "\tModule \"{}\" does not depend on any other module",
|
|
||||||
// ModuleUtil.getModuleName(node.getModule()));
|
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
"\tModule \"{}\" does not depend on any other module",
|
"\tModule \"{}\" does not depend on any other module",
|
||||||
node.getModuleInfo().getModuleName());
|
node.getModuleInfo().getModuleName());
|
||||||
resolvedModules.add(node);
|
resolvedModules.add(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -92,8 +94,6 @@ final class DependencyTreeManager {
|
||||||
while (!resolvedModules.isEmpty()) {
|
while (!resolvedModules.isEmpty()) {
|
||||||
|
|
||||||
final TreeNode current = resolvedModules.remove(0);
|
final TreeNode current = resolvedModules.remove(0);
|
||||||
// LOGGER.info("\tProcessing node for module \"{}\"...",
|
|
||||||
// ModuleUtil.getModuleName(current.getModule()));
|
|
||||||
LOGGER.info("\tProcessing node for module \"{}\"...",
|
LOGGER.info("\tProcessing node for module \"{}\"...",
|
||||||
current.getModuleInfo().getModuleName());
|
current.getModuleInfo().getModuleName());
|
||||||
|
|
||||||
|
|
@ -110,9 +110,8 @@ final class DependencyTreeManager {
|
||||||
|
|
||||||
if (orderedModules.size() == dependencyTree.size()) {
|
if (orderedModules.size() == dependencyTree.size()) {
|
||||||
LOGGER.info("Dependency graph proceessed successfully. "
|
LOGGER.info("Dependency graph proceessed successfully. "
|
||||||
+ "Modules in order:");
|
+ "Modules in order:");
|
||||||
for (final TreeNode node : orderedModules) {
|
for (final TreeNode node : orderedModules) {
|
||||||
//LOGGER.info("\t{}", ModuleUtil.getModuleName(node.getModule()));
|
|
||||||
LOGGER.info("\t{}", node.getModuleInfo().getModuleName());
|
LOGGER.info("\t{}", node.getModuleInfo().getModuleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -120,7 +119,7 @@ final class DependencyTreeManager {
|
||||||
} else {
|
} else {
|
||||||
LOGGER.fatal("The dependency graph has a least one cycle.");
|
LOGGER.fatal("The dependency graph has a least one cycle.");
|
||||||
throw new DependencyException(
|
throw new DependencyException(
|
||||||
"The dependency graph has a least one cycle.");
|
"The dependency graph has a least one cycle.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -128,118 +127,140 @@ final class DependencyTreeManager {
|
||||||
final Map<String, TreeNode> nodes) {
|
final Map<String, TreeNode> nodes) {
|
||||||
final TreeNode node = new TreeNode(module);
|
final TreeNode node = new TreeNode(module);
|
||||||
|
|
||||||
// LOGGER.info("Creating node for module \"{}\"...",
|
|
||||||
// ModuleUtil.getModuleName(module));
|
|
||||||
LOGGER.info("Creating node for module \"{}\"...",
|
LOGGER.info("Creating node for module \"{}\"...",
|
||||||
node.getModuleInfo().getModuleName());
|
node.getModuleInfo().getModuleName());
|
||||||
// nodes.put(ModuleUtil.getModuleName(module), node);
|
|
||||||
nodes.put(node.getModuleInfo().getModuleName(), node);
|
nodes.put(node.getModuleInfo().getModuleName(), node);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addDependencyRelations(final CcmModule module,
|
private void addDependencyRelations(final CcmModule module,
|
||||||
final Map<String, TreeNode> nodes)
|
final Map<String, TreeNode> nodes)
|
||||||
throws DependencyException {
|
throws DependencyException {
|
||||||
final ModuleInfo moduleInfo = new ModuleInfo();
|
final ModuleInfo moduleInfo = new ModuleInfo();
|
||||||
moduleInfo.load(module);
|
moduleInfo.load(module);
|
||||||
|
|
||||||
// LOGGER.info("Adding dependency relations for module \"{}\"...",
|
|
||||||
// ModuleUtil.getModuleName(module));
|
|
||||||
LOGGER.info("Adding dependency relations for module \"{}\"...",
|
LOGGER.info("Adding dependency relations for module \"{}\"...",
|
||||||
moduleInfo.getModuleName());
|
moduleInfo.getModuleName());
|
||||||
|
|
||||||
//final String moduleName = ModuleUtil.getModuleName(module)
|
|
||||||
final String moduleName = moduleInfo.getModuleName();
|
final String moduleName = moduleInfo.getModuleName();
|
||||||
|
|
||||||
if (!nodes.containsKey(moduleName)) {
|
if (!nodes.containsKey(moduleName)) {
|
||||||
// LOGGER.fatal("Modules nodes map does contain an entry for \"{}\". "
|
|
||||||
// + "That should not happen.",
|
|
||||||
// ModuleUtil.getModuleName(module));
|
|
||||||
LOGGER.fatal("Modules nodes map does contain an entry for \"{}\". "
|
LOGGER.fatal("Modules nodes map does contain an entry for \"{}\". "
|
||||||
+ "That should not happen.",
|
+ "That should not happen.",
|
||||||
moduleInfo.getModuleName());
|
moduleInfo.getModuleName());
|
||||||
throw new IllegalArgumentException(String.format(
|
throw new IllegalArgumentException(String.format(
|
||||||
"The nodes map does not contain a node for module \"%s\". "
|
"The nodes map does not contain a node for module \"%s\". "
|
||||||
+ "That should not happen.",
|
+ "That should not happen.",
|
||||||
moduleName));
|
moduleName));
|
||||||
}
|
}
|
||||||
|
|
||||||
final TreeNode node = nodes.get(moduleName);
|
final TreeNode node = nodes.get(moduleName);
|
||||||
// LOGGER.info("Processing required modules for module \"{}\"...",
|
|
||||||
// ModuleUtil.getModuleName(module));
|
|
||||||
LOGGER.info("Processing required modules for module \"{}\"...",
|
LOGGER.info("Processing required modules for module \"{}\"...",
|
||||||
node.getModuleInfo().getModuleName());
|
node.getModuleInfo().getModuleName());
|
||||||
// for (final RequiredModule requiredModule : ModuleUtil
|
|
||||||
// .getRequiredModules(
|
|
||||||
// module)) {
|
|
||||||
for (final RequiredModule requiredModule : node.getModuleInfo().
|
for (final RequiredModule requiredModule : node.getModuleInfo().
|
||||||
getRequiredModules()) {
|
getRequiredModules()) {
|
||||||
|
|
||||||
final ModuleInfo requiredModuleInfo = new ModuleInfo();
|
|
||||||
requiredModuleInfo.load(requiredModule.module());
|
|
||||||
|
|
||||||
|
// final ModuleInfo requiredModuleInfo = new ModuleInfo();
|
||||||
|
// requiredModuleInfo.load(requiredModule.module());
|
||||||
|
//
|
||||||
// LOGGER.info("\tModule \"{}\" requires module \"{}\".",
|
// LOGGER.info("\tModule \"{}\" requires module \"{}\".",
|
||||||
// ModuleUtil.getModuleName(module),
|
// node.getModuleInfo().getModuleName(),
|
||||||
// ModuleUtil.getModuleName(requiredModule.module()));
|
// requiredModuleInfo.getModuleName());
|
||||||
LOGGER.info("\tModule \"{}\" requires module \"{}\".",
|
//
|
||||||
node.getModuleInfo().getModuleName(),
|
// if (!nodes.containsKey(requiredModuleInfo.getModuleName())) {
|
||||||
requiredModuleInfo.getModuleName());
|
//
|
||||||
|
// LOGGER.fatal("Required module \"{}\" no found.",
|
||||||
// if (!nodes.containsKey(ModuleUtil.getModuleName(requiredModule
|
// requiredModuleInfo.getModuleName());
|
||||||
// .module()))) {
|
//
|
||||||
if (!nodes.containsKey(requiredModuleInfo.getModuleName())) {
|
// throw new DependencyException(String.format(
|
||||||
|
// "Module \"%s\" depends on module \"%s\" but the dependency "
|
||||||
LOGGER.fatal("Required module \"{}\" no found.",
|
// + "tree does contain an entry for module \"%s\".",
|
||||||
requiredModuleInfo.getModuleName());
|
// moduleInfo.getModuleName(),
|
||||||
|
// requiredModuleInfo.getModuleName(),
|
||||||
throw new DependencyException(String.format(
|
// requiredModuleInfo.getModuleName()));
|
||||||
"Module \"%s\" depends on module \"%s\" but the dependency "
|
// }
|
||||||
+ "tree does contain an entry for module \"%s\".",
|
//
|
||||||
moduleInfo.getModuleName(),
|
// final TreeNode dependencyNode = nodes.get(requiredModuleInfo.
|
||||||
requiredModuleInfo.getModuleName(),
|
// getModuleName());
|
||||||
requiredModuleInfo.getModuleName()));
|
//
|
||||||
}
|
// //Check version
|
||||||
|
// if (!validateVersion(dependencyNode.getModuleInfo().
|
||||||
// final TreeNode dependencyNode = nodes.get(ModuleUtil.getModuleName(
|
// getModuleVersion(),
|
||||||
// requiredModule.module()));
|
// requiredModule.minVersion(),
|
||||||
final TreeNode dependencyNode = nodes.get(requiredModuleInfo.
|
// requiredModule.maxVersion())) {
|
||||||
getModuleName());
|
// throw new DependencyException(String.format(
|
||||||
|
// "The required module is avialable but in the correct "
|
||||||
//Check version
|
// + "version. "
|
||||||
// if (!validateVersion(ModuleUtil.getVersion(dependencyNode
|
// + "Available version: \"%s\"; "
|
||||||
// .getModule()),
|
// + "minimal required version: \"%s\"; "
|
||||||
if (!validateVersion(dependencyNode.getModuleInfo().
|
// + "maximum required version: \"%s\"",
|
||||||
getModuleVersion(),
|
// dependencyNode.getModuleInfo().getModuleVersion(),
|
||||||
requiredModule.minVersion(),
|
// requiredModule.minVersion(),
|
||||||
requiredModule.maxVersion())) {
|
// requiredModule.maxVersion()));
|
||||||
throw new DependencyException(String.format(
|
// }
|
||||||
"The required module is avialable but in the correct "
|
//
|
||||||
+ "version. "
|
// node.addDependsOn(dependencyNode);
|
||||||
+ "Available version: \"%s\"; "
|
// dependencyNode.addDependentModule(node);
|
||||||
+ "minimal required version: \"%s\"; "
|
addDependencyRelation(nodes, node, requiredModule);
|
||||||
+ "maximum required version: \"%s\"",
|
|
||||||
dependencyNode.getModuleInfo().getModuleVersion(),
|
|
||||||
requiredModule.minVersion(),
|
|
||||||
requiredModule.maxVersion()));
|
|
||||||
}
|
|
||||||
|
|
||||||
node.addDependsOn(dependencyNode);
|
|
||||||
dependencyNode.addDependentModule(node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addDependencyRelation(final Map<String, TreeNode> nodes,
|
||||||
|
final TreeNode node,
|
||||||
|
final RequiredModule requiredModule)
|
||||||
|
throws DependencyException {
|
||||||
|
final ModuleInfo requiredInfo = new ModuleInfo();
|
||||||
|
requiredInfo.load(requiredModule.module());
|
||||||
|
|
||||||
|
LOGGER.info("\tModule \"{}\" requires module \"{}\".",
|
||||||
|
node.getModuleInfo().getModuleName(),
|
||||||
|
requiredInfo.getModuleName());
|
||||||
|
|
||||||
|
if (!nodes.containsKey(requiredInfo.getModuleName())) {
|
||||||
|
LOGGER.fatal("Required module \"{}\" no found.",
|
||||||
|
requiredInfo.getModuleName());
|
||||||
|
throw new DependencyException(String.format(
|
||||||
|
"Module \"%s\" depends on module \"%s\" but the dependency "
|
||||||
|
+ "tree does contain an entry for module \"%s\".",
|
||||||
|
node.getModuleInfo().getModuleName(),
|
||||||
|
requiredInfo.getModuleName(),
|
||||||
|
requiredInfo.getModuleName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
final TreeNode dependencyNode = nodes.get(requiredInfo.
|
||||||
|
getModuleName());
|
||||||
|
if (!validateVersion(dependencyNode.getModuleInfo().
|
||||||
|
getModuleVersion(),
|
||||||
|
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\"",
|
||||||
|
dependencyNode.getModuleInfo().getModuleVersion(),
|
||||||
|
requiredModule.minVersion(),
|
||||||
|
requiredModule.maxVersion()));
|
||||||
|
}
|
||||||
|
|
||||||
|
node.addDependsOn(dependencyNode);
|
||||||
|
dependencyNode.addDependentModule(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method for checking if an dependency is available in the required
|
* Helper method for checking if an dependency is available in the required
|
||||||
* version.
|
* version.
|
||||||
*
|
*
|
||||||
* @param availableVersion The available version. Can't be {@code null} or
|
* @param availableVersion The available version. Can't be {@code null} or
|
||||||
* empty.
|
* empty.
|
||||||
* @param minRequiredVersion The minimal version required. Can be
|
* @param minRequiredVersion The minimal version required. Can be
|
||||||
* {@code null} or empty.
|
* {@code null} or empty.
|
||||||
* @param maxRequiredVersion The maximum version required. Can be
|
* @param maxRequiredVersion The maximum version required. Can be
|
||||||
* {@code null} or empty.
|
* {@code null} or empty.
|
||||||
*
|
*
|
||||||
* @return {@code true} if the available version is in the required range,
|
* @return {@code true} if the available version is in the required range,
|
||||||
* {@code false} if not.
|
* {@code false} if not.
|
||||||
*/
|
*/
|
||||||
//The names are fine. Shorter names would be less readable. Also removing
|
//The names are fine. Shorter names would be less readable. Also removing
|
||||||
//the parentheses in the ifs would make the conditions less readable.
|
//the parentheses in the ifs would make the conditions less readable.
|
||||||
|
|
@ -254,36 +275,36 @@ final class DependencyTreeManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
|
if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
|
||||||
&& (maxRequiredVersion == null || maxRequiredVersion.
|
&& (maxRequiredVersion == null || maxRequiredVersion.
|
||||||
isEmpty())) {
|
isEmpty())) {
|
||||||
return true;
|
return true;
|
||||||
} else if ((minRequiredVersion != null && !minRequiredVersion.isEmpty())
|
} else if ((minRequiredVersion != null && !minRequiredVersion.isEmpty())
|
||||||
&& (maxRequiredVersion == null || maxRequiredVersion
|
&& (maxRequiredVersion == null || maxRequiredVersion
|
||||||
.isEmpty())) {
|
.isEmpty())) {
|
||||||
final ComparableVersion minVersion = new ComparableVersion(
|
final ComparableVersion minVersion = new ComparableVersion(
|
||||||
minRequiredVersion);
|
minRequiredVersion);
|
||||||
final ComparableVersion version = new ComparableVersion(
|
final ComparableVersion version = new ComparableVersion(
|
||||||
availableVersion);
|
availableVersion);
|
||||||
|
|
||||||
return minVersion.compareTo(version) <= 0;
|
return minVersion.compareTo(version) <= 0;
|
||||||
} else if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
|
} else if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
|
||||||
&& (maxRequiredVersion != null && !maxRequiredVersion
|
&& (maxRequiredVersion != null && !maxRequiredVersion
|
||||||
.isEmpty())) {
|
.isEmpty())) {
|
||||||
final ComparableVersion maxVersion = new ComparableVersion(
|
final ComparableVersion maxVersion = new ComparableVersion(
|
||||||
maxRequiredVersion);
|
maxRequiredVersion);
|
||||||
final ComparableVersion version = new ComparableVersion(
|
final ComparableVersion version = new ComparableVersion(
|
||||||
availableVersion);
|
availableVersion);
|
||||||
|
|
||||||
return version.compareTo(maxVersion) <= 0;
|
return version.compareTo(maxVersion) <= 0;
|
||||||
} else {
|
} else {
|
||||||
final ComparableVersion minVersion = new ComparableVersion(
|
final ComparableVersion minVersion = new ComparableVersion(
|
||||||
minRequiredVersion);
|
minRequiredVersion);
|
||||||
final ComparableVersion maxVersion = new ComparableVersion(
|
final ComparableVersion maxVersion = new ComparableVersion(
|
||||||
(maxRequiredVersion));
|
(maxRequiredVersion));
|
||||||
final ComparableVersion version = new ComparableVersion(
|
final ComparableVersion version = new ComparableVersion(
|
||||||
availableVersion);
|
availableVersion);
|
||||||
return minVersion.compareTo(version) <= 0 && version.compareTo(
|
return minVersion.compareTo(version) <= 0 && version.compareTo(
|
||||||
maxVersion) <= 0;
|
maxVersion) <= 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ public class InstalledModule implements Serializable {
|
||||||
return moduleClassName;
|
return moduleClassName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setModuleClassName(String moduleClassName) {
|
public void setModuleClassName(final String moduleClassName) {
|
||||||
this.moduleClassName = moduleClassName;
|
this.moduleClassName = moduleClassName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +59,7 @@ public class InstalledModule implements Serializable {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(ModuleStatus status) {
|
public void setStatus(final ModuleStatus status) {
|
||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,13 +21,13 @@ package org.libreccm.core.modules;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLDataException;
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
|
@ -43,11 +43,11 @@ public class ModuleInfo {
|
||||||
|
|
||||||
private static final Logger LOGGER = LogManager.getLogger(ModuleInfo.class);
|
private static final Logger LOGGER = LogManager.getLogger(ModuleInfo.class);
|
||||||
|
|
||||||
private String moduleName;
|
private transient String moduleName;
|
||||||
private String moduleDataPackage;
|
private transient String moduleDataPackage;
|
||||||
private Class<?>[] moduleEntities;
|
private transient Class<?>[] moduleEntities;
|
||||||
private String moduleVersion;
|
private transient String moduleVersion;
|
||||||
private RequiredModule[] requiredModules;
|
private transient RequiredModule[] requiredModules;
|
||||||
|
|
||||||
public ModuleInfo() {
|
public ModuleInfo() {
|
||||||
//Nothing
|
//Nothing
|
||||||
|
|
@ -66,8 +66,9 @@ public class ModuleInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDbScriptsLocation(final Connection connection)
|
public String getDbScriptsLocation(final Connection connection)
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final StringBuffer buffer = new StringBuffer("classpath:/db/migrations/");
|
final StringBuffer buffer
|
||||||
|
= new StringBuffer("classpath:/db/migrations/");
|
||||||
buffer.append(moduleDataPackage);
|
buffer.append(moduleDataPackage);
|
||||||
switch (connection.getMetaData().getDatabaseProductName()) {
|
switch (connection.getMetaData().getDatabaseProductName()) {
|
||||||
case "H2": {
|
case "H2": {
|
||||||
|
|
@ -82,9 +83,9 @@ public class ModuleInfo {
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IntegrationException(String.format(
|
throw new IntegrationException(String.format(
|
||||||
"Integration failed. Database \"%s\" is not supported yet.",
|
"Integration failed. Database \"%s\" is not supported yet.",
|
||||||
connection.getMetaData().
|
connection.getMetaData().
|
||||||
getDatabaseProductName()));
|
getDatabaseProductName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
|
|
@ -109,8 +110,93 @@ public class ModuleInfo {
|
||||||
public void load(final Class<? extends CcmModule> moduleClass) {
|
public void load(final Class<? extends CcmModule> moduleClass) {
|
||||||
LOGGER.info("Reading module info for {}...", moduleClass.getName());
|
LOGGER.info("Reading module info for {}...", moduleClass.getName());
|
||||||
final Module annotation = moduleClass.getAnnotation(Module.class);
|
final Module annotation = moduleClass.getAnnotation(Module.class);
|
||||||
final Properties properties = new Properties();
|
|
||||||
|
|
||||||
|
final Properties properties = loadModuleInfoFile(moduleClass);
|
||||||
|
// final Properties properties = new Properties();
|
||||||
|
//
|
||||||
|
// final String path = String.format("/module-info/%s.properties",
|
||||||
|
// moduleClass.getName());
|
||||||
|
// LOGGER.info("Trying to retrieve module info for module {} from {}...",
|
||||||
|
// moduleClass.getName(),
|
||||||
|
// path);
|
||||||
|
// final InputStream stream = moduleClass.getResourceAsStream(path);
|
||||||
|
// if (stream == null) {
|
||||||
|
// LOGGER.warn("No module info for {} found at {}",
|
||||||
|
// moduleClass.getName(),
|
||||||
|
// path);
|
||||||
|
// } else {
|
||||||
|
// try {
|
||||||
|
// properties.load(stream);
|
||||||
|
// } catch (IOException ex) {
|
||||||
|
// LOGGER.error("Failed to read module info for {} at {}.",
|
||||||
|
// moduleClass.getName(),
|
||||||
|
// path);
|
||||||
|
// LOGGER.error("Cause: ", ex);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
LOGGER.info("Reading module name...");
|
||||||
|
// if (annotation.name() != null && !annotation.name().isEmpty()) {
|
||||||
|
// moduleName = annotation.name();
|
||||||
|
// } else if (properties.getProperty(ARTIFACT_ID) != null
|
||||||
|
// && !properties.getProperty(ARTIFACT_ID).isEmpty()) {
|
||||||
|
// moduleName = properties.getProperty(ARTIFACT_ID);
|
||||||
|
// } else {
|
||||||
|
// LOGGER.warn(
|
||||||
|
// "The module was not specificied by the module annotation "
|
||||||
|
// + "or by the module info file. Creating name from "
|
||||||
|
// + "simple name of the module class.");
|
||||||
|
// moduleName = moduleClass.getSimpleName().toLowerCase();
|
||||||
|
// }
|
||||||
|
LOGGER.info("Reading module name...");
|
||||||
|
moduleName = readModuleName(moduleClass, annotation, properties);
|
||||||
|
LOGGER.info("Module name is \"{}\".", moduleName);
|
||||||
|
|
||||||
|
LOGGER.info("Reading module package name...");
|
||||||
|
// if (annotation.packageName() != null
|
||||||
|
// && !annotation.packageName().isEmpty()) {
|
||||||
|
// moduleDataPackage = annotation.packageName();
|
||||||
|
// } else if (properties.getProperty(GROUP_ID) != null
|
||||||
|
// && !properties.getProperty(GROUP_ID).isEmpty()) {
|
||||||
|
// moduleDataPackage = String.format("%s/%s",
|
||||||
|
// properties.getProperty(GROUP_ID),
|
||||||
|
// properties.
|
||||||
|
// getProperty(ARTIFACT_ID).replace(
|
||||||
|
// "-", "_"));
|
||||||
|
// } else {
|
||||||
|
// LOGGER.warn("The module data package was specified by the module "
|
||||||
|
// + "annotation nore was an group id found in the module info"
|
||||||
|
// + "file. Creating data package name from the name of the "
|
||||||
|
// + "module class.");
|
||||||
|
// moduleDataPackage = moduleClass.getName().toLowerCase();
|
||||||
|
// }
|
||||||
|
moduleDataPackage = readModulePackageName(moduleClass,
|
||||||
|
annotation,
|
||||||
|
properties);
|
||||||
|
LOGGER.info("Module data package is \"{}\".", moduleDataPackage);
|
||||||
|
|
||||||
|
LOGGER.info("Reading module version...");
|
||||||
|
// if (annotation.version() != null && !annotation.version().isEmpty()) {
|
||||||
|
// moduleVersion = annotation.version();
|
||||||
|
// } else if (properties.getProperty(VERSION) != null
|
||||||
|
// && !properties.getProperty(VERSION).isEmpty()) {
|
||||||
|
// moduleVersion = properties.getProperty(VERSION);
|
||||||
|
// } else {
|
||||||
|
// LOGGER.warn("Module version is not specified by the module "
|
||||||
|
// + "annotation or in the module info file. Module version is "
|
||||||
|
// + "undefinied. This can lead to all sorts of strange errors!");
|
||||||
|
// }
|
||||||
|
moduleVersion = readModuleVersion(annotation, properties);
|
||||||
|
LOGGER.info("Module version is \"{}.\"", moduleVersion);
|
||||||
|
|
||||||
|
requiredModules = annotation.requiredModules();
|
||||||
|
moduleEntities = annotation.entities();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Properties loadModuleInfoFile(
|
||||||
|
final Class<? extends CcmModule> moduleClass) {
|
||||||
|
|
||||||
|
final Properties moduleInfo = new Properties();
|
||||||
final String path = String.format("/module-info/%s.properties",
|
final String path = String.format("/module-info/%s.properties",
|
||||||
moduleClass.getName());
|
moduleClass.getName());
|
||||||
LOGGER.info("Trying to retrieve module info for module {} from {}...",
|
LOGGER.info("Trying to retrieve module info for module {} from {}...",
|
||||||
|
|
@ -123,62 +209,95 @@ public class ModuleInfo {
|
||||||
path);
|
path);
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
properties.load(stream);
|
moduleInfo.load(stream);
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
LOGGER.error("Failed to read module info for {} at {}.",
|
LOGGER.error("Failed to read module info for {} at {}.",
|
||||||
moduleClass.getName(),
|
moduleClass.getName(),
|
||||||
path);
|
path);
|
||||||
|
LOGGER.error("Cause: ", ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOGGER.info("Reading module name...");
|
return moduleInfo;
|
||||||
if (annotation.name() != null && !annotation.name().isEmpty()) {
|
}
|
||||||
moduleName = annotation.name();
|
|
||||||
} else if (properties.getProperty(ARTIFACT_ID) != null
|
private String readModuleName(final Class<? extends CcmModule> moduleClass,
|
||||||
&& !properties.getProperty(ARTIFACT_ID).isEmpty()) {
|
final Module annotation,
|
||||||
moduleName = properties.getProperty(ARTIFACT_ID);
|
final Properties moduleInfo) {
|
||||||
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
|
final boolean annotationHasModuleName = annotation.name() != null
|
||||||
|
&& !annotation.name().isEmpty();
|
||||||
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
|
final boolean moduleInfoHasModuleName = moduleInfo.getProperty(ARTIFACT_ID)
|
||||||
|
!= null && !moduleInfo
|
||||||
|
.getProperty(ARTIFACT_ID).isEmpty();
|
||||||
|
|
||||||
|
if (annotationHasModuleName) {
|
||||||
|
return annotation.name();
|
||||||
|
} else if (moduleInfoHasModuleName) {
|
||||||
|
return moduleInfo.getProperty(ARTIFACT_ID);
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn(
|
LOGGER.warn(
|
||||||
"The module was not specificied by the module annotation "
|
"The module was not specificied by the module annotation "
|
||||||
+ "or by the module info file. Creating name from "
|
+ "or by the module info file. Creating name from "
|
||||||
+ "simple name of the module class.");
|
+ "simple name of the module class.");
|
||||||
moduleName = moduleClass.getSimpleName().toLowerCase();
|
return moduleClass.getSimpleName().toLowerCase();
|
||||||
}
|
}
|
||||||
LOGGER.info("Module name is \"{}\".", moduleName);
|
}
|
||||||
|
|
||||||
LOGGER.info("Reading module package name...");
|
private String readModulePackageName(
|
||||||
if (annotation.packageName() != null
|
final Class<? extends CcmModule> moduleClass,
|
||||||
&& !annotation.packageName().isEmpty()) {
|
final Module annotation,
|
||||||
moduleDataPackage = annotation.packageName();
|
final Properties moduleInfo) {
|
||||||
} else if (properties.getProperty(GROUP_ID) != null
|
|
||||||
&& !properties.getProperty(GROUP_ID).isEmpty()) {
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
moduleDataPackage = String.format("%s/%s",
|
final boolean annotationHasPackageName = annotation.packageName() != null
|
||||||
properties.getProperty(GROUP_ID),
|
&& !annotation.packageName()
|
||||||
properties.
|
.isEmpty();
|
||||||
getProperty(ARTIFACT_ID).replace(
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
"-", "_"));
|
final boolean moduleInfoHasPackageName = moduleInfo.getProperty(GROUP_ID)
|
||||||
|
!= null
|
||||||
|
&& !moduleInfo.getProperty(
|
||||||
|
GROUP_ID).isEmpty();
|
||||||
|
if (annotationHasPackageName) {
|
||||||
|
return annotation.packageName();
|
||||||
|
} else if (moduleInfoHasPackageName) {
|
||||||
|
return String.format("%s/%s",
|
||||||
|
moduleInfo.getProperty(GROUP_ID),
|
||||||
|
moduleInfo.
|
||||||
|
getProperty(ARTIFACT_ID).replace(
|
||||||
|
"-", "_"));
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("The module data package was specified by the module "
|
LOGGER.warn("The module data package was specified by the module "
|
||||||
+ "annotation nore was an group id found in the module info"
|
+ "annotation nore was an group id found in the module info"
|
||||||
+ "file. Creating data package name from the name of the "
|
+ "file. Creating data package name from the name of the "
|
||||||
+ "module class.");
|
+ "module class.");
|
||||||
moduleDataPackage = moduleClass.getName().toLowerCase();
|
return moduleClass.getName().toLowerCase();
|
||||||
}
|
}
|
||||||
LOGGER.info("Module data package is \"{}\".", moduleDataPackage);
|
}
|
||||||
|
|
||||||
if (annotation.version() != null && !annotation.version().isEmpty()) {
|
private String readModuleVersion(
|
||||||
moduleVersion = annotation.version();
|
final Module annotation,
|
||||||
} else if (properties.getProperty(VERSION) != null
|
final Properties moduleInfo) {
|
||||||
&& !properties.getProperty(VERSION).isEmpty()) {
|
|
||||||
moduleVersion = properties.getProperty(VERSION);
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
|
final boolean annotationHasVersion = annotation.version() != null
|
||||||
|
&& !annotation.version().isEmpty();
|
||||||
|
@SuppressWarnings("PMD.LongVariable")
|
||||||
|
final boolean moduleInfoHasVersion = moduleInfo.getProperty(VERSION) != null
|
||||||
|
&& !moduleInfo.getProperty(VERSION)
|
||||||
|
.isEmpty();
|
||||||
|
|
||||||
|
if (annotationHasVersion) {
|
||||||
|
return annotation.version();
|
||||||
|
} else if (moduleInfoHasVersion) {
|
||||||
|
return moduleInfo.getProperty(VERSION);
|
||||||
} else {
|
} else {
|
||||||
LOGGER.warn("Module version is not specified by the module "
|
LOGGER.warn("Module version is not specified by the module "
|
||||||
+ "annotation or in the module info file. Module version is "
|
+ "annotation or in the module info file. Module version is "
|
||||||
+ "undefinied. This can lead to all sorts of strange errors!");
|
+ "undefinied. This can lead to all sorts of strange errors!");
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
LOGGER.info("Module version is \"{}.\"", moduleVersion);
|
|
||||||
|
|
||||||
requiredModules = annotation.requiredModules();
|
|
||||||
moduleEntities = annotation.entities();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,6 @@ import org.libreccm.tests.categories.IntegrationTest;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -58,7 +56,7 @@ import java.util.ServiceLoader;
|
||||||
@RunWith(Arquillian.class)
|
@RunWith(Arquillian.class)
|
||||||
public class DependencyTreeManagerCycleTest {
|
public class DependencyTreeManagerCycleTest {
|
||||||
|
|
||||||
private transient ServiceLoader<CcmModule> modules;
|
private transient Iterable<CcmModule> modules;
|
||||||
|
|
||||||
public DependencyTreeManagerCycleTest() {
|
public DependencyTreeManagerCycleTest() {
|
||||||
}
|
}
|
||||||
|
|
@ -73,7 +71,12 @@ public class DependencyTreeManagerCycleTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
modules = ServiceLoader.load(CcmModule.class);
|
final List<CcmModule> moduleList = new ArrayList<>();
|
||||||
|
moduleList.add(new TestModuleRoot());
|
||||||
|
moduleList.add(new TestModuleA());
|
||||||
|
moduleList.add(new TestModuleB());
|
||||||
|
moduleList.add(new TestModuleC());
|
||||||
|
modules = moduleList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|
@ -96,18 +99,41 @@ public class DependencyTreeManagerCycleTest {
|
||||||
|
|
||||||
return ShrinkWrap
|
return ShrinkWrap
|
||||||
.create(WebArchive.class,
|
.create(WebArchive.class,
|
||||||
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManager.war")
|
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManagerCycleTest.war")
|
||||||
.addPackage(DependencyTreeManager.class.getPackage())
|
|
||||||
.addPackage(Module.class
|
|
||||||
.getPackage())
|
|
||||||
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||||
.getPackage())
|
.getPackage())
|
||||||
.addPackage(org.libreccm.core.modules.dependencytree.test.cycle.TestModuleRoot.class
|
.addClass(DependencyTreeManager.class)
|
||||||
.getPackage())
|
.addClass(DependencyException.class)
|
||||||
.addPackage(CcmModule.class.getPackage())
|
.addClass(IntegrationException.class)
|
||||||
|
.addClass(TreeNode.class)
|
||||||
|
.addClass(CcmModule.class)
|
||||||
|
.addClass(ModuleInfo.class)
|
||||||
|
.addClass(ModuleStatus.class)
|
||||||
|
.addClass(Module.class)
|
||||||
|
.addClass(RequiredModule.class)
|
||||||
|
.addClass(InitEvent.class)
|
||||||
|
.addClass(InstallEvent.class)
|
||||||
|
.addClass(ShutdownEvent.class)
|
||||||
|
.addClass(UnInstallEvent.class)
|
||||||
|
.addClass(TestModuleRoot.class)
|
||||||
|
.addClass(TestModuleA.class)
|
||||||
|
.addClass(TestModuleB.class)
|
||||||
|
.addClass(TestModuleC.class)
|
||||||
.addAsLibraries(libs)
|
.addAsLibraries(libs)
|
||||||
.addAsWebInfResource("test-web.xml", "web.xml")
|
.addAsWebInfResource("test-web.xml", "web.xml")
|
||||||
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
|
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-cycle-test/module-root.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.cycle.TestModuleRoot.properties")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-cycle-test/module-a.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.cycle.TestModuleA.properties")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-cycle-test/module-b.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.cycle.TestModuleB.properties")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-cycle-test/module-c.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.cycle.TestModuleC.properties");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,6 @@ import org.libreccm.tests.categories.IntegrationTest;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ServiceLoader;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -58,7 +56,7 @@ import java.util.ServiceLoader;
|
||||||
@RunWith(Arquillian.class)
|
@RunWith(Arquillian.class)
|
||||||
public class DependencyTreeManagerTest {
|
public class DependencyTreeManagerTest {
|
||||||
|
|
||||||
private transient ServiceLoader<CcmModule> modules;
|
private transient Iterable<CcmModule> modules;
|
||||||
|
|
||||||
public DependencyTreeManagerTest() {
|
public DependencyTreeManagerTest() {
|
||||||
}
|
}
|
||||||
|
|
@ -73,7 +71,13 @@ public class DependencyTreeManagerTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
modules = ServiceLoader.load(CcmModule.class);
|
final List<CcmModule> moduleList = new ArrayList<>();
|
||||||
|
moduleList.add(new TestModuleRoot());
|
||||||
|
moduleList.add(new TestModuleA());
|
||||||
|
moduleList.add(new TestModuleB());
|
||||||
|
moduleList.add(new TestModuleC());
|
||||||
|
|
||||||
|
modules = moduleList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
|
@ -96,18 +100,41 @@ public class DependencyTreeManagerTest {
|
||||||
|
|
||||||
return ShrinkWrap
|
return ShrinkWrap
|
||||||
.create(WebArchive.class,
|
.create(WebArchive.class,
|
||||||
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManager.war")
|
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManagerTest.war")
|
||||||
.addPackage(DependencyTreeManager.class.getPackage())
|
|
||||||
.addPackage(Module.class
|
|
||||||
.getPackage())
|
|
||||||
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||||
.getPackage())
|
.getPackage())
|
||||||
.addPackage(org.libreccm.core.modules.dependencytree.test.valid.TestModuleRoot.class
|
.addClass(DependencyTreeManager.class)
|
||||||
.getPackage())
|
.addClass(DependencyException.class)
|
||||||
.addPackage(CcmModule.class.getPackage())
|
.addClass(IntegrationException.class)
|
||||||
|
.addClass(TreeNode.class)
|
||||||
|
.addClass(CcmModule.class)
|
||||||
|
.addClass(ModuleInfo.class)
|
||||||
|
.addClass(ModuleStatus.class)
|
||||||
|
.addClass(Module.class)
|
||||||
|
.addClass(RequiredModule.class)
|
||||||
|
.addClass(InitEvent.class)
|
||||||
|
.addClass(InstallEvent.class)
|
||||||
|
.addClass(ShutdownEvent.class)
|
||||||
|
.addClass(UnInstallEvent.class)
|
||||||
|
.addClass(TestModuleRoot.class)
|
||||||
|
.addClass(TestModuleA.class)
|
||||||
|
.addClass(TestModuleB.class)
|
||||||
|
.addClass(TestModuleC.class)
|
||||||
.addAsLibraries(libs)
|
.addAsLibraries(libs)
|
||||||
.addAsWebInfResource("test-web.xml", "web.xml")
|
.addAsWebInfResource("test-web.xml", "web.xml")
|
||||||
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
|
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-test/module-root.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.valid.TestModuleRoot.properties")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-test/module-a.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.valid.TestModuleA.properties")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-test/module-b.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.valid.TestModuleB.properties")
|
||||||
|
.addAsResource(
|
||||||
|
"module-info/dependency-tree-manager-test/module-c.properties",
|
||||||
|
"module-info/org.libreccm.core.modules.dependencytree.test.valid.TestModuleC.properties");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -138,10 +165,10 @@ public class DependencyTreeManagerTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
assertThat(modulesInOrder,
|
assertThat(modulesInOrder,
|
||||||
contains("org.libreccm.core.ccm-testmodule-root",
|
contains("test-module-root",
|
||||||
"org.libreccm.core.ccm-testmodule-a",
|
"test-module-a",
|
||||||
"org.libreccm.core.ccm-testmodule-b",
|
"test-module-b",
|
||||||
"org.libreccm.core.ccm-testmodule-c"));
|
"test-module-c"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue