CCM NG: Some code clean up

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3591 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2015-08-28 18:16:56 +00:00
parent 0d967f6832
commit 2f95086fe9
6 changed files with 375 additions and 180 deletions

View File

@ -31,6 +31,8 @@ public class DependencyException extends Exception {
* message. * message.
*/ */
public DependencyException() { public DependencyException() {
super();
//Nothin more
} }
/** /**

View File

@ -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;
} }
} }

View File

@ -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;
} }

View File

@ -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();
} }
} }

View File

@ -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

View File

@ -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"));
} }
} }