CCM NG/ccm-cms: AssetPane, creation of assets.

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4662 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-04-06 13:09:58 +00:00
parent dc1ec63e51
commit 6339c2bb08
15 changed files with 592 additions and 419 deletions

View File

@ -22,7 +22,10 @@
<Logger name="org.hibernate.type.descriptor.sql" <Logger name="org.hibernate.type.descriptor.sql"
level="trace"> level="trace">
</Logger>--> </Logger>-->
<Logger name="com.arsdigita.cms.ui.assets.AssetFolderBrowserController"
level="debug">
</Logger>
<Logger name="com.arsdigita.cms.ui.folder.FolderBrowserTableModelBuilder" <Logger name="com.arsdigita.cms.ui.folder.FolderBrowserTableModelBuilder"
level="debug"> level="debug">
</Logger> </Logger>

View File

@ -26,6 +26,7 @@ import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Paginator; import com.arsdigita.bebop.Paginator;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text; import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.TableActionAdapter; import com.arsdigita.bebop.event.TableActionAdapter;
@ -64,31 +65,31 @@ public class AssetFolderBrowser extends Table {
protected final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; protected final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
protected final static String SORT_KEY_CREATION_DATE = "creationDate"; protected final static String SORT_KEY_CREATION_DATE = "creationDate";
private final FolderSelectionModel folderSelectionModel; private final AssetPane assetPane;
private TableActionListener folderChanger; private TableActionListener folderChanger;
private TableActionListener folderDeleter; private TableActionListener folderDeleter;
private TableColumn nameColumn; private TableColumn nameColumn;
private TableColumn deleteColumn; private TableColumn deleteColumn;
private final StringParameter sortTypeParameter = new StringParameter( private final StringParameter sortTypeParameter = new StringParameter(
"sortType"); "sortType");
private final StringParameter sortDirectionParameter = new StringParameter( private final StringParameter sortDirectionParameter = new StringParameter(
"sortDir"); "sortDir");
private Paginator paginator; private Paginator paginator;
private long folderSize; private long folderSize;
public AssetFolderBrowser(final FolderSelectionModel folderSelectionModel) { public AssetFolderBrowser(final AssetPane assetPane) {
super(); super();
sortTypeParameter.setDefaultValue(SORT_KEY_NAME); sortTypeParameter.setDefaultValue(SORT_KEY_NAME);
sortDirectionParameter.setDefaultValue(SORT_ACTION_UP); sortDirectionParameter.setDefaultValue(SORT_ACTION_UP);
this.folderSelectionModel = folderSelectionModel; this.assetPane = assetPane;
initComponents(); initComponents();
} }
private void initComponents() { private void initComponents() {
setModelBuilder(new AssetFolderBrowserTableModelBuilder()); setModelBuilder(new AssetFolderBrowserTableModelBuilder());
final GlobalizedMessage[] headers = { final GlobalizedMessage[] headers = {
@ -105,24 +106,23 @@ public class AssetFolderBrowser extends Table {
setClassAttr("dataTable"); setClassAttr("dataTable");
getHeader().setDefaultRenderer( getHeader().setDefaultRenderer(
new com.arsdigita.cms.ui.util.DefaultTableCellRenderer()); new com.arsdigita.cms.ui.util.DefaultTableCellRenderer());
nameColumn = getColumn(AssetFolderBrowserTableModel.COL_NAME); nameColumn = getColumn(AssetFolderBrowserTableModel.COL_NAME);
nameColumn.setCellRenderer(new NameCellRenderer()); nameColumn.setCellRenderer(new NameCellRenderer());
nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME)); nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE) getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE)
.setHeaderRenderer( .setHeaderRenderer(
new HeaderCellRenderer(SORT_KEY_CREATION_DATE)); new HeaderCellRenderer(SORT_KEY_CREATION_DATE));
getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE) getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE)
.setCellRenderer(new DateCellRenderer()); .setCellRenderer(new DateCellRenderer());
getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED) getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED)
.setHeaderRenderer(new HeaderCellRenderer( .setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_LAST_MODIFIED_DATE)); SORT_KEY_LAST_MODIFIED_DATE));
getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED) getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED)
.setCellRenderer(new DateCellRenderer()); .setCellRenderer(new DateCellRenderer());
deleteColumn = getColumn(AssetFolderBrowserTableModel.COL_DELETEABLE); deleteColumn = getColumn(AssetFolderBrowserTableModel.COL_DELETEABLE);
deleteColumn.setCellRenderer(new ActionCellRenderer()); deleteColumn.setCellRenderer(new ActionCellRenderer());
@ -142,14 +142,19 @@ public class AssetFolderBrowser extends Table {
super.register(page); super.register(page);
page.addComponentStateParam(this, folderSelectionModel. page.addComponentStateParam(
getStateParameter()); this,
getFolderSelectionModel().getStateParameter());
page.addComponentStateParam(this, sortTypeParameter); page.addComponentStateParam(this, sortTypeParameter);
page.addComponentStateParam(this, sortDirectionParameter); page.addComponentStateParam(this, sortDirectionParameter);
} }
protected FolderSelectionModel getFolderSelectionModel() { protected FolderSelectionModel getFolderSelectionModel() {
return folderSelectionModel; return assetPane.getFolderSelectionModel();
}
protected SingleSelectionModel<Long> getSelectedAssetModel() {
return assetPane.getSelectedAssetModel();
} }
protected Paginator getPaginator() { protected Paginator getPaginator() {
@ -200,7 +205,7 @@ public class AssetFolderBrowser extends Table {
final String sortKey = (String) state.getValue(sortTypeParameter); final String sortKey = (String) state.getValue(sortTypeParameter);
final boolean isCurrentKey = sortKey.equals(key); final boolean isCurrentKey = sortKey.equals(key);
final String currentSortDirection = (String) state final String currentSortDirection = (String) state
.getValue(sortDirectionParameter); .getValue(sortDirectionParameter);
final String imageUrlStub; final String imageUrlStub;
if (SORT_ACTION_UP.equals(currentSortDirection)) { if (SORT_ACTION_UP.equals(currentSortDirection)) {
@ -217,7 +222,7 @@ public class AssetFolderBrowser extends Table {
// by default, everything sorts "up" unless it // by default, everything sorts "up" unless it
// is the current key and it is already pointing up // is the current key and it is already pointing up
if (SORT_ACTION_UP.equals(currentSortDirection) if (SORT_ACTION_UP.equals(currentSortDirection)
&& isCurrentKey) { && isCurrentKey) {
sortDirectionAction = SORT_ACTION_DOWN; sortDirectionAction = SORT_ACTION_DOWN;
} else { } else {
sortDirectionAction = SORT_ACTION_UP; sortDirectionAction = SORT_ACTION_UP;
@ -268,14 +273,14 @@ public class AssetFolderBrowser extends Table {
final String name = (String) value; final String name = (String) value;
final ContentSection section = CMS.getContext(). final ContentSection section = CMS.getContext().
getContentSection(); getContentSection();
final ContentSectionManager sectionManager = CdiUtil. final ContentSectionManager sectionManager = CdiUtil.
createCdiUtil() createCdiUtil()
.findBean(ContentSectionManager.class); .findBean(ContentSectionManager.class);
final boolean isFolder = ((AssetFolderBrowserTableModel) table final boolean isFolder = ((AssetFolderBrowserTableModel) table
.getTableModel(state)) .getTableModel(state))
.isFolder(); .isFolder();
final long objectId = getObjectId(key); final long objectId = getObjectId(key);
if (isFolder) { if (isFolder) {
@ -288,13 +293,14 @@ public class AssetFolderBrowser extends Table {
row, row,
column); column);
} else { } else {
return new ControlLink(new Text(name));
// return new Link(new Text(name), // return new Link(new Text(name),
// itemResolver.generateItemURL(state, // itemResolver.generateItemURL(state,
// objectId, // objectId,
// name, // name,
// section, // section,
// "DRAFT")); // "DRAFT"));
return new Text(name);
} }
} }
@ -339,13 +345,13 @@ public class AssetFolderBrowser extends Table {
return new Label("&nbsp;", false); return new Label("&nbsp;", false);
} else { } else {
final ControlLink link = new ControlLink( final ControlLink link = new ControlLink(
new Label( new Label(
new GlobalizedMessage("cms.ui.folder.delete", new GlobalizedMessage("cms.ui.folder.delete",
CmsConstants.CMS_FOLDER_BUNDLE))); CmsConstants.CMS_FOLDER_BUNDLE)));
link.setConfirmation( link.setConfirmation(
new GlobalizedMessage( new GlobalizedMessage(
"cms.ui.folder.delete_confirmation_assets", "cms.ui.folder.delete_confirmation_assets",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
return link; return link;
} }
} }
@ -367,7 +373,7 @@ public class AssetFolderBrowser extends Table {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetFolderBrowserController controller = cdiUtil.findBean( final AssetFolderBrowserController controller = cdiUtil.findBean(
AssetFolderBrowserController.class); AssetFolderBrowserController.class);
controller.deleteObject((String) event.getRowKey()); controller.deleteObject((String) event.getRowKey());
((Table) event.getSource()).clearSelection(state); ((Table) event.getSource()).clearSelection(state);
@ -387,9 +393,16 @@ public class AssetFolderBrowser extends Table {
} }
clearSelection(state); clearSelection(state);
getFolderSelectionModel().setSelectedKey( final String rowKey = (String) event.getRowKey();
state, if (rowKey.startsWith(CmsConstants.FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
getObjectId(event.getRowKey())); getFolderSelectionModel().setSelectedKey(state,
getObjectId(rowKey));
} else if (rowKey.startsWith(
CmsConstants.FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
getSelectedAssetModel().setSelectedKey(state,
getObjectId(rowKey));
assetPane.editAssetMode(state);
}
} }
} }

View File

@ -58,6 +58,8 @@ import org.librecms.contentsection.FolderRepository;
import java.util.Collections; import java.util.Collections;
import java.util.Optional; import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
@ -68,6 +70,9 @@ import static org.librecms.CmsConstants.*;
@RequestScoped @RequestScoped
public class AssetFolderBrowserController { public class AssetFolderBrowserController {
private static final Logger LOGGER = LogManager
.getLogger(AssetFolderBrowserController.class);
@Inject @Inject
private EntityManager entityManager; private EntityManager entityManager;
@ -106,7 +111,7 @@ public class AssetFolderBrowserController {
@PostConstruct @PostConstruct
private void init() { private void init() {
final KernelConfig kernelConfig = confManager.findConfiguration( final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class); KernelConfig.class);
defaultLocale = kernelConfig.getDefaultLocale(); defaultLocale = kernelConfig.getDefaultLocale();
} }
@ -123,9 +128,9 @@ public class AssetFolderBrowserController {
firstResult, firstResult,
maxResults); maxResults);
final List<AssetFolderBrowserTableRow> subFolderRows = subFolders final List<AssetFolderBrowserTableRow> subFolderRows = subFolders
.stream() .stream()
.map(subFolder -> buildRow(subFolder)) .map(subFolder -> buildRow(subFolder))
.collect(Collectors.toList()); .collect(Collectors.toList());
if (subFolders.size() > maxResults) { if (subFolders.size() > maxResults) {
return subFolderRows; return subFolderRows;
@ -140,9 +145,9 @@ public class AssetFolderBrowserController {
firstAsset, firstAsset,
maxAssets); maxAssets);
final List<AssetFolderBrowserTableRow> assetRows = assets final List<AssetFolderBrowserTableRow> assetRows = assets
.stream() .stream()
.map(asset -> buildRow(asset)) .map(asset -> buildRow(asset))
.collect(Collectors.toList()); .collect(Collectors.toList());
final List<AssetFolderBrowserTableRow> rows = new ArrayList<>(); final List<AssetFolderBrowserTableRow> rows = new ArrayList<>();
rows.addAll(subFolderRows); rows.addAll(subFolderRows);
@ -172,19 +177,19 @@ public class AssetFolderBrowserController {
criteriaQuery = criteriaQuery.select(builder.count(from)); criteriaQuery = criteriaQuery.select(builder.count(from));
final List<Folder> subFolders = findSubFolders( final List<Folder> subFolders = findSubFolders(
folder, folder,
filterTerm, filterTerm,
AssetFolderBrowser.SORT_KEY_NAME, AssetFolderBrowser.SORT_KEY_NAME,
AssetFolderBrowser.SORT_ACTION_UP, AssetFolderBrowser.SORT_ACTION_UP,
-1, -1,
-1); -1);
final List<Asset> assets = findAssetsInFolder( final List<Asset> assets = findAssetsInFolder(
folder, folder,
filterTerm, filterTerm,
AssetFolderBrowser.SORT_KEY_NAME, AssetFolderBrowser.SORT_KEY_NAME,
AssetFolderBrowser.SORT_ACTION_UP, AssetFolderBrowser.SORT_ACTION_UP,
-1, -1,
-1); -1);
if (subFolders.isEmpty() && assets.isEmpty()) { if (subFolders.isEmpty() && assets.isEmpty()) {
return 0; return 0;
@ -194,8 +199,8 @@ public class AssetFolderBrowserController {
criteriaQuery = criteriaQuery.where(from.in(subFolders)); criteriaQuery = criteriaQuery.where(from.in(subFolders));
} else { } else {
criteriaQuery = criteriaQuery.where(builder.or( criteriaQuery = criteriaQuery.where(builder.or(
from.in(subFolders), from.in(subFolders),
from.in(assets))); from.in(assets)));
} }
return entityManager.createQuery(criteriaQuery).getSingleResult(); return entityManager.createQuery(criteriaQuery).getSingleResult();
@ -213,17 +218,17 @@ public class AssetFolderBrowserController {
if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
copyFolder(targetFolder, copyFolder(targetFolder,
Long.parseLong(objectId.substring( Long.parseLong(objectId.substring(
FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()))); FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())));
} else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) { } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
copyAsset(targetFolder, copyAsset(targetFolder,
Long.parseLong(objectId.substring( Long.parseLong(objectId.substring(
FOLDER_BROWSER_KEY_PREFIX_ITEM.length()))); FOLDER_BROWSER_KEY_PREFIX_ASSET.length())));
} else { } else {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"ID '%s' does not start with '%s' or '%s'.", "ID '%s' does not start with '%s' or '%s'.",
objectId, objectId,
FOLDER_BROWSER_KEY_PREFIX_FOLDER, FOLDER_BROWSER_KEY_PREFIX_FOLDER,
FOLDER_BROWSER_KEY_PREFIX_ASSET)); FOLDER_BROWSER_KEY_PREFIX_ASSET));
} }
} }
@ -235,10 +240,10 @@ public class AssetFolderBrowserController {
Objects.requireNonNull(targetFolder); Objects.requireNonNull(targetFolder);
final Folder folder = folderRepo.findById(folderId) final Folder folder = folderRepo.findById(folderId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No folder with ID %d in the database. " "No folder with ID %d in the database. "
+ "Where did that ID come from?", + "Where did that ID come from?",
folderId))); folderId)));
folderManager.copyFolder(folder, targetFolder); folderManager.copyFolder(folder, targetFolder);
@ -250,10 +255,10 @@ public class AssetFolderBrowserController {
Objects.requireNonNull(targetFolder); Objects.requireNonNull(targetFolder);
final Asset asset = assetRepo final Asset asset = assetRepo
.findById(assetId) .findById(assetId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No asset ith ID %d in the database. Where did that ID come from?", "No asset ith ID %d in the database. Where did that ID come from?",
assetId))); assetId)));
assetManager.copy(asset, targetFolder); assetManager.copy(asset, targetFolder);
} }
@ -269,17 +274,17 @@ public class AssetFolderBrowserController {
if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
moveFolder(targetFolder, moveFolder(targetFolder,
Long.parseLong(objectId.substring( Long.parseLong(objectId.substring(
FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()))); FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())));
} else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) { } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
moveAsset(targetFolder, moveAsset(targetFolder,
Long.parseLong(objectId.substring( Long.parseLong(objectId.substring(
FOLDER_BROWSER_KEY_PREFIX_ASSET.length()))); FOLDER_BROWSER_KEY_PREFIX_ASSET.length())));
} else { } else {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"ID '%s' does not start with '%s' or '%s'.", "ID '%s' does not start with '%s' or '%s'.",
objectId, objectId,
FOLDER_BROWSER_KEY_PREFIX_FOLDER, FOLDER_BROWSER_KEY_PREFIX_FOLDER,
FOLDER_BROWSER_KEY_PREFIX_ASSET)); FOLDER_BROWSER_KEY_PREFIX_ASSET));
} }
} }
} }
@ -289,10 +294,10 @@ public class AssetFolderBrowserController {
Objects.requireNonNull(targetFolder); Objects.requireNonNull(targetFolder);
final Folder folder = folderRepo.findById(folderId) final Folder folder = folderRepo.findById(folderId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No folder with ID %d in the database. " "No folder with ID %d in the database. "
+ "Where did that ID come from?", + "Where did that ID come from?",
folderId))); folderId)));
folderManager.moveFolder(folder, targetFolder); folderManager.moveFolder(folder, targetFolder);
} }
@ -302,10 +307,10 @@ public class AssetFolderBrowserController {
Objects.requireNonNull(targetFolder); Objects.requireNonNull(targetFolder);
final Asset asset = assetRepo final Asset asset = assetRepo
.findById(assetId) .findById(assetId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No asset with ID %d in the database. Where did that ID come from?", "No asset with ID %d in the database. Where did that ID come from?",
assetId))); assetId)));
assetManager.move(asset, targetFolder); assetManager.move(asset, targetFolder);
} }
@ -316,20 +321,20 @@ public class AssetFolderBrowserController {
Objects.requireNonNull(sources); Objects.requireNonNull(sources);
final List<String> sourceFolderIds = sources final List<String> sourceFolderIds = sources
.stream() .stream()
.filter(source -> source.startsWith( .filter(source -> source.startsWith(
FOLDER_BROWSER_KEY_PREFIX_FOLDER)) FOLDER_BROWSER_KEY_PREFIX_FOLDER))
.collect(Collectors.toList()); .collect(Collectors.toList());
final List<String> parentFolderIds = sourceFolderIds final List<String> parentFolderIds = sourceFolderIds
.stream() .stream()
.map(sourceFolderId -> findParentFolderId(sourceFolderId)) .map(sourceFolderId -> findParentFolderId(sourceFolderId))
.filter(Optional::isPresent) .filter(Optional::isPresent)
.map(Optional::get) .map(Optional::get)
.collect(Collectors.toList()); .collect(Collectors.toList());
final List<List<String>> subFolderIds = sourceFolderIds final List<List<String>> subFolderIds = sourceFolderIds
.stream() .stream()
.map(sourceFolderId -> findSubFolderIds(sourceFolderId)) .map(sourceFolderId -> findSubFolderIds(sourceFolderId))
.collect(Collectors.toList()); .collect(Collectors.toList());
final List<String> invalidTargetIds = new ArrayList<>(); final List<String> invalidTargetIds = new ArrayList<>();
invalidTargetIds.addAll(sourceFolderIds); invalidTargetIds.addAll(sourceFolderIds);
@ -348,26 +353,26 @@ public class AssetFolderBrowserController {
if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Provided string '%s' is not an ID of a folder.", "Provided string '%s' is not an ID of a folder.",
folderId)); folderId));
} }
final long objectId = Long.parseLong(folderId.substring( final long objectId = Long.parseLong(folderId.substring(
FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
final Folder folder = folderRepo.findById(objectId) final Folder folder = folderRepo.findById(objectId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No folder with ID %d found in database. " "No folder with ID %d found in database. "
+ "Where did that ID come form?", + "Where did that ID come form?",
objectId))); objectId)));
final Optional<Folder> parentFolder = folderManager.getParentFolder( final Optional<Folder> parentFolder = folderManager.getParentFolder(
folder); folder);
if (parentFolder.isPresent()) { if (parentFolder.isPresent()) {
return Optional.empty(); return Optional.empty();
} else { } else {
return Optional.ofNullable(String.format( return Optional.ofNullable(String.format(
"%s%d", "%s%d",
FOLDER_BROWSER_KEY_PREFIX_FOLDER, FOLDER_BROWSER_KEY_PREFIX_FOLDER,
parentFolder.get().getObjectId())); parentFolder.get().getObjectId()));
} }
} }
@ -377,23 +382,23 @@ public class AssetFolderBrowserController {
if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Provided string '%s' is not the ID of a folder.", "Provided string '%s' is not the ID of a folder.",
folderId)); folderId));
} }
final long objectId = Long.parseLong(folderId.substring( final long objectId = Long.parseLong(folderId.substring(
FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
final Folder folder = folderRepo.findById(objectId) final Folder folder = folderRepo.findById(objectId)
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.format(
"No folder with ID %d found in database. " "No folder with ID %d found in database. "
+ "Where did that ID come form?", + "Where did that ID come form?",
objectId))); objectId)));
return findSubFolders(folder) return findSubFolders(folder)
.stream() .stream()
.map(subFolder -> String.format("%s%d", .map(subFolder -> String.format("%s%d",
FOLDER_BROWSER_KEY_PREFIX_FOLDER, FOLDER_BROWSER_KEY_PREFIX_FOLDER,
subFolder.getObjectId())) subFolder.getObjectId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
private List<Folder> findSubFolders(final Folder folder) { private List<Folder> findSubFolders(final Folder folder) {
@ -401,7 +406,7 @@ public class AssetFolderBrowserController {
Objects.requireNonNull(folder); Objects.requireNonNull(folder);
if (folder.getSubFolders() == null if (folder.getSubFolders() == null
|| folder.getSubFolders().isEmpty()) { || folder.getSubFolders().isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -426,21 +431,21 @@ public class AssetFolderBrowserController {
if (objectId.startsWith("folder-")) { if (objectId.startsWith("folder-")) {
final long folderId = Long.parseLong( final long folderId = Long.parseLong(
objectId.substring("folder-".length())); objectId.substring("folder-".length()));
folderRepo folderRepo
.findById(folderId) .findById(folderId)
.ifPresent(folderRepo::delete); .ifPresent(folderRepo::delete);
} else if (objectId.startsWith("asset-")) { } else if (objectId.startsWith("asset-")) {
final long assetId = Long.parseLong( final long assetId = Long.parseLong(
objectId.substring("asset-".length())); objectId.substring("asset-".length()));
assetRepo assetRepo
.findById(assetId) .findById(assetId)
.ifPresent(assetRepo::delete); .ifPresent(assetRepo::delete);
} else { } else {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"The objectId is expected to start with 'folder-' or 'item.'."); "The objectId is expected to start with 'folder-' or 'asset-'.");
} }
} }
@ -452,15 +457,15 @@ public class AssetFolderBrowserController {
row.setObjectUuid(folder.getUuid()); row.setObjectUuid(folder.getUuid());
row.setName(folder.getName()); row.setName(folder.getName());
if (folder.getTitle().hasValue(globalizationHelper if (folder.getTitle().hasValue(globalizationHelper
.getNegotiatedLocale())) { .getNegotiatedLocale())) {
row.setTitle(folder.getTitle().getValue(globalizationHelper row.setTitle(folder.getTitle().getValue(globalizationHelper
.getNegotiatedLocale())); .getNegotiatedLocale()));
} else { } else {
row.setTitle(folder.getTitle().getValue(defaultLocale)); row.setTitle(folder.getTitle().getValue(defaultLocale));
} }
row.setFolder(true); row.setFolder(true);
row.setDeletable(!categoryManager.hasSubCategories(folder) row.setDeletable(!categoryManager.hasSubCategories(folder)
&& !categoryManager.hasObjects(folder)); && !categoryManager.hasObjects(folder));
return row; return row;
} }
@ -473,14 +478,14 @@ public class AssetFolderBrowserController {
row.setObjectUuid(asset.getUuid()); row.setObjectUuid(asset.getUuid());
row.setName(asset.getDisplayName()); row.setName(asset.getDisplayName());
if (asset.getTitle().hasValue(globalizationHelper if (asset.getTitle().hasValue(globalizationHelper
.getNegotiatedLocale())) { .getNegotiatedLocale())) {
row.setTitle(asset.getTitle().getValue(globalizationHelper row.setTitle(asset.getTitle().getValue(globalizationHelper
.getNegotiatedLocale())); .getNegotiatedLocale()));
} else { } else {
row.setTitle(asset.getTitle().getValue(defaultLocale)); row.setTitle(asset.getTitle().getValue(defaultLocale));
} }
final AssetTypeInfo typeInfo = typesManager final AssetTypeInfo typeInfo = typesManager
.getAssetTypeInfo(asset.getClass()); .getAssetTypeInfo(asset.getClass());
row.setTypeLabelBundle(typeInfo.getLabelBundle()); row.setTypeLabelBundle(typeInfo.getLabelBundle());
row.setTypeLabelKey(typeInfo.getLabelKey()); row.setTypeLabelKey(typeInfo.getLabelKey());
@ -501,30 +506,32 @@ public class AssetFolderBrowserController {
final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Folder> criteria = builder final CriteriaQuery<Folder> criteria = builder
.createQuery(Folder.class); .createQuery(Folder.class);
final Root<Folder> from = criteria.from(Folder.class); final Root<Folder> from = criteria.from(Folder.class);
final Order order; final Order order;
if (AssetFolderBrowser.SORT_KEY_NAME.equals(orderBy) if (AssetFolderBrowser.SORT_KEY_NAME.equals(orderBy)
&& AssetFolderBrowser.SORT_ACTION_DOWN. && AssetFolderBrowser.SORT_ACTION_DOWN.
equals(orderDirection)) { equals(orderDirection)) {
order = builder.desc(from.get("name")); order = builder.desc(from.get("name"));
} else { } else {
order = builder.asc(from.get("name")); order = builder.asc(from.get("name"));
} }
final TypedQuery<Folder> query = entityManager final TypedQuery<Folder> query = entityManager
.createQuery( .createQuery(
criteria.where( criteria.where(
builder.and( builder.and(
builder.equal(from.get("parentCategory"), builder.
folder), equal(from.get("parentCategory"),
builder.like(builder.lower(from.get("name")), folder),
filterTerm) builder.like(builder.lower(from.get(
) "name")),
) filterTerm)
.orderBy(order) )
); )
.orderBy(order)
);
if (firstResult >= 0) { if (firstResult >= 0) {
query.setFirstResult(firstResult); query.setFirstResult(firstResult);
@ -573,22 +580,37 @@ public class AssetFolderBrowserController {
order = builder.asc(orderPath); 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<Asset> query = entityManager final TypedQuery<Asset> query = entityManager
.createQuery( .createQuery(
criteria.select(fromAsset) criteria.select(fromAsset)
.where( .where(
builder.and( builder.and(
builder.equal(join.get( builder.equal(join.get(
"category"), folder), "category"), folder),
builder.equal(join.get("type"), builder.equal(join.get("type"),
CmsConstants.CATEGORIZATION_TYPE_FOLDER), CmsConstants.CATEGORIZATION_TYPE_FOLDER),
builder.like(builder.lower(fromAsset.get( builder.like(builder.lower(
"displayName")), fromAsset.get(
filterTerm) "displayName")),
) filterTerm)
) )
.orderBy(order) )
); .orderBy(order)
);
if (firstResult >= 0) { if (firstResult >= 0) {
query.setFirstResult(firstResult); query.setFirstResult(firstResult);

View File

@ -96,7 +96,7 @@ class AssetFolderBrowserTableModel implements TableModel {
if (currentRow.isFolder()) { if (currentRow.isFolder()) {
return String.format("folder-%d", currentRow.getObjectId()); return String.format("folder-%d", currentRow.getObjectId());
} else { } else {
return String.format("item-%d", currentRow.getObjectId()); return String.format("asset-%d", currentRow.getObjectId());
} }
// return currentRow.getObjectId(); // return currentRow.getObjectId();

View File

@ -39,25 +39,25 @@ import java.util.List;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
class AssetFolderBrowserTableModelBuilder class AssetFolderBrowserTableModelBuilder
extends LockableImpl extends LockableImpl
implements TableModelBuilder { implements TableModelBuilder {
private static final Logger LOGGER = LogManager private static final Logger LOGGER = LogManager
.getLogger(AssetFolderBrowserTableModelBuilder.class); .getLogger(AssetFolderBrowserTableModelBuilder.class);
@Override @Override
public TableModel makeModel(final Table table, public TableModel makeModel(final Table table,
final PageState state) { final PageState state) {
if (!(table instanceof AssetFolderBrowser)) { if (!(table instanceof AssetFolderBrowser)) {
throw new IllegalArgumentException("The " throw new IllegalArgumentException(
+ "AssetFolderBrowserTableModelBuilder can only be used for the " "The AssetFolderBrowserTableModelBuilder can only be used "
+ "AssetFolderBrowser."); + "for the AssetFolderBrowser.");
} }
final AssetFolderBrowser assetFolderBrowser = (AssetFolderBrowser) table; final AssetFolderBrowser assetFolderBrowser = (AssetFolderBrowser) table;
final FolderSelectionModel folderSelectionModel = assetFolderBrowser final FolderSelectionModel folderSelectionModel = assetFolderBrowser
.getFolderSelectionModel(); .getFolderSelectionModel();
final Folder folder = folderSelectionModel.getSelectedObject(state); final Folder folder = folderSelectionModel.getSelectedObject(state);
if (folder == null) { if (folder == null) {
return Table.EMPTY_MODEL; return Table.EMPTY_MODEL;
@ -66,7 +66,7 @@ class AssetFolderBrowserTableModelBuilder
final Paginator paginator = assetFolderBrowser.getPaginator(); final Paginator paginator = assetFolderBrowser.getPaginator();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetFolderBrowserController controller = cdiUtil final AssetFolderBrowserController controller = cdiUtil
.findBean(AssetFolderBrowserController.class); .findBean(AssetFolderBrowserController.class);
final String orderBy; final String orderBy;
if (assetFolderBrowser.getSortType(state) == null) { if (assetFolderBrowser.getSortType(state) == null) {
orderBy = AssetFolderBrowser.SORT_KEY_NAME; orderBy = AssetFolderBrowser.SORT_KEY_NAME;
@ -85,12 +85,12 @@ class AssetFolderBrowserTableModelBuilder
final long start = System.nanoTime(); final long start = System.nanoTime();
LOGGER.debug("Retrieving table rows..."); LOGGER.debug("Retrieving table rows...");
final List<AssetFolderBrowserTableRow> rows = controller final List<AssetFolderBrowserTableRow> rows = controller
.getAssetRows(folder, .getAssetRows(folder,
orderBy, orderBy,
orderDirection, orderDirection,
first - 1, first - 1,
pageSize); pageSize);
LOGGER.debug("Retrieve table rows in {} ms.", LOGGER.debug("Retrieve table rows in {} ms.",
(System.nanoTime() - start) / 1000); (System.nanoTime() - start) / 1000);
return new AssetFolderBrowserTableModel(rows); return new AssetFolderBrowserTableModel(rows);

View File

@ -39,6 +39,9 @@ import org.librecms.contentsection.Asset;
import org.librecms.contentsection.AssetRepository; import org.librecms.contentsection.AssetRepository;
import java.util.Optional; import java.util.Optional;
import org.libreccm.categorization.CategoryManager;
import org.librecms.contentsection.Folder;
import org.librecms.contentsection.FolderManager;
/** /**
* *
@ -75,6 +78,10 @@ public abstract class AssetForm extends Form implements FormInitListener,
saveCancelSection = new SaveCancelSection(); saveCancelSection = new SaveCancelSection();
add(saveCancelSection); add(saveCancelSection);
addInitListener(this);
addProcessListener(this);
addSubmissionListener(this);
} }
protected void addWidgets() { protected void addWidgets() {
@ -92,12 +99,13 @@ public abstract class AssetForm extends Form implements FormInitListener,
} else { } else {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetRepository assetRepo = cdiUtil.findBean( final AssetRepository assetRepo = cdiUtil.findBean(
AssetRepository.class); AssetRepository.class);
final Asset asset = assetRepo final Asset asset = assetRepo
.findById(selectionModel.getSelectedKey(state)) .findById(selectionModel.getSelectedKey(state))
.orElseThrow(() -> new IllegalArgumentException(String.format( .orElseThrow(() -> new IllegalArgumentException(String.
"No asset with ID %d in the database.", format(
selectionModel.getSelectedKey(state)))); "No asset with ID %d in the database.",
selectionModel.getSelectedKey(state))));
return Optional.of(asset); return Optional.of(asset);
} }
} }
@ -112,18 +120,18 @@ public abstract class AssetForm extends Form implements FormInitListener,
if (selectedAsset.isPresent()) { if (selectedAsset.isPresent()) {
title.setValue(state, title.setValue(state,
selectedAsset selectedAsset
.get() .get()
.getTitle() .getTitle()
.getValue(KernelConfig .getValue(KernelConfig
.getConfig() .getConfig()
.getDefaultLocale())); .getDefaultLocale()));
} }
} }
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
@ -138,26 +146,45 @@ public abstract class AssetForm extends Form implements FormInitListener,
} }
asset.getTitle().addValue( asset.getTitle().addValue(
KernelConfig.getConfig().getDefaultLocale(), KernelConfig.getConfig().getDefaultLocale(),
(String) title.getValue(state)); (String) title.getValue(state));
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetRepository assetRepo = cdiUtil final AssetRepository assetRepo = cdiUtil
.findBean(AssetRepository.class); .findBean(AssetRepository.class);
assetRepo.save(asset); assetRepo.save(asset);
if (!selectedAsset.isPresent()) {
//Set display name
asset.setDisplayName((String) title.getValue(state));
assetRepo.save(asset);
//Add new asset to currently selected folder
final Folder selectedFolder = assetPane
.getFolderSelectionModel()
.getSelectedObject(state);
final CategoryManager categoryManager = cdiUtil
.findBean(CategoryManager.class);
categoryManager.addObjectToCategory(
asset,
selectedFolder,
CmsConstants.CATEGORIZATION_TYPE_FOLDER);
}
assetPane.browseMode(state);
} }
} }
protected abstract Asset createAsset(final PageState state) protected abstract Asset createAsset(final PageState state)
throws FormProcessException; throws FormProcessException;
protected abstract void updateAsset(final Asset asset, protected abstract void updateAsset(final Asset asset,
final PageState state) final PageState state)
throws FormProcessException; throws FormProcessException;
@Override @Override
public void submitted(final FormSectionEvent event) public void submitted(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();

View File

@ -26,6 +26,7 @@ import com.arsdigita.bebop.Form;
import com.arsdigita.bebop.FormData; import com.arsdigita.bebop.FormData;
import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.MetaForm;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Paginator; import com.arsdigita.bebop.Paginator;
@ -69,6 +70,7 @@ import com.arsdigita.cms.ui.folder.FolderTreeModelController;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.toolbox.ui.LayoutPanel; import com.arsdigita.toolbox.ui.LayoutPanel;
import java.lang.reflect.InvocationTargetException;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@ -98,6 +100,7 @@ import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.TooManyListenersException; import java.util.TooManyListenersException;
import java.util.logging.Level;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
@ -121,9 +124,11 @@ public class AssetPane extends LayoutPanel implements Resettable {
private final FolderRequestLocal folderRequestLocal; private final FolderRequestLocal folderRequestLocal;
private final SingleSelectionModel<Long> selectedAssetModel; private final SingleSelectionModel<Long> selectedAssetModel;
private final ArrayParameter sourcesParameter = new ArrayParameter( private final ArrayParameter sourcesParameter = new ArrayParameter(
new StringParameter(SOURCES_PARAM)); new StringParameter(SOURCES_PARAM));
private final StringParameter actionParameter = new StringParameter( private final StringParameter actionParameter = new StringParameter(
ACTION_PARAM); ACTION_PARAM);
private final StringParameter selectedAssetTypeParam = new StringParameter(
"selected_asset_type");
private AssetFolderBrowser folderBrowser; private AssetFolderBrowser folderBrowser;
private Form browserForm; private Form browserForm;
@ -136,7 +141,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
private SegmentedPanel.Segment actionsSegment; private SegmentedPanel.Segment actionsSegment;
private SegmentedPanel.Segment newFolderSegment; private SegmentedPanel.Segment newFolderSegment;
private SegmentedPanel.Segment editFolderSegment; private SegmentedPanel.Segment editFolderSegment;
private SegmentedPanel.Segment editAssetSegement; private SegmentedPanel.Segment editAssetSegment;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public AssetPane() { public AssetPane() {
@ -145,8 +150,8 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
protected Folder getRootFolder(final PageState state) { protected Folder getRootFolder(final PageState state) {
final ContentSection section = CMS final ContentSection section = CMS
.getContext() .getContext()
.getContentSection(); .getContentSection();
return section.getRootAssetsFolder(); return section.getRootAssetsFolder();
} }
@ -157,8 +162,8 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
protected Long getRootFolderID(final PageState state) { protected Long getRootFolderID(final PageState state) {
final ContentSection section = CMS final ContentSection section = CMS
.getContext() .getContext()
.getContentSection(); .getContentSection();
return section.getRootAssetsFolder().getObjectId(); return section.getRootAssetsFolder().getObjectId();
} }
@ -166,14 +171,14 @@ public class AssetPane extends LayoutPanel implements Resettable {
folderRequestLocal = new FolderRequestLocal(folderSelectionModel); folderRequestLocal = new FolderRequestLocal(folderSelectionModel);
selectedAssetModel = new ParameterSingleSelectionModel<>( selectedAssetModel = new ParameterSingleSelectionModel<>(
new LongParameter("selected-asset")); new LongParameter("selected-asset"));
final SegmentedPanel left = new SegmentedPanel(); final SegmentedPanel left = new SegmentedPanel();
setLeft(left); setLeft(left);
final Label heading = new Label( final Label heading = new Label(
new GlobalizedMessage("cms.ui.folder_browser", new GlobalizedMessage("cms.ui.folder_browser",
CmsConstants.CMS_BUNDLE)); CmsConstants.CMS_BUNDLE));
left.addSegment(heading, tree); left.addSegment(heading, tree);
// final Text placeholder = new Text("Placeholder"); // final Text placeholder = new Text("Placeholder");
@ -189,17 +194,17 @@ public class AssetPane extends LayoutPanel implements Resettable {
browserForm = new Form("assetFolderBrowser", browserForm = new Form("assetFolderBrowser",
new BoxPanel(BoxPanel.VERTICAL)); new BoxPanel(BoxPanel.VERTICAL));
browserForm.setMethod(Form.GET); browserForm.setMethod(Form.GET);
folderBrowser = new AssetFolderBrowser(folderSelectionModel); folderBrowser = new AssetFolderBrowser(this);
final Paginator paginator = new Paginator( final Paginator paginator = new Paginator(
new AssetFolderBrowserPaginationModelBuilder(folderBrowser), new AssetFolderBrowserPaginationModelBuilder(folderBrowser),
CMSConfig.getConfig().getFolderBrowseListSize()); CMSConfig.getConfig().getFolderBrowseListSize());
folderBrowser.setPaginator(paginator); folderBrowser.setPaginator(paginator);
final CheckboxGroup checkboxGroup = new CheckboxGroup(sourcesParameter); final CheckboxGroup checkboxGroup = new CheckboxGroup(sourcesParameter);
browserForm.add(checkboxGroup); browserForm.add(checkboxGroup);
final TableColumn checkboxCol = new TableColumn(); final TableColumn checkboxCol = new TableColumn();
checkboxCol.setHeaderValue( checkboxCol.setHeaderValue(
new GlobalizedMessage("empty_text", CmsConstants.CMS_BUNDLE)); new GlobalizedMessage("empty_text", CmsConstants.CMS_BUNDLE));
checkboxCol.setCellRenderer(new TableCellRenderer() { checkboxCol.setCellRenderer(new TableCellRenderer() {
@Override @Override
@ -224,31 +229,31 @@ public class AssetPane extends LayoutPanel implements Resettable {
browserForm.add(folderBrowser); browserForm.add(folderBrowser);
final SimpleContainer actionFormContainer = new SimpleContainer(); final SimpleContainer actionFormContainer = new SimpleContainer();
actionFormContainer.add(new Label( actionFormContainer.add(new Label(
new GlobalizedMessage( new GlobalizedMessage(
"cms.ui.folder.edit_selection", "cms.ui.folder.edit_selection",
CmsConstants.CMS_FOLDER_BUNDLE))); CmsConstants.CMS_FOLDER_BUNDLE)));
actionSelect = new SingleSelect(actionParameter); actionSelect = new SingleSelect(actionParameter);
actionSelect.addOption( actionSelect.addOption(
new Option(COPY, new Option(COPY,
new Label(new GlobalizedMessage( new Label(new GlobalizedMessage(
"cms.ui.folder.copy.action", "cms.ui.folder.copy.action",
CmsConstants.CMS_FOLDER_BUNDLE)))); CmsConstants.CMS_FOLDER_BUNDLE))));
actionSelect.addOption( actionSelect.addOption(
new Option(MOVE, new Option(MOVE,
new Label(new GlobalizedMessage( new Label(new GlobalizedMessage(
"cms.ui.folder.move.action", "cms.ui.folder.move.action",
CmsConstants.CMS_FOLDER_BUNDLE)))); CmsConstants.CMS_FOLDER_BUNDLE))));
actionFormContainer.add(actionSelect); actionFormContainer.add(actionSelect);
actionSubmit = new Submit( actionSubmit = new Submit(
"Go", "Go",
new GlobalizedMessage("cms.ui.folder.go", new GlobalizedMessage("cms.ui.folder.go",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
actionFormContainer.add(actionSubmit); actionFormContainer.add(actionSubmit);
browserForm.addProcessListener(new FormProcessListener() { browserForm.addProcessListener(new FormProcessListener() {
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
@ -264,7 +269,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
@ -285,12 +290,12 @@ public class AssetPane extends LayoutPanel implements Resettable {
}); });
targetSelector.addValidationListener( targetSelector.addValidationListener(
new TargetSelectorValidationListener()); new TargetSelectorValidationListener());
targetSelector.addSubmissionListener(new FormSubmissionListener() { targetSelector.addSubmissionListener(new FormSubmissionListener() {
@Override @Override
public void submitted(final FormSectionEvent event) public void submitted(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
@ -298,8 +303,8 @@ public class AssetPane extends LayoutPanel implements Resettable {
reset(state); reset(state);
browseMode(state); browseMode(state);
throw new FormProcessException(new GlobalizedMessage( throw new FormProcessException(new GlobalizedMessage(
"cms.ui.folder.cancelled", "cms.ui.folder.cancelled",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
} }
} }
@ -321,13 +326,13 @@ public class AssetPane extends LayoutPanel implements Resettable {
final Label target = (Label) event.getTarget(); final Label target = (Label) event.getTarget();
final long selectedId = Long.parseLong(selectionModel final long selectedId = Long.parseLong(selectionModel
.getSelectedKey(state).toString()); .getSelectedKey(state).toString());
final long currentFolderId = folderSelectionModel final long currentFolderId = folderSelectionModel
.getSelectedObject(state).getObjectId(); .getSelectedObject(state).getObjectId();
target.setLabel(String.format( target.setLabel(String.format(
"selectedId = %d; currentFolderId = %d", "selectedId = %d; currentFolderId = %d",
selectedId, selectedId,
currentFolderId)); currentFolderId));
} }
}); });
@ -340,19 +345,19 @@ public class AssetPane extends LayoutPanel implements Resettable {
actionsSegment.add(actions); actionsSegment.add(actions);
final FolderCreateForm folderCreateForm = new FolderCreateForm( final FolderCreateForm folderCreateForm = new FolderCreateForm(
"fcreat", folderSelectionModel); "fcreat", folderSelectionModel);
folderCreateForm.addSubmissionListener(new FormSubmissionListener() { folderCreateForm.addSubmissionListener(new FormSubmissionListener() {
@Override @Override
public void submitted(final FormSectionEvent event) public void submitted(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
if (event.getSource() == folderCreateForm if (event.getSource() == folderCreateForm
&& folderCreateForm.isCancelled(state)) { && folderCreateForm.isCancelled(state)) {
browseMode(state); browseMode(state);
throw new FormProcessException(new GlobalizedMessage( throw new FormProcessException(new GlobalizedMessage(
"cms.ui.cancelled", CmsConstants.CMS_BUNDLE)); "cms.ui.cancelled", CmsConstants.CMS_BUNDLE));
} }
} }
@ -362,7 +367,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final Object source = event.getSource(); final Object source = event.getSource();
@ -373,24 +378,24 @@ public class AssetPane extends LayoutPanel implements Resettable {
}); });
newFolderSegment = panel.addSegment( newFolderSegment = panel.addSegment(
new Label(new GlobalizedMessage("cms.ui.new_folder", new Label(new GlobalizedMessage("cms.ui.new_folder",
CmsConstants.CMS_BUNDLE)), CmsConstants.CMS_BUNDLE)),
folderCreateForm); folderCreateForm);
final FolderEditorForm folderEditorForm = new FolderEditorForm( final FolderEditorForm folderEditorForm = new FolderEditorForm(
"fedit", folderSelectionModel); "fedit", folderSelectionModel);
folderEditorForm.addSubmissionListener(new FormSubmissionListener() { folderEditorForm.addSubmissionListener(new FormSubmissionListener() {
@Override @Override
public void submitted(final FormSectionEvent event) public void submitted(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
if (event.getSource() == folderEditorForm if (event.getSource() == folderEditorForm
&& folderEditorForm.isCancelled(state)) { && folderEditorForm.isCancelled(state)) {
browseMode(state); browseMode(state);
throw new FormProcessException(new GlobalizedMessage( throw new FormProcessException(new GlobalizedMessage(
"cms.ui.cancelled", CmsConstants.CMS_BUNDLE)); "cms.ui.cancelled", CmsConstants.CMS_BUNDLE));
} }
} }
@ -399,7 +404,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final Object source = event.getSource(); final Object source = event.getSource();
@ -410,13 +415,13 @@ public class AssetPane extends LayoutPanel implements Resettable {
}); });
editFolderSegment = panel.addSegment( editFolderSegment = panel.addSegment(
new Label(new GlobalizedMessage("cms.ui.edit_folder", new Label(new GlobalizedMessage("cms.ui.edit_folder",
CmsConstants.CMS_BUNDLE)), CmsConstants.CMS_BUNDLE)),
folderEditorForm); folderEditorForm);
final ActionLink createFolderAction = new ActionLink( final ActionLink createFolderAction = new ActionLink(
new Label(new GlobalizedMessage("cms.ui.new_folder", new Label(new GlobalizedMessage("cms.ui.new_folder",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
createFolderAction.addActionListener(new ActionListener() { createFolderAction.addActionListener(new ActionListener() {
@Override @Override
@ -432,8 +437,8 @@ public class AssetPane extends LayoutPanel implements Resettable {
actions.addAction(createFolderAction); actions.addAction(createFolderAction);
final ActionLink editFolderAction = new ActionLink( final ActionLink editFolderAction = new ActionLink(
new Label(new GlobalizedMessage("cms.ui.edit_folder", new Label(new GlobalizedMessage("cms.ui.edit_folder",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
editFolderAction.addActionListener(new ActionListener() { editFolderAction.addActionListener(new ActionListener() {
@Override @Override
@ -451,9 +456,9 @@ public class AssetPane extends LayoutPanel implements Resettable {
final Form newAssetForm = new Form("new-asset-form", final Form newAssetForm = new Form("new-asset-form",
new BoxPanel(BoxPanel.HORIZONTAL)); new BoxPanel(BoxPanel.HORIZONTAL));
newAssetForm.add(new Label(new GlobalizedMessage( newAssetForm.add(new Label(new GlobalizedMessage(
"cms.ui.assets.new", CmsConstants.CMS_BUNDLE))); "cms.ui.assets.new", CmsConstants.CMS_BUNDLE)));
final SingleSelect newAssetTypeSelect = new SingleSelect( final SingleSelect newAssetTypeSelect = new SingleSelect(
"new-asset-type-select"); selectedAssetTypeParam);
try { try {
newAssetTypeSelect.addPrintListener(new PrintListener() { newAssetTypeSelect.addPrintListener(new PrintListener() {
@ -461,18 +466,19 @@ public class AssetPane extends LayoutPanel implements Resettable {
public void prepare(final PrintEvent event) { public void prepare(final PrintEvent event) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetTypesManager typesManager = cdiUtil final AssetTypesManager typesManager = cdiUtil
.findBean(AssetTypesManager.class); .findBean(AssetTypesManager.class);
final SingleSelect target = (SingleSelect) event.getTarget(); final SingleSelect target = (SingleSelect) event.getTarget();
target.clearOptions();
for (final AssetTypeInfo type : typesManager for (final AssetTypeInfo type : typesManager
.getAvailableAssetTypes()) { .getAvailableAssetTypes()) {
final String labelKey = type.getLabelKey(); final String labelKey = type.getLabelKey();
final String labelBundle = type.getLabelBundle(); final String labelBundle = type.getLabelBundle();
final ResourceBundle bundle = ResourceBundle final ResourceBundle bundle = ResourceBundle
.getBundle(labelBundle); .getBundle(labelBundle);
final String label = bundle.getString(labelKey); final String label = bundle.getString(labelKey);
target.addOption(new Option( target.addOption(new Option(
type.getAssetClass().getName(), type.getAssetClass().getName(),
new Text(label))); new Text(label)));
} }
} }
@ -482,20 +488,94 @@ public class AssetPane extends LayoutPanel implements Resettable {
} }
newAssetForm.add(newAssetTypeSelect); newAssetForm.add(newAssetTypeSelect);
newAssetForm.add(new Submit(new GlobalizedMessage( newAssetForm.add(new Submit(new GlobalizedMessage(
"cms.ui.assets.new.create", CmsConstants.CMS_BUNDLE))); "cms.ui.assets.new.create", CmsConstants.CMS_BUNDLE)));
newAssetForm.addProcessListener(new FormProcessListener() { newAssetForm.addProcessListener(new FormProcessListener() {
@Override @Override
public void process(final FormSectionEvent event) public void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
editAssetMode(event.getPageState());
//Nothing yet
} }
}); });
actionsSegment.add(newAssetForm); actionsSegment.add(newAssetForm);
final MetaForm editAssetForm = new MetaForm(MOVE) {
@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 AssetForm> 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();
if (selectedAssetModel.isSelected(state)) {
target.setLabel(new GlobalizedMessage(
"cms.ui.admin.assets.edit",
CmsConstants.CMS_BUNDLE));
} else {
target.setLabel(new GlobalizedMessage(
"cms.ui.admin.assets.create",
CmsConstants.CMS_BUNDLE));
}
}
}));
editAssetSegment.add(editAssetForm);
return panel; return panel;
} }
@ -509,6 +589,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
actionsSegment.setVisible(state, true); actionsSegment.setVisible(state, true);
newFolderSegment.setVisible(state, false); newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, false); editFolderSegment.setVisible(state, false);
editAssetSegment.setVisible(state, false);
} }
@ -522,6 +603,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
newFolderSegment.setVisible(state, false); newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, false); editFolderSegment.setVisible(state, false);
targetSelector.expose(state); targetSelector.expose(state);
editAssetSegment.setVisible(state, false);
} }
protected void newFolderMode(final PageState state) { protected void newFolderMode(final PageState state) {
@ -533,6 +615,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
actionsSegment.setVisible(state, false); actionsSegment.setVisible(state, false);
newFolderSegment.setVisible(state, true); newFolderSegment.setVisible(state, true);
editFolderSegment.setVisible(state, false); editFolderSegment.setVisible(state, false);
editAssetSegment.setVisible(state, false);
} }
protected void editFolderMode(final PageState state) { protected void editFolderMode(final PageState state) {
@ -542,6 +625,17 @@ public class AssetPane extends LayoutPanel implements Resettable {
actionsSegment.setVisible(state, false); actionsSegment.setVisible(state, false);
newFolderSegment.setVisible(state, false); newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, true); editFolderSegment.setVisible(state, true);
editAssetSegment.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);
} }
@Override @Override
@ -560,9 +654,13 @@ public class AssetPane extends LayoutPanel implements Resettable {
page.setVisibleDefault(actionsSegment, true); page.setVisibleDefault(actionsSegment, true);
page.setVisibleDefault(newFolderSegment, false); page.setVisibleDefault(newFolderSegment, false);
page.setVisibleDefault(editFolderSegment, false); page.setVisibleDefault(editFolderSegment, false);
page.setVisibleDefault(editAssetSegment, false);
page.addComponentStateParam(this, actionParameter); page.addComponentStateParam(this, actionParameter);
page.addComponentStateParam(this, sourcesParameter); page.addComponentStateParam(this, sourcesParameter);
page.addComponentStateParam(this, selectedAssetTypeParam);
page.addComponentStateParam(this,
selectedAssetModel.getStateParameter());
} }
@Override @Override
@ -580,7 +678,11 @@ public class AssetPane extends LayoutPanel implements Resettable {
protected SingleSelectionModel<Long> getSelectedAssetModel() { protected SingleSelectionModel<Long> getSelectedAssetModel() {
return selectedAssetModel; return selectedAssetModel;
} }
protected FolderSelectionModel getFolderSelectionModel() {
return folderSelectionModel;
}
private String[] getSources(final PageState state) { private String[] getSources(final PageState state) {
final String[] result = (String[]) state.getValue(sourcesParameter); final String[] result = (String[]) state.getValue(sourcesParameter);
@ -608,7 +710,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetFolderBrowserController controller = cdiUtil.findBean( final AssetFolderBrowserController controller = cdiUtil.findBean(
AssetFolderBrowserController.class); AssetFolderBrowserController.class);
controller.moveObjects(target, objectIds); controller.moveObjects(target, objectIds);
} }
@ -617,7 +719,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetFolderBrowserController controller = cdiUtil.findBean( final AssetFolderBrowserController controller = cdiUtil.findBean(
AssetFolderBrowserController.class); AssetFolderBrowserController.class);
controller.copyObjects(target, objectIds); controller.copyObjects(target, objectIds);
} }
@ -632,14 +734,14 @@ public class AssetPane extends LayoutPanel implements Resettable {
if (!selectionModel.isSelected(state)) { if (!selectionModel.isSelected(state)) {
final String folder = state final String folder = state
.getRequest() .getRequest()
.getParameter(SET_FOLDER); .getParameter(SET_FOLDER);
if (folder == null) { if (folder == null) {
final Category root = CMS final Category root = CMS
.getContext() .getContext()
.getContentSection() .getContentSection()
.getRootAssetsFolder(); .getRootAssetsFolder();
final Long folderId = root.getObjectId(); final Long folderId = root.getObjectId();
selectionModel.setSelectedKey(state, folderId); selectionModel.setSelectedKey(state, folderId);
@ -659,18 +761,18 @@ public class AssetPane extends LayoutPanel implements Resettable {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final Category root = CMS final Category root = CMS
.getContext() .getContext()
.getContentSection() .getContentSection()
.getRootAssetsFolder(); .getRootAssetsFolder();
if (!root.equals(folderRequestLocal.getFolder(state))) { if (!root.equals(folderRequestLocal.getFolder(state))) {
// Expand the ancestor nodes of the currently // Expand the ancestor nodes of the currently
// selected node. // selected node.
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderTreeModelController controller = cdiUtil.findBean( final FolderTreeModelController controller = cdiUtil.findBean(
FolderTreeModelController.class); FolderTreeModelController.class);
final List<Long> ancestorIds = controller.findAncestorIds( final List<Long> ancestorIds = controller.findAncestorIds(
folderRequestLocal.getFolder(state)); folderRequestLocal.getFolder(state));
ancestorIds.forEach(id -> tree.expand(id.toString(), state)); ancestorIds.forEach(id -> tree.expand(id.toString(), state));
} }
@ -692,8 +794,8 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
protected Long getRootFolderID(final PageState state) { protected Long getRootFolderID(final PageState state) {
final ContentSection section = CMS final ContentSection section = CMS
.getContext() .getContext()
.getContentSection(); .getContentSection();
return section.getRootAssetsFolder().getObjectId(); return section.getRootAssetsFolder().getObjectId();
} }
@ -711,37 +813,37 @@ public class AssetPane extends LayoutPanel implements Resettable {
final Label label = (Label) event.getTarget(); final Label label = (Label) event.getTarget();
final int numberOfItems = getSources(state).length; final int numberOfItems = getSources(state).length;
final Category folder = (Category) folderSelectionModel final Category folder = (Category) folderSelectionModel
.getSelectedObject(state); .getSelectedObject(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CategoryManager categoryManager = cdiUtil final CategoryManager categoryManager = cdiUtil
.findBean(CategoryManager.class); .findBean(CategoryManager.class);
final String targetFolderPath; final String targetFolderPath;
if (targetFolderModel.getSelectedObject(state) == null) { if (targetFolderModel.getSelectedObject(state) == null) {
targetFolderPath = ""; targetFolderPath = "";
} else { } else {
targetFolderPath = categoryManager.getCategoryPath( targetFolderPath = categoryManager.getCategoryPath(
targetFolderModel.getSelectedObject(state)); targetFolderModel.getSelectedObject(state));
} }
if (isMove(state)) { if (isMove(state)) {
label.setLabel(new GlobalizedMessage( label.setLabel(new GlobalizedMessage(
"cms.ui.folder.move", "cms.ui.folder.move",
CmsConstants.CMS_FOLDER_BUNDLE, CmsConstants.CMS_FOLDER_BUNDLE,
new Object[]{ new Object[]{
numberOfItems, numberOfItems,
categoryManager.getCategoryPath(folder), categoryManager.getCategoryPath(folder),
targetFolderPath targetFolderPath
})); }));
} else if (isCopy(state)) { } else if (isCopy(state)) {
label.setLabel(new GlobalizedMessage( label.setLabel(new GlobalizedMessage(
"cms.ui.folder.copy", "cms.ui.folder.copy",
CMS_BUNDLE, CMS_BUNDLE,
new Object[]{ new Object[]{
numberOfItems, numberOfItems,
categoryManager.getCategoryPath(folder), categoryManager.getCategoryPath(folder),
targetFolderPath targetFolderPath
})); }));
} }
} }
@ -770,18 +872,18 @@ public class AssetPane extends LayoutPanel implements Resettable {
if (folder != null) { if (folder != null) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderManager folderManager = cdiUtil.findBean( final FolderManager folderManager = cdiUtil.findBean(
FolderManager.class); FolderManager.class);
if (!folderManager.getParentFolder(folder).isPresent()) { if (!folderManager.getParentFolder(folder).isPresent()) {
folderTree.expand(Long.toString(folder.getObjectId()), folderTree.expand(Long.toString(folder.getObjectId()),
state); state);
} else { } else {
final List<Folder> parents = folderManager final List<Folder> parents = folderManager
.getParentFolders(folder); .getParentFolders(folder);
parents parents
.stream() .stream()
.map(parent -> Long.toString(parent.getObjectId())) .map(parent -> Long.toString(parent.getObjectId()))
.forEach(folderId -> folderTree.expand(folderId, .forEach(folderId -> folderTree.expand(folderId,
state)); state));
} }
} }
} }
@ -806,7 +908,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
private class FolderTreeCellRenderer implements TreeCellRenderer { private class FolderTreeCellRenderer implements TreeCellRenderer {
private final RequestLocal invalidFoldersRequestLocal private final RequestLocal invalidFoldersRequestLocal
= new RequestLocal(); = new RequestLocal();
/** /**
* Render the folders appropriately. The selected folder is a bold * Render the folders appropriately. The selected folder is a bold
@ -830,18 +932,18 @@ public class AssetPane extends LayoutPanel implements Resettable {
if (invalidFoldersRequestLocal.get(state) == null) { if (invalidFoldersRequestLocal.get(state) == null) {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetFolderBrowserController controller = cdiUtil final AssetFolderBrowserController controller = cdiUtil
.findBean(AssetFolderBrowserController.class); .findBean(AssetFolderBrowserController.class);
invalidFolders = controller.createInvalidTargetsList( invalidFolders = controller.createInvalidTargetsList(
Arrays.asList(getSources(state))); Arrays.asList(getSources(state)));
invalidFoldersRequestLocal.set(state, invalidFolders); invalidFoldersRequestLocal.set(state, invalidFolders);
} else { } else {
invalidFolders = (List<String>) invalidFoldersRequestLocal invalidFolders = (List<String>) invalidFoldersRequestLocal
.get(state); .get(state);
} }
final Label label = new Label(value.toString()); final Label label = new Label(value.toString());
if (invalidFolders.contains(String.format( if (invalidFolders.contains(String.format(
FOLDER_BROWSER_KEY_PREFIX_FOLDER + "%s", key))) { FOLDER_BROWSER_KEY_PREFIX_FOLDER + "%s", key))) {
return label; return label;
} }
@ -857,11 +959,11 @@ public class AssetPane extends LayoutPanel implements Resettable {
} }
private class TargetSelectorValidationListener private class TargetSelectorValidationListener
implements FormValidationListener { implements FormValidationListener {
@Override @Override
public void validate(final FormSectionEvent event) public void validate(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
@ -873,24 +975,24 @@ public class AssetPane extends LayoutPanel implements Resettable {
final FormData data = event.getFormData(); final FormData data = event.getFormData();
if (target == null) { if (target == null) {
data.addError(new GlobalizedMessage( data.addError(new GlobalizedMessage(
"cms.ui.folder.need_select_target_folder", "cms.ui.folder.need_select_target_folder",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
//If the target is null, we can skip the rest of the checks //If the target is null, we can skip the rest of the checks
return; return;
} }
if (target.equals(folderSelectionModel.getSelectedObject(state))) { if (target.equals(folderSelectionModel.getSelectedObject(state))) {
data.addError(new GlobalizedMessage( data.addError(new GlobalizedMessage(
"cms.ui.folder.not_within_same_folder", "cms.ui.folder.not_within_same_folder",
CmsConstants.CMS_FOLDER_BUNDLE)); CmsConstants.CMS_FOLDER_BUNDLE));
} }
// check create item permission // check create item permission
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionChecker permissionChecker = cdiUtil.findBean( final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class); PermissionChecker.class);
if (!permissionChecker.isPermitted( if (!permissionChecker.isPermitted(
ItemPrivileges.CREATE_NEW, target)) { ItemPrivileges.CREATE_NEW, target)) {
data.addError("cms.ui.folder.no_permission_for_item", data.addError("cms.ui.folder.no_permission_for_item",
CmsConstants.CMS_FOLDER_BUNDLE); CmsConstants.CMS_FOLDER_BUNDLE);
} }
@ -911,34 +1013,34 @@ public class AssetPane extends LayoutPanel implements Resettable {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final FolderRepository folderRepo = cdiUtil final FolderRepository folderRepo = cdiUtil
.findBean(FolderRepository.class); .findBean(FolderRepository.class);
final AssetRepository assetRepo = cdiUtil final AssetRepository assetRepo = cdiUtil
.findBean(AssetRepository.class); .findBean(AssetRepository.class);
final AssetManager assetManager = cdiUtil final AssetManager assetManager = cdiUtil
.findBean(AssetManager.class); .findBean(AssetManager.class);
final AssetFolderBrowserController controller = cdiUtil final AssetFolderBrowserController controller = cdiUtil
.findBean(AssetFolderBrowserController.class); .findBean(AssetFolderBrowserController.class);
final FolderManager folderManager = cdiUtil final FolderManager folderManager = cdiUtil
.findBean(FolderManager.class); .findBean(FolderManager.class);
final PermissionChecker permissionChecker = cdiUtil.findBean( final PermissionChecker permissionChecker = cdiUtil.findBean(
PermissionChecker.class); PermissionChecker.class);
final CcmObject object; final CcmObject object;
final String name; final String name;
if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
final long folderId = Long.parseLong(objectId.substring( final long folderId = Long.parseLong(objectId.substring(
FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
final Folder folder = folderRepo.findById(folderId).orElseThrow( final Folder folder = folderRepo.findById(folderId).orElseThrow(
() -> new IllegalArgumentException(String.format( () -> new IllegalArgumentException(String.format(
"No folder with id %d in database.", folderId))); "No folder with id %d in database.", folderId)));
name = folder.getName(); name = folder.getName();
//Check if folder or subfolder contains in use assets //Check if folder or subfolder contains in use assets
if (isMove(state)) { if (isMove(state)) {
final FolderManager.FolderIsMovable movable = folderManager final FolderManager.FolderIsMovable movable = folderManager
.folderIsMovable(folder, target); .folderIsMovable(folder, target);
switch (movable) { switch (movable) {
case DIFFERENT_SECTIONS: case DIFFERENT_SECTIONS:
addErrorMessage(data, addErrorMessage(data,
@ -970,23 +1072,23 @@ public class AssetPane extends LayoutPanel implements Resettable {
break; break;
default: default:
throw new UnexpectedErrorException(String.format( throw new UnexpectedErrorException(String.format(
"Unknown state '%s' for '%s'.", "Unknown state '%s' for '%s'.",
movable, movable,
FolderManager.FolderIsMovable.class. FolderManager.FolderIsMovable.class.
getName())); getName()));
} }
} }
object = folder; object = folder;
} else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) { } else if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_ASSET)) {
final long assetId = Long.parseLong(objectId.substring( final long assetId = Long.parseLong(objectId.substring(
FOLDER_BROWSER_KEY_PREFIX_ASSET.length())); FOLDER_BROWSER_KEY_PREFIX_ASSET.length()));
final Asset asset = assetRepo final Asset asset = assetRepo
.findById(assetId) .findById(assetId)
.orElseThrow(() -> new IllegalArgumentException( .orElseThrow(() -> new IllegalArgumentException(
String.format( String.format(
"No asset with id %d in the database.", "No asset with id %d in the database.",
assetId))); assetId)));
name = asset.getDisplayName(); name = asset.getDisplayName();
@ -997,11 +1099,11 @@ public class AssetPane extends LayoutPanel implements Resettable {
object = asset; object = asset;
} else { } else {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Provided objectId '%s' does not start with '%s' " "Provided objectId '%s' does not start with '%s' "
+ "or '%s'.", + "or '%s'.",
objectId, objectId,
FOLDER_BROWSER_KEY_PREFIX_FOLDER, FOLDER_BROWSER_KEY_PREFIX_FOLDER,
FOLDER_BROWSER_KEY_PREFIX_ASSET)); FOLDER_BROWSER_KEY_PREFIX_ASSET));
} }
final long count = controller.countObjects(target, name); final long count = controller.countObjects(target, name);
@ -1013,7 +1115,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
if (!(permissionChecker.isPermitted( if (!(permissionChecker.isPermitted(
ItemPrivileges.DELETE, object)) ItemPrivileges.DELETE, object))
&& isMove(state)) { && isMove(state)) {
addErrorMessage(data, addErrorMessage(data,
"cms.ui.folder.no_permission_for_item", "cms.ui.folder.no_permission_for_item",
object.getDisplayName()); object.getDisplayName());
@ -1040,8 +1142,8 @@ public class AssetPane extends LayoutPanel implements Resettable {
@Override @Override
protected Folder getRootFolder(final PageState state) { protected Folder getRootFolder(final PageState state) {
final ContentSection section = CMS final ContentSection section = CMS
.getContext() .getContext()
.getContentSection(); .getContentSection();
return section.getRootAssetsFolder(); return section.getRootAssetsFolder();
} }
@ -1055,9 +1157,9 @@ public class AssetPane extends LayoutPanel implements Resettable {
if (key instanceof String) { if (key instanceof String) {
final Long keyAsLong; final Long keyAsLong;
if (((String) key).startsWith( if (((String) key).startsWith(
FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { FOLDER_BROWSER_KEY_PREFIX_FOLDER)) {
keyAsLong = Long.parseLong(((String) key).substring( keyAsLong = Long.parseLong(((String) key).substring(
FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); FOLDER_BROWSER_KEY_PREFIX_FOLDER.length()));
} else { } else {
keyAsLong = Long.parseLong((String) key); keyAsLong = Long.parseLong((String) key);
} }

View File

@ -38,8 +38,6 @@ import org.librecms.contentsection.Asset;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.Objects; import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
/** /**
* *
@ -58,8 +56,8 @@ public class BookmarkForm extends AssetForm {
protected void addWidgets() { protected void addWidgets() {
add(new Label( add(new Label(
new GlobalizedMessage("cms.ui.assets.bookmark.description", new GlobalizedMessage("cms.ui.assets.bookmark.description",
CmsConstants.CMS_BUNDLE))); CmsConstants.CMS_BUNDLE)));
description = new TextArea("bookmark-description"); description = new TextArea("bookmark-description");
add(description); add(description);
@ -72,7 +70,7 @@ public class BookmarkForm extends AssetForm {
@Override @Override
public void validate(final FormSectionEvent event) public void validate(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final FormData data = event.getFormData(); final FormData data = event.getFormData();
@ -81,8 +79,8 @@ public class BookmarkForm extends AssetForm {
new URL((String) url.getValue(state)); new URL((String) url.getValue(state));
} catch (MalformedURLException ex) { } catch (MalformedURLException ex) {
data.addError(new GlobalizedMessage( data.addError(new GlobalizedMessage(
"cms.ui.assets.bookmark.url.malformed", "cms.ui.assets.bookmark.url.malformed",
CmsConstants.CMS_BUNDLE)); CmsConstants.CMS_BUNDLE));
} }
} }
@ -92,58 +90,45 @@ public class BookmarkForm extends AssetForm {
@Override @Override
protected Asset createAsset(final PageState state) protected Asset createAsset(final PageState state)
throws FormProcessException { throws FormProcessException {
Objects.requireNonNull(state); Objects.requireNonNull(state);
final Bookmark bookmark = new Bookmark(); final Bookmark bookmark = new Bookmark();
bookmark bookmark
.getDescription() .getDescription()
.addValue(KernelConfig.getConfig().getDefaultLocale(), .addValue(KernelConfig.getConfig().getDefaultLocale(),
(String) description.getValue(state)); (String) description.getValue(state));
try { bookmark.setUrl((String) url.getValue(state));
bookmark.setUrl(new URL((String) url.getValue(state)));
} catch (MalformedURLException ex) {
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.assets.bookmark.url.malformed",
CmsConstants.CMS_BUNDLE));
}
return bookmark; return bookmark;
} }
@Override @Override
protected void updateAsset(final Asset asset, final PageState state) protected void updateAsset(final Asset asset, final PageState state)
throws FormProcessException { throws FormProcessException {
Objects.requireNonNull(asset); Objects.requireNonNull(asset);
Objects.requireNonNull(state); Objects.requireNonNull(state);
if (!(asset instanceof Bookmark)) { if (!(asset instanceof Bookmark)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Provided asset is not an instance of class (or sub class of) " "Provided asset is not an instance of class (or sub class of) "
+ "'%s' but is an instance of class '%s'", + "'%s' but is an instance of class '%s'",
Bookmark.class.getName(), Bookmark.class.getName(),
asset.getClass().getName())); asset.getClass().getName()));
} }
final Bookmark bookmark = (Bookmark) asset; final Bookmark bookmark = (Bookmark) asset;
bookmark bookmark
.getDescription() .getDescription()
.addValue(KernelConfig.getConfig().getDefaultLocale(), .addValue(KernelConfig.getConfig().getDefaultLocale(),
(String) description.getValue(state)); (String) description.getValue(state));
try {
bookmark.setUrl(new URL((String) url.getValue(state)));
} catch (MalformedURLException ex) {
throw new FormProcessException(new GlobalizedMessage(
"cms.ui.assets.bookmark.url.malformed",
CmsConstants.CMS_BUNDLE));
}
bookmark.setUrl((String) url.getValue(state));
} }
} }

View File

@ -51,35 +51,44 @@ public class LegalMetadataForm extends AssetForm {
@Override @Override
protected void addWidgets() { protected void addWidgets() {
add(new Label(new GlobalizedMessage(
"cms.ui.assets.legalmetadata.rightsholder",
CmsConstants.CMS_BUNDLE)));
add(new Label(new GlobalizedMessage(
"cms.ui.assets.legalmetadata.rightsholder",
CmsConstants.CMS_BUNDLE)));
rightsHolder = new TextArea("legalmetadata-rightsholder"); rightsHolder = new TextArea("legalmetadata-rightsholder");
add(rightsHolder); add(rightsHolder);
add(new Label(new GlobalizedMessage(
"cms.ui.assets.legalmetadata.rights",
CmsConstants.CMS_BUNDLE)));
rights = new TextArea("legalmetadata-rights"); rights = new TextArea("legalmetadata-rights");
add(rights); add(rights);
add(new Label(new GlobalizedMessage(
"cms.ui.assets.legalmetadata.publisher",
CmsConstants.CMS_BUNDLE)));
publisher = new TextArea("legalmetadata-rights"); publisher = new TextArea("legalmetadata-rights");
add(publisher); add(publisher);
add(new Label(new GlobalizedMessage(
"cms.ui.assets.legalmetadata.creator",
CmsConstants.CMS_BUNDLE)));
creator = new TextArea("legalmetadata-creator"); creator = new TextArea("legalmetadata-creator");
add(creator); add(creator);
} }
@Override @Override
protected Asset createAsset(final PageState state) protected Asset createAsset(final PageState state)
throws FormProcessException { throws FormProcessException {
Objects.requireNonNull(state); Objects.requireNonNull(state);
final LegalMetadata legalMetadata = new LegalMetadata(); final LegalMetadata legalMetadata = new LegalMetadata();
legalMetadata.setRightsHolder((String) rightsHolder.getValue(state)); legalMetadata.setRightsHolder((String) rightsHolder.getValue(state));
legalMetadata.getRights().addValue( legalMetadata.getRights().addValue(
KernelConfig.getConfig().getDefaultLocale(), KernelConfig.getConfig().getDefaultLocale(),
(String) rights.getValue(state)); (String) rights.getValue(state));
legalMetadata.setPublisher((String) publisher.getValue(state)); legalMetadata.setPublisher((String) publisher.getValue(state));
legalMetadata.setCreator((String) creator.getValue(state)); legalMetadata.setCreator((String) creator.getValue(state));
@ -89,25 +98,25 @@ public class LegalMetadataForm extends AssetForm {
@Override @Override
protected void updateAsset(final Asset asset, final PageState state) protected void updateAsset(final Asset asset, final PageState state)
throws FormProcessException { throws FormProcessException {
Objects.requireNonNull(asset); Objects.requireNonNull(asset);
Objects.requireNonNull(state); Objects.requireNonNull(state);
if (!(asset instanceof LegalMetadata)) { if (!(asset instanceof LegalMetadata)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Provided asset is not an instance of '%s' (or a sub class) " "Provided asset is not an instance of '%s' (or a sub class) "
+ "but is an instance of class '%s'.", + "but is an instance of class '%s'.",
LegalMetadata.class.getName(), LegalMetadata.class.getName(),
asset.getClass().getName())); asset.getClass().getName()));
} }
final LegalMetadata legalMetadata = (LegalMetadata) asset; final LegalMetadata legalMetadata = (LegalMetadata) asset;
legalMetadata.setRightsHolder((String) rightsHolder.getValue(state)); legalMetadata.setRightsHolder((String) rightsHolder.getValue(state));
legalMetadata.getRights().addValue( legalMetadata.getRights().addValue(
KernelConfig.getConfig().getDefaultLocale(), KernelConfig.getConfig().getDefaultLocale(),
(String) rights.getValue(state)); (String) rights.getValue(state));
legalMetadata.setPublisher((String) publisher.getValue(state)); legalMetadata.setPublisher((String) publisher.getValue(state));
legalMetadata.setCreator((String) creator.getValue(state)); legalMetadata.setCreator((String) creator.getValue(state));

View File

@ -58,15 +58,15 @@ public class AssetTypesManager {
protected void initialize() { protected void initialize() {
final ServiceLoader<CcmModule> modules = ServiceLoader final ServiceLoader<CcmModule> modules = ServiceLoader
.load(CcmModule.class); .load(CcmModule.class);
final SortedSet<Class<? extends Asset>> assetTypes = new TreeSet<>( final SortedSet<Class<? extends Asset>> assetTypes = new TreeSet<>(
(type1, type2) -> type1.getName().compareTo(type2.getName())); (type1, type2) -> type1.getName().compareTo(type2.getName()));
for (final CcmModule module : modules) { for (final CcmModule module : modules) {
final AssetTypes annotation = module final AssetTypes annotation = module
.getClass() .getClass()
.getAnnotation(AssetTypes.class); .getAnnotation(AssetTypes.class);
if (annotation == null) { if (annotation == null) {
continue; continue;
@ -76,22 +76,22 @@ public class AssetTypesManager {
} }
availableAssetTypes = assetTypes availableAssetTypes = assetTypes
.stream() .stream()
.filter(type -> type.getAnnotation(AssetType.class) != null) .filter(type -> type.getAnnotation(AssetType.class) != null)
.map(assetTypeClass -> createAssetTypeInfo(assetTypeClass)) .map(assetTypeClass -> createAssetTypeInfo(assetTypeClass))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/** /**
* Helper method for creating the info object for a asset type. * Helper method for creating the info object for a asset type.
* *
* @param assetTypeClass The class which provides the implementation of the * @param assetTypeClass The class which provides the implementation of the
* asset type. * asset type.
* *
* @return A {@link AssetTypeInfo} object describing the asset type. * @return A {@link AssetTypeInfo} object describing the asset type.
*/ */
private AssetTypeInfo createAssetTypeInfo( private AssetTypeInfo createAssetTypeInfo(
final Class<? extends Asset> assetTypeClass) { final Class<? extends Asset> assetTypeClass) {
Objects.requireNonNull(assetTypeClass); Objects.requireNonNull(assetTypeClass);
@ -101,7 +101,7 @@ public class AssetTypesManager {
final String defaultBundleName = String.format("%sBundle", final String defaultBundleName = String.format("%sBundle",
assetTypeClass.getName()); assetTypeClass.getName());
final AssetType assetType = assetTypeClass final AssetType assetType = assetTypeClass
.getAnnotation(AssetType.class); .getAnnotation(AssetType.class);
if (assetType == null) { if (assetType == null) {
assetTypeInfo.setLabelBundle(defaultBundleName); assetTypeInfo.setLabelBundle(defaultBundleName);
@ -156,7 +156,7 @@ public class AssetTypesManager {
* @return A {@link AssetTypeInfo} object describing the asset type. * @return A {@link AssetTypeInfo} object describing the asset type.
*/ */
public AssetTypeInfo getAssetTypeInfo( public AssetTypeInfo getAssetTypeInfo(
final Class<? extends Asset> assetTypeClass) { final Class<? extends Asset> assetTypeClass) {
Objects.requireNonNull(assetTypeClass); Objects.requireNonNull(assetTypeClass);
@ -168,13 +168,12 @@ public class AssetTypesManager {
* asset type. * asset type.
* *
* @param assetTypeClass The fully qualified name of the class representing * @param assetTypeClass The fully qualified name of the class representing
* the asset type. * the asset type.
* *
* @return A {@link AssetTypeInfo} object describing the asset type. * @return A {@link AssetTypeInfo} object describing the asset type.
* *
* @throws IllegalArgumentException If no class with the provided name * @throws IllegalArgumentException If no class with the provided name
* exists or the class is not a subclass of * exists or the class is not a subclass of {@link Asset}.
* {@link Asset}.
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public AssetTypeInfo getAssetTypeInfo(final String assetTypeClass) { public AssetTypeInfo getAssetTypeInfo(final String assetTypeClass) {
@ -186,15 +185,15 @@ public class AssetTypesManager {
clazz = Class.forName(assetTypeClass); clazz = Class.forName(assetTypeClass);
} catch (ClassNotFoundException ex) { } catch (ClassNotFoundException ex) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"There is not class \"%s\".", assetTypeClass), "There is no class \"%s\".", assetTypeClass),
ex); ex);
} }
if (!Asset.class.isAssignableFrom(clazz)) { if (!Asset.class.isAssignableFrom(clazz)) {
throw new IllegalArgumentException(String.format( throw new IllegalArgumentException(String.format(
"Class \"%s\" is not a subclass of of \"%s\".", "Class \"%s\" is not a subclass of of \"%s\".",
assetTypeClass, assetTypeClass,
Asset.class.getName())); Asset.class.getName()));
} }
return getAssetTypeInfo((Class<? extends Asset>) clazz); return getAssetTypeInfo((Class<? extends Asset>) clazz);

View File

@ -73,7 +73,7 @@ public class Bookmark extends Asset implements Serializable {
@Column(name = "URL", length = 2048, nullable = false) @Column(name = "URL", length = 2048, nullable = false)
@NotEmpty @NotEmpty
private URL url; private String url;
public Bookmark() { public Bookmark() {
super(); super();
@ -88,11 +88,11 @@ public class Bookmark extends Asset implements Serializable {
this.description = description; this.description = description;
} }
public URL getUrl() { public String getUrl() {
return url; return url;
} }
public void setUrl(final URL url) { public void setUrl(final String url) {
this.url = url; this.url = url;
} }

View File

@ -97,7 +97,8 @@ public class AssetRepository
public void save( public void save(
@RequiresPrivilege(AssetPrivileges.EDIT) @RequiresPrivilege(AssetPrivileges.EDIT)
final Asset asset) { final Asset asset) {
super.save(asset);
} }
/** /**

View File

@ -248,3 +248,7 @@ cms.ui.assets=Assets
cms.ui.folder.no_assets=No assets cms.ui.folder.no_assets=No assets
cms.ui.assets.new=Create new asset cms.ui.assets.new=Create new asset
cms.ui.assets.new.create=Create asset cms.ui.assets.new.create=Create asset
cms.ui.asset.title=Title
cms.ui.admin.assets.create=Create new asset
cms.ui.assets.bookmark.description=Description
cms.ui.assets.bookmark.url=URL

View File

@ -247,3 +247,7 @@ cms.ui.assets=Medien & Daten
cms.ui.folder.no_assets=Keine Medien oder Datens\u00e4tze vorhanden cms.ui.folder.no_assets=Keine Medien oder Datens\u00e4tze vorhanden
cms.ui.assets.new=Neues Asset anlegen cms.ui.assets.new=Neues Asset anlegen
cms.ui.assets.new.create=Asset anlegen cms.ui.assets.new.create=Asset anlegen
cms.ui.asset.title=Titel
cms.ui.admin.assets.create=Neues Asset anlegen
cms.ui.assets.bookmark.description=Beschreibung
cms.ui.assets.bookmark.url=URL

View File

@ -206,3 +206,7 @@ cms.ui.assets=Assets
cms.ui.folder.no_assets=No assets cms.ui.folder.no_assets=No assets
cms.ui.assets.new=Create new asset cms.ui.assets.new=Create new asset
cms.ui.assets.new.create=Create asset cms.ui.assets.new.create=Create asset
cms.ui.asset.title=Title
cms.ui.admin.assets.create=Create new asset
cms.ui.assets.bookmark.description=Description
cms.ui.assets.bookmark.url=URL