Removed depcreated package com.arsdigita.cms.ui.contentcenter

pull/28/head
Jens Pelzetter 2022-03-19 13:19:41 +01:00
parent f0069cba93
commit c9eb1bb20b
11 changed files with 0 additions and 2792 deletions

View File

@ -34,7 +34,6 @@ import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
import com.arsdigita.cms.dispatcher.CMSPage;
import com.arsdigita.cms.ui.workflow.WorkflowAdminPane;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.Assert;
@ -125,8 +124,6 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
private ItemSearch m_searchPane;
private WorkflowAdminPane m_workflowPane;
/**
* Creates the content section index page containing - a Navigaton bar for
* the various tasks (items, search, images, ....) - a breadcrumb - ....
@ -142,7 +139,6 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
// Initialize the individual panes
m_browsePane = getBrowsePane();
m_searchPane = getSearchPane();
m_workflowPane = getWorkflowAdminPane();
// The panes
m_tabbedPane = createTabbedPane();
@ -167,11 +163,6 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
.createCdiUtil().findBean(PermissionChecker.class);
if (CMSConfig.getConfig().isHideAdminTabs()) {
m_tabbedPane.setTabVisible(
state,
m_workflowPane,
permissionChecker.isPermitted(
AdminPrivileges.ADMINISTER_WORKFLOWS));
}
}
@ -208,17 +199,6 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
return m_searchPane;
}
/**
* Creates, and then caches, the workflow administration pane. Overriding
* this method to return null will prevent this tab from appearing.
*/
protected WorkflowAdminPane getWorkflowAdminPane() {
if (m_workflowPane == null) {
m_workflowPane = new WorkflowAdminPane();
}
return m_workflowPane;
}
/**
* Adds the specified component, with the specified tab name, to the tabbed
* pane only if it is not null.
@ -262,7 +242,6 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
tab(pane, "cms.ui.browse", getBrowsePane());
tab(pane, "cms.ui.search", getSearchPane());
tab(pane, "cms.ui.workflows", getWorkflowAdminPane());
return pane;
}
@ -293,15 +272,6 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
final PageState state = event.getPageState();
final Component pane = m_tabbedPane.getCurrentPane(state);
//ToDo NG if (pane == m_searchPane) {
// m_searchPane.reset(state);
// } else if (pane == m_imagesPane) {
// m_imagesPane.reset(state);
// } else
if (pane == m_workflowPane) {
m_workflowPane.reset(state);
}
}
/**

View File

@ -1,637 +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.contentcenter;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Embedded;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.cms.PageLocations;
import com.arsdigita.cms.ui.CMSContainer;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl;
import org.libreccm.categorization.Category;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionRepository;
import org.librecms.contentsection.privileges.ItemPrivileges;
import java.util.List;
import java.util.stream.Collectors;
/**
* Displays all the content sections in table, with links to the admin (and in
* legacy mode to legacy public pages as well). Also displays a form for each
* content section to create an object of a given type (configurable). The list
* of available types retrieved for each content section.
*
* <p>
* This class is a container for two other components: a form and a table. The
* form represents the drop down list of the content types available in a
* particular content section. It is an extension of the
* {@link com.arsdigita.cms.ui.authoring.NewItemForm}. The table displays each
* content section in one row, along with the specified form. The same form is
* reused in every row of the table.
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
* @version $Id: ContentSectionContainer.java 287 2005-02-22 00:29:02Z sskracic$
*/
public class ContentSectionContainer extends CMSContainer {
private static final String CONTENT_SECTION_CLASS = "contentSections";
private final ContentSectionTable m_table;
private final FormContainer m_formContainer;
private final SingleSelectionModel m_typeSel;
private final SingleSelectionModel m_sectionSel;
/**
* Constructs a new ContentSectionContainer which containts:
*
* <ul>
* <li> SimpleContainer (to contain the form)
* <ul>
* <li> Form (for creating a new content item in each section)
* </ul>
* <li> Table (Displays all content sections)
* </ul>
*
* @param typeSel passthrough to {@link NewItemForm}
* @param sectionSel passthrough to {@link NewItemForm}
*/
public ContentSectionContainer(SingleSelectionModel typeSel,
SingleSelectionModel sectionSel) {
super();
setClassAttr(CONTENT_SECTION_CLASS);
m_typeSel = typeSel;
m_sectionSel = sectionSel;
m_formContainer = new FormContainer();
add(m_formContainer);
m_table = new ContentSectionTable();
add(m_table);
}
/**
*
* @param p
*/
@Override
public void register(Page p) {
super.register(p);
p.setVisibleDefault(m_formContainer, false);
}
/**
*
*/
private class FormContainer extends CMSContainer {
// private final StaticNewItemForm m_form;
private final BigDecimalParameter m_sectionIdParam;
/**
* Constructor
*/
private FormContainer() {
super();
m_sectionIdParam = new BigDecimalParameter("sectionId");
// m_form = new StaticNewItemForm(m_sectionIdParam);
// m_form.addSubmissionListener(new FormSubmissionListener() {
//
// /**
// * Cancels the form if the user lacks the "create new items"
// * privilege.
// */
// @Override
// public void submitted(FormSectionEvent event)
// throws FormProcessException {
// PageState state = event.getPageState();
// StaticNewItemForm form = (StaticNewItemForm) event
// .getSource();
//
// ContentSection section = form.getContentSection(state);
// final PermissionChecker permissionChecker = CdiUtil
// .createCdiUtil().findBean(PermissionChecker.class);
// Category folder = null;
// //ToDo
//// User user = Web.getWebContext().getUser();
//// if (user != null) {
//// folder = Folder.getUserHomeFolder(user, section);
//// }
//// if (folder == null) {
//// folder = section.getRootFolder();
//// }
////ToDo End
// folder = section.getRootDocumentsFolder();
//
// if (!permissionChecker.isPermitted(
// ItemPrivileges.CREATE_NEW, folder)) {
// throw new FormProcessException(
// (GlobalizationUtil.globalize(
// "cms.ui.insufficient_privileges")));
// }
// }
//
// });
//
// m_form.addProcessListener(new FormProcessListener() {
//
// /**
// * Process listener: redirects to the authoring kit to create a
// * new item.
// */
// @Override
// public void process(FormSectionEvent e) throws
// FormProcessException {
// StaticNewItemForm form = (StaticNewItemForm) e.getSource();
// PageState state = e.getPageState();
//
// BigDecimal typeId = form.getTypeID(state);
// if (typeId != null) {
// Long sectionId = form.getContentSectionID(state);
// m_sectionSel.setSelectedKey(state, sectionId);
// m_typeSel.setSelectedKey(state, typeId);
// }
// }
//
// });
//
// add(m_form);
}
@Override
public void register(Page p) {
super.register(p);
p.addComponentStateParam(this, m_sectionIdParam);
}
// public StaticNewItemForm getNewItemForm() {
//// return m_form;
// }
}
// private static class StaticNewItemForm extends NewItemForm {
//
// private final Hidden m_sectionIDParamWidget;
//
// public StaticNewItemForm(BigDecimalParameter sectionParam) {
// super("StaticNewItemForm", BoxPanel.VERTICAL);
// setClassAttr("static-new-item-form");
// m_sectionIDParamWidget = new Hidden(sectionParam);
// add(m_sectionIDParamWidget);
// setProcessInvisible(true);
// }
//
// /**
// * Sets the id of the content section in this form. This ID is used to
// * generate a list of available content types in the section.
// *
// * @param state The current page state.
// * @param id The id of the ContentSection for which this form should
// * display a list of content types
// *
// * @pre ( state != null && id != null )
// */
// public void setSectionId(PageState state, BigDecimal id) {
// Assert.exists(id);
// m_sectionIDParamWidget.setValue(state, id);
// }
//
// /**
// * Retrieves the content section for this form given the specified page
// * state. This method will return null if there is no content section.
// *
// * @param state The current page state.
// *
// * @return The current content section or null if the section does not
// * exist
// *
// * @pre ( state != null )
// */
// @Override
// public ContentSection getContentSection(PageState state) {
// Long id = getContentSectionID(state);
// Assert.exists(id);
// ContentSection section;
// section = CdiUtil.createCdiUtil().findBean(
// ContentSectionRepository.class).findById(id);
// return section;
// }
//
// /**
// * Retrieves the ID of the content section for this form given the
// * specified page state. This method will return null if no content
// * section id has been set.
// *
// * @param state The current page state.
// *
// * @return The id of the content section or null if it has not been set.
// *
// * @pre ( state != null )
// */
// private Long getContentSectionID(PageState state) {
// return (Long) Long.parseLong((String) m_sectionIDParamWidget
// .getValue(state));
// }
//
// }
/**
* A table that displays all content sections, with links to their locations
* and admin pages and a {@link NewItemForm} next to each section.
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
* @version $Revision$ $DateTime: 2004/08/17 23:15:09 $
*
*/
private class ContentSectionTable extends Table {
// We will use a (symboloc) headerKey to match columns. Because the
// number of columns depends on configuration for the llocation column,
// the index varies and con not be used.
private static final String COLUMN_SECTION = "Section";
private static final String COLUMN_LOCATION = "Public Site";
private static final String COLUMN_ACTION = "Action";
/**
* Constructs a new ContentSectionTable, using a default table model
* builder.
*/
private ContentSectionTable() {
super();
// we must use symbolic keys (instead of symbolic column index as
// usual) to identify a column because their number is dynamic
// depending on configuration of the location column!
Integer colNo = 0;
Label emptyView = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.section", CmsConstants.CMS_BUNDLE));
emptyView.setFontWeight(Label.ITALIC);
setEmptyView(emptyView);
setClassAttr("dataTable");
// add columns to the table
TableColumnModel columnModel = getColumnModel();
// prepare column headers
Label sectionHead = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.section", CmsConstants.CMS_BUNDLE));
sectionHead.setHint(new GlobalizedMessage(
"cms.ui.contentcenter.section_hint", CmsConstants.CMS_BUNDLE));
Label locationHead = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.location", CmsConstants.CMS_BUNDLE));
locationHead.setHint(new GlobalizedMessage(
"cms.ui.contentcenter.location_hint", CmsConstants.CMS_BUNDLE));
Label actionHead = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.action", CmsConstants.CMS_BUNDLE));
actionHead.setHint(new GlobalizedMessage(
"cms.ui.contentcenter.action_hint", CmsConstants.CMS_BUNDLE));
//TableColumn contentSectionColumn = new TableColumn(colNo, COLUMN_SECTION);
TableColumn contentSectionColumn = new TableColumn(
colNo,
sectionHead,
COLUMN_SECTION);
contentSectionColumn
.setCellRenderer(new AdminURLTableCellRenderer());
columnModel.add(contentSectionColumn);
TableColumn actionColumn = new TableColumn(
colNo++,
actionHead,
COLUMN_ACTION);
actionColumn.setCellRenderer(new ActionTableCellRenderer());
columnModel.add(actionColumn);
setModelBuilder(new ContentSectionTableModelBuilder());
}
/**
* An ContentSections table model builder
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
*
*/
private class ContentSectionTableModelBuilder extends LockableImpl
implements TableModelBuilder {
@Override
public TableModel makeModel(Table table, PageState state) {
table.getRowSelectionModel().clearSelection(state);
return new ContentSectionTableModel((ContentSectionTable) table,
state);
}
}
/**
* An ContentSections table model
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
*
*/
private class ContentSectionTableModel implements TableModel {
private final ContentSectionTable m_table;
private final TableColumnModel m_columnModel;
private final PageState m_state;
private final List<ContentSection> m_contentSections;
private ContentSection m_section;
private int index = -1;
private ContentSectionTableModel(ContentSectionTable table,
PageState state) {
m_table = table;
m_columnModel = table.getColumnModel();
m_state = state;
// retrieve all Content Sections
m_contentSections = getContentSectionCollection();
}
/**
* Returns a collection of ContentSections to display in this table.
* This implementation orders the content sections by
* <code>lower(label)</code>. They are also already filtered for the
* sections to which the current user has no access.
*
*/
private List<ContentSection> getContentSectionCollection() {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class);
final List<ContentSection> allSections = cdiUtil.findBean(
ContentSectionRepository.class).findAll();
return allSections
.stream()
.filter(section -> permissionChecker
.isPermitted(ItemPrivileges.VIEW_PUBLISHED,
section))
.collect(Collectors.toList());
}
@Override
public int getColumnCount() {
return m_columnModel.size();
}
@Override
public boolean nextRow() {
index++;
if (index < m_contentSections.size()) {
m_section = m_contentSections.get(index);
return true;
} else {
return false;
}
}
/**
* By default, we return null. For the section, location, and action
* columns, we return the current Content Section if there is one.
*
* @param columnIndex The index of the current column
*/
@Override
public Object getElementAt(int columnIndex) {
if (m_columnModel == null || m_section == null) {
return null;
}
TableColumn tc = m_columnModel.get(columnIndex);
String columnKey = (String) tc.getHeaderKey();
Object result = m_section;
if (columnKey.equals(COLUMN_SECTION)
|| columnKey.equals(COLUMN_LOCATION)
|| columnKey.equals(
COLUMN_ACTION)) {
result = m_section;
}
return result;
}
@Override
public Object getKeyAt(int columnIndex) {
return m_section.getObjectId();
}
/**
* Returns the table associated with this table model.
*
*/
protected Table getTable() {
return m_table;
}
/**
* Returns the current page state
*
*/
protected PageState getPageState() {
return m_state;
}
}
/**
* Sets the hidden parameter in the form containers form to the id of
* the current section. Then returns the form for display, but only if
* the user has permission to create new items in the current section.
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
*
*/
private class ActionTableCellRenderer implements TableCellRenderer {
@Override
public Component getComponent(Table table, PageState state,
Object value,
boolean isSelected, Object key,
int row, int column) {
ContentSection section = (ContentSection) value;
Category folder = null;
//ToDo
// User user = Web.getWebContext().getUser();
// if (user != null) {
// folder = Folder.getUserHomeFolder(user, section);
// }
// if (folder == null) {
// folder = section.getRootFolder();
// }
folder = section.getRootDocumentsFolder();
// If the user has no access, return an empty Label
//
// SecurityManager sm = new SecurityManager(section);
//
// if (!sm.canAccess(state.getRequest(), SecurityManager.NEW_ITEM,
// folder)
// || !ContentSection.getConfig()
// .getAllowContentCreateInSectionListing()) {
// // return null; // produces NPE here but works somewhere else.
// // It's a kind of a hack. Label is supposed not to accept
// // not-gloabalized data. Usually aou will return null here
// // and xmlgenerator takes care of it. Doesn't work here.
// return new Embedded(
// "&nbsp;&nbsp;&nbsp;-&nbsp;-&nbsp;&nbsp;&nbsp;");
// } else {
// // set the value of the sectionIdParameter in the form
// // to this section
// m_formContainer.getNewItemForm().setSectionId(state, section
// .getID());
// return m_formContainer.getNewItemForm();
// }
//ToDo End
return new Embedded(
"&nbsp;&nbsp;&nbsp;-&nbsp;-&nbsp;&nbsp;&nbsp;");
}
}
}
/**
* Generates the correct URL to the public pages for a content section.
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
*
*/
public static class URLTableCellRenderer implements TableCellRenderer {
/**
* The object passed in is the current content section. This returns a
* Link whose name and target are the url to the public pages.
*
* @return Link whose name and target are the url to the public pages of
* the current (passed in) content section or a Label if current
* use does not habe acces priviledge for the content section
*/
@Override
public Component getComponent(Table table,
PageState state,
Object value,
boolean isSelected,
Object key,
int row,
int column) {
/* cast to ContentSection for further processing */
ContentSection section = (ContentSection) value;
String name = section.getLabel();
String path = section.getPrimaryUrl(); // from Application
// If the user has no access, return a Label instead of a Link
// Kind of a hack because Label is supposed not to accept
// "un-globalized" display data. Label had been abused here to
// to display a DataValue
return new Embedded("/" + name + "/", false);
// return null; // produces NPE here
}
}
/**
* Generates the correct URL to the admin pages for a content section.
*
* @author <a href="mailto:mbryzek@arsdigita.com">Michael Bryzek</a>
*
*/
public static class AdminURLTableCellRenderer extends URLTableCellRenderer {
/**
* The object passed in is the current content section
*
* @param table
* @param state
* @param row
* @param value
* @param column
* @param isSelected
* @param key
*
* @return
*
*/
@Override
public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key,
int row, int column) {
ContentSection section = (ContentSection) value;
final PermissionChecker permissionChecker = CdiUtil.createCdiUtil()
.findBean(PermissionChecker.class);
// If the user has no access, return a Label instead of a Link
if (permissionChecker.isPermitted(
ItemPrivileges.EDIT,
section.getRootDocumentsFolder())) {
return new Link(section.getLabel(),
generateURL(section.getPrimaryUrl()));
} else {
//return new Label(section.getName(), false);
// return null; // Produces a NPE although it shouldn't and
// indeed doesn't elsewhere
// Kind of a hack because Label is supposed not to accept
// "un-globalized" display data. Label had been abused here to
// to display a DataValue
return new Embedded(section.getLabel(), false);
}
}
/**
* Generates the admin url for the specified prefix. Always returns
* something that does not start with a forward slash.
*
* @param prefix The prefix of the URL
*
* @return
*/
protected String generateURL(String prefix) {
return prefix + PageLocations.SECTION_PAGE;
}
}
}

View File

@ -1,260 +0,0 @@
/*
*
* 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.contentcenter;
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.parameters.LongParameter;
import com.arsdigita.cms.ui.CMSApplicationPage;
import com.arsdigita.cms.ui.GlobalNavigation;
import com.arsdigita.cms.ui.WorkspaceContextBar;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.ui.CcmObjectSelectionModel;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentType;
// ////////////////////////////////////////////////////////////////////////////
//
// Developer's Note:
// Replaces the (old) Dispatcher based Code cms.ui.CMSPageWorkspacePage
// Note should be removed as soon as the migration process is competed (in-
// cluding content section pages).
//
// ////////////////////////////////////////////////////////////////////////////
/**
* <p>
* The Content Center main page. </p>
*
* The page contains the general header and footer, the breadcrumb, and the
* complete content page including the tab bar, the sections/tasks page, the
* search page, and the listener to switch between the tabs.
*
* @author Jack Chung (flattop@arsdigita.com)
* @author Michael Pih (pihman@arsdigita.com)
* @author Peter Boy (pboy@barkhof.uni-bremen.de)
*/
public class MainPage extends CMSApplicationPage implements ActionListener {
private final static String XSL_CLASS = "CMS Admin";
public static final String CONTENT_TYPE = "type_id";
public static final String CONTENT_SECTION = "section_id";
private final CcmObjectSelectionModel<ContentType> typeSelection;
private final CcmObjectSelectionModel<ContentSection> sectionSelection;
private final TabbedPane tabbedPane;
private TasksPane tasksPanel;
// private ItemSearch m_search;
// private IdSearchTab m_IdSearch;
/**
* Construct a new MainPage.
*
* Creates the complete page ready to be included in the page cache of
* ContentCenterServlet.
*/
public MainPage() {
super(new Label(new GlobalizedMessage("cms.ui.content_center",
CmsConstants.CMS_BUNDLE)),
new SimpleContainer());
/* Set the class attribute value (down in SimpleComponent). */
super.setClassAttr("cms-admin");
final LongParameter typeId = new LongParameter(CONTENT_TYPE);
super.addGlobalStateParam(typeId);
typeSelection = new CcmObjectSelectionModel<>(ContentType.class, typeId);
final LongParameter sectionId = new LongParameter(CONTENT_SECTION);
super.addGlobalStateParam(sectionId);
sectionSelection = new CcmObjectSelectionModel<>(ContentSection.class,
sectionId
);
super.add(new WorkspaceContextBar());
super.add(new GlobalNavigation());
tasksPanel = getTasksPane(typeSelection, sectionSelection);
// m_search = getSearchPane();
// m_IdSearch = getIdSearchPane();
tabbedPane = createTabbedPane();
tabbedPane.setIdAttr("page-body");
super.add(tabbedPane);
// add(new DebugPanel());
}
/**
* Creates, and then caches, the Tasks pane. Overriding this method to
* return null will prevent this tab from appearing.
*
* @param typeModel
* @param sectionModel
*
* @return
*/
protected TasksPane getTasksPane(
final CcmObjectSelectionModel<ContentType> typeModel,
final CcmObjectSelectionModel<ContentSection> sectionModel) {
if (tasksPanel == null) {
tasksPanel = new TasksPane(typeModel, sectionModel);
}
return tasksPanel;
}
// /**
// * Creates, and then caches, the Search pane. Overriding this method to
// * return null will prevent this tab from appearing.
// *
// */
// protected ItemSearch getSearchPane() {
// if (m_search == null) {
// m_search = new ItemSearch(ContentItem.DRAFT);
// }
//
// return m_search;
// }
//
// protected IdSearchTab getIdSearchPane() {
// if (m_IdSearch == null) {
// m_IdSearch = new IdSearchTab("idsearch");
// }
//
// return m_IdSearch;
// }
/**
* Created the TabbedPane to use for this page. Sets the class attribute for
* this tabbed pane. The default implementation uses a
* {@link com.arsdigita.bebop.TabbedPane} and sets the class attribute to
* "CMS Admin." This implementation also adds tasks, content sections, and
* search panes.
*
* Developers can override this method to add only the tabs they want, or to
* add additional tabs after the default CMS tabs are added.
*
* @return
*/
protected TabbedPane createTabbedPane() {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil
.findBean(PermissionChecker.class);
final TabbedPane pane = new TabbedPane();
pane.setClassAttr(XSL_CLASS);
Label taskLabel = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.mainpage.taskssections",
CmsConstants.CMS_BUNDLE));
Label pagesLabel = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.mainpage.pages",
CmsConstants.CMS_BUNDLE));
Label searchLabel = new Label(new GlobalizedMessage(
"cms.ui.contentcenter.mainpage.search", CmsConstants.CMS_BUNDLE));
Label IdsearchLabel = new Label("ID Search");
addToPane(pane,
taskLabel,
getTasksPane(typeSelection, sectionSelection));
// if (permissionChecker.isPermitted(PagesPrivileges.ADMINISTER_PAGES)) {
addToPane(pane,
pagesLabel,
new PagesPane());
// }
// addToPane(tabbedPane,
// new Label(new GlobalizedMessage(
// "cms.ui.contentcenter.mainpage.search",
// CmsConstants.CMS_BUNDLE)),
// getSearchPane());
// addToPane(tabbedPane,
// IdsearchLabel,
// getIdSearchPane());
pane.addActionListener(this);
return pane;
}
// /**
// * 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
// * @deprecated refactor to use addToPane(Label, Component) instead to
// * enable localized tab strips.
// */
// protected void addToPane(TabbedPane pane, String tabName, Component comp) {
// if (comp != null) {
// pane.addTab(tabName, comp);
// }
// }
/**
* Adds the specified component, with the specified Label as 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 component The component to add to the pane
*/
protected void addToPane(final TabbedPane pane,
final Label tabName,
final Component component) {
if (component != null) {
pane.addTab(tabName, component);
}
}
/**
* 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 = tabbedPane.getCurrentPane(state);
if (pane == tasksPanel) {
tasksPanel.reset(state);
}
// else if (pane == m_search) {
// m_search.reset(state);
// } else if (pane == m_IdSearch) {
// m_IdSearch.reset(state);
// }
}
}

View File

@ -1,279 +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.contentcenter;
import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.PrintEvent;
import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.globalization.GlobalizedMessage;
import org.libreccm.categorization.Domain;
import org.libreccm.categorization.DomainRepository;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.sites.Site;
import org.libreccm.sites.SiteRepository;
import org.librecms.CmsConstants;
import org.librecms.pages.Pages;
import org.librecms.pages.PagesRepository;
import java.util.List;
import java.util.TooManyListenersException;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class PagesForm extends Form {
private final static String PRIMARY_URL_FIELD = "primaryUrl";
private final static String SITE_SELECT = "site";
private final static String CATEGORY_DOMAIN_SELECT = "categoryDomain";
private final PagesPane pagesPane;
private final ParameterSingleSelectionModel<String> selectedPages;
private final TextField primaryUrlField;
private final SingleSelect siteSelect;
private final SingleSelect categoryDomainSelect;
private final SaveCancelSection saveCancelSection;
PagesForm(final PagesPane pagesPane,
final ParameterSingleSelectionModel<String> selectedPages) {
super("pagesForm");
this.pagesPane = pagesPane;
this.selectedPages = selectedPages;
primaryUrlField = new TextField(PRIMARY_URL_FIELD);
primaryUrlField.setLabel(new GlobalizedMessage(
"cms.ui.pages.form.primary_url_field.label",
CmsConstants.CMS_BUNDLE));
super.add(primaryUrlField);
siteSelect = new SingleSelect(SITE_SELECT);
try {
siteSelect.addPrintListener(this::populateSiteSelect);
} catch (TooManyListenersException ex) {
throw new UnexpectedErrorException(ex);
}
siteSelect.setLabel(new GlobalizedMessage(
"cms.ui.pages.form.site_select.label",
CmsConstants.CMS_BUNDLE));
super.add(siteSelect);
categoryDomainSelect = new SingleSelect(CATEGORY_DOMAIN_SELECT);
try {
categoryDomainSelect
.addPrintListener(this::populateCategoryDomainSelect);
} catch (TooManyListenersException ex) {
throw new UnexpectedErrorException(ex);
}
categoryDomainSelect.setLabel(new GlobalizedMessage(
"cms.ui.pages.form.category_domain_select.label",
CmsConstants.CMS_BUNDLE));
super.add(categoryDomainSelect);
saveCancelSection = new SaveCancelSection();
super.add(saveCancelSection);
super.addInitListener(this::init);
super.addValidationListener(this::validate);
super.addProcessListener(this::process);
}
private void populateSiteSelect(final PrintEvent event) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final SiteRepository siteRepository = cdiUtil
.findBean(SiteRepository.class);
final List<Site> sites = siteRepository.findAll();
final SingleSelect target = (SingleSelect) event.getTarget();
target.clearOptions();
for (final Site site : sites) {
final Text label;
if (site.isDefaultSite()) {
label = new Text(String.format("%s *", site.getDomainOfSite()));
} else {
label = new Text(site.getDomainOfSite());
}
target.addOption(new Option(Long.toString(site.getObjectId()),
label));
}
if (selectedPages.getSelectedKey(event.getPageState()) != null) {
target.setDisabled();
}
}
private void populateCategoryDomainSelect(final PrintEvent event) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final DomainRepository domainRepo = cdiUtil
.findBean(DomainRepository.class);
final List<Domain> categoryDomains = domainRepo.findAll();
final SingleSelect target = (SingleSelect) event.getTarget();
target.clearOptions();
for (final Domain domain : categoryDomains) {
target.addOption(new Option(Long.toString(domain.getObjectId()),
new Text(domain.getDomainKey())));
}
if (selectedPages.getSelectedKey(event.getPageState()) != null) {
target.setDisabled();
}
}
private void init(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
if (selectedPages.getSelectedKey(state) != null) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PagesRepository pagesRepo = cdiUtil
.findBean(PagesRepository.class);
final Pages pages = pagesRepo
.findById(Long.parseLong(selectedPages.getSelectedKey(state)))
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No Pages with ID %s in the database.",
selectedPages.getSelectedKey(state))));
primaryUrlField.setValue(state, pages.getPrimaryUrl());
siteSelect.setValue(state,
Long.toString(pages.getSite().getObjectId()));
categoryDomainSelect
.setValue(state,
Long.toString(pages.getCategoryDomain().getObjectId()));
}
}
private void validate(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
if (saveCancelSection.getSaveButton().isSelected(state)) {
final FormData data = event.getFormData();
final String primaryUrl = data.getString(PRIMARY_URL_FIELD);
if (primaryUrl == null
|| primaryUrl.isEmpty()
|| primaryUrl.matches("\\s*")) {
data.addError(PRIMARY_URL_FIELD,
new GlobalizedMessage(
"cms.ui.pages.form.primary_url_field.error",
CmsConstants.CMS_BUNDLE));
}
final String selectedSite = data.getString(SITE_SELECT);
if (selectedSite == null
|| selectedSite.isEmpty()) {
data.addError(PRIMARY_URL_FIELD,
new GlobalizedMessage(
"cms.ui.pages.form.site_select.error",
CmsConstants.CMS_BUNDLE));
}
final String selectedDomain = data.getString(CATEGORY_DOMAIN_SELECT);
if (selectedDomain == null
|| selectedDomain.isEmpty()) {
data.addError(PRIMARY_URL_FIELD,
new GlobalizedMessage(
"cms.ui.pages.form.category_domain_select.error",
CmsConstants.CMS_BUNDLE));
}
}
}
private void process(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
if (saveCancelSection.getSaveButton().isSelected(state)) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PagesPaneController controller = cdiUtil
.findBean(PagesPaneController.class);
final FormData data = event.getFormData();
final String primaryUrl;
if (data.getString(PRIMARY_URL_FIELD).startsWith("/")
&& data.getString(PRIMARY_URL_FIELD).endsWith("/")) {
primaryUrl = data.getString(PRIMARY_URL_FIELD);
} else if(data.getString(PRIMARY_URL_FIELD).startsWith("/")) {
primaryUrl = String.format("%s/",
data.getString(PRIMARY_URL_FIELD));
} else if(data.getString(PRIMARY_URL_FIELD).endsWith("/")) {
primaryUrl = String.format("/%s",
data.getString(PRIMARY_URL_FIELD));
} else {
primaryUrl = String.format("/%s/",
data.getString(PRIMARY_URL_FIELD));
}
final String selectedSiteId = data.getString(SITE_SELECT);
final String selectedDomainId = data.getString(
CATEGORY_DOMAIN_SELECT);
if (selectedPages.getSelectedKey(state) == null) {
controller.createPages(primaryUrl,
Long.parseLong(selectedSiteId),
Long.parseLong(selectedDomainId));
} else {
controller
.updatePages(
Long.parseLong(selectedPages.getSelectedKey(state)),
primaryUrl);
}
}
pagesPane.showPagesTable(state);
}
}

View File

@ -1,398 +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.contentcenter;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.ParameterSingleSelectionModel;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.cms.ui.CMSContainer;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.security.PermissionChecker;
import org.librecms.CmsConstants;
import org.librecms.pages.Pages;
import org.librecms.pages.PagesPrivileges;
import org.librecms.pages.PagesRepository;
import java.util.Iterator;
import java.util.List;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class PagesPane extends CMSContainer {
private final ParameterSingleSelectionModel<String> selectedPages;
private final ActionLink addPagesLink;
private final PagesTable pagesTable;
private final PagesForm pagesForm;
PagesPane() {
super();
selectedPages = new ParameterSingleSelectionModel<>(
new StringParameter("selectedPages"));
addPagesLink = new ActionLink(new GlobalizedMessage(
"cms.ui.contentcenter.pages.add_link",
CmsConstants.CMS_BUNDLE));
addPagesLink.addActionListener(event -> {
showPagesForm(event.getPageState());
});
pagesTable = new PagesTable();
pagesForm = new PagesForm(this, selectedPages);
final BoxPanel panel = new BoxPanel(BoxPanel.VERTICAL);
panel.add(addPagesLink);
panel.add(pagesTable);
panel.add(pagesForm);
super.add(panel);
}
@Override
public void register(final Page page) {
super.register(page);
page.addGlobalStateParam(selectedPages.getStateParameter());
page.setVisibleDefault(addPagesLink, true);
page.setVisibleDefault(pagesTable, true);
page.setVisibleDefault(pagesForm, false);
}
protected void showPagesForm(final PageState state) {
addPagesLink.setVisible(state, false);
pagesTable.setVisible(state, false);
pagesForm.setVisible(state, true);
}
protected void showPagesTable(final PageState state) {
addPagesLink.setVisible(state, true);
pagesTable.setVisible(state, true);
pagesForm.setVisible(state, false);
selectedPages.clearSelection(state);
}
private class PagesTable extends Table {
public static final int COL_SITE = 0;
public static final int COL_PAGES_INSTANCE = 1;
public static final int COL_EDIT = 2;
public static final int COL_DELETE = 3;
public PagesTable() {
super();
final TableColumnModel columnModel = super.getColumnModel();
columnModel
.add(new TableColumn(
COL_SITE,
new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pagestable.columns.site.header",
CmsConstants.CMS_BUNDLE))));
columnModel
.add(new TableColumn(
COL_SITE,
new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pagestable.columns.pages_instance.header",
CmsConstants.CMS_BUNDLE))));
columnModel
.add(new TableColumn(
COL_EDIT,
new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pagestable.columns.edit.header",
CmsConstants.CMS_BUNDLE))));
columnModel
.add(new TableColumn(
COL_DELETE,
new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pagestable.columns.delete.header",
CmsConstants.CMS_BUNDLE))));
columnModel
.get(COL_SITE)
.setCellRenderer(new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
final PageState state,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final int column) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil
.findBean(PermissionChecker.class);
// return new ControlLink((String) value);
final Pages pages = (Pages) value;
if (permissionChecker.isPermitted(
PagesPrivileges.ADMINISTER_PAGES)) {
return new Link(pages.getSite().getDomainOfSite(),
pages.getPrimaryUrl());
} else {
return new Text(pages.getSite().getDomainOfSite());
}
}
});
columnModel
.get(COL_PAGES_INSTANCE)
.setCellRenderer(new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
final PageState state,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final int column) {
final Pages pages = (Pages) value;
return new Text(pages.getPrimaryUrl());
}
});
columnModel
.get(COL_EDIT)
.setCellRenderer(new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
final PageState state,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final int column) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil
.findBean(PermissionChecker.class);
if (permissionChecker.isPermitted(
PagesPrivileges.ADMINISTER_PAGES)) {
final ControlLink link = new ControlLink(
(Component) value);
return link;
} else {
return new Text("");
}
}
});
columnModel
.get(COL_DELETE)
.setCellRenderer(new TableCellRenderer() {
@Override
public Component getComponent(final Table table,
final PageState state,
final Object value,
final boolean isSelected,
final Object key,
final int row,
final int column) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil
.findBean(PermissionChecker.class);
if (permissionChecker.isPermitted(
PagesPrivileges.ADMINISTER_PAGES)) {
final ControlLink link = new ControlLink(
(Component) value);
link.setConfirmation(new GlobalizedMessage(
"cms.ui.contentcenter.pages.delete.confirm",
CmsConstants.CMS_BUNDLE));
return link;
} else {
return new Text("");
}
}
});
super.addTableActionListener(new TableActionListener() {
@Override
public void cellSelected(final TableActionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
final int column = event.getColumn();
final String key = (String) event.getRowKey();
switch (column) {
case COL_EDIT:
selectedPages.setSelectedKey(state, key);
showPagesForm(state);
break;
case COL_DELETE: {
deletePages(key);
break;
}
default:
throw new UnexpectedErrorException(
"Illegal column index.");
}
}
@Override
public void headSelected(final TableActionEvent event) {
//Nothing
}
});
super.setModelBuilder(new PagesTableModelBuilder());
super.setEmptyView(new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pages.none", CmsConstants.CMS_BUNDLE)));
}
}
private void deletePages(final String pagesId) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PagesRepository pagesRepo = cdiUtil
.findBean(PagesRepository.class);
final Pages pages = pagesRepo
.findById(Long.parseLong(pagesId))
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No Pages with ID %d in the database.",
pagesId)));
pagesRepo.delete(pages);
}
private class PagesTableModelBuilder
extends LockableImpl
implements TableModelBuilder {
@Override
public TableModel makeModel(final Table table, final PageState state) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PagesRepository pagesRepo = cdiUtil
.findBean(PagesRepository.class);
final List<Pages> pages = pagesRepo.findAll();
return new PagesTableModel(pages);
}
}
private class PagesTableModel implements TableModel {
private final Iterator<Pages> iterator;
private Pages current;
public PagesTableModel(final List<Pages> pages) {
iterator = pages.iterator();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public boolean nextRow() {
if (iterator.hasNext()) {
current = iterator.next();
return true;
} else {
return false;
}
}
@Override
public Object getElementAt(final int columnIndex) {
switch (columnIndex) {
case PagesTable.COL_SITE:
return current;
case PagesTable.COL_PAGES_INSTANCE:
return current;
case PagesTable.COL_EDIT:
return new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pages.edit.label",
CmsConstants.CMS_BUNDLE));
case PagesTable.COL_DELETE:
return new Label(new GlobalizedMessage(
"cms.ui.contentcenter.pages.delete.label",
CmsConstants.CMS_BUNDLE));
default:
throw new IllegalArgumentException("Illegal column index.");
}
}
@Override
public Object getKeyAt(final int columnIndex) {
return current.getObjectId();
}
}
}

View File

@ -1,95 +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.contentcenter;
import org.libreccm.categorization.Domain;
import org.libreccm.categorization.DomainRepository;
import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.sites.Site;
import org.libreccm.sites.SiteManager;
import org.libreccm.sites.SiteRepository;
import org.librecms.pages.Pages;
import org.librecms.pages.PagesManager;
import org.librecms.pages.PagesRepository;
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 PagesPaneController {
@Inject
private DomainRepository domainRepo;
@Inject
private PagesRepository pagesRepo;
@Inject
private PagesManager pagesManager;
@Inject
private SiteManager siteManager;
@Inject
private SiteRepository siteRepo;
@Transactional(Transactional.TxType.REQUIRED)
protected void createPages(final String primaryUrl,
final long siteId,
final long categoryDomainId) {
final Site site = siteRepo
.findById(siteId)
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No Site with ID %d in the database.",
siteId)));
final Domain domain = domainRepo
.findById(categoryDomainId)
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No (Category) Domain with ID %d in the database.",
categoryDomainId)));
final Pages pages = pagesManager.createPages(primaryUrl, site, domain);
pages.setPrimaryUrl(primaryUrl);
pagesRepo.save(pages);
}
@Transactional(Transactional.TxType.REQUIRED)
protected void updatePages(final long pagesId,
final String primaryUrl) {
final Pages pages = pagesRepo
.findById(pagesId)
.orElseThrow(() -> new UnexpectedErrorException(String
.format("No Pages with ID %d in the database.",
pagesId)));
pages.setPrimaryUrl(primaryUrl);
pagesRepo.save(pages);
}
}

View File

@ -1,762 +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.contentcenter;
import java.math.BigDecimal;
import javax.servlet.ServletException;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.PaginationModelBuilder;
import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.RequestLocal;
import com.arsdigita.bebop.SimpleComponent;
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.PrintEvent;
import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ui.CMSContainer;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.ui.CcmObjectSelectionModel;
import com.arsdigita.xml.Element;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentType;
public class TasksPane extends CMSContainer {
// The default number of rows to show
private static final int DEFAULT_MAX_ROWS = 15;
// Number of tasks to show
private final int m_maxRows;
private TaskList m_taskList;
// private ActionLink m_viewAllLink;
// private ActionLink m_viewShortLink;
private Paginator m_paginator;
private ActionLink m_viewLockLink;
private ActionLink m_viewUnlockLink;
private ActionLink m_viewAllLockLink;
private Label m_viewLockLabel;
private Label m_viewUnlockLabel;
private Label m_viewAllLockLabel;
private StringParameter m_sortDirectionParam;
private StringParameter m_sortTypeParam;
private StringParameter m_lockFilterParam;
// control link variable
private static final String TASK_PANEL_CLASS = "taskPanel";
private static final String TASK_ACTION = "taskAction";
private static final String SORT_DOWN = "sortActionUp";
private static final String SORT_UP = "sortActionDown";
private static final String LOCK_FILTER_TYPE = "lockFilterType";
private static final String SORT_TYPE = "sortType";
private static final String SORT_DIRECTION = "sortDirection";
private static final String SORT_ACTION = "action";
private static final String SORT_DATE = "date";
private static final String SORT_STATUS = "status";
private static final String SORT_TITLE = "title";
private static final String SORT_USER = "user";
private static final String SORT_WORKFLOW = "workflow";
// IMAGES
public static final String UP_ARROW_IMAGE
= "/themes/heirfloom/images/gray-triangle-up.gif";
public static final String DOWN_ARROW_IMAGE
= "/themes/heirfloom/images/gray-triangle-down.gif";
// CREATION PANE CONSTANTS
private Label m_selectorLabel;
//ToDo
// private CreationSelector m_selector;
private ContentSectionContainer m_sections;
// ToDo End
private CcmObjectSelectionModel m_sectionSel;
private CcmObjectSelectionModel m_typeSel;
// private RootFolderSelectionModel m_folderSel;
private BoxPanel m_creationPane;
/**
* Constructs a new task panel that shows no more than 15 enabled tasks by
* default.
*
* @param typeModel
* @param sectionModel
*
*/
public TasksPane(CcmObjectSelectionModel typeModel,
CcmObjectSelectionModel sectionModel) {
this(DEFAULT_MAX_ROWS, typeModel, sectionModel);
}
/**
* Constructs a new task panel that shows a specified number enabled tasks.
*
* @param maxRows the maximum number of rows to show by default
* @param typeModel
* @param sectionModel
*
* @pre maxRows != null
*
*/
public TasksPane(int maxRows,
CcmObjectSelectionModel typeModel,
CcmObjectSelectionModel sectionModel) {
super();
// Set class attribute
setClassAttr(TASK_PANEL_CLASS);
m_maxRows = maxRows;
m_typeSel = typeModel;
m_sectionSel = sectionModel;
m_sortDirectionParam = new StringParameter(SORT_DIRECTION);
m_sortTypeParam = new StringParameter(SORT_TYPE);
m_lockFilterParam = new StringParameter(LOCK_FILTER_TYPE);
addComponents();
}
/**
* Adds the components to this tasks panel
*/
private void addComponents() {
m_creationPane = new BoxPanel(BoxPanel.VERTICAL);
// A label that says "Create $content_type in $section"
m_selectorLabel = new Label(new PrintListener() {
@Override
public void prepare(PrintEvent e) {
PageState s = e.getPageState();
Label t = (Label) e.getTarget();
ContentType type = (ContentType) m_typeSel.getSelectedObject(s);
ContentSection sec = (ContentSection) m_sectionSel
.getSelectedObject(s);
StringBuilder buf = new StringBuilder(
new GlobalizedMessage("cms.ui.create",
CmsConstants.CMS_BUNDLE).localize()
+ " ");
buf.append(type.getLabel());
buf.append(" in ");
buf.append(sec.getLabel());
t.setLabel(buf.toString());
t.setFontWeight(Label.BOLD);
t.setClassAttr("creationLabel");
}
});
m_selectorLabel.setClassAttr("creationLabel");
m_creationPane.add(m_selectorLabel);
//ToDo
// m_folderSel = new RootFolderSelectionModel(m_sectionSel);
// m_selector = new CreationSelector(m_typeSel, m_folderSel);
// m_creationPane.add(m_selector);
//ToDo End
m_creationPane.setClassAttr("itemCreationPane");
add(m_creationPane);
// The section list UIx
//ToDo
m_sections = new ContentSectionContainer(m_typeSel, m_sectionSel);
add(m_sections);
//ToDo End
// When a new type is selected, show the creation UI.
// When the selection is cleared, return to section list
m_typeSel.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
PageState s = e.getPageState();
boolean isSelected = m_typeSel.isSelected(s);
//ToDo
// m_sections.setVisible(s, !isSelected);
//ToDo End
m_creationPane.setVisible(s, isSelected);
}
});
m_viewLockLink = new ActionLink(new Label(new GlobalizedMessage(
"cms.ui.workflow.task.view_locked", CmsConstants.CMS_BUNDLE)));
m_viewLockLink.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PageState ps = e.getPageState();
ps.setValue(m_lockFilterParam, "lock");
}
});
m_viewUnlockLink = new ActionLink(new Label(new GlobalizedMessage(
"cms.ui.workflow.task.view_unlocked", CmsConstants.CMS_BUNDLE)));
m_viewUnlockLink.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PageState ps = e.getPageState();
ps.setValue(m_lockFilterParam, "unlock");
}
});
m_viewAllLockLink = new ActionLink(new Label(new GlobalizedMessage(
"cms.ui.workflow.task.view_all", CmsConstants.CMS_BUNDLE)));
m_viewAllLockLink.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PageState ps = e.getPageState();
ps.setValue(m_lockFilterParam, "all");
}
});
m_viewLockLabel = new Label(new GlobalizedMessage(
"cms.ui.workflow.task.view_locked", CmsConstants.CMS_BUNDLE));
m_viewLockLabel.setFontWeight(Label.BOLD);
m_viewUnlockLabel = new Label(new GlobalizedMessage(
"cms.ui.workflow.task.view_unlocked", CmsConstants.CMS_BUNDLE));
m_viewUnlockLabel.setFontWeight(Label.BOLD);
m_viewAllLockLabel = new Label(new GlobalizedMessage(
"cms.ui.workflow.task.view_all", CmsConstants.CMS_BUNDLE));
m_viewAllLockLabel.setFontWeight(Label.BOLD);
add(new Label("<br />", false));
add(m_viewLockLink);
add(m_viewLockLabel);
add(new Label("&nbsp;", false));
add(m_viewUnlockLink);
add(m_viewUnlockLabel);
add(new Label("&nbsp;", false));
add(m_viewAllLockLink);
add(m_viewAllLockLabel);
add(new Label("<br />", false));
add(new Label("<br />", false));
add(getTasksList());
add(getPaginator());
// m_actionLabel = new Label(GlobalizationUtil.globalize("cms.ui.action"));
// m_actionLabel.setClassAttr("action");
}
/**
*
* @param p
*/
@Override
public void register(Page p) {
super.register(p);
p.setVisibleDefault(m_creationPane, false);
//ToDo
// p.addComponentStateParam(this, m_folderSel.getStateParameter());
//ToDo End
p.addGlobalStateParam(m_lockFilterParam);
p.addGlobalStateParam(m_sortTypeParam);
p.addGlobalStateParam(m_sortDirectionParam);
p.setVisibleDefault(m_viewLockLabel, false);
p.setVisibleDefault(m_viewUnlockLabel, false);
p.setVisibleDefault(m_viewAllLockLink, false);
p.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
final PageState state = e.getPageState();
String lockFilterType = getLockFilterType(state);
if (lockFilterType.equals("lock")) {
m_viewLockLabel.setVisible(state, true);
m_viewLockLink.setVisible(state, false);
m_viewUnlockLabel.setVisible(state, false);
m_viewUnlockLink.setVisible(state, true);
m_viewAllLockLabel.setVisible(state, false);
m_viewAllLockLink.setVisible(state, true);
} else if (lockFilterType.equals("unlock")) {
m_viewLockLabel.setVisible(state, false);
m_viewLockLink.setVisible(state, true);
m_viewUnlockLabel.setVisible(state, true);
m_viewUnlockLink.setVisible(state, false);
m_viewAllLockLabel.setVisible(state, false);
m_viewAllLockLink.setVisible(state, true);
} else {
m_viewLockLabel.setVisible(state, false);
m_viewLockLink.setVisible(state, true);
m_viewUnlockLabel.setVisible(state, false);
m_viewUnlockLink.setVisible(state, true);
m_viewAllLockLabel.setVisible(state, true);
m_viewAllLockLink.setVisible(state, false);
}
}
});
}
public void reset(PageState state) {
m_typeSel.clearSelection(state);
m_sectionSel.clearSelection(state);
}
protected Paginator getPaginator() {
if (m_paginator == null) {
m_paginator = new Paginator(new TasksPaginationModelBuilder(),
m_maxRows);
}
return m_paginator;
}
/**
* Returns the bebop List component to display the tasks
*
*/
private TaskList getTasksList() {
if (m_taskList == null) {
m_taskList = new TaskList(true);
}
return m_taskList;
}
/**
* Returns the number of enabled tasks for the specified user.
*
* @param state
*
* @return
*
*/
protected int numberTasksForUser(PageState state) {
return m_taskList.size(state);
}
protected String getSortType(PageState state) {
String sortType = (String) state.getValue(m_sortTypeParam);
if (sortType == null) {
sortType = SORT_DATE;
}
return sortType;
}
protected String getSortDirection(PageState state) {
String sortDirection = (String) state.getValue(m_sortDirectionParam);
if (sortDirection == null) {
sortDirection = SORT_UP;
}
return sortDirection;
}
protected String getLockFilterType(PageState state) {
String lockFilterType = (String) state.getValue(m_lockFilterParam);
if (lockFilterType == null || lockFilterType.equals("")) {
lockFilterType = "lock";
}
return lockFilterType;
}
/*
* Adds filters to the task query
*/
//ToDo
// protected void addQueryFilters(DataQuery query, Party party, PageState state) {
// query.setParameter("userId", party.getID());
//
// FilterFactory ff = query.getFilterFactory();
//
// // TODO: remove this hard coding of "Author", "Edit", and "Deploy"
// // TODO: remove this hard coding of "Author", "Edit", and "Deploy"
// CompoundFilter authorFilter = ff.and();
// //cg query changed to refer to task type id
// authorFilter.addFilter(ff.equals("taskType", CMSTaskType.AUTHOR));
// authorFilter.addFilter(getTaskFilter(CMSTaskType.retrieve(
// CMSTaskType.AUTHOR),
// party, ff));
//
// CompoundFilter approveFilter = ff.and();
// approveFilter.addFilter(ff.equals("taskType", CMSTaskType.EDIT));
// approveFilter.addFilter(getTaskFilter(CMSTaskType.retrieve(
// CMSTaskType.EDIT),
// party, ff));
//
// CompoundFilter deployFilter = ff.and();
// deployFilter.addFilter(ff.equals("taskType", CMSTaskType.DEPLOY));
// deployFilter.addFilter(getTaskFilter(CMSTaskType.retrieve(
// CMSTaskType.DEPLOY),
// party, ff));
//
// CompoundFilter permissionFilter = ff.or();
// permissionFilter.addFilter(authorFilter);
// permissionFilter.addFilter(approveFilter);
// permissionFilter.addFilter(deployFilter);
//
// query.addFilter(permissionFilter);
//
// String lockFilterType = getLockFilterType(state);
// if (lockFilterType.equals("lock")) {
// query.addEqualsFilter("isLocked", "t");
// query.addEqualsFilter("status", "1");
// } else if (lockFilterType.equals("unlock")) {
// query.addEqualsFilter("isLocked", "f");
// } // else show all
// }
// private static class RootFolderSelectionModel
// extends FolderSelectionModel {
//
// CcmObjectSelectionModel m_sectionSel;
//
// public RootFolderSelectionModel(CcmObjectSelectionModel sectionSel) {
// super("f");
// m_sectionSel = sectionSel;
// }
//
// @Override
// protected BigDecimal getRootFolderID(PageState s) {
// ContentSection sec = (ContentSection) m_sectionSel
// .getSelectedObject(s);
// Assert.exists(sec);
//
// User user = Web.getWebContext().getUser();
// if (user != null) {
// Folder folder = Folder.getUserHomeFolder(user, sec);
// if (folder != null) {
// return folder.getID();
// }
// }
// return sec.getRootFolder().getID();
// }
//
// }
//ToDo End
/**
*
*/
private class TasksPaginationModelBuilder implements PaginationModelBuilder {
@Override
public int getTotalSize(Paginator paginator,
PageState state) {
return numberTasksForUser(state);
}
@Override
public boolean isVisible(PageState state) {
return numberTasksForUser(state) > m_maxRows;
}
}
private class TaskList extends SimpleComponent {
private final static String QUERY_NAME
= "com.arsdigita.cms.workflow.getEnabledUserTasks";
private boolean m_paginate = false;
public TaskList(boolean paginate) {
m_paginate = paginate;
}
// private DataQuery makeQuery(PageState state) {
// User user = (User) Kernel.getContext().getParty();
//
// DataQuery query = SessionManager.getSession()
// .retrieveQuery(QUERY_NAME);
// addQueryFilters(query, user, state);
//
// return query;
// }
public int size(PageState ps) {
return ((Integer)m_taskCount.get(ps)).intValue();
}
private RequestLocal m_taskCount = new RequestLocal() {
@Override
public Object initialValue(PageState state) {
// DataQuery query = makeQuery(state);
// return new Long(query.size());
return 0;
}
};
@Override
public void generateXML(PageState state,
Element parent) {
Element content = parent.newChildElement("cms:tasksPanel",
CMS.CMS_XML_NS);
exportAttributes(content);
// DataQuery query = makeQuery(state);
String lockFilterType = getLockFilterType(state);
content.addAttribute("lockFilterType", lockFilterType);
if (m_paginate) {
// query.setRange(new Integer(m_paginator.getFirst(state)),
// new Integer(m_paginator.getLast(state) + 1));
}
String sortKey = getSortType(state);
String sortDirection = getSortDirection(state);
String sortPostfix = " asc";
if (sortDirection.equals(SORT_DOWN)) {
sortPostfix = " desc";
}
// if (sortKey.equals(SORT_TITLE)) {
// query.setOrder("lower(pageTitle) " + sortPostfix
// + ", lower(status) asc, dueDate desc");
// } else if (sortKey.equals(SORT_DATE)) {
// query.setOrder("dueDate " + sortPostfix
// + ", lower(status) asc, lower(pageTitle) asc");
// } else if (sortKey.equals(SORT_USER)) {
// query.setOrder("lockingUserID " + sortPostfix
// + ", lower(status) asc, dueDate desc "
// + ", lower(pageTitle) asc");
// } else if (sortKey.equals(SORT_STATUS)) {
// query.setOrder("lower(status) " + sortPostfix
// + ", dueDate desc "
// + ", lower(pageTitle) asc");
//
// } else if (sortKey.equals(SORT_ACTION)) {
// query.setOrder("taskType " + sortPostfix
// + ", lower(status) asc, dueDate desc "
// + ", lower(pageTitle) asc");
// } else if (sortKey.equals(SORT_WORKFLOW)) {
// query.setOrder("processLabel " + sortPostfix
// + ", lower(status) asc, dueDate desc "
// + ", lower(pageTitle) asc");
// }
//
// HashMap sections = new HashMap();
//
// while (query.next()) {
// BigDecimal sectionID = (BigDecimal) query.get("sectionID");
// String sectionPath = (String) sections.get(sectionID);
// if (sectionPath == null) {
// try {
// ContentSection section
// = (ContentSection) DomainObjectFactory
// .newInstance(new OID(
// ContentSection.BASE_DATA_OBJECT_TYPE,
// sectionID));
// sectionPath = section.getPath();
// } catch (DataObjectNotFoundException ex) {
// throw new UncheckedWrapperException(
// "cannot find content section", ex);
// }
// sections.put(sectionID, sectionPath);
// }
//
// Element task = content.newChildElement("cms:tasksPanelTask",
// CMS.CMS_XML_NS);
//
// BigDecimal itemID = (BigDecimal) query.get("itemID");
// String taskType = (String) query.get("taskType");
//
// task.addAttribute("taskID", query.get("taskID").toString());
// task
// .addAttribute("processID", query.get("processID").toString());
// task.addAttribute("taskLabel", (String) query.get("taskLabel"));
// task.addAttribute("taskDescription", (String) query.get(
// "taskDescription"));
// task.addAttribute("processLabel", (String) query.get(
// "processLabel"));
//
// String isLocked = (String) query.get("isLocked");
// task.addAttribute("isLocked", isLocked);
// if (query.get("dueDate") != null) {
// java.util.Date d = (java.util.Date) query.get("dueDate");
// SimpleDateFormat df = new SimpleDateFormat(
// "EEE, MMM d, yyyy");
//
// task.addAttribute("dueDate", df.format(d));
// }
//
// task.addAttribute("itemID", itemID.toString());
// task
// .addAttribute("sectionID", query.get("sectionID").toString());
// task.addAttribute("sectionPath", sectionPath);
// task.addAttribute("pageName", (String) query.get("pageName"));
// task.addAttribute("pageTitle", (String) query.get("pageTitle"));
//
// BigDecimal lockingUserID = (BigDecimal) query.get(
// "lockingUserID");
// if (lockingUserID != null) {
// task.addAttribute("lockingUserID", lockingUserID.toString());
// if (!"f".equals(isLocked)) {
// User lockingUser = User.retrieve(lockingUserID);
// if (lockingUser != null) {
// task.addAttribute("assignee", lockingUser
// .getDisplayName());
// }
// }
// }
// task.addAttribute("taskType", taskType);
// task.addAttribute("taskTypeClass", (String) query.get(
// "taskTypeClass"));
// task.addAttribute("status", query.get("status").toString());
//
// // control event for locking a task
// try {
// state.setControlEvent(this, TASK_ACTION, itemID.toString());
// task.addAttribute("actionURL", state.stateAsURL());
// state.clearControlEvent();
// } catch (java.io.IOException ex) {
// s_log.warn("Error: " + ex.getMessage());
// }
//
// if ("Deploy".equals(taskType)) {
// task.addAttribute("editTabNumber",
// String.valueOf(
// ContentItemPage.PUBLISHING_TAB));
// } else {
// task.addAttribute("editTabNumber",
// String.valueOf(
// ContentItemPage.AUTHORING_TAB));
// }
}
// m_actionLabel.generateXML(state, content);
String[][] sortableHeaders = {{SORT_TITLE,
"cms.ui.workflow.task.item_title"},
{SORT_ACTION, "cms.ui.action"},
{SORT_DATE, "cms.ui.tasks_due_date"},
{SORT_STATUS,
"cms.ui.tasks_status_no_colon"},
{SORT_USER,
"cms.ui.workflow.task.locking_user"},
{SORT_WORKFLOW, "cms.ui.workflow"}};
// for (int i = 0; i < sortableHeaders.length; i++) {
// String header = sortableHeaders[i][0];
// String labelKey = sortableHeaders[i][1];
// if (sortDirection.equals(SORT_UP) && header.equals(sortKey)) {
// state.setControlEvent(this, SORT_DOWN, header);
// } else {
// state.setControlEvent(this, SORT_UP, header);
// }
// SimpleContainer container = new SimpleContainer();
// container.add(new Label(GlobalizationUtil.globalize(labelKey)));
// if (header.equals(sortKey)) {
// String imageURLStub = null;
// if (SORT_UP.equals(sortDirection)) {
// imageURLStub = UP_ARROW_IMAGE;
// } else {
// imageURLStub = DOWN_ARROW_IMAGE;
// }
// Image image = new Image(imageURLStub);
// image.setBorder("0");
// container.add(image);
// }
//
// ControlLink link = new ControlLink(container);
// link.setHint(GlobalizationUtil
// .globalize("cms.ui.contentcenter.task_panel_control"));
// link.setClassAttr(header);
// link.generateXML(state, content);
// state.clearControlEvent();
// }
}
@Override
public void respond(PageState state) throws ServletException {
String key = state.getControlEventName();
String value = state.getControlEventValue();
if (TASK_ACTION.equals(key)) {
BigDecimal itemID = new BigDecimal(value);
//
// try {
// ContentItem item = new ContentItem(itemID);
// Workflow wf = Workflow.getObjectWorkflow(item);
// int tabNumber = ContentItemPage.AUTHORING_TAB;
// String sectionPath = item.getContentSection().getPath();
//
// if (wf != null) {
// User user = Web.getWebContext().getUser();
// Engine engine = Engine.getInstance(
// CMSEngine.CMS_ENGINE_TYPE);
// Iterator i = engine.getEnabledTasks(user, wf.getID())
// .iterator();
// if (i.hasNext()) {
// CMSTask task = (CMSTask) i.next();
// Integer taskType = task.getTaskType().getID();
//
// if (taskType.equals(CMSTaskType.DEPLOY)) {
// tabNumber = ContentItemPage.PUBLISHING_TAB;
// } else // see if item is locked; if not, lock
// {
// if (!task.isLocked()) {
// task.lock(user);
// }
// }
// }
// }
//
// String redirectURL = Web.getConfig()
// .getDispatcherServletPath()
// + sectionPath
// + "/admin/item.jsp?item_id="
// + itemID + "&set_tab=" + tabNumber;
// throw new RedirectSignal(redirectURL, true);
// } catch (DataObjectNotFoundException ex) {
// throw new ServletException("Unknown content ID" + itemID);
// }
// } else
if (SORT_UP.equals(key) || SORT_DOWN.equals(key)) {
state.setValue(m_sortTypeParam, value);
if (SORT_DOWN.equals(key)) {
state.setValue(m_sortDirectionParam, SORT_DOWN);
} else {
state.setValue(m_sortDirectionParam, SORT_UP);
}
} else {
throw new ServletException("Unknown control event: " + key);
}
}
}
// private static Filter getTaskFilter(CMSTaskType taskType, Party party,
// FilterFactory factory) {
// PrivilegeDescriptor privilege;
// String queryName;
// String queryType;
// OID partyOID = party.getOID();
// privilege = taskType.getPrivilege();
//
// return PermissionService.getFilterQuery(factory, "itemID", privilege,
// partyOID);
// }
}

View File

@ -1,74 +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.workflow;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.cms.CMS;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.workflow.Workflow;
/**
* @author Uday Mathur
* @author Michael Pih
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
class WorkflowAddForm extends BaseWorkflowForm {
private final SingleSelectionModel<Long> m_model;
WorkflowAddForm(final SingleSelectionModel<Long> model) {
super("workflow", gz("cms.ui.workflow.add"));
m_model = model;
addProcessListener(new ProcessListener());
}
private class ProcessListener implements FormProcessListener {
@Override
public final void process(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
final String label = (String) m_title.getValue(state);
final String description = (String) m_description.getValue(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowAdminPaneController controller = cdiUtil.findBean(
WorkflowAdminPaneController.class);
final Workflow workflow = controller.createWorkflow(
CMS.getContext().getContentSection(),
label,
description);
m_model.setSelectedKey(state, workflow.getWorkflowId());
}
}
}

View File

@ -1,102 +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.workflow;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.cms.ui.BaseAdminPane;
import com.arsdigita.cms.ui.BaseDeleteForm;
import com.arsdigita.cms.ui.VisibilityComponent;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.workflow.Workflow;
import org.libreccm.workflow.WorkflowRepository;
import org.librecms.contentsection.privileges.AdminPrivileges;
/**
* @author <a href="mailto:jross@redhat.com">Justin Ross</a>
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public final class WorkflowAdminPane extends BaseAdminPane {
private final WorkflowRequestLocal m_workflow;
public WorkflowAdminPane() {
super(gz("cms.ui.workflows"), new WorkflowListModelBuilder());
m_workflow = new SelectionRequestLocal();
setAdd(gz("cms.ui.workflow.add"),
new WorkflowAddForm(getSelectionModel()));
setEdit(gz("cms.ui.workflow.edit"), new WorkflowEditForm(m_workflow));
setDelete(gz("cms.ui.workflow.delete"), new DeleteForm());
setIntroPane(new Label(gz("cms.ui.workflow.intro")));
setItemPane(new WorkflowItemPane(m_workflow,
getEditLink(),
getDeleteLink()));
addAction(new VisibilityComponent(
getAddLink(), AdminPrivileges.ADMINISTER_WORKFLOWS));
}
private class DeleteForm extends BaseDeleteForm {
DeleteForm() {
super(gz("cms.ui.workflow.delete_prompt"));
addSecurityListener(AdminPrivileges.ADMINISTER_WORKFLOWS);
}
@Override
public final void process(final FormSectionEvent event)
throws FormProcessException {
final PageState state = event.getPageState();
final CdiUtil cdiUtil= CdiUtil.createCdiUtil();
final WorkflowRepository workflowRepo= cdiUtil.findBean(WorkflowRepository.class);
final Workflow workflow = m_workflow.getWorkflow(state);
workflowRepo.delete(workflow);
getSelectionModel().clearSelection(state);
}
}
private class SelectionRequestLocal extends WorkflowRequestLocal {
@Override
protected final Object initialValue(final PageState state) {
final String id = getSelectionModel().getSelectedKey(state)
.toString();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final WorkflowRepository templateRepo = cdiUtil.findBean(
WorkflowRepository.class);
return templateRepo.findById(Long.parseLong(id));
}
}
}

View File

@ -1,30 +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.workflow;
import com.arsdigita.bebop.ActionLink;
class WorkflowItemPane extends BaseWorkflowItemPane {
public WorkflowItemPane(final WorkflowRequestLocal workflow,
final ActionLink editLink,
final ActionLink deleteLink) {
super(workflow, editLink, deleteLink);
}
}

View File

@ -1,125 +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.workflow;
import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.PageState;
import org.librecms.contentsection.ContentItem;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.toolbox.ui.ComponentAccess;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.PermissionChecker;
import org.librecms.contentsection.privileges.ItemPrivileges;
/**
* A <code>ComponentAccess</code> implementation that respects workflow
*
* @author Stanislav Freidin
* @author Uday Mathur
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class WorkflowLockedComponentAccess extends ComponentAccess {
private static final Logger LOGGER = LogManager.getLogger(
WorkflowLockedComponentAccess.class);
private final ItemSelectionModel itemModel;
/**
* Constructor.
*
* @param component The component
* @param itemModel
*/
public WorkflowLockedComponentAccess(final Component component,
final ItemSelectionModel itemModel) {
super(component);
this.itemModel = itemModel;
}
/**
* Constructor.
*
* @param component The component
* @param check An access check
* @param itemModel
*/
public WorkflowLockedComponentAccess(final Component component,
final String check,
final ItemSelectionModel itemModel) {
super(component, check);
this.itemModel = itemModel;
}
/**
* Check if this item is locked from the workflow module. In addition check
* if all the access checks registered to the component pass.
*
* @param state The page state
*
* @return true if all the access checks pass, false otherwise
*
*/
@Override
public boolean canAccess(final PageState state) {
final ContentItem item = itemModel.getSelectedObject(state);
if (isVisible(state) == true) {
if (super.canAccess(state)) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class);
final boolean result = permissionChecker.isPermitted(
ItemPrivileges.EDIT, item);
LOGGER.debug(
"Superclass security check passed. Result of check "
+ "for permission {}.{} is {}.",
ItemPrivileges.class.getName(),
ItemPrivileges.EDIT,
result);
return result;
} else {
return false;
}
} else {
return false;
}
}
/**
* Override this method to change visiblity of action link created by
* SecurityPropertyEditor add-method. If this method returns false, the link
* will be hidden, p.ex. to hide a delete link if the component is already
* empty.
*
* @param state The page state
*
* @return true for default behavior
*/
public boolean isVisible(final PageState state) {
return true;
}
}