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.
|
||||
*/
|
||||
public DependencyException() {
|
||||
super();
|
||||
//Nothin more
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -45,10 +45,10 @@ import org.apache.maven.artifact.versioning.ComparableVersion;
|
|||
final class DependencyTreeManager {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
DependencyTreeManager.class);
|
||||
DependencyTreeManager.class);
|
||||
|
||||
public List<TreeNode> generateTree(final Iterable<CcmModule> modules)
|
||||
throws DependencyException {
|
||||
throws DependencyException {
|
||||
|
||||
LOGGER.info("Starting to generate dependency tree...");
|
||||
|
||||
|
|
@ -57,6 +57,11 @@ final class DependencyTreeManager {
|
|||
for (final CcmModule module : modules) {
|
||||
createTreeNode(module, nodes);
|
||||
}
|
||||
|
||||
for (final CcmModule module : modules) {
|
||||
addDependencyRelations(module, nodes);
|
||||
}
|
||||
|
||||
final List<TreeNode> nodeList = new ArrayList<>();
|
||||
for (final Map.Entry<String, TreeNode> entry : nodes.entrySet()) {
|
||||
nodeList.add(entry.getValue());
|
||||
|
|
@ -68,22 +73,19 @@ final class DependencyTreeManager {
|
|||
}
|
||||
|
||||
public List<TreeNode> orderModules(final List<TreeNode> dependencyTree)
|
||||
throws DependencyException {
|
||||
throws DependencyException {
|
||||
LOGGER.info("Creating an ordered list from the dependency tree...");
|
||||
|
||||
final List<TreeNode> orderedModules = new ArrayList<>();
|
||||
final List<TreeNode> resolvedModules = new ArrayList<>();
|
||||
|
||||
LOGGER.info("Looking for modules which do not depend on any other "
|
||||
+ "modules...");
|
||||
+ "modules...");
|
||||
for (final TreeNode node : dependencyTree) {
|
||||
if (node.getDependsOn().isEmpty()) {
|
||||
// LOGGER.info(
|
||||
// "\tModule \"{}\" does not depend on any other module",
|
||||
// ModuleUtil.getModuleName(node.getModule()));
|
||||
LOGGER.info(
|
||||
"\tModule \"{}\" does not depend on any other module",
|
||||
node.getModuleInfo().getModuleName());
|
||||
"\tModule \"{}\" does not depend on any other module",
|
||||
node.getModuleInfo().getModuleName());
|
||||
resolvedModules.add(node);
|
||||
}
|
||||
}
|
||||
|
|
@ -92,8 +94,6 @@ final class DependencyTreeManager {
|
|||
while (!resolvedModules.isEmpty()) {
|
||||
|
||||
final TreeNode current = resolvedModules.remove(0);
|
||||
// LOGGER.info("\tProcessing node for module \"{}\"...",
|
||||
// ModuleUtil.getModuleName(current.getModule()));
|
||||
LOGGER.info("\tProcessing node for module \"{}\"...",
|
||||
current.getModuleInfo().getModuleName());
|
||||
|
||||
|
|
@ -110,9 +110,8 @@ final class DependencyTreeManager {
|
|||
|
||||
if (orderedModules.size() == dependencyTree.size()) {
|
||||
LOGGER.info("Dependency graph proceessed successfully. "
|
||||
+ "Modules in order:");
|
||||
+ "Modules in order:");
|
||||
for (final TreeNode node : orderedModules) {
|
||||
//LOGGER.info("\t{}", ModuleUtil.getModuleName(node.getModule()));
|
||||
LOGGER.info("\t{}", node.getModuleInfo().getModuleName());
|
||||
}
|
||||
|
||||
|
|
@ -120,7 +119,7 @@ final class DependencyTreeManager {
|
|||
} else {
|
||||
LOGGER.fatal("The dependency graph has a least one cycle.");
|
||||
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 TreeNode node = new TreeNode(module);
|
||||
|
||||
// LOGGER.info("Creating node for module \"{}\"...",
|
||||
// ModuleUtil.getModuleName(module));
|
||||
LOGGER.info("Creating node for module \"{}\"...",
|
||||
node.getModuleInfo().getModuleName());
|
||||
// nodes.put(ModuleUtil.getModuleName(module), node);
|
||||
nodes.put(node.getModuleInfo().getModuleName(), node);
|
||||
}
|
||||
|
||||
private void addDependencyRelations(final CcmModule module,
|
||||
final Map<String, TreeNode> nodes)
|
||||
throws DependencyException {
|
||||
throws DependencyException {
|
||||
final ModuleInfo moduleInfo = new ModuleInfo();
|
||||
moduleInfo.load(module);
|
||||
|
||||
// LOGGER.info("Adding dependency relations for module \"{}\"...",
|
||||
// ModuleUtil.getModuleName(module));
|
||||
LOGGER.info("Adding dependency relations for module \"{}\"...",
|
||||
moduleInfo.getModuleName());
|
||||
|
||||
//final String moduleName = ModuleUtil.getModuleName(module)
|
||||
final String moduleName = moduleInfo.getModuleName();
|
||||
|
||||
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 \"{}\". "
|
||||
+ "That should not happen.",
|
||||
+ "That should not happen.",
|
||||
moduleInfo.getModuleName());
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"The nodes map does not contain a node for module \"%s\". "
|
||||
+ "That should not happen.",
|
||||
moduleName));
|
||||
"The nodes map does not contain a node for module \"%s\". "
|
||||
+ "That should not happen.",
|
||||
moduleName));
|
||||
}
|
||||
|
||||
final TreeNode node = nodes.get(moduleName);
|
||||
// LOGGER.info("Processing required modules for module \"{}\"...",
|
||||
// ModuleUtil.getModuleName(module));
|
||||
LOGGER.info("Processing required modules for module \"{}\"...",
|
||||
node.getModuleInfo().getModuleName());
|
||||
// for (final RequiredModule requiredModule : ModuleUtil
|
||||
// .getRequiredModules(
|
||||
// module)) {
|
||||
for (final RequiredModule requiredModule : node.getModuleInfo().
|
||||
getRequiredModules()) {
|
||||
|
||||
final ModuleInfo requiredModuleInfo = new ModuleInfo();
|
||||
requiredModuleInfo.load(requiredModule.module());
|
||||
getRequiredModules()) {
|
||||
|
||||
// final ModuleInfo requiredModuleInfo = new ModuleInfo();
|
||||
// requiredModuleInfo.load(requiredModule.module());
|
||||
//
|
||||
// LOGGER.info("\tModule \"{}\" requires module \"{}\".",
|
||||
// ModuleUtil.getModuleName(module),
|
||||
// ModuleUtil.getModuleName(requiredModule.module()));
|
||||
LOGGER.info("\tModule \"{}\" requires module \"{}\".",
|
||||
node.getModuleInfo().getModuleName(),
|
||||
requiredModuleInfo.getModuleName());
|
||||
|
||||
// if (!nodes.containsKey(ModuleUtil.getModuleName(requiredModule
|
||||
// .module()))) {
|
||||
if (!nodes.containsKey(requiredModuleInfo.getModuleName())) {
|
||||
|
||||
LOGGER.fatal("Required module \"{}\" no found.",
|
||||
requiredModuleInfo.getModuleName());
|
||||
|
||||
throw new DependencyException(String.format(
|
||||
"Module \"%s\" depends on module \"%s\" but the dependency "
|
||||
+ "tree does contain an entry for module \"%s\".",
|
||||
moduleInfo.getModuleName(),
|
||||
requiredModuleInfo.getModuleName(),
|
||||
requiredModuleInfo.getModuleName()));
|
||||
}
|
||||
|
||||
// final TreeNode dependencyNode = nodes.get(ModuleUtil.getModuleName(
|
||||
// requiredModule.module()));
|
||||
final TreeNode dependencyNode = nodes.get(requiredModuleInfo.
|
||||
getModuleName());
|
||||
|
||||
//Check version
|
||||
// if (!validateVersion(ModuleUtil.getVersion(dependencyNode
|
||||
// .getModule()),
|
||||
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);
|
||||
// node.getModuleInfo().getModuleName(),
|
||||
// requiredModuleInfo.getModuleName());
|
||||
//
|
||||
// if (!nodes.containsKey(requiredModuleInfo.getModuleName())) {
|
||||
//
|
||||
// LOGGER.fatal("Required module \"{}\" no found.",
|
||||
// requiredModuleInfo.getModuleName());
|
||||
//
|
||||
// throw new DependencyException(String.format(
|
||||
// "Module \"%s\" depends on module \"%s\" but the dependency "
|
||||
// + "tree does contain an entry for module \"%s\".",
|
||||
// moduleInfo.getModuleName(),
|
||||
// requiredModuleInfo.getModuleName(),
|
||||
// requiredModuleInfo.getModuleName()));
|
||||
// }
|
||||
//
|
||||
// final TreeNode dependencyNode = nodes.get(requiredModuleInfo.
|
||||
// getModuleName());
|
||||
//
|
||||
// //Check version
|
||||
// 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);
|
||||
addDependencyRelation(nodes, node, requiredModule);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
* version.
|
||||
*
|
||||
* @param availableVersion The available version. Can't be {@code null} or
|
||||
* empty.
|
||||
* @param availableVersion The available version. Can't be {@code null} or
|
||||
* empty.
|
||||
* @param minRequiredVersion The minimal version required. Can be
|
||||
* {@code null} or empty.
|
||||
* {@code null} or empty.
|
||||
* @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,
|
||||
* {@code false} if not.
|
||||
* {@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.
|
||||
|
|
@ -254,36 +275,36 @@ final class DependencyTreeManager {
|
|||
}
|
||||
|
||||
if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
|
||||
&& (maxRequiredVersion == null || maxRequiredVersion.
|
||||
isEmpty())) {
|
||||
&& (maxRequiredVersion == null || maxRequiredVersion.
|
||||
isEmpty())) {
|
||||
return true;
|
||||
} else if ((minRequiredVersion != null && !minRequiredVersion.isEmpty())
|
||||
&& (maxRequiredVersion == null || maxRequiredVersion
|
||||
.isEmpty())) {
|
||||
&& (maxRequiredVersion == null || maxRequiredVersion
|
||||
.isEmpty())) {
|
||||
final ComparableVersion minVersion = new ComparableVersion(
|
||||
minRequiredVersion);
|
||||
minRequiredVersion);
|
||||
final ComparableVersion version = new ComparableVersion(
|
||||
availableVersion);
|
||||
availableVersion);
|
||||
|
||||
return minVersion.compareTo(version) <= 0;
|
||||
} else if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
|
||||
&& (maxRequiredVersion != null && !maxRequiredVersion
|
||||
.isEmpty())) {
|
||||
&& (maxRequiredVersion != null && !maxRequiredVersion
|
||||
.isEmpty())) {
|
||||
final ComparableVersion maxVersion = new ComparableVersion(
|
||||
maxRequiredVersion);
|
||||
maxRequiredVersion);
|
||||
final ComparableVersion version = new ComparableVersion(
|
||||
availableVersion);
|
||||
availableVersion);
|
||||
|
||||
return version.compareTo(maxVersion) <= 0;
|
||||
} else {
|
||||
final ComparableVersion minVersion = new ComparableVersion(
|
||||
minRequiredVersion);
|
||||
minRequiredVersion);
|
||||
final ComparableVersion maxVersion = new ComparableVersion(
|
||||
(maxRequiredVersion));
|
||||
(maxRequiredVersion));
|
||||
final ComparableVersion version = new ComparableVersion(
|
||||
availableVersion);
|
||||
availableVersion);
|
||||
return minVersion.compareTo(version) <= 0 && version.compareTo(
|
||||
maxVersion) <= 0;
|
||||
maxVersion) <= 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ public class InstalledModule implements Serializable {
|
|||
return moduleClassName;
|
||||
}
|
||||
|
||||
public void setModuleClassName(String moduleClassName) {
|
||||
public void setModuleClassName(final String moduleClassName) {
|
||||
this.moduleClassName = moduleClassName;
|
||||
}
|
||||
|
||||
|
|
@ -59,7 +59,7 @@ public class InstalledModule implements Serializable {
|
|||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(ModuleStatus status) {
|
||||
public void setStatus(final ModuleStatus status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,13 +21,13 @@ package org.libreccm.core.modules;
|
|||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLDataException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
|
|
@ -43,11 +43,11 @@ public class ModuleInfo {
|
|||
|
||||
private static final Logger LOGGER = LogManager.getLogger(ModuleInfo.class);
|
||||
|
||||
private String moduleName;
|
||||
private String moduleDataPackage;
|
||||
private Class<?>[] moduleEntities;
|
||||
private String moduleVersion;
|
||||
private RequiredModule[] requiredModules;
|
||||
private transient String moduleName;
|
||||
private transient String moduleDataPackage;
|
||||
private transient Class<?>[] moduleEntities;
|
||||
private transient String moduleVersion;
|
||||
private transient RequiredModule[] requiredModules;
|
||||
|
||||
public ModuleInfo() {
|
||||
//Nothing
|
||||
|
|
@ -66,8 +66,9 @@ public class ModuleInfo {
|
|||
}
|
||||
|
||||
public String getDbScriptsLocation(final Connection connection)
|
||||
throws SQLException {
|
||||
final StringBuffer buffer = new StringBuffer("classpath:/db/migrations/");
|
||||
throws SQLException {
|
||||
final StringBuffer buffer
|
||||
= new StringBuffer("classpath:/db/migrations/");
|
||||
buffer.append(moduleDataPackage);
|
||||
switch (connection.getMetaData().getDatabaseProductName()) {
|
||||
case "H2": {
|
||||
|
|
@ -82,9 +83,9 @@ public class ModuleInfo {
|
|||
break;
|
||||
default:
|
||||
throw new IntegrationException(String.format(
|
||||
"Integration failed. Database \"%s\" is not supported yet.",
|
||||
connection.getMetaData().
|
||||
getDatabaseProductName()));
|
||||
"Integration failed. Database \"%s\" is not supported yet.",
|
||||
connection.getMetaData().
|
||||
getDatabaseProductName()));
|
||||
}
|
||||
|
||||
return buffer.toString();
|
||||
|
|
@ -109,8 +110,93 @@ public class ModuleInfo {
|
|||
public void load(final Class<? extends CcmModule> moduleClass) {
|
||||
LOGGER.info("Reading module info for {}...", moduleClass.getName());
|
||||
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",
|
||||
moduleClass.getName());
|
||||
LOGGER.info("Trying to retrieve module info for module {} from {}...",
|
||||
|
|
@ -123,62 +209,95 @@ public class ModuleInfo {
|
|||
path);
|
||||
} else {
|
||||
try {
|
||||
properties.load(stream);
|
||||
moduleInfo.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);
|
||||
return moduleInfo;
|
||||
}
|
||||
|
||||
private String readModuleName(final Class<? extends CcmModule> moduleClass,
|
||||
final Module annotation,
|
||||
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 {
|
||||
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();
|
||||
"The module was not specificied by the module annotation "
|
||||
+ "or by the module info file. Creating name from "
|
||||
+ "simple name of the module class.");
|
||||
return moduleClass.getSimpleName().toLowerCase();
|
||||
}
|
||||
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(
|
||||
"-", "_"));
|
||||
private String readModulePackageName(
|
||||
final Class<? extends CcmModule> moduleClass,
|
||||
final Module annotation,
|
||||
final Properties moduleInfo) {
|
||||
|
||||
@SuppressWarnings("PMD.LongVariable")
|
||||
final boolean annotationHasPackageName = annotation.packageName() != null
|
||||
&& !annotation.packageName()
|
||||
.isEmpty();
|
||||
@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 {
|
||||
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 "
|
||||
+ "module class.");
|
||||
moduleDataPackage = moduleClass.getName().toLowerCase();
|
||||
return moduleClass.getName().toLowerCase();
|
||||
}
|
||||
LOGGER.info("Module data package is \"{}\".", moduleDataPackage);
|
||||
}
|
||||
|
||||
if (annotation.version() != null && !annotation.version().isEmpty()) {
|
||||
moduleVersion = annotation.version();
|
||||
} else if (properties.getProperty(VERSION) != null
|
||||
&& !properties.getProperty(VERSION).isEmpty()) {
|
||||
moduleVersion = properties.getProperty(VERSION);
|
||||
private String readModuleVersion(
|
||||
final Module annotation,
|
||||
final Properties moduleInfo) {
|
||||
|
||||
@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 {
|
||||
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!");
|
||||
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.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.ServiceLoader;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -58,7 +56,7 @@ import java.util.ServiceLoader;
|
|||
@RunWith(Arquillian.class)
|
||||
public class DependencyTreeManagerCycleTest {
|
||||
|
||||
private transient ServiceLoader<CcmModule> modules;
|
||||
private transient Iterable<CcmModule> modules;
|
||||
|
||||
public DependencyTreeManagerCycleTest() {
|
||||
}
|
||||
|
|
@ -73,7 +71,12 @@ public class DependencyTreeManagerCycleTest {
|
|||
|
||||
@Before
|
||||
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
|
||||
|
|
@ -96,18 +99,41 @@ public class DependencyTreeManagerCycleTest {
|
|||
|
||||
return ShrinkWrap
|
||||
.create(WebArchive.class,
|
||||
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManager.war")
|
||||
.addPackage(DependencyTreeManager.class.getPackage())
|
||||
.addPackage(Module.class
|
||||
.getPackage())
|
||||
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManagerCycleTest.war")
|
||||
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||
.getPackage())
|
||||
.addPackage(org.libreccm.core.modules.dependencytree.test.cycle.TestModuleRoot.class
|
||||
.getPackage())
|
||||
.addPackage(CcmModule.class.getPackage())
|
||||
.addClass(DependencyTreeManager.class)
|
||||
.addClass(DependencyException.class)
|
||||
.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)
|
||||
.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
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@ import org.libreccm.tests.categories.IntegrationTest;
|
|||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.ServiceLoader;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -58,7 +56,7 @@ import java.util.ServiceLoader;
|
|||
@RunWith(Arquillian.class)
|
||||
public class DependencyTreeManagerTest {
|
||||
|
||||
private transient ServiceLoader<CcmModule> modules;
|
||||
private transient Iterable<CcmModule> modules;
|
||||
|
||||
public DependencyTreeManagerTest() {
|
||||
}
|
||||
|
|
@ -73,7 +71,13 @@ public class DependencyTreeManagerTest {
|
|||
|
||||
@Before
|
||||
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
|
||||
|
|
@ -96,18 +100,41 @@ public class DependencyTreeManagerTest {
|
|||
|
||||
return ShrinkWrap
|
||||
.create(WebArchive.class,
|
||||
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManager.war")
|
||||
.addPackage(DependencyTreeManager.class.getPackage())
|
||||
.addPackage(Module.class
|
||||
.getPackage())
|
||||
"LibreCCM-org.libreccm.modules.dependencytree.DependencyTreeManagerTest.war")
|
||||
.addPackage(org.libreccm.tests.categories.IntegrationTest.class
|
||||
.getPackage())
|
||||
.addPackage(org.libreccm.core.modules.dependencytree.test.valid.TestModuleRoot.class
|
||||
.getPackage())
|
||||
.addPackage(CcmModule.class.getPackage())
|
||||
.addClass(DependencyTreeManager.class)
|
||||
.addClass(DependencyException.class)
|
||||
.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)
|
||||
.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
|
||||
|
|
@ -138,10 +165,10 @@ public class DependencyTreeManagerTest {
|
|||
}
|
||||
|
||||
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"));
|
||||
contains("test-module-root",
|
||||
"test-module-a",
|
||||
"test-module-b",
|
||||
"test-module-c"));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue