CCM NG: Current progress of the migration of the UI for ccm-cms
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4516 8810af33-2d31-482b-a856-94f89814c4dfccm-docs
parent
303e2c02b6
commit
24db30a69b
|
|
@ -20,64 +20,59 @@ package com.arsdigita.cms.ui;
|
|||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.ContentItem;
|
||||
import com.arsdigita.cms.ContentSection;
|
||||
import com.arsdigita.cms.ContentType;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentType;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.Template;
|
||||
import com.arsdigita.cms.PageLocations;
|
||||
import com.arsdigita.web.ParameterMap;
|
||||
import com.arsdigita.web.URL;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>The context bar of the content section UI.</p>
|
||||
* <p>
|
||||
* The context bar of the content section UI.</p>
|
||||
*
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @version $Id: ContentItemContextBar.java 287 2005-02-22 00:29:02Z sskracic $
|
||||
* @author Justin Ross
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
class ContentItemContextBar extends ContentSectionContextBar {
|
||||
|
||||
private static final Logger s_log = Logger.getLogger
|
||||
(ContentItemContextBar.class);
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
|
||||
private final ItemSelectionModel m_item;
|
||||
|
||||
ContentItemContextBar(final ItemSelectionModel item) {
|
||||
ContentItemContextBar(final ItemSelectionModel itemSelectionModel) {
|
||||
super();
|
||||
|
||||
m_item = item;
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final List entries(final PageState state) {
|
||||
final List entries = super.entries(state);
|
||||
final ContentItem item = (ContentItem) m_item.getSelectedObject(state);
|
||||
protected final List<Entry> entries(final PageState state) {
|
||||
final List<Entry> entries = super.entries(state);
|
||||
final ContentItem item = itemSelectionModel.getSelectedObject(state);
|
||||
final ContentSection section = CMS.getContext().getContentSection();
|
||||
boolean isTemplate =
|
||||
item.getContentType().equals(ContentType.findByAssociatedObjectType(Template.BASE_DATA_OBJECT_TYPE));
|
||||
|
||||
final URL url = URL.there
|
||||
(state.getRequest(),
|
||||
section.getPath() + "/" + PageLocations.ITEM_PAGE,
|
||||
params(item));
|
||||
final URL url = URL.there(state.getRequest(),
|
||||
section.getPrimaryUrl() + "/"
|
||||
+ PageLocations.ITEM_PAGE,
|
||||
params(item));
|
||||
|
||||
StringBuffer title = new StringBuffer();
|
||||
if (isTemplate) {
|
||||
title.append(localize("cms.ui.template"));
|
||||
} else {
|
||||
title.append(localize("cms.ui.content_item"));
|
||||
}
|
||||
final StringBuilder title = new StringBuilder();
|
||||
title.append(localize("cms.ui.content_item"));
|
||||
title.append(": ")
|
||||
.append(item.getDisplayName());
|
||||
String language = item.getLanguage();
|
||||
if (language != null) {
|
||||
title.append(" (")
|
||||
.append(language)
|
||||
.append(")");
|
||||
}
|
||||
// final String language = item.getLanguage();
|
||||
// if (language != null) {
|
||||
// title.append(" (")
|
||||
// .append(language)
|
||||
// .append(")");
|
||||
// }
|
||||
|
||||
entries.add(new Entry(title.toString(), url));
|
||||
|
||||
|
|
@ -87,7 +82,7 @@ class ContentItemContextBar extends ContentSectionContextBar {
|
|||
private static ParameterMap params(final ContentItem item) {
|
||||
final ParameterMap params = new ParameterMap();
|
||||
|
||||
params.setParameter(ContentItemPage.ITEM_ID, item.getID());
|
||||
params.setParameter(ContentItemPage.ITEM_ID, item.getObjectId());
|
||||
|
||||
return params;
|
||||
}
|
||||
|
|
@ -95,4 +90,5 @@ class ContentItemContextBar extends ContentSectionContextBar {
|
|||
private static String localize(final String key) {
|
||||
return (String) ContentSectionPage.globalize(key).localize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ import com.arsdigita.cms.PageLocations;
|
|||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.Folder;
|
||||
|
||||
import com.arsdigita.web.ParameterMap;
|
||||
import com.arsdigita.web.URL;
|
||||
|
|
@ -36,11 +35,6 @@ import java.util.List;
|
|||
import java.util.Stack;
|
||||
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.core.CcmObject;
|
||||
import org.librecms.contentsection.ContentSectionManager;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* The context bar of the content section UI.
|
||||
|
|
@ -54,14 +48,14 @@ public class ContentSectionContextBar extends WorkspaceContextBar {
|
|||
ContentSectionContextBar.class);
|
||||
|
||||
@Override
|
||||
protected List entries(final PageState state) {
|
||||
protected List<Entry> entries(final PageState state) {
|
||||
|
||||
/* Include breadcrumb entries already set by content-center (i.e. the
|
||||
* URL of the content center itself */
|
||||
final List entries = super.entries(state);
|
||||
final List<Entry> entries = super.entries(state);
|
||||
|
||||
final ContentSection section = CMS.getContext().getContentSection();
|
||||
final Stack folderEntryStack = new Stack();
|
||||
final Stack<Entry> folderEntryStack = new Stack<>();
|
||||
String currentFolderLabel = null;
|
||||
ParameterMap params = new ParameterMap();
|
||||
boolean isTemplate = false;
|
||||
|
|
@ -19,53 +19,57 @@
|
|||
package com.arsdigita.cms.ui;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.cms.ContentCenter;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.ContextBar;
|
||||
import com.arsdigita.web.URL;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.web.ApplicationManager;
|
||||
import org.libreccm.web.ApplicationRepository;
|
||||
import org.libreccm.web.ApplicationType;
|
||||
import org.libreccm.web.CcmApplication;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>The context bar of the content center UI.</p>
|
||||
* <p>
|
||||
* The context bar of the content center UI.</p>
|
||||
*
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @version $Id$
|
||||
* @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 s_log = Logger.getLogger
|
||||
(WorkspaceContextBar.class);
|
||||
/**
|
||||
* A logger instance, primarily to assist debugging .
|
||||
*/
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
WorkspaceContextBar.class);
|
||||
|
||||
/**
|
||||
*
|
||||
* @param state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected List entries(final PageState state) {
|
||||
protected List<Entry> entries(final PageState state) {
|
||||
|
||||
final List entries = super.entries(state);
|
||||
final List<Entry> entries = super.entries(state);
|
||||
|
||||
final String centerTitle = (String) new GlobalizedMessage("cms.ui.content_center", CmsConstants.CMS_BUNDLE).localize();
|
||||
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_SECTION_APP_TYPE);
|
||||
final ApplicationRepository appRepo = cdiUtil.findBean(
|
||||
ApplicationRepository.class);
|
||||
final List<CcmApplication> apps = appRepo.findByType(
|
||||
CmsConstants.CONTENT_SECTION_APP_TYPE);
|
||||
|
||||
final String centerPath = apps.get(0).getPrimaryUrl();
|
||||
if (s_log.isDebugEnabled()) {
|
||||
s_log.debug("Got Url: " + centerPath);
|
||||
if (LOGGER.isDebugEnabled()) {
|
||||
LOGGER.debug("Got Url: " + centerPath);
|
||||
}
|
||||
final URL url = URL.there(state.getRequest(), centerPath);
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,367 @@
|
|||
/*
|
||||
* 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.item;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
|
||||
import org.libreccm.categorization.Category;
|
||||
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.dispatcher.CMSDispatcher;
|
||||
import com.arsdigita.cms.dispatcher.ItemResolver;
|
||||
|
||||
import org.librecms.lifecycle.Lifecycle;
|
||||
|
||||
import com.arsdigita.cms.ui.CMSContainer;
|
||||
|
||||
import org.libreccm.security.User;
|
||||
|
||||
import com.arsdigita.toolbox.ui.FormatStandards;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.util.GraphSet;
|
||||
import com.arsdigita.util.Graphs;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import com.arsdigita.web.Web;
|
||||
|
||||
import org.libreccm.workflow.Task;
|
||||
import org.libreccm.workflow.TaskComment;
|
||||
import org.libreccm.workflow.Workflow;
|
||||
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import org.libreccm.auditing.CcmRevision;
|
||||
import org.libreccm.categorization.CategoryManager;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.security.Shiro;
|
||||
import org.librecms.contentsection.ContentItemRepository;
|
||||
import org.librecms.contentsection.ContentSectionManager;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* This panel displays basic details about a content item such as attributes and
|
||||
* associations.
|
||||
*
|
||||
* Container: {@link com.arsdigita.cms.ui.ContentItemPage}
|
||||
*
|
||||
* This panel uses an {@link com.arsdigita.cms.dispatcher.XMLGenerator} to
|
||||
* convert content items into XML.
|
||||
*
|
||||
* @author Michael Pih
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class Summary extends CMSContainer {
|
||||
|
||||
private static final String SUMMARY = "itemAdminSummary";
|
||||
private static final String RESTART_WORKFLOW = "restartWorkflow";
|
||||
|
||||
private final ItemSelectionModel itemSelectionModel;
|
||||
|
||||
public Summary(final ItemSelectionModel itemSelectionModel) {
|
||||
super();
|
||||
|
||||
this.itemSelectionModel = itemSelectionModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate XML representation of an item summary.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param parent The parent DOM element
|
||||
*
|
||||
* @pre ( state != null )
|
||||
* @pre ( parent != null )
|
||||
*/
|
||||
@Override
|
||||
public void generateXML(PageState state, Element parent) {
|
||||
if (isVisible(state)) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil.findBean(
|
||||
GlobalizationHelper.class);
|
||||
final Locale language = globalizationHelper.getNegotiatedLocale();
|
||||
|
||||
// Determine the item's environment
|
||||
final ContentItem item = getContentItem(state);
|
||||
final ContentSection section = getContentSection(state);
|
||||
|
||||
final Shiro shiro = cdiUtil.findBean(Shiro.class);
|
||||
final User user = shiro.getUser();
|
||||
|
||||
// Setup xml element for item's properties
|
||||
final Element itemElement = new Element("cms:itemSummary",
|
||||
CMS.CMS_XML_NS);
|
||||
|
||||
// Determine item's name / url stub
|
||||
itemElement.addAttribute("name", item.getDisplayName());
|
||||
|
||||
// obviously getName() here gets the 'semantically meaningful name'
|
||||
// from database using class DataType. It is not localizable! And
|
||||
// it is not really 'semantically meaningful'
|
||||
final String objectType = item.getClass().getName();
|
||||
|
||||
// Quasimodo: ObjectType for summary
|
||||
itemElement.addAttribute("objectType", objectType);
|
||||
itemElement.addAttribute("description",
|
||||
item.getDescription().getValue(language));
|
||||
|
||||
itemElement.addAttribute("title",
|
||||
item.getTitle().getValue(language));
|
||||
|
||||
// subject category
|
||||
final Element subjectCategoriesElement = new Element(
|
||||
"cms:subjectCategories", CMS.CMS_XML_NS);
|
||||
itemElement.addContent(subjectCategoriesElement);
|
||||
|
||||
// URL
|
||||
final Element linkElement = new Element("cms:linkSummary",
|
||||
CMS.CMS_XML_NS);
|
||||
try {
|
||||
linkElement.addAttribute(
|
||||
"url",
|
||||
String.format("%s/redirect?oid=%s",
|
||||
Web.getWebappContextPath(),
|
||||
URLEncoder.encode(item.getUuid(), "UTF-8")));
|
||||
} catch (UnsupportedEncodingException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
//"/redirect?oid=" + URLEncoder.encode(item.getDraftVersion().getOID().toString()));
|
||||
// WORKFLOW
|
||||
final Element workflowElement = new Element("cms:workflowSummary",
|
||||
CMS.CMS_XML_NS);
|
||||
final Workflow workflow = item.getWorkflow();
|
||||
if (workflow == null) {
|
||||
workflowElement.addAttribute("noWorkflow", "1");
|
||||
} else {
|
||||
workflowElement.addAttribute("name",
|
||||
workflow.getName().getValue(
|
||||
language));
|
||||
|
||||
final List<Task> tasks = workflow.getTasks();
|
||||
final GraphSet graph = new GraphSet();
|
||||
|
||||
for (final Task task : tasks) {
|
||||
final List<Task> dependsOn = task.getDependsOn();
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
for (final Task dep : dependsOn) {
|
||||
graph.addEdge(task, dep, null);
|
||||
builder.append(dep.getLabel().getValue(language));
|
||||
}
|
||||
|
||||
final int len = builder.length();
|
||||
if (len >= 2) {
|
||||
builder.setLength(len - 2);
|
||||
} else {
|
||||
graph.addNode(task);
|
||||
}
|
||||
}
|
||||
|
||||
final List<Task> taskList = new ArrayList<>();
|
||||
outer:
|
||||
while (graph.nodeCount() > 0) {
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<Task> list = Graphs.getSinkNodes(graph);
|
||||
for (final Task task : list) {
|
||||
taskList.add(0, task);
|
||||
graph.removeNode(task);
|
||||
continue outer;
|
||||
}
|
||||
// break loop if no nodes removed
|
||||
break;
|
||||
}
|
||||
|
||||
for (final Task task : taskList) {
|
||||
Element taskElement = new Element("cms:task",
|
||||
CMS.CMS_XML_NS);
|
||||
taskElement.addAttribute("name",
|
||||
task.getLabel().getValue(language));
|
||||
taskElement.addAttribute("state",
|
||||
task.getTaskState().toString());
|
||||
for (final TaskComment comment : task.getComments()) {
|
||||
final Element commentElement = new Element(
|
||||
"cms:taskComment", CMS.CMS_XML_NS);
|
||||
final User author = comment.getAuthor();
|
||||
final String authorName;
|
||||
if (author == null) {
|
||||
authorName = "Anonymous";
|
||||
} else {
|
||||
authorName = author.getName();
|
||||
}
|
||||
|
||||
commentElement.addAttribute("author", authorName);
|
||||
commentElement.addAttribute("comment",
|
||||
comment.getComment());
|
||||
taskElement.addContent(commentElement);
|
||||
}
|
||||
|
||||
workflowElement.addContent(taskElement);
|
||||
}
|
||||
}
|
||||
|
||||
// Revision History (we are using to "transaction" for XML elememts
|
||||
// here because this used by the old API and we don't want to brake
|
||||
// the XSL.
|
||||
final Element revisionsElement = new Element(
|
||||
"cms:transactionSummary",
|
||||
CMS.CMS_XML_NS);
|
||||
final ContentItemRepository itemRepo = cdiUtil.findBean(
|
||||
ContentItemRepository.class);
|
||||
final List<CcmRevision> revisions = itemRepo.retrieveRevisions(
|
||||
item, item.getObjectId());
|
||||
if (revisions != null && !revisions.isEmpty()) {
|
||||
revisionsElement.addAttribute(
|
||||
"creationDate",
|
||||
FormatStandards.formatDate(revisions.get(0)
|
||||
.getRevisionDate()));
|
||||
revisionsElement.addAttribute(
|
||||
"lastModifiedDate",
|
||||
FormatStandards
|
||||
.formatDate(revisions.get(revisions.size() - 1)
|
||||
.getRevisionDate()));
|
||||
final ContentSectionManager sectionManager = cdiUtil.findBean(
|
||||
ContentSectionManager.class);
|
||||
final ItemResolver itemResolver = sectionManager
|
||||
.getItemResolver(section);
|
||||
for (final CcmRevision revision : revisions) {
|
||||
final Element revisionElement = new Element(
|
||||
"cms:transaction", CMS.CMS_XML_NS);
|
||||
revisionElement.addAttribute(
|
||||
"date",
|
||||
FormatStandards.formatDate(revision.getRevisionDate()));
|
||||
final String authorName;
|
||||
if (revision.getUserName() == null
|
||||
|| revision.getUserName().trim().isEmpty()) {
|
||||
authorName = "Anonymous";
|
||||
} else {
|
||||
authorName = revision.getUserName();
|
||||
}
|
||||
revisionElement.addAttribute("author", authorName);
|
||||
|
||||
final String url = String.format(
|
||||
"%s?revision=%d",
|
||||
itemResolver.generateItemURL(
|
||||
state,
|
||||
item,
|
||||
section,
|
||||
CMSDispatcher.PREVIEW),
|
||||
revision.getId());
|
||||
revisionElement.addAttribute("url", url);
|
||||
revisionsElement.addContent(revisionElement);
|
||||
}
|
||||
}
|
||||
|
||||
// CATEGORY
|
||||
final Element categoriesElement = new Element(
|
||||
"cms:categorySummary", CMS.CMS_XML_NS);
|
||||
|
||||
final List<Category> categories = item.getCategories().stream()
|
||||
.map(categorization -> categorization.getCategory())
|
||||
.collect(Collectors.toList());
|
||||
final CategoryManager categoryManager = cdiUtil.findBean(
|
||||
CategoryManager.class);
|
||||
for (final Category category : categories) {
|
||||
final Element categoryElement = new Element("cms:category",
|
||||
CMS.CMS_XML_NS);
|
||||
categoryElement.setText(categoryManager
|
||||
.getCategoryPath(category));
|
||||
categoriesElement.addContent(categoryElement);
|
||||
}
|
||||
|
||||
// LIFECYCLE
|
||||
final Element lifecycleElement = new Element("cms:lifecycleSummary",
|
||||
CMS.CMS_XML_NS);
|
||||
|
||||
final Lifecycle lifecycle = item.getLifecycle();
|
||||
if (lifecycle == null) {
|
||||
lifecycleElement.addAttribute("noLifecycle", "1");
|
||||
} else {
|
||||
lifecycleElement.addAttribute(
|
||||
"name",
|
||||
lifecycle.getDefinition().getLabel().getValue(language));
|
||||
lifecycleElement.addAttribute(
|
||||
"startDate",
|
||||
FormatStandards.formatDate(lifecycle.getStartDateTime()));
|
||||
|
||||
final Date endDate = lifecycle.getEndDateTime();
|
||||
if (endDate == null) {
|
||||
lifecycleElement.addAttribute("endDateString",
|
||||
"last forever");
|
||||
} else {
|
||||
lifecycleElement.addAttribute(
|
||||
"endDateString",
|
||||
String.format("expire on %s",
|
||||
FormatStandards.formatDate(endDate)));
|
||||
lifecycleElement.addAttribute(
|
||||
"endDate", FormatStandards.formatDate(endDate));
|
||||
}
|
||||
|
||||
lifecycleElement.addAttribute(
|
||||
"hasBegun", Boolean.toString(lifecycle.isStarted()));
|
||||
lifecycleElement.addAttribute(
|
||||
"hasEnded", Boolean.toString(lifecycle.isFinished()));
|
||||
}
|
||||
|
||||
parent.addContent(itemElement);
|
||||
parent.addContent(categoriesElement);
|
||||
parent.addContent(linkElement);
|
||||
parent.addContent(lifecycleElement);
|
||||
parent.addContent(workflowElement);
|
||||
parent.addContent(revisionsElement);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the selected content item.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return The selected item
|
||||
*/
|
||||
protected ContentItem getContentItem(final PageState state) {
|
||||
final ContentItem item = itemSelectionModel.getSelectedObject(state);
|
||||
Assert.exists(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the current content section.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return The content section
|
||||
*/
|
||||
protected ContentSection getContentSection(final PageState state) {
|
||||
return CMS.getContext().getContentSection();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,455 +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.item;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.categorization.Category;
|
||||
import com.arsdigita.categorization.CategoryCollection;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.ContentItem;
|
||||
import com.arsdigita.cms.ContentPage;
|
||||
import com.arsdigita.cms.ContentSection;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.SecurityManager;
|
||||
import com.arsdigita.cms.dispatcher.CMSDispatcher;
|
||||
import com.arsdigita.cms.lifecycle.Lifecycle;
|
||||
import com.arsdigita.cms.ui.CMSContainer;
|
||||
import com.arsdigita.cms.util.SecurityConstants;
|
||||
import com.arsdigita.cms.workflow.CMSEngine;
|
||||
import com.arsdigita.cms.workflow.CMSTask;
|
||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||
import com.arsdigita.domain.DomainServiceInterfaceExposer;
|
||||
import com.arsdigita.kernel.ACSObject;
|
||||
import com.arsdigita.kernel.User;
|
||||
import com.arsdigita.kernel.permissions.PermissionDescriptor;
|
||||
import com.arsdigita.kernel.permissions.PermissionService;
|
||||
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
||||
import com.arsdigita.persistence.Filter;
|
||||
import com.arsdigita.toolbox.ui.FormatStandards;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.util.GraphSet;
|
||||
import com.arsdigita.util.Graphs;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import com.arsdigita.versioning.Transaction;
|
||||
import com.arsdigita.versioning.TransactionCollection;
|
||||
import com.arsdigita.versioning.Versions;
|
||||
import com.arsdigita.web.RedirectSignal;
|
||||
import com.arsdigita.web.Web;
|
||||
import com.arsdigita.web.WebContext;
|
||||
import com.arsdigita.workflow.simple.Engine;
|
||||
import com.arsdigita.workflow.simple.Task;
|
||||
import com.arsdigita.workflow.simple.TaskCollection;
|
||||
import com.arsdigita.workflow.simple.TaskComment;
|
||||
import com.arsdigita.workflow.simple.Workflow;
|
||||
import com.arsdigita.workflow.simple.WorkflowTemplate;
|
||||
import com.arsdigita.xml.Element;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* This panel displays basic details about a content item such as attributes and associations.</p>
|
||||
*
|
||||
* <p>
|
||||
* Container: {@link com.arsdigita.cms.ui.ContentItemPage}
|
||||
*
|
||||
* <p>
|
||||
* This panel uses an {@link com.arsdigita.cms.dispatcher.XMLGenerator} to convert content items
|
||||
* into XML.</p>
|
||||
*
|
||||
* @author Michael Pih (pihman@arsdigita.com)
|
||||
* @version $Id: Summary.java 1940 2009-05-29 07:15:05Z terry $
|
||||
*/
|
||||
public class Summary extends CMSContainer {
|
||||
|
||||
private static final String SUMMARY = "itemAdminSummary";
|
||||
private static final String RESTART_WORKFLOW = "restartWorkflow";
|
||||
|
||||
private final ItemSelectionModel m_item;
|
||||
|
||||
public Summary(ItemSelectionModel m) {
|
||||
super();
|
||||
|
||||
m_item = m;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate XML representation of an item summary.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param parent The parent DOM element
|
||||
*
|
||||
* @pre ( state != null )
|
||||
* @pre ( parent != null )
|
||||
*/
|
||||
@Override
|
||||
public void generateXML(PageState state, Element parent) {
|
||||
if (isVisible(state)) {
|
||||
|
||||
// Determine the item's environment
|
||||
ContentItem item = getContentItem(state);
|
||||
ContentSection section = getContentSection(state);
|
||||
User user = Web.getWebContext().getUser();
|
||||
|
||||
// Setup xml element for item's properties
|
||||
Element itemElement = new Element("cms:itemSummary", CMS.CMS_XML_NS);
|
||||
|
||||
// Determine item's name / url stub
|
||||
itemElement.addAttribute("name", item.getName());
|
||||
|
||||
// obviously getName() here gets the 'semantically meaningful name'
|
||||
// from database using class DataType. It is not localizable! And
|
||||
// it is not really 'semantically meaningful'
|
||||
String objectType = item.getObjectType().getName();
|
||||
|
||||
// Quasimodo: ObjectType for summary
|
||||
itemElement.addAttribute("objectType", objectType);
|
||||
|
||||
// NOT USED - CUSTOMIZED SUMMARY
|
||||
// Take advantage of caching in the CMS Dispatcher.
|
||||
// XMLGenerator xmlGenerator = section.getXMLGenerator();
|
||||
// xmlGenerator.generateXML(state, parent, SUMMARY);
|
||||
String descriptionAttribute = "";
|
||||
if (objectType.equals("NewsItem") || objectType.equals("Article")) {
|
||||
descriptionAttribute = "lead";
|
||||
} else if (objectType.equals("FileStorageItem") || objectType.equals("Minutes")) {
|
||||
descriptionAttribute = "description";
|
||||
} else if (objectType.equals("Job")) {
|
||||
descriptionAttribute = "jobDescription";
|
||||
} else if (objectType.equals("MultiPartArticle") || objectType.equals("Agenda")
|
||||
|| objectType.equals("PressRelease") || objectType.equals("Service")) {
|
||||
descriptionAttribute = "summary";
|
||||
}
|
||||
|
||||
if (!descriptionAttribute.equals("")) {
|
||||
itemElement.addAttribute("description", (String) DomainServiceInterfaceExposer.get(
|
||||
item, descriptionAttribute));
|
||||
}
|
||||
|
||||
try {
|
||||
ContentPage page = new ContentPage(item.getID());
|
||||
itemElement.addAttribute("title", page.getTitle());
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
//
|
||||
}
|
||||
|
||||
// subject category
|
||||
Element subjectsElement = new Element("cms:subjectCategories", CMS.CMS_XML_NS);
|
||||
itemElement.addContent(subjectsElement);
|
||||
Category itemCategory = null;
|
||||
Category subjectCategory = Category.getRootForObject(section, "subject");
|
||||
if (subjectCategory != null) {
|
||||
CategoryCollection categories = item.getCategoryCollection();
|
||||
while (categories.next()) {
|
||||
Category category = categories.getCategory();
|
||||
CategoryCollection parents = category.getDefaultAscendants();
|
||||
parents.addOrder(Category.DEFAULT_ANCESTORS);
|
||||
if (parents.next()) {
|
||||
Category parentCategory = parents.getCategory();
|
||||
if (parentCategory.equals(subjectCategory)) {
|
||||
Element subjectElement = new Element("cms:subjectCategory",
|
||||
CMS.CMS_XML_NS);
|
||||
subjectElement.addAttribute("name", category.getName());
|
||||
subjectElement.setText(category.getPreferredQualifiedName(" -> ",
|
||||
true));
|
||||
subjectsElement.addContent(subjectElement);
|
||||
}
|
||||
parents.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// URL
|
||||
Element linkElement = new Element("cms:linkSummary", CMS.CMS_XML_NS);
|
||||
try {
|
||||
linkElement.addAttribute("url",
|
||||
String.format("%s/redirect?oid=%s",
|
||||
Web.getWebappContextPath(),
|
||||
URLEncoder.encode(item.getDraftVersion()
|
||||
.getOID()
|
||||
.toString(), "utf-8")));
|
||||
} catch (UnsupportedEncodingException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
//"/redirect?oid=" + URLEncoder.encode(item.getDraftVersion().getOID().toString()));
|
||||
// WORKFLOW
|
||||
Element workflowElement = new Element("cms:workflowSummary", CMS.CMS_XML_NS);
|
||||
Workflow workflow = Workflow.getObjectWorkflow(item);
|
||||
|
||||
SecurityManager sm = CMS.getContext().getSecurityManager();
|
||||
if (canWorkflowBeExtended(user, item, workflow)) {
|
||||
// control event for restarting workflow in edit mode
|
||||
try {
|
||||
state.setControlEvent(this, RESTART_WORKFLOW, item.getID().toString());
|
||||
workflowElement.addAttribute("restartWorkflowURL", state.stateAsURL());
|
||||
state.clearControlEvent();
|
||||
} catch (java.io.IOException ex) {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
if (workflow == null) {
|
||||
workflowElement.addAttribute("noWorkflow", "1");
|
||||
} else {
|
||||
workflowElement.addAttribute("name", workflow.getDisplayName());
|
||||
|
||||
TaskCollection tc = workflow.getTaskCollection();
|
||||
GraphSet g = new GraphSet();
|
||||
while (tc.next()) {
|
||||
Task t = tc.getTask();
|
||||
final TaskCollection deps = t.getRequiredTasks();
|
||||
final StringBuffer buffer = new StringBuffer();
|
||||
while (deps.next()) {
|
||||
Task dep = deps.getTask();
|
||||
g.addEdge(t, dep, null);
|
||||
buffer.append(dep.getLabel() + ", ");
|
||||
}
|
||||
|
||||
final int len = buffer.length();
|
||||
if (len >= 2) {
|
||||
buffer.setLength(len - 2);
|
||||
} else {
|
||||
g.addNode(t);
|
||||
}
|
||||
deps.close();
|
||||
}
|
||||
|
||||
List taskList = new ArrayList();
|
||||
outer:
|
||||
while (g.nodeCount() > 0) {
|
||||
List l = Graphs.getSinkNodes(g);
|
||||
for (Iterator it = l.iterator(); it.hasNext();) {
|
||||
Task t = (Task) it.next();
|
||||
taskList.add(0, t);
|
||||
g.removeNode(t);
|
||||
continue outer;
|
||||
}
|
||||
// break loop if no nodes removed
|
||||
break;
|
||||
}
|
||||
Iterator tasks = taskList.iterator();
|
||||
|
||||
while (tasks.hasNext()) {
|
||||
Task task = (Task) tasks.next();
|
||||
Element taskElement = new Element("cms:task", CMS.CMS_XML_NS);
|
||||
taskElement.addAttribute("name", task.getDisplayName());
|
||||
taskElement.addAttribute("state", task.getStateString());
|
||||
Iterator comments = task.getComments();
|
||||
while (comments.hasNext()) {
|
||||
TaskComment comment = (TaskComment) comments.next();
|
||||
Element commentElement = new Element("cms:taskComment", CMS.CMS_XML_NS);
|
||||
User author = comment.getUser();
|
||||
String authorName = "Anonymous";
|
||||
if (author != null) {
|
||||
authorName = author.getDisplayName();
|
||||
}
|
||||
|
||||
commentElement.addAttribute("author", authorName);
|
||||
commentElement.addAttribute("comment", comment.getComment());
|
||||
commentElement.addAttribute("date", FormatStandards.formatDate(comment
|
||||
.getDate()));
|
||||
|
||||
taskElement.addContent(commentElement);
|
||||
}
|
||||
|
||||
workflowElement.addContent(taskElement);
|
||||
}
|
||||
}
|
||||
|
||||
// REVISION HISTORY
|
||||
Element transactionElement = new Element("cms:transactionSummary", CMS.CMS_XML_NS);
|
||||
transactionElement.addAttribute("creationDate", FormatStandards.formatDate(item
|
||||
.getCreationDate()));
|
||||
transactionElement.addAttribute("lastModifiedDate", FormatStandards.formatDate(item
|
||||
.getLastModifiedDate()));
|
||||
|
||||
TransactionCollection transactions = Versions.getTaggedTransactions(item.getOID());
|
||||
while (transactions.next()) {
|
||||
Transaction transaction = transactions.getTransaction();
|
||||
Element element = new Element("cms:transaction", CMS.CMS_XML_NS);
|
||||
element.addAttribute("date", FormatStandards.formatDate(transaction.getTimestamp()));
|
||||
String authorName = "Anonymous";
|
||||
User author = transaction.getUser();
|
||||
if (author != null) {
|
||||
authorName = author.getDisplayName();
|
||||
}
|
||||
element.addAttribute("author", authorName);
|
||||
|
||||
String url = section.getItemResolver().generateItemURL(state, item, section,
|
||||
CMSDispatcher.PREVIEW)
|
||||
+ "?transID=" + transaction.getID();
|
||||
element.addAttribute("url", url);
|
||||
transactionElement.addContent(element);
|
||||
}
|
||||
|
||||
transactions.close();
|
||||
|
||||
// CATEGORY
|
||||
Element categoryElement = new Element("cms:categorySummary", CMS.CMS_XML_NS);
|
||||
|
||||
CategoryCollection categories = item.getCategoryCollection();
|
||||
while (categories.next()) {
|
||||
Category category = categories.getCategory();
|
||||
Element element = new Element("cms:category", CMS.CMS_XML_NS);
|
||||
element.setText(category.getPreferredQualifiedName(" -> ", true));
|
||||
categoryElement.addContent(element);
|
||||
|
||||
}
|
||||
categories.close();
|
||||
|
||||
// LIFECYCLE
|
||||
Element lifecycleElement = new Element("cms:lifecycleSummary", CMS.CMS_XML_NS);
|
||||
|
||||
Lifecycle lifecycle = item.getLifecycle();
|
||||
if (lifecycle == null) {
|
||||
lifecycleElement.addAttribute("noLifecycle", "1");
|
||||
} else {
|
||||
lifecycleElement.addAttribute("name", lifecycle.getLabel());
|
||||
lifecycleElement.addAttribute("startDate", FormatStandards.formatDate(lifecycle
|
||||
.getStartDate()));
|
||||
|
||||
java.util.Date endDate = lifecycle.getEndDate();
|
||||
if (endDate == null) {
|
||||
lifecycleElement.addAttribute("endDateString", "last forever");
|
||||
} else {
|
||||
lifecycleElement.addAttribute("endDateString", "expire on " + FormatStandards
|
||||
.formatDate(endDate));
|
||||
lifecycleElement.addAttribute("endDate", FormatStandards.formatDate(endDate));
|
||||
}
|
||||
|
||||
lifecycleElement.addAttribute("hasBegun", (new Boolean(lifecycle.hasBegun()))
|
||||
.toString());
|
||||
lifecycleElement.addAttribute("hasEnded", (new Boolean(lifecycle.hasEnded()))
|
||||
.toString());
|
||||
}
|
||||
|
||||
parent.addContent(itemElement);
|
||||
parent.addContent(categoryElement);
|
||||
parent.addContent(linkElement);
|
||||
parent.addContent(lifecycleElement);
|
||||
parent.addContent(workflowElement);
|
||||
parent.addContent(transactionElement);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the selected content item.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return The selected item
|
||||
*
|
||||
* @pre ( state != null )
|
||||
*/
|
||||
protected ContentItem getContentItem(PageState state) {
|
||||
ContentItem item = (ContentItem) m_item.getSelectedObject(state);
|
||||
Assert.exists(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the current content section.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return The content section
|
||||
*
|
||||
* @pre ( state != null )
|
||||
*/
|
||||
protected ContentSection getContentSection(PageState state) {
|
||||
ContentSection section = CMS.getContext().getContentSection();
|
||||
return section;
|
||||
}
|
||||
|
||||
public void respond(PageState state) throws ServletException {
|
||||
String key = state.getControlEventName();
|
||||
String value = state.getControlEventValue();
|
||||
if (RESTART_WORKFLOW.equals(key)) {
|
||||
User user = Web.getWebContext().getUser();
|
||||
ContentItem item = getContentItem(state);
|
||||
ContentSection section = item.getContentSection();
|
||||
Workflow w = Workflow.getObjectWorkflow(item);
|
||||
|
||||
if (canWorkflowBeExtended(user, item, w)) {
|
||||
WorkflowTemplate template = w.getWorkflowTemplate();
|
||||
if (template != null) {
|
||||
template.extendWorkflow(w);
|
||||
w.save();
|
||||
}
|
||||
|
||||
// lock the next task
|
||||
Engine engine = Engine.getInstance(CMSEngine.CMS_ENGINE_TYPE);
|
||||
Iterator i = engine.getEnabledTasks(user, w.getID()).iterator();
|
||||
if (i.hasNext()) {
|
||||
CMSTask task = (CMSTask) i.next();
|
||||
|
||||
if (!task.isLocked()) {
|
||||
task.lock(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String redirectURL = Web.getConfig().getDispatcherServletPath() + item
|
||||
.getContentSection().getPath() + "/admin/item.jsp?item_id=" + item.getID()
|
||||
+ "&set_tab=1";
|
||||
throw new RedirectSignal(redirectURL, true);
|
||||
} else {
|
||||
throw new ServletException("Unknown control event: " + key);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if workflow can be extended
|
||||
*/
|
||||
protected boolean canWorkflowBeExtended(User user, ContentItem item, Workflow workflow) {
|
||||
boolean canBeExtended = true;
|
||||
|
||||
if (workflow == null) {
|
||||
canBeExtended = false;
|
||||
} else if (!workflow.isFinished()) {
|
||||
canBeExtended = false;
|
||||
} else if (workflow.getWorkflowTemplate() == null) {
|
||||
canBeExtended = false;
|
||||
} else {
|
||||
TaskCollection templates = item.getContentSection().getWorkflowTemplates();
|
||||
Filter f = templates.addInSubqueryFilter("id",
|
||||
"com.arsdigita.cms.getWorkflowTemplateUserFilter");
|
||||
f.set("userId", Web.getWebContext().getUser().getID());
|
||||
templates.addEqualsFilter(ACSObject.ID, workflow.getWorkflowTemplate().getID());
|
||||
|
||||
PrivilegeDescriptor pd = PrivilegeDescriptor.get(SecurityConstants.CMS_WORKFLOW_ADMIN);
|
||||
PermissionDescriptor perm = new PermissionDescriptor(pd, item, user);
|
||||
if (!(templates.next() || PermissionService.checkPermission(perm))) {
|
||||
canBeExtended = false;
|
||||
}
|
||||
templates.close();
|
||||
|
||||
}
|
||||
|
||||
return canBeExtended;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -24,12 +24,10 @@ import com.arsdigita.bebop.Page;
|
|||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.categorization.Category;
|
||||
import com.arsdigita.categorization.CategoryCollection;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.CMSConfig;
|
||||
import com.arsdigita.cms.ContentItem;
|
||||
import com.arsdigita.cms.lifecycle.Lifecycle;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.lifecycle.Lifecycle;
|
||||
|
||||
import com.arsdigita.cms.ui.BaseItemPane;
|
||||
import com.arsdigita.cms.ui.ContentItemPage;
|
||||
import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
|
||||
|
|
@ -37,101 +35,110 @@ import com.arsdigita.toolbox.ui.LayoutPanel;
|
|||
import com.arsdigita.web.RedirectSignal;
|
||||
import com.arsdigita.web.URL;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
* @author Michael Pih
|
||||
* @author Jack Chung
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @author Jens Pelzetter jens@jp-digital.de
|
||||
* @version $Id: ItemLifecycleAdminPane.java 1942 2009-05-29 07:53:23Z terry $
|
||||
* @author <a href="mailto:jens.pelzetter@goolemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ItemLifecycleAdminPane extends BaseItemPane {
|
||||
|
||||
private static final Logger s_log = Logger.getLogger(
|
||||
ItemLifecycleAdminPane.class);
|
||||
private final ContentItemRequestLocal m_item;
|
||||
private final LifecycleRequestLocal m_lifecycle;
|
||||
private final LayoutPanel m_introPane;
|
||||
private final LayoutPanel m_detailPane;
|
||||
private final LayoutPanel m_selectPane;
|
||||
private final LayoutPanel m_lockedPane;
|
||||
private final LayoutPanel m_errorPane;
|
||||
private final LayoutPanel m_cantPublishPane;
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
ItemLifecycleAdminPane.class);
|
||||
private final ContentItemRequestLocal selectedItem;
|
||||
private final LifecycleRequestLocal selectedLifecycle;
|
||||
private final LayoutPanel introPane;
|
||||
private final LayoutPanel detailPane;
|
||||
private final LayoutPanel selectPane;
|
||||
private final LayoutPanel lockedPane;
|
||||
private final LayoutPanel errorPane;
|
||||
private final LayoutPanel cantPublishPane;
|
||||
|
||||
public ItemLifecycleAdminPane(final ContentItemRequestLocal item) {
|
||||
m_item = item;
|
||||
m_lifecycle = new ItemLifecycleRequestLocal();
|
||||
public ItemLifecycleAdminPane(final ContentItemRequestLocal selectedItem) {
|
||||
this.selectedItem = selectedItem;
|
||||
selectedLifecycle = new ItemLifecycleRequestLocal();
|
||||
|
||||
m_introPane = new LayoutPanel();
|
||||
add(m_introPane);
|
||||
introPane = new LayoutPanel();
|
||||
add(introPane);
|
||||
|
||||
final Label message = new Label(gz("cms.ui.item.lifecycle.intro"));
|
||||
m_introPane.setBody(message);
|
||||
introPane.setBody(message);
|
||||
|
||||
m_detailPane = new LayoutPanel();
|
||||
add(m_detailPane);
|
||||
detailPane = new LayoutPanel();
|
||||
add(detailPane);
|
||||
|
||||
final ItemLifecycleItemPane itemPane =
|
||||
new ItemLifecycleItemPane(m_item,
|
||||
m_lifecycle);
|
||||
m_detailPane.setBody(itemPane);
|
||||
final ItemLifecycleItemPane itemPane = new ItemLifecycleItemPane(
|
||||
selectedItem, selectedLifecycle);
|
||||
detailPane.setBody(itemPane);
|
||||
|
||||
m_selectPane = new LayoutPanel();
|
||||
add(m_selectPane);
|
||||
selectPane = new LayoutPanel();
|
||||
add(selectPane);
|
||||
|
||||
final ItemLifecycleSelectForm selectForm =
|
||||
new ItemLifecycleSelectForm(m_item);
|
||||
m_selectPane.setBody(selectForm);
|
||||
final ItemLifecycleSelectForm selectForm = new ItemLifecycleSelectForm(
|
||||
selectedItem);
|
||||
selectPane.setBody(selectForm);
|
||||
|
||||
m_lockedPane = new LayoutPanel();
|
||||
add(m_lockedPane);
|
||||
lockedPane = new LayoutPanel();
|
||||
add(lockedPane);
|
||||
|
||||
final Label lockedMsg = new Label(gz(
|
||||
"cms.ui.item.lifecycle.publish_locked"));
|
||||
m_lockedPane.setBody(lockedMsg);
|
||||
"cms.ui.item.lifecycle.publish_locked"));
|
||||
lockedPane.setBody(lockedMsg);
|
||||
final ControlLink lockedUpdateLink = new ControlLink(new Label(gz(
|
||||
"cms.ui.item.lifecycle.publish_locked.update")));
|
||||
"cms.ui.item.lifecycle.publish_locked.update")));
|
||||
lockedUpdateLink.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(final ActionEvent event) {
|
||||
throw new RedirectSignal(
|
||||
URL.getDispatcherPath()
|
||||
URL.getDispatcherPath()
|
||||
+ ContentItemPage.getItemURL(
|
||||
item.getContentItem(event.getPageState()),
|
||||
selectedItem.getContentItem(event.getPageState()),
|
||||
ContentItemPage.PUBLISHING_TAB),
|
||||
true);
|
||||
true);
|
||||
}
|
||||
});
|
||||
m_lockedPane.setBottom(lockedUpdateLink);
|
||||
|
||||
m_errorPane = new LayoutPanel();
|
||||
add(m_errorPane);
|
||||
});
|
||||
lockedPane.setBottom(lockedUpdateLink);
|
||||
|
||||
errorPane = new LayoutPanel();
|
||||
add(errorPane);
|
||||
|
||||
final Label errorMsg = new Label(gz("cms.ui.lifecycle.publish.error"));
|
||||
m_errorPane.setBody(errorMsg);
|
||||
errorPane.setBody(errorMsg);
|
||||
|
||||
m_cantPublishPane = new LayoutPanel();
|
||||
add(m_cantPublishPane);
|
||||
cantPublishPane = new LayoutPanel();
|
||||
add(cantPublishPane);
|
||||
|
||||
final Label cantPublish = new Label(gz("cms.ui.lifecycle.publish.not_possible_abstract_category"));
|
||||
m_cantPublishPane.setBody(cantPublish);
|
||||
final Label cantPublish = new Label(gz(
|
||||
"cms.ui.lifecycle.publish.not_possible_abstract_category"));
|
||||
cantPublishPane.setBody(cantPublish);
|
||||
|
||||
connect(selectForm, m_detailPane);
|
||||
connect(selectForm, detailPane);
|
||||
}
|
||||
|
||||
private class ItemLifecycleRequestLocal extends LifecycleRequestLocal {
|
||||
|
||||
@Override
|
||||
protected final Object initialValue(final PageState state) {
|
||||
final ContentItem item = m_item.getContentItem(state);
|
||||
final ContentItem item = selectedItem.getContentItem(state);
|
||||
final Lifecycle lifecycle = item.getLifecycle();
|
||||
|
||||
s_log.debug("Returning lifecycle " + lifecycle);
|
||||
LOGGER.debug("Returning lifecycle " + lifecycle);
|
||||
|
||||
return lifecycle;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void register(final Page page) {
|
||||
super.register(page);
|
||||
|
||||
|
|
@ -140,44 +147,50 @@ public class ItemLifecycleAdminPane extends BaseItemPane {
|
|||
|
||||
private class VisibilityListener implements ActionListener {
|
||||
|
||||
public final void actionPerformed(final ActionEvent e) {
|
||||
s_log.debug("Determining which pane to show");
|
||||
@Override
|
||||
public final void actionPerformed(final ActionEvent event) {
|
||||
LOGGER.debug("Determining which pane to show");
|
||||
|
||||
final PageState state = e.getPageState();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (CMSConfig.getInstanceOf().getThreadedPublishing()
|
||||
&& PublishLock.getInstance().isLocked(m_item.getContentItem(
|
||||
state))) {
|
||||
if (PublishLock.getInstance().hasError(m_item.getContentItem(
|
||||
state))) {
|
||||
push(state, m_errorPane);
|
||||
} else {
|
||||
push(state, m_lockedPane);
|
||||
state.getResponse().addIntHeader("Refresh", 5);
|
||||
}
|
||||
} else if(isAssignedToAbstractCategory(m_item.getContentItem(state))) {
|
||||
push(state, m_cantPublishPane);
|
||||
// if (CMSConfig.getConfig().isThreadPublishing()
|
||||
// && PublishLock.getInstance().isLocked(m_item.getContentItem(
|
||||
// state))) {
|
||||
// if (PublishLock.getInstance().hasError(m_item.getContentItem(
|
||||
// state))) {
|
||||
// push(state, m_errorPane);
|
||||
// } else {
|
||||
// push(state, m_lockedPane);
|
||||
// state.getResponse().addIntHeader("Refresh", 5);
|
||||
// }
|
||||
// } else
|
||||
if (isAssignedToAbstractCategory(selectedItem.getContentItem(state))) {
|
||||
push(state, cantPublishPane);
|
||||
} else {
|
||||
if (state.isVisibleOnPage(ItemLifecycleAdminPane.this)) {
|
||||
if (m_lifecycle.getLifecycle(state) == null) {
|
||||
if (selectedLifecycle.getLifecycle(state) == null) {
|
||||
if (hasPermission(state)) {
|
||||
push(state, m_selectPane);
|
||||
push(state, selectPane);
|
||||
} else {
|
||||
push(state, m_introPane);
|
||||
push(state, introPane);
|
||||
}
|
||||
} else {
|
||||
push(state, m_detailPane);
|
||||
push(state, detailPane);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private boolean hasPermission(final PageState state) {
|
||||
final ContentItem item = m_item.getContentItem(state);
|
||||
final ContentItem item = selectedItem.getContentItem(state);
|
||||
|
||||
return CMS.getContext().getSecurityManager().canAccess(
|
||||
state.getRequest(), SCHEDULE_PUBLICATION, item);
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final PermissionChecker permissionChecker = cdiUtil.findBean(
|
||||
PermissionChecker.class);
|
||||
|
||||
return permissionChecker.isPermitted(ItemPrivileges.PUBLISH, item);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -186,25 +199,19 @@ public class ItemLifecycleAdminPane extends BaseItemPane {
|
|||
* A category is abstract if not items can assigned to it.
|
||||
*
|
||||
* @param item
|
||||
* @return {@code true} if assigned to a abstract category, {@code false} if not.
|
||||
*
|
||||
* @return {@code true} if assigned to a abstract category, {@code false} if
|
||||
* not.
|
||||
*/
|
||||
private boolean isAssignedToAbstractCategory(final ContentItem item) {
|
||||
|
||||
final CategoryCollection categories = item.getCategoryCollection();
|
||||
final long count = item.getCategories().stream()
|
||||
.filter(categorization -> {
|
||||
return categorization.getCategory().isAbstractCategory();
|
||||
})
|
||||
.count();
|
||||
|
||||
boolean result = false;
|
||||
Category category;
|
||||
while(categories.next()) {
|
||||
category = categories.getCategory();
|
||||
|
||||
if (category.isAbstract()) {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
categories.close();
|
||||
|
||||
return result;
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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.lifecycle;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
|
||||
import org.librecms.lifecycle.Lifecycle;
|
||||
|
||||
public abstract class LifecycleRequestLocal extends RequestLocal {
|
||||
|
||||
public final Lifecycle getLifecycle(final PageState state) {
|
||||
return (Lifecycle) get(state);
|
||||
}
|
||||
}
|
||||
|
|
@ -20,16 +20,23 @@ package com.arsdigita.cms.ui.type;
|
|||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.cms.CMS;
|
||||
|
||||
import org.librecms.contentsection.ContentSection;
|
||||
import org.librecms.contentsection.ContentType;
|
||||
import org.librecms.lifecycle.LifecycleDefinition;
|
||||
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
import com.arsdigita.toolbox.ui.Property;
|
||||
import com.arsdigita.toolbox.ui.PropertyList;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import org.libreccm.workflow.WorkflowTemplate;
|
||||
import org.librecms.CmsConstants;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* This component displays basic attributes of a content type
|
||||
* including:
|
||||
|
|
@ -50,8 +57,8 @@ class ContentTypePropertyList extends PropertyList {
|
|||
}
|
||||
|
||||
@Override
|
||||
protected final java.util.List properties(final PageState state) {
|
||||
final java.util.List props = super.properties(state);
|
||||
protected final List<Property> properties(final PageState state) {
|
||||
final List<Property> props = super.properties(state);
|
||||
final ContentType type = m_type.getContentType(state);
|
||||
final ContentSection section =
|
||||
CMS.getContext().getContentSection();
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ import org.librecms.workflow.CmsTask;
|
|||
import org.libreccm.security.User;
|
||||
|
||||
import com.arsdigita.toolbox.ui.ActionGroup;
|
||||
import com.arsdigita.toolbox.ui.Property;
|
||||
import com.arsdigita.toolbox.ui.PropertyList;
|
||||
import com.arsdigita.toolbox.ui.Section;
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ import org.librecms.workflow.CmsTask;
|
|||
import org.libreccm.security.User;
|
||||
|
||||
import com.arsdigita.toolbox.ui.ActionGroup;
|
||||
import com.arsdigita.toolbox.ui.Property;
|
||||
import com.arsdigita.toolbox.ui.PropertyList;
|
||||
import com.arsdigita.toolbox.ui.Section;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@ public class CmsConstants {
|
|||
public static final String ASSET_ID = "asset_id";
|
||||
public static final String IMAGE_ID = "image_id";
|
||||
|
||||
public final static String SCHEDULE_PUBLICATION = "schedule_publication";
|
||||
|
||||
private CmsConstants() {
|
||||
//Nothing
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,24 +24,23 @@ import com.arsdigita.bebop.RequestLocal;
|
|||
import com.arsdigita.web.URL;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
* <p>A context bar.</p>
|
||||
*
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @version $Id$
|
||||
* @author Justin Ross
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public abstract class ContextBar extends SimpleComponent {
|
||||
|
||||
private static final Logger s_log = Logger.getLogger(ContextBar.class);
|
||||
|
||||
private static final RequestLocal s_entries = new RequestLocal() {
|
||||
private static final RequestLocal ENTRIES = new RequestLocal() {
|
||||
@Override
|
||||
protected final Object initialValue(final PageState state) {
|
||||
return new ArrayList();
|
||||
return new ArrayList<>();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -49,17 +48,19 @@ public abstract class ContextBar extends SimpleComponent {
|
|||
super();
|
||||
}
|
||||
|
||||
protected List entries(final PageState state) {
|
||||
return (List) s_entries.get(state);
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Entry> entries(final PageState state) {
|
||||
return (List<Entry>) ENTRIES.get(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void generateXML(final PageState state, final Element parent) {
|
||||
if (isVisible(state)) {
|
||||
final Element nav = parent.newChildElement
|
||||
("bebop:contextBar", BEBOP_XML_NS);
|
||||
|
||||
for (Iterator iter = entries(state).iterator(); iter.hasNext(); ) {
|
||||
((Entry) iter.next()).generateXML(state, nav);
|
||||
for (Iterator<Entry> iter = entries(state).iterator(); iter.hasNext(); ) {
|
||||
iter.next().generateXML(state, nav);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* 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.toolbox.ui;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public final class Property {
|
||||
|
||||
private final String title;
|
||||
private final String value;
|
||||
|
||||
public Property(final String title, final String value) {
|
||||
super();
|
||||
Assert.exists(title, "String title");
|
||||
this.title = title;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public Property(final GlobalizedMessage title, final String value) {
|
||||
this(title.localize().toString(), value);
|
||||
}
|
||||
|
||||
public Property(final GlobalizedMessage title, final GlobalizedMessage value) {
|
||||
this(title.localize().toString(), value.localize().toString());
|
||||
}
|
||||
|
||||
public Property(final String title, final GlobalizedMessage value) {
|
||||
this(title, value.localize().toString());
|
||||
}
|
||||
|
||||
public void generateXML(final PageState state, final Element parent) {
|
||||
final Element elem = parent.newChildElement("bebop:property",
|
||||
Component.BEBOP_XML_NS);
|
||||
elem.addAttribute("title", title);
|
||||
elem.addAttribute("value", value);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -24,79 +24,45 @@ import com.arsdigita.bebop.RequestLocal;
|
|||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.xml.Element;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
* <p>A context bar.</p>
|
||||
*
|
||||
* @author Justin Ross <jross@redhat.com>
|
||||
* @author Justin Ross
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public abstract class PropertyList extends SimpleComponent {
|
||||
|
||||
private static final Logger s_log = Logger.getLogger(PropertyList.class);
|
||||
private static final RequestLocal PROPERTIES = new RequestLocal() {
|
||||
|
||||
private static final RequestLocal s_props = new RequestLocal() {
|
||||
protected final Object initialValue(final PageState state) {
|
||||
return new ArrayList();
|
||||
}
|
||||
};
|
||||
@Override
|
||||
protected final Object initialValue(final PageState state) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
public PropertyList() {
|
||||
super();
|
||||
}
|
||||
|
||||
protected List properties(final PageState state) {
|
||||
return (List) s_props.get(state);
|
||||
@SuppressWarnings("unchecked")
|
||||
protected List<Property> properties(final PageState state) {
|
||||
return (List<Property>) PROPERTIES.get(state);
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void generateXML(final PageState state, final Element parent) {
|
||||
if (isVisible(state)) {
|
||||
final Element nav = parent.newChildElement
|
||||
("bebop:propertyList", BEBOP_XML_NS);
|
||||
final Element nav = parent.newChildElement("bebop:propertyList",
|
||||
BEBOP_XML_NS);
|
||||
|
||||
for (Iterator iter = properties(state).iterator();
|
||||
iter.hasNext(); ) {
|
||||
((Property) iter.next()).generateXML(state, nav);
|
||||
}
|
||||
properties(state).forEach(property -> property.generateXML(state,
|
||||
nav));
|
||||
}
|
||||
}
|
||||
|
||||
public static final class Property {
|
||||
private final String m_title;
|
||||
private final String m_value;
|
||||
|
||||
public Property(final String title, final String value) {
|
||||
super();
|
||||
|
||||
Assert.exists(title, "String title");
|
||||
|
||||
m_title = title;
|
||||
m_value = value;
|
||||
}
|
||||
|
||||
public Property(final GlobalizedMessage title, final String value) {
|
||||
this(title.localize().toString(), value);
|
||||
}
|
||||
|
||||
public Property(final GlobalizedMessage title,
|
||||
final GlobalizedMessage value) {
|
||||
this(title.localize().toString(), value.localize().toString());
|
||||
}
|
||||
|
||||
public Property(final String title, final GlobalizedMessage value) {
|
||||
this(title, value.localize().toString());
|
||||
}
|
||||
|
||||
public void generateXML(final PageState state,
|
||||
final Element parent) {
|
||||
final Element elem = parent.newChildElement
|
||||
("bebop:property", BEBOP_XML_NS);
|
||||
|
||||
elem.addAttribute("title", m_title);
|
||||
elem.addAttribute("value", m_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,9 @@ import org.hibernate.envers.query.AuditQuery;
|
|||
import org.libreccm.core.AbstractEntityRepository;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -82,6 +84,14 @@ public abstract class AbstractAuditedEntityRepository<K, T>
|
|||
return auditReader.getRevisions(entity.getClass(), objectId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the first revision of the given entity.
|
||||
*
|
||||
* @param entity The entity.
|
||||
* @param objectId The primary key of the entity.
|
||||
*
|
||||
* @return The first revision of the entity.
|
||||
*/
|
||||
public CcmRevision retrieveFirstRevision(final T entity,
|
||||
final Long objectId) {
|
||||
final List<Number> revisions = retrieveRevisionNumbersOfEntity(
|
||||
|
|
@ -90,6 +100,33 @@ public abstract class AbstractAuditedEntityRepository<K, T>
|
|||
return auditReader.findRevision(CcmRevision.class, revisions.get(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all revisions of the given entity. The list of revisions is
|
||||
* ordered from the oldest revision to the newest revision.
|
||||
*
|
||||
* @param entity The entity.
|
||||
* @param objectId The primary key of the entity.
|
||||
*
|
||||
* @return A list of all revisions of the provided entity.
|
||||
*/
|
||||
public List<CcmRevision> retrieveRevisions(final T entity,
|
||||
final Long objectId) {
|
||||
final List<Number> revisionNumbers = retrieveRevisionNumbersOfEntity(
|
||||
entity, objectId);
|
||||
|
||||
return revisionNumbers.stream()
|
||||
.map(revisionNumber -> auditReader.findRevision(CcmRevision.class,
|
||||
revisionNumber))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the current revision of an entity.
|
||||
*
|
||||
* @param entity The entity.
|
||||
* @param objectId the primary key the entity.
|
||||
* @return The most current revision of the entity.
|
||||
*/
|
||||
public CcmRevision retrieveCurrentRevision(final T entity,
|
||||
final Long objectId) {
|
||||
final List<Number> revisions = retrieveRevisionNumbersOfEntity(
|
||||
|
|
|
|||
Loading…
Reference in New Issue