From 189c432378417786aa9a63f8cc81b6087fa66f1f Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 22 Apr 2016 18:28:54 +0000 Subject: [PATCH] CCM NG: Creating new domains using /ccm/admin/ git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4025 8810af33-2d31-482b-a856-94f89814c4df --- .../ui/admin/categories/DomainForm.java | 140 +++++++++++++++--- .../ui/admin/categories/DomainsTable.java | 2 +- .../org/libreccm/categorization/Domain.java | 83 ++++++----- .../categorization/DomainManager.java | 32 ++-- .../categorization/DomainRepository.java | 46 +++++- .../ui/admin/AdminResources.properties | 3 + .../ui/admin/AdminResources_de.properties | 3 + .../ui/admin/AdminResources_en.properties | 3 + .../ui/admin/AdminResources_fr.properties | 3 + 9 files changed, 241 insertions(+), 74 deletions(-) diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainForm.java index 84daa8339..96cf2516c 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainForm.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainForm.java @@ -19,14 +19,19 @@ package com.arsdigita.ui.admin.categories; import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.Page; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.ParameterSingleSelectionModel; import com.arsdigita.bebop.SaveCancelSection; import com.arsdigita.bebop.form.Date; import com.arsdigita.bebop.form.TextField; import com.arsdigita.globalization.GlobalizedMessage; + +import org.apache.logging.log4j.util.Strings; import org.libreccm.categorization.Domain; +import org.libreccm.categorization.DomainManager; import org.libreccm.categorization.DomainRepository; import org.libreccm.cdi.utils.CdiUtil; @@ -42,6 +47,7 @@ public class DomainForm extends Form { private static final String VERSION = "version"; private static final String DOMAIN_URI = "domainUri"; private static final String DOMAIN_KEY = "domainKey"; + private static final String ROOT_CATEGORY_NAME = "rootCategoryName"; private final ParameterSingleSelectionModel selectedDomainId; @@ -49,11 +55,12 @@ public class DomainForm extends Form { private final TextField domainUri; private final TextField version; private final Date released; + private final TextField rootCategoryName; private final SaveCancelSection saveCancelSection; public DomainForm( - final CategoriesTab categoriesTab, - final ParameterSingleSelectionModel selectedDomainId) { + final CategoriesTab categoriesTab, + final ParameterSingleSelectionModel selectedDomainId) { super("domainForm"); this.selectedDomainId = selectedDomainId; @@ -63,17 +70,17 @@ public class DomainForm extends Form { final Label target = (Label) e.getTarget(); if (selectedDomainId.getSelectedKey(state) == null) { target.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_form.heading.create_new", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_form.heading.create_new", + ADMIN_BUNDLE)); } else { final DomainRepository domainRepository = CdiUtil. - createCdiUtil().findBean(DomainRepository.class); + createCdiUtil().findBean(DomainRepository.class); final Domain domain = domainRepository.findById(Long.parseLong( - selectedDomainId.getSelectedKey(state))); + selectedDomainId.getSelectedKey(state))); target.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_form.heading.edit", - ADMIN_BUNDLE, - new String[]{domain.getDomainKey()})); + "ui.admin.categories.domain_form.heading.edit", + ADMIN_BUNDLE, + new String[]{domain.getDomainKey()})); } }); heading.setClassAttr("heading"); @@ -81,40 +88,139 @@ public class DomainForm extends Form { domainKey = new TextField(DOMAIN_KEY); domainKey.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_form.fields.domain_key", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_form.fields.domain_key", + ADMIN_BUNDLE)); add(domainKey); domainUri = new TextField(DOMAIN_URI); domainUri.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_form.fields.domain_uri", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_form.fields.domain_uri", + ADMIN_BUNDLE)); add(domainUri); version = new TextField(VERSION); version.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_form.fields.version", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_form.fields.version", + ADMIN_BUNDLE)); add(version); released = new Date(RELEASED); released.setLabel(new GlobalizedMessage( - "ui.admin.categories.domain_form.fields.released", - ADMIN_BUNDLE)); + "ui.admin.categories.domain_form.fields.released", + ADMIN_BUNDLE)); add(released); + rootCategoryName = new TextField(ROOT_CATEGORY_NAME); + rootCategoryName.setLabel(new GlobalizedMessage( + "ui.admin.categories.domain_form.fields.root_category_name", + ADMIN_BUNDLE)); + add(rootCategoryName); + saveCancelSection = new SaveCancelSection(); add(saveCancelSection); + addInitListener(e -> { + final PageState state = e.getPageState(); + + if (selectedDomainId.getSelectedKey(state) == null) { + rootCategoryName.setVisible(state, true); + } else { + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final DomainRepository domainRepository = cdiUtil.findBean( + DomainRepository.class); + final Domain domain = domainRepository.findById(Long.parseLong( + selectedDomainId.getSelectedKey(state))); + + domainKey.setValue(state, domain.getDomainKey()); + domainUri.setValue(state, domain.getUri()); + version.setValue(state, domain.getVersion()); + released.setValue(state, domain.getReleased()); + + rootCategoryName.setVisible(state, false); + } + }); + addValidationListener(e -> { + final PageState state = e.getPageState(); + + if (saveCancelSection.getSaveButton().isSelected(state)) { + final FormData data = e.getFormData(); + final String domainKeyData = data.getString(DOMAIN_KEY); + final String versionData = data.getString(VERSION); + + if (Strings.isBlank(domainKeyData)) { + data.addError( + DOMAIN_KEY, + new GlobalizedMessage( + "ui.admin.categories.domain_form.errors.domain_key_blank", + ADMIN_BUNDLE)); + } + + if (Strings.isBlank(versionData)) { + data.addError( + DOMAIN_KEY, + new GlobalizedMessage( + "ui.admin.categories.domain_form.errors.version_blank", + ADMIN_BUNDLE)); + } + } }); addProcessListener(e -> { final PageState state = e.getPageState(); + if (saveCancelSection.getSaveButton().isSelected(state)) { + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final DomainRepository domainRepository = cdiUtil.findBean( + DomainRepository.class); + final DomainManager domainManager = cdiUtil.findBean( + DomainManager.class); + + final FormData data = e.getFormData(); + final String domainKeyData = data.getString(DOMAIN_KEY); + final String domainUriData; + if (Strings.isBlank(data.getString(DOMAIN_URI))) { + domainUriData = null; + } else { + domainUriData = data.getString(DOMAIN_URI); + } + final String versionData = data.getString(VERSION); + final java.util.Date releasedData = (java.util.Date) data.get( + RELEASED); + final String rootCategoryNameData = data.getString( + ROOT_CATEGORY_NAME); + + final Domain domain; + if (selectedDomainId.getSelectedKey(state) == null) { + if (Strings.isBlank(rootCategoryNameData)) { + domain = domainManager.createDomain(domainKeyData, + domainKeyData); + } else { + domain = domainManager.createDomain( + domainKeyData, rootCategoryNameData); + } + } else { + domain = domainRepository.findById(Long.parseLong( + selectedDomainId.getSelectedKey(state))); + } + domain.setDomainKey(domainKeyData); + domain.setUri(domainUriData); + domain.setVersion(versionData); + domain.setReleased(releasedData); + + domainRepository.save(domain); + } + categoriesTab.hideNewDomainForm(state); }); } + @Override + public void register(final Page page) { + super.register(page); + + page.setVisibleDefault(rootCategoryName, false); + } + } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainsTable.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainsTable.java index 058e5aad3..42310a7b2 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainsTable.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/categories/DomainsTable.java @@ -182,7 +182,7 @@ public class DomainsTable extends Table { final DomainRepository domainRepository = cdiUtil.findBean( DomainRepository.class); if (Strings.isBlank(filterTerm)) { - domains = domainRepository.findAll(); + domains = domainRepository.findAll("Domain.withOwners"); LOGGER.debug("Found {} domains in the database.", domains.size()); } else { 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 eecc10cae..7f1a34d3a 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/Domain.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/Domain.java @@ -77,25 +77,34 @@ import javax.xml.bind.annotation.XmlRootElement; query = "SELECT d FROM Domain d WHERE d.domainKey = :key"), @NamedQuery(name = "Domain.findByUri", query = "SELECT d FROM Domain d WHERE d.uri = :uri"), + @NamedQuery(name = "Domain.findAll", + query = "SELECT d FROM Domain d ORDER BY d.domainKey"), @NamedQuery( - name = "Domain.search", - query + name = "Domain.search", + query = "SELECT d FROM Domain d " - + "WHERE d.domainKey LIKE CONCAT (LOWER(:term), '%') " - + "OR d.uri LIKE CONCAT (LOWER(:term), '%')") + + "WHERE d.domainKey LIKE CONCAT (LOWER(:term), '%') " + + "OR d.uri LIKE CONCAT (LOWER(:term), '%') " + + "ORDER BY d.domainKey") }) @NamedEntityGraphs({ @NamedEntityGraph( - name = "Domain.allCategories", - attributeNodes = { - @NamedAttributeNode(value = "root", - subgraph = "subCategories")}, - subgraphs = { - @NamedSubgraph( - name = "subCategories", - attributeNodes = { - @NamedAttributeNode("subCategories") - })}) + name = "Domain.allCategories", + attributeNodes = { + @NamedAttributeNode(value = "root", + subgraph = "subCategories")}, + subgraphs = { + @NamedSubgraph( + name = "subCategories", + attributeNodes = { + @NamedAttributeNode("subCategories") + })}), + @NamedEntityGraph( + name = "Domain.withOwners", + attributeNodes = { + @NamedAttributeNode(value = "owners") + } + ) }) @DefaultEntityGraph("Domain.allCategories") @XmlRootElement(name = "domain", namespace = CAT_XML_NS) @@ -137,11 +146,11 @@ public class Domain extends CcmObject implements Serializable { */ @Embedded @AssociationOverride( - name = "values", - joinTable = @JoinTable(name = "DOMAIN_TITLES", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "OBJECT_ID")})) + name = "values", + joinTable = @JoinTable(name = "DOMAIN_TITLES", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID")})) @XmlElement(name = "title", namespace = CAT_XML_NS) private LocalizedString title; @@ -150,11 +159,11 @@ public class Domain extends CcmObject implements Serializable { */ @Embedded @AssociationOverride( - name = "values", - joinTable = @JoinTable(name = "DOMAIN_DESCRIPTIONS", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "OBJECT_ID")})) + name = "values", + joinTable = @JoinTable(name = "DOMAIN_DESCRIPTIONS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID")})) @XmlElement(name = "description", namespace = CAT_XML_NS) private LocalizedString description; @@ -369,19 +378,19 @@ public class Domain extends CcmObject implements Serializable { @Override public String toString(final String data) { return String.format( - ", domainKey = \"%s\", " - + "uri = \"%s\", " - + "title = \"%s\", " - + "version = \"%s\", " - + "released = %tF % { return entity.getObjectId() == 0; } + @Override + public void initNewEntity(final Domain domain) { + domain.setUuid(UUID.randomUUID().toString()); + } + + @Override + public List findAll() { + if (getEntityClass().isAnnotationPresent(DefaultEntityGraph.class)) { + return findAll(getEntityClass().getAnnotation( + DefaultEntityGraph.class).value()); + } else { + final TypedQuery query = getEntityManager() + .createNamedQuery("Domain.findAll", Domain.class); + return query.getResultList(); + } + } + + @Override + public List findAll(final String entityGraphName) { + @SuppressWarnings("unchecked") + final EntityGraph entityGraph = (EntityGraph) entityManager. + getEntityGraph(entityGraphName); + return findAll(entityGraph); + } + + @Override + public List findAll(final EntityGraph entityGraph) { + final TypedQuery query = getEntityManager() + .createNamedQuery("Domain.findAll", Domain.class); + query.setHint(FETCH_GRAPH_HINT_KEY, entityGraph); + return query.getResultList(); + } + /** * Find the {@link Domain} identified by the provided {@code domainKey}. * @@ -63,7 +98,7 @@ public class DomainRepository extends AbstractEntityRepository { final TypedQuery query = entityManager.createNamedQuery( "Domain.findByKey", Domain.class); query.setParameter("key", domainKey); - + final EntityGraph graph = entityManager.getEntityGraph( "Domain.allCategories"); query.setHint("javax.persistence.fetchgraph", graph); @@ -90,12 +125,15 @@ public class DomainRepository extends AbstractEntityRepository { return query.getSingleResult(); } - + public List search(final String term) { final TypedQuery query = entityManager.createNamedQuery( - "Domain.search", Domain.class); + "Domain.search", Domain.class); query.setParameter("term", term); - + final EntityGraph graph = entityManager.getEntityGraph( + "Domain.withOwners"); + query.setHint("javax.persistence.fetchgraph", graph); + return query.getResultList(); } diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties index 6229b42c1..53ff818f0 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties @@ -358,3 +358,6 @@ ui.admin.categories.domain_form.fields.domain_key=Key ui.admin.categories.domain_form.fields.domain_uri=URI ui.admin.categories.domain_form.fields.version=Version ui.admin.categories.domain_form.fields.released=Released +ui.admin.categories.domain_form.errors.domain_key_blank=The key of a domain can't be blank. +ui.admin.categories.domain_form.errors.version_blank=The version of domain can't be blank. +ui.admin.categories.domain_form.fields.root_category_name=Name of root category diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties index 091d140ab..16eb8cb7e 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties @@ -361,3 +361,6 @@ ui.admin.categories.domain_form.fields.domain_key=Name ui.admin.categories.domain_form.fields.domain_uri=URI ui.admin.categories.domain_form.fields.version=Version ui.admin.categories.domain_form.fields.released=Freigegeben +ui.admin.categories.domain_form.errors.domain_key_blank=Der Key einer Domain darf nicht leer sein. +ui.admin.categories.domain_form.errors.version_blank=Die Version einer Domain darf nicht leer sein. +ui.admin.categories.domain_form.fields.root_category_name=Name der Wurzelkategorie diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties index d30c1bb29..19479f5de 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties @@ -334,3 +334,6 @@ ui.admin.categories.domain_form.fields.domain_key=Key ui.admin.categories.domain_form.fields.domain_uri=URI ui.admin.categories.domain_form.fields.version=Version ui.admin.categories.domain_form.fields.released=Released +ui.admin.categories.domain_form.errors.domain_key_blank=The key of a domain can't be blank. +ui.admin.categories.domain_form.errors.version_blank=The version of domain can't be blank. +ui.admin.categories.domain_form.fields.root_category_name=Name of root category diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties index 6ef2bc953..22049db9b 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties @@ -325,3 +325,6 @@ ui.admin.categories.domain_form.fields.domain_key=Key ui.admin.categories.domain_form.fields.domain_uri=URI ui.admin.categories.domain_form.fields.version=Version ui.admin.categories.domain_form.fields.released=Released +ui.admin.categories.domain_form.errors.domain_key_blank=The key of a domain can't be blank. +ui.admin.categories.domain_form.errors.version_blank=The version of domain can't be blank. +ui.admin.categories.domain_form.fields.root_category_name=Name of root category