CCM NG/ccm-cms: BrowsePane Expanding/collapsing of the folder on the left.

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4580 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: c381a96446
pull/2/head
jensp 2017-02-17 13:55:21 +00:00
parent 36483ce25f
commit 0a25f0f03e
18 changed files with 369 additions and 228 deletions

View File

@ -10,7 +10,7 @@
<AppenderRef ref="Console"/> <AppenderRef ref="Console"/>
</Root> </Root>
<Logger name="org.hibernate" <!--<Logger name="org.hibernate"
level="info"> level="info">
</Logger> </Logger>
<Logger name="org.hibernate.SQL" <Logger name="org.hibernate.SQL"
@ -21,6 +21,10 @@
</Logger> </Logger>
<Logger name="org.hibernate.type.descriptor.sql" <Logger name="org.hibernate.type.descriptor.sql"
level="trace"> level="trace">
</Logger>-->
<Logger name="com.arsdigita.cms.ui.folder.FolderBrowserTableModelBuilder"
level="debug">
</Logger> </Logger>
<Logger name="com.arsdigita.ui.admin.AdminServlet" <Logger name="com.arsdigita.ui.admin.AdminServlet"

View File

@ -28,6 +28,7 @@ import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Paginator; import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.ActionEvent; import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.TableActionAdapter; import com.arsdigita.bebop.event.TableActionAdapter;
@ -59,6 +60,9 @@ import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.privileges.ItemPrivileges; import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.dispatcher.ItemResolver; import org.librecms.dispatcher.ItemResolver;
import java.util.List;
import java.util.Locale;
/** /**
* Browse folders and items. If the user clicks on a folder, the folder * Browse folders and items. If the user clicks on a folder, the folder
* selection model is updated. If the user clicks on any other item, an separate * selection model is updated. If the user clicks on any other item, an separate
@ -74,7 +78,7 @@ public class FolderBrowser extends Table {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.name"),
globalize("cms.ui.folder.languages"), globalize("cms.ui.folder.languages"),
globalize("cms.ui.folder.title"), globalize("cms.ui.folder.title"),
// globalize("cms.ui.folder.additionalInfo"), // globalize("cms.ui.folder.additionalInfo"),
globalize("cms.ui.folder.type"), globalize("cms.ui.folder.type"),
globalize("cms.ui.folder.creation_date"), globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.last_modified"),
@ -83,6 +87,7 @@ public class FolderBrowser extends Table {
private static final String SORT_ACTION_DOWN = "sortActionDown"; private static final String SORT_ACTION_DOWN = "sortActionDown";
private final static String SORT_KEY_NAME = "name"; private final static String SORT_KEY_NAME = "name";
private final static String SORT_KEY_TITLE = "title"; private final static String SORT_KEY_TITLE = "title";
private final static String SORT_KEY_TYPE = "type";
private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
private final static String SORT_KEY_CREATION_DATE = "creationDate"; private final static String SORT_KEY_CREATION_DATE = "creationDate";
@ -93,10 +98,11 @@ public class FolderBrowser extends Table {
private final TableColumn nameColumn; private final TableColumn nameColumn;
private final TableColumn deleteColumn; private final TableColumn deleteColumn;
// private TableColumn m_indexColumn; // private TableColumn m_indexColumn;
private final StringParameter sortTypeParameter = new StringParameter("sortType"); private final StringParameter sortTypeParameter = new StringParameter(
"sortType");
private final StringParameter sortDirectionParameter = new StringParameter( private final StringParameter sortDirectionParameter = new StringParameter(
"sortDirn"); "sortDirn");
private StringParameter atozFilterParameter = null; private StringParameter atozFilterParameter = null;
private StringParameter filterParameter = null; private StringParameter filterParameter = null;
private FolderManipulator folderManipulator; private FolderManipulator folderManipulator;
@ -114,7 +120,7 @@ public class FolderBrowser extends Table {
setHeader(new TableHeader(getColumnModel())); setHeader(new TableHeader(getColumnModel()));
this.folderSelectionModel = folderSelectionModel; this.folderSelectionModel = folderSelectionModel;
/* /*
* *
* This code should be uncommented if the desired behaviour is for a * This code should be uncommented if the desired behaviour is for a
@ -216,15 +222,15 @@ public class FolderBrowser extends Table {
public FolderSelectionModel getFolderSelectionModel() { public FolderSelectionModel getFolderSelectionModel() {
return folderSelectionModel; return folderSelectionModel;
} }
protected void setFolderManipulator(final FolderManipulator folderManipulator) { protected void setFolderManipulator(
final FolderManipulator folderManipulator) {
this.folderManipulator = folderManipulator; this.folderManipulator = folderManipulator;
} }
// protected void setFilterForm(final FolderManipulator.FilterForm filterForm) { // protected void setFilterForm(final FolderManipulator.FilterForm filterForm) {
// this.filterForm = filterForm; // this.filterForm = filterForm;
// } // }
protected void setAtoZfilterParameter( protected void setAtoZfilterParameter(
final StringParameter atozFilterParameter) { final StringParameter atozFilterParameter) {
this.atozFilterParameter = atozFilterParameter; this.atozFilterParameter = atozFilterParameter;
@ -241,7 +247,7 @@ public class FolderBrowser extends Table {
protected Paginator getPaginator() { protected Paginator getPaginator() {
return paginator; return paginator;
} }
protected void setPaginator(final Paginator paginator) { protected void setPaginator(final Paginator paginator) {
this.paginator = paginator; this.paginator = paginator;
} }
@ -416,10 +422,12 @@ public class FolderBrowser extends Table {
final int row, final int row,
final int column) { final int column) {
final ContentItem item = (ContentItem) value; // final ContentItem item = (ContentItem) value;
final String name = item.getDisplayName(); // final String name = item.getDisplayName();
// final ContentSection section = item.getContentType(). // final ContentSection section = item.getContentType().
// getContentSection(); // getContentSection();
final long itemId = (long) key;
final String name = (String) value;
final ContentSection section = CMS.getContext().getContentSection(); final ContentSection section = CMS.getContext().getContentSection();
final ContentSectionManager sectionManager = CdiUtil.createCdiUtil() final ContentSectionManager sectionManager = CdiUtil.createCdiUtil()
.findBean(ContentSectionManager.class); .findBean(ContentSectionManager.class);
@ -427,12 +435,18 @@ public class FolderBrowser extends Table {
section); section);
return new Link(name, return new Link(name,
itemResolver.generateItemURL( itemResolver.generateItemURL(state,
state, itemId,
item.getObjectId(), name,
name, section,
section, "DRAFT"));
item.getVersion().name())); // return new Link(name,
// itemResolver.generateItemURL(
// state,
// item.getObjectId(),
// name,
// section,
// item.getVersion().name()));
} }
@ -459,42 +473,50 @@ public class FolderBrowser extends Table {
final int row, final int row,
final int column) { final int column) {
final ContentItem item = (ContentItem) value; // final ContentItem item = (ContentItem) value;
final String name = item.getDisplayName(); // final String name = item.getDisplayName();
final SimpleContainer container = new SimpleContainer(); final SimpleContainer container = new SimpleContainer();
final ContentSection section = CMS.getContext().getContentSection(); final ContentSection section = CMS.getContext().getContentSection();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentItemManager itemManager = cdiUtil.findBean( // final ContentItemManager itemManager = cdiUtil.findBean(
ContentItemManager.class); // ContentItemManager.class);
final ContentSectionManager sectionManager = cdiUtil.findBean( final ContentSectionManager sectionManager = cdiUtil.findBean(
ContentSectionManager.class); ContentSectionManager.class);
final ItemResolver itemResolver = sectionManager.getItemResolver( final ItemResolver itemResolver = sectionManager.getItemResolver(
section); section);
item.getName().getAvailableLocales().stream() // item.getName().getAvailableLocales().stream()
.map((locale) -> locale.toString()) // .map((locale) -> locale.toString())
.map((lang) -> { // .map((lang) -> {
final StringBuilder fontWeight = new StringBuilder(2); // final StringBuilder fontWeight = new StringBuilder(2);
final StringBuilder styleClasses = new StringBuilder(20); // final StringBuilder styleClasses = new StringBuilder(20);
if (itemManager.isLive(item)) { // if (itemManager.isLive(item)) {
fontWeight.append(Label.BOLD); // fontWeight.append(Label.BOLD);
styleClasses.append("live "); // styleClasses.append("live ");
} // }
final Label langLabel = new Label(lang); // final Label langLabel = new Label(lang);
langLabel.setFontWeight(fontWeight.toString().trim()); // langLabel.setFontWeight(fontWeight.toString().trim());
langLabel.setClassAttr(styleClasses.toString().trim()); // langLabel.setClassAttr(styleClasses.toString().trim());
return langLabel; // return langLabel;
}) // })
.forEach((langLabel) -> { // .forEach((langLabel) -> {
container.add(new Link( // container.add(new Link(
langLabel, // langLabel,
itemResolver.generateItemURL(state, // itemResolver.generateItemURL(state,
item.getObjectId(), // item.getObjectId(),
name, // name,
section, // section,
item.getVersion().name()))); // item.getVersion().name())));
}); // });
@SuppressWarnings("unchecked")
final List<Locale> availableLocales = (List<Locale>) value;
availableLocales.forEach(locale -> container.add(new Link(
new Text(locale.toString()),
itemResolver.generateItemURL(state,
(long) key,
locale.toString(),
section,
"DRAFT"))));
return container; return container;
} }
@ -803,5 +825,4 @@ public class FolderBrowser extends Table {
} }
} }

View File

@ -20,19 +20,26 @@ package com.arsdigita.cms.ui.folder;
import com.arsdigita.kernel.KernelConfig; import com.arsdigita.kernel.KernelConfig;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import org.libreccm.core.CcmObjectRepository; import org.libreccm.core.CcmObjectRepository;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString; import org.libreccm.l10n.LocalizedString;
import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager; import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
import org.librecms.contenttypes.ContentTypeInfo;
import org.librecms.contenttypes.ContentTypesManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -50,6 +57,9 @@ import javax.transaction.Transactional;
@RequestScoped @RequestScoped
public class FolderBrowserController { public class FolderBrowserController {
private static final Logger LOGGER = LogManager.getLogger(
FolderBrowserController.class);
@Inject @Inject
private EntityManager entityManager; private EntityManager entityManager;
@ -64,6 +74,9 @@ public class FolderBrowserController {
@Inject @Inject
private ContentItemL10NManager itemL10NManager; private ContentItemL10NManager itemL10NManager;
@Inject
private ContentTypesManager typesManager;
private Locale defaultLocale; private Locale defaultLocale;
@ -166,6 +179,37 @@ public class FolderBrowserController {
final String filterTerm, final String filterTerm,
final int first, final int first,
final int maxResults) { final int maxResults) {
Objects.requireNonNull(folder);
LOGGER.debug("Trying to find objects in folder {}...",
Objects.toString(folder));
// final TypedQuery<CcmObject> testQuery1 = entityManager.createQuery(
// "SELECT f FROM Folder f "
// + "WHERE f.parentCategory = :folder "
// + "AND LOWER(f.name) LIKE :term",
// CcmObject.class);
// testQuery1.setParameter("folder", folder);
// testQuery1.setParameter("term", filterTerm);
// final List<CcmObject> testResult1 = testQuery1.getResultList();
// LOGGER.debug("TestResult1: {}",
// Objects.toString(testResult1));
//
// final TypedQuery<CcmObject> testQuery2 = entityManager.createQuery(
// "SELECT i FROM ContentItem i JOIN i.categories c "
// + "WHERE c.category = :folder "
// + "AND c.type = '" + CmsConstants.CATEGORIZATION_TYPE_FOLDER
// + "' "
// + "AND i.version = "
// + "org.librecms.contentsection.ContentItemVersion.DRAFT "
// + "AND (LOWER(i.displayName) LIKE LOWER(:term))",
// CcmObject.class);
// testQuery2.setParameter("folder", folder);
// testQuery2.setParameter("term", filterTerm);
// final List<CcmObject> testResult2 = testQuery2.getResultList();
// LOGGER.debug("TestResult2: {}",
// Objects.toString(testResult2));
final TypedQuery<CcmObject> query = entityManager.createNamedQuery( final TypedQuery<CcmObject> query = entityManager.createNamedQuery(
"Folder.findObjects", CcmObject.class); "Folder.findObjects", CcmObject.class);
query.setParameter("folder", folder); query.setParameter("folder", folder);
@ -272,6 +316,10 @@ public class FolderBrowserController {
} else { } else {
row.setTitle(item.getTitle().getValue(defaultLocale)); row.setTitle(item.getTitle().getValue(defaultLocale));
} }
final ContentType type = item.getContentType();
final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo(type);
row.setTypeLabelBundle(typeInfo.getLabelBundle());
row.setTypeLabelKey(typeInfo.getLabelKey());
} else { } else {
row.setObjectId(object.getObjectId()); row.setObjectId(object.getObjectId());
row.setObjectUuid(object.getUuid()); row.setObjectUuid(object.getUuid());

View File

@ -19,6 +19,9 @@
package com.arsdigita.cms.ui.folder; package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.table.TableModel; import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.globalization.GlobalizedMessage;
import org.librecms.CmsConstants;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -27,9 +30,9 @@ import javax.ws.rs.DELETE;
/** /**
* Table model for the {@link FolderBrowser}. * Table model for the {@link FolderBrowser}.
* *
* @see {FolderBrowserTableModelBuilder} * @see {FolderBrowserTableModelBuilder}
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
class FolderBrowserTableModel implements TableModel { class FolderBrowserTableModel implements TableModel {
@ -41,14 +44,14 @@ class FolderBrowserTableModel implements TableModel {
private static final int COL_CREATION_DATE = 4; private static final int COL_CREATION_DATE = 4;
private static final int COL_LAST_MODIFIED = 5; private static final int COL_LAST_MODIFIED = 5;
private static final int COL_DELETEABLE = 6; private static final int COL_DELETEABLE = 6;
private final Iterator<FolderBrowserTableRow> iterator; private final Iterator<FolderBrowserTableRow> iterator;
private FolderBrowserTableRow currentRow; private FolderBrowserTableRow currentRow;
public FolderBrowserTableModel(final List<FolderBrowserTableRow> rows) { public FolderBrowserTableModel(final List<FolderBrowserTableRow> rows) {
iterator = rows.iterator(); iterator = rows.iterator();
} }
@Override @Override
public int getColumnCount() { public int getColumnCount() {
return 6; return 6;
@ -66,7 +69,7 @@ class FolderBrowserTableModel implements TableModel {
@Override @Override
public Object getElementAt(final int columnIndex) { public Object getElementAt(final int columnIndex) {
switch(columnIndex) { switch (columnIndex) {
case COL_NAME: case COL_NAME:
return currentRow.getName(); return currentRow.getName();
case COL_LANGUAGES: case COL_LANGUAGES:
@ -74,7 +77,14 @@ class FolderBrowserTableModel implements TableModel {
case COL_TITLE: case COL_TITLE:
return currentRow.getTitle(); return currentRow.getTitle();
case COL_TYPE: case COL_TYPE:
return currentRow.getType(); final String typeLabelBundle = currentRow.getTypeLabelBundle();
final String typeLabelKey = currentRow.getTypeLabelKey();
if (typeLabelKey == null) {
return new GlobalizedMessage("empty_text",
CmsConstants.CMS_BUNDLE);
} else {
return new GlobalizedMessage(typeLabelKey, typeLabelBundle);
}
case COL_CREATION_DATE: case COL_CREATION_DATE:
return currentRow.getCreated(); return currentRow.getCreated();
case COL_LAST_MODIFIED: case COL_LAST_MODIFIED:
@ -91,5 +101,5 @@ class FolderBrowserTableModel implements TableModel {
public Object getKeyAt(final int columnIndex) { public Object getKeyAt(final int columnIndex) {
return currentRow.getObjectId(); return currentRow.getObjectId();
} }
} }

View File

@ -25,6 +25,8 @@ import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder; import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
@ -37,6 +39,8 @@ import java.util.List;
class FolderBrowserTableModelBuilder extends LockableImpl class FolderBrowserTableModelBuilder extends LockableImpl
implements TableModelBuilder { implements TableModelBuilder {
private final static Logger LOGGER = LogManager.getLogger(FolderBrowserTableModelBuilder.class);
@Override @Override
public TableModel makeModel(final Table table, public TableModel makeModel(final Table table,
final PageState state) { final PageState state) {
@ -70,14 +74,17 @@ class FolderBrowserTableModelBuilder extends LockableImpl
filterTerm = null; filterTerm = null;
} }
final long start = System.currentTimeMillis();
LOGGER.debug("Retrieving table rows...");
final List<FolderBrowserTableRow> rows; final List<FolderBrowserTableRow> rows;
if (filterTerm == null) { if (filterTerm == null) {
rows = controller.getObjectRows(folder, first, pageSize); rows = controller.getObjectRows(folder, first -1, pageSize);
} else { } else {
rows = controller.getObjectRows(folder, filter, first, pageSize); rows = controller.getObjectRows(folder, filter, first- 1, pageSize);
} }
LOGGER.debug("Retrieve table rows in {} ms.",
System.currentTimeMillis() - start);
return new FolderBrowserTableModel(rows); return new FolderBrowserTableModel(rows);
} }
} }

View File

@ -30,13 +30,14 @@ import java.util.Locale;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
class FolderBrowserTableRow { class FolderBrowserTableRow {
private long objectId; private long objectId;
private String objectUuid; private String objectUuid;
private String name; private String name;
private List<Locale> languages; private List<Locale> languages;
private String title; private String title;
private String type; private String typeLabelBundle;
private String typeLabelKey;
private Date created; private Date created;
private Date lastModified; private Date lastModified;
private boolean deletable; private boolean deletable;
@ -81,28 +82,52 @@ class FolderBrowserTableRow {
this.title = title; this.title = title;
} }
public String getType() { public String getTypeLabelBundle() {
return type; return typeLabelBundle;
}
protected void setTypeLabelBundle(final String typeLabelBundle) {
this.typeLabelBundle = typeLabelBundle;
}
public String getTypeLabelKey() {
return typeLabelKey;
} }
protected void setType(final String type) { protected void setTypeLabelKey(final String typeLabelKey) {
this.type = type; this.typeLabelKey = typeLabelKey;
} }
public Date getCreated() { public Date getCreated() {
return new Date(created.getTime()); if (created == null) {
return null;
} else {
return new Date(created.getTime());
}
} }
protected void setCreated(final Date created) { protected void setCreated(final Date created) {
this.created = new Date(created.getTime()); if (created == null) {
this.created = null;
} else {
this.created = new Date(created.getTime());
}
} }
public Date getLastModified() { public Date getLastModified() {
return new Date(lastModified.getTime()); if (lastModified == null) {
return null;
} else {
return new Date(lastModified.getTime());
}
} }
protected void setLastModified(final Date lastModified) { protected void setLastModified(final Date lastModified) {
this.lastModified = new Date(lastModified.getTime()); if (lastModified == null) {
this.lastModified = null;
} else {
this.lastModified = new Date(lastModified.getTime());
}
} }
public boolean isDeletable() { public boolean isDeletable() {
@ -112,7 +137,5 @@ class FolderBrowserTableRow {
protected void setDeletable(final boolean deletable) { protected void setDeletable(final boolean deletable) {
this.deletable = deletable; this.deletable = deletable;
} }
} }

View File

@ -37,6 +37,7 @@ import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SaveCancelSection; import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.Tree; import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.ActionEvent; import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.bebop.event.ActionListener;
@ -110,11 +111,11 @@ public class FolderManipulator extends SimpleContainer implements
//public static final String RESOURCE_BUNDLE = "com.arsdigita.cms.ui.folder.CMSFolderResources"; //public static final String RESOURCE_BUNDLE = "com.arsdigita.cms.ui.folder.CMSFolderResources";
private static final Logger LOGGER = LogManager.getLogger( private static final Logger LOGGER = LogManager.getLogger(
FolderManipulator.class); FolderManipulator.class);
private static final String ATOZ_FILTER_PARAM = "aToZfilter"; private static final String ATOZ_FILTER_PARAM = "aToZfilter";
private static final String ACTION_PARAM = "act"; private static final String ACTION_PARAM = "act";
private static final String FILTER_PARAM = "filter"; private static final String FILTER_PARAM = "filter";
private static final String SOURCES_PARAM = "srcs"; private static final String SOURCES_PARAM = "srcs";
private static final String MOVE = "Move"; private static final String MOVE = "Move";
private static final String COPY = "Copy"; private static final String COPY = "Copy";
@ -139,17 +140,17 @@ public class FolderManipulator extends SimpleContainer implements
ATOZ_FILTER_PARAM); ATOZ_FILTER_PARAM);
private final StringParameter filterParam private final StringParameter filterParam
= new StringParameter(FILTER_PARAM); = new StringParameter(FILTER_PARAM);
public FolderManipulator(final FolderSelectionModel folderModel) { public FolderManipulator(final FolderSelectionModel folderModel) {
super(); super();
sourceFolderModel = folderModel; sourceFolderModel = folderModel;
itemView = new ItemView(); itemView = new ItemView();
itemView.addProcessListener(new ItemViewProcessListener()); itemView.addProcessListener(new ItemViewProcessListener());
itemView.addValidationListener(new ItemViewValidationListener()); itemView.addValidationListener(new ItemViewValidationListener());
add(itemView); add(itemView);
targetSelector.addProcessListener(new TargetSelectorProcessListener()); targetSelector.addProcessListener(new TargetSelectorProcessListener());
targetSelector.addValidationListener( targetSelector.addValidationListener(
new TargetSelectorValidationListener()); new TargetSelectorValidationListener());
@ -159,10 +160,10 @@ public class FolderManipulator extends SimpleContainer implements
//publishDialog.addProcessListener(new PublishDialogProcessListener()); //publishDialog.addProcessListener(new PublishDialogProcessListener());
} }
@Override @Override
public void register(final Page page) { public void register(final Page page) {
super.register(page); super.register(page);
page.setVisibleDefault(targetSelector, false); page.setVisibleDefault(targetSelector, false);
page.setVisibleDefault(filterForm, true); page.setVisibleDefault(filterForm, true);
@ -170,11 +171,11 @@ public class FolderManipulator extends SimpleContainer implements
page.addComponentStateParam(this, actionParam); page.addComponentStateParam(this, actionParam);
page.addComponentStateParam(this, atozFilterParam); page.addComponentStateParam(this, atozFilterParam);
page.addComponentStateParam(this, filterParam); page.addComponentStateParam(this, filterParam);
} }
public final Long[] getSources(final PageState state) { public final Long[] getSources(final PageState state) {
final Long[] result = (Long[]) state.getValue(sourcesParam); final Long[] result = (Long[]) state.getValue(sourcesParam);
//Return empty array instead of null. //Return empty array instead of null.
@ -184,19 +185,19 @@ public class FolderManipulator extends SimpleContainer implements
return result; return result;
} }
} }
public final FolderSelectionModel getSourceFolderModel() { public final FolderSelectionModel getSourceFolderModel() {
return sourceFolderModel; return sourceFolderModel;
} }
public final Category getTarget(final PageState state) { public final Category getTarget(final PageState state) {
return targetSelector.getTarget(state); return targetSelector.getTarget(state);
} }
protected final boolean isMove(final PageState state) { protected final boolean isMove(final PageState state) {
return MOVE.equals(getAction(state)); return MOVE.equals(getAction(state));
} }
protected final boolean isCopy(final PageState state) { protected final boolean isCopy(final PageState state) {
return COPY.equals(getAction(state)); return COPY.equals(getAction(state));
} }
@ -211,18 +212,18 @@ public class FolderManipulator extends SimpleContainer implements
private String getAction(final PageState state) { private String getAction(final PageState state) {
return (String) state.getValue(actionParam); return (String) state.getValue(actionParam);
} }
protected void moveItems(final Category target, protected void moveItems(final Category target,
final Long[] itemIds) { final Long[] itemIds) {
for (Long itemId : itemIds) { for (Long itemId : itemIds) {
changeItemParent(itemId, target); changeItemParent(itemId, target);
} }
} }
private void changeItemParent(final Long itemId, final Category newParent) { private void changeItemParent(final Long itemId, final Category newParent) {
//ToDo //ToDo
@ -241,7 +242,7 @@ public class FolderManipulator extends SimpleContainer implements
// item.setParent(newParent); // item.setParent(newParent);
// item.save(); // item.save();
} }
protected void copyItems(final Category target, protected void copyItems(final Category target,
final Long[] itemIds) { final Long[] itemIds) {
@ -423,53 +424,53 @@ public class FolderManipulator extends SimpleContainer implements
public final FolderBrowser getBrowser() { public final FolderBrowser getBrowser() {
return itemView.getBrowser(); return itemView.getBrowser();
} }
private class ItemViewProcessListener implements FormProcessListener { private class ItemViewProcessListener implements FormProcessListener {
public ItemViewProcessListener() { public ItemViewProcessListener() {
//Nothing //Nothing
} }
@Override @Override
public void process(final FormSectionEvent event) throws public void process(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
itemView.setVisible(state, false); itemView.setVisible(state, false);
targetSelector.setVisible(state, true); targetSelector.setVisible(state, true);
targetSelector.expose(state); targetSelector.expose(state);
} }
} }
private class TargetSelectorProcessListener implements FormProcessListener { private class TargetSelectorProcessListener implements FormProcessListener {
public TargetSelectorProcessListener() { public TargetSelectorProcessListener() {
//Nothing //Nothing
} }
@Override @Override
public void process(final FormSectionEvent event) throws public void process(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
itemView.setVisible(state, true); itemView.setVisible(state, true);
targetSelector.setVisible(state, false); targetSelector.setVisible(state, false);
final Category folder = targetSelector.getTarget(state); final Category folder = targetSelector.getTarget(state);
final Long[] itemIds = getSources(state); final Long[] itemIds = getSources(state);
if (isCopy(state)) { if (isCopy(state)) {
copyItems(folder, itemIds); copyItems(folder, itemIds);
} else if (isMove(state)) { } else if (isMove(state)) {
moveItems(folder, itemIds); moveItems(folder, itemIds);
} }
reset(state); reset(state);
} }
} }
// private class PublishDialogProcessListener implements FormProcessListener { // private class PublishDialogProcessListener implements FormProcessListener {
@ -499,43 +500,43 @@ public class FolderManipulator extends SimpleContainer implements
// //
// } // }
private class ItemViewValidationListener implements FormValidationListener { private class ItemViewValidationListener implements FormValidationListener {
public ItemViewValidationListener() { public ItemViewValidationListener() {
//Nothing //Nothing
} }
@Override @Override
public void validate(final FormSectionEvent event) throws public void validate(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final FormData data = event.getFormData(); final FormData data = event.getFormData();
if (getSources(state).length <= 0) { if (getSources(state).length <= 0) {
data.addError("cms.ui.folder.must_select_item", data.addError("cms.ui.folder.must_select_item",
CmsConstants.CMS_FOLDER_BUNDLE); CmsConstants.CMS_FOLDER_BUNDLE);
} }
} }
} }
private class TargetSelectorValidationListener implements private class TargetSelectorValidationListener implements
FormValidationListener { FormValidationListener {
public TargetSelectorValidationListener() { public TargetSelectorValidationListener() {
//Nothing //Nothing
} }
@Override @Override
public void validate(final FormSectionEvent event) throws public void validate(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
if (getSources(state).length <= 0) { if (getSources(state).length <= 0) {
throw new IllegalStateException("No source items specified"); throw new IllegalStateException("No source items specified");
} }
final Category target = targetSelector.getTarget(state); final Category target = targetSelector.getTarget(state);
final FormData data = event.getFormData(); final FormData data = event.getFormData();
if (target == null) { if (target == null) {
@ -545,7 +546,7 @@ public class FolderManipulator extends SimpleContainer implements
//If the target is null, we can skip the rest of the checks //If the target is null, we can skip the rest of the checks
return; return;
} }
if (target.equals(sourceFolderModel.getSelectedObject(state))) { if (target.equals(sourceFolderModel.getSelectedObject(state))) {
data.addError(new GlobalizedMessage( data.addError(new GlobalizedMessage(
"cms.ui.folder.not_within_same_folder", "cms.ui.folder.not_within_same_folder",
@ -562,15 +563,15 @@ public class FolderManipulator extends SimpleContainer implements
data.addError("cms.ui.folder.no_permission_for_item", data.addError("cms.ui.folder.no_permission_for_item",
CmsConstants.CMS_FOLDER_BUNDLE); CmsConstants.CMS_FOLDER_BUNDLE);
} }
for (Long source : getSources(state)) { for (Long source : getSources(state)) {
validateItem(source, target, state, data); validateItem(source, target, state, data);
} }
} }
private void validateItem(final Long itemId, private void validateItem(final Long itemId,
final Category target, final Category target,
final PageState state, final PageState state,
@ -582,20 +583,20 @@ public class FolderManipulator extends SimpleContainer implements
ContentItemManager.class); ContentItemManager.class);
final PermissionChecker permissionChecker = cdiUtil.findBean( final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class); PermissionChecker.class);
final ContentItem item = itemRepo.findById(itemId).get(); final ContentItem item = itemRepo.findById(itemId).get();
final String name = item.getDisplayName(); final String name = item.getDisplayName();
final long count = itemRepo.countByNameInFolder(target, name); final long count = itemRepo.countByNameInFolder(target, name);
if (count > 0) { if (count > 0) {
// there is an item in the target folder that already has this name // there is an item in the target folder that already has this name
addErrorMessage(data, "cms.ui.folder.item_already_exists", name); addErrorMessage(data, "cms.ui.folder.item_already_exists", name);
} }
if (itemManager.isLive(item) && isMove(state)) { if (itemManager.isLive(item) && isMove(state)) {
addErrorMessage(data, "cms.ui.folder.item_is_live", name); addErrorMessage(data, "cms.ui.folder.item_is_live", name);
} }
if (!(permissionChecker.isPermitted( if (!(permissionChecker.isPermitted(
ItemPrivileges.DELETE, item)) ItemPrivileges.DELETE, item))
&& isMove(state)) { && isMove(state)) {
@ -603,9 +604,9 @@ public class FolderManipulator extends SimpleContainer implements
name); name);
} }
} }
} }
private void addErrorMessage(final FormData data, private void addErrorMessage(final FormData data,
final String message, final String message,
final String itemName) { final String itemName) {
@ -627,31 +628,31 @@ public class FolderManipulator extends SimpleContainer implements
// } // }
private class TargetSelectorSubmissionListener implements private class TargetSelectorSubmissionListener implements
FormSubmissionListener { FormSubmissionListener {
public TargetSelectorSubmissionListener() { public TargetSelectorSubmissionListener() {
//Nothing //Nothing
} }
@Override @Override
public void submitted(final FormSectionEvent event) throws public void submitted(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
if (targetSelector.isCancelled(state)) { if (targetSelector.isCancelled(state)) {
reset(state); reset(state);
throw new FormProcessException(new GlobalizedMessage( throw new FormProcessException(new GlobalizedMessage(
"cms.ui.folder.cancelled", "cms.ui.folder.cancelled",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
} }
} }
} }
@Override @Override
public void reset(final PageState state) { public void reset(final PageState state) {
itemView.setVisible(state, true); itemView.setVisible(state, true);
itemView.reset(state); itemView.reset(state);
targetSelector.setVisible(state, false); targetSelector.setVisible(state, false);
@ -661,25 +662,25 @@ public class FolderManipulator extends SimpleContainer implements
state.setValue(sourcesParam, null); state.setValue(sourcesParam, null);
//s.setValue(m_aToZfilter, null); //s.setValue(m_aToZfilter, null);
state.setValue(filterParam, null); state.setValue(filterParam, null);
} }
// The form containing the tree to select the target folder from // The form containing the tree to select the target folder from
private class TargetSelector extends Form implements Resettable { private class TargetSelector extends Form implements Resettable {
private final FolderSelectionModel targetModel; private final FolderSelectionModel targetModel;
private final FolderTree folderTree; private final FolderTree folderTree;
private final Submit cancelButton; private final Submit cancelButton;
public TargetSelector() { public TargetSelector() {
super("targetSel", new BoxPanel()); super("targetSel", new BoxPanel());
setMethod(GET); setMethod(GET);
targetModel = new FolderSelectionModel("target"); targetModel = new FolderSelectionModel("target");
folderTree = new FolderTree(targetModel); folderTree = new FolderTree(targetModel);
folderTree.setCellRenderer(new FolderTreeCellRenderer()); folderTree.setCellRenderer(new FolderTreeCellRenderer());
final Label label = new Label(new PrintListener() { final Label label = new Label(new PrintListener() {
@Override @Override
public void prepare(final PrintEvent event) { public void prepare(final PrintEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
@ -690,9 +691,9 @@ public class FolderManipulator extends SimpleContainer implements
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryManager categoryManager = cdiUtil. final CategoryManager categoryManager = cdiUtil.
findBean(CategoryManager.class); findBean(CategoryManager.class);
if (isMove(state)) { if (isMove(state)) {
label.setLabel(new GlobalizedMessage( label.setLabel(new GlobalizedMessage(
"cms.ui.folder.move", "cms.ui.folder.move",
CmsConstants.CMS_FOLDER_BUNDLE, CmsConstants.CMS_FOLDER_BUNDLE,
@ -707,9 +708,9 @@ public class FolderManipulator extends SimpleContainer implements
folder)})); folder)}));
} }
} }
}); });
label.setOutputEscaping(false); label.setOutputEscaping(false);
add(label); add(label);
add(folderTree); add(folderTree);
@ -718,7 +719,7 @@ public class FolderManipulator extends SimpleContainer implements
cancelButton = saveCancelSection.getCancelButton(); cancelButton = saveCancelSection.getCancelButton();
add(saveCancelSection); add(saveCancelSection);
} }
@Override @Override
public void register(final Page page) { public void register(final Page page) {
super.register(page); super.register(page);
@ -744,7 +745,7 @@ public class FolderManipulator extends SimpleContainer implements
// items.close(); // items.close();
} }
} }
@Override @Override
public void reset(final PageState state) { public void reset(final PageState state) {
folderTree.clearSelection(state); folderTree.clearSelection(state);
@ -753,15 +754,15 @@ public class FolderManipulator extends SimpleContainer implements
state.setValue(folderTree.getSelectionModel().getStateParameter(), state.setValue(folderTree.getSelectionModel().getStateParameter(),
null); null);
} }
public Category getTarget(final PageState state) { public Category getTarget(final PageState state) {
return (Category) targetModel.getSelectedObject(state); return (Category) targetModel.getSelectedObject(state);
} }
public boolean isCancelled(final PageState state) { public boolean isCancelled(final PageState state) {
return cancelButton.isSelected(state); return cancelButton.isSelected(state);
} }
} }
//The form which is show for the publish and unpublish action //The form which is show for the publish and unpublish action
@ -805,26 +806,26 @@ public class FolderManipulator extends SimpleContainer implements
// The form containing the browser and the drop down for selecting an // The form containing the browser and the drop down for selecting an
// action // action
private class ItemView extends Form implements Resettable { private class ItemView extends Form implements Resettable {
private static final String ITEM_VIEW = "itemView"; private static final String ITEM_VIEW = "itemView";
private final FolderBrowser folderBrowser; private final FolderBrowser folderBrowser;
private final Paginator paginator; private final Paginator paginator;
private final OptionGroup checkboxGroup; private final OptionGroup checkboxGroup;
private final SingleSelect actionSelect; private final SingleSelect actionSelect;
private final Submit submit; private final Submit submit;
public ItemView() { public ItemView() {
super(ITEM_VIEW, new SimpleContainer()); super(ITEM_VIEW, new SimpleContainer());
setMethod(GET); setMethod(GET);
final ActionGroup group = new ActionGroup(); final ActionGroup group = new ActionGroup();
add(group); add(group);
final GridPanel panel = new GridPanel(1); final GridPanel panel = new GridPanel(1);
group.setSubject(panel); group.setSubject(panel);
folderBrowser = new FolderBrowser(sourceFolderModel); folderBrowser = new FolderBrowser(sourceFolderModel);
folderBrowser.setAtoZfilterParameter(atozFilterParam); folderBrowser.setAtoZfilterParameter(atozFilterParam);
folderBrowser.setFilterParameter(filterParam); folderBrowser.setFilterParameter(filterParam);
@ -836,20 +837,20 @@ public class FolderManipulator extends SimpleContainer implements
folderBrowser.setPaginator(paginator); folderBrowser.setPaginator(paginator);
panel.add(paginator); panel.add(paginator);
panel.add(folderBrowser); panel.add(folderBrowser);
LOGGER.debug("Adding filter form..."); LOGGER.debug("Adding filter form...");
filterForm = new FilterForm(new FolderBrowserFilterFormModelBuilder( filterForm = new FilterForm(new FolderBrowserFilterFormModelBuilder(
folderBrowser)); folderBrowser));
FolderManipulator.this.add(filterForm); FolderManipulator.this.add(filterForm);
checkboxGroup = new CheckboxGroup(sourcesParam); checkboxGroup = new CheckboxGroup(sourcesParam);
panel.add(checkboxGroup); panel.add(checkboxGroup);
panel.add(new FormErrorDisplay(this)); panel.add(new FormErrorDisplay(this));
final Container container = new SimpleContainer(); final Container container = new SimpleContainer();
group.addAction(container); group.addAction(container);
container.add(new Label(new GlobalizedMessage( container.add(new Label(new GlobalizedMessage(
"cms.ui.folder.edit_selection", "cms.ui.folder.edit_selection",
CmsConstants.CMS_FOLDER_BUNDLE))); CmsConstants.CMS_FOLDER_BUNDLE)));
@ -882,21 +883,23 @@ public class FolderManipulator extends SimpleContainer implements
// Add a new first column to the table // Add a new first column to the table
final TableColumn column = new TableColumn(); final TableColumn column = new TableColumn();
column.setHeaderValue(new GlobalizedMessage("empty_text",
CmsConstants.CMS_BUNDLE));
column.setCellRenderer(new CheckboxRenderer()); column.setCellRenderer(new CheckboxRenderer());
folderBrowser.getColumnModel().add(0, column); folderBrowser.getColumnModel().add(0, column);
} }
public final FolderBrowser getBrowser() { public final FolderBrowser getBrowser() {
return folderBrowser; return folderBrowser;
} }
public Paginator getPaginator() { public Paginator getPaginator() {
return paginator; return paginator;
} }
@Override @Override
public void reset(final PageState state) { public void reset(final PageState state) {
checkboxGroup.setValue(state, null); checkboxGroup.setValue(state, null);
actionSelect.setValue(state, null); actionSelect.setValue(state, null);
paginator.reset(state); paginator.reset(state);
@ -907,11 +910,11 @@ public class FolderManipulator extends SimpleContainer implements
// The renderer for the first column in the itemView table // The renderer for the first column in the itemView table
private class CheckboxRenderer implements TableCellRenderer { private class CheckboxRenderer implements TableCellRenderer {
public CheckboxRenderer() { public CheckboxRenderer() {
//Nothing to do //Nothing to do
} }
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
final PageState state, final PageState state,
@ -920,50 +923,49 @@ public class FolderManipulator extends SimpleContainer implements
final Object key, final Object key,
final int row, final int row,
final int column) { final int column) {
final BigDecimal n = (BigDecimal) key; final Option result = new Option(key.toString(),
Option result = new Option(sourcesParam.marshalElement(n.abs()), new Text(""));
"");
result.setGroup(checkboxGroup); result.setGroup(checkboxGroup);
return result; return result;
} }
} }
} }
protected class FilterForm extends Form implements FormProcessListener, protected class FilterForm extends Form implements FormProcessListener,
FormInitListener, FormInitListener,
FormSubmissionListener { FormSubmissionListener {
private final SimpleContainer panel; private final SimpleContainer panel;
private boolean visible; private boolean visible;
private final FilterFormModelBuilder modelBuilder; private final FilterFormModelBuilder modelBuilder;
private final TextField filterField; private final TextField filterField;
public FilterForm(final FilterFormModelBuilder modelBuilder) { public FilterForm(final FilterFormModelBuilder modelBuilder) {
super("folderFilterForm"); super("folderFilterForm");
LOGGER.debug("Creating filter form..."); LOGGER.debug("Creating filter form...");
this.modelBuilder = modelBuilder; this.modelBuilder = modelBuilder;
addProcessListener(this); addProcessListener(this);
addInitListener(this); addInitListener(this);
addSubmissionListener(this); addSubmissionListener(this);
panel = new BoxPanel(BoxPanel.HORIZONTAL); panel = new BoxPanel(BoxPanel.HORIZONTAL);
final ActionLink allLink = new ActionLink( final ActionLink allLink = new ActionLink(
new GlobalizedMessage("cms.ui.folder.filter.all", new GlobalizedMessage("cms.ui.folder.filter.all",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
allLink.addActionListener(new ActionListener() { allLink.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(final ActionEvent event) { public void actionPerformed(final ActionEvent event) {
//event.getPageState().setValue(m_aToZfilter, ""); //event.getPageState().setValue(m_aToZfilter, "");
event.getPageState().setValue(filterParam, ""); event.getPageState().setValue(filterParam, "");
} }
}); });
panel.add(allLink); panel.add(allLink);
@ -989,33 +991,33 @@ public class FolderManipulator extends SimpleContainer implements
new GlobalizedMessage( new GlobalizedMessage(
"cms.ui.folder.filter_do", "cms.ui.folder.filter_do",
CmsConstants.CMS_FOLDER_BUNDLE))); CmsConstants.CMS_FOLDER_BUNDLE)));
add(panel); add(panel);
} }
public TextField getFilterField() { public TextField getFilterField() {
return filterField; return filterField;
} }
@Override @Override
public void process(final FormSectionEvent event) throws public void process(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
//Nothing //Nothing
} }
@Override @Override
public void init(final FormSectionEvent event) throws public void init(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
//fse.getPageState().setValue(FolderManipulator.this.m_filter, null); //fse.getPageState().setValue(FolderManipulator.this.m_filter, null);
//filterField.setValue(fse.getPageState(), null); //filterField.setValue(fse.getPageState(), null);
} }
@Override @Override
public void submitted(final FormSectionEvent event) throws public void submitted(final FormSectionEvent event) throws
FormProcessException { FormProcessException {
} }
@Override @Override
public boolean isVisible(PageState state) { public boolean isVisible(PageState state) {
if (super.isVisible(state) if (super.isVisible(state)
@ -1027,13 +1029,13 @@ public class FolderManipulator extends SimpleContainer implements
return false; return false;
} }
} }
} }
protected interface FilterFormModelBuilder { protected interface FilterFormModelBuilder {
public long getFolderSize(PageState state); public long getFolderSize(PageState state);
} }
/** /**
@ -1051,7 +1053,7 @@ public class FolderManipulator extends SimpleContainer implements
// return new GlobalizedMessage(key, RESOURCE_BUNDLE, args); // return new GlobalizedMessage(key, RESOURCE_BUNDLE, args);
// } // }
private class FolderTreeCellRenderer implements TreeCellRenderer { private class FolderTreeCellRenderer implements TreeCellRenderer {
private RequestLocal m_invalidFolders = new RequestLocal(); private RequestLocal m_invalidFolders = new RequestLocal();
/** /**
@ -1119,7 +1121,7 @@ public class FolderManipulator extends SimpleContainer implements
// m_invalidFolders.set(state, invalidFolders); // m_invalidFolders.set(state, invalidFolders);
// } // }
final Label label = new Label(value.toString()); final Label label = new Label(value.toString());
if (invalidFolders.contains(key.toString())) { if (invalidFolders.contains(key.toString())) {
return label; return label;
} }
@ -1129,10 +1131,10 @@ public class FolderManipulator extends SimpleContainer implements
label.setFontWeight(Label.BOLD); label.setFontWeight(Label.BOLD);
return label; return label;
} }
return new ControlLink(label); return new ControlLink(label);
} }
} }
} }

View File

@ -24,6 +24,7 @@ import com.arsdigita.bebop.tree.TreeModel;
import com.arsdigita.bebop.tree.TreeModelBuilder; import com.arsdigita.bebop.tree.TreeModelBuilder;
import com.arsdigita.bebop.tree.TreeNode; import com.arsdigita.bebop.tree.TreeNode;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.ui.admin.applications.ApplicationInstanceTreeNode;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
@ -35,6 +36,9 @@ import java.util.Iterator;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder; import org.librecms.contentsection.Folder;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees * A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees
* containing the folder structure underneath a root folder. The root folder can * containing the folder structure underneath a root folder. The root folder can
@ -77,7 +81,7 @@ public class FolderTreeModelBuilder extends LockableImpl
} }
@Override @Override
public Iterator<Folder> getChildren(final TreeNode node, public Iterator<TreeNode> getChildren(final TreeNode node,
final PageState state) { final PageState state) {
final String nodeKey = node.getKey().toString(); final String nodeKey = node.getKey().toString();
@ -95,10 +99,21 @@ public class FolderTreeModelBuilder extends LockableImpl
final FolderTreeModelController controller = cdiUtil.findBean( final FolderTreeModelController controller = cdiUtil.findBean(
FolderTreeModelController.class); FolderTreeModelController.class);
return controller.getChildren(node); final List<Folder> subFolders = controller.getChildren(node);
return subFolders.stream()
.map(folder -> generateTreeNode(folder))
.collect(Collectors.toList())
.iterator();
} }
private TreeNode generateTreeNode(final Folder folder) {
final FolderTreeNode node = new FolderTreeNode(folder);
return node;
}
}; };
/*return new DataQueryTreeModel(getRoot(state).getID(), /*return new DataQueryTreeModel(getRoot(state).getID(),
"com.arsdigita.cms.getRootFolder", "com.arsdigita.cms.getRootFolder",

View File

@ -24,6 +24,7 @@ import org.librecms.contentsection.Folder;
import org.librecms.contentsection.FolderRepository; import org.librecms.contentsection.FolderRepository;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
@ -62,12 +63,12 @@ public class FolderTreeModelController {
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public boolean hasChildren(final TreeNode node) { public boolean hasChildren(final TreeNode node) {
return getCurrentFolder(node).getSubCategories().isEmpty(); return !getCurrentFolder(node).getSubCategories().isEmpty();
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public Iterator<Folder> getChildren(final TreeNode node) { public List<Folder> getChildren(final TreeNode node) {
return getCurrentFolder(node).getSubFolders().iterator(); return getCurrentFolder(node).getSubFolders();
} }
} }

View File

@ -55,6 +55,8 @@ import javax.persistence.TemporalType;
import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.annotations.IndexedEmbedded;
import javax.persistence.FetchType;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
/** /**
@ -187,7 +189,7 @@ public class ContentItem extends CcmObject implements Serializable {
/** /**
* The content type associated with the content item. * The content type associated with the content item.
*/ */
@OneToOne @OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTENT_TYPE_ID") @JoinColumn(name = "CONTENT_TYPE_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
// @Field // @Field
@ -245,15 +247,15 @@ public class ContentItem extends CcmObject implements Serializable {
@Column(name = "ANCESTORS", length = 1024) @Column(name = "ANCESTORS", length = 1024)
private String ancestors; private String ancestors;
@OneToMany(mappedBy = "item") @OneToMany(mappedBy = "item", fetch = FetchType.LAZY)
private List<AttachmentList> attachments; private List<AttachmentList> attachments;
@OneToOne @OneToOne()
@JoinColumn(name = "LIFECYCLE_ID") @JoinColumn(name = "LIFECYCLE_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Lifecycle lifecycle; private Lifecycle lifecycle;
@OneToOne @OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "WORKFLOW_ID") @JoinColumn(name = "WORKFLOW_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Workflow workflow; private Workflow workflow;
@ -379,7 +381,7 @@ public class ContentItem extends CcmObject implements Serializable {
int hash = super.hashCode(); int hash = super.hashCode();
hash = 59 * hash + Objects.hashCode(itemUuid); hash = 59 * hash + Objects.hashCode(itemUuid);
hash = 59 * hash + Objects.hashCode(name); hash = 59 * hash + Objects.hashCode(name);
hash = 59 * hash + Objects.hashCode(contentType); // hash = 59 * hash + Objects.hashCode(contentType);
hash = 59 * hash + Objects.hashCode(title); hash = 59 * hash + Objects.hashCode(title);
hash = 59 * hash + Objects.hashCode(description); hash = 59 * hash + Objects.hashCode(description);
hash = 59 * hash + Objects.hashCode(version); hash = 59 * hash + Objects.hashCode(version);
@ -415,9 +417,9 @@ public class ContentItem extends CcmObject implements Serializable {
if (!Objects.equals(name, other.getName())) { if (!Objects.equals(name, other.getName())) {
return false; return false;
} }
if (!Objects.equals(contentType, other.getContentType())) { // if (!Objects.equals(contentType, other.getContentType())) {
return false; // return false;
} // }
if (!Objects.equals(title, other.getTitle())) { if (!Objects.equals(title, other.getTitle())) {
return false; return false;
} }
@ -445,7 +447,7 @@ public class ContentItem extends CcmObject implements Serializable {
public String toString(final String data) { public String toString(final String data) {
return super.toString(String.format(", itemUuid = %s, " return super.toString(String.format(", itemUuid = %s, "
+ "name = %s, " + "name = %s, "
+ "contentType = { %s }, " // + "contentType = { %s }, "
+ "title = %s, " + "title = %s, "
+ "description = %s, " + "description = %s, "
+ "version = %s, " + "version = %s, "
@ -455,7 +457,7 @@ public class ContentItem extends CcmObject implements Serializable {
+ "%s", + "%s",
itemUuid, itemUuid,
Objects.toString(name), Objects.toString(name),
Objects.toString(contentType), // Objects.toString(contentType),
Objects.toString(title), Objects.toString(title),
Objects.toString(description), Objects.toString(description),
Objects.toString(version), Objects.toString(version),

View File

@ -37,6 +37,7 @@ import javax.persistence.Embedded;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.EnumType; import javax.persistence.EnumType;
import javax.persistence.Enumerated; import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.JoinTable; import javax.persistence.JoinTable;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
@ -76,7 +77,7 @@ public class ContentType extends CcmObject implements Serializable {
@Column(name = "CONTENT_ITEM_CLASS", length = 1024) @Column(name = "CONTENT_ITEM_CLASS", length = 1024)
private String contentItemClass; private String contentItemClass;
@ManyToOne @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTENT_SECTION_ID") @JoinColumn(name = "CONTENT_SECTION_ID")
private ContentSection contentSection; private ContentSection contentSection;
@ -110,11 +111,11 @@ public class ContentType extends CcmObject implements Serializable {
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private ContentTypeMode mode; private ContentTypeMode mode;
@ManyToOne @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEFAULT_LIFECYCLE_ID") @JoinColumn(name = "DEFAULT_LIFECYCLE_ID")
private LifecycleDefinition defaultLifecycle; private LifecycleDefinition defaultLifecycle;
@ManyToOne @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEFAULT_WORKFLOW") @JoinColumn(name = "DEFAULT_WORKFLOW")
private WorkflowTemplate defaultWorkflow; private WorkflowTemplate defaultWorkflow;

View File

@ -24,14 +24,11 @@ import javax.persistence.OneToOne;
import javax.persistence.Table; import javax.persistence.Table;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.core.CcmObject;
import org.librecms.CmsConstants;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.persistence.Column; import javax.persistence.Column;

View File

@ -117,3 +117,4 @@ cms.ui.new_folder=Create new folder
cms.ui.edit_folder=Rename the current folder cms.ui.edit_folder=Rename the current folder
cms.ui.authoring.create_new=Create new cms.ui.authoring.create_new=Create new
cms.ui.authoring.go=Go cms.ui.authoring.go=Go
empty_text=

View File

@ -116,3 +116,4 @@ cms.ui.new_folder=Neuen Ordner erstellen
cms.ui.edit_folder=Aktuellen Ordner umbenennen cms.ui.edit_folder=Aktuellen Ordner umbenennen
cms.ui.authoring.create_new=Neuer Inhalt cms.ui.authoring.create_new=Neuer Inhalt
cms.ui.authoring.go=Anlegen cms.ui.authoring.go=Anlegen
empty_text=

View File

@ -85,3 +85,4 @@ cms.ui.new_folder=Create new folder
cms.ui.edit_folder=Rename the current folder cms.ui.edit_folder=Rename the current folder
cms.ui.authoring.create_new=Create new cms.ui.authoring.create_new=Create new
cms.ui.authoring.go=Go cms.ui.authoring.go=Go
empty_text=

View File

@ -48,5 +48,5 @@ public interface TreeModel {
* Check whether a given node has children, passing * Check whether a given node has children, passing
* in PageState for permissioning purposes * in PageState for permissioning purposes
*/ */
Iterator getChildren(TreeNode n, PageState data); Iterator<TreeNode> getChildren(TreeNode n, PageState data);
} }

View File

@ -107,7 +107,14 @@ public class CcmObjectSelectionModel<T extends CcmObject>
@Override @Override
public Long getSelectedKey(final PageState state) { public Long getSelectedKey(final PageState state) {
return model.getSelectedKey(state); final Object key = model.getSelectedKey(state);
if (key instanceof Long) {
return (Long) key;
} else if(key instanceof String) {
return Long.parseLong((String) key);
} else {
return Long.parseLong(key.toString());
}
} }
@Override @Override

View File

@ -51,10 +51,10 @@ public class RoleMembershipMarshaller extends AbstractMarshaller<RoleMembership>
protected void insertIntoDb(RoleMembership portableObject) { protected void insertIntoDb(RoleMembership portableObject) {
// if (portableObject.getMembershipId() == 0) { // if (portableObject.getMembershipId() == 0) {
// portableObject.setMembershipId(0); portableObject.setMembershipId(0);
portableObject.setMembershipId(portableObject.getMembershipId() * -1); // portableObject.setMembershipId(portableObject.getMembershipId() * -1);
// entityManager.persist(portableObject); entityManager.persist(portableObject);
entityManager.merge(portableObject); // entityManager.merge(portableObject);
entityManager.flush(); entityManager.flush();
LOGGER.debug("Saved RoleMembership with id {}.", LOGGER.debug("Saved RoleMembership with id {}.",
portableObject.getMembershipId()); portableObject.getMembershipId());