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