Removed several unused and depcreated classes.

pull/28/head
Jens Pelzetter 2022-03-19 13:39:37 +01:00
parent c9eb1bb20b
commit 3ed92c6e56
26 changed files with 3 additions and 3961 deletions

View File

@ -220,7 +220,7 @@ public class CMSPage extends Page implements ResourceHandler {
public ContentSection getContentSection(HttpServletRequest request) { public ContentSection getContentSection(HttpServletRequest request) {
// Resets all content sections associations. // Resets all content sections associations.
// return ContentSectionDispatcher.getContentSection(request); // return ContentSectionDispatcher.getContentSection(request);
return ContentSectionServlet.getContentSection(request); throw new UnsupportedOperationException();
} }
/** /**

View File

@ -27,11 +27,8 @@ import com.arsdigita.xml.Element;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionServlet;
import org.librecms.dispatcher.ItemResolver; import org.librecms.dispatcher.ItemResolver;
import java.util.logging.Level;
import java.util.logging.Logger;
/** /**
* <p> * <p>
@ -114,7 +111,7 @@ public class ContentPanel extends SimpleComponent {
String url = DispatcherHelper.getRequestContext().getRemainingURLPart(); String url = DispatcherHelper.getRequestContext().getRemainingURLPart();
if (url.startsWith(CMSDispatcher.PREVIEW)) { if (url.startsWith(CMSDispatcher.PREVIEW)) {
pathInfo.newChildElement("cms:previewPath", CMS.CMS_XML_NS).setText( pathInfo.newChildElement("cms:previewPath", CMS.CMS_XML_NS).setText(
ContentSectionServlet.PREVIEW); "preview");
} }
pathInfo.newChildElement("cms:templatePrefix", CMS.CMS_XML_NS).setText( pathInfo.newChildElement("cms:templatePrefix", CMS.CMS_XML_NS).setText(
"/" + ItemResolver.TEMPLATE_CONTEXT_PREFIX); "/" + ItemResolver.TEMPLATE_CONTEXT_PREFIX);

View File

@ -1,94 +0,0 @@
/*
* Copyright (C) 2003-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.Component;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.list.ListModelBuilder;
import com.arsdigita.bebop.tree.TreeModelBuilder;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.SelectionPanel;
import org.librecms.CmsConstants;
/**
* A base component for use in CMS admin panes.
*
* @param <T> Type managed by the {@link SingleSelectionModel} used by instances
* of this class.
*
* @author Justin Ross &lt;jross@redhat.com&gt;
*/
public abstract class BaseAdminPane<T> extends SelectionPanel<T> {
protected BaseAdminPane() {
super();
}
protected BaseAdminPane(final Component title,
final Component selector) {
super(title, selector);
}
protected BaseAdminPane(final GlobalizedMessage title,
final Component selector) {
super(title, selector);
}
protected BaseAdminPane(final Component title,
final Component selector,
final SingleSelectionModel<T> model) {
super(title, selector, model);
}
protected BaseAdminPane(final GlobalizedMessage title,
final Component selector,
final SingleSelectionModel<T> model) {
super(title, selector, model);
}
protected BaseAdminPane(final Component title,
final ListModelBuilder builder) {
super(title, builder);
}
protected BaseAdminPane(final GlobalizedMessage title,
final ListModelBuilder builder) {
super(title, builder);
}
protected BaseAdminPane(final Component title,
final TreeModelBuilder builder) {
super(title, builder);
}
protected BaseAdminPane(final GlobalizedMessage title,
final TreeModelBuilder builder) {
super(title, builder);
}
protected static GlobalizedMessage gz(final String key) {
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
}
protected static String lz(final String key) {
return (String) gz(key).localize();
}
}

View File

@ -1,161 +0,0 @@
/*
* 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.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SegmentedPanel;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.cms.CMS;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.LayoutPanel;
import org.libreccm.categorization.Category;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.Folder;
import java.util.List;
/**
* A pane that contains a folder tree on the left and a folder manipulator on
* the right. It is a part of the content section main page and is displayed as
* the "Browse" tab.
*
* @author David LutterKort &lt;dlutter@redhat.com&gt;
* @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class BrowsePane extends LayoutPanel implements Resettable {
private SingleSelectionModel selectionModel;
private FlatItemList flatItemList;
public BrowsePane() {
final SegmentedPanel left = new SegmentedPanel();
setLeft(left);
final Label heading = new Label(
new GlobalizedMessage("cms.ui.folder_browser",
CmsConstants.CMS_BUNDLE));
}
@Override
public final void register(final Page page) {
super.register(page);
page.addActionListener(new FolderListener());
page.addActionListener(new TreeListener());
}
@Override
public final void reset(final PageState state) {
super.reset(state);
flatItemList.reset(state);
}
// Private classes and methods
/**
*
*/
private final class ProcessListener implements FormProcessListener {
@Override
public final void process(final FormSectionEvent event) {
final PageState state = event.getPageState();
}
}
private final class SubmissionListener implements FormSubmissionListener {
@Override
public final void submitted(final FormSectionEvent event) {
final PageState state = event.getPageState();
}
}
private final class FolderListener implements ActionListener {
@Override
public final void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
if (!selectionModel.isSelected(state)) {
final String folder = state
.getRequest()
.getParameter(ContentSectionPage.SET_FOLDER);
if (folder == null) {
final Category root = CMS
.getContext()
.getContentSection()
.getRootDocumentsFolder();
final Long folderID = root.getObjectId();
/*
ToDo
User user = Web.getWebContext().getUser();
if (user != null) {
Folder homeFolder = Folder.getUserHomeFolder(
user, CMS.getContext().getContentSection());
if (homeFolder != null) {
folderID = homeFolder.getID();
}
}*/
selectionModel.setSelectedKey(state, folderID);
} else {
selectionModel.setSelectedKey(state, Long.parseLong(folder));
}
}
}
}
private final class TreeListener implements ActionListener {
@Override
public final void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
final Category root = CMS
.getContext()
.getContentSection()
.getRootDocumentsFolder();
}
}
}

View File

@ -1,236 +0,0 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui;
import com.arsdigita.bebop.BebopConfig;
import com.arsdigita.bebop.Container;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.page.PageTransformer;
import com.arsdigita.cms.dispatcher.Utilities;
import com.arsdigita.templating.PresentationManager;
import com.arsdigita.xml.Document;
import com.arsdigita.xml.Element;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.Shiro;
import org.libreccm.security.User;
import org.libreccm.web.CcmApplication;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* A <tt>CMSApplicationPage</tt> is a Bebop {@link com.arsdigita.bebop.Page}
* implementation serving as a base for any CMS pageElement served by a servlet.
*
* It stores the current {@link com.arsdigita.cms.ContentSection} and, if
* applicable, the {@link com.arsdigita.cms.ContentItem} in the pageElement
* state as request local objects. Components that are part of the
* <tt>CMSPage</tt> may access these objects by calling:
* <blockquote><code><pre>
* getContentSection(PageState state);
* </pre></code></blockquote>
*
* @author Michael Pih (pihman@arsdigita.com)
* @author Uday Mathur (umathur@arsdigita.com)
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class CMSApplicationPage extends Page {
private static final Logger LOGGER = LogManager.getLogger(
CMSApplicationPage.class);
/**
* The global assets URL stub XML parameter name.
*/
public final static String ASSETS = "ASSETS";
/**
* The XML pageElement class.
*/
public final static String PAGE_CLASS = "CMS";
/**
* Map of XML parameters
*/
private Map<String, String> parameters;
/**
*
*/
private PageTransformer pageTransformer;
public CMSApplicationPage() {
super();
buildPage();
}
public CMSApplicationPage(final String title) {
super(title);
buildPage();
}
public CMSApplicationPage(final String title, final Container panel) {
super(title, panel);
buildPage();
}
public CMSApplicationPage(final Label title) {
super(title);
buildPage();
}
public CMSApplicationPage(final Label title, final Container panel) {
super(title, panel);
buildPage();
}
/**
* Builds the pageElement.
*/
private void buildPage() {
// Set the class attribute value (down in SimpleComponent).
setClassAttr(PAGE_CLASS);
// Global XML params.
// MP: This only works with older versions of Xalan.
parameters = new HashMap<>();
setXMLParameter(ASSETS, Utilities.getGlobalAssetsURL());
// MP: This is a hack to so that the XML params work with the newer
// version of Xalan.
setAttribute(ASSETS, Utilities.getGlobalAssetsURL());
// Make sure the error display gets rendered.
getErrorDisplay().setIdAttr("page-body");
final Class<PresentationManager> presenterClass = BebopConfig
.getConfig()
.getPresenterClass();
final PresentationManager presenter;
try {
presenter = presenterClass.getDeclaredConstructor().newInstance();
} catch (InstantiationException
| IllegalAccessException
| NoSuchMethodException
| InvocationTargetException ex) {
throw new RuntimeException("Failed to create PresentationManager",
ex);
}
if (presenter instanceof PageTransformer) {
pageTransformer = (PageTransformer) presenter;
} else {
pageTransformer = new PageTransformer();
}
}
/**
* Finishes and locks the pageElement. If the pageElement is already locked,
* does nothing.
*
* Client classes may overwrite this method to add context specific bits to
* the page before it is locked.
*
* This method is called by the various servlets serving the various pages
* of the CMS package, before serving and displaying the page.
*
* @param request
* @param response
* @param app
*/
public synchronized void init(final HttpServletRequest request,
final HttpServletResponse response,
final CcmApplication app) {
LOGGER.debug("Initializing the page");
if (!isLocked()) {
LOGGER.debug("The page hasn't been locked; locking it now");
lock();
}
}
/**
* Fetches the value of the XML parameter.
*
* @param name The parameter name
*
* @return The parameter value
*
* @pre (name != null)
*/
public String getXMLParameter(final String name) {
return parameters.get(name);
}
/**
* Set an XML parameter.
*
* @param name The parameter name
* @param value The parameter value
*
* @pre (name != null)
*/
public void setXMLParameter(String name, String value) {
parameters.put(name, value);
}
/**
* Overwrites bebop.Page#generateXMLHelper to add the name of the user
* logged in to the pageElement (displayed as part of the header).
*
* @param state
* @param parent
*
* @return pageElement for use in generateXML
*/
@Override
protected Element generateXMLHelper(final PageState state,
final Document parent) {
/* Retain elements already included. */
Element pageElement = super.generateXMLHelper(state, parent);
/* Add name of user logged in. */
// Note: There are at least 2 ways in the API to determin the user
// TODO: Check for differences, determin the best / recommended way and
// document it in the classes. Probably remove one ore the other
// way from the API if possible.
final Shiro shiro = CdiUtil.createCdiUtil().findBean(Shiro.class);
final Optional<User> user = shiro.getUser();
// User user = Web.getWebContext().getUser();
if (user.isPresent()) {
pageElement.addAttribute("name", user.get().getName());
}
return pageElement;
}
}

View File

@ -1,481 +0,0 @@
/*
* 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.globalization.Globalization;
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.categorization.CategoryManager;
import org.libreccm.categorization.CategoryRepository;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject;
import javax.enterprise.inject.spi.CDI;
import java.math.BigDecimal;
import java.util.*;
/**
* 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("&nbsp;", false));
add(new Embedded("&nbsp;", 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 {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryRepository categoryRepository = cdiUtil.findBean(CategoryRepository.class);
PageState state = e.getPageState();
FormData data = e.getFormData();
Long id;
if (m_assign.isSelected(state)) {
id = ((BigDecimal) data.get(FREE)).longValue();
Optional<Category> optional = categoryRepository.findById(id);
if (optional.isPresent()) {
Category cat = optional.get();
assignCategory(state, cat);
data.put(ASSIGNED, id);
} else {
throw new FormProcessException(GlobalizationUtil.globalize(String.format("Can't find category with id %d", id)));
}
} else if (m_remove.isSelected(state)) {
id = ((BigDecimal) data.get(ASSIGNED)).longValue();
Optional<Category> optional = categoryRepository.findById(id);
if (optional.isPresent()) {
Category cat = optional.get();
unassignCategory(state, cat);
data.put(FREE, id);
} else {
throw new FormProcessException(GlobalizationUtil.globalize(String.format("Can't find category with id %d", id)));
}
}
}
// 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(GlobalizationUtil.globalize("cms.ui.category.assign_select_missing"));
} else {
// we need to make sure that no other item in this
// category has the same name (url)
Long id = ((BigDecimal) data.get(FREE)).longValue();
// Assign a new category
// try {
// 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(GlobalizationUtil.globalize("cms.ui.category.assign_select_missing"));
}
}
}
// 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) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryManager categoryManager = cdiUtil.findBean(CategoryManager.class);
return categoryManager.getCategoryPath(c);
}
/**
* 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);
}
}
}

View File

@ -1,32 +0,0 @@
/*
* Copyright (C) 2003-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.PageState;
import com.arsdigita.bebop.RequestLocal;
import org.libreccm.core.CcmObject;
public class CcmObjectRequestLocal extends RequestLocal {
public final CcmObject getACSObject(final PageState state) {
return (CcmObject) get(state);
}
}

View File

@ -1,343 +0,0 @@
/*
* 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.Component;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.TabbedPane;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.PrintEvent;
import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.PageLocations;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
import com.arsdigita.cms.dispatcher.CMSPage;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.Assert;
import javax.servlet.http.HttpServletRequest;
import org.librecms.CMSConfig;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItemVersion;
import org.librecms.contentsection.privileges.AdminPrivileges;
/**
* Contains the entire admin UI for a content section.
*
* Developers Note: It is based on the dispatcher model is is going to be
* replaced by the newer servlet based model. @see
* c.ad.cms.ui.contentsection.MainPage (currently not active).
*
* @author Jack Chung
* @author Michael Pih
* @author Xixi D'Moon
* @author Justin Ross
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ContentSectionPage extends CMSPage implements ActionListener {
/**
* The URL parameter that can be passed in in order to set the current
* folder. This is used in getting back to the correct level of folder
* expansion from content item page.
*/
public static final String SET_FOLDER = "set_folder";
/**
* The URL parameter that can be passed in in order to set the current
* template (for setting the content type)
*/
public static final String SET_TEMPLATE = "set_template";
/**
* The URL parameter that can be passed in in order to set the current tab.
* This is a KLUDGE right now because the TabbedDialog's current tab is
* selected with a local state parameter.
*/
public static final String SET_TAB = "set_tab";
/**
* Index of the search tab
*/
public static final int SEARCH_TAB = 0;
/**
* Index of the browse tab
*/
public static final int BROWSE_TAB = 1;
/**
* Index of the roles tab
*/
public static final int ROLES_TAB = 2;
/**
* Index of the workflows tab
*/
public static final int WORKFLOW_TAB = 3;
/**
* Index of the lifecycles tab
*/
public static final int LIFECYCLES_TAB = 4;
/**
* Index of the categories tab
*/
public static final int CATEGORIES_TAB = 5;
/**
* Index of the content types tab
*/
public static final int CONTENTTYPES_TAB = 6;
public static final int USER_ADMIN_TAB = 7;
private TabbedPane m_tabbedPane;
private BrowsePane m_browsePane;
private ItemSearch m_searchPane;
/**
* Creates the content section index page containing - a Navigaton bar for
* the various tasks (items, search, images, ....) - a breadcrumb - ....
* Contains the UI for administering a content section.
*/
public ContentSectionPage() {
super(new Label(new TitlePrinter()), new SimpleContainer());
setClassAttr("cms-admin");
add(new GlobalNavigation());
// Initialize the individual panes
m_browsePane = getBrowsePane();
m_searchPane = getSearchPane();
// The panes
m_tabbedPane = createTabbedPane();
m_tabbedPane.setIdAttr("page-body");
m_tabbedPane.addActionListener(this);
add(m_tabbedPane);
addActionListener(new ActionListener() {
@Override
public final void actionPerformed(ActionEvent e) {
final PageState state = e.getPageState();
final String tab = state.getRequest().getParameter(SET_TAB);
if (tab != null) {
m_tabbedPane.setSelectedIndex(state, Integer.valueOf(tab)
.intValue());
}
final PermissionChecker permissionChecker = CdiUtil
.createCdiUtil().findBean(PermissionChecker.class);
if (CMSConfig.getConfig().isHideAdminTabs()) {
}
}
});
}
/**
* Creates, and then caches, the browse pane. Overriding this method to
* return null will prevent this tab from appearing.
*
* @return
*/
protected BrowsePane getBrowsePane() {
if (m_browsePane == null) {
m_browsePane = new BrowsePane();
}
return m_browsePane;
}
/**
* Creates, and then caches, the search pane. Overriding this method to
* return null will prevent this tab from appearing.
*
* @return
*/
protected ItemSearch getSearchPane() {
if (m_searchPane == null) {
m_searchPane
= new ItemSearch(
ContentItemVersion.DRAFT.toString(),
CMSConfig.getConfig().isLimitItemSearchToContentSection());
}
return m_searchPane;
}
/**
* Adds the specified component, with the specified tab name, to the tabbed
* pane only if it is not null.
*
* @param pane The pane to which to add the tab
* @param tabName The name of the tab if it's added
* @param comp The component to add to the pane
*/
protected void addToPane(final TabbedPane pane,
final String tabName,
final Component comp) {
if (comp != null) {
pane.addTab(new Label(tabName), comp);
}
}
private void tab(final TabbedPane pane,
final String key,
final Component tab) {
if (tab != null) {
pane.addTab(new Label(gz(key)), tab);
}
}
/**
* <p>
* Created the TabbedPane to use for this page. Adds the tabs to the pane.
* The default implementation uses a {@link
* com.arsdigita.bebop.TabbedPane}. This implementation also adds browse,
* search, staff admin, viewers admin, workflow admin, category admin, and
* content type panes.</p>
*
* <p>
* Developers can override this method to add only the tabs they want, or to
* add additional tabs after the default CMS tabs are added.</p>
*
* @return
*/
protected TabbedPane createTabbedPane() {
final TabbedPane pane = new TabbedPane();
tab(pane, "cms.ui.browse", getBrowsePane());
tab(pane, "cms.ui.search", getSearchPane());
return pane;
}
/**
* Fetch the request-local content section.
*
* @param request The HTTP request
*
* @return The current content section
*/
@Override
public ContentSection getContentSection(final HttpServletRequest request) {
// Resets all content sections associations.
ContentSection section = super.getContentSection(request);
Assert.exists(section);
return section;
}
/**
* When a new tab is selected, reset the state of the formerly-selected
* pane.
*
* @param event The event fired by selecting a tab
*/
@Override
public void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
final Component pane = m_tabbedPane.getCurrentPane(state);
}
/**
* Construct a URL for displaying the tab
*
* @param item The item from which we get the corresponding content section
* @param tab The index of the tab to display
*
* @return
*/
public static String getSectionURL(final ContentItem item, final int tab) {
// Get the content section associated with the content item.
final ContentSection section = item.getContentType().getContentSection();
final String url = section.getPrimaryUrl() + PageLocations.SECTION_PAGE
+ "?" + SET_TAB + "=" + tab;
return url;
}
private static GlobalizedMessage gz(final String key) {
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
}
/**
* Getting the GlobalizedMessage using a CMS Class targetBundle.
*
* @param key The resource key
*
* @return
*
* @pre key != null
*/
public static GlobalizedMessage globalize(final String key) {
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
}
/**
*
* @param key
* @param args
*
* @return
*/
public static GlobalizedMessage globalize(final String key,
final Object[] args) {
return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE, args);
}
/**
* Helper class to be able to use a PrintListener to set the titel of the
* page.
*/
private static class TitlePrinter implements PrintListener {
/**
*
* @param event
*/
@Override
public void prepare(final PrintEvent event) {
final Label l = (Label) event.getTarget();
l.setLabel(CMS.getContext().getContentSection().getLabel());
}
}
}

View File

@ -1,40 +0,0 @@
/*
* Copyright (C) 2003-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.PageState;
import com.arsdigita.bebop.RequestLocal;
import com.arsdigita.cms.CMS;
import org.librecms.contentsection.ContentSection;
/**
*
*/
public final class ContentSectionRequestLocal extends RequestLocal {
@Override
protected Object initialValue(final PageState state) {
return CMS.getContext().getContentSection();
}
public final ContentSection getContentSection(final PageState state) {
return (ContentSection) get(state);
}
}

View File

@ -1,365 +0,0 @@
/*
* 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.ActionLink;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SegmentedPanel;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.ChangeEvent;
import com.arsdigita.bebop.event.ChangeListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener;
import com.arsdigita.bebop.parameters.LongParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.ui.authoring.CreationSelector;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.ActionGroup;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker;
import org.libreccm.security.PermissionManager;
import org.librecms.CmsConstants;
import org.librecms.contentsection.Folder;
import org.librecms.contentsection.privileges.ItemPrivileges;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Encapsulates a {@link FolderManipulator} in order to create a flat item
* listing. Also contains a new item form.
*
* @author <a href="mailto:sfreidin@arsdigita.com">Stanislav Freidin</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class FlatItemList extends SegmentedPanel implements FormProcessListener,
ChangeListener,
FormSubmissionListener,
Resettable,
ActionListener {
private static final String CONTENT_TYPE_ID = "ct";
// The folder selectors
private final SingleSelectionModel<Long> typeSelectionModel;
private CreationSelector creationSelector;
private final ActionLink createFolderAction;
private final Segment browseSegment;
private final Segment newItemSegment;
private final Segment newFolderSegment;
private final Segment editFolderSegment;
private final Segment permissionsSegment;
// Folder edit/rename functionality.
private final ActionLink editFolderAction;
private final Label contentLabel;
private final Label chooseLabel;
private final StringParameter selectedLanguageParam;
/**
* Construct a new item listing pane. The provided folder selection model is
* used to keep track of the currently displayed folder.
*
* @param folderRequestLocal
* @param folderSelectionModel maintains the currently displayed folder.
*/
@SuppressWarnings("unchecked")
public FlatItemList() {
setIdAttr("flat-item-list");
newItemSegment = addSegment();
newItemSegment.setIdAttr("folder-new-item");
newFolderSegment = addSegment();
newFolderSegment.setIdAttr("folder-new-folder");
editFolderSegment = addSegment();
editFolderSegment.setIdAttr("folder-edit-folder");
browseSegment = addSegment();
browseSegment.setIdAttr("folder-browse");
final ActionGroup browseActions = new ActionGroup();
browseSegment.add(browseActions);
// The top 'browse' segment
contentLabel = new Label(globalize("cms.ui.contents_of"), false);
browseSegment.addHeader(contentLabel);
chooseLabel = new Label(globalize("cms.ui.choose_target_folder"),
false);
browseSegment.addHeader(chooseLabel);
createFolderAction = new ActionLink(new Label(globalize(
"cms.ui.new_folder")));
createFolderAction.addActionListener(this);
browseActions.addAction(createFolderAction);
editFolderAction = new ActionLink(new Label(globalize(
"cms.ui.edit_folder")));
editFolderAction.addActionListener(this);
browseActions.addAction(editFolderAction);
permissionsSegment = addSegment();
permissionsSegment.setIdAttr("folder-permissions");
final ActionGroup permissionActions = new ActionGroup();
permissionsSegment.add(permissionActions);
permissionsSegment.addHeader(new Label(new GlobalizedMessage(
"cms.ui.permissions", CmsConstants.CMS_BUNDLE)));
selectedLanguageParam = new StringParameter(
ContentItemPage.SELECTED_LANGUAGE);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionManager permissionManager = cdiUtil.findBean(
PermissionManager.class);
final List<String> privileges = permissionManager
.listDefiniedPrivileges(ItemPrivileges.class);
final Map<String, String> privNameMap = new HashMap<>();
privileges.forEach(privilege -> privNameMap.put(privilege, privilege));
newItemSegment.addHeader(new Label(globalize("cms.ui.new_item")));
typeSelectionModel = new ParameterSingleSelectionModel<>(
new LongParameter(CONTENT_TYPE_ID));
typeSelectionModel.addChangeListener(this);
//m_newItemSeg.add(new Label("<br/>", false));
// The 'new folder' segment
newFolderSegment.addHeader(new Label(globalize("cms.ui.new_folder")));
// final Form folderCreate = new Form("fcreat");
//folderCreator.add(folderCreator);
newFolderSegment.add(new Label("<br/>", false));
editFolderSegment.addHeader(new Label(globalize("cms.ui.edit_folder")));
//Form folderEditorForm = new Form("fedit_form");
//folderEditorForm.add(folderEditor);
editFolderSegment.add(new Label("<br/>", false));
}
@Override
public void register(final Page page) {
super.register(page);
page.setVisibleDefault(chooseLabel, false);
// page.setVisibleDefault(browseSegment, true);
page.setVisibleDefault(newItemSegment, false);
page.setVisibleDefault(newFolderSegment, false);
page.setVisibleDefault(editFolderSegment, false);
page.addComponentStateParam(this,
typeSelectionModel.getStateParameter());
page.addGlobalStateParam(selectedLanguageParam);
page.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
if (state.isVisibleOnPage(FlatItemList.this)) {
showHideSegments(state);
}
}
});
}
/**
* Show/hide segments based on access checks.
*
* @param state The page state
*
* @pre ( state != null )
*/
private void showHideSegments(final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class);
final Folder folder = null;
// MP: This should be checked on the current folder instead of just
// the content section.
final boolean newItem = permissionChecker.isPermitted(
ItemPrivileges.CREATE_NEW, folder);
if (!newItem) {
browseMode(state);
}
createFolderAction.setVisible(state, newItem);
final boolean editItem = permissionChecker.isPermitted(
ItemPrivileges.EDIT, folder);
editFolderAction.setVisible(state, editItem);
// chooseLabel.setVisible(state, editItem);
// editFolderSegment.setVisible(state, editItem);
if (permissionChecker.isPermitted(ItemPrivileges.ADMINISTER, folder)) {
permissionsSegment.setVisible(state, true);
} else {
permissionsSegment.setVisible(state, false);
}
}
private void browseMode(final PageState state) {
browseSegment.setVisible(state, true);
permissionsSegment.setVisible(state, true);
chooseLabel.setVisible(state, false);
contentLabel.setVisible(state, true);
newItemSegment.setVisible(state, false);
newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, false);
typeSelectionModel.clearSelection(state);
}
private void newItemMode(final PageState state) {
permissionsSegment.setVisible(state, false);
newItemSegment.setVisible(state, true);
}
private void newFolderMode(final PageState state) {
permissionsSegment.setVisible(state, false);
newFolderSegment.setVisible(state, true);
}
@Override
public void submitted(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
}
@Override
public void process(final FormSectionEvent event) {
final PageState state = event.getPageState();
final Object source = event.getSource();
}
@Override
public void stateChanged(final ChangeEvent event) {
final PageState state = event.getPageState();
if (event.getSource().equals(typeSelectionModel)) {
if (!typeSelectionModel.isSelected(state)) {
browseMode(state);
}
}
}
@Override
public void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
final Object source = event.getSource();
if (source == createFolderAction) {
newFolderMode(state);
} else if (source == editFolderAction) {
permissionsSegment.setVisible(state, false);
editFolderSegment.setVisible(state, true);
}
// else if (source == togglePrivateAction) {
// togglePermissions(state);
// }
// } else if (source == m_setHomeFolderAction) {
// User user = Web.getWebContext().getUser();
// Folder folder = m_folder.getFolder(state);
// user = (User) DomainObjectFactory.newInstance(user.getOID());
// Folder.setUserHomeFolder(user, folder);
// } else if (source == m_removeHomeFolderAction) {
// User user = Web.getWebContext().getUser();
// ContentSection section = CMS.getContext().getContentSection();
// UserHomeFolderMap map = UserHomeFolderMap
// .findUserHomeFolderMap(user, section);
// if (map != null) {
// map.delete();
// }
// }
}
private void togglePermissions(final PageState state) {
final Folder currentFolder = null;
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class);
permissionChecker.checkPermission(ItemPrivileges.ADMINISTER,
currentFolder);
}
@Override
public void reset(final PageState state) {
browseMode(state);
// switching between folders used to keep showing the permission pane
// in the same perm mode (direct or inherited) regardless
// of the folder status
}
public void setPermissionLinkVis(final PageState state) {
// final Folder currentFolder = folderRequestLocal.getFolder(state);
// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
// final PermissionChecker permissionChecker = cdiUtil.findBean(
// PermissionChecker.class);
// if (!permissionChecker.isPermitted(ItemPrivileges.ADMINISTER,
// currentFolder)) {
// togglePrivateAction.setVisible(state, false);
// }
}
/**
* Getting the GlobalizedMessage using a CMS Class targetBundle.
*
* @param key The resource key
*
* @pre ( key != null )
*/
private static GlobalizedMessage globalize(final String key) {
return ContentSectionPage.globalize(key);
}
}

View File

@ -1,77 +0,0 @@
/*
* 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.Form;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SimpleContainer;
import org.librecms.contentsection.ContentItem;
/**
* A wrapper around the {@link ItemSearchSection} which embeds the form section
* in a form.
*
* @author Stanislav Freidin (sfreidin@arsdigita.com)
* @author <a href="jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ItemSearch extends Form implements Resettable {
public static final String SINGLE_TYPE_PARAM = ItemSearchSection.SINGLE_TYPE_PARAM;
private ItemSearchSection itemSearchSection;
/**
* Construct a new <code>ItemSearch</code> component Default to limit the
* search to current content section
*
* @param context the context for the retrieved items. Should be
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
*/
public ItemSearch(String context) {
this(context, true);
}
/**
* Construct a new <code>ItemSearch</code> component
*
* @param context the context for the retrieved items. Should be
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
* @param limitToContentSection limit the search to the current content
* section
*/
public ItemSearch(final String context,
final boolean limitToContentSection) {
super("itemSearch", new SimpleContainer());
//setMethod("GET");
itemSearchSection = createSearchSection(context, limitToContentSection);
super.add(itemSearchSection);
}
protected ItemSearchSection createSearchSection(final String context,
boolean limitToContentSection) {
return new ItemSearchSection(context, limitToContentSection);
}
@Override
public void reset(final PageState state) {
itemSearchSection.reset(state);
}
}

View File

@ -1,189 +0,0 @@
/*
* Copyright (C) 2003-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.Component;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Container;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.FormSection;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentType;
import com.arsdigita.cms.ui.search.ItemQueryComponent;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.search.ui.ResultsPane;
import com.arsdigita.search.ui.QueryGenerator;
import com.arsdigita.toolbox.ui.LayoutPanel;
import org.librecms.CmsConstants;
/**
* Contains a form for specifying search parameters, as well as a
* {@link com.arsdigita.search.ui.ResultsPane} which will perform the search and
* display the results
*
* @author Stanislav Freidin (sfreidin@arsdigita.com)
* @version $Id: ItemSearchSection.java 1940 2009-05-29 07:15:05Z terry $
*/
public class ItemSearchSection extends FormSection implements Resettable {
public static final String SINGLE_TYPE_PARAM = "single_type";
private ItemQueryComponent itemQueryComponent;
private Component resultsComponent;
/**
* Construct a new <code>ItemSearchSection</code> component
*
* @param context the context for the retrieved items. Should be
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
* @param limitToContentSection limit the search to the current content
* section
*/
public ItemSearchSection(final String context,
final boolean limitToContentSection) {
this(null, context, limitToContentSection);
}
/**
* Construct a new <code>ItemSearchSection</code> component
*
* @param context the context for the retrieved items. Should be
* {@link ContentItem#DRAFT} or {@link ContentItem#LIVE}
* @param name The name of the search parameter for the particular
* FormSection
* @param limitToContentSection limit the search to the current content
* section
*/
public ItemSearchSection(final String name,
final String context,
final boolean limitToContentSection) {
this(name, context, limitToContentSection, null);
}
public ItemSearchSection(final String name,
final String context,
final boolean limitToContentSection,
final ContentType type) {
super(new SimpleContainer());
final String thisName;
if (name == null) {
thisName = "itemSearch";
} else {
thisName = name;
}
if (type == null) {
itemQueryComponent = createQueryGenerator(context,
limitToContentSection);
} else {
itemQueryComponent = createQueryGenerator(context,
limitToContentSection,
type);
}
resultsComponent = createResultsPane(itemQueryComponent);
LayoutPanel searchPanel = new LayoutPanel();
searchPanel.setLeft(itemQueryComponent);
searchPanel.setBody(resultsComponent);
this.add(searchPanel);
addQueryGenerator(this);
addResultsPane(this);
addFormListener();
setClassAttr("itemSearch");
}
@Override
public void reset(final PageState state) {
resultsComponent.setVisible(state, false);
}
protected ItemQueryComponent createQueryGenerator(
final String context, final boolean limitToContentSection) {
return new ItemQueryComponent(context, limitToContentSection);
}
protected ItemQueryComponent createQueryGenerator(
final String context,
final boolean limitToContentSection,
final ContentType type) {
return new ItemQueryComponent(context, limitToContentSection, type);
}
protected Component createResultsPane(QueryGenerator generator) {
ResultsPane pane = new ResultsPane(generator);
pane.setRelativeURLs(true);
pane.setSearchHelpMsg(new GlobalizedMessage("cms.ui.search.help",
CmsConstants.CMS_BUNDLE));
pane.setNoResultsMsg(new GlobalizedMessage("cms.ui.search.no_results",
CmsConstants.CMS_BUNDLE));
return pane;
}
protected void addResultsPane(final Container container) {
container.add(resultsComponent);
}
protected void addQueryGenerator(final Container container) {
container.add(itemQueryComponent);
}
protected void processQuery(final PageState state) {
resultsComponent.setVisible(state, itemQueryComponent.hasQuery(state));
}
protected void addFormListener() {
addProcessListener(new SearchFormProcessListener());
}
// Hide results by default
@Override
public void register(final Page page) {
super.register(page);
page.setVisibleDefault(resultsComponent, false);
page.addGlobalStateParam(new BigDecimalParameter(SINGLE_TYPE_PARAM));
}
/**
* Displays the "keywords" and "content types" widgets
*/
private class SearchFormProcessListener implements FormProcessListener {
@Override
public void process(final FormSectionEvent event)
throws FormProcessException {
PageState s = event.getPageState();
processQuery(s);
}
}
}

View File

@ -1,295 +0,0 @@
/*
* Copyright (C) 2002-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.ColumnPanel;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.RequestLocal;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.form.CheckboxGroup;
import com.arsdigita.bebop.form.Hidden;
import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.Widget;
import com.arsdigita.bebop.parameters.NotNullValidationListener;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.xml.Element;
import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.security.Party;
import org.librecms.CmsConstants;
import java.util.List;
import java.util.TooManyListenersException;
/**
* Form for adding multiple parties to a role.
*
* @author Scott Seago (scott@arsdigita.com)
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
*/
public abstract class PartyAddForm extends SimpleContainer
implements FormInitListener, FormProcessListener {
private final static String SEARCH_QUERY = "searchQuery";
private final static String PARTIES = "parties";
private final static String SUBMIT = "addSubmit";
private final static String CANCEL = "addCancel";
private Widget searchWidget;
private RequestLocal queryRequestLocal;
private CMSContainer noMatchesContainer;
private CMSContainer matchesContainer;
private Form form;
private Hidden searchQueryField;
private Submit cancelButton;
/**
* Private access prevents this constructor from ever being called directly.
*/
private PartyAddForm() {
super();
}
/**
* Constructor.
*
* @param searchWidget The widget on the search form that contains the value
* of the search string.
*/
public PartyAddForm(final Widget searchWidget) {
this();
this.searchWidget = searchWidget;
queryRequestLocal = new RequestLocal() {
@Override
protected Object initialValue(final PageState state) {
return makeQuery(state);
}
};
form = makeForm();
final Label title = new Label(new GlobalizedMessage("cms.ui.matches",
CmsConstants.CMS_BUNDLE));
title.setFontWeight(Label.BOLD);
final Label label = new Label(new GlobalizedMessage(
"cms.ui.there_was_no_one_matching_the_search_criteria",
CmsConstants.CMS_BUNDLE));
label.setFontWeight("em");
noMatchesContainer = new CMSContainer();
noMatchesContainer.add(title);
noMatchesContainer.add(label);
super.add(noMatchesContainer);
matchesContainer = new CMSContainer();
matchesContainer.add(title);
matchesContainer.add(form);
super.add(matchesContainer);
}
/**
* Build the form used to add parties.
*
* @return The form
*/
private Form makeForm() {
final CMSForm addPartyForm = new CMSForm("AddParties") {
@Override
public final boolean isCancelled(final PageState state) {
return cancelButton.isSelected(state);
}
};
// This hidden field will store the search query. A hidden widget is
// used instead of a request local variable because the search query
// should only be updated when the search form is submitted.
searchQueryField = new Hidden(SEARCH_QUERY);
addPartyForm.add(searchQueryField, ColumnPanel.FULL_WIDTH);
final Label hintLabel = new Label(
new GlobalizedMessage("cms.ui.party_add_form.hint",
CmsConstants.CMS_BUNDLE));
addPartyForm.add(hintLabel, ColumnPanel.FULL_WIDTH);
// Add the list of parties that can be added.
final CheckboxGroup partyCheckboxes = new CheckboxGroup(PARTIES);
partyCheckboxes.addValidationListener(new NotNullValidationListener());
try {
partyCheckboxes.addPrintListener(event -> {
final CheckboxGroup target = (CheckboxGroup) event.getTarget();
final PageState state = event.getPageState();
// Ensures that the init listener gets fired before the
// print listeners.
final FormData data = addPartyForm.getFormData(state);
addParties(state, target);
});
} catch (TooManyListenersException ex) {
throw new UnexpectedErrorException(ex);
}
addPartyForm.add(partyCheckboxes, ColumnPanel.FULL_WIDTH);
// Submit and Cancel buttons.
final SimpleContainer buttonContainer = new SimpleContainer();
final Submit submitButton = new Submit(SUBMIT,
new GlobalizedMessage(
"cms.ui.save",
CmsConstants.CMS_BUNDLE));
buttonContainer.add(submitButton);
cancelButton = new Submit(CANCEL,
new GlobalizedMessage("cms.ui.cancel",
CmsConstants.CMS_BUNDLE));
buttonContainer.add(cancelButton);
addPartyForm.add(buttonContainer, ColumnPanel.FULL_WIDTH
| ColumnPanel.CENTER);
addPartyForm.addInitListener(this);
addPartyForm.addProcessListener(this);
return addPartyForm;
}
/**
* Fetches the form for adding parties.
*
* @return The "add party" form
*/
public Form getForm() {
return form;
}
/**
* Fetches the widget that contains the search string.
*
* @return The widget that contains the search string
*/
protected Widget getSearchWidget() {
return searchQueryField;
}
/**
* Return true if the form is cancelled, false otherwise.
*
* @param state The page state
*
* @return true if the form is cancelled, false otherwise.
*
* @pre ( state != null )
*/
public boolean isCancelled(final PageState state) {
return cancelButton.isSelected(state);
}
/**
* Adds parties to the option group.
*
* @param state The page state
* @param target The option group
*
* @pre ( state != null && target != null )
*/
private void addParties(final PageState state, final OptionGroup target) {
@SuppressWarnings("unchecked")
final List<Party> parties = (List<Party>) queryRequestLocal.get(state);
target.clearOptions();
for (final Party party : parties) {
target.addOption(new Option(
Long.toString(party.getPartyId()),
new Label(new GlobalizedMessage(party.getName()))
));
}
}
/**
* Generates a {@link Object} that encapsulates search results.
*
* @param state The page state
*
* @return
*/
protected abstract List<Party> makeQuery(PageState state);
/**
* Stores the search query in the hidden field.
*
* @param event The form event
*
* @throws com.arsdigita.bebop.FormProcessException
*/
@Override
public void init(final FormSectionEvent event) throws FormProcessException {
PageState state = event.getPageState();
searchQueryField.setValue(state, searchWidget.getValue(state));
}
/**
* Process listener for the "Add parties" form.
*
* @param event The form event
*
* @throws com.arsdigita.bebop.FormProcessException
*/
@Override
public abstract void process(FormSectionEvent event)
throws FormProcessException;
/**
* Displays the appropriate frame.
*
* @param state The page state
* @param parent The parent DOM element
*/
@Override
public void generateXML(final PageState state, final Element parent) {
@SuppressWarnings("unchecked")
final List<Party> searchResults = (List<Party>) queryRequestLocal.get(state);
if (searchResults.size() > 0) {
matchesContainer.generateXML(state, parent);
} else {
noMatchesContainer.generateXML(state, parent);
}
}
}

View File

@ -1,62 +0,0 @@
/*
* Copyright (C) 2002-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.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.util.Assert;
/**
* Form to search for parties to be added to a staff group.
*
* @author Scott Seago &lt;sseago@redhat.com&gt;
* @version $Id: PartySearchForm.java 1942 2009-05-29 07:53:23Z terry $
*/
public class PartySearchForm extends BaseForm {
private final TextField searchField;
public PartySearchForm() {
super("SearchParties", gz("cms.ui.search"));
addComponent(new Label(gz("cms.ui.search_prompt")));
searchField = new TextField(new StringParameter("query"));
searchField.setSize(40);
addComponent(searchField);
addAction(new Submit("finish", gz("cms.ui.search")));
addAction(new Cancel());
}
@Override
public final void register(final Page page) {
super.register(page);
Assert.isTrue(page.stateContains(this));
}
public TextField getSearchWidget() {
return searchField;
}
}

View File

@ -1,158 +0,0 @@
/*
* Copyright (C) 2002-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.Component;
import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.List;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.list.ListModel;
import com.arsdigita.bebop.util.BebopConstants;
import com.arsdigita.cms.CMS;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.Assert;
import com.arsdigita.xml.Element;
import java.io.IOException;
/**
* This list offers the option for the code to provide the developer with links
* to sort the given categories.
*
* NOTE: This UI currently does not scale well with large numbers of items since
* it just lists all of them. It would probably be nice to integrate a paginator
* as well to as to allow the user to move an item in large distances and to
* insert an item in the middle. Right now, when you add an item it is just
* placed at the end. However, if you want the item to appear in the middle then
* you must hit the "up" arrow n/2 times where n is the number of items in the
* list. This clearly is not a good setup.
*
*
* @author Randy Graebner (randyg@alum.mit.edu)
* @author <a href="mailto:yannick.buelter@yabue.de">Yannick Bülter</a>
*/
public abstract class SortableList extends List {
// It would be really nice if this used the save variable as is
// used by List but because List has it as private, we cannot do that.
private static final String SELECT_EVENT = "s";
protected static final String PREV_EVENT = "prev";
protected static final String NEXT_EVENT = "next";
public boolean m_sortItems;
/**
* This just makes a standard {@link SortableList}
*/
public SortableList(ParameterSingleSelectionModel model) {
this(model, false);
}
public SortableList(ParameterSingleSelectionModel model,
boolean suppressSort) {
super(model);
m_sortItems = !suppressSort;
}
/**
* This geneates the XML as specified by the arguments pass in to the
* constructor.
*/
public void generateXML(PageState state, Element parent) {
if (!isVisible(state)) {
return;
}
// They want the special sort items
ListModel m = getModel(state);
if (!m.next()) {
super.generateXML(state, parent);
return;
}
// because m.next() returned true, we know there are items
// in the list
Element list = parent
.newChildElement("cms:sortableList", CMS.CMS_XML_NS);
exportAttributes(list);
Component c;
Object selKey = getSelectedKey(state);
int i = 0;
boolean hasNext;
do {
Element item = list.newChildElement(BebopConstants.BEBOP_CELL,
BEBOP_XML_NS);
if (m_sortItems) {
item.addAttribute("configure", "true");
}
String key = m.getKey();
Assert.exists(key);
// Converting both keys to String for comparison
// since ListModel.getKey returns a String
boolean selected = (selKey != null)
&& key.equals(selKey.toString());
if (selected) {
item.addAttribute("selected", "selected");
}
generateLabelXML(state, item,
new Label(new GlobalizedMessage(m.getElement()
.toString())), key, m.getElement());
hasNext = m.next();
// Add attributes containing URLs that fire control events
// for various portlet actions
try {
// Maybe add attribute containing URL for "move up" link
if (i > 0) {
state.setControlEvent(this, PREV_EVENT, key);
item.addAttribute("prevURL", state.stateAsURL());
}
// Maybe add attribute containing URL for "move down" link
if (hasNext) {
state.setControlEvent(this, NEXT_EVENT, key);
item.addAttribute("nextURL", state.stateAsURL());
}
} catch (IOException ex) {
throw new IllegalStateException("Caught IOException: "
+ ex.getMessage());
}
i++;
} while (hasNext);
state.clearControlEvent();
}
protected void generateLabelXML(PageState state, Element parent,
Label label, String key, Object element) {
state.setControlEvent(this, SELECT_EVENT, key);
Component c = new ControlLink(label);
c.generateXML(state, parent);
}
}

View File

@ -1,80 +0,0 @@
/*
* Copyright (C) 2003-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.PageState;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.ContextBar;
import com.arsdigita.web.URL;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.web.ApplicationRepository;
import org.libreccm.web.CcmApplication;
import org.librecms.CmsConstants;
import java.util.List;
/**
* <p>
* The context bar of the content center UI.</p>
*
* @author Justin Ross
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
// Made public (instead of unspecified) in 6.6.8
public class WorkspaceContextBar extends ContextBar {
/**
* A logger instance, primarily to assist debugging .
*/
private static final Logger LOGGER = LogManager.getLogger(
WorkspaceContextBar.class);
/**
*
* @param state
*
* @return
*/
@Override
protected List<Entry> entries(final PageState state) {
final List<Entry> entries = super.entries(state);
final String centerTitle = (String) new GlobalizedMessage(
"cms.ui.content_center", CmsConstants.CMS_BUNDLE).localize();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ApplicationRepository appRepo = cdiUtil.findBean(
ApplicationRepository.class);
final List<CcmApplication> apps = appRepo.findByType(
CmsConstants.CONTENT_CENTER_APP_TYPE);
final String centerPath = apps.get(0).getPrimaryUrl();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Got Url: " + centerPath);
}
final URL url = URL.there(state.getRequest(), centerPath);
entries.add(new Entry(centerTitle, url));
return entries;
}
}

View File

@ -1,66 +0,0 @@
/*
* Copyright (C) 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.authoring;
import org.apache.logging.log4j.Logger;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.form.Widget;
import com.arsdigita.bebop.parameters.LongParameter;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.categorization.ui.ACSObjectCategoryForm;
import com.arsdigita.cms.CMS;
import org.apache.logging.log4j.LogManager;
import org.libreccm.core.CcmObject;
/**
* (No description available yet).
*
* Usage of this class is configured in parameter
* c.ad.cms.category_authoring_add_form
*/
public class ItemCategoryForm extends ACSObjectCategoryForm {
private static Logger LOGGER = LogManager.getLogger(ItemCategoryForm.class);
public ItemCategoryForm(final LongParameter rootParameter,
final StringParameter modeParameter,
final Widget widget) {
super(rootParameter, modeParameter, widget);
LOGGER.debug("creating new ItemTerm Form with widget " + widget);
}
public ItemCategoryForm(final LongParameter root,
final StringParameter mode) {
this(root, mode, new CategoryWidget("category", root, mode));
}
/*
* @see com.arsdigita.categorization.ui.ACSObjectCategoryForm#getObject()
*/
@Override
protected CcmObject getObject(final PageState state) {
return CMS.getContext().getContentItem();
}
}

View File

@ -1,211 +0,0 @@
/*
* Copyright (C) 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.authoring;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.parameters.LongParameter;
import com.arsdigita.web.RedirectSignal;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.util.Classes;
import org.librecms.CMSConfig;
import org.libreccm.core.UnexpectedErrorException;
import org.librecms.CmsConstants;
import org.librecms.ui.authoring.ContentItemAuthoringStep;
import java.math.BigDecimal;
@ContentItemAuthoringStep(
labelBundle = CmsConstants.CMS_BUNDLE,
labelKey = "item_category_step.label",
descriptionBundle = CmsConstants.CMS_BUNDLE,
descriptionKey = "item_category_step.description"
)
public class ItemCategoryStep extends SimpleContainer implements Resettable {
private final LongParameter rootParameter;
private final StringParameter modeParameter;
private final ItemCategorySummary itemCategorySummary;
private final SimpleComponent addComponent;
private final SimpleComponent[] extensionSummaries;
private final SimpleComponent[] extensionForms;
private int extensionsCount;
public ItemCategoryStep(final ItemSelectionModel itemSelectionModel,
final AuthoringKitWizard authoringKitWizard,
final StringParameter selectedLanguage) {
super("cms:categoryStep", CMS.CMS_XML_NS);
rootParameter = new LongParameter("root");
modeParameter = new StringParameter("mode");
itemCategorySummary = new ItemCategorySummary();
itemCategorySummary.registerAction(ItemCategorySummary.ACTION_ADD,
new AddActionListener("plain"));
itemCategorySummary.registerAction(ItemCategorySummary.ACTION_ADD_JS,
new AddActionListener("javascript"));
final String addFormClassName = null;
final Class<?> addFormClass;
try {
addFormClass = Class.forName(addFormClassName);
} catch (ClassNotFoundException ex) {
throw new UnexpectedErrorException(ex);
}
addComponent = (SimpleComponent) Classes
.newInstance(addFormClass,
new Class<?>[]{LongParameter.class,
StringParameter.class},
new Object[]{rootParameter, modeParameter});
addComponent.addCompletionListener(new ResetListener());
final String extensionClassName = CMSConfig
.getConfig()
.getCategoryAuthoringExtension();
final Class<?> extensionClass;
try {
extensionClass = Class.forName(extensionClassName);
} catch (ClassNotFoundException ex) {
throw new UnexpectedErrorException(ex);
}
final ItemCategoryExtension extension = (ItemCategoryExtension) Classes
.newInstance(extensionClass);
extensionSummaries = extension.getSummary();
extensionForms = extension.getForm();
int nSummaries = extensionSummaries.length;
int nForms = extensionForms.length;
if (nSummaries != nForms) {
throw new UnexpectedErrorException(
"Invalid category step extension.");
}
extensionsCount = nForms;
for (int i = 0; i < extensionsCount; i++) {
extensionSummaries[i]
.addCompletionListener(new ExtensionListener(i));
extensionForms[i].addCompletionListener(new ResetListener());
super.add(extensionSummaries[i]);
super.add(extensionForms[i]);
}
super.add(itemCategorySummary);
super.add(addComponent);
}
@Override
public void register(final Page page) {
super.register(page);
page.setVisibleDefault(addComponent, false);
for (int i = 0; i < extensionsCount; i++) {
page.setVisibleDefault(extensionForms[i], false);
}
page.addGlobalStateParam(rootParameter);
page.addGlobalStateParam(modeParameter);
}
@Override
public void reset(final PageState state) {
state.setValue(rootParameter, null);
state.setValue(modeParameter, null);
itemCategorySummary.setVisible(state, true);
addComponent.setVisible(state, false);
for (int i = 0; i < extensionsCount; i++) {
extensionSummaries[i].setVisible(state, true);
extensionForms[i].setVisible(state, false);
}
}
private class AddActionListener implements ActionListener {
private final String mode;
public AddActionListener(final String mode) {
this.mode = mode;
}
@Override
public void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
state.setValue(rootParameter,
new BigDecimal(state.getControlEventValue()));
state.setValue(ItemCategoryStep.this.modeParameter,
mode);
itemCategorySummary.setVisible(state, false);
addComponent.setVisible(state, true);
for (int i=0;i<extensionsCount;i++) {
extensionSummaries[i].setVisible(state, false);
extensionForms[i].setVisible(state, false);
}
}
}
private class ResetListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
final PageState state = e.getPageState();
reset(state);
throw new RedirectSignal(state.toURL(), true);
}
}
private class ExtensionListener implements ActionListener {
private final int extensionIndex;
public ExtensionListener(int extensionIndex) {
this.extensionIndex = extensionIndex;
}
@Override
public void actionPerformed(final ActionEvent event) {
final PageState state = event.getPageState();
itemCategorySummary.setVisible(state, false);
addComponent.setVisible(state, false);
for (int i=0;i<extensionsCount;i++) {
extensionSummaries[i].setVisible(state, false);
}
extensionForms[extensionIndex].setVisible(state, true);
}
}
}

View File

@ -1,62 +0,0 @@
/*
* Copyright (C) 2017 LibreCCM Foundation.
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui.authoring;
import org.libreccm.categorization.Category;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionRepository;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
class ItemCategoryStepController {
@Inject
private ContentSectionRepository sectionRepo;
@Transactional(Transactional.TxType.REQUIRED)
protected List<Category> getRootCategories(final ContentSection section) {
Objects.requireNonNull(section);
final ContentSection contentSection = sectionRepo
.findById(section.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No ContentSection with ID %d in the database.",
section.getObjectId())));
return contentSection
.getDomains()
.stream()
.map(domainOwnership -> domainOwnership.getDomain())
.map(domain -> domain.getRoot())
.collect(Collectors.toList());
}
}

View File

@ -1,91 +0,0 @@
/*
* Copyright (C) 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.authoring;
import com.arsdigita.bebop.PageState;
import org.libreccm.categorization.Category;
import com.arsdigita.categorization.ui.ACSObjectCategorySummary;
import com.arsdigita.cms.CMS;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject;
import org.libreccm.security.PermissionChecker;
import org.librecms.contentsection.privileges.ItemPrivileges;
import java.util.List;
public class ItemCategorySummary extends ACSObjectCategorySummary {
public ItemCategorySummary() {
super();
}
@Override
protected boolean canEdit(final PageState state) {
final PermissionChecker permissionChecker = CdiUtil
.createCdiUtil()
.findBean(PermissionChecker.class);
return permissionChecker.isPermitted(ItemPrivileges.CATEGORIZE,
CMS.getContext().getContentItem());
}
/*
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getObject()
*/
@Override
protected CcmObject getObject(final PageState state) {
return CMS.getContext().getContentItem();
}
/*
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getXMLPrefix()
*/
@Override
protected String getXMLPrefix() {
return "cms";
}
/*
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getXMLNameSpace()
*/
@Override
protected String getXMLNameSpace() {
return CMS.CMS_XML_NS;
}
/*
* @see com.arsdigita.categorization.ui.ObjectCategorySummary#getRootCategories()
*/
@Override
protected List<Category> getRootCategories(final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ItemCategoryStepController controller = cdiUtil
.findBean(ItemCategoryStepController.class);
return controller.getRootCategories(CMS.getContext().getContentSection());
}
}

View File

@ -1,209 +0,0 @@
/*
* Copyright (C) 2002-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.authoring;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SimpleContainer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* A container which implements the {@link Resettable} interface and provides
* other useful methods.
*
* @author <a href="mailto:phong@arsdigita.com">Phong Nguyen</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ResettableContainer extends SimpleContainer implements Resettable {
/**
* A list of all resettable components in this container
*/
private final List<Component> resettableComponents = new ArrayList<>();
/**
* A list of all components that are not visible by default
*/
private final List<Component> componentsNotVisibleByDefault
= new ArrayList<>();
/**
* Constructs a new, empty {@code RessetableContainer}.
*
*/
public ResettableContainer() {
super();
}
/**
* Constructs a new, empty {@code ResettableContainer}.
*
* @param key The key for this container.
*
*/
public ResettableContainer(final String key) {
super();
setKey(key);
}
/**
* Constructs a new, empty {@code RessetableContainer}. The container will
* wrap its children in the specified tag.
*
* @param tag The name of the XML element that will be used to wrap
* the children of this container.
* @param namespace The namespace for the tag.
*
*/
public ResettableContainer(final String tag, final String namespace) {
super(tag, namespace);
}
/**
* Adds a component to container.
*
* @param component The component to be added.
*
*/
@Override
public void add(final Component component) {
add(component, true);
}
/**
* Add a component to this container
*
* @param component The component to be added.
* @param constraints This parameter is ignored. Child classes should
* override the add method if they wish to provide
* special handling of constraints.
*
*/
@Override
public void add(final Component component, final int constraints) {
add(component);
}
/**
* Adds the component to this pane with the specified default visibility.
*
* @param component
* @param defaultVisibility The default visibility of this component
*
*
*/
public void add(final Component component,
final boolean defaultVisibility) {
super.add(component);
if (component instanceof Resettable) {
resettableComponents.add(component);
}
if (!defaultVisibility) {
componentsNotVisibleByDefault.add(component);
}
}
/**
* Sets the visibility of all child components to false, except for the
* component with the specified key.
*
* @param state The state of the current request.
* @param key The key of the component. There will be no visibility
* changes if key is null.
*
*/
public void onlyShowComponent(final PageState state,
final String key) {
if (key == null) {
return;
}
@SuppressWarnings("unchecked")
final Iterator<Component> iter = children();
Component child;
while (iter.hasNext()) {
child = iter.next();
child.setVisible(state, key.equals(child.getKey()));
}
}
/**
* Sets the visibility of all child components to false, except for the
* specified component.
*
* @param state The state of the current request.
* @param component The key of the component. There will be no visibility
* changes if {@code component} is null.
*
*/
public void onlyShowComponent(final PageState state,
final Component component) {
if (component == null) {
return;
}
@SuppressWarnings("unchecked")
final Iterator<Component> iter = children();
Component child;
while (iter.hasNext()) {
child = iter.next();
child.setVisible(state, child.equals(component));
}
}
/**
* Resets all resettable components added to this container.
*
* @param state The state of the current request.
*
*/
@Override
public void reset(final PageState state) {
// Reset all resettable components automatically
final Iterator<Component> iter = resettableComponents.iterator();
while (iter.hasNext()) {
((Resettable) iter.next()).reset(state);
}
}
/**
* Registers with page that this container belongs to and sets the default
* visibility of child components.
*
* @param page The page this container belongs to.
*
*/
@Override
public void register(final Page page) {
final Iterator<Component> iter = componentsNotVisibleByDefault
.iterator();
while (iter.hasNext()) {
page.setVisibleDefault(iter.next(), false);
}
}
}

View File

@ -1,353 +0,0 @@
/*
* 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.authoring;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.RequestEvent;
import com.arsdigita.bebop.event.RequestListener;
import com.arsdigita.bebop.parameters.StringParameter;
import org.librecms.contentsection.ContentItem;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.ContentItemPage;
import com.arsdigita.cms.ui.SecurityPropertyEditor;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.ComponentAccess;
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.List;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.CmsConstants;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
/**
* A simple implementation of an Authoring Kit editing step. Extends
* {@link SecurityPropertyEditor} and provides authoring kit integration. See
* the authoring kit documentation for more info.
*
* Child classes should a). call setDisplayComponent() b). call add() zero or
* more times
*
* @author Stanislav Freidin
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class SimpleEditStep extends SecurityPropertyEditor
implements AuthoringStepComponent, RequestListener {
private AuthoringKitWizard authoringKitWizard;
private ItemSelectionModel itemSelectionModel;
private String defaultEditKey = null;
private StringParameter streamlinedCreationParameter;
private static final String STREAMLINED = "_streamlined";
private static final String STREAMLINED_DONE = "1";
private final StringParameter selectedLanguageParameter;
private static List<AdditionalDisplayComponent> additionalDisplayComponents
= new ArrayList<>();
/**
* allow additional display components to be added to all implementations of
* SimpleEditStep. This allows shared optional packages such as notes to
* display information on the initial authoring page of all content types
* without causing dependencies from ccm-cms.
*
* Any additional components must be added before the edit step is created.
* An initialiser is a suitable location
*
* @param additionalDisplayComponent
*/
public static void addAdditionalDisplayComponent(
AdditionalDisplayComponent additionalDisplayComponent) {
additionalDisplayComponents.add(additionalDisplayComponent);
}
/**
* Construct a new SimpleEditStep component
*
* @param itemModel The {@link ItemSelectionModel} which will be
* responsible for loading the current item
*
* @param parent The parent wizard which contains the form.
* The component may use the wizard's methods,
* such as stepForward and stepBack, in its
* process listener.
* @param selectedLanguageParam
*/
public SimpleEditStep(final ItemSelectionModel itemModel,
final AuthoringKitWizard parent,
final StringParameter selectedLanguageParam) {
this(itemModel, parent, selectedLanguageParam, "");
}
/**
* Construct a new SimpleEditStep component
*
* @param itemSelectionModel The {@link ItemSelectionModel} which will be
* responsible for loading the current item
*
* @param authoringKitWizard The parent wizard which contains the form. The
* component may use the wizard's methods, such as
* stepForward and stepBack, in its process
* listener.
* @param selectedLanguageParam
*
* @param parameterSuffix Additional global parameter name suffix if
* there are multiple SimpleEditStep instances in
* an authoring kit.
*/
public SimpleEditStep(final ItemSelectionModel itemSelectionModel,
final AuthoringKitWizard authoringKitWizard,
final StringParameter selectedLanguageParam,
final String parameterSuffix) {
super();
Objects.requireNonNull(selectedLanguageParam);
this.authoringKitWizard = authoringKitWizard;
this.itemSelectionModel = itemSelectionModel;
this.selectedLanguageParameter = selectedLanguageParam;
streamlinedCreationParameter = new StringParameter(
authoringKitWizard.getContentType().getContentItemClass().getName()
+ "_properties_done" + parameterSuffix);
authoringKitWizard
.getList()
.addActionListener(event -> showDisplayPane(event.getPageState()));
additionalDisplayComponents
.stream()
.forEach(component -> {
component.setItemSelectionModel(itemSelectionModel);
addDisplayComponent(component);
});
}
/**
* Registers global state parameter for cancelling streamlined creation
*
* @param page
*/
@Override
public void register(final Page page) {
super.register(page);
page.addGlobalStateParam(streamlinedCreationParameter);
page.addRequestListener(this);
}
/**
* @return the parent wizard
*/
public AuthoringKitWizard getParentWizard() {
return authoringKitWizard;
}
/**
* @return The item selection model
*/
public ItemSelectionModel getItemSelectionModel() {
return itemSelectionModel;
}
/**
* Forward to the next step if the streamlined creation parameter is turned
* on _and_ the streamlined_creation global state parameter is set to
* 'active'
*
* @param state the PageState
*/
public void maybeForwardToNextStep(final PageState state) {
if (ContentItemPage.isStreamlinedCreationActive(state)
&& !STREAMLINED_DONE.equals(state.getValue(
streamlinedCreationParameter))) {
state.setValue(streamlinedCreationParameter, STREAMLINED_DONE);
fireCompletionEvent(state);
}
}
/**
* Cancel streamlined creation for this step if the streamlined creation
* parameter is turned on _and_ the streamlined_creation global state param
* is set to 'active'
*
* @param state the PageState
*/
public void cancelStreamlinedCreation(final PageState state) {
if (ContentItemPage.isStreamlinedCreationActive(state)) {
state.setValue(streamlinedCreationParameter, STREAMLINED_DONE);
}
}
public void setDefaultEditKey(final String key) {
defaultEditKey = key;
}
/**
* Open the edit component if the streamlined creation parameter is turned
* on _and_ the streamlined_creation global state param is set to 'active'
*
* @param e
*/
@Override
public void pageRequested(final RequestEvent e) {
PageState state = e.getPageState();
// XXX: This method is called on every page request for every authoring
// step in every authoring kit. This has in the past revealed a caching
// side-effect bug, but should in the main be harmless. Except of course
// for performance.
// Ideally this method would only be called for a single authoring step
// on each page load. However, at the stage that this is called,
// visibility has not been set, and getting the selected authoring kit
// or component is not straightforward, and would almost certainly
// involve duplicating code.
// This need to be rethought.
//if( !state.isVisibleOnPage( this ) ) return;
if (defaultEditKey != null && itemSelectionModel.getSelectedItem(state)
!= null) {
final ComponentAccess componentAccess = getAccessMap()
.get(defaultEditKey);
if (ContentItemPage.isStreamlinedCreationActive(state)
&& !STREAMLINED_DONE
.equals(state.getValue(streamlinedCreationParameter))
&& componentAccess != null
&& componentAccess.canAccess(state)) {
showComponent(state, defaultEditKey);
}
}
}
/**
* Public class which implements an AttributeFormatter interface for boolean
* values. Its format(...) class returns a string representation for either
* a false or a true value.
*/
protected static class LaunchDateAttributeFormatter
implements DomainObjectPropertySheet.AttributeFormatter {
/**
* Constructor, does nothing.
*/
public LaunchDateAttributeFormatter() {
}
/**
* Formatter for the value of a (LaunchDate) attribute.
*
* It currently relays on the prerequisite that the passed in property
* attribute is in fact a date property. No type checking yet!
*
* Note: the format method has to be executed at each page request. Take
* care to properly adjust globalisation and localisation here!
*
* @param object Object containing the attribute to format.
* @param attribute Name of the attribute to retrieve and format
* @param state PageState of the request
*
* @return A String representation of the retrieved boolean attribute of
* the domain object.
*/
@Override
public String format(final Object object,
final String attribute,
final PageState state) {
if (object != null && object instanceof ContentItem) {
final ContentItem page = (ContentItem) object;
final BeanInfo beanInfo;
try {
beanInfo = Introspector
.getBeanInfo(page.getClass());
} catch (IntrospectionException ex) {
throw new UnexpectedErrorException(ex);
}
final Optional<PropertyDescriptor> propertyDescriptor = Arrays
.stream(beanInfo.getPropertyDescriptors())
.filter(propDesc -> attribute.equals(propDesc.getName()))
.findAny();
if (propertyDescriptor.isPresent()) {
final Method readMethod = propertyDescriptor
.get()
.getReadMethod();
final Object value;
try {
value = readMethod.invoke(object);
} catch (IllegalAccessException | InvocationTargetException ex) {
throw new IllegalArgumentException(ex);
}
if (value == null) {
return (String) new GlobalizedMessage("cms.ui.unknown",
CmsConstants.CMS_BUNDLE)
.localize();
} else {
final GlobalizationHelper globalizationHelper = CdiUtil
.createCdiUtil()
.findBean(GlobalizationHelper.class);
// Note: No type safety here! We relay that it is
// attached to a date property!
return DateFormat.getDateInstance(
DateFormat.LONG,
globalizationHelper.getNegotiatedLocale())
.format(value);
}
} else {
return (String) new GlobalizedMessage("cms.ui.unknown",
CmsConstants.CMS_BUNDLE)
.localize();
}
} else {
return (String) new GlobalizedMessage("cms.ui.unknown",
CmsConstants.CMS_BUNDLE)
.localize();
}
}
}
}

View File

@ -1,221 +0,0 @@
/*
* Copyright (C) 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.authoring;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.PropertySheet;
import com.arsdigita.bebop.PropertySheetModel;
import com.arsdigita.bebop.PropertySheetModelBuilder;
import com.arsdigita.util.LockableImpl;
import com.arsdigita.toolbox.ui.DomainObjectPropertySheet;
import java.util.Iterator;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.ItemSelectionModel;
import org.libreccm.l10n.LocalizedString;
/**
* This extends DomainObjectPropertySheet and has a lot of duplicate code from
* it because it uses so many private inner classes
*
*/
public class TextBodyPropertySheet extends DomainObjectPropertySheet {
/**
* Construct a new TextAssetBodyPropertySheet
*
* @param objModel The selection model which feeds domain
* objects to this property sheet.
* @param selectedLanguageParam
*
*/
public TextBodyPropertySheet(
final ItemSelectionModel objModel,
final StringParameter selectedLanguageParam) {
super(objModel, false, selectedLanguageParam);
setModelBuilder(new TMBAdapter(new DomainObjectModelBuilder()));
getColumn(1).setCellRenderer(new TextAssetBodyLabelCellRenderer());
}
// Build up the object properties model from the iterator over all properties
private static class TextAssetBodyPropertiesModel
implements PropertySheetModel {
// public final static String MIME_TYPE_KEY
// = TextAssetBodyLabelCellRenderer.MIME_TYPE_KEY;
private static final String ERROR = "No current property. "
+ "Make sure that nextRow() was "
+ "called at least once.";
private LocalizedString textAsset;
private PageState pageState;
private Iterator<Property> properties;
private Property currentProperty;
public TextAssetBodyPropertiesModel(final LocalizedString textAsset,
final Iterator<Property> properties,
final PageState pageState) {
this.textAsset = textAsset;
this.properties = properties;
this.pageState = pageState;
currentProperty = null;
}
@Override
public boolean nextRow() {
if (properties.hasNext()) {
currentProperty = properties.next();
return true;
} else {
return false;
}
}
/**
* @deprecated use getGlobalizedLabel() instead
*/
@Override
@Deprecated
public String getLabel() {
return getGlobalizedLabel().getKey();
}
@Override
public GlobalizedMessage getGlobalizedLabel() {
if (currentProperty == null) {
throw new IllegalStateException(ERROR);
}
return currentProperty.getGlobalizedLabel();
}
@Override
public String getValue() {
return getObjectValue().toString();
}
public Object getObjectValue() {
if (currentProperty == null) {
throw new IllegalStateException(ERROR);
}
return textAsset;
}
public String getAttribute() {
return currentProperty.getAttribute();
}
}
// Builds an TextAssetBodyPropertiesModel
private static class DomainObjectModelBuilder extends LockableImpl
implements PropertySheetModelBuilder {
@Override
public PropertySheetModel makeModel(final PropertySheet sheet,
final PageState state) {
TextBodyPropertySheet propSheet
= (TextBodyPropertySheet) sheet;
throw new UnsupportedOperationException("ToDo");
}
}
// These are both from PropertySheet
// Convert a PropertySheetModelBuilder to a TableModelBuilder
private static class TMBAdapter
extends LockableImpl implements TableModelBuilder {
private final PropertySheetModelBuilder modelBuilder;
public TMBAdapter(final PropertySheetModelBuilder builder) {
this.modelBuilder = builder;
}
@Override
public TableModel makeModel(final Table table,
final PageState state) {
return new TableModelAdapter(
(TextAssetBodyPropertiesModel) modelBuilder.makeModel(
(PropertySheet) table, state));
}
@Override
public void lock() {
modelBuilder.lock();
super.lock();
}
}
// Wraps a PropertySheetModel
private static class TableModelAdapter implements TableModel {
private final TextAssetBodyPropertiesModel propertiesModel;
private int row;
public TableModelAdapter(
final TextAssetBodyPropertiesModel propertiesModel) {
this.propertiesModel = propertiesModel;
row = -1;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public boolean nextRow() {
row++;
return propertiesModel.nextRow();
}
@Override
public Object getElementAt(final int columnIndex) {
if (columnIndex == 0) {
return propertiesModel.getGlobalizedLabel();
} else {
return propertiesModel.getObjectValue();
}
}
@Override
public Object getKeyAt(final int columnIndex) {
return propertiesModel.getAttribute();
}
public PropertySheetModel getPSModel() {
return propertiesModel;
}
}
}

View File

@ -1,29 +0,0 @@
/*
* Copyright (C) 2016 LibreCCM Foundation.
*
* 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., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package com.arsdigita.cms.ui.item;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class ItemCreateForm {
//Placeholder
}

View File

@ -18,11 +18,9 @@
*/ */
package com.arsdigita.cms.ui.search; package com.arsdigita.cms.ui.search;
import com.arsdigita.bebop.form.Submit;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import com.arsdigita.cms.ui.ContentSectionPage;
import com.arsdigita.search.ui.BaseQueryComponent; import com.arsdigita.search.ui.BaseQueryComponent;
/** /**
@ -48,92 +46,4 @@ public class ItemQueryComponent extends BaseQueryComponent {
final ContentType type) { final ContentType type) {
this.context = context; this.context = context;
//ToDo
// add(new PermissionFilterComponent(
// SecurityManager.CMS_PREVIEW_ITEM));
//
// add(new SimpleCategoryFilterWidget() {
//
// @Override
// protected Category[] getRoots(PageState state) {
// Category[] roots;
// if (limitToContentSection == true && CMS.getContext().
// hasContentSection()) {
// ContentSection section = CMS.getContext().
// getContentSection();
// roots = new Category[]{section.getRootCategory()};
// } else {
// ContentSectionCollection sections =
// ContentSection.getAllSections();
// List cats = new ArrayList();
// while (sections.next()) {
// ContentSection section =
// sections.getContentSection();
// cats.add(section.getRootCategory());
// }
// roots =
// (Category[]) cats.toArray(new Category[cats.size()]);
// }
// return roots;
// }
// });
//
// if (type == null) {
// add(new ContentTypeFilterWidget() {
//
// @Override
// protected ContentSection getContentSection() {
// if (limitToContentSection == true && CMS.getContext().
// hasContentSection()) {
// return CMS.getContext().getContentSection();
// } else {
// return super.getContentSection();
// }
// }
// });
// } else {
// add(new ContentTypeFilterWidget(type) {
//
// @Override
// protected ContentSection getContentSection() {
// if (limitToContentSection == true && CMS.getContext().
// hasContentSection()) {
// return CMS.getContext().getContentSection();
// } else {
// return super.getContentSection();
// }
// }
// });
// }
//
// add(new VersionFilterComponent(context));
// if (limitToContentSection == true) {
// add(new ContentSectionFilterComponent());
// }
// add(new DateRangeFilterWidget(new LastModifiedDateFilterType(),
// LastModifiedDateFilterType.KEY));
// add(new DateRangeFilterWidget(new CreationDateFilterType(),
// CreationDateFilterType.KEY));
// add(new PartyFilterWidget(new CreationUserFilterType(),
// CreationUserFilterType.KEY));
// add(new PartyFilterWidget(new LastModifiedUserFilterType(),
// LastModifiedUserFilterType.KEY));
// Submit submit = new Submit(context + "_search",
// ContentSectionPage.globalize("cms.ui.search"));
// add(submit);
}
// private class LaunchDateFilterWidget extends DateRangeFilterWidget {
//
// public LaunchDateFilterWidget(FilterType type, String name) {
// super(type, name);
//
// }
//
// @Override
// public boolean isVisible(PageState state) {
// return !ContentSection.getConfig().getHideLaunchDate()
// && super.isVisible(state);
// }
// }
} }

View File

@ -21,7 +21,6 @@ package org.librecms.contentsection;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.cms.dispatcher.CMSPage; import com.arsdigita.cms.dispatcher.CMSPage;
import com.arsdigita.cms.dispatcher.ContentItemDispatcher; import com.arsdigita.cms.dispatcher.ContentItemDispatcher;
import com.arsdigita.cms.ui.CMSApplicationPage;
import com.arsdigita.dispatcher.AccessDeniedException; import com.arsdigita.dispatcher.AccessDeniedException;
import com.arsdigita.dispatcher.DispatcherHelper; import com.arsdigita.dispatcher.DispatcherHelper;
import com.arsdigita.dispatcher.RequestContext; import com.arsdigita.dispatcher.RequestContext;
@ -291,16 +290,7 @@ public class ContentSectionServlet extends BaseApplicationServlet {
// final RequestContext ctx = DispatcherHelper.getRequestContext(); // final RequestContext ctx = DispatcherHelper.getRequestContext();
cmsPage.init(); cmsPage.init();
cmsPage.dispatch(request, response, ctx); cmsPage.dispatch(request, response, ctx);
} else { }
final CMSApplicationPage cmsAppPage = (CMSApplicationPage) page;
cmsAppPage.init(request, response, app);
// Serve the page.
final Document doc = cmsAppPage.buildDocument(request, response);
final PresentationManager pm = Templating
.getPresentationManager();
pm.servePage(doc, request, response);
}
/* SECONDLY try if we have to serve an item (old style dispatcher based */ /* SECONDLY try if we have to serve an item (old style dispatcher based */
} else if (item != null) { } else if (item != null) {