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 4b753835d..6533f45e9 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/Category.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/Category.java @@ -130,7 +130,7 @@ public class Category extends CcmObject implements InheritsPermissions, joinColumns = { @JoinColumn(name = "OBJECT_ID")} )) - @XmlElementWrapper(name = "title", namespace = CAT_XML_NS) + @XmlElement(name = "title", namespace = CAT_XML_NS) private LocalizedString title; /** @@ -144,7 +144,7 @@ public class Category extends CcmObject implements InheritsPermissions, joinColumns = { @JoinColumn(name = "OBJECT_ID")} )) - @XmlElementWrapper(name = "title", namespace = CAT_XML_NS) + @XmlElement(name = "description", namespace = CAT_XML_NS) private LocalizedString description; /** @@ -183,6 +183,7 @@ public class Category extends CcmObject implements InheritsPermissions, */ @OneToMany(mappedBy = "parentCategory") @XmlElementWrapper(name = "subcategories", namespace = CAT_XML_NS) + @XmlElement(name = "category") private List subCategories; /** diff --git a/ccm-core/src/main/java/org/libreccm/core/CcmCore.java b/ccm-core/src/main/java/org/libreccm/core/CcmCore.java index 9fab32b1b..89877f441 100644 --- a/ccm-core/src/main/java/org/libreccm/core/CcmCore.java +++ b/ccm-core/src/main/java/org/libreccm/core/CcmCore.java @@ -26,6 +26,14 @@ import com.arsdigita.ui.login.LoginApplicationCreator; import com.arsdigita.ui.login.LoginServlet; import com.arsdigita.ui.login.LoginApplicationSetup; import com.arsdigita.ui.login.LoginConstants; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import javax.persistence.EntityManager; +import javax.xml.bind.JAXB; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.libreccm.categorization.Domain; import org.libreccm.modules.CcmModule; import org.libreccm.modules.InitEvent; @@ -68,24 +76,47 @@ import org.libreccm.web.ApplicationType; com.arsdigita.xml.formatters.DateFormatterConfig.class, org.libreccm.configuration.ExampleConfiguration.class, org.libreccm.security.EmailTemplates.class, - org.libreccm.security.OneTimeAuthConfig.class, - }) + org.libreccm.security.OneTimeAuthConfig.class,}) public class CcmCore implements CcmModule { + private static final Logger LOGGER = LogManager.getLogger(CcmCore.class); + @Override public void install(final InstallEvent event) { + LOGGER.info("Setting up system users..."); final SystemUsersSetup systemUsersSetup = new SystemUsersSetup( - event); + event); systemUsersSetup.setupSystemUsers(); + LOGGER.info("Setting up admin application (/ccm/admin/)..."); final AdminApplicationSetup adminSetup = new AdminApplicationSetup(event); adminSetup.setup(); + LOGGER.info("Setting up login application..."); final LoginApplicationSetup loginSetup = new LoginApplicationSetup(event); loginSetup.setup(); - + + LOGGER.info("Importing category domains from bundle (if any)..."); + final Properties integrationProps = new Properties(); + try (final InputStream inputStream = getClass().getResourceAsStream( + CoreConstants.INTEGRATION_PROPS)) { + if (inputStream == null) { + LOGGER.warn("Integration properties file was not found."); + } else { + integrationProps.load(inputStream); + } + } catch (IOException ex) { + LOGGER.warn("Failed to read integration properties. " + + "Using empty proeprties."); + } + + if (integrationProps.containsKey("bundle.domains")) { + importDomains(integrationProps.getProperty("bundle.domains"), + event.getEntityManager()); + } + // Load category domains from bundle/classpath // File format: JAXB (but Jackson for reading the XML) } @@ -104,4 +135,32 @@ public class CcmCore implements CcmModule { //Nothing } + private void importDomains(final String domainFiles, + final EntityManager entityManager) { + final String[] tokens = domainFiles.split(","); + + for (final String token : tokens) { + importDomain(token, entityManager); + } + } + + private void importDomain(final String domainFile, + final EntityManager entityManager) { + // ToDo Will be implemented when general importer is ready +// LOGGER.info("Importing category domain from {}...", domainFile); +// try (final InputStream inputStream = getClass().getResourceAsStream( +// domainFile)) { +// if (inputStream == null) { +// LOGGER.warn("Category domain file {} was not found. Ignoring.", +// domainFile); +// } else { +// final Domain domain = JAXB.unmarshal(inputStream, Domain.class); +// entityManager.persist(domain); +// } +// } catch (IOException ex) { +// LOGGER.warn("Failed to load category domain file {}. " +// + "Domain will not be imported.", +// domainFile); +// } + } } diff --git a/ccm-core/src/main/java/org/libreccm/security/Permission.java b/ccm-core/src/main/java/org/libreccm/security/Permission.java index 4e6d7729f..c54286153 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Permission.java +++ b/ccm-core/src/main/java/org/libreccm/security/Permission.java @@ -39,6 +39,8 @@ import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @@ -68,6 +70,7 @@ import javax.xml.bind.annotation.XmlRootElement; + "WHERE p.object = :object") }) @XmlRootElement(name = "permission", namespace = CORE_XML_NS) +@XmlAccessorType(XmlAccessType.FIELD) public class Permission implements Serializable { private static final long serialVersionUID = -5178045844045517958L; diff --git a/ccm-core/src/main/java/org/libreccm/security/Role.java b/ccm-core/src/main/java/org/libreccm/security/Role.java index 14f3ec24d..31c2f4e4b 100644 --- a/ccm-core/src/main/java/org/libreccm/security/Role.java +++ b/ccm-core/src/main/java/org/libreccm/security/Role.java @@ -45,6 +45,8 @@ import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.Pattern; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @@ -82,6 +84,7 @@ import javax.xml.bind.annotation.XmlRootElement; }) @DefaultEntityGraph(Role.ENTITY_GRPAH_WITH_MEMBERS) @XmlRootElement(name = "role", namespace = CORE_XML_NS) +@XmlAccessorType(XmlAccessType.FIELD) @SuppressWarnings({"PMD.ShortClassName", "PMD.TooManyMethods"}) public class Role implements Serializable { diff --git a/ccm-core/src/main/java/org/libreccm/security/User.java b/ccm-core/src/main/java/org/libreccm/security/User.java index 0a377cf55..8436b110d 100644 --- a/ccm-core/src/main/java/org/libreccm/security/User.java +++ b/ccm-core/src/main/java/org/libreccm/security/User.java @@ -49,6 +49,8 @@ import javax.persistence.NamedSubgraph; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotNull; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @@ -119,6 +121,7 @@ import javax.xml.bind.annotation.XmlTransient; }) @DefaultEntityGraph("User.withGroupAndRoleMemberships") @XmlRootElement(name = "user", namespace = CORE_XML_NS) +@XmlAccessorType(XmlAccessType.FIELD) //Supressing a few warnings from PMD because they misleading here. //User is perfectly fine class name, and the complexity is not to high... @SuppressWarnings({"PMD.ShortClassName", "PMD.LongVariable"})