From 076dd00301a94fd0306a631dd9ca796bbe71b1e0 Mon Sep 17 00:00:00 2001 From: jensp Date: Thu, 14 Sep 2017 17:01:00 +0000 Subject: [PATCH] CCM NG: Item Category Step basically works now git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5000 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/ui/authoring/ItemCategoryStep.java | 70 +++++++++---------- .../terms/ui/ACSObjectCategoryPicker.java | 28 ++++---- .../terms/ui/CategoryPickerController.java | 32 +++++++-- .../arsdigita/london/terms/ui/TermWidget.java | 4 +- .../java/org/arsdigita/cms/CMSConfig.java | 4 +- .../ui/ACSObjectCategoryController.java | 69 +++++++++++++++--- .../ui/ACSObjectCategoryForm.java | 48 ++++++++----- .../ui/ACSObjectCategorySummary.java | 2 +- 8 files changed, 173 insertions(+), 84 deletions(-) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ItemCategoryStep.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ItemCategoryStep.java index b8fe6b3eb..30a146d23 100755 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ItemCategoryStep.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/authoring/ItemCategoryStep.java @@ -124,56 +124,55 @@ public class ItemCategoryStep extends SimpleContainer implements Resettable { } @Override - public void register(Page p - ) { - super.register(p); + public void register(final Page page) { + super.register(page); - p.setVisibleDefault(addComponent, false); -// for (int i=0;i domain = domainRepo - .findById(domainId); - - if (domain.isPresent()) { - return domain.get(); - } else { - LOGGER.warn("No Domain for ID {} found.", domainId); - return null; - } + return controller.findDomainByRootCategory(domainId); } /** diff --git a/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/CategoryPickerController.java b/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/CategoryPickerController.java index df1eb1dbc..005df55de 100644 --- a/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/CategoryPickerController.java +++ b/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/CategoryPickerController.java @@ -20,9 +20,6 @@ package com.arsdigita.london.terms.ui; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.libreccm.categorization.Categorization; -import org.libreccm.categorization.CategorizationConstants; -import org.libreccm.categorization.CategorizationMarshaller; import org.libreccm.categorization.Category; import org.libreccm.categorization.CategoryManager; import org.libreccm.categorization.CategoryRepository; @@ -40,6 +37,11 @@ import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.Root; import javax.transaction.Transactional; /** @@ -66,7 +68,26 @@ class CategoryPickerController { @Inject private DomainManager domainManager; + + @Inject + private EntityManager entityManager; + @Transactional(Transactional.TxType.REQUIRED) + protected Domain findDomainByRootCategory(final long rootCategoryId) { + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery query = builder.createQuery(Domain.class); + + final Root from = query.from(Domain.class); + final Join rootCatJoin = from.join("root"); + + query.where(builder.equal(rootCatJoin.get("objectId"), rootCategoryId)); + + return entityManager + .createQuery(query) + .getSingleResult(); + } + @Transactional(Transactional.TxType.REQUIRED) protected List getCurrentCategories(final Domain domain, final CcmObject object) { @@ -183,7 +204,10 @@ class CategoryPickerController { @Transactional(Transactional.TxType.REQUIRED) protected List getRootCategories(final Domain domain) { - return getDomainModelCategory(domain).getSubCategories(); + return getDomainModelCategory(domain) + .getSubCategories() + .stream() + .collect(Collectors.toList()); } @Transactional(Transactional.TxType.REQUIRED) diff --git a/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/TermWidget.java b/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/TermWidget.java index 24c86f308..cb1d0f80f 100644 --- a/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/TermWidget.java +++ b/ccm-cms/src/main/java/com/arsdigita/london/terms/ui/TermWidget.java @@ -22,7 +22,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -37,8 +36,6 @@ import org.libreccm.categorization.Category; import com.arsdigita.cms.CMS; -import org.librecms.contentsection.ContentItem; -import org.librecms.contentsection.ContentSection; import org.libreccm.categorization.Domain; import com.arsdigita.xml.Element; @@ -98,6 +95,7 @@ public class TermWidget extends Widget { @Override protected void generateWidget(final PageState state, final Element parent) { + final Domain domain = picker.getDomain(state); final Element widget = parent.newChildElement("cms:categoryWidget", diff --git a/ccm-cms/src/main/java/org/arsdigita/cms/CMSConfig.java b/ccm-cms/src/main/java/org/arsdigita/cms/CMSConfig.java index 838266bc9..435075971 100644 --- a/ccm-cms/src/main/java/org/arsdigita/cms/CMSConfig.java +++ b/ccm-cms/src/main/java/org/arsdigita/cms/CMSConfig.java @@ -20,7 +20,7 @@ package org.arsdigita.cms; import com.arsdigita.bebop.form.DHTMLEditor; import com.arsdigita.cms.ui.authoring.ItemCategoryExtension; -import com.arsdigita.cms.ui.authoring.ItemCategoryForm; +import com.arsdigita.london.terms.ui.ItemCategoryPicker; import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.configuration.Configuration; @@ -372,7 +372,7 @@ public class CMSConfig { private int xmlCacheAge = 60 * 60 * 24; @Setting - private String categoryAuthoringAddForm = ItemCategoryForm.class.getName(); + private String categoryAuthoringAddForm = ItemCategoryPicker.class.getName(); @Setting private String categoryAuthoringExtension = ItemCategoryExtension.class diff --git a/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryController.java b/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryController.java index e320c1a60..f46b6cbe4 100644 --- a/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryController.java +++ b/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryController.java @@ -19,6 +19,9 @@ package com.arsdigita.categorization.ui; import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryManager; +import org.libreccm.categorization.CategoryRepository; +import org.libreccm.categorization.ObjectNotAssignedToCategoryException; import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObjectRepository; @@ -30,33 +33,83 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.transaction.Transactional; - /** * * @author Jens Pelzetter */ @RequestScoped - class ACSObjectCategoryController { +class ACSObjectCategoryController { + + @Inject + private CategoryRepository categoryRepo; + + @Inject + private CategoryManager categoryManager; @Inject private CcmObjectRepository ccmObjectRepo; - + @Transactional(Transactional.TxType.REQUIRED) protected List getCategoriesForObject(final CcmObject object) { - + Objects.requireNonNull(object); - + final CcmObject ccmObject = ccmObjectRepo - .findById(object.getObjectId()) - .orElseThrow(() -> new IllegalArgumentException(String + .findById(object.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String .format("No CcmObject with ID %d in the database", object.getObjectId()))); - + return ccmObject .getCategories() .stream() .map(categorization -> categorization.getCategory()) .collect(Collectors.toList()); } + + @Transactional(Transactional.TxType.REQUIRED) + protected void addObjectToCategory(final CcmObject object, + final Category category) { + + Objects.requireNonNull(object); + Objects.requireNonNull(category); + + final CcmObject ccmObject = ccmObjectRepo + .findById(object.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No CcmObject with ID %d in the database", + object.getObjectId()))); + + final Category cat = categoryRepo + .findById(category.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No Category with ID %d in the database.", + category.getObjectId()))); + + categoryManager.addObjectToCategory(ccmObject, cat); + } + @Transactional(Transactional.TxType.REQUIRED) + protected void removeObjectFromCategory(final CcmObject object, + final Category category) + throws ObjectNotAssignedToCategoryException { + + Objects.requireNonNull(object); + Objects.requireNonNull(category); + + final CcmObject ccmObject = ccmObjectRepo + .findById(object.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No CcmObject with ID %d in the database", + object.getObjectId()))); + + final Category cat = categoryRepo + .findById(category.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No Category with ID %d in the database.", + category.getObjectId()))); + + categoryManager.removeObjectFromCategory(ccmObject, cat); + } + } diff --git a/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java b/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java index bb9052e5d..fce1594a9 100755 --- a/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java +++ b/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java @@ -44,6 +44,7 @@ import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.core.CcmObject; import org.libreccm.core.UnexpectedErrorException; +import java.math.BigDecimal; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -82,10 +83,10 @@ public abstract class ACSObjectCategoryForm extends Form { categoryWidget.addValidationListener(new NotNullValidationListener()); saveCancelSection = new SaveCancelSection(); - add(categoryWidget); - add(saveCancelSection); + super.add(categoryWidget); + super.add(saveCancelSection); - addInitListener(new FormInitListener() { + super.addInitListener(new FormInitListener() { @Override public void init(final FormSectionEvent event) @@ -96,11 +97,11 @@ public abstract class ACSObjectCategoryForm extends Form { final List selectedCats = new ArrayList<>(); final Set ancestorCats = new HashSet<>(); - final List categories = object - .getCategories() - .stream() - .map(categorization -> categorization.getCategory()) - .collect(Collectors.toList()); + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ACSObjectCategoryController controller = cdiUtil + .findBean(ACSObjectCategoryController.class); + final List categories = controller + .getCategoriesForObject(object); for (final Category category : categories) { selectedCats.add(category.getObjectId()); addAncestorCats(ancestorCats, category); @@ -117,7 +118,7 @@ public abstract class ACSObjectCategoryForm extends Form { }); - addProcessListener(new FormProcessListener() { + super.addProcessListener(new FormProcessListener() { @Override public void process(final FormSectionEvent event) @@ -127,19 +128,27 @@ public abstract class ACSObjectCategoryForm extends Form { final CcmObject object = getObject(state); - final Set curSelectedCat = object - .getCategories() + final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); + final ACSObjectCategoryController controller = cdiUtil + .findBean(ACSObjectCategoryController.class); + + final Set curSelectedCat = controller + .getCategoriesForObject(object) .stream() - .map(categorization -> categorization.getCategory()) .map(category -> category.getObjectId()) .collect(Collectors.toSet()); - final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CategoryRepository categoryRepo = cdiUtil .findBean(CategoryRepository.class); final CategoryManager categoryManager = cdiUtil .findBean(CategoryManager.class); - final Long[] ids = (Long[]) categoryWidget.getValue(state); + final List ids = new ArrayList<>(); + for (final BigDecimal value : (BigDecimal[]) categoryWidget + .getValue(state)) { + + ids.add(value.longValue()); + + } for (final Long id : ids) { final Category cat = categoryRepo .findById(id) @@ -148,11 +157,10 @@ public abstract class ACSObjectCategoryForm extends Form { + "Where did that ID come from?", id))); if (!curSelectedCat.contains(id)) { - categoryManager.addObjectToCategory(object, cat); + controller.addObjectToCategory(object, cat); } else { try { - categoryManager - .removeObjectFromCategory(object, cat); + controller.removeObjectFromCategory(object, cat); } catch (ObjectNotAssignedToCategoryException ex) { throw new UnexpectedErrorException(ex); } @@ -163,7 +171,7 @@ public abstract class ACSObjectCategoryForm extends Form { } }); - addSubmissionListener(new FormSubmissionListener() { + super.addSubmissionListener(new FormSubmissionListener() { @Override public void submitted(final FormSectionEvent event) @@ -185,7 +193,9 @@ public abstract class ACSObjectCategoryForm extends Form { private void addAncestorCats(final Set ancestorCats, final Category category) { - ancestorCats.add(category.getParentCategory().getObjectId()); + if (category.getParentCategory() != null) { + ancestorCats.add(category.getParentCategory().getObjectId()); + } } diff --git a/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategorySummary.java b/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategorySummary.java index 290c63e5f..c6f4ed84c 100755 --- a/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategorySummary.java +++ b/ccm-core/src/main/java/com/arsdigita/categorization/ui/ACSObjectCategorySummary.java @@ -172,7 +172,7 @@ public abstract class ACSObjectCategorySummary extends SimpleComponent { ACTION_ADD_JS, Long.toString(rootCategory.getObjectId())); try { - root.addAttribute("addJsAction", + root.addAttribute("addJSAction", XML.format(state.stateAsURL())); } catch (IOException ex) { throw new UnexpectedErrorException("cannot generate URL",