Missed two files in last commit, now everything is fine
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4637 8810af33-2d31-482b-a856-94f89814c4df
parent
41518b9a27
commit
51f333c7ff
|
|
@ -0,0 +1,516 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* 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.cms.ui;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.*;
|
||||||
|
import com.arsdigita.bebop.event.FormProcessListener;
|
||||||
|
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||||
|
import com.arsdigita.bebop.event.FormValidationListener;
|
||||||
|
import com.arsdigita.bebop.event.PrintEvent;
|
||||||
|
import com.arsdigita.bebop.event.PrintListener;
|
||||||
|
import com.arsdigita.bebop.form.Option;
|
||||||
|
import com.arsdigita.bebop.form.OptionGroup;
|
||||||
|
import com.arsdigita.bebop.form.SingleSelect;
|
||||||
|
import com.arsdigita.bebop.form.Submit;
|
||||||
|
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||||
|
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||||
|
import com.arsdigita.bebop.util.SequentialMap;
|
||||||
|
import com.arsdigita.cms.CMS;
|
||||||
|
import com.arsdigita.cms.ui.authoring.BasicItemForm;
|
||||||
|
import com.arsdigita.util.StringUtils;
|
||||||
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.libreccm.categorization.Category;
|
||||||
|
import org.libreccm.core.CcmObject;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.SortedMap;
|
||||||
|
import java.util.TooManyListenersException;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is an abstract class which displays the category assignment UI.
|
||||||
|
*
|
||||||
|
* Displays two listboxes for assigning categories to items, with two
|
||||||
|
* submit buttons to move categories back and forth. The left
|
||||||
|
* listbox displays all available categories which have not been
|
||||||
|
* assigned to the current item. The right listbox displays all categories
|
||||||
|
* assigned to the current item.
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author Stanislav Freidin (sfreidin@arsdigita.com)
|
||||||
|
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||||
|
*/
|
||||||
|
public abstract class CategoryForm extends Form
|
||||||
|
implements FormProcessListener, FormValidationListener {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(
|
||||||
|
CategoryForm.class);
|
||||||
|
private static final String SEPARATOR = ">";
|
||||||
|
public static final String FREE = "free";
|
||||||
|
public static final String ASSIGNED = "assigned";
|
||||||
|
public static final String ASSIGN = "assign";
|
||||||
|
public static final String REMOVE = "remove";
|
||||||
|
public static final int SELECT_WIDTH = 30;
|
||||||
|
public static final int SELECT_HEIGHT = 10;
|
||||||
|
public static final String FILLER_OPTION = StringUtils.repeat("_", SELECT_WIDTH);
|
||||||
|
|
||||||
|
private final RequestLocal m_assigned;
|
||||||
|
private Submit m_assign, m_remove;
|
||||||
|
|
||||||
|
private final Label m_freeLabel;
|
||||||
|
private final Label m_assignedLabel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a new CategoryForm component
|
||||||
|
*
|
||||||
|
* @param name the name of the form
|
||||||
|
*/
|
||||||
|
public CategoryForm(String name) {
|
||||||
|
super(name, new ColumnPanel(3));
|
||||||
|
|
||||||
|
ColumnPanel panel = (ColumnPanel) getPanel();
|
||||||
|
panel.setBorder(false);
|
||||||
|
panel.setPadColor("#FFFFFF");
|
||||||
|
panel.setColumnWidth(1, "0%");
|
||||||
|
panel.setColumnWidth(2, "0%");
|
||||||
|
panel.setColumnWidth(3, "0");
|
||||||
|
panel.setWidth("0%");
|
||||||
|
panel.setClassAttr("CMS Admin");
|
||||||
|
|
||||||
|
// Create the request local
|
||||||
|
m_assigned = new RequestLocal() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object initialValue(PageState state) {
|
||||||
|
CategoryMap m = new CategoryMap();
|
||||||
|
initAssignedCategories(state, m);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Top row
|
||||||
|
m_freeLabel = new Label(GlobalizationUtil.globalize("cms.ui.item.categories.available"), false);
|
||||||
|
m_freeLabel.setFontWeight(Label.BOLD);
|
||||||
|
add(m_freeLabel, ColumnPanel.LEFT);
|
||||||
|
|
||||||
|
//add(new Label(" ", false));
|
||||||
|
add(new Embedded(" ", false));
|
||||||
|
|
||||||
|
m_assignedLabel = new Label(GlobalizationUtil.globalize("cms.ui.item.categories.assigned"), false);
|
||||||
|
m_assignedLabel.setFontWeight(Label.BOLD);
|
||||||
|
add(m_assignedLabel, ColumnPanel.LEFT);
|
||||||
|
|
||||||
|
// Middle Row
|
||||||
|
SingleSelect freeWidget = new SingleSelect(new BigDecimalParameter(FREE));
|
||||||
|
try {
|
||||||
|
freeWidget.addPrintListener(new FreePrintListener());
|
||||||
|
} catch (TooManyListenersException e) {
|
||||||
|
UncheckedWrapperException.throwLoggedException(getClass(), "Too many listeners", e);
|
||||||
|
}
|
||||||
|
freeWidget.setSize(SELECT_HEIGHT);
|
||||||
|
add(freeWidget);
|
||||||
|
|
||||||
|
BoxPanel box = new BoxPanel(BoxPanel.VERTICAL, true);
|
||||||
|
box.setWidth("2%");
|
||||||
|
addSubmitButtons(box);
|
||||||
|
add(box, ColumnPanel.CENTER | ColumnPanel.MIDDLE);
|
||||||
|
|
||||||
|
SingleSelect assignedWidget =
|
||||||
|
new SingleSelect(new BigDecimalParameter(ASSIGNED));
|
||||||
|
try {
|
||||||
|
assignedWidget.addPrintListener(new AssignedPrintListener());
|
||||||
|
} catch (TooManyListenersException e) {
|
||||||
|
UncheckedWrapperException.throwLoggedException(getClass(), "Too many listeners", e);
|
||||||
|
}
|
||||||
|
assignedWidget.setSize(SELECT_HEIGHT);
|
||||||
|
add(assignedWidget);
|
||||||
|
|
||||||
|
// Add listeners
|
||||||
|
addProcessListener(this);
|
||||||
|
addValidationListener(this);
|
||||||
|
|
||||||
|
setClassAttr("CategoryForm");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addSubmitButtons(Container c) {
|
||||||
|
addAssignButton(c);
|
||||||
|
addRemoveButton(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addAssignButton(Container c) {
|
||||||
|
m_assign = new Submit(ASSIGN, ">>");
|
||||||
|
m_assign.setSize(10);
|
||||||
|
c.add(m_assign);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void addRemoveButton(Container c) {
|
||||||
|
m_remove = new Submit(REMOVE, "<<");
|
||||||
|
m_remove.setSize(10);
|
||||||
|
c.add(m_remove);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the caption of the unassigned categories label
|
||||||
|
*
|
||||||
|
* @param caption the new caption
|
||||||
|
*/
|
||||||
|
public void setUnassignedCaption(String caption) {
|
||||||
|
m_freeLabel.setLabel(caption);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the caption of the assigned categories label
|
||||||
|
*
|
||||||
|
* @param caption the new caption
|
||||||
|
*/
|
||||||
|
public void setAssignedCaption(String caption) {
|
||||||
|
m_assignedLabel.setLabel(caption);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param s the page state
|
||||||
|
* @return a {@link CategoryMap} of all assigned categories
|
||||||
|
*/
|
||||||
|
public CategoryMap getAssignedCategories(PageState s) {
|
||||||
|
return (CategoryMap) m_assigned.get(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
// A print listener which populates the listbox with all
|
||||||
|
// unassigned categories, apart from result of getExcludedCategory()
|
||||||
|
// (if not null), and the root category.
|
||||||
|
// Ordering is alphabetical based on qualified path, so entries are
|
||||||
|
// ordered like a tree with all nodes expanded.
|
||||||
|
// Ideally ordering should be like an expanded tree but based on
|
||||||
|
// the sortkey order of the categories. However, I don't know
|
||||||
|
// if it would be possible to write a comparison function that
|
||||||
|
// could do this efficiently, and I'm not even going to try
|
||||||
|
// chris.gilbert@westsussex.gov.uk
|
||||||
|
//
|
||||||
|
private class FreePrintListener implements PrintListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prepare(PrintEvent e) {
|
||||||
|
|
||||||
|
OptionGroup target = (OptionGroup) e.getTarget();
|
||||||
|
target.clearOptions();
|
||||||
|
PageState state = e.getPageState();
|
||||||
|
Category root = getRootCategory(state);
|
||||||
|
if (root == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// exclude children of the excluded category (as per javadoc on
|
||||||
|
// getExcludedCategory() method. This prevents attempts
|
||||||
|
// to create circular category graph (which causes
|
||||||
|
// exception in Category during addMapping if not checked here
|
||||||
|
Category excludedCat = getExcludedCategory(state);
|
||||||
|
CategoryMap excluded = new CategoryMap();
|
||||||
|
if (excludedCat != null) {
|
||||||
|
java.util.List<Category> excludedSubTree = getExcludedCategory(state).getSubCategories();
|
||||||
|
excludedSubTree.forEach(excluded::add);
|
||||||
|
}
|
||||||
|
CategoryMap assigned = getAssignedCategories(state);
|
||||||
|
SortedMap sortedCats = new TreeMap();
|
||||||
|
java.util.List<Category> children = root.getSubCategories();
|
||||||
|
children.forEach(x -> sortedCats.put(x.getName(), x.getUniqueId()));
|
||||||
|
|
||||||
|
Iterator it = sortedCats.entrySet().iterator();
|
||||||
|
Map.Entry entry;
|
||||||
|
String path;
|
||||||
|
String id;
|
||||||
|
boolean notExcluded;
|
||||||
|
boolean notAlreadyAssigned;
|
||||||
|
boolean notRoot;
|
||||||
|
|
||||||
|
while (it.hasNext()) {
|
||||||
|
entry = (Map.Entry) it.next();
|
||||||
|
path = (String) entry.getKey();
|
||||||
|
id = (String) entry.getValue();
|
||||||
|
|
||||||
|
notExcluded = !excluded.containsKey(id);
|
||||||
|
notAlreadyAssigned = !assigned.containsKey(id);
|
||||||
|
notRoot = !id.equals(root.getUniqueId());
|
||||||
|
|
||||||
|
if (notExcluded && notAlreadyAssigned && notRoot) {
|
||||||
|
target.addOption(new Option(id, new Text(path)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
addFillerOption(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Populate a {@link CategoryMap} with all categories which are assigned to
|
||||||
|
* the item. Child classes should override this method to do the right thing.
|
||||||
|
*
|
||||||
|
* @param map The sequential map of all categories which are assigned to
|
||||||
|
* the current item. Overridden method should repeatedly
|
||||||
|
* <code>call map.addCategory(someCategory);</code>
|
||||||
|
* @param state The page state
|
||||||
|
*/
|
||||||
|
protected abstract void initAssignedCategories(PageState state, CategoryMap map);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign a category, moving it from the list on the left
|
||||||
|
* to the list on the right
|
||||||
|
*
|
||||||
|
* @param s the page state
|
||||||
|
* @param cat the category to assign
|
||||||
|
*/
|
||||||
|
protected abstract void assignCategory(PageState s, Category cat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unassign a category, moving it from the list on the right
|
||||||
|
* to the list on the left
|
||||||
|
*
|
||||||
|
* @param s the page state
|
||||||
|
* @param cat the category to unassign
|
||||||
|
*/
|
||||||
|
protected abstract void unassignCategory(PageState s, Category cat);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the URL for the givne item to make sure that
|
||||||
|
* the item it is not possible to have two objects in the same category
|
||||||
|
* with the same URL.
|
||||||
|
* @param state The Page State
|
||||||
|
*/
|
||||||
|
protected abstract String getItemURL(PageState state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This allows the validation code to validate the properties of the
|
||||||
|
* object
|
||||||
|
*/
|
||||||
|
protected abstract CcmObject getObject(PageState state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the category which will act as the root for the lists
|
||||||
|
* of assigned and unassigned categories. The default implementation
|
||||||
|
* returns the root category for the content section. Child classes
|
||||||
|
* should override this method if they wish to provide an alternate root category.
|
||||||
|
*
|
||||||
|
* @param state the page state
|
||||||
|
* @return the root category which should be used to populate the lists
|
||||||
|
* of assigned and unassigned categories
|
||||||
|
*/
|
||||||
|
public Category getRootCategory(PageState state) {
|
||||||
|
return null;
|
||||||
|
// return CMS.getContext().getContentSection().getRootCategory();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a category which should be excluded from the list of
|
||||||
|
* free categories. It is permissible to return null
|
||||||
|
*
|
||||||
|
* @param s the page state
|
||||||
|
* @return a category whose subtree will not be shown in the
|
||||||
|
* category list
|
||||||
|
*/
|
||||||
|
protected Category getExcludedCategory(PageState s) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populates the "assigned categories" widget
|
||||||
|
@Deprecated
|
||||||
|
private class AssignedPrintListener implements PrintListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void prepare(PrintEvent e) {
|
||||||
|
OptionGroup o = (OptionGroup) e.getTarget();
|
||||||
|
o.clearOptions();
|
||||||
|
PageState state = e.getPageState();
|
||||||
|
CategoryMap m = getAssignedCategories(state);
|
||||||
|
|
||||||
|
if (!m.isEmpty()) {
|
||||||
|
for (Iterator i = m.values().iterator(); i.hasNext();) {
|
||||||
|
Category c = (Category) i.next();
|
||||||
|
o.addOption(new Option(c.getUniqueId(), new Text(getCategoryPath(c))));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
o.addOption(new Option("", new Text("-- none --")));
|
||||||
|
}
|
||||||
|
|
||||||
|
addFillerOption(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process the form: assign/unassign categories
|
||||||
|
@Override
|
||||||
|
public void process(FormSectionEvent e) throws FormProcessException {
|
||||||
|
PageState state = e.getPageState();
|
||||||
|
FormData data = e.getFormData();
|
||||||
|
BigDecimal id;
|
||||||
|
|
||||||
|
// if (m_assign.isSelected(state)) {
|
||||||
|
// id = (BigDecimal) data.get(FREE);
|
||||||
|
//
|
||||||
|
// // Assign a new category
|
||||||
|
// try {
|
||||||
|
// Category cat = new Category(
|
||||||
|
// new OID(Category.BASE_DATA_OBJECT_TYPE, id));
|
||||||
|
// if (!cat.canMap()) {
|
||||||
|
// data.addError(
|
||||||
|
// (String) GlobalizationUtil.globalize(
|
||||||
|
// "cms.ui.need_category_map_privilege").localize());
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// assignCategory(state, cat);
|
||||||
|
// // Highlight the item
|
||||||
|
// data.put(ASSIGNED, id);
|
||||||
|
// } catch (DataObjectNotFoundException ex) {
|
||||||
|
// s_log.error("Couldn't find Category", ex);
|
||||||
|
// throw new FormProcessException(ex);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// } else if (m_remove.isSelected(state)) {
|
||||||
|
// id = (BigDecimal) data.get(ASSIGNED);
|
||||||
|
//
|
||||||
|
// // Unassign a category
|
||||||
|
// try {
|
||||||
|
// Category cat = new Category(
|
||||||
|
// new OID(Category.BASE_DATA_OBJECT_TYPE, id));
|
||||||
|
// if (!cat.canMap()) {
|
||||||
|
// data.addError(
|
||||||
|
// (String) GlobalizationUtil.globalize(
|
||||||
|
// "cms.ui.need_category_map_privilege").localize());
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
// unassignCategory(state, cat);
|
||||||
|
// // Highlight the item
|
||||||
|
// data.put(FREE, id);
|
||||||
|
// } catch (DataObjectNotFoundException ex) {
|
||||||
|
// s_log.error("Couldn't find category");
|
||||||
|
// throw new FormProcessException(ex);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate the form: make sure that a category is selected
|
||||||
|
// for the remove/assign buttons
|
||||||
|
@Override
|
||||||
|
public void validate(FormSectionEvent e) throws FormProcessException {
|
||||||
|
PageState state = e.getPageState();
|
||||||
|
FormData data = e.getFormData();
|
||||||
|
|
||||||
|
// if (m_assign.isSelected(state)) {
|
||||||
|
// if (data.get(FREE) == null) {
|
||||||
|
// data.addError("Please select a category to assign");
|
||||||
|
// } else {
|
||||||
|
// // we need to make sure that no other item in this
|
||||||
|
// // category has the same name (url)
|
||||||
|
// BigDecimal id = (BigDecimal) data.get(FREE);
|
||||||
|
//
|
||||||
|
// // Assign a new category
|
||||||
|
// try {
|
||||||
|
// Category cat =
|
||||||
|
// new Category(new OID(Category.BASE_DATA_OBJECT_TYPE, id));
|
||||||
|
// String url = getItemURL(state);
|
||||||
|
//
|
||||||
|
// if (url != null) {
|
||||||
|
// DataQuery query = SessionManager.getSession().retrieveQuery("com.arsdigita.categorization.getAllItemURLsForCategory");
|
||||||
|
// query.setParameter("categoryID", id);
|
||||||
|
// query.addEqualsFilter("lower(url)", url.toLowerCase());
|
||||||
|
//
|
||||||
|
// if (query.size() > 0) {
|
||||||
|
// // we need to make sure that there is not an item
|
||||||
|
// ACSObject item = getObject(state);
|
||||||
|
// Collection list;
|
||||||
|
// if (item instanceof ContentItem) {
|
||||||
|
// list = BasicItemForm.getAllVersionIDs((ContentItem) item);
|
||||||
|
// } else {
|
||||||
|
// list = new ArrayList();
|
||||||
|
// list.add(item.getID());
|
||||||
|
// }
|
||||||
|
// BigDecimal itemID;
|
||||||
|
// while (query.next()) {
|
||||||
|
// itemID = (BigDecimal) query.get("itemID");
|
||||||
|
// if (!list.contains(itemID)) {
|
||||||
|
// data.addError("There is already an item "
|
||||||
|
// + "with the url " + url
|
||||||
|
// + " in the category "
|
||||||
|
// + cat.getName());
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } catch (DataObjectNotFoundException ex) {
|
||||||
|
// s_log.error("Error processing category. Unable to find "
|
||||||
|
// + "category with id " + id);
|
||||||
|
// throw new FormProcessException(ex);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else if (m_remove.isSelected(state)) {
|
||||||
|
// if (data.get(ASSIGNED) == null) {
|
||||||
|
// data.addError("Please select a category to remove");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a "filler" option to the option group in order to ensure
|
||||||
|
// the correct horizontal width
|
||||||
|
private static void addFillerOption(OptionGroup o) {
|
||||||
|
o.addOption(new Option("", FILLER_OPTION));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the full path to a category
|
||||||
|
*/
|
||||||
|
public static String getCategoryPath(Category c) {
|
||||||
|
return c.getName();
|
||||||
|
// final StringBuffer s = new StringBuffer();
|
||||||
|
// final CategoryCollection ancestors = c.getDefaultAscendants();
|
||||||
|
// ancestors.addOrder(Category.DEFAULT_ANCESTORS);
|
||||||
|
//
|
||||||
|
// boolean isFirst = true;
|
||||||
|
//
|
||||||
|
// while (ancestors.next()) {
|
||||||
|
// if (!isFirst) {
|
||||||
|
// s.append(SEPARATOR);
|
||||||
|
// }
|
||||||
|
// s.append(ancestors.getCategory().getName());
|
||||||
|
// isFirst = false;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return s.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A convenience method that abstracts SequentialMap
|
||||||
|
* to deal with categories
|
||||||
|
*/
|
||||||
|
protected static class CategoryMap extends SequentialMap {
|
||||||
|
|
||||||
|
public CategoryMap() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(Category c) {
|
||||||
|
super.put(c.getUniqueId(), c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* 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.cms.ui.category;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.ColumnPanel;
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.form.Submit;
|
||||||
|
import com.arsdigita.cms.ui.CategoryForm;
|
||||||
|
import com.arsdigita.cms.ui.FormSecurityListener;
|
||||||
|
import com.arsdigita.toolbox.ui.Cancellable;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import org.libreccm.categorization.Category;
|
||||||
|
import org.libreccm.categorization.CategoryManager;
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.libreccm.core.CcmObject;
|
||||||
|
import org.libreccm.security.PermissionChecker;
|
||||||
|
import org.librecms.contentsection.privileges.AdminPrivileges;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A form which edits secondary parents
|
||||||
|
*
|
||||||
|
* @author Michael Pih
|
||||||
|
* @author Stanislav Freidin
|
||||||
|
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
|
||||||
|
*/
|
||||||
|
public class LinkForm extends CategoryForm implements Cancellable {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager.getLogger(
|
||||||
|
LinkForm.class);
|
||||||
|
|
||||||
|
private final CategoryRequestLocal m_category;
|
||||||
|
private final Submit m_cancelButton;
|
||||||
|
|
||||||
|
public LinkForm(final CategoryRequestLocal category) {
|
||||||
|
super("LinkForm");
|
||||||
|
|
||||||
|
m_category = category;
|
||||||
|
|
||||||
|
m_cancelButton = new Submit("Finish");
|
||||||
|
add(m_cancelButton, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||||
|
|
||||||
|
setAssignedCaption("Linked Categories");
|
||||||
|
|
||||||
|
addSubmissionListener
|
||||||
|
(new FormSecurityListener(AdminPrivileges.ADMINISTER_CATEGORIES));
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isCancelled(final PageState state) {
|
||||||
|
return m_cancelButton.isSelected(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load all categories which are assigned to the current item.
|
||||||
|
*/
|
||||||
|
protected void initAssignedCategories(PageState state, CategoryMap m) {
|
||||||
|
final Category category = m_category.getCategory(state);
|
||||||
|
m.add(category.getParentCategory());
|
||||||
|
/*final BigDecimal parentID = category.getDefaultParentCategory().getID();
|
||||||
|
CategoryCollection links = category.getParents();
|
||||||
|
|
||||||
|
while ( links.next() ) {
|
||||||
|
Category cat = links.getCategory();
|
||||||
|
|
||||||
|
if ( !cat.getID().equals(parentID) ) {
|
||||||
|
m.add(cat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
links.close();*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assign a secondary parent.
|
||||||
|
*/
|
||||||
|
public void assignCategory(PageState state, Category category) {
|
||||||
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final PermissionChecker permissionChecker = cdiUtil.findBean(PermissionChecker.class);
|
||||||
|
final CategoryManager categoryManager = cdiUtil.findBean(CategoryManager.class);
|
||||||
|
final Category child = m_category.getCategory(state);
|
||||||
|
if (permissionChecker.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES, category)) {
|
||||||
|
categoryManager.addSubCategoryToCategory(child, category);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unassign a secondary parent.
|
||||||
|
*/
|
||||||
|
public void unassignCategory(PageState state, Category category) {
|
||||||
|
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||||
|
final PermissionChecker permissionChecker = cdiUtil.findBean(PermissionChecker.class);
|
||||||
|
final CategoryManager categoryManager = cdiUtil.findBean(CategoryManager.class);
|
||||||
|
final Category child = m_category.getCategory(state);
|
||||||
|
if (permissionChecker.isPermitted(AdminPrivileges.ADMINISTER_CATEGORIES, category)) {
|
||||||
|
categoryManager.removeSubCategoryFromCategory(child, category);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The category cannot be its own parent. Its children cannot
|
||||||
|
* be parents either.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Category getExcludedCategory(PageState state) {
|
||||||
|
return m_category.getCategory(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method returns the URL for the given item to make sure that
|
||||||
|
* there are not two objects in the same category with the same URL.
|
||||||
|
*/
|
||||||
|
protected final String getItemURL(final PageState state) {
|
||||||
|
return m_category.getCategory(state).getName();
|
||||||
|
//return m_category.getCategory(state).getURL();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final CcmObject getObject(final PageState state) {
|
||||||
|
return (Category) m_category.getCategory(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue