diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentSectionPage.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentSectionPage.java
index e7cd7552f..df3d9b518 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentSectionPage.java
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/ContentSectionPage.java
@@ -35,7 +35,6 @@ import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
import com.arsdigita.cms.dispatcher.CMSPage;
-import com.arsdigita.cms.ui.assets.AssetPane;
import com.arsdigita.cms.ui.category.CategoryAdminPane;
//ToDo NG import com.arsdigita.cms.ui.category.CategoryAdminPane;
import com.arsdigita.cms.ui.cse.ContentSoonExpiredPane;
@@ -123,7 +122,7 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
private FolderAdminPane m_folderPane;
private BrowsePane m_browsePane;
private ItemSearch m_searchPane;
- private AssetPane m_assetPane;
+// private AssetPane m_assetPane;
//ToDo NG private ImagesPane m_imagesPane;
private RoleAdminPane m_rolePane;
private WorkflowAdminPane m_workflowPane;
@@ -261,13 +260,13 @@ public class ContentSectionPage extends CMSPage implements ActionListener {
return m_searchPane;
}
- protected AssetPane getAssetPane() {
- if (m_assetPane == null) {
- m_assetPane = new AssetPane();
- }
-
- return m_assetPane;
- }
+// protected AssetPane getAssetPane() {
+// if (m_assetPane == null) {
+// m_assetPane = new AssetPane();
+// }
+//
+// return m_assetPane;
+// }
// ToDo NG
// protected ImagesPane getImagesPane() {
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java
deleted file mode 100644
index 87eaae99c..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetForm.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.BoxPanel;
-import com.arsdigita.bebop.ColumnPanel;
-import com.arsdigita.bebop.Form;
-import com.arsdigita.bebop.FormProcessException;
-import com.arsdigita.bebop.Label;
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.SaveCancelSection;
-import com.arsdigita.bebop.SingleSelectionModel;
-import com.arsdigita.bebop.Text;
-import com.arsdigita.bebop.event.FormInitListener;
-import com.arsdigita.bebop.event.FormProcessListener;
-import com.arsdigita.bebop.event.FormSectionEvent;
-import com.arsdigita.bebop.event.FormSubmissionListener;
-import com.arsdigita.bebop.event.PrintEvent;
-import com.arsdigita.bebop.event.PrintListener;
-import com.arsdigita.bebop.form.Option;
-import com.arsdigita.bebop.form.SingleSelect;
-import com.arsdigita.bebop.form.Submit;
-import com.arsdigita.bebop.form.TextField;
-import com.arsdigita.globalization.GlobalizedMessage;
-import com.arsdigita.kernel.KernelConfig;
-
-import org.libreccm.cdi.utils.CdiUtil;
-import org.librecms.CmsConstants;
-import org.librecms.contentsection.Asset;
-
-import org.libreccm.core.UnexpectedErrorException;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TooManyListenersException;
-
-/**
- * Basic Form for manipulating assets.
- *
- * @author Jens Pelzetter
- * @param The type of the asset.
- */
-public abstract class AbstractAssetForm
- extends Form implements FormInitListener,
- FormProcessListener,
- FormSubmissionListener {
-
- private static final String ASSET_TITLE = "asset-name";
-
- private static final String ASSET_NAME = "asset-title";
-
- private final AssetPane assetPane;
-
- private final SingleSelectionModel selectionModel;
-
- private BoxPanel showLocalePanel;
-
- private SingleSelect showLocaleSelect;
-
- private Submit showLocaleSubmit;
-
- private BoxPanel addLocalePanel;
-
- private SingleSelect addLocaleSelect;
-
- private Submit addLocaleSubmit;
-
- private TextField name;
-
- private TextField title;
-
- private SaveCancelSection saveCancelSection;
-
- public AbstractAssetForm(final AssetPane assetPane) {
- super("asset-form", new ColumnPanel(1));
-
- this.assetPane = assetPane;
- selectionModel = assetPane.getSelectedAssetModel();
-
- initComponents();
- }
-
- private void initComponents() {
-
- showLocalePanel = new BoxPanel(BoxPanel.HORIZONTAL);
- final Label showLocaleLabel = new Label(new PrintListener() {
-
- @Override
- public void prepare(final PrintEvent event) {
- final PageState state = event.getPageState();
- final Long selectedAssetId = getSelectedAssetId(state);
- final Label target = (Label) event.getTarget();
- if (selectedAssetId == null) {
- target.setLabel(new GlobalizedMessage(
- "cms.ui.asset.initial_locale",
- CmsConstants.CMS_BUNDLE));
- } else {
- target.setLabel(new GlobalizedMessage(
- "cms.ui.asset.show_locale",
- CmsConstants.CMS_BUNDLE));
- }
- }
-
- });
- showLocaleSelect = new SingleSelect("selected-locale");
- try {
- showLocaleSelect.addPrintListener(new PrintListener() {
-
- @Override
- public void prepare(final PrintEvent event) {
- final PageState state = event.getPageState();
-
- final Long selectedAssetId = getSelectedAssetId(state);
- if (selectedAssetId == null) {
- final SingleSelect target = (SingleSelect) event
- .getTarget();
-
- target.clearOptions();
-
- final List langs = new ArrayList<>(
- KernelConfig.getConfig().getSupportedLanguages());
- langs.sort((lang1, lang2) -> lang1.compareTo(lang2));
-
- langs.forEach(lang -> {
- target.addOption(new Option(lang, new Text(lang)));
- });
- } else {
- final SingleSelect target = (SingleSelect) event
- .getTarget();
-
- target.clearOptions();
-
- final List availableLocales = getController()
- .availableLocales(selectedAssetId,
- getAssetClass());
- availableLocales.sort((locale1, locale2) -> {
- return locale1.toString().compareTo(locale2
- .toString());
- });
- availableLocales.forEach(locale -> target.addOption(
- new Option(locale.toString(),
- new Text(locale.toString()))));
- }
- }
-
- });
- } catch (TooManyListenersException ex) {
- throw new UnexpectedErrorException(ex);
- }
- showLocaleSubmit = new Submit(new GlobalizedMessage(
- "cms.ui.asset.show_locale",
- CmsConstants.CMS_BUNDLE)) {
-
- @Override
- public boolean isVisible(final PageState state) {
- return getSelectedAssetId(state) != null;
- }
-
- };
- showLocalePanel.add(showLocaleLabel);
- showLocalePanel.add(showLocaleSelect);
- showLocalePanel.add(showLocaleSubmit);
- add(showLocalePanel);
-
- addLocalePanel = new BoxPanel(BoxPanel.HORIZONTAL) {
-
- @Override
- public boolean isVisible(final PageState state) {
- return getSelectedAssetId(state) != null;
- }
-
- };
- final Label addLocaleLabel = new Label(
- new GlobalizedMessage("cms.ui.asset.add_locale",
- CmsConstants.CMS_BUNDLE));
- addLocaleSelect = new SingleSelect("add-locale-select");
- try {
- addLocaleSelect.addPrintListener(new PrintListener() {
-
- @Override
- public void prepare(final PrintEvent event) {
- final PageState state = event.getPageState();
-
- final Long selectedAssetId = getSelectedAssetId(state);
- if (selectedAssetId != null) {
- final SingleSelect target = (SingleSelect) event
- .getTarget();
-
- target.clearOptions();
-
- final List creatableLocales = getController()
- .creatableLocales(selectedAssetId,
- getAssetClass());
- creatableLocales.sort((locale1, locale2) -> {
- return locale1
- .toString()
- .compareTo(locale2.toString());
- });
- creatableLocales.forEach(locale -> target.addOption(
- new Option(locale.toString(),
- new Text(locale.toString()))));
- }
- }
-
- });
- } catch (TooManyListenersException ex) {
- throw new UnexpectedErrorException(ex);
- }
- addLocaleSubmit = new Submit(new GlobalizedMessage(
- "cms.ui.asset.add_locale",
- CmsConstants.CMS_BUNDLE));
- addLocalePanel.add(addLocaleLabel);
- addLocalePanel.add(addLocaleSelect);
- addLocalePanel.add(addLocaleSubmit);
- add(addLocalePanel);
-
- add(new Label(new GlobalizedMessage("cms.ui.asset.name",
- CmsConstants.CMS_BUNDLE)));
- name = new TextField(ASSET_NAME);
- add(name);
-
- add(new Label(new GlobalizedMessage("cms.ui.asset.title",
- CmsConstants.CMS_BUNDLE)));
- title = new TextField(ASSET_TITLE);
- add(title);
-
- addWidgets();
-
- saveCancelSection = new SaveCancelSection();
- add(saveCancelSection);
-
- addInitListener(this);
- addProcessListener(this);
- addSubmissionListener(this);
- }
-
- protected void addWidgets() {
- //Nothing here
- }
-
- protected String getTitle(final PageState state) {
- return (String) title.getValue(state);
- }
-
- protected Long getSelectedAssetId(final PageState state) {
-
- final Object key = selectionModel.getSelectedKey(state);
- if (key == null) {
- return null;
- } else {
- return (Long) key;
- }
- }
-
- @Override
- public void init(final FormSectionEvent event) throws FormProcessException {
-
- final PageState state = event.getPageState();
-
- final Long selectedAssetId = getSelectedAssetId(state);
-
- final Map data;
- if (selectedAssetId == null) {
- showLocaleSelect.setValue(state,
- KernelConfig
- .getConfig()
- .getDefaultLocale()
- .toString());
-
- data = Collections.emptyMap();
-
- } else {
-
- showLocaleSelect.setValue(state,
- getSelectedLocale(state));
-
- data = getController().getAssetData(selectedAssetId,
- getAssetClass(),
- getSelectedLocale(state));
-
- name.setValue(state,
- data.get(AbstractAssetFormController.DISPLAY_NAME));
- title.setValue(state,
- data.get(AbstractAssetFormController.TITLE));
- }
-
- initForm(state, data);
- }
-
- protected Locale getSelectedLocale(final PageState state) {
-
- final Object selected = showLocaleSelect.getValue(state);
- if (selected == null) {
- return KernelConfig.getConfig().getDefaultLocale();
- } else if (selected instanceof Locale) {
- return (Locale) selected;
- } else if (selected instanceof String) {
- return new Locale((String) selected);
- } else {
- return new Locale(selected.toString());
- }
- }
-
- protected String getTitleValue(final PageState state) {
- return (String) title.getValue(state);
- }
-
- protected void initForm(final PageState state,
- final Map data) {
-
- if (!data.isEmpty()) {
-
- name.setValue(state,
- data.get(AbstractAssetFormController.DISPLAY_NAME));
-
-// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
-// @SuppressWarnings("unchecked")
-// final AbstractAssetFormController controller = cdiUtil
-// .findBean(AbstractAssetFormController.class);
- title.setValue(state,
- data.get(AbstractAssetFormController.TITLE));
- showLocale(state);
- }
- }
-
- @Override
- public void process(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
-
-// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- if (showLocaleSubmit.isSelected(state)) {
-
- final Long selectedAssetId = getSelectedAssetId(state);
-
- initForm(state,
- getController().getAssetData(selectedAssetId,
- getAssetClass(),
- getSelectedLocale(state)));
-
- return;
- }
-
- if (addLocaleSubmit.isSelected(state)) {
- final Locale add = new Locale((String) addLocaleSelect
- .getValue(state));
- final Long selectedAssetId = getSelectedAssetId(state);
- getController().addLocale(selectedAssetId, add, getAssetClass());
- }
-
- if (saveCancelSection.getSaveButton().isSelected(state)) {
-
- final Map data = new HashMap<>();
- data.put(AbstractAssetFormController.DISPLAY_NAME,
- name.getValue(state));
- data.put(AbstractAssetFormController.TITLE,
- title.getValue(state));
- data.putAll(collectData(event));
-
- final Long selectedAssetId;
- if (getSelectedAssetId(state) == null) {
-
- selectedAssetId = getController()
- .createAsset(assetPane
- .getFolderSelectionModel()
- .getSelectedObject(state),
- getSelectedLocale(state),
- getAssetClass(),
- data);
- } else {
- selectedAssetId = getSelectedAssetId(state);
- }
-
- getController().updateAsset(selectedAssetId,
- getSelectedLocale(state),
- getAssetClass(),
- data);
-
- assetPane.browseMode(state);
- }
- }
-
- protected abstract Class getAssetClass();
-
- protected abstract void showLocale(final PageState state);
-
- protected abstract Map collectData(
- final FormSectionEvent event)
- throws FormProcessException;
-
- @Override
- public void submitted(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
-
- if (saveCancelSection.getCancelButton().isSelected(state)) {
- selectionModel.clearSelection(state);
- assetPane.browseMode(state);
- }
- }
-
- protected AssetFormController getController() {
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFormControllers controllers = cdiUtil
- .findBean(AssetFormControllers.class);
-
- return controllers.findController(getAssetClass());
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java
deleted file mode 100644
index 0fa230288..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AbstractAssetFormController.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2019 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import org.librecms.assets.AssetL10NManager;
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.AssetManager;
-import org.librecms.contentsection.AssetRepository;
-import org.librecms.contentsection.Folder;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
-
-import javax.inject.Inject;
-import javax.transaction.Transactional;
-
-/**
- * An base class for implementations of {@link AssetFormController}.
- *
- * @author Jens Pelzetter
- * @param
- */
-public abstract class AbstractAssetFormController implements
- AssetFormController {
-
- protected static final String DISPLAY_NAME = "displayName";
- protected static final String TITLE = "title";
-
- @Inject
- private AssetManager assetManager;
-
- @Inject
- private AssetRepository assetRepository;
-
- @Inject
- private AssetL10NManager l10nManager;
-
- /**
- * Retrieves the basic data of the provided asset. Subclasses should not
- * overrride this method. Instead they should provided an implementation of
- * {@link #getAssetData(org.librecms.contentsection.Asset, java.util.Locale)}.
- *
- * @param assetType The {@link Asset} from which the data is read.
- * @param selectedLocale The locale for which the data is read.
- *
- * @return A map with the data of the basic properties of the provided
- * asset.
- */
- @Transactional(Transactional.TxType.REQUIRED)
- @Override
- public Map getAssetData(final Long assetId,
- final Class assetType,
- final Locale selectedLocale) {
-
- Objects.requireNonNull(assetId, "Can't get data from asset null.");
- Objects.requireNonNull(selectedLocale,
- "Can't get data from asset for locale null.");
-
- final T asset = loadAsset(assetId, assetType);
-
- final Map data = new HashMap<>();
-
- data.put(DISPLAY_NAME, asset.getDisplayName());
- data.put(TITLE, asset.getTitle().getValue(selectedLocale));
-
- data.putAll(getAssetData(asset, selectedLocale));
-
- return data;
- }
-
- protected abstract Map getAssetData(
- final T asset, final Locale selectedLocale);
-
- @Transactional(Transactional.TxType.REQUIRED)
- @Override
- public long createAsset(final Folder infolder,
- final Locale selectedLocale,
- final Class assetType,
- final Map data) {
-
- if (!data.containsKey(DISPLAY_NAME)) {
- throw new IllegalArgumentException(
- "data does not contain a value for displayName.");
- }
-
- if (!data.containsKey(TITLE)) {
- throw new IllegalArgumentException(
- "data does not contain a value for title.");
- }
-
- final String name = (String) data.get(DISPLAY_NAME);
- final String title = (String) data.get(TITLE);
-
- final T asset = assetManager
- .createAsset(name,
- title,
- selectedLocale,
- infolder,
- assetType);
-
- return asset.getObjectId();
- }
-
- /**
- * Updates the provided asset with the provided data.
- *
- * This method is not intended to be overridden, but can't be {@code final}
- * because of limitations of CDI. To update type specific properties
- * implement
- * {@link #updateAssetProperties(org.librecms.contentsection.Asset, java.util.Locale, java.util.Map)}.
- *
- * This method calls
- * {@link AssetRepository#save(org.librecms.contentsection.Asset)} after the
- * properties are set to save the changes to the database.
- *
- * @param assetId The ID of the asset to update.
- * @param selectedLocale The locale for which the asset is updated.
- * @param data The data used to update the asset.
- */
- @Transactional(Transactional.TxType.REQUIRED)
- @Override
- public void updateAsset(final Long assetId,
- final Locale selectedLocale,
- final Class assetType,
- final Map data) {
-
- Objects.requireNonNull(selectedLocale,
- "Can't get update asset for locale null.");
- Objects.requireNonNull(data, "Can't update asset without data.");
-
- final T asset = loadAsset(assetId, assetType);
- if (data.containsKey(DISPLAY_NAME)) {
- asset.setDisplayName((String) data.get(DISPLAY_NAME));
- }
-
- if (data.containsKey(TITLE)) {
-
- final String title = (String) data.get(TITLE);
- asset.getTitle().putValue(selectedLocale, title);
- }
-
- updateAssetProperties(asset, selectedLocale, data);
-
- assetRepository.save(asset);
- }
-
- /**
- * Override this method to process data for type specific properties.
- *
- * This method is called by
- * {@link #updateAsset(org.librecms.contentsection.Asset, java.util.Locale, java.util.Map)}.
- * Implementations should not call
- * {@link AssetRepository#save}. Saving the update asset is done by
- * {@link #updateAsset(org.librecms.contentsection.Asset, java.util.Locale, java.util.Map)}.
- *
- * An implementation should not assume that a value for each property is
- * present in the provided map. Instead the overriding method should check
- * if a value for a property is available by using
- * {@link Map#containsKey(java.lang.Object)} first.
- *
- * @param asset The asset to update.
- * @param selectedLocale The locale for which the asset is updated.
- * @param data The data used to update the asset.
- */
- public abstract void updateAssetProperties(final T asset,
- final Locale selectedLocale,
- final Map data);
-
- /**
- * Determines for which locales the provided asset has data.
- *
- * @param assetId The asset.
- *
- * @return A list of all locales for which the asset has data.
- */
- @Transactional(Transactional.TxType.REQUIRED)
- @Override
- public List availableLocales(final Long assetId,
- final Class assetType) {
-
- Objects.requireNonNull(
- assetId,
- "Can't get available locales for asset with ID null.");
-
- final T selectedAsset = loadAsset(assetId, assetType);
-
- return new ArrayList<>(l10nManager.availableLocales(selectedAsset));
- }
-
- /**
- * Determines for locales the asset has no data yet.
- *
- * @param assetId The asset.
- *
- * @return A list of all locales for which the provided asset has no data
- * yet.
- */
- @Transactional(Transactional.TxType.REQUIRED)
- @Override
- public List creatableLocales(final Long assetId,
- final Class assetType) {
-
- Objects.requireNonNull(
- assetId,
- "Can't get creatable locales for asset with ID null.");
-
- final T selectedAsset = loadAsset(assetId, assetType);
-
- return new ArrayList<>(l10nManager.creatableLocales(selectedAsset));
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- @Override
- public void addLocale(final Long assetId,
- final Locale locale,
- final Class assetType) {
-
- Objects.requireNonNull(assetId, "Can't add a locale to asset null.");
- Objects.requireNonNull(locale, "Can't add locale null to an asset.");
-
- final T selectedAsset = loadAsset(assetId, assetType);
-
- l10nManager.addLanguage(selectedAsset, locale);
- }
-
- /**
- *
- * @param assetId
- * @param assetType
- *
- * @return
- */
- protected T loadAsset(final Long assetId, final Class assetType) {
-
- Objects.requireNonNull(assetId, "null is not a valid assetId");
-
- return assetRepository
- .findById(assetId, assetType)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No asset with ID %d found.", assetId)));
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowser.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowser.java
deleted file mode 100644
index b5a70488b..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowser.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.Component;
-import com.arsdigita.bebop.ControlLink;
-import com.arsdigita.bebop.Image;
-import com.arsdigita.bebop.Label;
-import com.arsdigita.bebop.Page;
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.Paginator;
-import com.arsdigita.bebop.SimpleContainer;
-import com.arsdigita.bebop.SingleSelectionModel;
-import com.arsdigita.bebop.Table;
-import com.arsdigita.bebop.Text;
-import com.arsdigita.bebop.event.TableActionAdapter;
-import com.arsdigita.bebop.event.TableActionEvent;
-import com.arsdigita.bebop.event.TableActionListener;
-import com.arsdigita.bebop.parameters.StringParameter;
-import com.arsdigita.bebop.table.DefaultTableCellRenderer;
-import com.arsdigita.bebop.table.DefaultTableColumnModel;
-import com.arsdigita.bebop.table.TableCellRenderer;
-import com.arsdigita.bebop.table.TableColumn;
-import com.arsdigita.bebop.table.TableHeader;
-import com.arsdigita.cms.CMS;
-import com.arsdigita.cms.ui.folder.FolderSelectionModel;
-import com.arsdigita.globalization.GlobalizedMessage;
-
-import java.util.Date;
-
-import org.libreccm.cdi.utils.CdiUtil;
-
-import org.librecms.CmsConstants;
-import org.librecms.contentsection.ContentSection;
-import org.librecms.contentsection.ContentSectionManager;
-
-import static org.librecms.CmsConstants.*;
-
-/**
- * Browse folder and assets.
- *
- * @author Jens Pelzetter
- */
-public class AssetFolderBrowser extends Table {
-
- protected static final String SORT_ACTION_UP = "sortActionUp";
- protected static final String SORT_ACTION_DOWN = "sortActionDown";
- protected final static String SORT_KEY_NAME = "name";
- protected final static String SORT_KEY_TITLE = "title";
- protected final static String SORT_KEY_TYPE = "type";
- protected final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
- protected final static String SORT_KEY_CREATION_DATE = "creationDate";
-
- private final AssetPane assetPane;
- private TableActionListener folderChanger;
- private TableActionListener folderDeleter;
- private TableColumn nameColumn;
- private TableColumn deleteColumn;
- private final StringParameter sortTypeParameter = new StringParameter(
- "sortType");
- private final StringParameter sortDirectionParameter = new StringParameter(
- "sortDir");
-
- private Paginator paginator;
- private long folderSize;
-
- public AssetFolderBrowser(final AssetPane assetPane) {
- super();
- sortTypeParameter.setDefaultValue(SORT_KEY_NAME);
- sortDirectionParameter.setDefaultValue(SORT_ACTION_UP);
-
- this.assetPane = assetPane;
-
- initComponents();
- }
-
- private void initComponents() {
-
- final GlobalizedMessage[] headers = {
- new GlobalizedMessage("cms.ui.folder.name",
- CMS_FOLDER_BUNDLE),
- new GlobalizedMessage("cms.ui.folder.title",
- CMS_FOLDER_BUNDLE),
- new GlobalizedMessage("cms.ui.folder.type",
- CMS_FOLDER_BUNDLE),
- new GlobalizedMessage("cms.ui.asset.thumbnail",
- CMS_BUNDLE),
- new GlobalizedMessage("cms.ui.folder.creation_date",
- CMS_FOLDER_BUNDLE),
- new GlobalizedMessage("cms.ui.folder.last_modified",
- CMS_FOLDER_BUNDLE),
- new GlobalizedMessage("cms.ui.folder.action",
- CMS_FOLDER_BUNDLE)};
-
- setModelBuilder(new AssetFolderBrowserTableModelBuilder());
- setColumnModel(new DefaultTableColumnModel(headers));
- setHeader(new TableHeader(getColumnModel()));
- setClassAttr("dataTable");
-
- getHeader().setDefaultRenderer(
- new com.arsdigita.cms.ui.util.DefaultTableCellRenderer());
-
- nameColumn = getColumn(AssetFolderBrowserTableModel.COL_NAME);
- nameColumn.setCellRenderer(new NameCellRenderer());
- nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
-
- getColumn(AssetFolderBrowserTableModel.COL_THUMBNAIL)
- .setCellRenderer(new ThumbnailCellRenderer());
-
- getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE)
- .setHeaderRenderer(
- new HeaderCellRenderer(SORT_KEY_CREATION_DATE));
- getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE)
- .setCellRenderer(new DateCellRenderer());
-
- getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED)
- .setHeaderRenderer(new HeaderCellRenderer(
- SORT_KEY_LAST_MODIFIED_DATE));
- getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED)
- .setCellRenderer(new DateCellRenderer());
-
- deleteColumn = getColumn(AssetFolderBrowserTableModel.COL_DELETEABLE);
- deleteColumn.setCellRenderer(new ActionCellRenderer());
- deleteColumn.setAlign("center");
-
- folderChanger = new FolderChanger();
- addTableActionListener(folderChanger);
-
- folderDeleter = new ItemDeleter();
- addTableActionListener(folderDeleter);
-
- setEmptyView(new Label(new GlobalizedMessage("cms.ui.folder.no_assets",
- CMS_FOLDER_BUNDLE)));
- }
-
- @Override
- public void register(final Page page) {
-
- super.register(page);
-
- page.addComponentStateParam(
- this,
- getFolderSelectionModel().getStateParameter());
- page.addComponentStateParam(this, sortTypeParameter);
- page.addComponentStateParam(this, sortDirectionParameter);
- }
-
- protected FolderSelectionModel getFolderSelectionModel() {
- return assetPane.getFolderSelectionModel();
- }
-
- protected SingleSelectionModel getSelectedAssetModel() {
- return assetPane.getSelectedAssetModel();
- }
-
- protected Paginator getPaginator() {
- return paginator;
- }
-
- protected void setPaginator(final Paginator paginator) {
- this.paginator = paginator;
- }
-
- protected String getSortType(final PageState state) {
- return (String) state.getValue(sortTypeParameter);
- }
-
- protected String getSortDirection(final PageState state) {
- return (String) state.getValue(sortDirectionParameter);
- }
-
- private class HeaderCellRenderer extends DefaultTableCellRenderer {
-
- private final String headerKey;
-
- public HeaderCellRenderer(final String headerKey) {
- super(true);
- this.headerKey = headerKey;
- }
-
- @Override
- public Component getComponent(final Table table,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final Object key,
- final int row,
- final int column) {
-
- final GlobalizedMessage headerName = (GlobalizedMessage) value;
- final String sortKey = (String) state.getValue(sortTypeParameter);
- final boolean isCurrentKey = sortKey.equals(key);
- final String currentSortDirection = (String) state
- .getValue(sortDirectionParameter);
- final String imageUrlStub;
-
- if (SORT_ACTION_UP.equals(currentSortDirection)) {
- imageUrlStub = "gray-triangle-up.gif";
- } else {
- imageUrlStub = "gray-triangle-down.gif";
- }
-
- final ControlLink link = new ControlLink(new Label(headerName)) {
-
- @Override
- public void setControlEvent(final PageState state) {
- String sortDirectionAction;
- // by default, everything sorts "up" unless it
- // is the current key and it is already pointing up
- if (SORT_ACTION_UP.equals(currentSortDirection)
- && isCurrentKey) {
- sortDirectionAction = SORT_ACTION_DOWN;
- } else {
- sortDirectionAction = SORT_ACTION_UP;
- }
- state.setControlEvent(table,
- sortDirectionAction,
- headerKey);
- }
-
- };
- final Label label = new Label();
- label.setLabel(headerName);
- label.setClassAttr("folderBrowserLink");
- label.setOutputEscaping(false);
- label.setFontWeight(Label.BOLD);
-
- final SimpleContainer container = new SimpleContainer();
- container.add(label);
- if (isCurrentKey) {
- Image image = new Image("/assets/" + imageUrlStub);
- image.setBorder("0");
- container.add(image);
- }
- link.setChild(container);
- return link;
- }
-
- }
-
- /**
- * Produce links to view an item or control links for folders to change into
- * the folder.
- */
- private class NameCellRenderer extends DefaultTableCellRenderer {
-
- public NameCellRenderer() {
- super(true);
- }
-
- @Override
- public Component getComponent(final Table table,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final Object key,
- final int row,
- final int column) {
-
- final String name = (String) value;
- final ContentSection section = CMS.getContext().
- getContentSection();
- final ContentSectionManager sectionManager = CdiUtil.
- createCdiUtil()
- .findBean(ContentSectionManager.class);
-
- final boolean isFolder = ((AssetFolderBrowserTableModel) table
- .getTableModel(state))
- .isFolder();
- final long objectId = getObjectId(key);
-
- if (isFolder) {
- //return new ControlLink(new Text(name));
- return super.getComponent(table,
- state,
- value,
- isSelected,
- objectId,
- row,
- column);
- } else {
- return new ControlLink(new Text(name));
-
-// return new Link(new Text(name),
-// itemResolver.generateItemURL(state,
-// objectId,
-// name,
-// section,
-// "DRAFT"));
- }
- }
-
- }
-
- private class ThumbnailCellRenderer implements TableCellRenderer {
-
- @Override
- public Component getComponent(final Table table,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final Object key,
- final int row,
- final int column) {
- if (value == null) {
- return new Text("");
- } else {
- final Image image = new Image((String) value, "");
- return image;
- }
- }
-
- }
-
- private class DateCellRenderer implements TableCellRenderer {
-
- @Override
- public Component getComponent(final Table table,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final Object key,
- final int row,
- final int column) {
- if (value instanceof Date) {
- final Date date = (Date) value;
- return new Text(String.format("%1$TF %1$TT", date));
- } else if (value == null) {
- return new Text("");
- } else {
- return new Text(value.toString());
- }
- }
-
- }
-
- /**
- * Produce delete links for items and non-empty folders.
- */
- private class ActionCellRenderer implements TableCellRenderer {
-
- @Override
- public Component getComponent(final Table table,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final Object key,
- final int row,
- final int column) {
- if ((!(Boolean) value)) {
- return new Label(" ", false);
- } else {
- final ControlLink link = new ControlLink(
- new Label(
- new GlobalizedMessage("cms.ui.folder.delete",
- CmsConstants.CMS_FOLDER_BUNDLE)));
- link.setConfirmation(
- new GlobalizedMessage(
- "cms.ui.folder.delete_confirmation_assets",
- CmsConstants.CMS_FOLDER_BUNDLE));
- return link;
- }
- }
-
- }
-
- // Deletes an item
- private class ItemDeleter extends TableActionAdapter {
-
- @Override
- public void cellSelected(final TableActionEvent event) {
- int col = event.getColumn();
-
- if (deleteColumn != getColumn(col)) {
- return;
- }
-
- final PageState state = event.getPageState();
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFolderBrowserController controller = cdiUtil.findBean(
- AssetFolderBrowserController.class);
- controller.deleteObject((String) event.getRowKey());
-
- ((Table) event.getSource()).clearSelection(state);
- }
-
- }
-
- private class FolderChanger extends TableActionAdapter {
-
- @Override
- public void cellSelected(final TableActionEvent event) {
- final PageState state = event.getPageState();
- final int col = event.getColumn();
-
- if (nameColumn != getColumn(col)) {
- return;
- }
-
- clearSelection(state);
- final String rowKey = (String) event.getRowKey();
- if (rowKey.startsWith(CmsConstants.FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
- getFolderSelectionModel().setSelectedKey(state,
- getObjectId(rowKey));
- } else if (rowKey.startsWith(
- CmsConstants.FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
- getSelectedAssetModel().setSelectedKey(state,
- getObjectId(rowKey));
- assetPane.editAssetMode(state);
- }
- }
-
- }
-
- private long getObjectId(final Object key) {
-
- final String keyStr = (String) key;
-
- if (keyStr.startsWith("folder-")) {
- return Long.parseLong(keyStr.substring("folder-".length()));
- } else if (keyStr.startsWith("asset-")) {
- return Long.parseLong(keyStr.substring("asset-".length()));
- } else {
- return Long.parseLong(keyStr);
- }
-
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserController.java
deleted file mode 100644
index b3ed0b26b..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserController.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.cms.CMS;
-import com.arsdigita.kernel.KernelConfig;
-import com.arsdigita.web.CCMDispatcherServlet;
-
-import org.libreccm.categorization.Category;
-import org.libreccm.categorization.CategoryManager;
-import org.libreccm.configuration.ConfigurationManager;
-import org.libreccm.l10n.GlobalizationHelper;
-import org.librecms.CmsConstants;
-import org.librecms.assets.AssetTypeInfo;
-import org.librecms.assets.AssetTypesManager;
-import org.librecms.contentsection.Asset;
-
-import org.librecms.contentsection.Folder;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-import javax.annotation.PostConstruct;
-import javax.enterprise.context.RequestScoped;
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.TypedQuery;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Join;
-import javax.persistence.criteria.Order;
-import javax.persistence.criteria.Path;
-import javax.persistence.criteria.Root;
-import javax.transaction.Transactional;
-
-import org.libreccm.core.CcmObject;
-import org.librecms.contentsection.AssetManager;
-import org.librecms.contentsection.AssetRepository;
-import org.librecms.contentsection.FolderManager;
-import org.librecms.contentsection.FolderRepository;
-
-import java.util.Collections;
-import java.util.Optional;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.librecms.assets.Image;
-
-import static org.librecms.CmsConstants.*;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@RequestScoped
-public class AssetFolderBrowserController {
-
- private static final Logger LOGGER = LogManager
- .getLogger(AssetFolderBrowserController.class);
-
- @Inject
- private EntityManager entityManager;
-
- @Inject
- private ConfigurationManager confManager;
-
- @Inject
- private CategoryManager categoryManager;
-
- @Inject
- private AssetTypesManager typesManager;
-
- @Inject
- private FolderRepository folderRepo;
-
- @Inject
- private FolderManager folderManager;
-
- @Inject
- private AssetRepository assetRepo;
-
- @Inject
- private AssetManager assetManager;
-
- @Inject
- private GlobalizationHelper globalizationHelper;
-
- private Locale defaultLocale;
-
- /**
- * Initialisation method called by the CDI-Container after an instance of
- * this class has be created by the container. Sets the
- * {@link #defaultLocale} property using the the value from the
- * {@link KernelConfig}.
- */
- @PostConstruct
- private void init() {
- final KernelConfig kernelConfig = confManager.findConfiguration(
- KernelConfig.class);
- defaultLocale = kernelConfig.getDefaultLocale();
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- List getAssetRows(final Folder folder,
- final String orderBy,
- final String orderDirection,
- final int firstResult,
- final int maxResults) {
- final List subFolders = findSubFolders(folder,
- "%",
- orderBy,
- orderDirection,
- firstResult,
- maxResults);
- final List subFolderRows = subFolders
- .stream()
- .map(subFolder -> buildRow(subFolder))
- .collect(Collectors.toList());
-
- if (subFolders.size() > maxResults) {
- return subFolderRows;
- } else {
- final int maxAssets = maxResults - subFolders.size();
- final int firstAsset = firstResult - subFolders.size();
-
- final List assets = findAssetsInFolder(folder,
- "%",
- orderBy,
- orderDirection,
- firstAsset,
- maxAssets);
- final List assetRows = assets
- .stream()
- .map(asset -> buildRow(asset))
- .collect(Collectors.toList());
-
- final List rows = new ArrayList<>();
- rows.addAll(subFolderRows);
- rows.addAll(assetRows);
-
- return rows;
- }
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- protected long countObjects(final Folder folder) {
-
- return countObjects(folder, "%");
-
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- protected long countObjects(final Folder folder, final String filterTerm) {
-
- Objects.requireNonNull(folder);
- Objects.requireNonNull(filterTerm);
-
- final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
- CriteriaQuery criteriaQuery = builder.createQuery(Long.class);
- final Root from = criteriaQuery.from(CcmObject.class);
-
- criteriaQuery = criteriaQuery.select(builder.count(from));
-
- final List subFolders = findSubFolders(
- folder,
- filterTerm,
- AssetFolderBrowser.SORT_KEY_NAME,
- AssetFolderBrowser.SORT_ACTION_UP,
- -1,
- -1);
- final List assets = findAssetsInFolder(
- folder,
- filterTerm,
- AssetFolderBrowser.SORT_KEY_NAME,
- AssetFolderBrowser.SORT_ACTION_UP,
- -1,
- -1);
-
- if (subFolders.isEmpty() && assets.isEmpty()) {
- return 0;
- } else if (subFolders.isEmpty() && !assets.isEmpty()) {
- criteriaQuery = criteriaQuery.where(from.in(assets));
- } else if (!subFolders.isEmpty() && assets.isEmpty()) {
- criteriaQuery = criteriaQuery.where(from.in(subFolders));
- } else {
- criteriaQuery = criteriaQuery.where(builder.or(
- from.in(subFolders),
- from.in(assets)));
- }
-
- return entityManager.createQuery(criteriaQuery).getSingleResult();
-
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- protected void copyObjects(final Folder targetFolder,
- final String[] objectIds) {
-
- Objects.requireNonNull(targetFolder);
- Objects.requireNonNull(objectIds);
-
- for (final String objectId : objectIds) {
- if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
- copyFolder(targetFolder,
- Long.parseLong(objectId.substring(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())));
- } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
- copyAsset(targetFolder,
- Long.parseLong(objectId.substring(
- FOLDER_BROWSER_KEY_PREFIX_ASSET.length())));
- } else {
- throw new IllegalArgumentException(String.format(
- "ID '%s' does not start with '%s' or '%s'.",
- objectId,
- FOLDER_BROWSER_KEY_PREFIX_FOLDER,
- FOLDER_BROWSER_KEY_PREFIX_ASSET));
- }
- }
-
- }
-
- private void copyFolder(final Folder targetFolder,
- final long folderId) {
-
- Objects.requireNonNull(targetFolder);
-
- final Folder folder = folderRepo.findById(folderId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No folder with ID %d in the database. "
- + "Where did that ID come from?",
- folderId)));
-
- folderManager.copyFolder(folder, targetFolder);
-
- }
-
- private void copyAsset(final Folder targetFolder,
- final long assetId) {
-
- Objects.requireNonNull(targetFolder);
-
- final Asset asset = assetRepo
- .findById(assetId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No asset ith ID %d in the database. Where did that ID come from?",
- assetId)));
-
- assetManager.copy(asset, targetFolder);
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- public void moveObjects(final Folder targetFolder,
- final String[] objectIds) {
-
- Objects.requireNonNull(targetFolder);
- Objects.requireNonNull(objectIds);
-
- for (final String objectId : objectIds) {
- if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
- moveFolder(targetFolder,
- Long.parseLong(objectId.substring(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())));
- } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
- moveAsset(targetFolder,
- Long.parseLong(objectId.substring(
- FOLDER_BROWSER_KEY_PREFIX_ASSET.length())));
- } else {
- throw new IllegalArgumentException(String.format(
- "ID '%s' does not start with '%s' or '%s'.",
- objectId,
- FOLDER_BROWSER_KEY_PREFIX_FOLDER,
- FOLDER_BROWSER_KEY_PREFIX_ASSET));
- }
- }
- }
-
- private void moveFolder(final Folder targetFolder, final long folderId) {
-
- Objects.requireNonNull(targetFolder);
-
- final Folder folder = folderRepo.findById(folderId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No folder with ID %d in the database. "
- + "Where did that ID come from?",
- folderId)));
-
- folderManager.moveFolder(folder, targetFolder);
- }
-
- private void moveAsset(final Folder targetFolder, final long assetId) {
-
- Objects.requireNonNull(targetFolder);
-
- final Asset asset = assetRepo
- .findById(assetId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No asset with ID %d in the database. Where did that ID come from?",
- assetId)));
-
- assetManager.move(asset, targetFolder);
- }
-
- @Transactional(Transactional.TxType.REQUIRED)
- protected List createInvalidTargetsList(final List sources) {
-
- Objects.requireNonNull(sources);
-
- final List sourceFolderIds = sources
- .stream()
- .filter(source -> source.startsWith(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER))
- .collect(Collectors.toList());
- final List parentFolderIds = sourceFolderIds
- .stream()
- .map(sourceFolderId -> findParentFolderId(sourceFolderId))
- .filter(Optional::isPresent)
- .map(Optional::get)
- .collect(Collectors.toList());
- final List> subFolderIds = sourceFolderIds
- .stream()
- .map(sourceFolderId -> findSubFolderIds(sourceFolderId))
- .collect(Collectors.toList());
-
- final List invalidTargetIds = new ArrayList<>();
- invalidTargetIds.addAll(sourceFolderIds);
- invalidTargetIds.addAll(parentFolderIds);
- for (final List subFolderIdList : subFolderIds) {
- invalidTargetIds.addAll(subFolderIdList);
- }
-
- return invalidTargetIds;
-
- }
-
- private Optional findParentFolderId(final String folderId) {
-
- Objects.requireNonNull(folderId);
-
- if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
- throw new IllegalArgumentException(String.format(
- "Provided string '%s' is not an ID of a folder.",
- folderId));
- }
-
- final long objectId = Long.parseLong(folderId.substring(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
- final Folder folder = folderRepo.findById(objectId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No folder with ID %d found in database. "
- + "Where did that ID come form?",
- objectId)));
- final Optional parentFolder = folderManager.getParentFolder(
- folder);
- if (parentFolder.isPresent()) {
- return Optional.empty();
- } else {
- return Optional.ofNullable(String.format(
- "%s%d",
- FOLDER_BROWSER_KEY_PREFIX_FOLDER,
- parentFolder.get().getObjectId()));
- }
- }
-
- private List findSubFolderIds(final String folderId) {
-
- Objects.requireNonNull(folderId);
-
- if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
- throw new IllegalArgumentException(String.format(
- "Provided string '%s' is not the ID of a folder.",
- folderId));
- }
-
- final long objectId = Long.parseLong(folderId.substring(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
- final Folder folder = folderRepo.findById(objectId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No folder with ID %d found in database. "
- + "Where did that ID come form?",
- objectId)));
- return findSubFolders(folder)
- .stream()
- .map(subFolder -> String.format("%s%d",
- FOLDER_BROWSER_KEY_PREFIX_FOLDER,
- subFolder.getObjectId()))
- .collect(Collectors.toList());
- }
-
- private List findSubFolders(final Folder folder) {
-
- Objects.requireNonNull(folder);
-
- if (folder.getSubFolders() == null
- || folder.getSubFolders().isEmpty()) {
- return Collections.emptyList();
- }
-
- final List subFolders = new ArrayList<>();
- for (final Folder subFolder : folder.getSubFolders()) {
- subFolders.add(subFolder);
- subFolders.addAll(findSubFolders(subFolder));
- }
-
- return subFolders;
- }
-
- /**
- * Called by the {@link AssetFolderBrowser} to delete an object.
- *
- * @param objectId
- */
- @Transactional(Transactional.TxType.REQUIRED)
- protected void deleteObject(final String objectId) {
-
- Objects.requireNonNull(objectId);
-
- if (objectId.startsWith("folder-")) {
- final long folderId = Long.parseLong(
- objectId.substring("folder-".length()));
-
- folderRepo
- .findById(folderId)
- .ifPresent(folderRepo::delete);
- } else if (objectId.startsWith("asset-")) {
- final long assetId = Long.parseLong(
- objectId.substring("asset-".length()));
-
- assetRepo
- .findById(assetId)
- .ifPresent(assetRepo::delete);
- } else {
- throw new IllegalArgumentException(
- "The objectId is expected to start with 'folder-' or 'asset-'.");
- }
- }
-
- private AssetFolderBrowserTableRow buildRow(final Folder folder) {
-
- final AssetFolderBrowserTableRow row = new AssetFolderBrowserTableRow();
-
- row.setObjectId(folder.getObjectId());
- row.setObjectUuid(folder.getUuid());
- row.setName(folder.getName());
- if (folder.getTitle().hasValue(globalizationHelper
- .getNegotiatedLocale())) {
- row.setTitle(folder.getTitle().getValue(globalizationHelper
- .getNegotiatedLocale()));
- } else {
- row.setTitle(folder.getTitle().getValue(defaultLocale));
- }
- row.setFolder(true);
- row.setDeletable(!categoryManager.hasSubCategories(folder)
- && !categoryManager.hasObjects(folder));
-
- return row;
- }
-
- private AssetFolderBrowserTableRow buildRow(final Asset asset) {
-
- final AssetFolderBrowserTableRow row = new AssetFolderBrowserTableRow();
-
- row.setObjectId(asset.getObjectId());
- row.setObjectUuid(asset.getUuid());
- row.setName(asset.getDisplayName());
- if (asset.getTitle().hasValue(globalizationHelper
- .getNegotiatedLocale())) {
- row.setTitle(asset.getTitle().getValue(globalizationHelper
- .getNegotiatedLocale()));
- } else {
- row.setTitle(asset.getTitle().getValue(defaultLocale));
- }
- if (asset instanceof Image) {
- row.setThumbnailUrl(String
- .format("%s/content-sections/%s/images/"
- + "uuid-%s?width=150&height=100",
- CCMDispatcherServlet.getContextPath(),
- CMS.getContext().getContentSection().getLabel(),
- asset.getUuid()));
- }
- final AssetTypeInfo typeInfo = typesManager
- .getAssetTypeInfo(asset.getClass());
- row.setTypeLabelBundle(typeInfo.getLabelBundle());
- row.setTypeLabelKey(typeInfo.getLabelKey());
-
- row.setFolder(false);
-
- row.setDeletable(!assetManager.isAssetInUse(asset));
-
- return row;
- }
-
- private List findSubFolders(final Folder folder,
- final String filterTerm,
- final String orderBy,
- final String orderDirection,
- final int firstResult,
- final int maxResults) {
-
- final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
-
- final CriteriaQuery criteria = builder
- .createQuery(Folder.class);
- final Root from = criteria.from(Folder.class);
-
- final Order order;
- if (AssetFolderBrowser.SORT_KEY_NAME.equals(orderBy)
- && AssetFolderBrowser.SORT_ACTION_DOWN.
- equals(orderDirection)) {
- order = builder.desc(from.get("name"));
- } else {
- order = builder.asc(from.get("name"));
- }
-
- final TypedQuery query = entityManager
- .createQuery(
- criteria.where(
- builder.and(
- builder.
- equal(from.get("parentCategory"),
- folder),
- builder.like(builder.lower(from.get(
- "name")),
- filterTerm)
- )
- )
- .orderBy(order)
- );
-
- if (firstResult >= 0) {
- query.setFirstResult(firstResult);
- }
-
- if (maxResults >= 0) {
- query.setMaxResults(maxResults);
- }
-
- return query.getResultList();
- }
-
- private List findAssetsInFolder(final Folder folder,
- final String filterTerm,
- final String orderBy,
- final String orderDirection,
- final int firstResult,
- final int maxResults) {
-
- final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
-
- final CriteriaQuery criteria = builder.createQuery(Asset.class);
- final Root fromAsset = criteria.from(Asset.class);
- final Join join = fromAsset.join("categories");
-
- final Path> orderPath;
- switch (orderBy) {
- case AssetFolderBrowser.SORT_KEY_NAME:
- orderPath = fromAsset.get("displayName");
- break;
- case AssetFolderBrowser.SORT_KEY_CREATION_DATE:
- orderPath = fromAsset.get("creationDate");
- break;
- case AssetFolderBrowser.SORT_KEY_LAST_MODIFIED_DATE:
- orderPath = fromAsset.get("lastModifed");
- break;
- default:
- orderPath = fromAsset.get("displayName");
- break;
- }
-
- final Order order;
- if (AssetFolderBrowser.SORT_ACTION_DOWN.equals(orderDirection)) {
- order = builder.desc(orderPath);
- } else {
- order = builder.asc(orderPath);
- }
-
- LOGGER.debug("The database contains {} assets.",
- entityManager.createQuery(criteria.select(fromAsset)
- .where(
- builder.and(
- builder.equal(join.get("category"),
- folder),
- builder.equal(join.get("type"),
- CmsConstants.CATEGORIZATION_TYPE_FOLDER),
- builder.like(builder.lower(
- fromAsset.get(
- "displayName")),
- filterTerm)
- ))).getResultList().size());
-
- final TypedQuery query = entityManager
- .createQuery(
- criteria.select(fromAsset)
- .where(
- builder.and(
- builder.equal(join.get(
- "category"), folder),
- builder.equal(join.get("type"),
- CmsConstants.CATEGORIZATION_TYPE_FOLDER),
- builder.like(builder.lower(
- fromAsset.get(
- "displayName")),
- filterTerm)
- )
- )
- .orderBy(order)
- );
-
- if (firstResult >= 0) {
- query.setFirstResult(firstResult);
- }
-
- if (maxResults >= 0) {
- query.setMaxResults(maxResults);
- }
-
- return query.getResultList();
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserPaginationModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserPaginationModelBuilder.java
deleted file mode 100644
index 85ea33141..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserPaginationModelBuilder.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.PaginationModelBuilder;
-import com.arsdigita.bebop.Paginator;
-import com.arsdigita.cms.ui.folder.FolderSelectionModel;
-import org.libreccm.cdi.utils.CdiUtil;
-import org.librecms.contentsection.Folder;
-
-/**
- *
- * @author Jens Pelzetter
- */
-class AssetFolderBrowserPaginationModelBuilder implements PaginationModelBuilder {
-
- private final AssetFolderBrowser folderBrowser;
-
- public AssetFolderBrowserPaginationModelBuilder(
- final AssetFolderBrowser folderBrowser) {
-
- this.folderBrowser = folderBrowser;
- }
-
- @Override
- public int getTotalSize(final Paginator paginator, final PageState state) {
-
- final FolderSelectionModel folderSelectionModel = folderBrowser
- .getFolderSelectionModel();
- final Folder folder = folderSelectionModel.getSelectedObject(state);
- if (folder == null) {
- return 0;
- } else {
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFolderBrowserController controller = cdiUtil.findBean(
- AssetFolderBrowserController.class);
- return (int) controller.countObjects(folder);
- }
- }
-
- @Override
- public boolean isVisible(final PageState state) {
- return folderBrowser != null && folderBrowser.isVisible(state);
- }
-
-
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableModel.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableModel.java
deleted file mode 100644
index 56b7a2d6a..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableModel.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.table.TableModel;
-import com.arsdigita.globalization.GlobalizedMessage;
-
-import org.librecms.CmsConstants;
-
-import java.util.Iterator;
-import java.util.List;
-
-/**
- *
- * @author Jens Pelzetter
- */
-class AssetFolderBrowserTableModel implements TableModel {
-
- protected static final int COL_NAME = 0;
- protected static final int COL_TITLE = 1;
- protected static final int COL_TYPE = 2;
- protected static final int COL_THUMBNAIL = 3;
- protected static final int COL_CREATION_DATE = 4;
- protected static final int COL_LAST_MODIFIED = 5;
- protected static final int COL_DELETEABLE = 6;
-
- private final Iterator iterator;
- private AssetFolderBrowserTableRow currentRow;
-
- public AssetFolderBrowserTableModel(
- final List rows) {
-
- iterator = rows.iterator();
- }
-
- @Override
- public int getColumnCount() {
- return 6;
- }
-
- @Override
- public boolean nextRow() {
- if (iterator.hasNext()) {
- currentRow = iterator.next();
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public Object getElementAt(final int columnIndex) {
- switch (columnIndex) {
- case COL_NAME:
- return currentRow.getName();
- case COL_TITLE:
- return currentRow.getTitle();
- case COL_TYPE:
- 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_THUMBNAIL:
- return currentRow.getThumbnailUrl();
- case COL_CREATION_DATE:
- return currentRow.getCreated();
- case COL_LAST_MODIFIED:
- return currentRow.getLastModified();
- case COL_DELETEABLE:
- return currentRow.isDeletable();
- default:
- throw new IllegalArgumentException(String.format(
- "Illegal column index %d.", columnIndex));
- }
- }
-
- @Override
- public Object getKeyAt(final int columnIndex) {
- if (currentRow.isFolder()) {
- return String.format("folder-%d", currentRow.getObjectId());
- } else {
- return String.format("asset-%d", currentRow.getObjectId());
- }
- }
-
- public boolean isFolder() {
- return currentRow.isFolder();
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableModelBuilder.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableModelBuilder.java
deleted file mode 100644
index afbf71efd..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableModelBuilder.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.Paginator;
-import com.arsdigita.bebop.Table;
-import com.arsdigita.bebop.table.TableModel;
-import com.arsdigita.bebop.table.TableModelBuilder;
-import com.arsdigita.cms.ui.folder.FolderSelectionModel;
-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;
-
-import java.util.List;
-
-/**
- * Creates the {@link TableModel} for the {@link AssetFolderBrowser}.
- *
- * @author Jens Pelzetter
- */
-class AssetFolderBrowserTableModelBuilder
- extends LockableImpl
- implements TableModelBuilder {
-
- private static final Logger LOGGER = LogManager
- .getLogger(AssetFolderBrowserTableModelBuilder.class);
-
- @Override
- public TableModel makeModel(final Table table,
- final PageState state) {
-
- if (!(table instanceof AssetFolderBrowser)) {
- throw new IllegalArgumentException(
- "The AssetFolderBrowserTableModelBuilder can only be used "
- + "for the AssetFolderBrowser.");
- }
-
- final AssetFolderBrowser assetFolderBrowser = (AssetFolderBrowser) table;
- final FolderSelectionModel folderSelectionModel = assetFolderBrowser
- .getFolderSelectionModel();
- final Folder folder = folderSelectionModel.getSelectedObject(state);
- if (folder == null) {
- return Table.EMPTY_MODEL;
- } else {
- assetFolderBrowser.getRowSelectionModel().clearSelection(state);
- final Paginator paginator = assetFolderBrowser.getPaginator();
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFolderBrowserController controller = cdiUtil
- .findBean(AssetFolderBrowserController.class);
- final String orderBy;
- if (assetFolderBrowser.getSortType(state) == null) {
- orderBy = AssetFolderBrowser.SORT_KEY_NAME;
- } else {
- orderBy = assetFolderBrowser.getSortType(state);
- }
- final String orderDirection;
- if (assetFolderBrowser.getSortDirection(state) == null) {
- orderDirection = AssetFolderBrowser.SORT_ACTION_UP;
- } else {
- orderDirection = assetFolderBrowser.getSortDirection(state);
- }
- final int first = paginator.getFirst(state);
- final int pageSize = paginator.getPageSize(state);
-
- final long start = System.nanoTime();
- LOGGER.debug("Retrieving table rows...");
- final List rows = controller
- .getAssetRows(folder,
- orderBy,
- orderDirection,
- first - 1,
- pageSize);
-
- LOGGER.debug("Retrieve table rows in {} ms.",
- (System.nanoTime() - start) / 1000);
- return new AssetFolderBrowserTableModel(rows);
-
- }
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableRow.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableRow.java
deleted file mode 100644
index 045a35093..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFolderBrowserTableRow.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import java.util.Date;
-
-/**
- *
- * @author Jens Pelzetter
- */
-class AssetFolderBrowserTableRow {
-
- private long objectId;
- private String objectUuid;
- private String name;
- private String title;
- private String thumbnailUrl;
- private String typeLabelBundle;
- private String typeLabelKey;
- private Date created;
- private Date lastModified;
- private boolean deletable;
- private boolean folder;
-
- public long getObjectId() {
- return objectId;
- }
-
- public void setObjectId(final long objectId) {
- this.objectId = objectId;
- }
-
- public String getObjectUuid() {
- return objectUuid;
- }
-
- public void setObjectUuid(final String objectUuid) {
- this.objectUuid = objectUuid;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(final String name) {
- this.name = name;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(final String title) {
- this.title = title;
- }
-
- public String getThumbnailUrl() {
- return thumbnailUrl;
- }
-
- public void setThumbnailUrl(final String thumbnailUrl) {
- this.thumbnailUrl = thumbnailUrl;
- }
-
- public String getTypeLabelBundle() {
- return typeLabelBundle;
- }
-
- public void setTypeLabelBundle(final String typeLabelBundle) {
- this.typeLabelBundle = typeLabelBundle;
- }
-
- public String getTypeLabelKey() {
- return typeLabelKey;
- }
-
- public void setTypeLabelKey(final String typeLabelKey) {
- this.typeLabelKey = typeLabelKey;
- }
-
- public Date getCreated() {
- if (created == null) {
- return null;
- } else {
- return new Date(created.getTime());
- }
- }
-
- protected void setCreated(final Date created) {
- if (created == null) {
- this.created = null;
- } else {
- this.created = new Date(created.getTime());
- }
- }
-
- public Date getLastModified() {
- if (lastModified == null) {
- return null;
- } else {
- return new Date(lastModified.getTime());
- }
- }
-
- protected void setLastModified(final Date lastModified) {
- if (lastModified == null) {
- this.lastModified = null;
- } else {
- this.lastModified = new Date(lastModified.getTime());
- }
- }
-
- public boolean isDeletable() {
- return deletable;
- }
-
- public void setDeletable(final boolean deletable) {
- this.deletable = deletable;
- }
-
- public boolean isFolder() {
- return folder;
- }
-
- public void setFolder(final boolean folder) {
- this.folder = folder;
- }
-
-
-
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java
deleted file mode 100644
index c188d613a..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormController.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.Folder;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- *
- * Interface for the CDI backend for the forms to manage assets.To avoid
- * problems with transactions etc.
- *
- * the Bebop based forms should access any other CDI beans beside the
- * approbriate implementation of this interface. To minimize the efford to
- * create an implementation the {@link AbstractAssetFormController} class should
- * be used. This class provides basic implementations for most methods.
- *
- * Implementations of the methods defined by this interface should annotated
- * with {@code @Transactional(Transactional.TxType.REQUIRED)}.
- *
- * @author Jens Pelzetter
- *
- * @param The type asset managed by this controller.
- */
-public interface AssetFormController {
-
- /**
- * Gets the data for the forms from the asset.
- *
- * @param assetId The ID of the asset.
- * @param assetType
- * @param selectedLocale The selected locale
- *
- * @return The values of the properties of the asset for the the selected
- * locale.
- */
- Map getAssetData(Long assetId,
- Class assetType,
- Locale selectedLocale);
-
- /**
- * Updates the asset with the provided data and saves the changes.
- *
- * @param assetId
- * @param selectedLocale
- * @param assetType
- * @param data
- */
- void updateAsset(Long assetId,
- Locale selectedLocale,
- Class assetType,
- Map data);
-
- long createAsset(Folder inFolder,
- Locale selectedLocale,
- Class assetType,
- Map data);
-
-
-
- /**
- * Determines in which locales the provided asset is available.
- *
- *
- * @param assetId
- * @param assetType
- *
- * @return A list of the locales for which the asset has data.
- */
- List availableLocales(Long assetId, Class assetType);
-
- /**
- * Determines for which the provided asset has no data.
- *
- *
- * @param assetId
- * @param assetType
- *
- * @return A list of the locales for which the asset has data yet.
- */
- List creatableLocales(Long assetId, Class assetType);
-
- void addLocale(final Long assetId,
- final Locale locale,
- final Class assetType);
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormControllers.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormControllers.java
deleted file mode 100644
index 8fa79557f..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetFormControllers.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2019 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import org.librecms.contentsection.Asset;
-
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.inject.Any;
-import javax.enterprise.inject.Instance;
-import javax.enterprise.util.AnnotationLiteral;
-import javax.inject.Inject;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@RequestScoped
-public class AssetFormControllers {
-
- @Inject
- @Any
- private Instance> controllers;
-
- @SuppressWarnings("unchecked")
- public AssetFormController findController(
- final Class assetType) {
-
- final IsControllerForAssetTypeLiteral literal
- = new IsControllerForAssetTypeLiteral(
- assetType);
-
- final Instance> instance = controllers
- .select(literal);
-
- if (instance.isUnsatisfied()) {
- throw new IllegalArgumentException(String.format(
- "No controller for asset type \"%s\".",
- assetType.getClass().getName()));
- } else {
- return (AssetFormController) instance.iterator().next();
- }
- }
-
- private class IsControllerForAssetTypeLiteral
- extends AnnotationLiteral
- implements IsControllerForAssetType {
-
- private static final long serialVersionUID = 1L;
-
- private final Class extends Asset> assetType;
-
- public IsControllerForAssetTypeLiteral(
- final Class extends Asset> assetType) {
-
- this.assetType = assetType;
- }
-
- @Override
- public Class extends Asset> value() {
-
- return assetType;
- }
-
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetPane.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetPane.java
deleted file mode 100644
index 02c3d87d5..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetPane.java
+++ /dev/null
@@ -1,1229 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.ActionLink;
-import com.arsdigita.bebop.BoxPanel;
-import com.arsdigita.bebop.Component;
-import com.arsdigita.bebop.ControlLink;
-import com.arsdigita.bebop.Form;
-import com.arsdigita.bebop.FormData;
-import com.arsdigita.bebop.FormProcessException;
-import com.arsdigita.bebop.Label;
-import com.arsdigita.bebop.MetaForm;
-import com.arsdigita.bebop.Page;
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.Paginator;
-import com.arsdigita.bebop.ParameterSingleSelectionModel;
-import com.arsdigita.bebop.RequestLocal;
-import com.arsdigita.bebop.Resettable;
-import com.arsdigita.bebop.SaveCancelSection;
-import com.arsdigita.bebop.SegmentedPanel;
-import com.arsdigita.bebop.SimpleContainer;
-import com.arsdigita.bebop.SingleSelectionModel;
-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;
-import com.arsdigita.bebop.event.FormProcessListener;
-import com.arsdigita.bebop.event.FormSectionEvent;
-import com.arsdigita.bebop.event.FormSubmissionListener;
-import com.arsdigita.bebop.event.FormValidationListener;
-import com.arsdigita.bebop.event.PrintEvent;
-import com.arsdigita.bebop.event.PrintListener;
-import com.arsdigita.bebop.form.CheckboxGroup;
-import com.arsdigita.bebop.form.FormErrorDisplay;
-import com.arsdigita.bebop.form.Option;
-import com.arsdigita.bebop.form.SingleSelect;
-import com.arsdigita.bebop.form.Submit;
-import com.arsdigita.bebop.parameters.ArrayParameter;
-import com.arsdigita.bebop.parameters.LongParameter;
-import com.arsdigita.bebop.parameters.StringParameter;
-import com.arsdigita.bebop.table.TableCellRenderer;
-import com.arsdigita.bebop.table.TableColumn;
-import com.arsdigita.bebop.tree.TreeCellRenderer;
-import com.arsdigita.cms.CMS;
-import com.arsdigita.cms.ui.BaseTree;
-import com.arsdigita.cms.ui.folder.FolderCreateForm;
-import com.arsdigita.cms.ui.folder.FolderEditorForm;
-import com.arsdigita.cms.ui.folder.FolderRequestLocal;
-import com.arsdigita.cms.ui.folder.FolderSelectionModel;
-import com.arsdigita.cms.ui.folder.FolderTreeModelBuilder;
-import com.arsdigita.cms.ui.folder.FolderTreeModelController;
-import com.arsdigita.cms.ui.permissions.CMSPermissionsPane;
-import com.arsdigita.globalization.GlobalizedMessage;
-import com.arsdigita.toolbox.ui.ActionGroup;
-import com.arsdigita.toolbox.ui.LayoutPanel;
-import com.arsdigita.ui.CcmObjectSelectionModel;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.libreccm.categorization.Category;
-import org.libreccm.cdi.utils.CdiUtil;
-import org.librecms.CmsConstants;
-import org.librecms.contentsection.ContentSection;
-import org.librecms.contentsection.Folder;
-
-import java.util.List;
-
-import org.librecms.CMSConfig;
-import org.libreccm.categorization.CategoryManager;
-import org.libreccm.core.CcmObject;
-import org.libreccm.core.UnexpectedErrorException;
-import org.libreccm.security.PermissionChecker;
-import org.libreccm.security.PermissionManager;
-import org.librecms.assets.AssetTypeInfo;
-import org.librecms.assets.AssetTypesManager;
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.AssetManager;
-import org.librecms.contentsection.AssetRepository;
-import org.librecms.contentsection.FolderManager;
-import org.librecms.contentsection.FolderRepository;
-import org.librecms.contentsection.privileges.AssetPrivileges;
-import org.librecms.contentsection.privileges.ItemPrivileges;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.ResourceBundle;
-import java.util.TooManyListenersException;
-
-import static org.librecms.CmsConstants.*;
-
-/**
- *
- * @author Jens Pelzetter
- */
-public class AssetPane extends LayoutPanel implements Resettable {
-
- private static final Logger LOGGER = LogManager.getLogger(AssetPane.class);
-
- public static final String SET_FOLDER = "set_folder";
- private static final String SOURCES_PARAM = "sources";
- private static final String ACTION_PARAM = "action";
- private static final String MOVE = "Move";
- private static final String COPY = "Copy";
-
- private final BaseTree tree;
- private final SingleSelectionModel selectionModel;
- private final FolderSelectionModel folderSelectionModel;
- private final FolderRequestLocal folderRequestLocal;
- private final SingleSelectionModel selectedAssetModel;
- private final ArrayParameter sourcesParameter = new ArrayParameter(
- new StringParameter(SOURCES_PARAM));
- private final StringParameter actionParameter = new StringParameter(
- ACTION_PARAM);
- private final StringParameter selectedAssetTypeParam = new StringParameter(
- "selected_asset_type");
-
- private AssetFolderBrowser folderBrowser;
- private Form browserForm;
- private SingleSelect actionSelect;
- private Submit actionSubmit;
- private TargetSelector targetSelector;
-
- private SegmentedPanel.Segment browseSegment;
-// private SegmentedPanel.Segment currentFolderSegment;
- private SegmentedPanel.Segment actionsSegment;
- private SegmentedPanel.Segment newFolderSegment;
- private SegmentedPanel.Segment editFolderSegment;
- private SegmentedPanel.Segment editAssetSegment;
- private SegmentedPanel.Segment folderPermissionsSegment;
-
- @SuppressWarnings("unchecked")
- public AssetPane() {
- tree = new BaseTree(new FolderTreeModelBuilder() {
-
- @Override
- protected Folder getRootFolder(final PageState state) {
- final ContentSection section = CMS
- .getContext()
- .getContentSection();
- return section.getRootAssetsFolder();
- }
-
- });
- selectionModel = tree.getSelectionModel();
- folderSelectionModel = new FolderSelectionModel(selectionModel) {
-
- @Override
- protected Long getRootFolderID(final PageState state) {
- final ContentSection section = CMS
- .getContext()
- .getContentSection();
- return section.getRootAssetsFolder().getObjectId();
- }
-
- };
- folderRequestLocal = new FolderRequestLocal(folderSelectionModel);
-
- selectedAssetModel = new ParameterSingleSelectionModel<>(
- new LongParameter("selected-asset"));
-
- final SegmentedPanel left = new SegmentedPanel();
- setLeft(left);
-
- final Label heading = new Label(
- new GlobalizedMessage("cms.ui.folder_browser",
- CmsConstants.CMS_BUNDLE));
- left.addSegment(heading, tree);
-
-// final Text placeholder = new Text("Placeholder");
- setBody(createBrowserPane());
-
- }
-
- private SimpleContainer createBrowserPane() {
-
- final SegmentedPanel panel = new SegmentedPanel();
-
- browseSegment = panel.addSegment();
- browserForm = new Form("assetFolderBrowser",
- new BoxPanel(BoxPanel.VERTICAL));
- browserForm.setMethod(Form.GET);
- folderBrowser = new AssetFolderBrowser(this);
- final Paginator paginator = new Paginator(
- new AssetFolderBrowserPaginationModelBuilder(folderBrowser),
- CMSConfig.getConfig().getFolderBrowseListSize());
- folderBrowser.setPaginator(paginator);
-
- final CheckboxGroup checkboxGroup = new CheckboxGroup(sourcesParameter);
- browserForm.add(checkboxGroup);
- final TableColumn checkboxCol = new TableColumn();
- checkboxCol.setHeaderValue(
- new GlobalizedMessage("empty_text", CmsConstants.CMS_BUNDLE));
- checkboxCol.setCellRenderer(new TableCellRenderer() {
-
- @Override
- public Component getComponent(final Table table,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final Object key,
- final int row,
- final int column) {
-
- final Option result = new Option(key.toString(),
- new Text(""));
- result.setGroup(checkboxGroup);
- return result;
- }
-
- });
- folderBrowser.getColumnModel().add(0, checkboxCol);
-
- browserForm.add(paginator);
- browserForm.add(folderBrowser);
- final SimpleContainer actionFormContainer = new SimpleContainer();
- actionFormContainer.add(new Label(
- new GlobalizedMessage(
- "cms.ui.folder.edit_selection",
- CmsConstants.CMS_FOLDER_BUNDLE)));
- actionSelect = new SingleSelect(actionParameter);
- actionSelect.addOption(
- new Option(COPY,
- new Label(new GlobalizedMessage(
- "cms.ui.folder.copy.action",
- CmsConstants.CMS_FOLDER_BUNDLE))));
- actionSelect.addOption(
- new Option(MOVE,
- new Label(new GlobalizedMessage(
- "cms.ui.folder.move.action",
- CmsConstants.CMS_FOLDER_BUNDLE))));
- actionFormContainer.add(actionSelect);
- actionSubmit = new Submit(
- "Go",
- new GlobalizedMessage("cms.ui.folder.go",
- CmsConstants.CMS_FOLDER_BUNDLE));
- actionFormContainer.add(actionSubmit);
- browserForm.addProcessListener(new FormProcessListener() {
-
- @Override
- public void process(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
-
- moveCopyMode(state);
-
- }
-
- });
- browserForm.add(actionFormContainer);
-
- targetSelector = new TargetSelector();
- targetSelector.addProcessListener(new FormProcessListener() {
-
- @Override
- public void process(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
-
- browseMode(state);
- targetSelector.setVisible(state, false);
-
- final Folder folder = targetSelector.getTarget(state);
- final String[] objectIds = getSources(state);
-
- if (isCopy(state)) {
- copyObjects(folder, objectIds);
- } else if (isMove(state)) {
- moveObjects(folder, objectIds);
- }
-
- reset(state);
- }
-
- });
- targetSelector.addValidationListener(
- new TargetSelectorValidationListener());
- targetSelector.addSubmissionListener(new FormSubmissionListener() {
-
- @Override
- public void submitted(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
-
- if (targetSelector.isCancelled(state)) {
- reset(state);
- browseMode(state);
- throw new FormProcessException(new GlobalizedMessage(
- "cms.ui.folder.cancelled",
- CmsConstants.CMS_FOLDER_BUNDLE));
- }
- }
-
- });
- browseSegment.add(targetSelector);
-
-// browseSegment.add(paginator);
-// browseSegment.add(folderBrowser);
- browseSegment.add(browserForm);
-
-// currentFolderSegment = panel.addSegment();
-// currentFolderSegment.addHeader(new Text("Current folder"));
-// final Label currentFolderLabel = new Label();
-// currentFolderLabel.addPrintListener(new PrintListener() {
-//
-// @Override
-// public void prepare(final PrintEvent event) {
-// final PageState state = event.getPageState();
-// final Label target = (Label) event.getTarget();
-//
-// final long selectedId = Long.parseLong(selectionModel
-// .getSelectedKey(state).toString());
-// final long currentFolderId = folderSelectionModel
-// .getSelectedObject(state).getObjectId();
-// target.setLabel(String.format(
-// "selectedId = %d; currentFolderId = %d",
-// selectedId,
-// currentFolderId));
-// }
-//
-// });
-// currentFolderSegment.add(currentFolderLabel);
- actionsSegment = panel.addSegment();
- actionsSegment.setIdAttr("folder-browse");
-
- final ActionGroup actions = new ActionGroup();
- actionsSegment.add(actions);
-
- final FolderCreateForm folderCreateForm = new FolderCreateForm(
- "fcreat", folderSelectionModel);
- folderCreateForm.addSubmissionListener(new FormSubmissionListener() {
-
- @Override
- public void submitted(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
- if (event.getSource() == folderCreateForm
- && folderCreateForm.isCancelled(state)) {
- browseMode(state);
- throw new FormProcessException(new GlobalizedMessage(
- "cms.ui.cancelled", CmsConstants.CMS_BUNDLE));
-
- }
- }
-
- });
- folderCreateForm.addProcessListener(new FormProcessListener() {
-
- @Override
- public void process(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
- final Object source = event.getSource();
- if (source == folderCreateForm) {
- browseMode(state);
- }
- }
-
- });
- newFolderSegment = panel.addSegment(
- new Label(new GlobalizedMessage("cms.ui.new_folder",
- CmsConstants.CMS_BUNDLE)),
- folderCreateForm);
-
- final FolderEditorForm folderEditorForm = new FolderEditorForm(
- "fedit", folderSelectionModel);
- folderEditorForm.addSubmissionListener(new FormSubmissionListener() {
-
- @Override
- public void submitted(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
- if (event.getSource() == folderEditorForm
- && folderEditorForm.isCancelled(state)) {
- browseMode(state);
- throw new FormProcessException(new GlobalizedMessage(
- "cms.ui.cancelled", CmsConstants.CMS_BUNDLE));
- }
- }
-
- });
- folderEditorForm.addProcessListener(new FormProcessListener() {
-
- @Override
- public void process(final FormSectionEvent event)
- throws FormProcessException {
-
- final PageState state = event.getPageState();
- final Object source = event.getSource();
- if (source == folderEditorForm) {
- browseMode(state);
- }
- }
-
- });
- editFolderSegment = panel.addSegment(
- new Label(new GlobalizedMessage("cms.ui.edit_folder",
- CmsConstants.CMS_BUNDLE)),
- folderEditorForm);
-
- final ActionLink createFolderAction = new ActionLink(
- new Label(new GlobalizedMessage("cms.ui.new_folder",
- CmsConstants.CMS_BUNDLE)));
- createFolderAction.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(final ActionEvent event) {
- final PageState state = event.getPageState();
- final Object source = event.getSource();
- if (source == createFolderAction) {
- newFolderMode(state);
- }
- }
-
- });
- actions.addAction(createFolderAction);
-
- final ActionLink editFolderAction = new ActionLink(
- new Label(new GlobalizedMessage("cms.ui.edit_folder",
- CmsConstants.CMS_BUNDLE)));
- editFolderAction.addActionListener(new ActionListener() {
-
- @Override
- public void actionPerformed(final ActionEvent event) {
- final PageState state = event.getPageState();
- final Object source = event.getSource();
- if (source == editFolderAction) {
- editFolderMode(state);
- }
- }
-
- });
- actions.addAction(editFolderAction);
-
- final Form newAssetForm = new Form("new-asset-form",
- new BoxPanel(BoxPanel.HORIZONTAL));
- newAssetForm.setMethod("GET");
- newAssetForm.add(new Label(new GlobalizedMessage(
- "cms.ui.assets.new", CmsConstants.CMS_BUNDLE)));
- final SingleSelect newAssetTypeSelect = new SingleSelect(
- selectedAssetTypeParam);
- try {
- newAssetTypeSelect.addPrintListener(new PrintListener() {
-
- @Override
- public void prepare(final PrintEvent event) {
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetTypesManager typesManager = cdiUtil
- .findBean(AssetTypesManager.class);
- final SingleSelect target = (SingleSelect) event.getTarget();
- target.clearOptions();
- for (final AssetTypeInfo type : typesManager
- .getAvailableAssetTypes()) {
- final String labelKey = type.getLabelKey();
- final String labelBundle = type.getLabelBundle();
- final ResourceBundle bundle = ResourceBundle
- .getBundle(labelBundle);
- final String label = bundle.getString(labelKey);
- target.addOption(new Option(
- type.getAssetClass().getName(),
- new Text(label)));
- }
- }
-
- });
- } catch (TooManyListenersException ex) {
- throw new UnexpectedErrorException(ex);
- }
- newAssetForm.add(newAssetTypeSelect);
- newAssetForm.add(new Submit(new GlobalizedMessage(
- "cms.ui.assets.new.create", CmsConstants.CMS_BUNDLE)));
- newAssetForm.addProcessListener(new FormProcessListener() {
-
- @Override
- public void process(final FormSectionEvent event)
- throws FormProcessException {
- editAssetMode(event.getPageState());
- }
-
- });
-
- actionsSegment.add(newAssetForm);
-
- final MetaForm editAssetForm = new MetaForm("editAsset") {
-
- @Override
- public Form buildForm(final PageState state) {
-
- final boolean newAsset;
-
- final Long selectedAssetId = selectedAssetModel
- .getSelectedKey(state);
- newAsset = selectedAssetId == null;
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
-
- final String selectedAssetType;
- if (newAsset) {
- selectedAssetType = (String) newAssetTypeSelect
- .getValue(state);
- } else {
- final AssetRepository assetRepo = cdiUtil
- .findBean(AssetRepository.class);
- final Asset asset = assetRepo.findById(selectedAssetModel
- .getSelectedKey(state))
- .orElseThrow(() -> new IllegalArgumentException(
- String.format("No asset with ID %d in the "
- + "database.",
- selectedAssetModel
- .getSelectedKey(state))));
- selectedAssetType = asset.getClass().getName();
- }
-
- final AssetTypesManager typesManager = cdiUtil
- .findBean(AssetTypesManager.class);
- final AssetTypeInfo typeInfo = typesManager
- .getAssetTypeInfo(selectedAssetType);
- final Class extends AbstractAssetForm> assetForm = typeInfo
- .getAssetForm();
- try {
- return assetForm
- .getConstructor(AssetPane.class)
- .newInstance(AssetPane.this);
- } catch (NoSuchMethodException
- | SecurityException
- | InstantiationException
- | IllegalAccessException
- | InvocationTargetException ex) {
- throw new UnexpectedErrorException(String.format(
- "Failed to create form '%s' for editing assets "
- + "of type '%s'.",
- assetForm.getName(),
- selectedAssetType));
- }
-
- }
-
- };
- editAssetSegment = panel.addSegment();
- editAssetSegment.addHeader(
- new Label(new PrintListener() {
-
- @Override
- public void prepare(final PrintEvent event) {
-
- final PageState state = event.getPageState();
- final Label target = (Label) event.getTarget();
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetTypesManager typesManager = cdiUtil
- .findBean(AssetTypesManager.class);
-
- if (selectedAssetModel.isSelected(state)) {
- target.setLabel(
- new GlobalizedMessage(
- "cms.ui.admin.assets.edit",
- CmsConstants.CMS_BUNDLE));
- } else {
- final String assetType = (String) newAssetTypeSelect
- .getValue(state);
- final AssetTypeInfo typeInfo = typesManager
- .getAssetTypeInfo(assetType);
- final ResourceBundle bundle = ResourceBundle.getBundle(
- typeInfo.getLabelBundle());
- final String typeLabel = bundle
- .getString(typeInfo.getLabelKey());
-
- target.setLabel(new GlobalizedMessage(
- "cms.ui.admin.assets.create",
- CmsConstants.CMS_BUNDLE,
- new Object[]{typeLabel}));
- }
- }
-
- }));
- editAssetSegment.add(editAssetForm);
-
- folderPermissionsSegment = panel.addSegment();
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final PermissionManager permissionManager = cdiUtil
- .findBean(PermissionManager.class);
- final String[] privileges = permissionManager
- .listDefiniedPrivileges(AssetPrivileges.class)
- .toArray(new String[]{});
- final Map privilegeNameMap = new HashMap<>();
- Arrays
- .stream(privileges)
- .forEach(privilege -> privilegeNameMap.put(privilege, privilege));
- final CcmObjectSelectionModel objSelectionModel
- = new CcmObjectSelectionModel<>(
- CcmObject.class, folderSelectionModel);
- final CMSPermissionsPane folderPermissionsPane = new CMSPermissionsPane(
- privileges, privilegeNameMap, objSelectionModel);
- folderPermissionsSegment.add(folderPermissionsPane);
-
-
- return panel;
-
- }
-
- protected void browseMode(final PageState state) {
- tree.setVisible(state, true);
- browseSegment.setVisible(state, true);
- folderBrowser.setVisible(state, true);
- browserForm.setVisible(state, true);
- targetSelector.setVisible(state, false);
- actionsSegment.setVisible(state, true);
- newFolderSegment.setVisible(state, false);
- editFolderSegment.setVisible(state, false);
- editAssetSegment.setVisible(state, false);
- folderPermissionsSegment.setVisible(state, true);
- }
-
- protected void moveCopyMode(final PageState state) {
- tree.setVisible(state, false);
- browseSegment.setVisible(state, true);
- folderBrowser.setVisible(state, false);
- browserForm.setVisible(state, false);
- targetSelector.setVisible(state, true);
- actionsSegment.setVisible(state, false);
- newFolderSegment.setVisible(state, false);
- editFolderSegment.setVisible(state, false);
- targetSelector.expose(state);
- editAssetSegment.setVisible(state, false);
- folderPermissionsSegment.setVisible(state, false);
- }
-
- protected void newFolderMode(final PageState state) {
- tree.setVisible(state, false);
- browseSegment.setVisible(state, false);
- folderBrowser.setVisible(state, false);
- browserForm.setVisible(state, false);
- targetSelector.setVisible(state, false);
- actionsSegment.setVisible(state, false);
- newFolderSegment.setVisible(state, true);
- editFolderSegment.setVisible(state, false);
- editAssetSegment.setVisible(state, false);
- folderPermissionsSegment.setVisible(state, false);
- }
-
- protected void editFolderMode(final PageState state) {
- tree.setVisible(state, false);
- browseSegment.setVisible(state, false);
- targetSelector.setVisible(state, false);
- actionsSegment.setVisible(state, false);
- newFolderSegment.setVisible(state, false);
- editFolderSegment.setVisible(state, true);
- editAssetSegment.setVisible(state, false);
- folderPermissionsSegment.setVisible(state, false);
- }
-
- protected void editAssetMode(final PageState state) {
- tree.setVisible(state, false);
- browseSegment.setVisible(state, false);
- targetSelector.setVisible(state, false);
- actionsSegment.setVisible(state, false);
- newFolderSegment.setVisible(state, false);
- editFolderSegment.setVisible(state, false);
- editAssetSegment.setVisible(state, true);
- folderPermissionsSegment.setVisible(state, false);
- }
-
- @Override
- public void register(final Page page) {
-
- super.register(page);
-
- page.addActionListener(new TreeListener());
- page.addActionListener(new FolderListener());
-
- page.setVisibleDefault(tree, true);
- page.setVisibleDefault(browseSegment, true);
- page.setVisibleDefault(folderBrowser, true);
- page.setVisibleDefault(browserForm, true);
- page.setVisibleDefault(targetSelector, false);
- page.setVisibleDefault(actionsSegment, true);
- page.setVisibleDefault(newFolderSegment, false);
- page.setVisibleDefault(editFolderSegment, false);
- page.setVisibleDefault(editAssetSegment, false);
- page.setVisibleDefault(folderPermissionsSegment, true);
-
- page.addComponentStateParam(this, actionParameter);
- page.addComponentStateParam(this, sourcesParameter);
- page.addComponentStateParam(this, selectedAssetTypeParam);
- page.addComponentStateParam(this,
- selectedAssetModel.getStateParameter());
- }
-
- @Override
- public void reset(final PageState state) {
-
- super.reset(state);
-
- folderBrowser.getPaginator().reset(state);
-
- state.setValue(actionParameter, null);
- state.setValue(sourcesParameter, null);
-
- }
-
- protected SingleSelectionModel getSelectedAssetModel() {
- return selectedAssetModel;
- }
-
- protected FolderSelectionModel getFolderSelectionModel() {
- return folderSelectionModel;
- }
-
- private String[] getSources(final PageState state) {
-
- final String[] result = (String[]) state.getValue(sourcesParameter);
-
- if (result == null) {
- return new String[0];
- } else {
- return result;
- }
- }
-
- protected final boolean isMove(final PageState state) {
- return MOVE.equals(getAction(state));
- }
-
- protected final boolean isCopy(final PageState state) {
- return COPY.equals(getAction(state));
- }
-
- private String getAction(final PageState state) {
- return (String) state.getValue(actionParameter);
- }
-
- protected void moveObjects(final Folder target, final String[] objectIds) {
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFolderBrowserController controller = cdiUtil.findBean(
- AssetFolderBrowserController.class);
-
- controller.moveObjects(target, objectIds);
- }
-
- protected void copyObjects(final Folder target, final String[] objectIds) {
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFolderBrowserController controller = cdiUtil.findBean(
- AssetFolderBrowserController.class);
-
- controller.copyObjects(target, objectIds);
- }
-
- private final class FolderListener implements ActionListener {
-
- @Override
- @SuppressWarnings("unchecked")
- public void actionPerformed(final ActionEvent event) {
-
- final PageState state = event.getPageState();
-
- if (!selectionModel.isSelected(state)) {
- final String folder = state
- .getRequest()
- .getParameter(SET_FOLDER);
-
- if (folder == null) {
- final Category root = CMS
- .getContext()
- .getContentSection()
- .getRootAssetsFolder();
- final Long folderId = root.getObjectId();
-
- selectionModel.setSelectedKey(state, folderId);
- } else {
- selectionModel.setSelectedKey(state, Long.parseLong(folder));
- }
- }
- }
-
- }
-
- private final class TreeListener implements ActionListener {
-
- @Override
- public void actionPerformed(final ActionEvent event) {
-
- final PageState state = event.getPageState();
-
- final Category root = CMS
- .getContext()
- .getContentSection()
- .getRootAssetsFolder();
-
- if (!root.equals(folderRequestLocal.getFolder(state))) {
- // Expand the ancestor nodes of the currently
- // selected node.
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final FolderTreeModelController controller = cdiUtil.findBean(
- FolderTreeModelController.class);
- final List ancestorIds = controller.findAncestorIds(
- folderRequestLocal.getFolder(state));
- ancestorIds.forEach(id -> tree.expand(id.toString(), state));
-
- }
- }
-
- }
-
- private class TargetSelector extends Form implements Resettable {
-
- private final FolderSelectionModel targetFolderModel;
- private final AssetFolderTree folderTree;
- private final Submit cancelButton;
-
- public TargetSelector() {
- super("targetSelector", new BoxPanel());
- setMethod(GET);
- targetFolderModel = new FolderSelectionModel("target") {
-
- @Override
- protected Long getRootFolderID(final PageState state) {
- final ContentSection section = CMS
- .getContext()
- .getContentSection();
- return section.getRootAssetsFolder().getObjectId();
- }
-
- };
- folderTree = new AssetFolderTree(targetFolderModel);
-
- folderTree.setCellRenderer(new FolderTreeCellRenderer());
-
- final Label label = new Label(new PrintListener() {
-
- @Override
- public void prepare(final PrintEvent event) {
-
- final PageState state = event.getPageState();
- final Label label = (Label) event.getTarget();
- final int numberOfItems = getSources(state).length;
- final Category folder = (Category) folderSelectionModel
- .getSelectedObject(state);
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final CategoryManager categoryManager = cdiUtil
- .findBean(CategoryManager.class);
-
- final String targetFolderPath;
- if (targetFolderModel.getSelectedObject(state) == null) {
- targetFolderPath = "";
- } else {
- targetFolderPath = categoryManager.getCategoryPath(
- targetFolderModel.getSelectedObject(state));
- }
-
- if (isMove(state)) {
- label.setLabel(new GlobalizedMessage(
- "cms.ui.folder.move",
- CmsConstants.CMS_FOLDER_BUNDLE,
- new Object[]{
- numberOfItems,
- categoryManager.getCategoryPath(folder),
- targetFolderPath
- }));
- } else if (isCopy(state)) {
- label.setLabel(new GlobalizedMessage(
- "cms.ui.folder.copy",
- CMS_BUNDLE,
- new Object[]{
- numberOfItems,
- categoryManager.getCategoryPath(folder),
- targetFolderPath
- }));
- }
- }
-
- });
-
- label.setOutputEscaping(false);
- add(label);
- add(folderTree);
- add(new FormErrorDisplay(this));
- final SaveCancelSection saveCancelSection = new SaveCancelSection();
- cancelButton = saveCancelSection.getCancelButton();
- add(saveCancelSection);
- }
-
- @Override
- public void register(final Page page) {
- super.register(page);
- page.addComponentStateParam(this,
- targetFolderModel.getStateParameter());
- }
-
- public void expose(final PageState state) {
-
- final Folder folder = folderSelectionModel.getSelectedObject(state);
- targetFolderModel.clearSelection(state);
- if (folder != null) {
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final FolderManager folderManager = cdiUtil.findBean(
- FolderManager.class);
- if (!folderManager.getParentFolder(folder).isPresent()) {
- folderTree.expand(Long.toString(folder.getObjectId()),
- state);
- } else {
- final List parents = folderManager
- .getParentFolders(folder);
- parents
- .stream()
- .map(parent -> Long.toString(parent.getObjectId()))
- .forEach(folderId -> folderTree.expand(folderId,
- state));
- }
- }
- }
-
- @Override
- public void reset(final PageState state) {
- folderTree.clearSelection(state);
- state.setValue(folderTree.getSelectionModel().getStateParameter(),
- null);
- }
-
- public Folder getTarget(final PageState state) {
- return targetFolderModel.getSelectedObject(state);
- }
-
- public boolean isCancelled(final PageState state) {
- return cancelButton.isSelected(state);
- }
-
- }
-
- private class FolderTreeCellRenderer implements TreeCellRenderer {
-
- private final RequestLocal invalidFoldersRequestLocal
- = new RequestLocal();
-
- /**
- * Render the folders appropriately. The selected folder is a bold
- * label. Invalid folders are plain labels. Unselected, valid folders
- * are control links. Invalid folders are: the parent folder of the
- * sources, any of the sources, and any subfolders of the sources.
- */
- @Override
- @SuppressWarnings("unchecked")
- public Component getComponent(final Tree tree,
- final PageState state,
- final Object value,
- final boolean isSelected,
- final boolean isExpanded,
- final boolean isLeaf,
- final Object key) {
-
- // Get the list of invalid folders once per request.
- final List invalidFolders;
-
- if (invalidFoldersRequestLocal.get(state) == null) {
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetFolderBrowserController controller = cdiUtil
- .findBean(AssetFolderBrowserController.class);
- invalidFolders = controller.createInvalidTargetsList(
- Arrays.asList(getSources(state)));
- invalidFoldersRequestLocal.set(state, invalidFolders);
- } else {
- invalidFolders = (List) invalidFoldersRequestLocal
- .get(state);
- }
- final Label label = new Label(value.toString());
-
- if (invalidFolders.contains(String.format(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER + "%s", key))) {
- return label;
- }
-
- // Bold if selected
- if (isSelected) {
- label.setFontWeight(Label.BOLD);
- return label;
- }
-
- return new ControlLink(label);
- }
-
- }
-
- private class TargetSelectorValidationListener
- implements FormValidationListener {
-
- @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 Folder target = targetSelector.getTarget(state);
- final FormData data = event.getFormData();
- if (target == null) {
- data.addError(new GlobalizedMessage(
- "cms.ui.folder.need_select_target_folder",
- CmsConstants.CMS_FOLDER_BUNDLE));
- //If the target is null, we can skip the rest of the checks
- return;
- }
-
- if (target.equals(folderSelectionModel.getSelectedObject(state))) {
- data.addError(new GlobalizedMessage(
- "cms.ui.folder.not_within_same_folder",
- CmsConstants.CMS_FOLDER_BUNDLE));
- }
-
- // check create item permission
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final PermissionChecker permissionChecker = cdiUtil.findBean(
- PermissionChecker.class);
- if (!permissionChecker.isPermitted(
- ItemPrivileges.CREATE_NEW, target)) {
- data.addError("cms.ui.folder.no_permission_for_item",
- CmsConstants.CMS_FOLDER_BUNDLE);
- }
-
- for (String source : getSources(state)) {
-
- validateObject(source, target, state, data);
-
- }
- }
-
- private void validateObject(final String objectId,
- final Folder target,
- final PageState state,
- final FormData data) {
-
- Objects.requireNonNull(objectId, "objectId can't be null.");
-
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final FolderRepository folderRepo = cdiUtil
- .findBean(FolderRepository.class);
- final AssetRepository assetRepo = cdiUtil
- .findBean(AssetRepository.class);
- final AssetManager assetManager = cdiUtil
- .findBean(AssetManager.class);
- final AssetFolderBrowserController controller = cdiUtil
- .findBean(AssetFolderBrowserController.class);
- final FolderManager folderManager = cdiUtil
- .findBean(FolderManager.class);
- final PermissionChecker permissionChecker = cdiUtil.findBean(
- PermissionChecker.class);
-
- final CcmObject object;
- final String name;
- if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
-
- final long folderId = Long.parseLong(objectId.substring(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
- final Folder folder = folderRepo.findById(folderId).orElseThrow(
- () -> new IllegalArgumentException(String.format(
- "No folder with id %d in database.", folderId)));
-
- name = folder.getName();
-
- //Check if folder or subfolder contains in use assets
- if (isMove(state)) {
- final FolderManager.FolderIsMovable movable = folderManager
- .folderIsMovable(folder, target);
- switch (movable) {
- case DIFFERENT_SECTIONS:
- addErrorMessage(data,
- "cms.ui.folder.different_sections",
- name);
- break;
- case HAS_IN_USE_ASSETS:
- addErrorMessage(data,
- "cms.ui.folder.has_in_use_assets",
- name);
- break;
- case DIFFERENT_TYPES:
- addErrorMessage(data,
- "cms.ui.folder.different_folder_types",
- name);
- break;
- case IS_ROOT_FOLDER:
- addErrorMessage(data,
- "cms.ui.folder.is_root_folder",
- name);
- break;
- case SAME_FOLDER:
- addErrorMessage(data,
- "cms.ui.folder.same_folder",
- name);
- break;
- case YES:
- //Nothing
- break;
- default:
- throw new UnexpectedErrorException(String.format(
- "Unknown state '%s' for '%s'.",
- movable,
- FolderManager.FolderIsMovable.class.
- getName()));
- }
- }
-
- object = folder;
- } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
- final long assetId = Long.parseLong(objectId.substring(
- FOLDER_BROWSER_KEY_PREFIX_ASSET.length()));
- final Asset asset = assetRepo
- .findById(assetId)
- .orElseThrow(() -> new IllegalArgumentException(
- String.format(
- "No asset with id %d in the database.",
- assetId)));
-
- name = asset.getDisplayName();
-
- if (isMove(state) && assetManager.isAssetInUse(asset)) {
- addErrorMessage(data, "cms.ui.folder.item_is_live", name);
- }
-
- object = asset;
- } else {
- throw new IllegalArgumentException(String.format(
- "Provided objectId '%s' does not start with '%s' "
- + "or '%s'.",
- objectId,
- FOLDER_BROWSER_KEY_PREFIX_FOLDER,
- FOLDER_BROWSER_KEY_PREFIX_ASSET));
- }
-
- final long count = controller.countObjects(target, name);
- if (count > 0) {
- // there is an item or subfolder in the target folder that already has this name
- addErrorMessage(data, "cms.ui.folder.item_already_exists",
- name);
- }
-
- if (!(permissionChecker.isPermitted(
- ItemPrivileges.DELETE, object))
- && isMove(state)) {
- addErrorMessage(data,
- "cms.ui.folder.no_permission_for_item",
- object.getDisplayName());
- }
-
- }
-
- }
-
- private void addErrorMessage(final FormData data,
- final String message,
- final String itemName) {
- data.addError(new GlobalizedMessage(message,
- CmsConstants.CMS_FOLDER_BUNDLE,
- new Object[]{itemName}));
- }
-
- private class AssetFolderTree extends Tree {
-
- public AssetFolderTree(final FolderSelectionModel folderSelectionModel) {
-
- super(new FolderTreeModelBuilder() {
-
- @Override
- protected Folder getRootFolder(final PageState state) {
- final ContentSection section = CMS
- .getContext()
- .getContentSection();
-
- return section.getRootAssetsFolder();
- }
-
- });
- setSelectionModel(folderSelectionModel);
- }
-
- @Override
- public void setSelectedKey(final PageState state, final Object key) {
- if (key instanceof String) {
- final Long keyAsLong;
- if (((String) key).startsWith(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
- keyAsLong = Long.parseLong(((String) key).substring(
- FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
- } else {
- keyAsLong = Long.parseLong((String) key);
- }
- super.setSelectedKey(state, keyAsLong);
- } else if (key instanceof Long) {
- super.setSelectedKey(state, key);
- } else {
- //We know that a FolderSelectionModel only takes keys of type Long.
- //Therefore we try to cast here
- final Long keyAsLong = (Long) key;
- super.setSelectedKey(state, keyAsLong);
- }
- }
-
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java
deleted file mode 100644
index 8b95bc58d..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidget.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.form.Widget;
-import com.arsdigita.bebop.parameters.LongParameter;
-import com.arsdigita.cms.CMS;
-import com.arsdigita.xml.Element;
-
-import org.libreccm.cdi.utils.CdiUtil;
-import org.libreccm.l10n.GlobalizationHelper;
-import org.librecms.assets.AssetTypeInfo;
-import org.librecms.assets.AssetTypesManager;
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.AssetRepository;
-import org.librecms.contentsection.ContentSection;
-
-import java.util.Map;
-import java.util.ResourceBundle;
-
-/**
- * A widget for selecting an asset. The widget does not contain any other
- * widgets, only the information required to create an HTML/JavaScript dialog
- * for selecting an asset. To create the dialog the
- * {@link org.librecms.contentsection.rs.Assets} class can be used which
- * provides several methods for getting the assets of an content section.
- *
- * @author Jens Pelzetter
- */
-public class AssetSearchWidget extends Widget {
-
- private Class extends Asset> type;
-
- public AssetSearchWidget(final String name) {
- super(new LongParameter(name));
- }
-
- public AssetSearchWidget(final String name,
- final Class extends Asset> type) {
- this(name);
- this.type = type;
- }
-
- @Override
- public boolean isCompound() {
- return true;
- }
-
- @Override
- protected String getType() {
- return "asset-search-widget";
- }
-
- @Override
- protected String getElementTag() {
- return "cms:asset-search-widget";
- }
-
- @Override
- public void generateWidget(final PageState state,
- final Element parent) {
-
- final Element widget = parent.newChildElement(getElementTag(),
- CMS.CMS_XML_NS);
-
- widget.addAttribute("name", getName());
-
- if (type != null) {
- widget.addAttribute("asset-type", type.getName());
- }
-
- final ContentSection section = CMS.getContext().getContentSection();
- widget.addAttribute("content-section", section.getLabel());
-
- final Long value = (Long) getValue(state);
- if (value != null) {
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final AssetSearchWidgetController controller = cdiUtil
- .findBean(AssetSearchWidgetController.class);
-
- final Map data = controller.getData(value);
-
- final Element selected = widget
- .newChildElement("cms:selected-asset", CMS.CMS_XML_NS);
- selected.addAttribute(
- "assetId", data.get(AssetSearchWidgetController.OBJECT_ID)
- );
- selected.addAttribute("title",
- data.get(AssetSearchWidgetController.TITLE));
- selected.addAttribute("type",
- data.get(AssetSearchWidgetController.TYPE));
-
- exportAttributes(widget);
- }
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java
deleted file mode 100644
index cac64adad..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetSearchWidgetController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2019 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import org.libreccm.l10n.GlobalizationHelper;
-import org.librecms.assets.AssetTypeInfo;
-import org.librecms.assets.AssetTypesManager;
-import org.librecms.contentsection.Asset;
-import org.librecms.contentsection.AssetRepository;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.ResourceBundle;
-
-import javax.enterprise.context.RequestScoped;
-import javax.inject.Inject;
-import javax.transaction.Transactional;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@RequestScoped
-public class AssetSearchWidgetController {
-
- protected static final String OBJECT_ID = "objectId";
- protected static final String TYPE = "type";
- protected static final String TITLE = "title";
-
- @Inject
- private AssetRepository assetRepository;
-
- @Inject
- private AssetTypesManager typesManager;
-
- @Inject
- private GlobalizationHelper globalizationHelper;
-
- @Transactional(Transactional.TxType.REQUIRED)
- public Map getData(final long assetId) {
-
- final Asset asset = assetRepository
- .findById(assetId)
- .orElseThrow(() -> new IllegalArgumentException(String.format(
- "No Asset with ID %d in the database.", assetId)));
-
- final Map data = new HashMap<>();
-
- data.put(OBJECT_ID, Long.toString(asset.getObjectId()));
-
- data.put(TITLE,
- globalizationHelper
- .getValueFromLocalizedString(asset.getTitle()));
- final AssetTypeInfo typeInfo = typesManager
- .getAssetTypeInfo(asset.getClass().getName());
- final ResourceBundle bundle = ResourceBundle
- .getBundle(typeInfo.getLabelBundle(),
- globalizationHelper.getNegotiatedLocale());
- final String typeLabel = bundle.getString(typeInfo.getLabelKey());
-
- data.put(TYPE, typeLabel);
-
- return data;
- }
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/IsControllerForAssetType.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/IsControllerForAssetType.java
deleted file mode 100644
index 9962cf2fa..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/IsControllerForAssetType.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2019 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import org.librecms.contentsection.Asset;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import javax.inject.Qualifier;
-
-/**
- *
- * @author Jens Pelzetter
- */
-@Qualifier
-@Retention(RetentionPolicy.RUNTIME)
-@Target({
- ElementType.METHOD,
- ElementType.FIELD,
- ElementType.PARAMETER,
- ElementType.TYPE
-})
-public @interface IsControllerForAssetType {
-
- Class extends Asset> value();
-
-}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/ItemSearchWidget.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/ItemSearchWidget.java
deleted file mode 100644
index c43804d81..000000000
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/ItemSearchWidget.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2017 LibreCCM Foundation.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- * MA 02110-1301 USA
- */
-package com.arsdigita.cms.ui.assets;
-
-import com.arsdigita.bebop.PageState;
-import com.arsdigita.bebop.form.Widget;
-import com.arsdigita.bebop.parameters.LongParameter;
-import com.arsdigita.cms.CMS;
-import com.arsdigita.xml.Element;
-
-import org.libreccm.cdi.utils.CdiUtil;
-import org.libreccm.l10n.GlobalizationHelper;
-import org.librecms.contentsection.ContentItem;
-import org.librecms.contentsection.ContentItemRepository;
-import org.librecms.contentsection.ContentSection;
-import org.librecms.contenttypes.ContentTypeInfo;
-import org.librecms.contenttypes.ContentTypesManager;
-
-import java.util.ResourceBundle;
-
-/**
- *
- * @author Jens Pelzetter
- */
-public class ItemSearchWidget extends Widget {
-
- private Class extends ContentItem> type;
-
- public ItemSearchWidget(final String name) {
- super(new LongParameter(name));
- }
-
- @Override
- public boolean isCompound() {
- return true;
- }
-
- @Override
- protected String getType() {
- return "item-search-widget";
- }
-
- @Override
- protected String getElementTag() {
- return "cms:item-search-widget";
- }
-
- @Override
- public void generateWidget(final PageState state,
- final Element parent) {
-
- final Element widget = parent.newChildElement(getElementTag(),
- CMS.CMS_XML_NS);
-
- widget.addAttribute("name", getName());
- widget.addAttribute("content-section",
- CMS.getContext().getContentSection().getLabel());
-
- if (type != null) {
- widget.addAttribute("asset-type", type.getName());
- }
-
-// final ContentSection section = CMS.getContext().getContentSection();
-// widget.addAttribute("content-section", section.getLabel());
-
- final Long value = (Long) getValue(state);
- if (value != null) {
- final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
- final ContentItemRepository itemRepo = cdiUtil
- .findBean(ContentItemRepository.class);
- final ContentTypesManager typesManager = cdiUtil
- .findBean(ContentTypesManager.class);
- final GlobalizationHelper globalizationHelper = cdiUtil
- .findBean(GlobalizationHelper.class);
-
- final ContentItem item = itemRepo
- .findById(value)
- .orElseThrow(() -> new IllegalArgumentException(String
- .format("No ContentItem with ID %d in the database.", value)));
-
- final Element selected = widget
- .newChildElement("cms:selected-content-item", CMS.CMS_XML_NS);
- selected.addAttribute("contentItemId",
- Long.toString(item.getObjectId()));
- selected.addAttribute("name", item.getDisplayName());
- selected.addAttribute(
- "title",
- globalizationHelper.getValueFromLocalizedString(item.getTitle()));
- final ContentTypeInfo typeInfo = typesManager
- .getContentTypeInfo(item.getClass());
- final ResourceBundle bundle = ResourceBundle
- .getBundle(typeInfo.getLabelBundle(),
- globalizationHelper.getNegotiatedLocale());
- final String typeLabel = bundle.getString(typeInfo.getLabelKey());
- selected.addAttribute("type", typeLabel);
-
- exportAttributes(widget);
-
- }
-
- }
-
-}
diff --git a/ccm-cms/src/main/java/org/librecms/assets/AssetType.java b/ccm-cms/src/main/java/org/librecms/assets/AssetType.java
index f8be27c60..cf3787ad1 100644
--- a/ccm-cms/src/main/java/org/librecms/assets/AssetType.java
+++ b/ccm-cms/src/main/java/org/librecms/assets/AssetType.java
@@ -18,7 +18,6 @@
*/
package org.librecms.assets;
-import com.arsdigita.cms.ui.assets.AbstractAssetForm;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/ccm-cms/src/main/java/org/librecms/assets/AssetTypeInfo.java b/ccm-cms/src/main/java/org/librecms/assets/AssetTypeInfo.java
index 4d0012106..e00bf2e56 100644
--- a/ccm-cms/src/main/java/org/librecms/assets/AssetTypeInfo.java
+++ b/ccm-cms/src/main/java/org/librecms/assets/AssetTypeInfo.java
@@ -18,8 +18,6 @@
*/
package org.librecms.assets;
-import com.arsdigita.cms.ui.assets.AbstractAssetForm;
-
import org.librecms.contentsection.Asset;
import java.util.Objects;
@@ -56,11 +54,6 @@ public class AssetTypeInfo {
*/
private Class extends Asset> assetClass;
- /**
- * The form for editing and creating asset of the type described.
- */
- private Class extends AbstractAssetForm> assetForm;
-
public String getLabelBundle() {
return labelBundle;
}
@@ -101,14 +94,6 @@ public class AssetTypeInfo {
this.assetClass = assetClass;
}
- public Class extends AbstractAssetForm> getAssetForm() {
- return assetForm;
- }
-
- public void setAssetForm(final Class extends AbstractAssetForm> assetForm) {
- this.assetForm = assetForm;
- }
-
@Override
public int hashCode() {
int hash = 5;
@@ -117,7 +102,6 @@ public class AssetTypeInfo {
hash = 59 * hash + Objects.hashCode(descriptionBundle);
hash = 59 * hash + Objects.hashCode(descriptionKey);
hash = 59 * hash + Objects.hashCode(assetClass);
- hash = 59 * hash + Objects.hashCode(assetForm);
return hash;
}
@@ -148,38 +132,35 @@ public class AssetTypeInfo {
if (!Objects.equals(descriptionKey, other.getDescriptionKey())) {
return false;
}
- if (!Objects.equals(assetClass, other.getAssetClass())) {
- return false;
- }
- return Objects.equals(assetForm, other.getAssetForm());
+ return Objects.equals(assetClass, other.getAssetClass());
}
-
+
private boolean canEqual(final Object obj) {
return obj instanceof AssetTypeInfo;
}
-
+
@Override
public final String toString() {
return toString("");
}
-
+
public String toString(final String data) {
- return String.format("%s{ "
- + "labelBundle = \"%s\", "
- + "labelKey = \"%s\", "
- + "descriptionBundle = \"%s\", "
- + "descriptionKey = \"%s\", "
- + "assetClass = \"%s\", "
- + "assetForm = \"%s\"%s "
- + " }",
- super.toString(),
- labelBundle,
- labelKey,
- descriptionBundle,
- descriptionKey,
- Objects.toString(assetClass),
- Objects.toString(assetForm),
- data);
+ return String.format(
+ "%s{ "
+ + "labelBundle = \"%s\", "
+ + "labelKey = \"%s\", "
+ + "descriptionBundle = \"%s\", "
+ + "descriptionKey = \"%s\", "
+ + "assetClass = \"%s\"%s "
+ + " }",
+ super.toString(),
+ labelBundle,
+ labelKey,
+ descriptionBundle,
+ descriptionKey,
+ Objects.toString(assetClass),
+ data
+ );
}
}
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/rs/Assets.java b/ccm-cms/src/main/java/org/librecms/contentsection/rs/Assets.java
index d00893b84..9dbccb516 100644
--- a/ccm-cms/src/main/java/org/librecms/contentsection/rs/Assets.java
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/rs/Assets.java
@@ -18,7 +18,6 @@
*/
package org.librecms.contentsection.rs;
-import com.arsdigita.cms.ui.assets.AssetSearchWidget;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.configuration.ConfigurationManager;
@@ -64,8 +63,7 @@ import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
/**
- * Provides a Web Service (build using JAX-RS). Used for example by the
- * {@link AssetSearchWidget}.
+ * Provides a Web Service (build using JAX-RS).
*
* @author Jens Pelzetter
*/