diff --git a/ccm-core/src/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java b/ccm-core/src/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java index 23af77009..dd7f8cb03 100755 --- a/ccm-core/src/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java +++ b/ccm-core/src/com/arsdigita/categorization/ui/ACSObjectCategoryForm.java @@ -41,6 +41,7 @@ import com.arsdigita.categorization.CategoryCollection; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.kernel.ACSObject; import com.arsdigita.persistence.OID; +import java.util.HashSet; /** * abstract form for assigning categories to acs_objects. The assigned @@ -110,13 +111,23 @@ public abstract class ACSObjectCategoryForm extends Form { ACSObject object = getObject(state); + HashSet curSelectesdCat = new HashSet(); + CategoryCollection cats = new CategorizedObject(object).getParents(); + while (cats.next()) { + curSelectesdCat.add(cats.getCategory().getID()); + } + BigDecimal[] ids = (BigDecimal[]) m_category.getValue(state); for (int i = 0; i < ids.length; i++) { Category cat = (Category) DomainObjectFactory.newInstance( new OID(Category.BASE_DATA_OBJECT_TYPE, ids[i])); - cat.addChild(object); + if(!curSelectesdCat.contains(ids[i])) { + cat.addChild(object); + } else { + cat.removeChild(object); + } } fireCompletionEvent(state); diff --git a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/ACSObjectCategoryPicker.java b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/ACSObjectCategoryPicker.java index 8b6f6ef93..dd892c24c 100644 --- a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/ACSObjectCategoryPicker.java +++ b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/ACSObjectCategoryPicker.java @@ -15,7 +15,6 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - package com.arsdigita.london.terms.ui; import com.arsdigita.bebop.SimpleContainer; @@ -54,31 +53,28 @@ import org.apache.log4j.Logger; public abstract class ACSObjectCategoryPicker extends SimpleContainer { private static final Logger s_log = Logger.getLogger(ACSObjectCategoryPicker.class); - private ACSObjectCategoryForm m_form; private BigDecimalParameter m_root; - public ACSObjectCategoryPicker(BigDecimalParameter root, - StringParameter mode) { - - m_form = getForm(root, mode); + public ACSObjectCategoryPicker(BigDecimalParameter root, StringParameter mode) { + + m_form = getForm(root, mode); m_root = root; add(m_form); m_form.addCompletionListener(new ItemCategoryFormCompletion()); } - + protected abstract ACSObjectCategoryForm getForm(BigDecimalParameter root, - StringParameter mode); - + StringParameter mode); + protected abstract ACSObject getObject(PageState state); - - - - + private class ItemCategoryFormCompletion implements ActionListener { + + @Override public void actionPerformed(ActionEvent ev) { - + PageState state = ev.getPageState(); Domain domain = getDomain(state); String domainKey = domain.getKey(); @@ -87,80 +83,76 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer { s_log.debug("Saving categories in: " + domainKey); } - ACSObject object = getObject(state); - - if ("LGCL".equals(domainKey)) { - lgclSelected(domain, object); - } +// ACSObject object = getObject(state); +// +// if ("LGCL".equals(domainKey)) { +// lgclSelected(domain, object); +// } else if ("LGDL".equals(domainKey)) { +// lgdlSelected(domain, object); +// } - else if ("LGDL".equals(domainKey)) { - lgdlSelected(domain, object); - } - - fireCompletionEvent(state); - } - - private void lgclSelected(Domain domain, ACSObject object) { - List lgclTerms = getCurrentCategories(domain, object); - - Domain gcl = Domain.retrieve("GCL"); - Collection gclTerms = getRelatedTerms(lgclTerms, gcl); - clearTerms(gcl, object); - assignTerms(gclTerms, object); - - // The assignment below is removed to satisfy requirement 4.1, - // use case 1 of the document "Metadata Improvements" version 1 - // by Camden, dated 23/01/05. - //Domain lgsl = Domain.retrieve("LGSL"); - //Collection lgslTerms = getRelatedTerms(lgclTerms, lgsl); - //clearTerms(lgsl, object); - //assignTerms(lgslTerms, object); - - // adding processing or mapping from LGCL to APLAWS-NAV too -// Deactivated here. -// If needed -// boolean lgclOverrideAnav = Aplaws.getAplawsConfig().getOverrideAnavFromLGCLMappings().booleanValue(); -// if (lgclOverrideAnav) { -// Domain aplawsNav = Domain.retrieve("APLAWS-NAV"); -// Collection aplawsNavTerms = getRelatedTerms(lgclTerms, aplawsNav); -// clearTerms(aplawsNav, object); -// assignTerms(aplawsNavTerms, object); -// } - } - - // User has selected a term in the LGDL hierarchy, which includes - // terms from the LGSL. We're only interested in LGSL terms here. - private void lgdlSelected(Domain domain, ACSObject object) { - Domain lgsl = Domain.retrieve("LGSL"); - Domain gcl = Domain.retrieve("GCL"); - Domain lgcl = Domain.retrieve("LGCL"); - - // We have a mapping LGSL -> LGCL based on the reverse of a - // published mapping. We don't have a mapping LGSL -> GCL, so we - // do LGSL -> LGCL -> GCL instead. - - List lgslTerms = getCurrentCategories(lgsl, object); - Collection lgclTerms = getRelatedTerms(lgslTerms, lgcl); - - LinkedList lgclIDs = new LinkedList(); - Iterator i = lgclTerms.iterator(); - while (i.hasNext()) { - Term term = (Term) i.next(); - lgclIDs.add(term.getModel().getID()); - } - - Collection gclTerms = getRelatedTerms(lgclIDs, gcl); - - clearTerms(lgcl, object); - assignTerms(lgclTerms, object); - - clearTerms(gcl, object); - assignTerms(gclTerms, object); + fireCompletionEvent(state); } +// private void lgclSelected(Domain domain, ACSObject object) { +// List lgclTerms = getCurrentCategories(domain, object); +// +// Domain gcl = Domain.retrieve("GCL"); +// Collection gclTerms = getRelatedTerms(lgclTerms, gcl); +// clearTerms(gcl, object); +// assignTerms(gclTerms, object); +// +// // The assignment below is removed to satisfy requirement 4.1, +// // use case 1 of the document "Metadata Improvements" version 1 +// // by Camden, dated 23/01/05. +// //Domain lgsl = Domain.retrieve("LGSL"); +// //Collection lgslTerms = getRelatedTerms(lgclTerms, lgsl); +// //clearTerms(lgsl, object); +// //assignTerms(lgslTerms, object); +// +// // adding processing or mapping from LGCL to APLAWS-NAV too +//// Deactivated here. +//// If needed +//// boolean lgclOverrideAnav = Aplaws.getAplawsConfig().getOverrideAnavFromLGCLMappings().booleanValue(); +//// if (lgclOverrideAnav) { +//// Domain aplawsNav = Domain.retrieve("APLAWS-NAV"); +//// Collection aplawsNavTerms = getRelatedTerms(lgclTerms, aplawsNav); +//// clearTerms(aplawsNav, object); +//// assignTerms(aplawsNavTerms, object); +//// } +// } +// +// // User has selected a term in the LGDL hierarchy, which includes +// // terms from the LGSL. We're only interested in LGSL terms here. +// private void lgdlSelected(Domain domain, ACSObject object) { +// Domain lgsl = Domain.retrieve("LGSL"); +// Domain gcl = Domain.retrieve("GCL"); +// Domain lgcl = Domain.retrieve("LGCL"); +// +// // We have a mapping LGSL -> LGCL based on the reverse of a +// // published mapping. We don't have a mapping LGSL -> GCL, so we +// // do LGSL -> LGCL -> GCL instead. +// +// List lgslTerms = getCurrentCategories(lgsl, object); +// Collection lgclTerms = getRelatedTerms(lgslTerms, lgcl); +// +// LinkedList lgclIDs = new LinkedList(); +// Iterator i = lgclTerms.iterator(); +// while (i.hasNext()) { +// Term term = (Term) i.next(); +// lgclIDs.add(term.getModel().getID()); +// } +// +// Collection gclTerms = getRelatedTerms(lgclIDs, gcl); +// +// clearTerms(lgcl, object); +// assignTerms(lgclTerms, object); +// +// clearTerms(gcl, object); +// assignTerms(gclTerms, object); +// } } - - protected List getCurrentCategories(Domain domain, - ACSObject object) { + + protected List getCurrentCategories(Domain domain, ACSObject object) { if (s_log.isDebugEnabled()) { s_log.debug("Getting terms from " + domain + " to " + object); } @@ -179,8 +171,7 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer { } // TODO move out of UI code - public static Collection getCurrentTerms(Domain domain, - ACSObject object) { + public static Collection getCurrentTerms(Domain domain, ACSObject object) { if (s_log.isDebugEnabled()) { s_log.debug("Getting terms from " + domain + " to " + object); } @@ -198,22 +189,21 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer { } // TODO move out of UI code - public static Collection getRelatedTerms(Collection src, - Domain domain) { + public static Collection getRelatedTerms(Collection src, Domain domain) { if (s_log.isDebugEnabled()) { s_log.debug("Getting related terms to " + domain); - + + } + if (src.isEmpty()) { + // this is a hack, it would be better not to use a completion event listener as + // this is called even when the form is cancelled... + return new LinkedList(); } - if (src.isEmpty()) { - // this is a hack, it would be better not to use a completion event listener as - // this is called even when the form is cancelled... - return new LinkedList(); - } DomainCollection terms = domain.getTerms(); - // these next two lines build the query + // these next two lines build the query terms.addEqualsFilter("model.parents.link.relationType", "related"); - terms.addFilter("model.parents.id in :ids").set("ids", src); - + terms.addFilter("model.parents.id in :ids").set("ids", src); + Collection related = new LinkedList(); while (terms.next()) { if (s_log.isDebugEnabled()) { @@ -223,15 +213,14 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer { } return related; } - - protected void clearTerms(Domain domain, - ACSObject object) { + + protected void clearTerms(Domain domain, ACSObject object) { if (s_log.isDebugEnabled()) { s_log.debug("Removing terms from " + domain + " to " + object); } Iterator terms = getCurrentTerms(domain, object).iterator(); while (terms.hasNext()) { - Term term = (Term)terms.next(); + Term term = (Term) terms.next(); if (s_log.isDebugEnabled()) { s_log.debug("Removing term " + term + " from " + object); } @@ -239,16 +228,14 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer { } } - // TODO move out of UI code - public static void assignTerms(Collection terms, - ACSObject object) { + public static void assignTerms(Collection terms, ACSObject object) { if (s_log.isDebugEnabled()) { s_log.debug("Assigning terms to " + object); } Iterator i = terms.iterator(); while (i.hasNext()) { - Term term = (Term)i.next(); + Term term = (Term) i.next(); if (s_log.isDebugEnabled()) { s_log.debug("Assigning term " + term + " to " + object); } @@ -261,14 +248,11 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer { s_log.debug("Getting domain for " + state.getValue(m_root)); } - DataCollection domains = SessionManager.getSession() - .retrieve(Domain.BASE_DATA_OBJECT_TYPE); - domains.addEqualsFilter("model.id", - state.getValue(m_root)); - + DataCollection domains = SessionManager.getSession().retrieve(Domain.BASE_DATA_OBJECT_TYPE); + domains.addEqualsFilter("model.id", state.getValue(m_root)); + if (domains.next()) { - Domain domain = (Domain)DomainObjectFactory - .newInstance(domains.getDataObject()); + Domain domain = (Domain) DomainObjectFactory.newInstance(domains.getDataObject()); if (s_log.isDebugEnabled()) { s_log.debug("Got domain " + domain); } diff --git a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/CategorySubtree.java b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/CategorySubtree.java index 660781d28..61de70980 100644 --- a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/CategorySubtree.java +++ b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/CategorySubtree.java @@ -1,6 +1,5 @@ package com.arsdigita.london.terms.ui; -import com.arsdigita.bebop.FormData; import java.math.BigDecimal; // import java.util.Iterator; // import java.util.Map; @@ -11,17 +10,13 @@ import org.apache.log4j.Logger; import com.arsdigita.bebop.Page; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.SimpleComponent; -import com.arsdigita.bebop.parameters.ParameterData; import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.categorization.Category; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.persistence.OID; -import com.arsdigita.util.Assert; import com.arsdigita.xml.Element; -import java.util.Arrays; import java.util.HashSet; import java.util.StringTokenizer; -import javax.servlet.http.HttpSession; /** * Generate part of the category tree. Used by Assign Category authoring step. @@ -61,7 +56,7 @@ public class CategorySubtree extends SimpleComponent { HashSet ids = new HashSet(); if (((String) state.getValue(selectedCatsparam)) != null) { StringTokenizer values = new StringTokenizer((String) state.getValue(selectedCatsparam), ","); - while(values.hasMoreTokens()) { + while (values.hasMoreTokens()) { ids.add(new BigDecimal(values.nextToken().trim())); } } @@ -75,5 +70,4 @@ public class CategorySubtree extends SimpleComponent { s_log.debug("generating subtree for cat " + root.getID()); TermWidget.generateSubtree(p, root, ids); } - } diff --git a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/TermWidget.java b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/TermWidget.java index ae8f28edd..d7567a1d2 100644 --- a/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/TermWidget.java +++ b/ccm-ldn-terms/src/com/arsdigita/london/terms/ui/TermWidget.java @@ -105,8 +105,13 @@ public class TermWidget extends Widget { ids.addAll(Arrays.asList(values)); } - String selectedCats = ids.toString(); - widget.addAttribute("selectedCats", selectedCats.substring(1, selectedCats.length() - 1)); + Element selEl = widget.newChildElement("cms:selectedCategories", CMS.CMS_XML_NS); + selEl.addAttribute("name", this.getName()); + Iterator selCats = ids.iterator(); + while (selCats.hasNext()) { + Element selCat = selEl.newChildElement("cms:category", CMS.CMS_XML_NS); + selCat.addAttribute("id", selCats.next().toString()); + } // only root terms at first, the rest is loaded on-demand via AJAX DomainCollection terms = domain.getRootTerms();