diff --git a/ccm-core/pom.xml b/ccm-core/pom.xml
index a24058167..5cbc4ac58 100644
--- a/ccm-core/pom.xml
+++ b/ccm-core/pom.xml
@@ -57,6 +57,14 @@
hibernate-validator-cdi
+
+
+ org.flywaydb
+ flyway-core
+
+
org.apache.logging.log4j
diff --git a/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java b/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java
index 688cf8f2c..9efd0f082 100644
--- a/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java
+++ b/ccm-core/src/main/java/org/libreccm/auditing/CcmRevision.java
@@ -36,7 +36,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "ccm_revisions")
+@Table(name = "ccm_revisions", schema = "ccm_core")
@RevisionEntity()
public class CcmRevision extends DefaultRevisionEntity {
diff --git a/ccm-core/src/main/java/org/libreccm/categorization/Categorization.java b/ccm-core/src/main/java/org/libreccm/categorization/Categorization.java
index e106c52ad..f71620c02 100644
--- a/ccm-core/src/main/java/org/libreccm/categorization/Categorization.java
+++ b/ccm-core/src/main/java/org/libreccm/categorization/Categorization.java
@@ -44,7 +44,7 @@ import javax.persistence.JoinColumn;
* @apiviz.has org.libreccm.core.CcmObject
*/
@Entity
-@Table(name = "categorizations")
+@Table(name = "categorizations", schema = "ccm_core")
public class Categorization implements Serializable {
private static final long serialVersionUID = 201504301320L;
diff --git a/ccm-core/src/main/java/org/libreccm/categorization/Category.java b/ccm-core/src/main/java/org/libreccm/categorization/Category.java
index 983e24607..b277f2293 100644
--- a/ccm-core/src/main/java/org/libreccm/categorization/Category.java
+++ b/ccm-core/src/main/java/org/libreccm/categorization/Category.java
@@ -59,7 +59,7 @@ import javax.validation.constraints.Pattern;
* @apiviz.composedOf org.libreccm.categorization.Categorization
*/
@Entity
-@Table(name = "categories")
+@Table(name = "categories", schema = "ccm_core")
@NamedQueries({
@NamedQuery(name = "topLevelCategories",
query = "SELECT c FROM Category c WHERE c.parentCategory IS NULL")
@@ -90,7 +90,8 @@ public class Category extends CcmObject implements Serializable {
@Embedded
@AssociationOverride(
name = "values",
- joinTable = @JoinTable(name = "category_titles",
+ joinTable = @JoinTable(name = "category_titles",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "object_id")}
))
@@ -103,6 +104,7 @@ public class Category extends CcmObject implements Serializable {
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "category_descriptions",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "object_id")}
))
diff --git a/ccm-core/src/main/java/org/libreccm/categorization/Domain.java b/ccm-core/src/main/java/org/libreccm/categorization/Domain.java
index 5ee846c31..309802a50 100644
--- a/ccm-core/src/main/java/org/libreccm/categorization/Domain.java
+++ b/ccm-core/src/main/java/org/libreccm/categorization/Domain.java
@@ -70,7 +70,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "category_domains")
+@Table(name = "category_domains", schema = "ccm_core")
@XmlRootElement(name = "domain", namespace = CAT_XML_NS)
public class Domain extends CcmObject implements Serializable {
@@ -114,6 +114,7 @@ public class Domain extends CcmObject implements Serializable {
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "domain_titles",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "object_id")}))
@XmlElement(name = "title", namespace = CAT_XML_NS)
@@ -126,6 +127,7 @@ public class Domain extends CcmObject implements Serializable {
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "domain_descriptions",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "object_id")}))
@XmlElement(name = "description", namespace = CAT_XML_NS)
diff --git a/ccm-core/src/main/java/org/libreccm/categorization/DomainOwnership.java b/ccm-core/src/main/java/org/libreccm/categorization/DomainOwnership.java
index 625d9463c..6a43c5328 100644
--- a/ccm-core/src/main/java/org/libreccm/categorization/DomainOwnership.java
+++ b/ccm-core/src/main/java/org/libreccm/categorization/DomainOwnership.java
@@ -41,7 +41,7 @@ import org.libreccm.web.Application;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "domain_ownerships")
+@Table(name = "domain_ownerships", schema = "ccm_core")
public class DomainOwnership implements Serializable {
private static final long serialVersionUID = 201504301305L;
diff --git a/ccm-core/src/main/java/org/libreccm/cdi/utils/CdiUtil.java b/ccm-core/src/main/java/org/libreccm/cdi/utils/CdiUtil.java
index b98a7a4ae..aaefd91a9 100644
--- a/ccm-core/src/main/java/org/libreccm/cdi/utils/CdiUtil.java
+++ b/ccm-core/src/main/java/org/libreccm/cdi/utils/CdiUtil.java
@@ -37,7 +37,7 @@ import javax.enterprise.inject.spi.CDI;
public class CdiUtil {
private final static Logger LOGGER = LogManager.getLogger(CdiUtil.class);
-
+
private final transient BeanManager beanManager;
public CdiUtil() {
@@ -51,8 +51,9 @@ public class CdiUtil {
if (iterator.hasNext()) {
@SuppressWarnings("unchecked")
final Bean bean = (Bean) iterator.next();
- final CreationalContext ctx = beanManager.createCreationalContext(bean);
-
+ final CreationalContext ctx = beanManager
+ .createCreationalContext(bean);
+
return (T) beanManager.getReference(bean, beanType, ctx);
} else {
LOGGER.error(new ParameterizedMessage(
@@ -61,4 +62,5 @@ public class CdiUtil {
"No CDI Bean for type \"%s\" found", beanType.getName()));
}
}
+
}
diff --git a/ccm-core/src/main/java/org/libreccm/core/CcmCore.java b/ccm-core/src/main/java/org/libreccm/core/CcmCore.java
new file mode 100644
index 000000000..ea1955db9
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/CcmCore.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core;
+
+import org.libreccm.core.modules.CcmModule;
+import org.libreccm.core.modules.InitEvent;
+import org.libreccm.core.modules.InstallEvent;
+import org.libreccm.core.modules.Module;
+import org.libreccm.core.modules.ShutdownEvent;
+import org.libreccm.core.modules.UnInstallEvent;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@Module(entities = {org.libreccm.auditing.CcmRevision.class,
+ org.libreccm.categorization.Category.class,
+ org.libreccm.categorization.Categorization.class,
+ org.libreccm.categorization.Domain.class,
+ org.libreccm.categorization.DomainOwnership.class,
+ org.libreccm.core.CcmObject.class,
+ org.libreccm.core.Group.class,
+ org.libreccm.core.GroupMembership.class,
+ org.libreccm.core.Permission.class,
+ org.libreccm.core.Privilege.class,
+ org.libreccm.core.Resource.class,
+ org.libreccm.core.ResourceType.class,
+ org.libreccm.core.Role.class,
+ org.libreccm.core.Subject.class,
+ org.libreccm.core.User.class,
+ org.libreccm.core.modules.InstalledModule.class})
+public class CcmCore implements CcmModule {
+
+ @Override
+ public void install(final InstallEvent event) {
+ //Nothing
+ }
+
+ @Override
+ public void init(final InitEvent event) {
+ //Nothing
+ }
+
+ @Override
+ public void shutdown(final ShutdownEvent event) {
+ //Nothing
+ }
+
+ @Override
+ public void uninstall(final UnInstallEvent event) {
+ //Nothing
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/CcmObject.java b/ccm-core/src/main/java/org/libreccm/core/CcmObject.java
index 3cdc6eb7e..4e8e89d8f 100644
--- a/ccm-core/src/main/java/org/libreccm/core/CcmObject.java
+++ b/ccm-core/src/main/java/org/libreccm/core/CcmObject.java
@@ -61,7 +61,7 @@ import javax.xml.bind.annotation.XmlRootElement;
*
*/
@Entity
-@Table(name = "ccm_objects")
+@Table(name = "ccm_objects", schema = "ccm_core")
@Inheritance(strategy = InheritanceType.JOINED)
@XmlRootElement(name = "ccm-object", namespace = CORE_XML_NS)
//False warning (?). Because this class has been migrated from the old PDL style
diff --git a/ccm-core/src/main/java/org/libreccm/core/CoreConstants.java b/ccm-core/src/main/java/org/libreccm/core/CoreConstants.java
index 1ea2d4bf0..1c13ab85c 100644
--- a/ccm-core/src/main/java/org/libreccm/core/CoreConstants.java
+++ b/ccm-core/src/main/java/org/libreccm/core/CoreConstants.java
@@ -27,6 +27,8 @@ public final class CoreConstants {
public static final String CORE_XML_NS = "http://core.libreccm.org";
+ public static final String DB_SCHEMA = "ccm_core";
+
private CoreConstants() {
//Nothing
}
diff --git a/ccm-core/src/main/java/org/libreccm/core/Group.java b/ccm-core/src/main/java/org/libreccm/core/Group.java
index cd13844bb..6a6fe2b9b 100644
--- a/ccm-core/src/main/java/org/libreccm/core/Group.java
+++ b/ccm-core/src/main/java/org/libreccm/core/Group.java
@@ -46,7 +46,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "ccm_groups")
+@Table(name = "ccm_groups", schema = "ccm_core")
@NamedQueries({
@NamedQuery(name = "findGroupByName",
query = "SELECT g FROM Group g WHERE g.name = :groupName")
diff --git a/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java b/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java
index 7d587c3cd..a8c06a315 100644
--- a/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java
+++ b/ccm-core/src/main/java/org/libreccm/core/GroupMembership.java
@@ -40,7 +40,7 @@ import javax.xml.bind.annotation.XmlTransient;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "group_memberships")
+@Table(name = "group_memberships", schema = "ccm_core")
@XmlRootElement(name = "group-membership",
namespace = CORE_XML_NS)
public class GroupMembership implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/core/Permission.java b/ccm-core/src/main/java/org/libreccm/core/Permission.java
index 01f774c95..8fe14ea23 100644
--- a/ccm-core/src/main/java/org/libreccm/core/Permission.java
+++ b/ccm-core/src/main/java/org/libreccm/core/Permission.java
@@ -47,7 +47,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "permissions")
+@Table(name = "permissions", schema = "ccm_core")
@NamedQueries({
@NamedQuery(name = "findPermissionsForSubject",
query = "SELECT p FROM Permission p WHERE p.grantee = :subject"),
diff --git a/ccm-core/src/main/java/org/libreccm/core/Privilege.java b/ccm-core/src/main/java/org/libreccm/core/Privilege.java
index d47ceb6ea..f74ad078d 100644
--- a/ccm-core/src/main/java/org/libreccm/core/Privilege.java
+++ b/ccm-core/src/main/java/org/libreccm/core/Privilege.java
@@ -48,7 +48,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "ccm_privileges")
+@Table(name = "ccm_privileges", schema = "ccm_core")
@NamedQueries({
@NamedQuery(name = "findPrivilegeByName",
query = "SELECT p FROM Privilege p "
diff --git a/ccm-core/src/main/java/org/libreccm/core/Resource.java b/ccm-core/src/main/java/org/libreccm/core/Resource.java
index 83a6bb205..58999f897 100644
--- a/ccm-core/src/main/java/org/libreccm/core/Resource.java
+++ b/ccm-core/src/main/java/org/libreccm/core/Resource.java
@@ -53,7 +53,7 @@ import javax.persistence.TemporalType;
*
*/
@Entity
-@Table(name = "resources")
+@Table(name = "resources", schema = "ccm_core")
public class Resource extends CcmObject implements Serializable {
private static final long serialVersionUID = 7345482620613842781L;
@@ -65,6 +65,7 @@ public class Resource extends CcmObject implements Serializable {
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "resource_titles",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "object_id")}))
private LocalizedString title;
@@ -76,6 +77,7 @@ public class Resource extends CcmObject implements Serializable {
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "resource_descriptions",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "object_id")}))
private LocalizedString description;
diff --git a/ccm-core/src/main/java/org/libreccm/core/ResourceType.java b/ccm-core/src/main/java/org/libreccm/core/ResourceType.java
index e6b7071e3..1338d5b17 100644
--- a/ccm-core/src/main/java/org/libreccm/core/ResourceType.java
+++ b/ccm-core/src/main/java/org/libreccm/core/ResourceType.java
@@ -37,7 +37,7 @@ import org.libreccm.l10n.LocalizedString;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "resource_types")
+@Table(name = "resource_types", schema = "ccm_core")
@Inheritance(strategy = InheritanceType.JOINED)
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
@@ -59,6 +59,7 @@ public class ResourceType implements Serializable {
@AssociationOverride(
name = "values",
joinTable = @JoinTable(name = "resource_type_descriptions",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "resource_type_id")}))
private LocalizedString description;
diff --git a/ccm-core/src/main/java/org/libreccm/core/Role.java b/ccm-core/src/main/java/org/libreccm/core/Role.java
index 3060649ad..4de0bc527 100644
--- a/ccm-core/src/main/java/org/libreccm/core/Role.java
+++ b/ccm-core/src/main/java/org/libreccm/core/Role.java
@@ -47,7 +47,7 @@ import javax.persistence.NamedQuery;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "ccm_roles")
+@Table(name = "ccm_roles", schema = "ccm_core")
@NamedQueries({
@NamedQuery(name = "findRolesForName",
query = "SELECT r FROM Role r "
diff --git a/ccm-core/src/main/java/org/libreccm/core/Subject.java b/ccm-core/src/main/java/org/libreccm/core/Subject.java
index 6caac9951..d95b28df7 100644
--- a/ccm-core/src/main/java/org/libreccm/core/Subject.java
+++ b/ccm-core/src/main/java/org/libreccm/core/Subject.java
@@ -45,7 +45,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "subjects")
+@Table(name = "subjects", schema = "ccm_core")
@Inheritance(strategy = InheritanceType.JOINED)
@XmlRootElement(name = "subject", namespace = CORE_XML_NS)
public class Subject implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/core/User.java b/ccm-core/src/main/java/org/libreccm/core/User.java
index 452de1827..c2edf3533 100644
--- a/ccm-core/src/main/java/org/libreccm/core/User.java
+++ b/ccm-core/src/main/java/org/libreccm/core/User.java
@@ -57,7 +57,7 @@ import javax.xml.bind.annotation.XmlTransient;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "ccm_users")
+@Table(name = "ccm_users", schema = "ccm_core")
@NamedQueries({
@NamedQuery(name = "findUserByScreenName",
query = "SELECT u FROM User u WHERE u.screenName = :screenname"),
@@ -83,6 +83,7 @@ public class User extends Subject implements Serializable {
@AssociationOverride(
name = "user_names",
joinTable = @JoinTable(name = "user_names",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = " user_id")}))
@XmlElement(name = "person-name", namespace = CORE_XML_NS)
@@ -102,6 +103,7 @@ public class User extends Subject implements Serializable {
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "user_email_addresses",
+ schema = "ccm_core",
joinColumns = {
@JoinColumn(name = "user_id")})
@Size(min = 1)
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/CcmIntegrator.java b/ccm-core/src/main/java/org/libreccm/core/modules/CcmIntegrator.java
new file mode 100644
index 000000000..64755ce7b
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/CcmIntegrator.java
@@ -0,0 +1,235 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.flywaydb.core.Flyway;
+import org.flywaydb.core.api.MigrationInfo;
+import org.flywaydb.core.internal.util.jdbc.JdbcUtils;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.engine.spi.SessionFactoryImplementor;
+import org.hibernate.integrator.spi.Integrator;
+import org.hibernate.metamodel.source.MetadataImplementor;
+import org.hibernate.service.spi.SessionFactoryServiceRegistry;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+import java.util.ServiceLoader;
+
+import javax.sql.DataSource;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class CcmIntegrator implements Integrator {
+
+ private static final Logger LOGGER = LogManager.getLogger(
+ CcmIntegrator.class);
+
+ private ServiceLoader modules;
+
+ @Override
+ public void integrate(final Configuration configuration,
+ final SessionFactoryImplementor sessionFactory,
+ final SessionFactoryServiceRegistry registry) {
+ LOGGER.info("Retrieving modules...");
+ modules = ServiceLoader.load(CcmModule.class);
+ for (final CcmModule module : modules) {
+ LOGGER.info("Found module class {}...", module.getClass().getName());
+ final ModuleInfo moduleInfo = new ModuleInfo();
+ moduleInfo.load(module);
+ LOGGER.info("Found module {}.", moduleInfo.getModuleName());
+ }
+
+ Connection connection = null;
+ try {
+ final DependencyTreeManager treeManager
+ = new DependencyTreeManager();
+ final List tree = treeManager.generateTree(modules);
+ final List orderedNodes = treeManager.orderModules(tree);
+
+ final DataSource dataSource = (DataSource) sessionFactory.
+ getProperties().get("javax.persistence.jtaDataSource");
+ connection = dataSource.getConnection();
+
+ for (final TreeNode node : orderedNodes) {
+ migrateModule(node.getModule().getClass(), dataSource);
+
+ for (Class> entity : node.getModuleInfo().getModuleEntities()) {
+ configuration.addAnnotatedClass(entity);
+ }
+ }
+
+ } catch (DependencyException | SQLException ex) {
+ throw new IntegrationException("Failed to integrate modules", ex);
+ } finally {
+ JdbcUtils.closeConnection(connection);
+ }
+
+ LOGGER.info("All modules integrated successfully.");
+ }
+
+ private String getSchemaName(final ModuleInfo moduleInfo) {
+ return moduleInfo.getModuleName().toLowerCase().replace("-", "_");
+ }
+
+ private String getLocation(final ModuleInfo moduleInfo,
+ final Connection connection) throws SQLException {
+ final StringBuffer buffer = new StringBuffer(
+ "classpath:/db/migrations/");
+ //buffer.append(ModuleUtil.getModulePackageName(module));
+ buffer.append(moduleInfo.getModuleDataPackage());
+ switch (connection.getMetaData().getDatabaseProductName()) {
+ case "MySQL":
+ buffer.append("/mysql");
+ break;
+ case "PostgreSQL":
+ buffer.append("/pgsql");
+ break;
+ default:
+ throw new IntegrationException(String.format(
+ "Integration failed. Database \"%s\" is not supported yet.",
+ connection.getMetaData().
+ getDatabaseProductName()));
+ }
+
+ return buffer.toString();
+ }
+
+ private void migrateModule(final Class extends CcmModule> module,
+ final DataSource dataSource) throws SQLException {
+ final Connection connection = dataSource.getConnection();
+
+ final ModuleInfo moduleInfo = new ModuleInfo();
+ moduleInfo.load(module);
+
+ final Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setSchemas(getSchemaName(moduleInfo));
+ flyway.setLocations(getLocation(moduleInfo, connection));
+
+ final MigrationInfo current = flyway.info().current();
+ boolean newModule;
+ if (current == null) {
+ LOGGER.info("No version, database schema is considered empty.");
+ newModule = true;
+ } else {
+ LOGGER.info("Current version of schema {} in database is {}",
+ getSchemaName(moduleInfo),
+ current.getVersion());
+ newModule = false;
+ }
+
+ flyway.migrate();
+
+ LOGGER.info("Migrated schema {} in database to version {}",
+ getSchemaName(moduleInfo),
+ flyway.info().current().getVersion());
+
+ if (newModule) {
+ final Statement statement = connection.createStatement();
+ statement.execute(String.format(
+ "INSERT INTO flyhydra_core.installed_modules "
+ + "(module_class_name, status) "
+ + "VALUES ('%s', 'NEW')",
+ module.getName()));
+ }
+ }
+
+ @Override
+ public void integrate(final MetadataImplementor metadata,
+ final SessionFactoryImplementor sessionFactory,
+ final SessionFactoryServiceRegistry registry) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public void disintegrate(final SessionFactoryImplementor sessionFactory,
+ final SessionFactoryServiceRegistry registry) {
+ LOGGER.info("Hibernate desintegrating...");
+
+ Connection connection = null;
+ LOGGER.info("Removing schemas for modules scheduled for uninstall...");
+ try {
+
+ final DataSource dataSource = (DataSource) sessionFactory
+ .getProperties().get("javax.persistence.jtaDataSource");
+ connection = dataSource.getConnection();
+ System.out.println("checking modules...");
+ LOGGER.info("Checking modules...");
+
+ for (final CcmModule module : modules) {
+ final ModuleInfo moduleInfo = new ModuleInfo();
+ moduleInfo.load(module);
+
+ final Statement query = connection.createStatement();
+ final ResultSet result = query.executeQuery(
+ String.format("SELECT module_class_name, status "
+ + "FROM flyhydra_core.installed_modules "
+ + "WHERE module_class_name = '%s'",
+ module.getClass().getName()));
+ System.out.printf("Checking status of module %s...\n",
+ module.getClass().getName());
+
+ if (result.next() && ModuleStatus.UNINSTALL.toString().equals(
+ result.getString("status"))) {
+
+ LOGGER.info("Removing schema for module %s...",
+ module.getClass().getName());
+ final Flyway flyway = new Flyway();
+ flyway.setDataSource(dataSource);
+ flyway.setSchemas(getSchemaName(moduleInfo));
+ flyway.setLocations(getLocation(moduleInfo, connection));
+ LOGGER.warn("Deleting schema for module {}...",
+ moduleInfo.getModuleName());
+ flyway.clean();
+
+ final Statement statement = connection.createStatement();
+ statement.addBatch(String.format(
+ "DELETE FROM flyhydra_core.installed_modules "
+ + "WHERE module_class_name = '%s'",
+ module.getClass().getName()));
+ statement.executeBatch();
+ LOGGER.info("Done.");
+ }
+
+ }
+ } catch (SQLException ex) {
+ LOGGER.error("Desintegration failed: ", ex);
+ System.err.println("Desintration failed");
+ ex.printStackTrace(System.err);
+ System.err.println();
+ SQLException next = ex.getNextException();
+ while(next != null) {
+ next.printStackTrace(System.err);
+ System.err.println();
+ next = next.getNextException();
+ }
+ throw new IntegrationException("Failed to desintegrate.", next);
+ } finally {
+ JdbcUtils.closeConnection(connection);
+ }
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/CcmModule.java b/ccm-core/src/main/java/org/libreccm/core/modules/CcmModule.java
new file mode 100644
index 000000000..4e65d601f
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/CcmModule.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import javax.persistence.EntityManager;
+import org.libreccm.modules.ModuleManager;
+
+/**
+ * This interface is implemented by all CCM module classes. It defines several
+ * methods which an be used by a module the execute code when the module is
+ * installed, initialised, shutdown or uninstalled. If a module does not need
+ * one of the methods defined by this interface the implementation can simply be
+ * left empty. The link {@link ModuleManager} provides each method with an
+ * event object which provides access to the {@link EntityManager}.
+ *
+ * A module may also needs some metadata which is provided by the {@link Module}
+ * annotation.
+ *
+ * When installing a module please refer also to the
+ * modules pages in the CCM
+ * documentation.
+ *
+ * @author Jens Pelzetter
+ */
+public interface CcmModule {
+
+ /**
+ * An implementation of this method is called after the module is installed.
+ *
+ * @param event
+ */
+ void install(InstallEvent event);
+
+ void init(InitEvent event);
+
+ void shutdown(ShutdownEvent event);
+
+ void uninstall(UnInstallEvent event);
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/DependencyException.java b/ccm-core/src/main/java/org/libreccm/core/modules/DependencyException.java
new file mode 100644
index 000000000..7e3b38d74
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/DependencyException.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class DependencyException extends Exception {
+
+ private static final long serialVersionUID = 10938361383494729L;
+
+ /**
+ * Creates a new instance of DependencyException without detail
+ * message.
+ */
+ public DependencyException() {
+ }
+
+ /**
+ * Constructs an instance of DependencyException with the
+ * specified detail message.
+ *
+ * @param msg the detail message.
+ */
+ public DependencyException(final String msg) {
+ super(msg);
+ }
+
+ /**
+ * Constructs an instance of DependencyException which wraps
+ * the specified exception.
+ *
+ * @param exception The exception to wrap.
+ */
+ public DependencyException(final Exception exception) {
+ super(exception);
+ }
+
+ /**
+ * Constructs an instance of DependencyException with the
+ * specified message which also wraps the specified exception.
+ *
+ * @param msg The detail message.
+ * @param exception The exception to wrap.
+ */
+ public DependencyException(final String msg, final Exception exception) {
+ super(msg, exception);
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/DependencyTreeManager.java b/ccm-core/src/main/java/org/libreccm/core/modules/DependencyTreeManager.java
new file mode 100644
index 000000000..8f4b53664
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/DependencyTreeManager.java
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.maven.artifact.versioning.ComparableVersion;
+
+/**
+ * This class implements topological sorting to determine the order in which the
+ * modules are loaded and initialised.
+ *
+ * The class is used by creating an instance with the parameterless constructor.
+ * To create the tree/graph call the
+ * {@link #generateTree(javax.enterprise.inject.Instance)} method. With the
+ * returned list of nodes call the the {@link #orderModules(java.util.List)}
+ * method. The list returned by {@link #orderModules(java.util.List)} contains
+ * all modules in order.
+ *
+ * More information about topological sorting:
+ * https://en.wikipedia.org/wiki/Topological_sorting
+ *
+ * @author Jens Pelzetter
+ */
+final class DependencyTreeManager {
+
+ private static final Logger LOGGER = LogManager.getLogger(
+ DependencyTreeManager.class);
+
+ public List generateTree(final Iterable modules)
+ throws DependencyException {
+
+ LOGGER.info("Starting to generate dependency tree...");
+
+ final Map nodes = new HashMap<>();
+
+ for (final CcmModule module : modules) {
+ createTreeNode(module, nodes);
+ }
+ final List nodeList = new ArrayList<>();
+ for (final Map.Entry entry : nodes.entrySet()) {
+ nodeList.add(entry.getValue());
+ }
+
+ LOGGER.info("Dependency tree generated.");
+
+ return nodeList;
+ }
+
+ public List orderModules(final List dependencyTree)
+ throws DependencyException {
+ LOGGER.info("Creating an ordered list from the dependency tree...");
+
+ final List orderedModules = new ArrayList<>();
+ final List resolvedModules = new ArrayList<>();
+
+ LOGGER.info("Looking for modules which do not depend on any other "
+ + "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());
+ resolvedModules.add(node);
+ }
+ }
+
+ LOGGER.info("Ordering remaining nodes...");
+ 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());
+
+ orderedModules.add(current);
+
+ for (final TreeNode dependent : current.getDependentModules()) {
+ dependent.removeDependsOn(current);
+
+ if (dependent.getDependsOn().isEmpty()) {
+ resolvedModules.add(dependent);
+ }
+ }
+ }
+
+ if (orderedModules.size() == dependencyTree.size()) {
+ LOGGER.info("Dependency graph proceessed successfully. "
+ + "Modules in order:");
+ for (final TreeNode node : orderedModules) {
+ //LOGGER.info("\t{}", ModuleUtil.getModuleName(node.getModule()));
+ LOGGER.info("\t{}", node.getModuleInfo().getModuleName());
+ }
+
+ return orderedModules;
+ } else {
+ LOGGER.fatal("The dependency graph has a least one cycle.");
+ throw new DependencyException(
+ "The dependency graph has a least one cycle.");
+ }
+ }
+
+ private void createTreeNode(final CcmModule module,
+ final Map 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 nodes)
+ 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.",
+ moduleInfo.getModuleName());
+ throw new IllegalArgumentException(String.format(
+ "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());
+
+// 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);
+ }
+ }
+
+ /**
+ * Helper method for checking if an dependency is available in the required
+ * version.
+ *
+ * @param availableVersion The available version. Can't be {@code null} or
+ * empty.
+ * @param minRequiredVersion The minimal version required. Can be
+ * {@code null} or empty.
+ * @param maxRequiredVersion The maximum version required. Can be
+ * {@code null} or empty.
+ *
+ * @return {@code true} if the available version is in the required range,
+ * {@code false} if not.
+ */
+ //The names are fine. Shorter names would be less readable. Also removing
+ //the parentheses in the ifs would make the conditions less readable.
+ @SuppressWarnings({"PMD.LongVariable",
+ "PMD.UselessParentheses",
+ "PMD.CyclomaticComplexity"})
+ private boolean validateVersion(final String availableVersion,
+ final String minRequiredVersion,
+ final String maxRequiredVersion) {
+ if (availableVersion == null || availableVersion.isEmpty()) {
+ throw new IllegalArgumentException("No available version specified.");
+ }
+
+ if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
+ && (maxRequiredVersion == null || maxRequiredVersion.
+ isEmpty())) {
+ return true;
+ } else if ((minRequiredVersion != null && !minRequiredVersion.isEmpty())
+ && (maxRequiredVersion == null || maxRequiredVersion
+ .isEmpty())) {
+ final ComparableVersion minVersion = new ComparableVersion(
+ minRequiredVersion);
+ final ComparableVersion version = new ComparableVersion(
+ availableVersion);
+
+ return minVersion.compareTo(version) <= 0;
+ } else if ((minRequiredVersion == null || minRequiredVersion.isEmpty())
+ && (maxRequiredVersion != null && !maxRequiredVersion
+ .isEmpty())) {
+ final ComparableVersion maxVersion = new ComparableVersion(
+ maxRequiredVersion);
+ final ComparableVersion version = new ComparableVersion(
+ availableVersion);
+
+ return version.compareTo(maxVersion) <= 0;
+ } else {
+ final ComparableVersion minVersion = new ComparableVersion(
+ minRequiredVersion);
+ final ComparableVersion maxVersion = new ComparableVersion(
+ (maxRequiredVersion));
+ final ComparableVersion version = new ComparableVersion(
+ availableVersion);
+ return minVersion.compareTo(version) <= 0 && version.compareTo(
+ maxVersion) <= 0;
+ }
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/InitEvent.java b/ccm-core/src/main/java/org/libreccm/core/modules/InitEvent.java
new file mode 100644
index 000000000..223f4976a
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/InitEvent.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class InitEvent extends ModuleEvent {
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/InstallEvent.java b/ccm-core/src/main/java/org/libreccm/core/modules/InstallEvent.java
new file mode 100644
index 000000000..b21c0ea7d
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/InstallEvent.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class InstallEvent extends ModuleEvent {
+
+
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/InstalledModule.java b/ccm-core/src/main/java/org/libreccm/core/modules/InstalledModule.java
new file mode 100644
index 000000000..c2f28d3df
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/InstalledModule.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import java.io.Serializable;
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import static org.libreccm.core.CoreConstants.DB_SCHEMA;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@Entity
+@Table(name = "installed_modules", schema = DB_SCHEMA)
+public class InstalledModule implements Serializable {
+
+ private static final long serialVersionUID = 6240025652113643164L;
+
+ @Id
+ @Column(name = "module_class_name", length = 2048)
+ private String moduleClassName;
+
+ @Column
+ @Enumerated(EnumType.STRING)
+ private ModuleStatus status;
+
+ public String getModuleClassName() {
+ return moduleClassName;
+ }
+
+ public void setModuleClassName(String moduleClassName) {
+ this.moduleClassName = moduleClassName;
+ }
+
+ public ModuleStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(ModuleStatus status) {
+ this.status = status;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 3;
+ hash = 79 * hash + Objects.hashCode(moduleClassName);
+ hash = 79 * hash + Objects.hashCode(status);
+ return hash;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (getClass() != obj.getClass()) {
+ return false;
+ }
+
+ final InstalledModule other = (InstalledModule) obj;
+ if (!Objects.equals(moduleClassName, other.getModuleClassName())) {
+ return false;
+ }
+ return status == other.getStatus();
+ }
+
+ public boolean canEqual(final Object obj) {
+ return obj instanceof InstalledModule;
+ }
+
+ @Override
+ public String toString() {
+ return toString("");
+ }
+
+ public String toString(final String data) {
+ return String.format(
+ "%s{ "
+ + "moduleClassName = \"%s\"; "
+ + "status = %s"
+ + "%s"
+ + " }",
+ super.toString(),
+ moduleClassName,
+ status.toString(),
+ data);
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/IntegrationException.java b/ccm-core/src/main/java/org/libreccm/core/modules/IntegrationException.java
new file mode 100644
index 000000000..aedf0ac38
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/IntegrationException.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class IntegrationException extends RuntimeException {
+
+ private static final long serialVersionUID = -8505205543077310805L;
+
+ /**
+ * Creates a new instance of IntegrationException without
+ * detail message.
+ */
+ public IntegrationException() {
+ super();
+ }
+
+ /**
+ * Constructs an instance of IntegrationException with the
+ * specified detail message.
+ *
+ * @param msg the detail message.
+ */
+ public IntegrationException(final String msg) {
+ super(msg);
+ }
+
+ public IntegrationException(final Throwable cause) {
+ super(cause);
+ }
+
+ public IntegrationException(final String msg, final Throwable cause) {
+ super(msg, cause);
+ }
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/Module.java b/ccm-core/src/main/java/org/libreccm/core/modules/Module.java
new file mode 100644
index 000000000..fbd6b12a2
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/Module.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import static java.lang.annotation.ElementType.*;
+
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for describing some meta of a module.
+ *
+ * @author Jens Pelzetter
+ */
+@Target({TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Module {
+
+ /**
+ * Name of the module, overriding the name provided by the pom.xml and the
+ * module info file of the module.
+ *
+ * @return The name of the module, overriding the value provided by the
+ * module-info file.
+ */
+ String name() default "";
+
+ /**
+ * Package name of resources of the package like DB migrations, overriding
+ * default value constructed from the group id and the artifact id of the
+ * module.
+ *
+ * @return The package name for resources of the module.
+ */
+ String packageName() default "";
+
+ /**
+ * The version of module, overriding the value provided by the module info
+ * file of the module.
+ *
+ * @return The version of the module.
+ */
+ String version() default "";
+
+ /**
+ * Modules required by the annotated module.
+ *
+ * @return An array of the dependencies of the module.
+ */
+ RequiredModule[] requiredModules() default {};
+
+ /**
+ * The JPA entities provided by the annotated module.
+ *
+ * @return An array with the JPA entity classes of the annotated module.
+ */
+ Class>[] entities() default {};
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/ModuleEvent.java b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleEvent.java
new file mode 100644
index 000000000..99171f3ad
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleEvent.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import javax.persistence.EntityManager;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+class ModuleEvent {
+
+ private EntityManager entityManager;
+
+ ModuleEvent() {
+ //Nothing for now
+ }
+
+ ModuleEvent(final EntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ public EntityManager getEntityManager() {
+ return entityManager;
+ }
+
+ public void setEntityManager(final EntityManager entityManager) {
+ this.entityManager = entityManager;
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/ModuleInfo.java b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleInfo.java
new file mode 100644
index 000000000..82f1c61c2
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleInfo.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.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;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ModuleInfo {
+
+ private static final String ARTIFACT_ID = "artifactId";
+ private static final String GROUP_ID = "groupId";
+ private static final String VERSION = "version";
+
+ private static final Logger LOGGER = LogManager.getLogger(ModuleInfo.class);
+
+ private String moduleName;
+ private String moduleDataPackage;
+ private Class>[] moduleEntities;
+ private String moduleVersion;
+ private RequiredModule[] requiredModules;
+
+ public ModuleInfo() {
+ //Nothing
+ }
+
+ public String getModuleName() {
+ return moduleName;
+ }
+
+ public String getModuleDataPackage() {
+ return moduleDataPackage;
+ }
+
+ public String getDbSchemaName() {
+ return moduleName.toLowerCase(Locale.ROOT).replace("-", "_");
+ }
+
+ public String getDbScriptsLocation(final Connection connection)
+ throws SQLException {
+ final StringBuffer buffer = new StringBuffer("classpath:/db/migrations/");
+ buffer.append(moduleDataPackage);
+ switch (connection.getMetaData().getDatabaseProductName()) {
+ case "H2": {
+ buffer.append("/h2");
+ break;
+ }
+ case "MySQL":
+ buffer.append("/mysql");
+ break;
+ case "PostgreSQL":
+ buffer.append("/postgresql");
+ break;
+ default:
+ throw new IntegrationException(String.format(
+ "Integration failed. Database \"%s\" is not supported yet.",
+ connection.getMetaData().
+ getDatabaseProductName()));
+ }
+
+ return buffer.toString();
+ }
+
+ public String getModuleVersion() {
+ return moduleVersion;
+ }
+
+ public List> getModuleEntities() {
+ return Collections.unmodifiableList(Arrays.asList(moduleEntities));
+ }
+
+ public List getRequiredModules() {
+ return Collections.unmodifiableList(Arrays.asList(requiredModules));
+ }
+
+ public void load(final CcmModule module) {
+ load(module.getClass());
+ }
+
+ 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 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.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("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();
+ }
+ 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);
+ } 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!");
+ }
+ LOGGER.info("Module version is \"{}.\"", moduleVersion);
+
+ requiredModules = annotation.requiredModules();
+ moduleEntities = annotation.entities();
+ }
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/ModuleManager.java b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleManager.java
new file mode 100644
index 000000000..98a6f461e
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleManager.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+import java.util.ServiceLoader;
+import javax.annotation.PostConstruct;
+import javax.enterprise.context.ApplicationScoped;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.transaction.Transactional;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@ApplicationScoped
+public class ModuleManager {
+
+ private static final Logger LOGGER = LogManager.getLogger(
+ ModuleManager.class
+ );
+
+ @PersistenceContext(name = "FlyHydra")
+ private EntityManager entityManager;
+
+ private List moduleNodes;
+
+ @PostConstruct
+ public void initDependencyTree() {
+ LOGGER.info("Finding modules");
+ final ServiceLoader modules = ServiceLoader.load(
+ CcmModule.class);
+
+ LOGGER.info("Creating dependency tree these modules:");
+ for (final CcmModule module : modules) {
+ final ModuleInfo moduleInfo = new ModuleInfo();
+ moduleInfo.load(module);
+ LOGGER.info("\t{} {}",
+ // ModuleUtil.getModuleName(module),
+ // ModuleUtil.getVersion(module));
+ moduleInfo.getModuleName(),
+ moduleInfo.getModuleVersion());
+ }
+
+ final DependencyTreeManager treeManager = new DependencyTreeManager();
+
+ try {
+ final List tree = treeManager.generateTree(modules);
+ moduleNodes = treeManager.orderModules(tree);
+ } catch (DependencyException ex) {
+ throw new ModuleManagerException(ex);
+ }
+
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void initModules() {
+ LOGGER.info("Initalising modules...");
+ for (final TreeNode node : moduleNodes) {
+ final InstallEvent installEvent = new InstallEvent();
+ installEvent.setEntityManager(entityManager);
+
+ final InstalledModule installedModule = entityManager.find(
+ InstalledModule.class, node.getModule().getClass().getName());
+ if (installedModule != null
+ && installedModule.getStatus() == ModuleStatus.NEW) {
+ node.getModule().install(installEvent);
+ installedModule.setStatus(ModuleStatus.INSTALLED);
+ entityManager.merge(installedModule);
+ }
+
+ final InitEvent initEvent = new InitEvent();
+ initEvent.setEntityManager(entityManager);
+ node.getModule().init(initEvent);
+
+ LOGGER.info("Data from module-info.properties for {}:",
+ node.getModule().getClass().getName());
+ final Properties moduleInfo = getModuleInfo(node.getModule());
+ LOGGER
+ .info("Module group id: {}", moduleInfo.getProperty(
+ "groupId"));
+ LOGGER.info("Module artifact id: {}", moduleInfo.getProperty(
+ "artifactId"));
+ LOGGER.info("Module version: {}", moduleInfo.getProperty("version"));
+
+ LOGGER.info("Module build date: {}", moduleInfo.getProperty(
+ "build.date"));
+ }
+ }
+
+ private Properties getModuleInfo(final CcmModule module) {
+ final Properties moduleInfo = new Properties();
+
+ try {
+// final String moduleInfoPath = String.format("/%s/module-info.properties",
+// module.getClass().getName().replace(".", "/"));
+ final String moduleInfoPath = String.format(
+ "/module-info/%s.properties",
+ module.getClass().getName());
+ LOGGER.info("Path for module info: {}", moduleInfoPath);
+ final InputStream stream = module.getClass().getResourceAsStream(
+ moduleInfoPath);
+ if (stream == null) {
+ LOGGER.warn("No module info found.");
+ } else {
+ moduleInfo.load(stream);
+ }
+
+ } catch (IOException ex) {
+ LOGGER.error("Failed to read module-info.properties for module {}.",
+ module.getClass().getName());
+ }
+
+ return moduleInfo;
+ }
+
+ @Transactional(Transactional.TxType.REQUIRED)
+ public void shutdownModules() {
+ LOGGER.info("Shutting down modules...");
+ System.out.println("Shutting down modules...");
+ for (final TreeNode node : moduleNodes) {
+ final ShutdownEvent shutdownEvent = new ShutdownEvent();
+ shutdownEvent.setEntityManager(entityManager);
+
+ node.getModule().shutdown(shutdownEvent);
+ }
+
+ System.out.println("Modules shut down.");
+
+ System.out.println("Checking for modules to uninstall...");
+ for (final TreeNode node : moduleNodes) {
+ System.out.printf("Checking status of module %s\n",
+ node.getModule().getClass().getName());
+ final InstalledModule installedModule = entityManager.find(
+ InstalledModule.class, node.
+ getModule().getClass().getName());
+ LOGGER.info("Status of module {} ({}): {}",
+ node.getModuleInfo().getModuleName(),
+ node.getModule().getClass().getName(),
+ installedModule.getStatus());
+ System.out.printf("Status of module %s (%s): %s\n",
+ node.getModuleInfo().getModuleName(),
+ node.getModule().getClass().getName(),
+ installedModule.getStatus());
+ System.out.printf("Checked status of module %s\n",
+ node.getModule().getClass().getName());
+
+ if (ModuleStatus.UNINSTALL.equals(installedModule.getStatus())) {
+ System.out.printf("Module %s is scheduled for uninstall...\n",
+ node.getModuleInfo().getModuleName());
+ if (node.getDependentModules().isEmpty()) {
+ System.out.
+ printf("Calling uninstall method of module %s...\n",
+ node.getModuleInfo().getModuleName());
+ final UnInstallEvent unInstallEvent = new UnInstallEvent();
+ unInstallEvent.setEntityManager(entityManager);
+ node.getModule().uninstall(null);
+
+ } else {
+ System.out.printf("There are other modules depending on "
+ + "module %s. Module can't be "
+ + "uninstalled. Depending modules:\n",
+ node.getModuleInfo().getModuleName());
+ for (final TreeNode dependent : node.getDependentModules()) {
+ System.out.printf("\t%s\n",
+ dependent.getModuleInfo()
+ .getModuleName());
+ }
+ installedModule.setStatus(ModuleStatus.INSTALLED);
+ entityManager.merge(installedModule);
+ }
+ } else {
+ System.out.printf(
+ "Module %s is *not* scheduled for uninstall.\n",
+ node.getModuleInfo().getModuleName());
+ }
+ }
+ }
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/ModuleManagerException.java b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleManagerException.java
new file mode 100644
index 000000000..45640304a
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleManagerException.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ModuleManagerException extends RuntimeException {
+
+ /**
+ * Creates a new instance of ModuleManagerException without
+ * detail message.
+ */
+ public ModuleManagerException() {
+ //Nothing
+ }
+
+ /**
+ * Constructs an instance of ModuleManagerException with the
+ * specified detail message.
+ *
+ * @param msg the detail message.
+ */
+ public ModuleManagerException(final String msg) {
+ super(msg);
+ }
+
+ public ModuleManagerException(final Throwable cause) {
+ super(cause);
+ }
+
+ public ModuleManagerException(final String msg, final Throwable cause) {
+ super(msg, cause);
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/ModuleStatus.java b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleStatus.java
new file mode 100644
index 000000000..d6f6cc0b8
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/ModuleStatus.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ * Enumeration describing the status of a module.
+ *
+ * @author Jens Pelzetter
+ */
+public enum ModuleStatus {
+
+ /**
+ * Marks a module as new. This state should be set by the DB migration
+ */
+ NEW,
+ /**
+ * Marks a module as installed and ready to use.
+ */
+ INSTALLED,
+ /**
+ * Marks a module be scheduled for uninstall. When the application is
+ * shutdown the module is removed from the database. Before starting the
+ * applications again the module classes (JAR) should be removed. Otherwise
+ * the module will be reinstalled.
+ */
+ UNINSTALL
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/RequiredModule.java b/ccm-core/src/main/java/org/libreccm/core/modules/RequiredModule.java
new file mode 100644
index 000000000..51fcb933f
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/RequiredModule.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public @interface RequiredModule {
+
+ Class extends CcmModule> module();
+
+ String minVersion() default "";
+
+ String maxVersion() default "";
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/ShutdownEvent.java b/ccm-core/src/main/java/org/libreccm/core/modules/ShutdownEvent.java
new file mode 100644
index 000000000..3c081bb01
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/ShutdownEvent.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ShutdownEvent extends ModuleEvent {
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/TreeNode.java b/ccm-core/src/main/java/org/libreccm/core/modules/TreeNode.java
new file mode 100644
index 000000000..8c61d37cb
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/TreeNode.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *
+ * Represents a node in the dependency tree. This class is not
+ * part of the public API.
+ *
+ * @author Jens Pelzetter
+ */
+final class TreeNode {
+
+ private CcmModule module;
+ private ModuleInfo moduleInfo;
+ private List dependentModules;
+ private List dependsOn;
+
+ public TreeNode() {
+ super();
+
+ dependentModules = new ArrayList<>();
+ dependsOn = new ArrayList<>();
+ }
+
+ public TreeNode(final CcmModule module) {
+ this();
+
+ this.module = module;
+ final ModuleInfo info = new ModuleInfo();
+ info.load(module);
+ moduleInfo = info;
+ }
+
+ public CcmModule getModule() {
+ return module;
+ }
+
+ public ModuleInfo getModuleInfo() {
+ return moduleInfo;
+ }
+
+ public List getDependentModules() {
+ return Collections.unmodifiableList(dependentModules);
+ }
+
+ void setDependentModules(final List dependentModules) {
+ this.dependentModules = dependentModules;
+ }
+
+ void addDependentModule(final TreeNode node) {
+ dependentModules.add(node);
+ }
+
+ void removeDependentModule(final TreeNode node) {
+ dependentModules.remove(node);
+ }
+
+ public List getDependsOn() {
+ return Collections.unmodifiableList(dependsOn);
+ }
+
+ void setDependsOn(final List dependsOn) {
+ this.dependsOn = dependsOn;
+ }
+
+ void addDependsOn(final TreeNode node) {
+ dependsOn.add(node);
+ }
+
+ void removeDependsOn(final TreeNode node) {
+ dependsOn.remove(node);
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5;
+
+ final ModuleInfo info = new ModuleInfo();
+ info.load(module);
+
+ final String moduleName = info.getModuleName();
+ final String version = info.getModuleVersion();
+
+ hash = 37 * hash + Objects.hashCode(moduleName);
+ hash = 37 * hash + Objects.hashCode(version);
+
+ return hash;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ if (object == null) {
+ return false;
+ }
+
+ if (!(object instanceof TreeNode)) {
+ return false;
+ }
+
+ final TreeNode other = (TreeNode) object;
+ final String name = moduleInfo.getModuleName();
+ final String otherName = other.getModuleInfo().getModuleName();
+
+ if (!name.equals(otherName)) {
+ return false;
+ }
+
+ final String version = moduleInfo.getModuleVersion();
+ final String otherVersion = other.getModuleInfo().getModuleVersion();
+
+ return version.equals(otherVersion);
+ }
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/core/modules/UnInstallEvent.java b/ccm-core/src/main/java/org/libreccm/core/modules/UnInstallEvent.java
new file mode 100644
index 000000000..5fea1cdfc
--- /dev/null
+++ b/ccm-core/src/main/java/org/libreccm/core/modules/UnInstallEvent.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.core.modules;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class UnInstallEvent extends ModuleEvent {
+
+}
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/Component.java b/ccm-core/src/main/java/org/libreccm/formbuilder/Component.java
index ece521991..511d5a8db 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/Component.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/Component.java
@@ -41,7 +41,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_components")
+@Table(name = "formbuilder_components", schema = "ccm_core")
//Can't reduce complexity yet
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/DataDrivenSelect.java b/ccm-core/src/main/java/org/libreccm/formbuilder/DataDrivenSelect.java
index dc54a7bf7..fcab72be7 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/DataDrivenSelect.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/DataDrivenSelect.java
@@ -30,7 +30,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_data_driven_selects")
+@Table(name = "formbuilder_data_driven_selects", schema = "ccm_core")
public class DataDrivenSelect extends Widget implements Serializable {
private static final long serialVersionUID = -4477753441663454661L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/FormSection.java b/ccm-core/src/main/java/org/libreccm/formbuilder/FormSection.java
index 21d3562b0..e7acfd65b 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/FormSection.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/FormSection.java
@@ -34,7 +34,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_formsections")
+@Table(name = "formbuilder_formsections", schema = "ccm_core")
public class FormSection extends Component implements Serializable {
private static final long serialVersionUID = -3195157282292906945L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/Listener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/Listener.java
index af91c2969..332c5ad17 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/Listener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/Listener.java
@@ -33,7 +33,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_listeners")
+@Table(name = "formbuilder_listeners", schema = "ccm_core")
public class Listener extends CcmObject implements Serializable {
private static final long serialVersionUID = 9030104813240364500L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/MetaObject.java b/ccm-core/src/main/java/org/libreccm/formbuilder/MetaObject.java
index 241a77b87..d7791c777 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/MetaObject.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/MetaObject.java
@@ -32,7 +32,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = " formbuilder_metaobjects")
+@Table(name = "formbuilder_metaobjects", schema = "ccm_core")
public class MetaObject extends CcmObject implements Serializable {
private static final long serialVersionUID = -3770682858640493776L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/ObjectType.java b/ccm-core/src/main/java/org/libreccm/formbuilder/ObjectType.java
index adc18ebaf..af14685ce 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/ObjectType.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/ObjectType.java
@@ -32,7 +32,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_object_types")
+@Table(name = "formbuilder_object_types", schema = "ccm_core")
public class ObjectType extends CcmObject implements Serializable {
private static final long serialVersionUID = 5236718507025096569L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/Option.java b/ccm-core/src/main/java/org/libreccm/formbuilder/Option.java
index 553e1259c..1be6a3e15 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/Option.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/Option.java
@@ -35,7 +35,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_options")
+@Table(name = "formbuilder_options", schema = "ccm_core")
public class Option extends Component implements Serializable {
private static final long serialVersionUID = -7528058391772415511L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/PersistentDataQuery.java b/ccm-core/src/main/java/org/libreccm/formbuilder/PersistentDataQuery.java
index b500cae52..1524dd3e9 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/PersistentDataQuery.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/PersistentDataQuery.java
@@ -36,7 +36,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_data_queries")
+@Table(name = "formbuilder_data_queries", schema = "ccm_core")
public class PersistentDataQuery extends CcmObject implements Serializable {
private static final long serialVersionUID = -7344153915501267752L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/ProcessListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/ProcessListener.java
index fb305402a..158a434c4 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/ProcessListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/ProcessListener.java
@@ -37,7 +37,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_process_listeners")
+@Table(name = "formbuilder_process_listeners", schema = "ccm_core")
public class ProcessListener extends CcmObject implements Serializable {
private static final long serialVersionUID = -3029184333026605708L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/Widget.java b/ccm-core/src/main/java/org/libreccm/formbuilder/Widget.java
index 332a559e4..4c9ce7bd6 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/Widget.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/Widget.java
@@ -34,7 +34,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_widgets")
+@Table(name = "formbuilder_widgets", schema = "ccm_core")
public class Widget extends Component implements Serializable {
private static final long serialVersionUID = 1057792450655098288L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/WidgetLabel.java b/ccm-core/src/main/java/org/libreccm/formbuilder/WidgetLabel.java
index f9a48f601..5f554c206 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/WidgetLabel.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/WidgetLabel.java
@@ -31,7 +31,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_widget_labels")
+@Table(name = "formbuilder_widget_labels", schema = "ccm_core")
public class WidgetLabel extends Component implements Serializable {
private static final long serialVersionUID = -2939505715812565159L;
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmEmailListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmEmailListener.java
index 7b9878a5c..f7dffea72 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmEmailListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmEmailListener.java
@@ -18,7 +18,7 @@ import org.libreccm.formbuilder.ProcessListener;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_confirm_email_listener")
+@Table(name = "formbuilder_confirm_email_listener", schema = "ccm_core")
public class ConfirmEmailListener
extends ProcessListener
implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmRedirectListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmRedirectListener.java
index 1baff323d..044635fac 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmRedirectListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/ConfirmRedirectListener.java
@@ -17,7 +17,7 @@ import org.libreccm.formbuilder.ProcessListener;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_confirm_redirect_listeners")
+@Table(name = "formbuilder_confirm_redirect_listeners", schema = "ccm_core")
public class ConfirmRedirectListener
extends ProcessListener
implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/RemoteServerPostListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/RemoteServerPostListener.java
index 734123d49..6ee044b01 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/RemoteServerPostListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/RemoteServerPostListener.java
@@ -16,7 +16,7 @@ import org.libreccm.formbuilder.ProcessListener;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_remote_server_post_listener")
+@Table(name = "formbuilder_remote_server_post_listener", schema = "ccm_core")
public class RemoteServerPostListener
extends ProcessListener
implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/SimpleEmailListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/SimpleEmailListener.java
index 4a1cc9482..2c1cc139b 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/SimpleEmailListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/SimpleEmailListener.java
@@ -20,7 +20,7 @@ import java.util.Objects;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_simple_email_listeners")
+@Table(name = "formbuilder_simple_email_listeners", schema = "ccm_core")
public class SimpleEmailListener
extends ProcessListener
implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/TemplateEmailListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/TemplateEmailListener.java
index f00da49f5..af449b5a9 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/TemplateEmailListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/TemplateEmailListener.java
@@ -18,7 +18,7 @@ import org.libreccm.formbuilder.ProcessListener;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_template_email_listeners")
+@Table(name = "formbuilder_template_email_listeners", schema = "ccm_core")
public class TemplateEmailListener
extends ProcessListener
implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/XmlEmailListener.java b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/XmlEmailListener.java
index 60c410c54..d00eab102 100644
--- a/ccm-core/src/main/java/org/libreccm/formbuilder/actions/XmlEmailListener.java
+++ b/ccm-core/src/main/java/org/libreccm/formbuilder/actions/XmlEmailListener.java
@@ -17,7 +17,7 @@ import org.libreccm.formbuilder.ProcessListener;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "formbuilder_xml_email_listeners")
+@Table(name = "formbuilder_xml_email_listeners", schema = "ccm_core")
public class XmlEmailListener extends ProcessListener implements Serializable {
private static final long serialVersionUID = -4607965414018004925L;
diff --git a/ccm-core/src/main/java/org/libreccm/messaging/Attachment.java b/ccm-core/src/main/java/org/libreccm/messaging/Attachment.java
index 19e7b3562..10933f807 100644
--- a/ccm-core/src/main/java/org/libreccm/messaging/Attachment.java
+++ b/ccm-core/src/main/java/org/libreccm/messaging/Attachment.java
@@ -41,7 +41,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "attachments")
+@Table(name = "attachments", schema = "ccm_core")
public class Attachment implements Serializable {
private static final long serialVersionUID = 2063934721452863106L;
diff --git a/ccm-core/src/main/java/org/libreccm/messaging/Message.java b/ccm-core/src/main/java/org/libreccm/messaging/Message.java
index cc5c7700b..6e7e77caa 100644
--- a/ccm-core/src/main/java/org/libreccm/messaging/Message.java
+++ b/ccm-core/src/main/java/org/libreccm/messaging/Message.java
@@ -45,7 +45,7 @@ import javax.persistence.TemporalType;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "messages")
+@Table(name = "messages", schema = "ccm_core")
//Can't reduce complexity yet
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/messaging/MessageThread.java b/ccm-core/src/main/java/org/libreccm/messaging/MessageThread.java
index d8fc29d09..7d810663d 100644
--- a/ccm-core/src/main/java/org/libreccm/messaging/MessageThread.java
+++ b/ccm-core/src/main/java/org/libreccm/messaging/MessageThread.java
@@ -33,7 +33,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "threads")
+@Table(name = "threads", schema = "ccm_core")
public class MessageThread extends CcmObject implements Serializable {
private static final long serialVersionUID = -395123286904985770L;
diff --git a/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java b/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java
index 844684b47..0df42541d 100644
--- a/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java
+++ b/ccm-core/src/main/java/org/libreccm/modules/ModuleManager.java
@@ -18,6 +18,11 @@
*/
package org.libreccm.modules;
+import com.arsdigita.runtime.RegistryConfig;
+
+import java.util.Arrays;
+import java.util.List;
+
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
@@ -28,10 +33,62 @@ import javax.inject.Inject;
*/
@ApplicationScoped
public class ModuleManager {
-
+
@Inject
private transient Instance modules;
-
-
-
+
+ /**
+ * Checks for new or upgraded modules and executes database migrations if
+ * necessary. If a new module is installed the database tables for this
+ * module are generated first. After that the {@code prepare()} method of
+ * the module is called (see {@link ModuleDescriptor#prepare()}).
+ */
+ public void loadModules() {
+
+ }
+
+ /**
+ * Checks if a module is already installed.
+ *
+ * @param moduleDescriptor The descriptor of the module.
+ *
+ * @return {@code true} if the module is already installed, {@code false}
+ * otherwise.
+ */
+ private boolean isInstalled(final ModuleDescriptor moduleDescriptor) {
+ final RegistryConfig registryConfig = new RegistryConfig();
+ registryConfig.load();
+ final String[] packages = registryConfig.getPackages();
+ final List packageList = Arrays.asList(packages);
+
+ return packageList.contains(ModuleUtil.getModuleName(moduleDescriptor));
+ }
+
+ /**
+ * Called to uninstall a module. First the {@code uninstal()} method of the
+ * module is called (see {@link ModuleDescriptor#uninstall()}). After that
+ * the database tables of the module are removed.
+ *
+ * @param module The module to uninstall.
+ */
+ public void uninstallModule(final ModuleDescriptor module) {
+
+ }
+
+ /**
+ * Initialises all modules by calling their {@code init()} method (see
+ * {@link ModuleDescriptor#init()}.
+ */
+ public void initModules() {
+
+ }
+
+ /**
+ * Shutdown all modules by calling their {@link shutdown()} method (see
+ * {@link ModuleDescriptor#shutdown()}).
+ */
+ public void shutdownModules() {
+
+ }
+
}
diff --git a/ccm-core/src/main/java/org/libreccm/notification/Digest.java b/ccm-core/src/main/java/org/libreccm/notification/Digest.java
index f8d13f6f2..39e3a239c 100644
--- a/ccm-core/src/main/java/org/libreccm/notification/Digest.java
+++ b/ccm-core/src/main/java/org/libreccm/notification/Digest.java
@@ -46,7 +46,7 @@ import javax.persistence.TemporalType;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "digests")
+@Table(name = "digests", schema = "ccm_core")
//Can't reduce complexity yet
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/notification/Notification.java b/ccm-core/src/main/java/org/libreccm/notification/Notification.java
index 0b4322e79..eedcae40a 100644
--- a/ccm-core/src/main/java/org/libreccm/notification/Notification.java
+++ b/ccm-core/src/main/java/org/libreccm/notification/Notification.java
@@ -67,7 +67,7 @@ import javax.persistence.TemporalType;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "notifications")
+@Table(name = "notifications", schema = "ccm_core")
//Can't reduce complexity yet. Not sure what to do about the God class warning.
//Maybe we have to put some of the properties into an extra class.
@SuppressWarnings({"PMD.CyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/notification/QueueItem.java b/ccm-core/src/main/java/org/libreccm/notification/QueueItem.java
index 12c4125d9..7fccb6319 100644
--- a/ccm-core/src/main/java/org/libreccm/notification/QueueItem.java
+++ b/ccm-core/src/main/java/org/libreccm/notification/QueueItem.java
@@ -44,7 +44,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "queue_items")
+@Table(name = "queue_items", schema = "ccm_core")
//Can't reduce complexity yet
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/portal/Portal.java b/ccm-core/src/main/java/org/libreccm/portal/Portal.java
index 9b7678d0e..44fb97769 100644
--- a/ccm-core/src/main/java/org/libreccm/portal/Portal.java
+++ b/ccm-core/src/main/java/org/libreccm/portal/Portal.java
@@ -35,7 +35,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "portals")
+@Table(name = "portals", schema = "ccm_core")
public class Portal extends Resource implements Serializable {
private static final long serialVersionUID = -5492307663469206053L;
diff --git a/ccm-core/src/main/java/org/libreccm/portal/Portlet.java b/ccm-core/src/main/java/org/libreccm/portal/Portlet.java
index 4f69e1fa1..e4a61ad17 100644
--- a/ccm-core/src/main/java/org/libreccm/portal/Portlet.java
+++ b/ccm-core/src/main/java/org/libreccm/portal/Portlet.java
@@ -35,7 +35,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "portlets")
+@Table(name = "portlets", schema = "ccm_core")
public class Portlet extends Resource implements Serializable {
private static final long serialVersionUID = -5718126018588744104L;
diff --git a/ccm-core/src/main/java/org/libreccm/runtime/Initalizer.java b/ccm-core/src/main/java/org/libreccm/runtime/Initalizer.java
index d6ca77d2d..c072b8a8f 100644
--- a/ccm-core/src/main/java/org/libreccm/runtime/Initalizer.java
+++ b/ccm-core/src/main/java/org/libreccm/runtime/Initalizer.java
@@ -39,7 +39,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "inits")
+@Table(name = "inits", schema = "ccm_core")
public class Initalizer implements Serializable {
private static final long serialVersionUID = 9150623897315380159L;
diff --git a/ccm-core/src/main/java/org/libreccm/search/lucene/Document.java b/ccm-core/src/main/java/org/libreccm/search/lucene/Document.java
index 0e4cfb2ac..45efcd969 100644
--- a/ccm-core/src/main/java/org/libreccm/search/lucene/Document.java
+++ b/ccm-core/src/main/java/org/libreccm/search/lucene/Document.java
@@ -41,7 +41,7 @@ import javax.persistence.TemporalType;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "lucene_documents")
+@Table(name = "lucene_documents", schema = "ccm_core")
//Can't reduce complexity yet. Not sure what to do about the God class warning.
//Maybe we have to put some of the properties into an extra class.
@SuppressWarnings({"PMD.CyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/search/lucene/Index.java b/ccm-core/src/main/java/org/libreccm/search/lucene/Index.java
index ba71de586..8fac4945e 100644
--- a/ccm-core/src/main/java/org/libreccm/search/lucene/Index.java
+++ b/ccm-core/src/main/java/org/libreccm/search/lucene/Index.java
@@ -37,7 +37,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "lucene_indexes")
+@Table(name = "lucene_indexes", schema = "ccm_core")
public class Index implements Serializable {
private static final long serialVersionUID = 3197625173477366719L;
diff --git a/ccm-core/src/main/java/org/libreccm/web/Application.java b/ccm-core/src/main/java/org/libreccm/web/Application.java
index d898679a2..21b238ce0 100644
--- a/ccm-core/src/main/java/org/libreccm/web/Application.java
+++ b/ccm-core/src/main/java/org/libreccm/web/Application.java
@@ -49,7 +49,7 @@ import javax.xml.bind.annotation.XmlRootElement;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "applications")
+@Table(name = "applications", schema = "ccm_core")
@XmlRootElement(name = "application", namespace = WEB_XML_NS)
public class Application extends Resource implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java b/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java
index 1947f2e2f..a569f8517 100644
--- a/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java
+++ b/ccm-core/src/main/java/org/libreccm/web/ApplicationType.java
@@ -39,7 +39,7 @@ import org.libreccm.core.ResourceType;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "application_types")
+@Table(name = "application_types", schema = "ccm_core")
@SuppressWarnings("PMD.LongVariable")
public class ApplicationType extends ResourceType implements Serializable {
diff --git a/ccm-core/src/main/java/org/libreccm/web/Host.java b/ccm-core/src/main/java/org/libreccm/web/Host.java
index d64583d93..311f1255c 100644
--- a/ccm-core/src/main/java/org/libreccm/web/Host.java
+++ b/ccm-core/src/main/java/org/libreccm/web/Host.java
@@ -34,7 +34,7 @@ import javax.persistence.UniqueConstraint;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "hosts",
+@Table(name = "hosts", schema = "ccm_core",
uniqueConstraints = {
@UniqueConstraint(columnNames = {"server_name", "server_port"})})
@SuppressWarnings("PMD.ShortClassName") //Host is perfectly fine as class name...
@@ -114,10 +114,10 @@ public class Host implements Serializable {
@Override
public String toString() {
return String.format("%s{ "
- + "hostId = %d, "
- + "serverName = \"%s\", "
- + "serverPort =\"%s\""
- + " }",
+ + "hostId = %d, "
+ + "serverName = \"%s\", "
+ + "serverPort =\"%s\""
+ + " }",
super.toString(),
hostId,
serverName,
diff --git a/ccm-core/src/main/java/org/libreccm/workflow/Task.java b/ccm-core/src/main/java/org/libreccm/workflow/Task.java
index 2bfd45ea3..76afb28f5 100644
--- a/ccm-core/src/main/java/org/libreccm/workflow/Task.java
+++ b/ccm-core/src/main/java/org/libreccm/workflow/Task.java
@@ -48,7 +48,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "workflow_tasks")
+@Table(name = "workflow_tasks", schema = "ccm_core")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
//Can't reduce complexity yet, Task is a fine name
@SuppressWarnings({"PMD.CyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java b/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java
index 972adbec4..b64c052a2 100644
--- a/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java
+++ b/ccm-core/src/main/java/org/libreccm/workflow/UserTask.java
@@ -43,7 +43,7 @@ import javax.persistence.TemporalType;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "workflow_user_tasks")
+@Table(name = "workflow_user_tasks", schema = "ccm_core")
//Can't reduce complexity yet
@SuppressWarnings({"PMD.CyclomaticComplexity",
"PMD.StdCyclomaticComplexity",
diff --git a/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java b/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java
index d2d7948a9..f7f48ac82 100644
--- a/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java
+++ b/ccm-core/src/main/java/org/libreccm/workflow/Workflow.java
@@ -43,7 +43,7 @@ import javax.persistence.Table;
* @author Jens Pelzetter
*/
@Entity
-@Table(name = "workflows")
+@Table(name = "workflows", schema = "ccm_core")
public class Workflow implements Serializable {
private static final long serialVersionUID = 4322500264543325829L;
diff --git a/ccm-core/src/main/resources/META-INF/persistence.xml b/ccm-core/src/main/resources/META-INF/persistence.xml
index dc0ea24b5..7a632f53d 100644
--- a/ccm-core/src/main/resources/META-INF/persistence.xml
+++ b/ccm-core/src/main/resources/META-INF/persistence.xml
@@ -20,7 +20,7 @@
org.hibernate.jpa.HibernatePersistenceProvider
- java:/comp/env/jdbc/website_study_tool/db
+ java:/comp/env/jdbc/ccm-core/db
diff --git a/ccm-core/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator b/ccm-core/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
new file mode 100644
index 000000000..c5ee23bd2
--- /dev/null
+++ b/ccm-core/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator
@@ -0,0 +1 @@
+org.libreccm.core.modules.CcmIntegrator
\ No newline at end of file
diff --git a/ccm-core/src/main/resources/META-INF/services/org.libreccm.core.modules.CcmModule b/ccm-core/src/main/resources/META-INF/services/org.libreccm.core.modules.CcmModule
new file mode 100644
index 000000000..f00cf087a
--- /dev/null
+++ b/ccm-core/src/main/resources/META-INF/services/org.libreccm.core.modules.CcmModule
@@ -0,0 +1 @@
+org.libreccm.core.CcmCore
\ No newline at end of file
diff --git a/ccm-core/src/main/resources/module-info/org.libreccm.core.CcmCore.properties b/ccm-core/src/main/resources/module-info/org.libreccm.core.CcmCore.properties
new file mode 100644
index 000000000..4d28ad9cc
--- /dev/null
+++ b/ccm-core/src/main/resources/module-info/org.libreccm.core.CcmCore.properties
@@ -0,0 +1,4 @@
+groupId=${project.groupId}
+artifactId=${project.artifactId}
+version=${project.version}
+build.date=${timestamp}
\ No newline at end of file
diff --git a/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java
index 53134f2ac..01dd14790 100644
--- a/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java
+++ b/ccm-core/src/test/java/org/libreccm/core/CcmObjectRepositoryTest.java
@@ -18,15 +18,19 @@
*/
package org.libreccm.core;
+import org.dbunit.database.DatabaseConnection;
+
import static org.hamcrest.CoreMatchers.*;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.ShouldThrowException;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.junit.InSequence;
+import org.jboss.arquillian.persistence.CreateSchema;
import org.jboss.arquillian.persistence.PersistenceTest;
import org.jboss.arquillian.persistence.ShouldMatchDataSet;
import org.jboss.arquillian.persistence.UsingDataSet;
+import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.arquillian.transaction.api.annotation.TransactionMode;
import org.jboss.arquillian.transaction.api.annotation.Transactional;
import org.jboss.shrinkwrap.api.ShrinkWrap;
@@ -60,6 +64,7 @@ import static org.junit.Assert.*;
@RunWith(Arquillian.class)
@PersistenceTest
@Transactional(TransactionMode.COMMIT)
+//@CreateSchema({"scripts/create_ccm_core_schema.sql"})
public class CcmObjectRepositoryTest {
@Inject
diff --git a/ccm-core/src/test/java/org/libreccm/core/DatasetsTest.java b/ccm-core/src/test/java/org/libreccm/core/DatasetsTest.java
index f95da019f..f0371866a 100644
--- a/ccm-core/src/test/java/org/libreccm/core/DatasetsTest.java
+++ b/ccm-core/src/test/java/org/libreccm/core/DatasetsTest.java
@@ -81,6 +81,11 @@ public class DatasetsTest extends DatasetsVerifier {
super(datasetPath);
}
+ @Override
+ public String[] getSchemas() {
+ return new String[]{ "ccm_core" };
+ }
+
@BeforeClass
public static void setUpClass() {
}
diff --git a/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerValidateVersionTest.java b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerValidateVersionTest.java
new file mode 100644
index 000000000..acbaa845b
--- /dev/null
+++ b/ccm-core/src/test/java/org/libreccm/modules/dependencytree/DependencyTreeManagerValidateVersionTest.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2015 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.libreccm.modules.dependencytree;
+
+import static org.hamcrest.Matchers.*;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.libreccm.tests.categories.UnitTest;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@Category(UnitTest.class)
+public class DependencyTreeManagerValidateVersionTest {
+
+ public DependencyTreeManagerValidateVersionTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() {
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ }
+
+ @Before
+ public void setUp() {
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void validateVersions() throws NoSuchMethodException,
+ IllegalAccessException,
+ IllegalArgumentException,
+ InvocationTargetException {
+ final DependencyTreeManager treeManager = new DependencyTreeManager();
+ final Method validate = treeManager.getClass().getDeclaredMethod(
+ "validateVersion",
+ String.class,
+ String.class,
+ String.class);
+
+ validate.setAccessible(true);
+
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ "1.0.0",
+ "1.0.0"),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ "1.0.0",
+ ""),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ "1.0.0",
+ null),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ "",
+ "1.0.0"),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ null,
+ "1.0.0"),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ "",
+ ""),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.0.0",
+ null,
+ null),
+ is(true));
+
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.7.5",
+ "1.0.0",
+ ""),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.7.5-beta.3",
+ "1.0.0",
+ ""),
+ is(true));
+
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.7.5",
+ "1.0.0",
+ "1.7.9"),
+ is(true));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.7.5-final",
+ "1.7.5",
+ ""),
+ is(true));
+
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.5.3",
+ "1.6.0",
+ ""),
+ is(false));
+ assertThat((boolean) validate.invoke(treeManager,
+ "1.6.0",
+ "1.5.0",
+ "1.5.9"),
+ is(false));
+ }
+
+}
diff --git a/ccm-core/src/test/resources-wildfly8-embedded/arquillian.xml b/ccm-core/src/test/resources-wildfly8-embedded/arquillian.xml
index 3cde70c3f..3247245dc 100644
--- a/ccm-core/src/test/resources-wildfly8-embedded/arquillian.xml
+++ b/ccm-core/src/test/resources-wildfly8-embedded/arquillian.xml
@@ -28,11 +28,12 @@
json
org.dbunit.ext.h2.H2DataTypeFactory
true
+ true
-
+
\ No newline at end of file
diff --git a/ccm-core/src/test/resources-wildfly8-embedded/scripts/create_ccm_core_schema.sql b/ccm-core/src/test/resources-wildfly8-embedded/scripts/create_ccm_core_schema.sql
new file mode 100644
index 000000000..24b858520
--- /dev/null
+++ b/ccm-core/src/test/resources-wildfly8-embedded/scripts/create_ccm_core_schema.sql
@@ -0,0 +1,1067 @@
+create schema ccm_core;
+
+ create table ccm_core.application_types (
+ resource_type_id bigint not null,
+ container_group_id bigint,
+ provider_app_type_id bigint,
+ primary key (resource_type_id)
+ );
+
+ create table ccm_core.applications (
+ primary_url varchar(1024) not null,
+ object_id bigint not null,
+ container_group_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.attachments (
+ message_id bigint not null,
+ attachment_data blob,
+ description varchar(255),
+ mime_type varchar(255),
+ title varchar(255),
+ primary key (message_id)
+ );
+
+ create table ccm_core.categories (
+ abstract_category boolean,
+ category_order bigint,
+ enabled boolean,
+ name varchar(255) not null,
+ unique_id varchar(255) not null,
+ visible boolean,
+ object_id bigint not null,
+ parent_category_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.categorizations (
+ categorization_id bigint not null,
+ category_order bigint,
+ category_index boolean,
+ object_order bigint,
+ object_id bigint,
+ category_id bigint,
+ primary key (categorization_id)
+ );
+
+ create table ccm_core.category_descriptions (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.category_domains (
+ domain_key varchar(255) not null,
+ released timestamp,
+ uri varchar(2048) not null,
+ version varchar(255) not null,
+ object_id bigint not null,
+ root_category_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.category_titles (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.ccm_groups (
+ name varchar(512) not null,
+ subject_id bigint not null,
+ primary key (subject_id)
+ );
+
+ create table ccm_core.ccm_objects (
+ object_id bigint not null,
+ display_name varchar(255),
+ primary key (object_id)
+ );
+
+ create table ccm_core.ccm_privileges (
+ privilege_id bigint not null,
+ label varchar(255) not null,
+ relevant_privilege_id bigint,
+ primary key (privilege_id)
+ );
+
+ create table ccm_core.ccm_revisions (
+ id integer not null,
+ timestamp bigint not null,
+ user_name varchar(255),
+ primary key (id)
+ );
+
+ create table ccm_core.ccm_roles (
+ role_id bigint not null,
+ description varchar(255),
+ name varchar(512),
+ implicit_group_id bigint,
+ source_group_id bigint,
+ primary key (role_id)
+ );
+
+ create table ccm_core.ccm_users (
+ banned boolean,
+ hash_algorithm varchar(64),
+ family_name varchar(512),
+ given_name varchar(512),
+ middle_name varchar(512),
+ title_post varchar(512),
+ title_pre varchar(512),
+ password varchar(2048),
+ password_answer varchar(2048),
+ password_question varchar(2048),
+ password_reset_required boolean,
+ salt varchar(2048),
+ screen_name varchar(255) not null,
+ sso_login varchar(512),
+ subject_id bigint not null,
+ primary key (subject_id)
+ );
+
+ create table ccm_core.digests (
+ frequency integer,
+ header varchar(4096) not null,
+ next_run timestamp,
+ separator varchar(128) not null,
+ signature varchar(4096) not null,
+ subject varchar(255) not null,
+ object_id bigint not null,
+ from_party_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.domain_descriptions (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.domain_ownerships (
+ ownership_id bigint not null,
+ context varchar(255),
+ domain_order bigint,
+ owner_order bigint,
+ domain_object_id bigint not null,
+ owner_object_id bigint not null,
+ primary key (ownership_id)
+ );
+
+ create table ccm_core.domain_titles (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.formbuilder_components (
+ active boolean,
+ admin_name varchar(255),
+ attribute_string varchar(255),
+ component_order bigint,
+ selected boolean,
+ object_id bigint not null,
+ parentComponent_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_confirm_email_listener (
+ body clob,
+ from_email varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_confirm_redirect_listeners (
+ url varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_data_driven_selects (
+ multiple boolean,
+ query varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_data_queries (
+ query_id varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_formsections (
+ formsection_action varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_listeners (
+ attribute_string varchar(255),
+ class_name varchar(255),
+ object_id bigint not null,
+ widget_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_metaobjects (
+ class_name varchar(255),
+ pretty_name varchar(255),
+ pretty_plural varchar(255),
+ properties_form varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_object_types (
+ app_name varchar(255),
+ class_name varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_options (
+ parameter_value varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_process_listeners (
+ listener_class varchar(255),
+ process_listener_order bigint,
+ object_id bigint not null,
+ formSection_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_remote_server_post_listener (
+ remoteUrl varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_simple_email_listeners (
+ recipient varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_template_email_listeners (
+ body clob,
+ recipient varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_widget_labels (
+ object_id bigint not null,
+ widget_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_widgets (
+ default_value varchar(255),
+ parameter_model varchar(255),
+ parameter_name varchar(255),
+ object_id bigint not null,
+ label_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_xml_email_listeners (
+ recipient varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.group_memberships (
+ membership_id bigint not null,
+ group_subject_id bigint,
+ user_subject_id bigint,
+ primary key (membership_id)
+ );
+
+ create table ccm_core.hosts (
+ host_id bigint not null,
+ server_name varchar(512),
+ server_port bigint,
+ primary key (host_id)
+ );
+
+ create table ccm_core.inits (
+ initializer_id bigint not null,
+ class_name varchar(255),
+ required_by_id bigint,
+ primary key (initializer_id)
+ );
+
+ create table ccm_core.lucene_documents (
+ document_id bigint not null,
+ content clob,
+ content_section varchar(512),
+ country varchar(8),
+ created timestamp,
+ dirty bigint,
+ document_language varchar(8),
+ last_modified timestamp,
+ summary varchar(4096),
+ document_timestamp timestamp,
+ title varchar(4096),
+ type varchar(255),
+ type_specific_info varchar(512),
+ created_by_party_id bigint,
+ last_modified_by bigint,
+ primary key (document_id)
+ );
+
+ create table ccm_core.lucene_indexes (
+ index_id bigint not null,
+ lucene_index_id bigint,
+ host_id bigint,
+ primary key (index_id)
+ );
+
+ create table ccm_core.messages (
+ body varchar(255),
+ body_mime_type varchar(255),
+ sent timestamp,
+ subject varchar(255),
+ object_id bigint not null,
+ in_reply_to_id bigint,
+ sender_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.notifications (
+ expand_group boolean,
+ expunge boolean,
+ expunge_message boolean,
+ fulfill_date timestamp,
+ header varchar(4096),
+ max_retries bigint,
+ request_date timestamp,
+ signature varchar(4096),
+ status varchar(32),
+ object_id bigint not null,
+ digest_id bigint,
+ message_id bigint,
+ receiver_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.permissions (
+ permission_id bigint not null,
+ creation_date timestamp,
+ creation_ip varchar(255),
+ creation_user_id bigint,
+ granted_privilege_id bigint,
+ grantee_id bigint,
+ object_id bigint,
+ primary key (permission_id)
+ );
+
+ create table ccm_core.portals (
+ template boolean,
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.portlets (
+ cell_number bigint,
+ sort_key bigint,
+ object_id bigint not null,
+ portal_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.queue_items (
+ queue_item_id bigint not null,
+ header varchar(4096),
+ receiver_address varchar(512),
+ retry_count bigint,
+ signature varchar(4096),
+ successful_sended boolean,
+ message_id bigint,
+ receiver_id bigint,
+ primary key (queue_item_id)
+ );
+
+ create table ccm_core.resource_descriptions (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.resource_titles (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.resource_type_descriptions (
+ resource_type_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (resource_type_id, locale)
+ );
+
+ create table ccm_core.resource_types (
+ resource_type_id bigint not null,
+ singleton boolean,
+ title varchar(254) not null,
+ embedded_view boolean,
+ full_page_view boolean,
+ workspace_app boolean,
+ primary key (resource_type_id)
+ );
+
+ create table ccm_core.resources (
+ created timestamp,
+ object_id bigint not null,
+ parent_object_id bigint,
+ resourceType_resource_type_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.subjects (
+ subject_id bigint not null,
+ primary key (subject_id)
+ );
+
+ create table ccm_core.threads (
+ object_id bigint not null,
+ root_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.user_email_addresses (
+ user_id bigint not null,
+ email_address varchar(512) not null,
+ bouncing boolean,
+ verified boolean
+ );
+
+ create table ccm_core.workflow_tasks (
+ task_id bigint not null,
+ active boolean,
+ task_state varchar(512),
+ workflow_id bigint,
+ primary key (task_id)
+ );
+
+ create table ccm_core.workflow_user_tasks (
+ task_id bigint not null,
+ active boolean,
+ task_state varchar(512),
+ workflow_id bigint,
+ due_date timestamp,
+ duration_minutes bigint,
+ locked boolean,
+ start_date timestamp,
+ locking_user_id bigint,
+ notification_sender bigint,
+ primary key (task_id)
+ );
+
+ create table ccm_core.workflows (
+ workflow_id bigint not null,
+ primary key (workflow_id)
+ );
+
+ create table formbuilder_component_descriptions (
+ component_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (component_id, locale)
+ );
+
+ create table formbuilder_data_query_descriptions (
+ data_query_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (data_query_id, locale)
+ );
+
+ create table formbuilder_data_query_names (
+ data_query_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (data_query_id, locale)
+ );
+
+ create table formbuilder_option_labels (
+ option_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (option_id, locale)
+ );
+
+ create table formbuilder_process_listener_descriptions (
+ process_listener_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (process_listener_id, locale)
+ );
+
+ create table formbuilder_process_listener_names (
+ process_listener_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (process_listener_id, locale)
+ );
+
+ create table workflow_descriptions (
+ workflow_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (workflow_id, locale)
+ );
+
+ create table workflow_names (
+ workflow_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (workflow_id, locale)
+ );
+
+ create table workflow_task_comments (
+ task_id bigint not null,
+ comment clob
+ );
+
+ create table workflow_task_dependencies (
+ depends_on_task_id bigint not null,
+ dependent_task_id bigint not null
+ );
+
+ create table workflow_task_labels (
+ task_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (task_id, locale)
+ );
+
+ create table workflow_tasks_descriptions (
+ task_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (task_id, locale)
+ );
+
+ create table workflow_user_task_assigned_groups (
+ user_task_id bigint not null,
+ assigned_group_id bigint not null
+ );
+
+ create table workflow_user_task_assigned_users (
+ user_task_id bigint not null,
+ assigned_user_id bigint not null
+ );
+
+ alter table ccm_core.category_domains
+ add constraint UK_mrgij5fr1sglxyab9ryl1vx37 unique (domain_key);
+
+ alter table ccm_core.category_domains
+ add constraint UK_a9hmskgn6yfbw134mvjy9ixak unique (uri);
+
+ alter table ccm_core.ccm_groups
+ add constraint UK_9142ut4o9kwqmqjgqynl4xvc6 unique (name);
+
+ alter table ccm_core.ccm_privileges
+ add constraint UK_ir9u47mfn3qds0toon7n5hlai unique (label);
+
+ alter table ccm_core.ccm_users
+ add constraint UK_3oj1rsneufkapevq9f32y4el0 unique (screen_name);
+
+ alter table ccm_core.hosts
+ add constraint UK_2m0m4m0dhx256d04x2cg3194s unique (server_name, server_port);
+
+ alter table workflow_user_task_assigned_groups
+ add constraint UK_g58x45aybw2yjtwnr9b9itg6c unique (assigned_group_id);
+
+ alter table workflow_user_task_assigned_users
+ add constraint UK_h62r6cqjp2tdnhscfkgwfupwj unique (assigned_user_id);
+
+ alter table ccm_core.application_types
+ add constraint FK_r9rd4iekfy3m8r1a1gto4t39
+ foreign key (container_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.application_types
+ add constraint FK_i44k6al7mr4u1c76iudglds39
+ foreign key (provider_app_type_id)
+ references ccm_core.application_types;
+
+ alter table ccm_core.application_types
+ add constraint FK_41e4vrshljdkymnhb4cbkroa1
+ foreign key (resource_type_id)
+ references ccm_core.resource_types;
+
+ alter table ccm_core.applications
+ add constraint FK_kr3wur06hmironiamv0rn38nu
+ foreign key (container_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.applications
+ add constraint FK_18qjyi037fk2lnx6t9fwljmx0
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.attachments
+ add constraint FK_r3hibvgfo1dmawqig8c563xau
+ foreign key (message_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.categories
+ add constraint FK_hfr9rd0rv1jv730afoi2n0qb7
+ foreign key (parent_category_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.categories
+ add constraint FK_hct54n9h1moa76f44g6cw3lpc
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.categorizations
+ add constraint FK_2xymec7oxsvoflm4pyw03qxrw
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.categorizations
+ add constraint FK_spxdunplw881gx7ay4rcuueht
+ foreign key (category_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.category_descriptions
+ add constraint FK_gvqskqclt5nsi6x87163ydldr
+ foreign key (object_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.category_domains
+ add constraint FK_kh4n7uqv126lb1upk45giadxu
+ foreign key (root_category_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.category_domains
+ add constraint FK_irk58v7vtdgx0bfh8yarl5pte
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.category_titles
+ add constraint FK_ygak8bqmh94jjtgs6vg945rd
+ foreign key (object_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.ccm_groups
+ add constraint FK_7a2nhf8gj3lns0preesnlok8o
+ foreign key (subject_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.ccm_privileges
+ add constraint FK_g06a7mpltqti17tvibm2j7ti8
+ foreign key (relevant_privilege_id)
+ references ccm_core.application_types;
+
+ alter table ccm_core.ccm_roles
+ add constraint FK_ice2oswni34d2xx80cf81v2cv
+ foreign key (implicit_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.ccm_roles
+ add constraint FK_kbq9nkjwsvvkt6db59v2c1eb2
+ foreign key (source_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.ccm_users
+ add constraint FK_i9x5hcjowqc0aygna4wte5447
+ foreign key (subject_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.digests
+ add constraint FK_riucjho1m4x84l528d4b0xexh
+ foreign key (from_party_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.digests
+ add constraint FK_jslyikag80b9qhvvg4ui3r6li
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.domain_descriptions
+ add constraint FK_anq6lql9qv1wov2hoq59i9pfs
+ foreign key (object_id)
+ references ccm_core.category_domains;
+
+ alter table ccm_core.domain_ownerships
+ add constraint FK_nvdejc0jxmru3ax7v0su83wi7
+ foreign key (domain_object_id)
+ references ccm_core.category_domains;
+
+ alter table ccm_core.domain_ownerships
+ add constraint FK_jiilo1lcqv8g7b16cviqhnepy
+ foreign key (owner_object_id)
+ references ccm_core.applications;
+
+ alter table ccm_core.domain_titles
+ add constraint FK_p3w39o4hwcppwotw8ndjey6sl
+ foreign key (object_id)
+ references ccm_core.category_domains;
+
+ alter table ccm_core.formbuilder_components
+ add constraint FK_ompdvc6pul5xbhn5r2aqv7knb
+ foreign key (parentComponent_object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_components
+ add constraint FK_2fhckbkcdrahmp1pnnm5p12pf
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_confirm_email_listener
+ add constraint FK_t24egwvbo23ak7ga4cnsmn428
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_confirm_redirect_listeners
+ add constraint FK_7xtmk3ij9uj2f6nybhprm5eh0
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_data_driven_selects
+ add constraint FK_g0cfdd0rrt4akmibhdlejpb9u
+ foreign key (object_id)
+ references ccm_core.formbuilder_widgets;
+
+ alter table ccm_core.formbuilder_data_queries
+ add constraint FK_p2awj0f115oxg1re4nr7wgsvj
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_formsections
+ add constraint FK_endc2bmlb7orkk4l5x3fkmy2l
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_listeners
+ add constraint FK_fidonwyc6s36a51lilys791ot
+ foreign key (widget_object_id)
+ references ccm_core.formbuilder_widgets;
+
+ alter table ccm_core.formbuilder_listeners
+ add constraint FK_c0gkh6b1dsyp0xh1pvnd6tijr
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_metaobjects
+ add constraint FK_fn61u2xdqraclu9j0y2lxqqp8
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_object_types
+ add constraint FK_pvcmankfvwpvg0lqe6wio4rnc
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_options
+ add constraint FK_f7fgwaysg76tnx2xtfjnpt8a3
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_process_listeners
+ add constraint FK_8b4m881ppfw6m13clxu4cp1o0
+ foreign key (formSection_object_id)
+ references ccm_core.formbuilder_formsections;
+
+ alter table ccm_core.formbuilder_process_listeners
+ add constraint FK_a539g6h1xtndr87oov42wvdl4
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_remote_server_post_listener
+ add constraint FK_n4ymnx1dtjqedvta4e8hqfxpp
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_simple_email_listeners
+ add constraint FK_4phpnsgkmvblh5pgiej11aj9y
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_template_email_listeners
+ add constraint FK_cevp55p98seugf2368sc7yqqq
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_widget_labels
+ add constraint FK_tftgfd24vbwfhas20m20xt5e7
+ foreign key (widget_object_id)
+ references ccm_core.formbuilder_widgets;
+
+ alter table ccm_core.formbuilder_widget_labels
+ add constraint FK_isff794p53xtpr1261vet6nhn
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_widgets
+ add constraint FK_lv8wd5tad9t12m1qigj200hp2
+ foreign key (label_object_id)
+ references ccm_core.formbuilder_widget_labels;
+
+ alter table ccm_core.formbuilder_widgets
+ add constraint FK_rgbe1klt8ktw2okc5lfbp7nkl
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_xml_email_listeners
+ add constraint FK_n6fdsiv02im6d6wyj5l799uh2
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.group_memberships
+ add constraint FK_gg62l9f6d82rl3h57r03y1f6y
+ foreign key (group_subject_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.group_memberships
+ add constraint FK_qm940kapbbc0ywyhkwh06wg48
+ foreign key (user_subject_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.inits
+ add constraint FK_skqpgijaiv5idanah0e1hjoa
+ foreign key (required_by_id)
+ references ccm_core.inits;
+
+ alter table ccm_core.lucene_documents
+ add constraint FK_n421djw91ggdmvsglk8t6tvk1
+ foreign key (created_by_party_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.lucene_documents
+ add constraint FK_qa9tey3vy1xrpxkyqo9us25s3
+ foreign key (last_modified_by)
+ references ccm_core.subjects;
+
+ alter table ccm_core.lucene_indexes
+ add constraint FK_7dqbase0oyxl83byea4hfdake
+ foreign key (host_id)
+ references ccm_core.hosts;
+
+ alter table ccm_core.messages
+ add constraint FK_3l74b1gch8skj8t84emd65e3y
+ foreign key (in_reply_to_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.messages
+ add constraint FK_2tgrsfo79pwvrwk6lbdy32701
+ foreign key (sender_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.messages
+ add constraint FK_ipx9bvlxhd3q9aqs3kmq2kayc
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.notifications
+ add constraint FK_k88btnwbdswv5ef360xxp8cn1
+ foreign key (digest_id)
+ references ccm_core.digests;
+
+ alter table ccm_core.notifications
+ add constraint FK_fy4pjr1vlslocsi7d6vwku2yj
+ foreign key (message_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.notifications
+ add constraint FK_ajptmh33lr07i00e7j4pgheqe
+ foreign key (receiver_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.notifications
+ add constraint FK_s4xvw4ebw2tq41i0kex5pyo5k
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.permissions
+ add constraint FK_aqw7r1c62xehp58uxwojun8xq
+ foreign key (creation_user_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.permissions
+ add constraint FK_ilie616laommyrii7ecjbj521
+ foreign key (granted_privilege_id)
+ references ccm_core.ccm_privileges;
+
+ alter table ccm_core.permissions
+ add constraint FK_g94li5wexu57n0mosdks1abuv
+ foreign key (grantee_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.permissions
+ add constraint FK_r2p8pfvr7k5lth4bem2s0xqdv
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.portals
+ add constraint FK_mubhpxf8uf40wu2tc3ekkrqkc
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.portlets
+ add constraint FK_i6o1tgre6iuc3yf7tk4jhmj6
+ foreign key (portal_id)
+ references ccm_core.portals;
+
+ alter table ccm_core.portlets
+ add constraint FK_hvqa10v1thdr4riwt2unryk1y
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.queue_items
+ add constraint FK_14jyt63f6cs84pangjcnphlps
+ foreign key (message_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.queue_items
+ add constraint FK_ojc2cc1yqd2htu88gxu16t11e
+ foreign key (receiver_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.resource_descriptions
+ add constraint FK_ayx5lyxreydtjbvdugoff7mox
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.resource_titles
+ add constraint FK_aer0mvcddder3150jlq0552nn
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.resource_type_descriptions
+ add constraint FK_fp5rutbl3lvv5c322l87ma0ae
+ foreign key (resource_type_id)
+ references ccm_core.resource_types;
+
+ alter table ccm_core.resources
+ add constraint FK_7bwjikili5hr55of80yvjlocc
+ foreign key (parent_object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.resources
+ add constraint FK_2o0qb7opah9rt9ww8ydvp7cxv
+ foreign key (resourceType_resource_type_id)
+ references ccm_core.resource_types;
+
+ alter table ccm_core.resources
+ add constraint FK_e6rvkh4kw8agtkvjqqdbiu0db
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.threads
+ add constraint FK_2d6ht9nsikaebakyppgtm8p2k
+ foreign key (root_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.threads
+ add constraint FK_jf5k6sucih0qp7l3ih2moeuha
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.user_email_addresses
+ add constraint FK_m0hymqadkrd9o5eixeurjpifx
+ foreign key (user_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.workflow_tasks
+ add constraint FK_mvuhbl6ikm44oxxtkv0s2y9iu
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table ccm_core.workflow_user_tasks
+ add constraint FK_5nryb3wmian7oqttwqpa3wwll
+ foreign key (locking_user_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.workflow_user_tasks
+ add constraint FK_s4tgjfnpvyhtpu0h4l72sht9g
+ foreign key (notification_sender)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.workflow_user_tasks
+ add constraint FK_4nmt8xkbfog6dhq2mpt8m3skf
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table formbuilder_component_descriptions
+ add constraint FK_miw32na0kj3r3vx0yd9nmacu3
+ foreign key (component_id)
+ references ccm_core.formbuilder_components;
+
+ alter table formbuilder_data_query_descriptions
+ add constraint FK_6vi3n0g1gfjrxd3vvlarrn584
+ foreign key (data_query_id)
+ references ccm_core.formbuilder_data_queries;
+
+ alter table formbuilder_data_query_names
+ add constraint FK_tgnk7hsrmtqxnhvfcefe936v9
+ foreign key (data_query_id)
+ references ccm_core.formbuilder_data_queries;
+
+ alter table formbuilder_option_labels
+ add constraint FK_e8fy2g61cd7qn8ar1t48g7p1m
+ foreign key (option_id)
+ references ccm_core.formbuilder_options;
+
+ alter table formbuilder_process_listener_descriptions
+ add constraint FK_p1e4ygtc3ke9r4gotkc5k8dmv
+ foreign key (process_listener_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table formbuilder_process_listener_names
+ add constraint FK_e3uy4vdqbely8oybcfc0ef7tn
+ foreign key (process_listener_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table workflow_descriptions
+ add constraint FK_7grengdpx5d99jkyjlsa3pe6k
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table workflow_names
+ add constraint FK_sjqjarc88yvdrw3yd6swg7uqs
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table workflow_user_task_assigned_groups
+ add constraint FK_g58x45aybw2yjtwnr9b9itg6c
+ foreign key (assigned_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table workflow_user_task_assigned_groups
+ add constraint FK_jiogatex4mifbgji1og4rri9o
+ foreign key (user_task_id)
+ references ccm_core.workflow_user_tasks;
+
+ alter table workflow_user_task_assigned_users
+ add constraint FK_h62r6cqjp2tdnhscfkgwfupwj
+ foreign key (assigned_user_id)
+ references ccm_core.ccm_users;
+
+ alter table workflow_user_task_assigned_users
+ add constraint FK_ltihq91dcigqixb6ulhkphrix
+ foreign key (user_task_id)
+ references ccm_core.workflow_user_tasks;
+
+ create sequence hibernate_sequence start with 1 increment by 1;
\ No newline at end of file
diff --git a/ccm-core/src/test/resources-wildfly8-remote-pgsql/arquillian.xml b/ccm-core/src/test/resources-wildfly8-remote-pgsql/arquillian.xml
index 0e221033e..af6b32bab 100644
--- a/ccm-core/src/test/resources-wildfly8-remote-pgsql/arquillian.xml
+++ b/ccm-core/src/test/resources-wildfly8-remote-pgsql/arquillian.xml
@@ -28,11 +28,12 @@
json
true
+ true
-
+
-
\ No newline at end of file
+
diff --git a/ccm-core/src/test/resources-wildfly8-remote-pgsql/scripts/create_ccm_core_schema.sql b/ccm-core/src/test/resources-wildfly8-remote-pgsql/scripts/create_ccm_core_schema.sql
new file mode 100644
index 000000000..24b858520
--- /dev/null
+++ b/ccm-core/src/test/resources-wildfly8-remote-pgsql/scripts/create_ccm_core_schema.sql
@@ -0,0 +1,1067 @@
+create schema ccm_core;
+
+ create table ccm_core.application_types (
+ resource_type_id bigint not null,
+ container_group_id bigint,
+ provider_app_type_id bigint,
+ primary key (resource_type_id)
+ );
+
+ create table ccm_core.applications (
+ primary_url varchar(1024) not null,
+ object_id bigint not null,
+ container_group_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.attachments (
+ message_id bigint not null,
+ attachment_data blob,
+ description varchar(255),
+ mime_type varchar(255),
+ title varchar(255),
+ primary key (message_id)
+ );
+
+ create table ccm_core.categories (
+ abstract_category boolean,
+ category_order bigint,
+ enabled boolean,
+ name varchar(255) not null,
+ unique_id varchar(255) not null,
+ visible boolean,
+ object_id bigint not null,
+ parent_category_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.categorizations (
+ categorization_id bigint not null,
+ category_order bigint,
+ category_index boolean,
+ object_order bigint,
+ object_id bigint,
+ category_id bigint,
+ primary key (categorization_id)
+ );
+
+ create table ccm_core.category_descriptions (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.category_domains (
+ domain_key varchar(255) not null,
+ released timestamp,
+ uri varchar(2048) not null,
+ version varchar(255) not null,
+ object_id bigint not null,
+ root_category_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.category_titles (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.ccm_groups (
+ name varchar(512) not null,
+ subject_id bigint not null,
+ primary key (subject_id)
+ );
+
+ create table ccm_core.ccm_objects (
+ object_id bigint not null,
+ display_name varchar(255),
+ primary key (object_id)
+ );
+
+ create table ccm_core.ccm_privileges (
+ privilege_id bigint not null,
+ label varchar(255) not null,
+ relevant_privilege_id bigint,
+ primary key (privilege_id)
+ );
+
+ create table ccm_core.ccm_revisions (
+ id integer not null,
+ timestamp bigint not null,
+ user_name varchar(255),
+ primary key (id)
+ );
+
+ create table ccm_core.ccm_roles (
+ role_id bigint not null,
+ description varchar(255),
+ name varchar(512),
+ implicit_group_id bigint,
+ source_group_id bigint,
+ primary key (role_id)
+ );
+
+ create table ccm_core.ccm_users (
+ banned boolean,
+ hash_algorithm varchar(64),
+ family_name varchar(512),
+ given_name varchar(512),
+ middle_name varchar(512),
+ title_post varchar(512),
+ title_pre varchar(512),
+ password varchar(2048),
+ password_answer varchar(2048),
+ password_question varchar(2048),
+ password_reset_required boolean,
+ salt varchar(2048),
+ screen_name varchar(255) not null,
+ sso_login varchar(512),
+ subject_id bigint not null,
+ primary key (subject_id)
+ );
+
+ create table ccm_core.digests (
+ frequency integer,
+ header varchar(4096) not null,
+ next_run timestamp,
+ separator varchar(128) not null,
+ signature varchar(4096) not null,
+ subject varchar(255) not null,
+ object_id bigint not null,
+ from_party_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.domain_descriptions (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.domain_ownerships (
+ ownership_id bigint not null,
+ context varchar(255),
+ domain_order bigint,
+ owner_order bigint,
+ domain_object_id bigint not null,
+ owner_object_id bigint not null,
+ primary key (ownership_id)
+ );
+
+ create table ccm_core.domain_titles (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.formbuilder_components (
+ active boolean,
+ admin_name varchar(255),
+ attribute_string varchar(255),
+ component_order bigint,
+ selected boolean,
+ object_id bigint not null,
+ parentComponent_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_confirm_email_listener (
+ body clob,
+ from_email varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_confirm_redirect_listeners (
+ url varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_data_driven_selects (
+ multiple boolean,
+ query varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_data_queries (
+ query_id varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_formsections (
+ formsection_action varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_listeners (
+ attribute_string varchar(255),
+ class_name varchar(255),
+ object_id bigint not null,
+ widget_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_metaobjects (
+ class_name varchar(255),
+ pretty_name varchar(255),
+ pretty_plural varchar(255),
+ properties_form varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_object_types (
+ app_name varchar(255),
+ class_name varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_options (
+ parameter_value varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_process_listeners (
+ listener_class varchar(255),
+ process_listener_order bigint,
+ object_id bigint not null,
+ formSection_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_remote_server_post_listener (
+ remoteUrl varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_simple_email_listeners (
+ recipient varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_template_email_listeners (
+ body clob,
+ recipient varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_widget_labels (
+ object_id bigint not null,
+ widget_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_widgets (
+ default_value varchar(255),
+ parameter_model varchar(255),
+ parameter_name varchar(255),
+ object_id bigint not null,
+ label_object_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.formbuilder_xml_email_listeners (
+ recipient varchar(255),
+ subject varchar(255),
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.group_memberships (
+ membership_id bigint not null,
+ group_subject_id bigint,
+ user_subject_id bigint,
+ primary key (membership_id)
+ );
+
+ create table ccm_core.hosts (
+ host_id bigint not null,
+ server_name varchar(512),
+ server_port bigint,
+ primary key (host_id)
+ );
+
+ create table ccm_core.inits (
+ initializer_id bigint not null,
+ class_name varchar(255),
+ required_by_id bigint,
+ primary key (initializer_id)
+ );
+
+ create table ccm_core.lucene_documents (
+ document_id bigint not null,
+ content clob,
+ content_section varchar(512),
+ country varchar(8),
+ created timestamp,
+ dirty bigint,
+ document_language varchar(8),
+ last_modified timestamp,
+ summary varchar(4096),
+ document_timestamp timestamp,
+ title varchar(4096),
+ type varchar(255),
+ type_specific_info varchar(512),
+ created_by_party_id bigint,
+ last_modified_by bigint,
+ primary key (document_id)
+ );
+
+ create table ccm_core.lucene_indexes (
+ index_id bigint not null,
+ lucene_index_id bigint,
+ host_id bigint,
+ primary key (index_id)
+ );
+
+ create table ccm_core.messages (
+ body varchar(255),
+ body_mime_type varchar(255),
+ sent timestamp,
+ subject varchar(255),
+ object_id bigint not null,
+ in_reply_to_id bigint,
+ sender_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.notifications (
+ expand_group boolean,
+ expunge boolean,
+ expunge_message boolean,
+ fulfill_date timestamp,
+ header varchar(4096),
+ max_retries bigint,
+ request_date timestamp,
+ signature varchar(4096),
+ status varchar(32),
+ object_id bigint not null,
+ digest_id bigint,
+ message_id bigint,
+ receiver_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.permissions (
+ permission_id bigint not null,
+ creation_date timestamp,
+ creation_ip varchar(255),
+ creation_user_id bigint,
+ granted_privilege_id bigint,
+ grantee_id bigint,
+ object_id bigint,
+ primary key (permission_id)
+ );
+
+ create table ccm_core.portals (
+ template boolean,
+ object_id bigint not null,
+ primary key (object_id)
+ );
+
+ create table ccm_core.portlets (
+ cell_number bigint,
+ sort_key bigint,
+ object_id bigint not null,
+ portal_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.queue_items (
+ queue_item_id bigint not null,
+ header varchar(4096),
+ receiver_address varchar(512),
+ retry_count bigint,
+ signature varchar(4096),
+ successful_sended boolean,
+ message_id bigint,
+ receiver_id bigint,
+ primary key (queue_item_id)
+ );
+
+ create table ccm_core.resource_descriptions (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.resource_titles (
+ object_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (object_id, locale)
+ );
+
+ create table ccm_core.resource_type_descriptions (
+ resource_type_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (resource_type_id, locale)
+ );
+
+ create table ccm_core.resource_types (
+ resource_type_id bigint not null,
+ singleton boolean,
+ title varchar(254) not null,
+ embedded_view boolean,
+ full_page_view boolean,
+ workspace_app boolean,
+ primary key (resource_type_id)
+ );
+
+ create table ccm_core.resources (
+ created timestamp,
+ object_id bigint not null,
+ parent_object_id bigint,
+ resourceType_resource_type_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.subjects (
+ subject_id bigint not null,
+ primary key (subject_id)
+ );
+
+ create table ccm_core.threads (
+ object_id bigint not null,
+ root_id bigint,
+ primary key (object_id)
+ );
+
+ create table ccm_core.user_email_addresses (
+ user_id bigint not null,
+ email_address varchar(512) not null,
+ bouncing boolean,
+ verified boolean
+ );
+
+ create table ccm_core.workflow_tasks (
+ task_id bigint not null,
+ active boolean,
+ task_state varchar(512),
+ workflow_id bigint,
+ primary key (task_id)
+ );
+
+ create table ccm_core.workflow_user_tasks (
+ task_id bigint not null,
+ active boolean,
+ task_state varchar(512),
+ workflow_id bigint,
+ due_date timestamp,
+ duration_minutes bigint,
+ locked boolean,
+ start_date timestamp,
+ locking_user_id bigint,
+ notification_sender bigint,
+ primary key (task_id)
+ );
+
+ create table ccm_core.workflows (
+ workflow_id bigint not null,
+ primary key (workflow_id)
+ );
+
+ create table formbuilder_component_descriptions (
+ component_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (component_id, locale)
+ );
+
+ create table formbuilder_data_query_descriptions (
+ data_query_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (data_query_id, locale)
+ );
+
+ create table formbuilder_data_query_names (
+ data_query_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (data_query_id, locale)
+ );
+
+ create table formbuilder_option_labels (
+ option_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (option_id, locale)
+ );
+
+ create table formbuilder_process_listener_descriptions (
+ process_listener_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (process_listener_id, locale)
+ );
+
+ create table formbuilder_process_listener_names (
+ process_listener_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (process_listener_id, locale)
+ );
+
+ create table workflow_descriptions (
+ workflow_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (workflow_id, locale)
+ );
+
+ create table workflow_names (
+ workflow_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (workflow_id, locale)
+ );
+
+ create table workflow_task_comments (
+ task_id bigint not null,
+ comment clob
+ );
+
+ create table workflow_task_dependencies (
+ depends_on_task_id bigint not null,
+ dependent_task_id bigint not null
+ );
+
+ create table workflow_task_labels (
+ task_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (task_id, locale)
+ );
+
+ create table workflow_tasks_descriptions (
+ task_id bigint not null,
+ localized_value clob,
+ locale varchar(255) not null,
+ primary key (task_id, locale)
+ );
+
+ create table workflow_user_task_assigned_groups (
+ user_task_id bigint not null,
+ assigned_group_id bigint not null
+ );
+
+ create table workflow_user_task_assigned_users (
+ user_task_id bigint not null,
+ assigned_user_id bigint not null
+ );
+
+ alter table ccm_core.category_domains
+ add constraint UK_mrgij5fr1sglxyab9ryl1vx37 unique (domain_key);
+
+ alter table ccm_core.category_domains
+ add constraint UK_a9hmskgn6yfbw134mvjy9ixak unique (uri);
+
+ alter table ccm_core.ccm_groups
+ add constraint UK_9142ut4o9kwqmqjgqynl4xvc6 unique (name);
+
+ alter table ccm_core.ccm_privileges
+ add constraint UK_ir9u47mfn3qds0toon7n5hlai unique (label);
+
+ alter table ccm_core.ccm_users
+ add constraint UK_3oj1rsneufkapevq9f32y4el0 unique (screen_name);
+
+ alter table ccm_core.hosts
+ add constraint UK_2m0m4m0dhx256d04x2cg3194s unique (server_name, server_port);
+
+ alter table workflow_user_task_assigned_groups
+ add constraint UK_g58x45aybw2yjtwnr9b9itg6c unique (assigned_group_id);
+
+ alter table workflow_user_task_assigned_users
+ add constraint UK_h62r6cqjp2tdnhscfkgwfupwj unique (assigned_user_id);
+
+ alter table ccm_core.application_types
+ add constraint FK_r9rd4iekfy3m8r1a1gto4t39
+ foreign key (container_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.application_types
+ add constraint FK_i44k6al7mr4u1c76iudglds39
+ foreign key (provider_app_type_id)
+ references ccm_core.application_types;
+
+ alter table ccm_core.application_types
+ add constraint FK_41e4vrshljdkymnhb4cbkroa1
+ foreign key (resource_type_id)
+ references ccm_core.resource_types;
+
+ alter table ccm_core.applications
+ add constraint FK_kr3wur06hmironiamv0rn38nu
+ foreign key (container_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.applications
+ add constraint FK_18qjyi037fk2lnx6t9fwljmx0
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.attachments
+ add constraint FK_r3hibvgfo1dmawqig8c563xau
+ foreign key (message_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.categories
+ add constraint FK_hfr9rd0rv1jv730afoi2n0qb7
+ foreign key (parent_category_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.categories
+ add constraint FK_hct54n9h1moa76f44g6cw3lpc
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.categorizations
+ add constraint FK_2xymec7oxsvoflm4pyw03qxrw
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.categorizations
+ add constraint FK_spxdunplw881gx7ay4rcuueht
+ foreign key (category_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.category_descriptions
+ add constraint FK_gvqskqclt5nsi6x87163ydldr
+ foreign key (object_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.category_domains
+ add constraint FK_kh4n7uqv126lb1upk45giadxu
+ foreign key (root_category_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.category_domains
+ add constraint FK_irk58v7vtdgx0bfh8yarl5pte
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.category_titles
+ add constraint FK_ygak8bqmh94jjtgs6vg945rd
+ foreign key (object_id)
+ references ccm_core.categories;
+
+ alter table ccm_core.ccm_groups
+ add constraint FK_7a2nhf8gj3lns0preesnlok8o
+ foreign key (subject_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.ccm_privileges
+ add constraint FK_g06a7mpltqti17tvibm2j7ti8
+ foreign key (relevant_privilege_id)
+ references ccm_core.application_types;
+
+ alter table ccm_core.ccm_roles
+ add constraint FK_ice2oswni34d2xx80cf81v2cv
+ foreign key (implicit_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.ccm_roles
+ add constraint FK_kbq9nkjwsvvkt6db59v2c1eb2
+ foreign key (source_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.ccm_users
+ add constraint FK_i9x5hcjowqc0aygna4wte5447
+ foreign key (subject_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.digests
+ add constraint FK_riucjho1m4x84l528d4b0xexh
+ foreign key (from_party_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.digests
+ add constraint FK_jslyikag80b9qhvvg4ui3r6li
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.domain_descriptions
+ add constraint FK_anq6lql9qv1wov2hoq59i9pfs
+ foreign key (object_id)
+ references ccm_core.category_domains;
+
+ alter table ccm_core.domain_ownerships
+ add constraint FK_nvdejc0jxmru3ax7v0su83wi7
+ foreign key (domain_object_id)
+ references ccm_core.category_domains;
+
+ alter table ccm_core.domain_ownerships
+ add constraint FK_jiilo1lcqv8g7b16cviqhnepy
+ foreign key (owner_object_id)
+ references ccm_core.applications;
+
+ alter table ccm_core.domain_titles
+ add constraint FK_p3w39o4hwcppwotw8ndjey6sl
+ foreign key (object_id)
+ references ccm_core.category_domains;
+
+ alter table ccm_core.formbuilder_components
+ add constraint FK_ompdvc6pul5xbhn5r2aqv7knb
+ foreign key (parentComponent_object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_components
+ add constraint FK_2fhckbkcdrahmp1pnnm5p12pf
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_confirm_email_listener
+ add constraint FK_t24egwvbo23ak7ga4cnsmn428
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_confirm_redirect_listeners
+ add constraint FK_7xtmk3ij9uj2f6nybhprm5eh0
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_data_driven_selects
+ add constraint FK_g0cfdd0rrt4akmibhdlejpb9u
+ foreign key (object_id)
+ references ccm_core.formbuilder_widgets;
+
+ alter table ccm_core.formbuilder_data_queries
+ add constraint FK_p2awj0f115oxg1re4nr7wgsvj
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_formsections
+ add constraint FK_endc2bmlb7orkk4l5x3fkmy2l
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_listeners
+ add constraint FK_fidonwyc6s36a51lilys791ot
+ foreign key (widget_object_id)
+ references ccm_core.formbuilder_widgets;
+
+ alter table ccm_core.formbuilder_listeners
+ add constraint FK_c0gkh6b1dsyp0xh1pvnd6tijr
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_metaobjects
+ add constraint FK_fn61u2xdqraclu9j0y2lxqqp8
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_object_types
+ add constraint FK_pvcmankfvwpvg0lqe6wio4rnc
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_options
+ add constraint FK_f7fgwaysg76tnx2xtfjnpt8a3
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_process_listeners
+ add constraint FK_8b4m881ppfw6m13clxu4cp1o0
+ foreign key (formSection_object_id)
+ references ccm_core.formbuilder_formsections;
+
+ alter table ccm_core.formbuilder_process_listeners
+ add constraint FK_a539g6h1xtndr87oov42wvdl4
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.formbuilder_remote_server_post_listener
+ add constraint FK_n4ymnx1dtjqedvta4e8hqfxpp
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_simple_email_listeners
+ add constraint FK_4phpnsgkmvblh5pgiej11aj9y
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_template_email_listeners
+ add constraint FK_cevp55p98seugf2368sc7yqqq
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.formbuilder_widget_labels
+ add constraint FK_tftgfd24vbwfhas20m20xt5e7
+ foreign key (widget_object_id)
+ references ccm_core.formbuilder_widgets;
+
+ alter table ccm_core.formbuilder_widget_labels
+ add constraint FK_isff794p53xtpr1261vet6nhn
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_widgets
+ add constraint FK_lv8wd5tad9t12m1qigj200hp2
+ foreign key (label_object_id)
+ references ccm_core.formbuilder_widget_labels;
+
+ alter table ccm_core.formbuilder_widgets
+ add constraint FK_rgbe1klt8ktw2okc5lfbp7nkl
+ foreign key (object_id)
+ references ccm_core.formbuilder_components;
+
+ alter table ccm_core.formbuilder_xml_email_listeners
+ add constraint FK_n6fdsiv02im6d6wyj5l799uh2
+ foreign key (object_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table ccm_core.group_memberships
+ add constraint FK_gg62l9f6d82rl3h57r03y1f6y
+ foreign key (group_subject_id)
+ references ccm_core.ccm_groups;
+
+ alter table ccm_core.group_memberships
+ add constraint FK_qm940kapbbc0ywyhkwh06wg48
+ foreign key (user_subject_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.inits
+ add constraint FK_skqpgijaiv5idanah0e1hjoa
+ foreign key (required_by_id)
+ references ccm_core.inits;
+
+ alter table ccm_core.lucene_documents
+ add constraint FK_n421djw91ggdmvsglk8t6tvk1
+ foreign key (created_by_party_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.lucene_documents
+ add constraint FK_qa9tey3vy1xrpxkyqo9us25s3
+ foreign key (last_modified_by)
+ references ccm_core.subjects;
+
+ alter table ccm_core.lucene_indexes
+ add constraint FK_7dqbase0oyxl83byea4hfdake
+ foreign key (host_id)
+ references ccm_core.hosts;
+
+ alter table ccm_core.messages
+ add constraint FK_3l74b1gch8skj8t84emd65e3y
+ foreign key (in_reply_to_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.messages
+ add constraint FK_2tgrsfo79pwvrwk6lbdy32701
+ foreign key (sender_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.messages
+ add constraint FK_ipx9bvlxhd3q9aqs3kmq2kayc
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.notifications
+ add constraint FK_k88btnwbdswv5ef360xxp8cn1
+ foreign key (digest_id)
+ references ccm_core.digests;
+
+ alter table ccm_core.notifications
+ add constraint FK_fy4pjr1vlslocsi7d6vwku2yj
+ foreign key (message_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.notifications
+ add constraint FK_ajptmh33lr07i00e7j4pgheqe
+ foreign key (receiver_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.notifications
+ add constraint FK_s4xvw4ebw2tq41i0kex5pyo5k
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.permissions
+ add constraint FK_aqw7r1c62xehp58uxwojun8xq
+ foreign key (creation_user_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.permissions
+ add constraint FK_ilie616laommyrii7ecjbj521
+ foreign key (granted_privilege_id)
+ references ccm_core.ccm_privileges;
+
+ alter table ccm_core.permissions
+ add constraint FK_g94li5wexu57n0mosdks1abuv
+ foreign key (grantee_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.permissions
+ add constraint FK_r2p8pfvr7k5lth4bem2s0xqdv
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.portals
+ add constraint FK_mubhpxf8uf40wu2tc3ekkrqkc
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.portlets
+ add constraint FK_i6o1tgre6iuc3yf7tk4jhmj6
+ foreign key (portal_id)
+ references ccm_core.portals;
+
+ alter table ccm_core.portlets
+ add constraint FK_hvqa10v1thdr4riwt2unryk1y
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.queue_items
+ add constraint FK_14jyt63f6cs84pangjcnphlps
+ foreign key (message_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.queue_items
+ add constraint FK_ojc2cc1yqd2htu88gxu16t11e
+ foreign key (receiver_id)
+ references ccm_core.subjects;
+
+ alter table ccm_core.resource_descriptions
+ add constraint FK_ayx5lyxreydtjbvdugoff7mox
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.resource_titles
+ add constraint FK_aer0mvcddder3150jlq0552nn
+ foreign key (object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.resource_type_descriptions
+ add constraint FK_fp5rutbl3lvv5c322l87ma0ae
+ foreign key (resource_type_id)
+ references ccm_core.resource_types;
+
+ alter table ccm_core.resources
+ add constraint FK_7bwjikili5hr55of80yvjlocc
+ foreign key (parent_object_id)
+ references ccm_core.resources;
+
+ alter table ccm_core.resources
+ add constraint FK_2o0qb7opah9rt9ww8ydvp7cxv
+ foreign key (resourceType_resource_type_id)
+ references ccm_core.resource_types;
+
+ alter table ccm_core.resources
+ add constraint FK_e6rvkh4kw8agtkvjqqdbiu0db
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.threads
+ add constraint FK_2d6ht9nsikaebakyppgtm8p2k
+ foreign key (root_id)
+ references ccm_core.messages;
+
+ alter table ccm_core.threads
+ add constraint FK_jf5k6sucih0qp7l3ih2moeuha
+ foreign key (object_id)
+ references ccm_core.ccm_objects;
+
+ alter table ccm_core.user_email_addresses
+ add constraint FK_m0hymqadkrd9o5eixeurjpifx
+ foreign key (user_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.workflow_tasks
+ add constraint FK_mvuhbl6ikm44oxxtkv0s2y9iu
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table ccm_core.workflow_user_tasks
+ add constraint FK_5nryb3wmian7oqttwqpa3wwll
+ foreign key (locking_user_id)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.workflow_user_tasks
+ add constraint FK_s4tgjfnpvyhtpu0h4l72sht9g
+ foreign key (notification_sender)
+ references ccm_core.ccm_users;
+
+ alter table ccm_core.workflow_user_tasks
+ add constraint FK_4nmt8xkbfog6dhq2mpt8m3skf
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table formbuilder_component_descriptions
+ add constraint FK_miw32na0kj3r3vx0yd9nmacu3
+ foreign key (component_id)
+ references ccm_core.formbuilder_components;
+
+ alter table formbuilder_data_query_descriptions
+ add constraint FK_6vi3n0g1gfjrxd3vvlarrn584
+ foreign key (data_query_id)
+ references ccm_core.formbuilder_data_queries;
+
+ alter table formbuilder_data_query_names
+ add constraint FK_tgnk7hsrmtqxnhvfcefe936v9
+ foreign key (data_query_id)
+ references ccm_core.formbuilder_data_queries;
+
+ alter table formbuilder_option_labels
+ add constraint FK_e8fy2g61cd7qn8ar1t48g7p1m
+ foreign key (option_id)
+ references ccm_core.formbuilder_options;
+
+ alter table formbuilder_process_listener_descriptions
+ add constraint FK_p1e4ygtc3ke9r4gotkc5k8dmv
+ foreign key (process_listener_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table formbuilder_process_listener_names
+ add constraint FK_e3uy4vdqbely8oybcfc0ef7tn
+ foreign key (process_listener_id)
+ references ccm_core.formbuilder_process_listeners;
+
+ alter table workflow_descriptions
+ add constraint FK_7grengdpx5d99jkyjlsa3pe6k
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table workflow_names
+ add constraint FK_sjqjarc88yvdrw3yd6swg7uqs
+ foreign key (workflow_id)
+ references ccm_core.workflows;
+
+ alter table workflow_user_task_assigned_groups
+ add constraint FK_g58x45aybw2yjtwnr9b9itg6c
+ foreign key (assigned_group_id)
+ references ccm_core.ccm_groups;
+
+ alter table workflow_user_task_assigned_groups
+ add constraint FK_jiogatex4mifbgji1og4rri9o
+ foreign key (user_task_id)
+ references ccm_core.workflow_user_tasks;
+
+ alter table workflow_user_task_assigned_users
+ add constraint FK_h62r6cqjp2tdnhscfkgwfupwj
+ foreign key (assigned_user_id)
+ references ccm_core.ccm_users;
+
+ alter table workflow_user_task_assigned_users
+ add constraint FK_ltihq91dcigqixb6ulhkphrix
+ foreign key (user_task_id)
+ references ccm_core.workflow_user_tasks;
+
+ create sequence hibernate_sequence start with 1 increment by 1;
\ No newline at end of file
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-delete.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-delete.json
index 43b08997d..20d81a075 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-delete.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-delete.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-changed.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-changed.json
index 16a42f46b..9edd2f0f5 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-changed.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-changed.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-new.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-new.json
index 627c3cf19..84fd0c6c2 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-new.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/after-save-new.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/data.json
index e2c043379..b1d68aa8e 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/CcmObjectRepositoryTest/data.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-add-to-group.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-add-to-group.json
index ab710458f..43251bf1e 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-add-to-group.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-add-to-group.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -14,7 +14,7 @@
"subject_id": -40
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -28,7 +28,7 @@
"subject_id": -10
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -43,7 +43,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -52,7 +52,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-remove-from-group.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-remove-from-group.json
index bbaf225f8..aec16788c 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-remove-from-group.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/after-remove-from-group.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -14,7 +14,7 @@
"subject_id": -40
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -28,7 +28,7 @@
"subject_id": -10
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -43,7 +43,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -52,7 +52,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/users-groups.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/users-groups.json
index 19202a483..34297afc5 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/users-groups.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupManagerTest/users-groups.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -14,7 +14,7 @@
"subject_id": -40
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -28,7 +28,7 @@
"subject_id": -10
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -43,7 +43,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -52,7 +52,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json
index 285b75c82..4a1d65401 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-delete.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -8,7 +8,7 @@
"subject_id": -30
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json
index 7493fd740..8e394e6b0 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-changed.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -11,7 +11,7 @@
"subject_id": -30
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json
index 89658ba74..ef22391b9 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/after-save-new.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -14,7 +14,7 @@
"subject_id": -40
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/data.json
index e3a65eb3f..f5a39c941 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/GroupRepositoryTest/data.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -11,7 +11,7 @@
"subject_id": -30
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant-wildcard.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant-wildcard.json
index e60f483b6..e129f044e 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant-wildcard.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant-wildcard.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -34,7 +34,7 @@
"display_name": "Test Object 8"
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -49,7 +49,7 @@
"label": "write"
}
],
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -1
@@ -70,7 +70,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -117,7 +117,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "users",
@@ -128,7 +128,7 @@
"subject_id": -40
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -156,7 +156,7 @@
"user_subject_id": -50
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -171,7 +171,7 @@
"verified": true
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant.json
index 12796ee11..f252930ba 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-grant.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -34,7 +34,7 @@
"display_name": "Test Object 8"
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -49,7 +49,7 @@
"label": "write"
}
],
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -1
@@ -70,7 +70,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -117,7 +117,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "users",
@@ -128,7 +128,7 @@
"subject_id": -40
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -156,7 +156,7 @@
"user_subject_id": -50
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -171,7 +171,7 @@
"verified": true
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-revoke.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-revoke.json
index a940fd187..10f4168dc 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-revoke.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/after-revoke.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -34,7 +34,7 @@
"display_name": "Test Object 8"
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -49,7 +49,7 @@
"label": "write"
}
],
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -1
@@ -70,7 +70,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -117,7 +117,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "users",
@@ -128,7 +128,7 @@
"subject_id": -40
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -156,7 +156,7 @@
"user_subject_id": -50
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -171,7 +171,7 @@
"verified": true
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/data.json
index 89b5b9edb..b08a26242 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionManagerTest/data.json
@@ -1,5 +1,5 @@
{
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -34,7 +34,7 @@
"display_name": "Test Object 8"
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -49,7 +49,7 @@
"label": "write"
}
],
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -1
@@ -70,7 +70,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -117,7 +117,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "users",
@@ -128,7 +128,7 @@
"subject_id": -40
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -156,7 +156,7 @@
"user_subject_id": -50
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -171,7 +171,7 @@
"verified": true
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-delete.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-delete.json
index 5e66d96a1..44180e6a6 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-delete.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-delete.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -17,7 +17,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -42,7 +42,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -57,7 +57,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -72,7 +72,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -90,7 +90,7 @@
"user_subject_id": -50
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -109,7 +109,7 @@
"label": "unused"
}
],
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -128,7 +128,7 @@
"display_name": "Test Object 4"
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-changed.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-changed.json
index 2c4143eca..6b1bcce35 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-changed.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-changed.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -17,7 +17,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -42,7 +42,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -57,7 +57,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -72,7 +72,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -90,7 +90,7 @@
"user_subject_id": -50
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -109,7 +109,7 @@
"label": "unused"
}
],
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -128,7 +128,7 @@
"display_name": "Test Object 4"
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-new.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-new.json
index 91094bc33..c55085efc 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-new.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/after-save-new.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -17,7 +17,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -42,7 +42,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -57,7 +57,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -72,7 +72,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -90,7 +90,7 @@
"user_subject_id": -50
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -109,7 +109,7 @@
"label": "unused"
}
],
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -128,7 +128,7 @@
"display_name": "Test Object 4"
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/data.json
index ab77f63c6..de6a8ad5a 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PermissionRepositoryTest/data.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -17,7 +17,7 @@
"subject_id": -50
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -42,7 +42,7 @@
"subject_id": -50
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "admins",
@@ -57,7 +57,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
@@ -72,7 +72,7 @@
"verified": true
}
],
- "group_memberships":
+ "ccm_core.group_memberships":
[
{
"membership_id": -10,
@@ -90,7 +90,7 @@
"user_subject_id": -50
}
],
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
@@ -109,7 +109,7 @@
"label": "unused"
}
],
- "ccm_objects":
+ "ccm_core.ccm_objects":
[
{
"object_id": -10,
@@ -128,7 +128,7 @@
"display_name": "Test Object 4"
}
],
- "permissions":
+ "ccm_core.permissions":
[
{
"permission_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-create.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-create.json
index 8a4c9bf9e..5ce62fde2 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-create.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-create.json
@@ -1,5 +1,5 @@
{
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-delete.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-delete.json
index 4b77b8c71..850c07f41 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-delete.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/after-delete.json
@@ -1,5 +1,5 @@
{
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/data.json
index 5d16284e5..789c0007a 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/PrivilegeRepositoryTest/data.json
@@ -1,5 +1,5 @@
{
- "ccm_privileges":
+ "ccm_core.ccm_privileges":
[
{
"privilege_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-delete.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-delete.json
index 4336a6afc..cb12bfce8 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-delete.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-delete.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -32,7 +32,7 @@
"subject_id": -100
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "Site-wide Administrators",
@@ -75,7 +75,7 @@
"subject_id": -100
}
],
- "ccm_roles":
+ "ccm_core.ccm_roles":
[
{
"role_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-changed.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-changed.json
index 63da8e88c..e25ef324e 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-changed.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-changed.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -32,7 +32,7 @@
"subject_id": -100
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "Site-wide Administrators",
@@ -75,7 +75,7 @@
"subject_id": -100
}
],
- "ccm_roles":
+ "ccm_core.ccm_roles":
[
{
"role_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-new.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-new.json
index ea764e134..e8e4a8d11 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-new.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/after-save-new.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -32,7 +32,7 @@
"subject_id": -100
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "Site-wide Administrators",
@@ -75,7 +75,7 @@
"subject_id": -100
}
],
- "ccm_roles":
+ "ccm_core.ccm_roles":
[
{
"role_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/data.json
index 8c514f721..fdb4fc8b3 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/RoleRepositoryTest/data.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -32,7 +32,7 @@
"subject_id": -100
}
],
- "ccm_groups":
+ "ccm_core.ccm_groups":
[
{
"name": "Site-wide Administrators",
@@ -75,7 +75,7 @@
"subject_id": -100
}
],
- "ccm_roles":
+ "ccm_core.ccm_roles":
[
{
"role_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserManagerTest/verify-password.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserManagerTest/verify-password.json
index 9e634465b..fa70cc42a 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserManagerTest/verify-password.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserManagerTest/verify-password.json
@@ -1,11 +1,11 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -19,7 +19,7 @@
"subject_id": -10
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-delete.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-delete.json
index b227f7ab4..7faff6262 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-delete.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-delete.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -8,7 +8,7 @@
"subject_id": -30
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -33,7 +33,7 @@
"subject_id": -30
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-changed.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-changed.json
index 7e0961efc..3c78574eb 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-changed.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-changed.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -11,7 +11,7 @@
"subject_id": -30
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -48,7 +48,7 @@
"subject_id": -30
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-new.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-new.json
index 8b453c39c..97212f850 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-new.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/after-save-new.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -14,7 +14,7 @@
"subject_id": -40
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -63,7 +63,7 @@
"subject_id": -40
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data-email-duplicate.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data-email-duplicate.json
index 67dd66c61..d2930e3f8 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data-email-duplicate.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data-email-duplicate.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -11,7 +11,7 @@
"subject_id": -30
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -47,7 +47,7 @@
"subject_id": -30
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data.json
index 455e5a77b..71f2fcdb9 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/UserRepositoryTest/data.json
@@ -1,5 +1,5 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
@@ -11,7 +11,7 @@
"subject_id": -30
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -47,7 +47,7 @@
"subject_id": -30
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/core/authentication/LoginManagerTest/data.json b/ccm-core/src/test/resources/datasets/org/libreccm/core/authentication/LoginManagerTest/data.json
index 18b07d80f..1623595f6 100644
--- a/ccm-core/src/test/resources/datasets/org/libreccm/core/authentication/LoginManagerTest/data.json
+++ b/ccm-core/src/test/resources/datasets/org/libreccm/core/authentication/LoginManagerTest/data.json
@@ -1,11 +1,11 @@
{
- "subjects":
+ "ccm_core.subjects":
[
{
"subject_id": -10
}
],
- "ccm_users":
+ "ccm_core.ccm_users":
[
{
"banned": false,
@@ -19,7 +19,7 @@
"subject_id": -10
}
],
- "user_email_addresses":
+ "ccm_core.user_email_addresses":
[
{
"user_id": -10,
diff --git a/ccm-core/src/test/resources/scripts/h2-cleanup.sql b/ccm-core/src/test/resources/scripts/h2-cleanup.sql
index 96bdacf02..04e4086bb 100644
--- a/ccm-core/src/test/resources/scripts/h2-cleanup.sql
+++ b/ccm-core/src/test/resources/scripts/h2-cleanup.sql
@@ -1,17 +1,17 @@
-DELETE FROM permissions;
+DELETE FROM ccm_core.permissions;
-DELETE FROM ccm_privileges;
+DELETE FROM ccm_core.ccm_privileges;
-DELETE FROM ccm_objects;
+DELETE FROM ccm_core.ccm_objects;
-DELETE FROM ccm_roles;
+DELETE FROM ccm_core.ccm_roles;
-DELETE FROM group_memberships;
+DELETE FROM ccm_core.group_memberships;
-DELETE FROM ccm_groups;
+DELETE FROM ccm_core.ccm_groups;
-DELETE FROM user_email_addresses;
+DELETE FROM ccm_core.user_email_addresses;
-DELETE FROM ccm_users;
+DELETE FROM ccm_core.ccm_users;
-DELETE FROM subjects;
\ No newline at end of file
+DELETE FROM ccm_core.subjects;
\ No newline at end of file
diff --git a/ccm-core/src/test/resources/scripts/mysql-cleanup.sql b/ccm-core/src/test/resources/scripts/mysql-cleanup.sql
index 96bdacf02..04e4086bb 100644
--- a/ccm-core/src/test/resources/scripts/mysql-cleanup.sql
+++ b/ccm-core/src/test/resources/scripts/mysql-cleanup.sql
@@ -1,17 +1,17 @@
-DELETE FROM permissions;
+DELETE FROM ccm_core.permissions;
-DELETE FROM ccm_privileges;
+DELETE FROM ccm_core.ccm_privileges;
-DELETE FROM ccm_objects;
+DELETE FROM ccm_core.ccm_objects;
-DELETE FROM ccm_roles;
+DELETE FROM ccm_core.ccm_roles;
-DELETE FROM group_memberships;
+DELETE FROM ccm_core.group_memberships;
-DELETE FROM ccm_groups;
+DELETE FROM ccm_core.ccm_groups;
-DELETE FROM user_email_addresses;
+DELETE FROM ccm_core.user_email_addresses;
-DELETE FROM ccm_users;
+DELETE FROM ccm_core.ccm_users;
-DELETE FROM subjects;
\ No newline at end of file
+DELETE FROM ccm_core.subjects;
\ No newline at end of file
diff --git a/ccm-core/src/test/resources/scripts/pgsql-cleanup.sql b/ccm-core/src/test/resources/scripts/pgsql-cleanup.sql
index 96bdacf02..04e4086bb 100644
--- a/ccm-core/src/test/resources/scripts/pgsql-cleanup.sql
+++ b/ccm-core/src/test/resources/scripts/pgsql-cleanup.sql
@@ -1,17 +1,17 @@
-DELETE FROM permissions;
+DELETE FROM ccm_core.permissions;
-DELETE FROM ccm_privileges;
+DELETE FROM ccm_core.ccm_privileges;
-DELETE FROM ccm_objects;
+DELETE FROM ccm_core.ccm_objects;
-DELETE FROM ccm_roles;
+DELETE FROM ccm_core.ccm_roles;
-DELETE FROM group_memberships;
+DELETE FROM ccm_core.group_memberships;
-DELETE FROM ccm_groups;
+DELETE FROM ccm_core.ccm_groups;
-DELETE FROM user_email_addresses;
+DELETE FROM ccm_core.user_email_addresses;
-DELETE FROM ccm_users;
+DELETE FROM ccm_core.ccm_users;
-DELETE FROM subjects;
\ No newline at end of file
+DELETE FROM ccm_core.subjects;
\ No newline at end of file
diff --git a/ccm-testutils/src/main/java/org/libreccm/testutils/DatasetsVerifier.java b/ccm-testutils/src/main/java/org/libreccm/testutils/DatasetsVerifier.java
index 83f0e6910..4867ee7bd 100644
--- a/ccm-testutils/src/main/java/org/libreccm/testutils/DatasetsVerifier.java
+++ b/ccm-testutils/src/main/java/org/libreccm/testutils/DatasetsVerifier.java
@@ -41,30 +41,30 @@ import org.jboss.arquillian.persistence.dbunit.dataset.json.JsonDataSet;
import org.junit.runners.Parameterized;
import java.nio.charset.StandardCharsets;
+import java.sql.Statement;
/**
*
* For testing the CCM modules the Arquillian Persistence extension including
* the DBUnit integration is used. Unfortunately there are some issues with
* exception reporting if there errors in the datasets used for testing.
- * Therefore we provide this utility class which can be used to implement
- * test for the datasets outside of Arquillian.
- *
- * For testing an in-memory H2
- * database is used. The datasets are loaded into the database using
- * DBUnit classes. Before loading the dataset this class creates the database
- * schema. The SQL script for generating the schema is loaded via
- * {@code getClass().getResource(/sql/ddl/auto/h2.sql).toURI()}. Therefore the
- * utility expects to find the SQL for generating the database schema in the
- * classpath at th path {@code /sql/ddl/auto/h2.sql}. The default
+ * Therefore we provide this utility class which can be used to implement test
+ * for the datasets outside of Arquillian.
+ *
+ * For testing an in-memory H2 database is used. The datasets are loaded into
+ * the database using DBUnit classes. Before loading the dataset this class
+ * creates the database schema. The SQL script for generating the schema is
+ * loaded via {@code getClass().getResource(/sql/ddl/auto/h2.sql).toURI()}.
+ * Therefore the utility expects to find the SQL for generating the database
+ * schema in the classpath at th path {@code /sql/ddl/auto/h2.sql}. The default
* {@code pom.xml} for modules take care of that.
- *
- * After each dataset the database is scrapped. To use this utility create
- * a JUnit test class using the {@link Parameterized} test runner from JUnit.
- * An example is the
- * DatasetsTest
+ *
+ * After each dataset the database is scrapped. To use this utility create a
+ * JUnit test class using the {@link Parameterized} test runner from JUnit. An
+ * example is the
+ * DatasetsTest
* in the {@code org.libreccm.core} package of the ccm-core module.
- *
+ *
* @author Jens Pelzetter
*/
public class DatasetsVerifier {
@@ -75,6 +75,16 @@ public class DatasetsVerifier {
this.datasetPath = datasetsPath;
}
+ /**
+ * Overwrite this method if you are using another schema than the default
+ * one.
+ *
+ * @return
+ */
+ public String[] getSchemas() {
+ return new String[]{};
+ }
+
@Test
@edu.umd.cs.findbugs.annotations.SuppressWarnings(
value = "DMI_EMPTY_DB_PASSWORD",
@@ -85,13 +95,23 @@ public class DatasetsVerifier {
DatabaseUnitException {
//Create database connection to an in memory h2 database. Placed in
//try-with-resources block to ensure that the connection is closed.
+ final StringBuffer buffer = new StringBuffer("jdbc:h2:mem:testdatabase");
+ //Create schema if necssary
+ if(getSchemas().length > 0) {
+ buffer.append(";INIT=");
+ for(final String schema : getSchemas()) {
+ buffer.append(String.format("CREATE SCHEMA IF NOT EXISTS %s;",
+ schema));
+ }
+ }
+ final String connectionStr = buffer.toString();
try (Connection connection = DriverManager.getConnection(
- "jdbc:h2:mem:testdatabase", "sa", "")) {
- //Create DB schema
+ connectionStr, "sa", "")) {
+ //Create DB tables etc
final Path schemaPath = Paths.get(getClass().getResource(
"/sql/ddl/auto/h2.sql").toURI());
RunScript.execute(connection, Files.newBufferedReader(
- schemaPath, StandardCharsets.UTF_8));
+ schemaPath, StandardCharsets.UTF_8));
connection.commit();
//Get dataset to test
@@ -101,7 +121,8 @@ public class DatasetsVerifier {
//Create DBUnit DB connection
final IDatabaseConnection dbUnitConn
= new DatabaseConnection(connection);
-
+ dbUnitConn.getConfig().setProperty(
+ "http://www.dbunit.org/features/qualifiedTableNames", true);
//Check if dumping works the DB works before loading the dataset.
System.out.println("Dump before loading dataset...");
verifyDumping(dbUnitConn);
diff --git a/pom.xml b/pom.xml
index 7e9bd3b48..a6d097027 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,5 +1,8 @@
-
+
4.0.0
@@ -38,8 +41,8 @@
ccm-core
ccm-shortcuts
ccm-testutils
- ccm-docrepo
-
+ ccm-docrepo
+
+
+ org.flywaydb
+ flyway-core
+ 3.2.1