diff --git a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml
index 853a794c1..88e77939f 100644
--- a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml
+++ b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml
@@ -10,7 +10,7 @@
-
+ -->
+
+
locale.toString())
- .map((lang) -> {
- final StringBuilder fontWeight = new StringBuilder(2);
- final StringBuilder styleClasses = new StringBuilder(20);
- if (itemManager.isLive(item)) {
- fontWeight.append(Label.BOLD);
- styleClasses.append("live ");
- }
- final Label langLabel = new Label(lang);
- langLabel.setFontWeight(fontWeight.toString().trim());
- langLabel.setClassAttr(styleClasses.toString().trim());
- return langLabel;
- })
- .forEach((langLabel) -> {
- container.add(new Link(
- langLabel,
- itemResolver.generateItemURL(state,
- item.getObjectId(),
- name,
- section,
- item.getVersion().name())));
- });
+// item.getName().getAvailableLocales().stream()
+// .map((locale) -> locale.toString())
+// .map((lang) -> {
+// final StringBuilder fontWeight = new StringBuilder(2);
+// final StringBuilder styleClasses = new StringBuilder(20);
+// if (itemManager.isLive(item)) {
+// fontWeight.append(Label.BOLD);
+// styleClasses.append("live ");
+// }
+// final Label langLabel = new Label(lang);
+// langLabel.setFontWeight(fontWeight.toString().trim());
+// langLabel.setClassAttr(styleClasses.toString().trim());
+// return langLabel;
+// })
+// .forEach((langLabel) -> {
+// container.add(new Link(
+// langLabel,
+// itemResolver.generateItemURL(state,
+// item.getObjectId(),
+// name,
+// section,
+// item.getVersion().name())));
+// });
+ @SuppressWarnings("unchecked")
+ final List availableLocales = (List) value;
+ availableLocales.forEach(locale -> container.add(new Link(
+ new Text(locale.toString()),
+ itemResolver.generateItemURL(state,
+ (long) key,
+ locale.toString(),
+ section,
+ "DRAFT"))));
return container;
}
@@ -803,5 +825,4 @@ public class FolderBrowser extends Table {
}
-
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java
index 3f86e3b29..6e3623b98 100644
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java
@@ -20,19 +20,26 @@ package com.arsdigita.cms.ui.folder;
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.core.CcmObject;
import org.libreccm.core.CcmObjectRepository;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString;
+import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager;
+import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.Folder;
+import org.librecms.contenttypes.ContentTypeInfo;
+import org.librecms.contenttypes.ContentTypesManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -50,6 +57,9 @@ import javax.transaction.Transactional;
@RequestScoped
public class FolderBrowserController {
+ private static final Logger LOGGER = LogManager.getLogger(
+ FolderBrowserController.class);
+
@Inject
private EntityManager entityManager;
@@ -64,6 +74,9 @@ public class FolderBrowserController {
@Inject
private ContentItemL10NManager itemL10NManager;
+
+ @Inject
+ private ContentTypesManager typesManager;
private Locale defaultLocale;
@@ -166,6 +179,37 @@ public class FolderBrowserController {
final String filterTerm,
final int first,
final int maxResults) {
+
+ Objects.requireNonNull(folder);
+ LOGGER.debug("Trying to find objects in folder {}...",
+ Objects.toString(folder));
+
+// final TypedQuery 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 testResult1 = testQuery1.getResultList();
+// LOGGER.debug("TestResult1: {}",
+// Objects.toString(testResult1));
+//
+// final TypedQuery 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 testResult2 = testQuery2.getResultList();
+// LOGGER.debug("TestResult2: {}",
+// Objects.toString(testResult2));
+
final TypedQuery query = entityManager.createNamedQuery(
"Folder.findObjects", CcmObject.class);
query.setParameter("folder", folder);
@@ -272,6 +316,10 @@ public class FolderBrowserController {
} else {
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 {
row.setObjectId(object.getObjectId());
row.setObjectUuid(object.getUuid());
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java
index bc6bc3fc3..c01c9a5a2 100644
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModel.java
@@ -19,6 +19,9 @@
package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.table.TableModel;
+import com.arsdigita.globalization.GlobalizedMessage;
+
+import org.librecms.CmsConstants;
import java.util.Iterator;
import java.util.List;
@@ -27,9 +30,9 @@ import javax.ws.rs.DELETE;
/**
* Table model for the {@link FolderBrowser}.
- *
+ *
* @see {FolderBrowserTableModelBuilder}
- *
+ *
* @author Jens Pelzetter
*/
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_LAST_MODIFIED = 5;
private static final int COL_DELETEABLE = 6;
-
+
private final Iterator iterator;
private FolderBrowserTableRow currentRow;
-
+
public FolderBrowserTableModel(final List rows) {
iterator = rows.iterator();
}
-
+
@Override
public int getColumnCount() {
return 6;
@@ -66,7 +69,7 @@ class FolderBrowserTableModel implements TableModel {
@Override
public Object getElementAt(final int columnIndex) {
- switch(columnIndex) {
+ switch (columnIndex) {
case COL_NAME:
return currentRow.getName();
case COL_LANGUAGES:
@@ -74,7 +77,14 @@ class FolderBrowserTableModel implements TableModel {
case COL_TITLE:
return currentRow.getTitle();
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:
return currentRow.getCreated();
case COL_LAST_MODIFIED:
@@ -91,5 +101,5 @@ class FolderBrowserTableModel implements TableModel {
public Object getKeyAt(final int columnIndex) {
return currentRow.getObjectId();
}
-
+
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java
index 82515b179..e59417a0d 100644
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableModelBuilder.java
@@ -25,6 +25,8 @@ import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
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.librecms.contentsection.Folder;
@@ -37,6 +39,8 @@ import java.util.List;
class FolderBrowserTableModelBuilder extends LockableImpl
implements TableModelBuilder {
+ private final static Logger LOGGER = LogManager.getLogger(FolderBrowserTableModelBuilder.class);
+
@Override
public TableModel makeModel(final Table table,
final PageState state) {
@@ -70,14 +74,17 @@ class FolderBrowserTableModelBuilder extends LockableImpl
filterTerm = null;
}
+ final long start = System.currentTimeMillis();
+ LOGGER.debug("Retrieving table rows...");
final List rows;
if (filterTerm == null) {
- rows = controller.getObjectRows(folder, first, pageSize);
+ rows = controller.getObjectRows(folder, first -1, pageSize);
} 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);
}
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java
index 629ff8449..6cf4508a5 100644
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserTableRow.java
@@ -30,13 +30,14 @@ import java.util.Locale;
* @author Jens Pelzetter
*/
class FolderBrowserTableRow {
-
+
private long objectId;
private String objectUuid;
private String name;
private List languages;
private String title;
- private String type;
+ private String typeLabelBundle;
+ private String typeLabelKey;
private Date created;
private Date lastModified;
private boolean deletable;
@@ -81,28 +82,52 @@ class FolderBrowserTableRow {
this.title = title;
}
- public String getType() {
- return type;
+ public String getTypeLabelBundle() {
+ return typeLabelBundle;
+ }
+
+ protected void setTypeLabelBundle(final String typeLabelBundle) {
+ this.typeLabelBundle = typeLabelBundle;
+ }
+
+ public String getTypeLabelKey() {
+ return typeLabelKey;
}
- protected void setType(final String type) {
- this.type = type;
+ protected void setTypeLabelKey(final String typeLabelKey) {
+ this.typeLabelKey = typeLabelKey;
}
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) {
- this.created = new Date(created.getTime());
+ if (created == null) {
+ this.created = null;
+ } else {
+ this.created = new Date(created.getTime());
+ }
}
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) {
- this.lastModified = new Date(lastModified.getTime());
+ if (lastModified == null) {
+ this.lastModified = null;
+ } else {
+ this.lastModified = new Date(lastModified.getTime());
+ }
}
public boolean isDeletable() {
@@ -112,7 +137,5 @@ class FolderBrowserTableRow {
protected void setDeletable(final boolean deletable) {
this.deletable = deletable;
}
-
-
-
+
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java
index 4ac86fbd4..7a4b79854 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderManipulator.java
@@ -37,6 +37,7 @@ import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table;
+import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.ActionEvent;
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";
private static final Logger LOGGER = LogManager.getLogger(
FolderManipulator.class);
-
+
private static final String ATOZ_FILTER_PARAM = "aToZfilter";
private static final String ACTION_PARAM = "act";
private static final String FILTER_PARAM = "filter";
-
+
private static final String SOURCES_PARAM = "srcs";
private static final String MOVE = "Move";
private static final String COPY = "Copy";
@@ -139,17 +140,17 @@ public class FolderManipulator extends SimpleContainer implements
ATOZ_FILTER_PARAM);
private final StringParameter filterParam
= new StringParameter(FILTER_PARAM);
-
+
public FolderManipulator(final FolderSelectionModel folderModel) {
-
+
super();
-
+
sourceFolderModel = folderModel;
itemView = new ItemView();
itemView.addProcessListener(new ItemViewProcessListener());
itemView.addValidationListener(new ItemViewValidationListener());
add(itemView);
-
+
targetSelector.addProcessListener(new TargetSelectorProcessListener());
targetSelector.addValidationListener(
new TargetSelectorValidationListener());
@@ -159,10 +160,10 @@ public class FolderManipulator extends SimpleContainer implements
//publishDialog.addProcessListener(new PublishDialogProcessListener());
}
-
+
@Override
public void register(final Page page) {
-
+
super.register(page);
page.setVisibleDefault(targetSelector, false);
page.setVisibleDefault(filterForm, true);
@@ -170,11 +171,11 @@ public class FolderManipulator extends SimpleContainer implements
page.addComponentStateParam(this, actionParam);
page.addComponentStateParam(this, atozFilterParam);
page.addComponentStateParam(this, filterParam);
-
+
}
-
+
public final Long[] getSources(final PageState state) {
-
+
final Long[] result = (Long[]) state.getValue(sourcesParam);
//Return empty array instead of null.
@@ -184,19 +185,19 @@ public class FolderManipulator extends SimpleContainer implements
return result;
}
}
-
+
public final FolderSelectionModel getSourceFolderModel() {
return sourceFolderModel;
}
-
+
public final Category getTarget(final PageState state) {
return targetSelector.getTarget(state);
}
-
+
protected final boolean isMove(final PageState state) {
return MOVE.equals(getAction(state));
}
-
+
protected final boolean isCopy(final PageState state) {
return COPY.equals(getAction(state));
}
@@ -211,18 +212,18 @@ public class FolderManipulator extends SimpleContainer implements
private String getAction(final PageState state) {
return (String) state.getValue(actionParam);
}
-
+
protected void moveItems(final Category target,
final Long[] itemIds) {
-
+
for (Long itemId : itemIds) {
-
+
changeItemParent(itemId, target);
-
+
}
-
+
}
-
+
private void changeItemParent(final Long itemId, final Category newParent) {
//ToDo
@@ -241,7 +242,7 @@ public class FolderManipulator extends SimpleContainer implements
// item.setParent(newParent);
// item.save();
}
-
+
protected void copyItems(final Category target,
final Long[] itemIds) {
@@ -423,53 +424,53 @@ public class FolderManipulator extends SimpleContainer implements
public final FolderBrowser getBrowser() {
return itemView.getBrowser();
}
-
+
private class ItemViewProcessListener implements FormProcessListener {
-
+
public ItemViewProcessListener() {
//Nothing
}
-
+
@Override
public void process(final FormSectionEvent event) throws
FormProcessException {
final PageState state = event.getPageState();
-
+
itemView.setVisible(state, false);
targetSelector.setVisible(state, true);
targetSelector.expose(state);
}
-
+
}
-
+
private class TargetSelectorProcessListener implements FormProcessListener {
-
+
public TargetSelectorProcessListener() {
//Nothing
}
-
+
@Override
public void process(final FormSectionEvent event) throws
FormProcessException {
-
+
final PageState state = event.getPageState();
-
+
itemView.setVisible(state, true);
targetSelector.setVisible(state, false);
-
+
final Category folder = targetSelector.getTarget(state);
final Long[] itemIds = getSources(state);
-
+
if (isCopy(state)) {
copyItems(folder, itemIds);
} else if (isMove(state)) {
moveItems(folder, itemIds);
}
-
+
reset(state);
-
+
}
-
+
}
// private class PublishDialogProcessListener implements FormProcessListener {
@@ -499,43 +500,43 @@ public class FolderManipulator extends SimpleContainer implements
//
// }
private class ItemViewValidationListener implements FormValidationListener {
-
+
public ItemViewValidationListener() {
//Nothing
}
-
+
@Override
public void validate(final FormSectionEvent event) throws
FormProcessException {
-
+
final PageState state = event.getPageState();
final FormData data = event.getFormData();
-
+
if (getSources(state).length <= 0) {
data.addError("cms.ui.folder.must_select_item",
CmsConstants.CMS_FOLDER_BUNDLE);
}
}
-
+
}
-
+
private class TargetSelectorValidationListener implements
FormValidationListener {
-
+
public TargetSelectorValidationListener() {
//Nothing
}
-
+
@Override
public void validate(final FormSectionEvent event) throws
FormProcessException {
-
+
final PageState state = event.getPageState();
-
+
if (getSources(state).length <= 0) {
throw new IllegalStateException("No source items specified");
}
-
+
final Category target = targetSelector.getTarget(state);
final FormData data = event.getFormData();
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
return;
}
-
+
if (target.equals(sourceFolderModel.getSelectedObject(state))) {
data.addError(new GlobalizedMessage(
"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",
CmsConstants.CMS_FOLDER_BUNDLE);
}
-
+
for (Long source : getSources(state)) {
-
+
validateItem(source, target, state, data);
-
+
}
-
+
}
-
+
private void validateItem(final Long itemId,
final Category target,
final PageState state,
@@ -582,20 +583,20 @@ public class FolderManipulator extends SimpleContainer implements
ContentItemManager.class);
final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class);
-
+
final ContentItem item = itemRepo.findById(itemId).get();
final String name = item.getDisplayName();
-
+
final long count = itemRepo.countByNameInFolder(target, name);
if (count > 0) {
// there is an item in the target folder that already has this name
addErrorMessage(data, "cms.ui.folder.item_already_exists", name);
}
-
+
if (itemManager.isLive(item) && isMove(state)) {
addErrorMessage(data, "cms.ui.folder.item_is_live", name);
}
-
+
if (!(permissionChecker.isPermitted(
ItemPrivileges.DELETE, item))
&& isMove(state)) {
@@ -603,9 +604,9 @@ public class FolderManipulator extends SimpleContainer implements
name);
}
}
-
+
}
-
+
private void addErrorMessage(final FormData data,
final String message,
final String itemName) {
@@ -627,31 +628,31 @@ public class FolderManipulator extends SimpleContainer implements
// }
private class TargetSelectorSubmissionListener implements
FormSubmissionListener {
-
+
public TargetSelectorSubmissionListener() {
//Nothing
}
-
+
@Override
public void submitted(final FormSectionEvent event) throws
FormProcessException {
-
+
final PageState state = event.getPageState();
-
+
if (targetSelector.isCancelled(state)) {
reset(state);
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.folder.cancelled",
CmsConstants.CMS_FOLDER_BUNDLE));
}
-
+
}
-
+
}
-
+
@Override
public void reset(final PageState state) {
-
+
itemView.setVisible(state, true);
itemView.reset(state);
targetSelector.setVisible(state, false);
@@ -661,25 +662,25 @@ public class FolderManipulator extends SimpleContainer implements
state.setValue(sourcesParam, null);
//s.setValue(m_aToZfilter, null);
state.setValue(filterParam, null);
-
+
}
// The form containing the tree to select the target folder from
private class TargetSelector extends Form implements Resettable {
-
+
private final FolderSelectionModel targetModel;
private final FolderTree folderTree;
private final Submit cancelButton;
-
+
public TargetSelector() {
super("targetSel", new BoxPanel());
setMethod(GET);
targetModel = new FolderSelectionModel("target");
folderTree = new FolderTree(targetModel);
folderTree.setCellRenderer(new FolderTreeCellRenderer());
-
+
final Label label = new Label(new PrintListener() {
-
+
@Override
public void prepare(final PrintEvent event) {
final PageState state = event.getPageState();
@@ -690,9 +691,9 @@ public class FolderManipulator extends SimpleContainer implements
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryManager categoryManager = cdiUtil.
findBean(CategoryManager.class);
-
+
if (isMove(state)) {
-
+
label.setLabel(new GlobalizedMessage(
"cms.ui.folder.move",
CmsConstants.CMS_FOLDER_BUNDLE,
@@ -707,9 +708,9 @@ public class FolderManipulator extends SimpleContainer implements
folder)}));
}
}
-
+
});
-
+
label.setOutputEscaping(false);
add(label);
add(folderTree);
@@ -718,7 +719,7 @@ public class FolderManipulator extends SimpleContainer implements
cancelButton = saveCancelSection.getCancelButton();
add(saveCancelSection);
}
-
+
@Override
public void register(final Page page) {
super.register(page);
@@ -744,7 +745,7 @@ public class FolderManipulator extends SimpleContainer implements
// items.close();
}
}
-
+
@Override
public void reset(final PageState state) {
folderTree.clearSelection(state);
@@ -753,15 +754,15 @@ public class FolderManipulator extends SimpleContainer implements
state.setValue(folderTree.getSelectionModel().getStateParameter(),
null);
}
-
+
public Category getTarget(final PageState state) {
return (Category) targetModel.getSelectedObject(state);
}
-
+
public boolean isCancelled(final PageState state) {
return cancelButton.isSelected(state);
}
-
+
}
//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
// action
private class ItemView extends Form implements Resettable {
-
+
private static final String ITEM_VIEW = "itemView";
-
+
private final FolderBrowser folderBrowser;
private final Paginator paginator;
private final OptionGroup checkboxGroup;
private final SingleSelect actionSelect;
private final Submit submit;
-
+
public ItemView() {
-
+
super(ITEM_VIEW, new SimpleContainer());
setMethod(GET);
-
+
final ActionGroup group = new ActionGroup();
add(group);
-
+
final GridPanel panel = new GridPanel(1);
group.setSubject(panel);
-
+
folderBrowser = new FolderBrowser(sourceFolderModel);
folderBrowser.setAtoZfilterParameter(atozFilterParam);
folderBrowser.setFilterParameter(filterParam);
@@ -836,20 +837,20 @@ public class FolderManipulator extends SimpleContainer implements
folderBrowser.setPaginator(paginator);
panel.add(paginator);
panel.add(folderBrowser);
-
+
LOGGER.debug("Adding filter form...");
filterForm = new FilterForm(new FolderBrowserFilterFormModelBuilder(
folderBrowser));
FolderManipulator.this.add(filterForm);
-
+
checkboxGroup = new CheckboxGroup(sourcesParam);
panel.add(checkboxGroup);
-
+
panel.add(new FormErrorDisplay(this));
-
+
final Container container = new SimpleContainer();
group.addAction(container);
-
+
container.add(new Label(new GlobalizedMessage(
"cms.ui.folder.edit_selection",
CmsConstants.CMS_FOLDER_BUNDLE)));
@@ -882,21 +883,23 @@ public class FolderManipulator extends SimpleContainer implements
// Add a new first column to the table
final TableColumn column = new TableColumn();
+ column.setHeaderValue(new GlobalizedMessage("empty_text",
+ CmsConstants.CMS_BUNDLE));
column.setCellRenderer(new CheckboxRenderer());
folderBrowser.getColumnModel().add(0, column);
}
-
+
public final FolderBrowser getBrowser() {
return folderBrowser;
}
-
+
public Paginator getPaginator() {
return paginator;
}
-
+
@Override
public void reset(final PageState state) {
-
+
checkboxGroup.setValue(state, null);
actionSelect.setValue(state, null);
paginator.reset(state);
@@ -907,11 +910,11 @@ public class FolderManipulator extends SimpleContainer implements
// The renderer for the first column in the itemView table
private class CheckboxRenderer implements TableCellRenderer {
-
+
public CheckboxRenderer() {
//Nothing to do
}
-
+
@Override
public Component getComponent(final Table table,
final PageState state,
@@ -920,50 +923,49 @@ public class FolderManipulator extends SimpleContainer implements
final Object key,
final int row,
final int column) {
- final BigDecimal n = (BigDecimal) key;
- Option result = new Option(sourcesParam.marshalElement(n.abs()),
- "");
+ final Option result = new Option(key.toString(),
+ new Text(""));
result.setGroup(checkboxGroup);
return result;
}
-
+
}
-
+
}
-
+
protected class FilterForm extends Form implements FormProcessListener,
FormInitListener,
FormSubmissionListener {
-
+
private final SimpleContainer panel;
private boolean visible;
private final FilterFormModelBuilder modelBuilder;
private final TextField filterField;
-
+
public FilterForm(final FilterFormModelBuilder modelBuilder) {
super("folderFilterForm");
-
+
LOGGER.debug("Creating filter form...");
-
+
this.modelBuilder = modelBuilder;
-
+
addProcessListener(this);
addInitListener(this);
addSubmissionListener(this);
-
+
panel = new BoxPanel(BoxPanel.HORIZONTAL);
-
+
final ActionLink allLink = new ActionLink(
new GlobalizedMessage("cms.ui.folder.filter.all",
CmsConstants.CMS_FOLDER_BUNDLE));
allLink.addActionListener(new ActionListener() {
-
+
@Override
public void actionPerformed(final ActionEvent event) {
//event.getPageState().setValue(m_aToZfilter, "");
event.getPageState().setValue(filterParam, "");
}
-
+
});
panel.add(allLink);
@@ -989,33 +991,33 @@ public class FolderManipulator extends SimpleContainer implements
new GlobalizedMessage(
"cms.ui.folder.filter_do",
CmsConstants.CMS_FOLDER_BUNDLE)));
-
+
add(panel);
-
+
}
-
+
public TextField getFilterField() {
return filterField;
}
-
+
@Override
public void process(final FormSectionEvent event) throws
FormProcessException {
//Nothing
}
-
+
@Override
public void init(final FormSectionEvent event) throws
FormProcessException {
//fse.getPageState().setValue(FolderManipulator.this.m_filter, null);
//filterField.setValue(fse.getPageState(), null);
}
-
+
@Override
public void submitted(final FormSectionEvent event) throws
FormProcessException {
}
-
+
@Override
public boolean isVisible(PageState state) {
if (super.isVisible(state)
@@ -1027,13 +1029,13 @@ public class FolderManipulator extends SimpleContainer implements
return false;
}
}
-
+
}
-
+
protected interface FilterFormModelBuilder {
-
+
public long getFolderSize(PageState state);
-
+
}
/**
@@ -1051,7 +1053,7 @@ public class FolderManipulator extends SimpleContainer implements
// return new GlobalizedMessage(key, RESOURCE_BUNDLE, args);
// }
private class FolderTreeCellRenderer implements TreeCellRenderer {
-
+
private RequestLocal m_invalidFolders = new RequestLocal();
/**
@@ -1119,7 +1121,7 @@ public class FolderManipulator extends SimpleContainer implements
// m_invalidFolders.set(state, invalidFolders);
// }
final Label label = new Label(value.toString());
-
+
if (invalidFolders.contains(key.toString())) {
return label;
}
@@ -1129,10 +1131,10 @@ public class FolderManipulator extends SimpleContainer implements
label.setFontWeight(Label.BOLD);
return label;
}
-
+
return new ControlLink(label);
}
-
+
}
-
+
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java
index 6c0be452f..b65d981a8 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelBuilder.java
@@ -24,6 +24,7 @@ import com.arsdigita.bebop.tree.TreeModel;
import com.arsdigita.bebop.tree.TreeModelBuilder;
import com.arsdigita.bebop.tree.TreeNode;
import com.arsdigita.cms.CMS;
+import com.arsdigita.ui.admin.applications.ApplicationInstanceTreeNode;
import org.librecms.contentsection.ContentSection;
@@ -35,6 +36,9 @@ import java.util.Iterator;
import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.contentsection.Folder;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
* A {@link com.arsdigita.bebop.tree.TreeModelBuilder} that produces trees
* containing the folder structure underneath a root folder. The root folder can
@@ -77,7 +81,7 @@ public class FolderTreeModelBuilder extends LockableImpl
}
@Override
- public Iterator getChildren(final TreeNode node,
+ public Iterator getChildren(final TreeNode node,
final PageState state) {
final String nodeKey = node.getKey().toString();
@@ -95,10 +99,21 @@ public class FolderTreeModelBuilder extends LockableImpl
final FolderTreeModelController controller = cdiUtil.findBean(
FolderTreeModelController.class);
- return controller.getChildren(node);
+ final List 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(),
"com.arsdigita.cms.getRootFolder",
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java
index 10f9afeed..e3da4068d 100644
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderTreeModelController.java
@@ -24,6 +24,7 @@ import org.librecms.contentsection.Folder;
import org.librecms.contentsection.FolderRepository;
import java.util.Iterator;
+import java.util.List;
import java.util.Optional;
import javax.enterprise.context.RequestScoped;
@@ -62,12 +63,12 @@ public class FolderTreeModelController {
@Transactional(Transactional.TxType.REQUIRED)
public boolean hasChildren(final TreeNode node) {
- return getCurrentFolder(node).getSubCategories().isEmpty();
+ return !getCurrentFolder(node).getSubCategories().isEmpty();
}
@Transactional(Transactional.TxType.REQUIRED)
- public Iterator getChildren(final TreeNode node) {
- return getCurrentFolder(node).getSubFolders().iterator();
+ public List getChildren(final TreeNode node) {
+ return getCurrentFolder(node).getSubFolders();
}
}
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java
index cf4bf2b62..ef34e1ece 100644
--- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java
@@ -55,6 +55,8 @@ import javax.persistence.TemporalType;
import org.hibernate.search.annotations.IndexedEmbedded;
+import javax.persistence.FetchType;
+
import static org.librecms.CmsConstants.*;
/**
@@ -187,7 +189,7 @@ public class ContentItem extends CcmObject implements Serializable {
/**
* The content type associated with the content item.
*/
- @OneToOne
+ @OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTENT_TYPE_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
// @Field
@@ -245,15 +247,15 @@ public class ContentItem extends CcmObject implements Serializable {
@Column(name = "ANCESTORS", length = 1024)
private String ancestors;
- @OneToMany(mappedBy = "item")
+ @OneToMany(mappedBy = "item", fetch = FetchType.LAZY)
private List attachments;
- @OneToOne
+ @OneToOne()
@JoinColumn(name = "LIFECYCLE_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Lifecycle lifecycle;
- @OneToOne
+ @OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "WORKFLOW_ID")
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
private Workflow workflow;
@@ -379,7 +381,7 @@ public class ContentItem extends CcmObject implements Serializable {
int hash = super.hashCode();
hash = 59 * hash + Objects.hashCode(itemUuid);
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(description);
hash = 59 * hash + Objects.hashCode(version);
@@ -415,9 +417,9 @@ public class ContentItem extends CcmObject implements Serializable {
if (!Objects.equals(name, other.getName())) {
return false;
}
- if (!Objects.equals(contentType, other.getContentType())) {
- return false;
- }
+// if (!Objects.equals(contentType, other.getContentType())) {
+// return false;
+// }
if (!Objects.equals(title, other.getTitle())) {
return false;
}
@@ -445,7 +447,7 @@ public class ContentItem extends CcmObject implements Serializable {
public String toString(final String data) {
return super.toString(String.format(", itemUuid = %s, "
+ "name = %s, "
- + "contentType = { %s }, "
+// + "contentType = { %s }, "
+ "title = %s, "
+ "description = %s, "
+ "version = %s, "
@@ -455,7 +457,7 @@ public class ContentItem extends CcmObject implements Serializable {
+ "%s",
itemUuid,
Objects.toString(name),
- Objects.toString(contentType),
+// Objects.toString(contentType),
Objects.toString(title),
Objects.toString(description),
Objects.toString(version),
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java
index d5f3ebd86..8ccd32037 100644
--- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentType.java
@@ -37,6 +37,7 @@ import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
@@ -76,7 +77,7 @@ public class ContentType extends CcmObject implements Serializable {
@Column(name = "CONTENT_ITEM_CLASS", length = 1024)
private String contentItemClass;
- @ManyToOne
+ @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CONTENT_SECTION_ID")
private ContentSection contentSection;
@@ -110,11 +111,11 @@ public class ContentType extends CcmObject implements Serializable {
@Enumerated(EnumType.STRING)
private ContentTypeMode mode;
- @ManyToOne
+ @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEFAULT_LIFECYCLE_ID")
private LifecycleDefinition defaultLifecycle;
- @ManyToOne
+ @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEFAULT_WORKFLOW")
private WorkflowTemplate defaultWorkflow;
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java
index 55cddedac..f9ba65413 100644
--- a/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/Folder.java
@@ -24,14 +24,11 @@ import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.libreccm.categorization.Category;
-import org.libreccm.core.CcmObject;
-import org.librecms.CmsConstants;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
-import java.util.Optional;
import java.util.stream.Collectors;
import javax.persistence.Column;
diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties
index 14bdfb568..0209b9054 100644
--- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties
+++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties
@@ -117,3 +117,4 @@ cms.ui.new_folder=Create new folder
cms.ui.edit_folder=Rename the current folder
cms.ui.authoring.create_new=Create new
cms.ui.authoring.go=Go
+empty_text=
diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties
index 3a4b0f0e8..0855fbd0e 100644
--- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties
+++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties
@@ -116,3 +116,4 @@ cms.ui.new_folder=Neuen Ordner erstellen
cms.ui.edit_folder=Aktuellen Ordner umbenennen
cms.ui.authoring.create_new=Neuer Inhalt
cms.ui.authoring.go=Anlegen
+empty_text=
diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties
index 03d9ebc0b..c8ede8383 100644
--- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties
+++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties
@@ -85,3 +85,4 @@ cms.ui.new_folder=Create new folder
cms.ui.edit_folder=Rename the current folder
cms.ui.authoring.create_new=Create new
cms.ui.authoring.go=Go
+empty_text=
diff --git a/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java b/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java
index 6819fd144..031a60253 100644
--- a/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java
+++ b/ccm-core/src/main/java/com/arsdigita/bebop/tree/TreeModel.java
@@ -48,5 +48,5 @@ public interface TreeModel {
* Check whether a given node has children, passing
* in PageState for permissioning purposes
*/
- Iterator getChildren(TreeNode n, PageState data);
+ Iterator getChildren(TreeNode n, PageState data);
}
diff --git a/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java b/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java
index 1ccefb023..26be3fb81 100644
--- a/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java
+++ b/ccm-core/src/main/java/com/arsdigita/ui/CcmObjectSelectionModel.java
@@ -107,7 +107,14 @@ public class CcmObjectSelectionModel
@Override
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
diff --git a/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java b/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java
index a4bcf549b..d691f3e5e 100644
--- a/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java
+++ b/ccm-core/src/main/java/org/libreccm/security/RoleMembershipMarshaller.java
@@ -51,10 +51,10 @@ public class RoleMembershipMarshaller extends AbstractMarshaller
protected void insertIntoDb(RoleMembership portableObject) {
// if (portableObject.getMembershipId() == 0) {
-// portableObject.setMembershipId(0);
- portableObject.setMembershipId(portableObject.getMembershipId() * -1);
-// entityManager.persist(portableObject);
- entityManager.merge(portableObject);
+ portableObject.setMembershipId(0);
+// portableObject.setMembershipId(portableObject.getMembershipId() * -1);
+ entityManager.persist(portableObject);
+// entityManager.merge(portableObject);
entityManager.flush();
LOGGER.debug("Saved RoleMembership with id {}.",
portableObject.getMembershipId());