CCM NG: Item Category Step basically works now

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5000 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: 582b180d94
pull/2/head
jensp 2017-09-14 17:01:00 +00:00
parent d5ac27515d
commit 2e12a3d532
8 changed files with 173 additions and 84 deletions

View File

@ -124,56 +124,55 @@ public class ItemCategoryStep extends SimpleContainer implements Resettable {
} }
@Override @Override
public void register(Page p public void register(final Page page) {
) { super.register(page);
super.register(p);
p.setVisibleDefault(addComponent, false); page.setVisibleDefault(addComponent, false);
// for (int i=0;i<extensionsCount;i++) { for (int i = 0; i < extensionsCount; i++) {
// p.setVisibleDefault(extensionForms[i], false); page.setVisibleDefault(extensionForms[i], false);
// } }
p.addGlobalStateParam(rootParameter); page.addGlobalStateParam(rootParameter);
p.addGlobalStateParam(modeParameter); page.addGlobalStateParam(modeParameter);
} }
@Override @Override
public void reset(PageState state public void reset(final PageState state) {
) {
state.setValue(rootParameter, null); state.setValue(rootParameter, null);
state.setValue(modeParameter, null); state.setValue(modeParameter, null);
itemCategorySummary.setVisible(state, true); itemCategorySummary.setVisible(state, true);
addComponent.setVisible(state, false); addComponent.setVisible(state, false);
// for (int i=0;i<extensionsCount;i++) { for (int i = 0; i < extensionsCount; i++) {
// extensionSummaries[i].setVisible(state, true); extensionSummaries[i].setVisible(state, true);
// extensionForms[i].setVisible(state, false); extensionForms[i].setVisible(state, false);
// } }
} }
private class AddActionListener implements ActionListener { private class AddActionListener implements ActionListener {
private String m_mode; private final String mode;
public AddActionListener(String mode) { public AddActionListener(final String mode) {
m_mode = mode; this.mode = mode;
} }
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(final ActionEvent event) {
PageState state = e.getPageState();
final PageState state = event.getPageState();
state.setValue(rootParameter, state.setValue(rootParameter,
new BigDecimal(state.getControlEventValue())); new BigDecimal(state.getControlEventValue()));
state.setValue(ItemCategoryStep.this.modeParameter, state.setValue(ItemCategoryStep.this.modeParameter,
m_mode); mode);
itemCategorySummary.setVisible(state, false); itemCategorySummary.setVisible(state, false);
addComponent.setVisible(state, true); addComponent.setVisible(state, true);
// for (int i=0;i<extensionsCount;i++) { for (int i=0;i<extensionsCount;i++) {
// extensionSummaries[i].setVisible(state, false); extensionSummaries[i].setVisible(state, false);
// extensionForms[i].setVisible(state, false); extensionForms[i].setVisible(state, false);
// } }
} }
} }
@ -182,7 +181,7 @@ public class ItemCategoryStep extends SimpleContainer implements Resettable {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
PageState state = e.getPageState(); final PageState state = e.getPageState();
reset(state); reset(state);
throw new RedirectSignal(state.toURL(), true); throw new RedirectSignal(state.toURL(), true);
} }
@ -191,21 +190,22 @@ public class ItemCategoryStep extends SimpleContainer implements Resettable {
private class ExtensionListener implements ActionListener { private class ExtensionListener implements ActionListener {
int extensionIndex; private final int extensionIndex;
public ExtensionListener(int i) { public ExtensionListener(int extensionIndex) {
extensionIndex = i; this.extensionIndex = extensionIndex;
} }
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(final ActionEvent event) {
PageState state = e.getPageState();
final PageState state = event.getPageState();
itemCategorySummary.setVisible(state, false); itemCategorySummary.setVisible(state, false);
addComponent.setVisible(state, false); addComponent.setVisible(state, false);
// for (int i=0;i<extensionsCount;i++) { for (int i=0;i<extensionsCount;i++) {
// extensionSummaries[i].setVisible(state, false); extensionSummaries[i].setVisible(state, false);
// } }
// extensionForms[extensionIndex].setVisible(state, true); extensionForms[extensionIndex].setVisible(state, true);
} }
} }

View File

@ -33,6 +33,7 @@ import org.libreccm.categorization.DomainRepository;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import java.math.BigDecimal;
import java.util.Optional; import java.util.Optional;
/** /**
@ -157,23 +158,26 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
// } // }
// } // }
protected Domain getDomain(final PageState state) { protected Domain getDomain(final PageState state) {
LOGGER.debug("Getting domain for {}", state.getValue(rootParam)); LOGGER.debug("Getting domain for {}", state.getValue(rootParam));
final Long domainId = (Long) state.getValue(rootParam); final Object value = state.getValue(rootParam);
final Long domainId;
if (value instanceof Long) {
domainId = (Long) value;
} else if (value instanceof BigDecimal) {
domainId = ((Number) value).longValue();
} else if (value instanceof String) {
domainId = Long.parseLong((String) value);
} else {
domainId = Long.parseLong(value.toString());
}
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final DomainRepository domainRepo = cdiUtil final CategoryPickerController controller = cdiUtil
.findBean(DomainRepository.class); .findBean(CategoryPickerController.class);
final Optional<Domain> domain = domainRepo return controller.findDomainByRootCategory(domainId);
.findById(domainId);
if (domain.isPresent()) {
return domain.get();
} else {
LOGGER.warn("No Domain for ID {} found.", domainId);
return null;
}
} }
/** /**

View File

@ -20,9 +20,6 @@ package com.arsdigita.london.terms.ui;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; 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.Category;
import org.libreccm.categorization.CategoryManager; import org.libreccm.categorization.CategoryManager;
import org.libreccm.categorization.CategoryRepository; import org.libreccm.categorization.CategoryRepository;
@ -40,6 +37,11 @@ import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; 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; import javax.transaction.Transactional;
/** /**
@ -66,7 +68,26 @@ class CategoryPickerController {
@Inject @Inject
private DomainManager domainManager; private DomainManager domainManager;
@Inject
private EntityManager entityManager;
@Transactional(Transactional.TxType.REQUIRED)
protected Domain findDomainByRootCategory(final long rootCategoryId) {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Domain> query = builder.createQuery(Domain.class);
final Root<Domain> from = query.from(Domain.class);
final Join<Domain, Category> rootCatJoin = from.join("root");
query.where(builder.equal(rootCatJoin.get("objectId"), rootCategoryId));
return entityManager
.createQuery(query)
.getSingleResult();
}
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected List<Category> getCurrentCategories(final Domain domain, protected List<Category> getCurrentCategories(final Domain domain,
final CcmObject object) { final CcmObject object) {
@ -183,7 +204,10 @@ class CategoryPickerController {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected List<Category> getRootCategories(final Domain domain) { protected List<Category> getRootCategories(final Domain domain) {
return getDomainModelCategory(domain).getSubCategories(); return getDomainModelCategory(domain)
.getSubCategories()
.stream()
.collect(Collectors.toList());
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)

View File

@ -22,7 +22,6 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -37,8 +36,6 @@ import org.libreccm.categorization.Category;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
import org.libreccm.categorization.Domain; import org.libreccm.categorization.Domain;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
@ -98,6 +95,7 @@ public class TermWidget extends Widget {
@Override @Override
protected void generateWidget(final PageState state, final Element parent) { protected void generateWidget(final PageState state, final Element parent) {
final Domain domain = picker.getDomain(state); final Domain domain = picker.getDomain(state);
final Element widget = parent.newChildElement("cms:categoryWidget", final Element widget = parent.newChildElement("cms:categoryWidget",

View File

@ -20,7 +20,7 @@ package org.arsdigita.cms;
import com.arsdigita.bebop.form.DHTMLEditor; import com.arsdigita.bebop.form.DHTMLEditor;
import com.arsdigita.cms.ui.authoring.ItemCategoryExtension; 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.cdi.utils.CdiUtil;
import org.libreccm.configuration.Configuration; import org.libreccm.configuration.Configuration;
@ -372,7 +372,7 @@ public class CMSConfig {
private int xmlCacheAge = 60 * 60 * 24; private int xmlCacheAge = 60 * 60 * 24;
@Setting @Setting
private String categoryAuthoringAddForm = ItemCategoryForm.class.getName(); private String categoryAuthoringAddForm = ItemCategoryPicker.class.getName();
@Setting @Setting
private String categoryAuthoringExtension = ItemCategoryExtension.class private String categoryAuthoringExtension = ItemCategoryExtension.class

View File

@ -19,6 +19,9 @@
package com.arsdigita.categorization.ui; package com.arsdigita.categorization.ui;
import org.libreccm.categorization.Category; 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.CcmObject;
import org.libreccm.core.CcmObjectRepository; import org.libreccm.core.CcmObjectRepository;
@ -30,33 +33,83 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.transaction.Transactional; import javax.transaction.Transactional;
/** /**
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
class ACSObjectCategoryController { class ACSObjectCategoryController {
@Inject
private CategoryRepository categoryRepo;
@Inject
private CategoryManager categoryManager;
@Inject @Inject
private CcmObjectRepository ccmObjectRepo; private CcmObjectRepository ccmObjectRepo;
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected List<Category> getCategoriesForObject(final CcmObject object) { protected List<Category> getCategoriesForObject(final CcmObject object) {
Objects.requireNonNull(object); Objects.requireNonNull(object);
final CcmObject ccmObject = ccmObjectRepo final CcmObject ccmObject = ccmObjectRepo
.findById(object.getObjectId()) .findById(object.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String .orElseThrow(() -> new IllegalArgumentException(String
.format("No CcmObject with ID %d in the database", .format("No CcmObject with ID %d in the database",
object.getObjectId()))); object.getObjectId())));
return ccmObject return ccmObject
.getCategories() .getCategories()
.stream() .stream()
.map(categorization -> categorization.getCategory()) .map(categorization -> categorization.getCategory())
.collect(Collectors.toList()); .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);
}
} }

View File

@ -44,6 +44,7 @@ import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import org.libreccm.core.UnexpectedErrorException; import org.libreccm.core.UnexpectedErrorException;
import java.math.BigDecimal;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -82,10 +83,10 @@ public abstract class ACSObjectCategoryForm extends Form {
categoryWidget.addValidationListener(new NotNullValidationListener()); categoryWidget.addValidationListener(new NotNullValidationListener());
saveCancelSection = new SaveCancelSection(); saveCancelSection = new SaveCancelSection();
add(categoryWidget); super.add(categoryWidget);
add(saveCancelSection); super.add(saveCancelSection);
addInitListener(new FormInitListener() { super.addInitListener(new FormInitListener() {
@Override @Override
public void init(final FormSectionEvent event) public void init(final FormSectionEvent event)
@ -96,11 +97,11 @@ public abstract class ACSObjectCategoryForm extends Form {
final List<Long> selectedCats = new ArrayList<>(); final List<Long> selectedCats = new ArrayList<>();
final Set<Long> ancestorCats = new HashSet<>(); final Set<Long> ancestorCats = new HashSet<>();
final List<Category> categories = object final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
.getCategories() final ACSObjectCategoryController controller = cdiUtil
.stream() .findBean(ACSObjectCategoryController.class);
.map(categorization -> categorization.getCategory()) final List<Category> categories = controller
.collect(Collectors.toList()); .getCategoriesForObject(object);
for (final Category category : categories) { for (final Category category : categories) {
selectedCats.add(category.getObjectId()); selectedCats.add(category.getObjectId());
addAncestorCats(ancestorCats, category); addAncestorCats(ancestorCats, category);
@ -117,7 +118,7 @@ public abstract class ACSObjectCategoryForm extends Form {
}); });
addProcessListener(new FormProcessListener() { super.addProcessListener(new FormProcessListener() {
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
@ -127,19 +128,27 @@ public abstract class ACSObjectCategoryForm extends Form {
final CcmObject object = getObject(state); final CcmObject object = getObject(state);
final Set<Long> curSelectedCat = object final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
.getCategories() final ACSObjectCategoryController controller = cdiUtil
.findBean(ACSObjectCategoryController.class);
final Set<Long> curSelectedCat = controller
.getCategoriesForObject(object)
.stream() .stream()
.map(categorization -> categorization.getCategory())
.map(category -> category.getObjectId()) .map(category -> category.getObjectId())
.collect(Collectors.toSet()); .collect(Collectors.toSet());
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryRepository categoryRepo = cdiUtil final CategoryRepository categoryRepo = cdiUtil
.findBean(CategoryRepository.class); .findBean(CategoryRepository.class);
final CategoryManager categoryManager = cdiUtil final CategoryManager categoryManager = cdiUtil
.findBean(CategoryManager.class); .findBean(CategoryManager.class);
final Long[] ids = (Long[]) categoryWidget.getValue(state); final List<Long> ids = new ArrayList<>();
for (final BigDecimal value : (BigDecimal[]) categoryWidget
.getValue(state)) {
ids.add(value.longValue());
}
for (final Long id : ids) { for (final Long id : ids) {
final Category cat = categoryRepo final Category cat = categoryRepo
.findById(id) .findById(id)
@ -148,11 +157,10 @@ public abstract class ACSObjectCategoryForm extends Form {
+ "Where did that ID come from?", + "Where did that ID come from?",
id))); id)));
if (!curSelectedCat.contains(id)) { if (!curSelectedCat.contains(id)) {
categoryManager.addObjectToCategory(object, cat); controller.addObjectToCategory(object, cat);
} else { } else {
try { try {
categoryManager controller.removeObjectFromCategory(object, cat);
.removeObjectFromCategory(object, cat);
} catch (ObjectNotAssignedToCategoryException ex) { } catch (ObjectNotAssignedToCategoryException ex) {
throw new UnexpectedErrorException(ex); throw new UnexpectedErrorException(ex);
} }
@ -163,7 +171,7 @@ public abstract class ACSObjectCategoryForm extends Form {
} }
}); });
addSubmissionListener(new FormSubmissionListener() { super.addSubmissionListener(new FormSubmissionListener() {
@Override @Override
public void submitted(final FormSectionEvent event) public void submitted(final FormSectionEvent event)
@ -185,7 +193,9 @@ public abstract class ACSObjectCategoryForm extends Form {
private void addAncestorCats(final Set<Long> ancestorCats, private void addAncestorCats(final Set<Long> ancestorCats,
final Category category) { final Category category) {
ancestorCats.add(category.getParentCategory().getObjectId()); if (category.getParentCategory() != null) {
ancestorCats.add(category.getParentCategory().getObjectId());
}
} }

View File

@ -172,7 +172,7 @@ public abstract class ACSObjectCategorySummary extends SimpleComponent {
ACTION_ADD_JS, ACTION_ADD_JS,
Long.toString(rootCategory.getObjectId())); Long.toString(rootCategory.getObjectId()));
try { try {
root.addAttribute("addJsAction", root.addAttribute("addJSAction",
XML.format(state.stateAsURL())); XML.format(state.stateAsURL()));
} catch (IOException ex) { } catch (IOException ex) {
throw new UnexpectedErrorException("cannot generate URL", throw new UnexpectedErrorException("cannot generate URL",