libreccm-legacy/ccm-navigation/src/com/arsdigita/navigation/CategoryWidget.java

157 lines
5.4 KiB
Java
Executable File

/**
* This is a specialised version of com.arsdigita.cms.ui.authoring.CategoryWidget
* which adds an isEmpty attribute to the category elements.
*/
package com.arsdigita.navigation;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.categorization.Category;
import com.arsdigita.categorization.CategoryCollection;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.TemplateContext;
import com.arsdigita.domain.DomainCollection;
import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.kernel.ACSObjectCollection;
import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.OID;
import com.arsdigita.persistence.SessionManager;
import com.arsdigita.xml.Element;
import com.arsdigita.xml.XML;
import com.arsdigita.london.terms.Domain;
public class CategoryWidget extends com.arsdigita.cms.ui.authoring.CategoryWidget {
public CategoryWidget(String name,BigDecimalParameter root,StringParameter mode) {
super(name, root, mode);
}
public void generateWidget(String name, Element parent) {
BigDecimal theRoot = getCategoryForName(name);
Element widget = parent.newChildElement("cms:categoryWidget",CMS.CMS_XML_NS);
exportAttributes(widget);
widget.addAttribute("name", getName());
Set ids = new HashSet();
Category root = (Category)DomainObjectFactory.newInstance(
new OID(Category.BASE_DATA_OBJECT_TYPE,theRoot)
);
CategoryCollection cats = root.getDescendants();
cats.addEqualsFilter("parents.link.relationType", "child");
cats.addPath("parents.link.sortKey");
cats.addPath("parents.id");
Map children = new HashMap();
while (cats.next()) {
Category cat = cats.getCategory();
BigDecimal parentID = (BigDecimal)cats.get("parents.id");
List childList = (List)children.get(parentID);
if (childList == null) {
childList = new ArrayList();
children.put(parentID, childList);
}
childList.add(new CategorySortKeyPair(cat,(BigDecimal)cats.get("parents.link.sortKey")));
}
generateCategory(widget, null, root, null, ids, children);
}
public void generateCategory(Element parent,
String path,
Category cat,
BigDecimal sortKey,
Set selected,
Map children) {
Element el = new Element("cms:category",CMS.CMS_XML_NS);
el.addAttribute("id", XML.format(cat.getID()));
el.addAttribute("name", cat.getName());
el.addAttribute("description", cat.getDescription());
el.addAttribute("isSelected", selected.contains(cat.getID()) ? "1" : "0");
el.addAttribute("isAbstract", cat.isAbstract() ? "1" : "0");
el.addAttribute("isEnabled", cat.isEnabled() ? "1" : "0");
// Find out if this category is empty or not...
ACSObjectCollection result = new ACSObjectCollection(SessionManager.getSession().retrieve(ContentItem.BASE_DATA_OBJECT_TYPE));
result.addEqualsFilter("categories.roTransParents."+ID, cat.getID());
result.addEqualsFilter("version", "live");
el.addAttribute("isEmpty",(int)result.size()==0 ? "1" : "0");
if (sortKey != null) {
el.addAttribute("sortKey", sortKey.toString());
}
String fullname = path == null ? "/" : path + " > " + cat.getName();
el.addAttribute("fullname", fullname);
parent.addContent(el);
List c = (List)children.get(cat.getID());
if (c != null) {
Iterator i = c.iterator();
while (i.hasNext()) {
CategorySortKeyPair pair = (CategorySortKeyPair) i.next();
Category child = pair.getCategory();
BigDecimal childSortKey = pair.getSortKey();
generateCategory(el, fullname, child,childSortKey, selected, children);
}
}
}
private class CategorySortKeyPair {
private Category m_category;
private BigDecimal m_sortKey;
public CategorySortKeyPair(Category category, BigDecimal sortKey) {
m_category = category;
m_sortKey = sortKey;
}
public Category getCategory() {
return m_category;
}
public BigDecimal getSortKey() {
return m_sortKey;
}
}
private static BigDecimal getCategoryForName(String name) {
if(false) {
return new BigDecimal(52870);
}
DataCollection objs = SessionManager.getSession().retrieve(Domain.BASE_DATA_OBJECT_TYPE);
objs.addEqualsFilter("title", name);
String dispatcherContext = null;
TemplateContext tc = Navigation.getContext().getTemplateContext();
if (tc != null) {
dispatcherContext = tc.getContext();
}
objs.addEqualsFilter("model.ownerUseContext.useContext", dispatcherContext);
DomainCollection domains = new DomainCollection(objs);
if (domains.next()) {
Category cat = null;
cat = ((Domain) domains.getDomainObject()).getModel();
return cat.getID();
} else {
return new BigDecimal(-1);
}
}
}