diff --git a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml index 47ce2c010..7d5188738 100644 --- a/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml +++ b/ccm-bundle-devel-wildfly-web/src/main/resources/log4j2.xml @@ -22,7 +22,10 @@ --> - + + + 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 index b2dee5fa1..a7177cc5c 100644 --- 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 @@ -26,6 +26,7 @@ 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; @@ -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_CREATION_DATE = "creationDate"; - private final FolderSelectionModel folderSelectionModel; + private final AssetPane assetPane; private TableActionListener folderChanger; private TableActionListener folderDeleter; private TableColumn nameColumn; private TableColumn deleteColumn; private final StringParameter sortTypeParameter = new StringParameter( - "sortType"); + "sortType"); private final StringParameter sortDirectionParameter = new StringParameter( - "sortDir"); + "sortDir"); private Paginator paginator; private long folderSize; - public AssetFolderBrowser(final FolderSelectionModel folderSelectionModel) { + public AssetFolderBrowser(final AssetPane assetPane) { super(); sortTypeParameter.setDefaultValue(SORT_KEY_NAME); sortDirectionParameter.setDefaultValue(SORT_ACTION_UP); - this.folderSelectionModel = folderSelectionModel; + this.assetPane = assetPane; initComponents(); } private void initComponents() { - + setModelBuilder(new AssetFolderBrowserTableModelBuilder()); final GlobalizedMessage[] headers = { @@ -105,24 +106,23 @@ public class AssetFolderBrowser extends Table { setClassAttr("dataTable"); getHeader().setDefaultRenderer( - new com.arsdigita.cms.ui.util.DefaultTableCellRenderer()); + 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_CREATION_DATE) - .setHeaderRenderer( - new HeaderCellRenderer(SORT_KEY_CREATION_DATE)); + .setHeaderRenderer( + new HeaderCellRenderer(SORT_KEY_CREATION_DATE)); getColumn(AssetFolderBrowserTableModel.COL_CREATION_DATE) - .setCellRenderer(new DateCellRenderer()); + .setCellRenderer(new DateCellRenderer()); getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED) - .setHeaderRenderer(new HeaderCellRenderer( - SORT_KEY_LAST_MODIFIED_DATE)); + .setHeaderRenderer(new HeaderCellRenderer( + SORT_KEY_LAST_MODIFIED_DATE)); getColumn(AssetFolderBrowserTableModel.COL_LAST_MODIFIED) - .setCellRenderer(new DateCellRenderer()); + .setCellRenderer(new DateCellRenderer()); deleteColumn = getColumn(AssetFolderBrowserTableModel.COL_DELETEABLE); deleteColumn.setCellRenderer(new ActionCellRenderer()); @@ -142,14 +142,19 @@ public class AssetFolderBrowser extends Table { super.register(page); - page.addComponentStateParam(this, folderSelectionModel. - getStateParameter()); + page.addComponentStateParam( + this, + getFolderSelectionModel().getStateParameter()); page.addComponentStateParam(this, sortTypeParameter); page.addComponentStateParam(this, sortDirectionParameter); } protected FolderSelectionModel getFolderSelectionModel() { - return folderSelectionModel; + return assetPane.getFolderSelectionModel(); + } + + protected SingleSelectionModel getSelectedAssetModel() { + return assetPane.getSelectedAssetModel(); } protected Paginator getPaginator() { @@ -200,7 +205,7 @@ public class AssetFolderBrowser extends Table { final String sortKey = (String) state.getValue(sortTypeParameter); final boolean isCurrentKey = sortKey.equals(key); final String currentSortDirection = (String) state - .getValue(sortDirectionParameter); + .getValue(sortDirectionParameter); final String imageUrlStub; if (SORT_ACTION_UP.equals(currentSortDirection)) { @@ -217,7 +222,7 @@ public class AssetFolderBrowser extends Table { // by default, everything sorts "up" unless it // is the current key and it is already pointing up if (SORT_ACTION_UP.equals(currentSortDirection) - && isCurrentKey) { + && isCurrentKey) { sortDirectionAction = SORT_ACTION_DOWN; } else { sortDirectionAction = SORT_ACTION_UP; @@ -268,14 +273,14 @@ public class AssetFolderBrowser extends Table { final String name = (String) value; final ContentSection section = CMS.getContext(). - getContentSection(); + getContentSection(); final ContentSectionManager sectionManager = CdiUtil. - createCdiUtil() - .findBean(ContentSectionManager.class); + createCdiUtil() + .findBean(ContentSectionManager.class); final boolean isFolder = ((AssetFolderBrowserTableModel) table .getTableModel(state)) - .isFolder(); + .isFolder(); final long objectId = getObjectId(key); if (isFolder) { @@ -288,13 +293,14 @@ public class AssetFolderBrowser extends Table { row, column); } else { + return new ControlLink(new Text(name)); + // return new Link(new Text(name), // itemResolver.generateItemURL(state, // objectId, // name, // section, // "DRAFT")); - return new Text(name); } } @@ -339,13 +345,13 @@ public class AssetFolderBrowser extends Table { return new Label(" ", false); } else { final ControlLink link = new ControlLink( - new Label( - new GlobalizedMessage("cms.ui.folder.delete", - CmsConstants.CMS_FOLDER_BUNDLE))); + 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)); + new GlobalizedMessage( + "cms.ui.folder.delete_confirmation_assets", + CmsConstants.CMS_FOLDER_BUNDLE)); return link; } } @@ -367,7 +373,7 @@ public class AssetFolderBrowser extends Table { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetFolderBrowserController controller = cdiUtil.findBean( - AssetFolderBrowserController.class); + AssetFolderBrowserController.class); controller.deleteObject((String) event.getRowKey()); ((Table) event.getSource()).clearSelection(state); @@ -387,9 +393,16 @@ public class AssetFolderBrowser extends Table { } clearSelection(state); - getFolderSelectionModel().setSelectedKey( - state, - getObjectId(event.getRowKey())); + 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); + } } } 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 index 3e9490db2..f7cea3a99 100644 --- 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 @@ -58,6 +58,8 @@ 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 static org.librecms.CmsConstants.*; @@ -68,6 +70,9 @@ import static org.librecms.CmsConstants.*; @RequestScoped public class AssetFolderBrowserController { + private static final Logger LOGGER = LogManager + .getLogger(AssetFolderBrowserController.class); + @Inject private EntityManager entityManager; @@ -106,7 +111,7 @@ public class AssetFolderBrowserController { @PostConstruct private void init() { final KernelConfig kernelConfig = confManager.findConfiguration( - KernelConfig.class); + KernelConfig.class); defaultLocale = kernelConfig.getDefaultLocale(); } @@ -123,9 +128,9 @@ public class AssetFolderBrowserController { firstResult, maxResults); final List subFolderRows = subFolders - .stream() - .map(subFolder -> buildRow(subFolder)) - .collect(Collectors.toList()); + .stream() + .map(subFolder -> buildRow(subFolder)) + .collect(Collectors.toList()); if (subFolders.size() > maxResults) { return subFolderRows; @@ -140,9 +145,9 @@ public class AssetFolderBrowserController { firstAsset, maxAssets); final List assetRows = assets - .stream() - .map(asset -> buildRow(asset)) - .collect(Collectors.toList()); + .stream() + .map(asset -> buildRow(asset)) + .collect(Collectors.toList()); final List rows = new ArrayList<>(); rows.addAll(subFolderRows); @@ -172,19 +177,19 @@ public class AssetFolderBrowserController { criteriaQuery = criteriaQuery.select(builder.count(from)); final List subFolders = findSubFolders( - folder, - filterTerm, - AssetFolderBrowser.SORT_KEY_NAME, - AssetFolderBrowser.SORT_ACTION_UP, - -1, - -1); + 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); + folder, + filterTerm, + AssetFolderBrowser.SORT_KEY_NAME, + AssetFolderBrowser.SORT_ACTION_UP, + -1, + -1); if (subFolders.isEmpty() && assets.isEmpty()) { return 0; @@ -194,8 +199,8 @@ public class AssetFolderBrowserController { criteriaQuery = criteriaQuery.where(from.in(subFolders)); } else { criteriaQuery = criteriaQuery.where(builder.or( - from.in(subFolders), - from.in(assets))); + from.in(subFolders), + from.in(assets))); } return entityManager.createQuery(criteriaQuery).getSingleResult(); @@ -213,17 +218,17 @@ public class AssetFolderBrowserController { if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { copyFolder(targetFolder, 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)) { copyAsset(targetFolder, Long.parseLong(objectId.substring( - FOLDER_BROWSER_KEY_PREFIX_ITEM.length()))); + 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)); + "ID '%s' does not start with '%s' or '%s'.", + objectId, + FOLDER_BROWSER_KEY_PREFIX_FOLDER, + FOLDER_BROWSER_KEY_PREFIX_ASSET)); } } @@ -235,10 +240,10 @@ public class AssetFolderBrowserController { 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))); + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No folder with ID %d in the database. " + + "Where did that ID come from?", + folderId))); folderManager.copyFolder(folder, targetFolder); @@ -250,10 +255,10 @@ public class AssetFolderBrowserController { 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))); + .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); } @@ -269,17 +274,17 @@ public class AssetFolderBrowserController { if (objectId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { moveFolder(targetFolder, 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)) { moveAsset(targetFolder, Long.parseLong(objectId.substring( - FOLDER_BROWSER_KEY_PREFIX_ASSET.length()))); + 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)); + "ID '%s' does not start with '%s' or '%s'.", + objectId, + FOLDER_BROWSER_KEY_PREFIX_FOLDER, + FOLDER_BROWSER_KEY_PREFIX_ASSET)); } } } @@ -289,10 +294,10 @@ public class AssetFolderBrowserController { 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))); + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No folder with ID %d in the database. " + + "Where did that ID come from?", + folderId))); folderManager.moveFolder(folder, targetFolder); } @@ -302,10 +307,10 @@ public class AssetFolderBrowserController { 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))); + .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); } @@ -316,20 +321,20 @@ public class AssetFolderBrowserController { Objects.requireNonNull(sources); final List sourceFolderIds = sources - .stream() - .filter(source -> source.startsWith( - FOLDER_BROWSER_KEY_PREFIX_FOLDER)) - .collect(Collectors.toList()); + .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()); + .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()); + .stream() + .map(sourceFolderId -> findSubFolderIds(sourceFolderId)) + .collect(Collectors.toList()); final List invalidTargetIds = new ArrayList<>(); invalidTargetIds.addAll(sourceFolderIds); @@ -348,26 +353,26 @@ public class AssetFolderBrowserController { if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { throw new IllegalArgumentException(String.format( - "Provided string '%s' is not an ID of a folder.", - folderId)); + "Provided string '%s' is not an ID of a folder.", + folderId)); } 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) - .orElseThrow(() -> new IllegalArgumentException(String.format( - "No folder with ID %d found in database. " - + "Where did that ID come form?", - 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); + folder); if (parentFolder.isPresent()) { return Optional.empty(); } else { return Optional.ofNullable(String.format( - "%s%d", - FOLDER_BROWSER_KEY_PREFIX_FOLDER, - parentFolder.get().getObjectId())); + "%s%d", + FOLDER_BROWSER_KEY_PREFIX_FOLDER, + parentFolder.get().getObjectId())); } } @@ -377,23 +382,23 @@ public class AssetFolderBrowserController { if (!folderId.startsWith(FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { throw new IllegalArgumentException(String.format( - "Provided string '%s' is not the ID of a folder.", - folderId)); + "Provided string '%s' is not the ID of a folder.", + folderId)); } 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) - .orElseThrow(() -> new IllegalArgumentException(String.format( - "No folder with ID %d found in database. " - + "Where did that ID come form?", - 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()); + .stream() + .map(subFolder -> String.format("%s%d", + FOLDER_BROWSER_KEY_PREFIX_FOLDER, + subFolder.getObjectId())) + .collect(Collectors.toList()); } private List findSubFolders(final Folder folder) { @@ -401,7 +406,7 @@ public class AssetFolderBrowserController { Objects.requireNonNull(folder); if (folder.getSubFolders() == null - || folder.getSubFolders().isEmpty()) { + || folder.getSubFolders().isEmpty()) { return Collections.emptyList(); } @@ -426,21 +431,21 @@ public class AssetFolderBrowserController { if (objectId.startsWith("folder-")) { final long folderId = Long.parseLong( - objectId.substring("folder-".length())); + objectId.substring("folder-".length())); folderRepo - .findById(folderId) - .ifPresent(folderRepo::delete); + .findById(folderId) + .ifPresent(folderRepo::delete); } else if (objectId.startsWith("asset-")) { final long assetId = Long.parseLong( - objectId.substring("asset-".length())); + objectId.substring("asset-".length())); assetRepo - .findById(assetId) - .ifPresent(assetRepo::delete); + .findById(assetId) + .ifPresent(assetRepo::delete); } else { 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.setName(folder.getName()); if (folder.getTitle().hasValue(globalizationHelper - .getNegotiatedLocale())) { + .getNegotiatedLocale())) { row.setTitle(folder.getTitle().getValue(globalizationHelper - .getNegotiatedLocale())); + .getNegotiatedLocale())); } else { row.setTitle(folder.getTitle().getValue(defaultLocale)); } row.setFolder(true); row.setDeletable(!categoryManager.hasSubCategories(folder) - && !categoryManager.hasObjects(folder)); + && !categoryManager.hasObjects(folder)); return row; } @@ -473,14 +478,14 @@ public class AssetFolderBrowserController { row.setObjectUuid(asset.getUuid()); row.setName(asset.getDisplayName()); if (asset.getTitle().hasValue(globalizationHelper - .getNegotiatedLocale())) { + .getNegotiatedLocale())) { row.setTitle(asset.getTitle().getValue(globalizationHelper - .getNegotiatedLocale())); + .getNegotiatedLocale())); } else { row.setTitle(asset.getTitle().getValue(defaultLocale)); } final AssetTypeInfo typeInfo = typesManager - .getAssetTypeInfo(asset.getClass()); + .getAssetTypeInfo(asset.getClass()); row.setTypeLabelBundle(typeInfo.getLabelBundle()); row.setTypeLabelKey(typeInfo.getLabelKey()); @@ -501,30 +506,32 @@ public class AssetFolderBrowserController { final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaQuery criteria = builder - .createQuery(Folder.class); + .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)) { + && 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) - ); + .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); @@ -573,22 +580,37 @@ public class AssetFolderBrowserController { 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) - ); + .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); 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 index 0d08f47ad..dbef141e4 100644 --- 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 @@ -96,7 +96,7 @@ class AssetFolderBrowserTableModel implements TableModel { if (currentRow.isFolder()) { return String.format("folder-%d", currentRow.getObjectId()); } else { - return String.format("item-%d", currentRow.getObjectId()); + return String.format("asset-%d", currentRow.getObjectId()); } // return currentRow.getObjectId(); 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 index c747c7a5f..afbf71efd 100644 --- 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 @@ -39,25 +39,25 @@ import java.util.List; * @author Jens Pelzetter */ class AssetFolderBrowserTableModelBuilder - extends LockableImpl - implements TableModelBuilder { + extends LockableImpl + implements TableModelBuilder { private static final Logger LOGGER = LogManager - .getLogger(AssetFolderBrowserTableModelBuilder.class); + .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."); + throw new IllegalArgumentException( + "The AssetFolderBrowserTableModelBuilder can only be used " + + "for the AssetFolderBrowser."); } final AssetFolderBrowser assetFolderBrowser = (AssetFolderBrowser) table; final FolderSelectionModel folderSelectionModel = assetFolderBrowser - .getFolderSelectionModel(); + .getFolderSelectionModel(); final Folder folder = folderSelectionModel.getSelectedObject(state); if (folder == null) { return Table.EMPTY_MODEL; @@ -66,7 +66,7 @@ class AssetFolderBrowserTableModelBuilder final Paginator paginator = assetFolderBrowser.getPaginator(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetFolderBrowserController controller = cdiUtil - .findBean(AssetFolderBrowserController.class); + .findBean(AssetFolderBrowserController.class); final String orderBy; if (assetFolderBrowser.getSortType(state) == null) { orderBy = AssetFolderBrowser.SORT_KEY_NAME; @@ -85,12 +85,12 @@ class AssetFolderBrowserTableModelBuilder final long start = System.nanoTime(); LOGGER.debug("Retrieving table rows..."); final List rows = controller - .getAssetRows(folder, - orderBy, - orderDirection, - first - 1, - pageSize); - + .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/AssetForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetForm.java index 3f1988266..2fa891ea1 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/AssetForm.java @@ -39,6 +39,9 @@ import org.librecms.contentsection.Asset; import org.librecms.contentsection.AssetRepository; 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(); add(saveCancelSection); + + addInitListener(this); + addProcessListener(this); + addSubmissionListener(this); } protected void addWidgets() { @@ -92,12 +99,13 @@ public abstract class AssetForm extends Form implements FormInitListener, } else { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetRepository assetRepo = cdiUtil.findBean( - AssetRepository.class); + AssetRepository.class); final Asset asset = assetRepo - .findById(selectionModel.getSelectedKey(state)) - .orElseThrow(() -> new IllegalArgumentException(String.format( - "No asset with ID %d in the database.", - selectionModel.getSelectedKey(state)))); + .findById(selectionModel.getSelectedKey(state)) + .orElseThrow(() -> new IllegalArgumentException(String. + format( + "No asset with ID %d in the database.", + selectionModel.getSelectedKey(state)))); return Optional.of(asset); } } @@ -112,18 +120,18 @@ public abstract class AssetForm extends Form implements FormInitListener, if (selectedAsset.isPresent()) { title.setValue(state, selectedAsset - .get() - .getTitle() - .getValue(KernelConfig - .getConfig() - .getDefaultLocale())); + .get() + .getTitle() + .getValue(KernelConfig + .getConfig() + .getDefaultLocale())); } } @Override public void process(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); @@ -138,26 +146,45 @@ public abstract class AssetForm extends Form implements FormInitListener, } asset.getTitle().addValue( - KernelConfig.getConfig().getDefaultLocale(), - (String) title.getValue(state)); + KernelConfig.getConfig().getDefaultLocale(), + (String) title.getValue(state)); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetRepository assetRepo = cdiUtil - .findBean(AssetRepository.class); + .findBean(AssetRepository.class); 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) - throws FormProcessException; + throws FormProcessException; protected abstract void updateAsset(final Asset asset, - final PageState state) - throws FormProcessException; + final PageState state) + throws FormProcessException; @Override public void submitted(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); 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 index 748e68727..6c2c6acba 100644 --- 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 @@ -26,6 +26,7 @@ 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; @@ -69,6 +70,7 @@ import com.arsdigita.cms.ui.folder.FolderTreeModelController; import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.LayoutPanel; +import java.lang.reflect.InvocationTargetException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -98,6 +100,7 @@ import java.util.Arrays; import java.util.Objects; import java.util.ResourceBundle; import java.util.TooManyListenersException; +import java.util.logging.Level; import static org.librecms.CmsConstants.*; @@ -121,9 +124,11 @@ public class AssetPane extends LayoutPanel implements Resettable { private final FolderRequestLocal folderRequestLocal; private final SingleSelectionModel selectedAssetModel; private final ArrayParameter sourcesParameter = new ArrayParameter( - new StringParameter(SOURCES_PARAM)); + new StringParameter(SOURCES_PARAM)); private final StringParameter actionParameter = new StringParameter( - ACTION_PARAM); + ACTION_PARAM); + private final StringParameter selectedAssetTypeParam = new StringParameter( + "selected_asset_type"); private AssetFolderBrowser folderBrowser; private Form browserForm; @@ -136,7 +141,7 @@ public class AssetPane extends LayoutPanel implements Resettable { private SegmentedPanel.Segment actionsSegment; private SegmentedPanel.Segment newFolderSegment; private SegmentedPanel.Segment editFolderSegment; - private SegmentedPanel.Segment editAssetSegement; + private SegmentedPanel.Segment editAssetSegment; @SuppressWarnings("unchecked") public AssetPane() { @@ -145,8 +150,8 @@ public class AssetPane extends LayoutPanel implements Resettable { @Override protected Folder getRootFolder(final PageState state) { final ContentSection section = CMS - .getContext() - .getContentSection(); + .getContext() + .getContentSection(); return section.getRootAssetsFolder(); } @@ -157,8 +162,8 @@ public class AssetPane extends LayoutPanel implements Resettable { @Override protected Long getRootFolderID(final PageState state) { final ContentSection section = CMS - .getContext() - .getContentSection(); + .getContext() + .getContentSection(); return section.getRootAssetsFolder().getObjectId(); } @@ -166,14 +171,14 @@ public class AssetPane extends LayoutPanel implements Resettable { folderRequestLocal = new FolderRequestLocal(folderSelectionModel); selectedAssetModel = new ParameterSingleSelectionModel<>( - new LongParameter("selected-asset")); + 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)); + new GlobalizedMessage("cms.ui.folder_browser", + CmsConstants.CMS_BUNDLE)); left.addSegment(heading, tree); // final Text placeholder = new Text("Placeholder"); @@ -189,17 +194,17 @@ public class AssetPane extends LayoutPanel implements Resettable { browserForm = new Form("assetFolderBrowser", new BoxPanel(BoxPanel.VERTICAL)); browserForm.setMethod(Form.GET); - folderBrowser = new AssetFolderBrowser(folderSelectionModel); + folderBrowser = new AssetFolderBrowser(this); final Paginator paginator = new Paginator( - new AssetFolderBrowserPaginationModelBuilder(folderBrowser), - CMSConfig.getConfig().getFolderBrowseListSize()); + 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)); + new GlobalizedMessage("empty_text", CmsConstants.CMS_BUNDLE)); checkboxCol.setCellRenderer(new TableCellRenderer() { @Override @@ -224,31 +229,31 @@ public class AssetPane extends LayoutPanel implements Resettable { browserForm.add(folderBrowser); final SimpleContainer actionFormContainer = new SimpleContainer(); actionFormContainer.add(new Label( - new GlobalizedMessage( - "cms.ui.folder.edit_selection", - CmsConstants.CMS_FOLDER_BUNDLE))); + 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)))); + 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)))); + 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)); + "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 { + throws FormProcessException { final PageState state = event.getPageState(); @@ -264,7 +269,7 @@ public class AssetPane extends LayoutPanel implements Resettable { @Override public void process(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); @@ -285,12 +290,12 @@ public class AssetPane extends LayoutPanel implements Resettable { }); targetSelector.addValidationListener( - new TargetSelectorValidationListener()); + new TargetSelectorValidationListener()); targetSelector.addSubmissionListener(new FormSubmissionListener() { @Override public void submitted(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); @@ -298,8 +303,8 @@ public class AssetPane extends LayoutPanel implements Resettable { reset(state); browseMode(state); throw new FormProcessException(new GlobalizedMessage( - "cms.ui.folder.cancelled", - CmsConstants.CMS_FOLDER_BUNDLE)); + "cms.ui.folder.cancelled", + CmsConstants.CMS_FOLDER_BUNDLE)); } } @@ -321,13 +326,13 @@ public class AssetPane extends LayoutPanel implements Resettable { final Label target = (Label) event.getTarget(); final long selectedId = Long.parseLong(selectionModel - .getSelectedKey(state).toString()); + .getSelectedKey(state).toString()); final long currentFolderId = folderSelectionModel - .getSelectedObject(state).getObjectId(); + .getSelectedObject(state).getObjectId(); target.setLabel(String.format( - "selectedId = %d; currentFolderId = %d", - selectedId, - currentFolderId)); + "selectedId = %d; currentFolderId = %d", + selectedId, + currentFolderId)); } }); @@ -340,19 +345,19 @@ public class AssetPane extends LayoutPanel implements Resettable { actionsSegment.add(actions); final FolderCreateForm folderCreateForm = new FolderCreateForm( - "fcreat", folderSelectionModel); + "fcreat", folderSelectionModel); folderCreateForm.addSubmissionListener(new FormSubmissionListener() { @Override public void submitted(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); if (event.getSource() == folderCreateForm - && folderCreateForm.isCancelled(state)) { + && folderCreateForm.isCancelled(state)) { browseMode(state); 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 public void process(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); final Object source = event.getSource(); @@ -373,24 +378,24 @@ public class AssetPane extends LayoutPanel implements Resettable { }); newFolderSegment = panel.addSegment( - new Label(new GlobalizedMessage("cms.ui.new_folder", - CmsConstants.CMS_BUNDLE)), - folderCreateForm); + new Label(new GlobalizedMessage("cms.ui.new_folder", + CmsConstants.CMS_BUNDLE)), + folderCreateForm); final FolderEditorForm folderEditorForm = new FolderEditorForm( - "fedit", folderSelectionModel); + "fedit", folderSelectionModel); folderEditorForm.addSubmissionListener(new FormSubmissionListener() { @Override public void submitted(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); if (event.getSource() == folderEditorForm - && folderEditorForm.isCancelled(state)) { + && folderEditorForm.isCancelled(state)) { browseMode(state); 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 public void process(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); final Object source = event.getSource(); @@ -410,13 +415,13 @@ public class AssetPane extends LayoutPanel implements Resettable { }); editFolderSegment = panel.addSegment( - new Label(new GlobalizedMessage("cms.ui.edit_folder", - CmsConstants.CMS_BUNDLE)), - folderEditorForm); + 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))); + new Label(new GlobalizedMessage("cms.ui.new_folder", + CmsConstants.CMS_BUNDLE))); createFolderAction.addActionListener(new ActionListener() { @Override @@ -432,8 +437,8 @@ public class AssetPane extends LayoutPanel implements Resettable { actions.addAction(createFolderAction); final ActionLink editFolderAction = new ActionLink( - new Label(new GlobalizedMessage("cms.ui.edit_folder", - CmsConstants.CMS_BUNDLE))); + new Label(new GlobalizedMessage("cms.ui.edit_folder", + CmsConstants.CMS_BUNDLE))); editFolderAction.addActionListener(new ActionListener() { @Override @@ -451,9 +456,9 @@ public class AssetPane extends LayoutPanel implements Resettable { final Form newAssetForm = new Form("new-asset-form", new BoxPanel(BoxPanel.HORIZONTAL)); 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( - "new-asset-type-select"); + selectedAssetTypeParam); try { newAssetTypeSelect.addPrintListener(new PrintListener() { @@ -461,18 +466,19 @@ public class AssetPane extends LayoutPanel implements Resettable { public void prepare(final PrintEvent event) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetTypesManager typesManager = cdiUtil - .findBean(AssetTypesManager.class); + .findBean(AssetTypesManager.class); final SingleSelect target = (SingleSelect) event.getTarget(); + target.clearOptions(); for (final AssetTypeInfo type : typesManager - .getAvailableAssetTypes()) { + .getAvailableAssetTypes()) { final String labelKey = type.getLabelKey(); final String labelBundle = type.getLabelBundle(); final ResourceBundle bundle = ResourceBundle - .getBundle(labelBundle); + .getBundle(labelBundle); final String label = bundle.getString(labelKey); target.addOption(new Option( - type.getAssetClass().getName(), - new Text(label))); + type.getAssetClass().getName(), + new Text(label))); } } @@ -482,20 +488,94 @@ public class AssetPane extends LayoutPanel implements Resettable { } newAssetForm.add(newAssetTypeSelect); 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() { @Override public void process(final FormSectionEvent event) - throws FormProcessException { - - //Nothing yet + throws FormProcessException { + editAssetMode(event.getPageState()); } }); 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 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; } @@ -509,6 +589,7 @@ public class AssetPane extends LayoutPanel implements Resettable { actionsSegment.setVisible(state, true); newFolderSegment.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); editFolderSegment.setVisible(state, false); targetSelector.expose(state); + editAssetSegment.setVisible(state, false); } protected void newFolderMode(final PageState state) { @@ -533,6 +615,7 @@ public class AssetPane extends LayoutPanel implements Resettable { actionsSegment.setVisible(state, false); newFolderSegment.setVisible(state, true); editFolderSegment.setVisible(state, false); + editAssetSegment.setVisible(state, false); } protected void editFolderMode(final PageState state) { @@ -542,6 +625,17 @@ public class AssetPane extends LayoutPanel implements Resettable { actionsSegment.setVisible(state, false); newFolderSegment.setVisible(state, false); 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 @@ -560,9 +654,13 @@ public class AssetPane extends LayoutPanel implements Resettable { page.setVisibleDefault(actionsSegment, true); page.setVisibleDefault(newFolderSegment, false); page.setVisibleDefault(editFolderSegment, false); + page.setVisibleDefault(editAssetSegment, false); page.addComponentStateParam(this, actionParameter); page.addComponentStateParam(this, sourcesParameter); + page.addComponentStateParam(this, selectedAssetTypeParam); + page.addComponentStateParam(this, + selectedAssetModel.getStateParameter()); } @Override @@ -580,7 +678,11 @@ public class AssetPane extends LayoutPanel implements Resettable { protected SingleSelectionModel getSelectedAssetModel() { return selectedAssetModel; } - + + protected FolderSelectionModel getFolderSelectionModel() { + return folderSelectionModel; + } + private String[] getSources(final PageState state) { final String[] result = (String[]) state.getValue(sourcesParameter); @@ -608,7 +710,7 @@ public class AssetPane extends LayoutPanel implements Resettable { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetFolderBrowserController controller = cdiUtil.findBean( - AssetFolderBrowserController.class); + AssetFolderBrowserController.class); controller.moveObjects(target, objectIds); } @@ -617,7 +719,7 @@ public class AssetPane extends LayoutPanel implements Resettable { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetFolderBrowserController controller = cdiUtil.findBean( - AssetFolderBrowserController.class); + AssetFolderBrowserController.class); controller.copyObjects(target, objectIds); } @@ -632,14 +734,14 @@ public class AssetPane extends LayoutPanel implements Resettable { if (!selectionModel.isSelected(state)) { final String folder = state - .getRequest() - .getParameter(SET_FOLDER); + .getRequest() + .getParameter(SET_FOLDER); if (folder == null) { final Category root = CMS - .getContext() - .getContentSection() - .getRootAssetsFolder(); + .getContext() + .getContentSection() + .getRootAssetsFolder(); final Long folderId = root.getObjectId(); selectionModel.setSelectedKey(state, folderId); @@ -659,18 +761,18 @@ public class AssetPane extends LayoutPanel implements Resettable { final PageState state = event.getPageState(); final Category root = CMS - .getContext() - .getContentSection() - .getRootAssetsFolder(); + .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); + FolderTreeModelController.class); final List ancestorIds = controller.findAncestorIds( - folderRequestLocal.getFolder(state)); + folderRequestLocal.getFolder(state)); ancestorIds.forEach(id -> tree.expand(id.toString(), state)); } @@ -692,8 +794,8 @@ public class AssetPane extends LayoutPanel implements Resettable { @Override protected Long getRootFolderID(final PageState state) { final ContentSection section = CMS - .getContext() - .getContentSection(); + .getContext() + .getContentSection(); return section.getRootAssetsFolder().getObjectId(); } @@ -711,37 +813,37 @@ public class AssetPane extends LayoutPanel implements Resettable { final Label label = (Label) event.getTarget(); final int numberOfItems = getSources(state).length; final Category folder = (Category) folderSelectionModel - .getSelectedObject(state); + .getSelectedObject(state); final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CategoryManager categoryManager = cdiUtil - .findBean(CategoryManager.class); + .findBean(CategoryManager.class); final String targetFolderPath; if (targetFolderModel.getSelectedObject(state) == null) { targetFolderPath = ""; } else { targetFolderPath = categoryManager.getCategoryPath( - targetFolderModel.getSelectedObject(state)); + 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 - })); + "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 - })); + "cms.ui.folder.copy", + CMS_BUNDLE, + new Object[]{ + numberOfItems, + categoryManager.getCategoryPath(folder), + targetFolderPath + })); } } @@ -770,18 +872,18 @@ public class AssetPane extends LayoutPanel implements Resettable { if (folder != null) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final FolderManager folderManager = cdiUtil.findBean( - FolderManager.class); + FolderManager.class); if (!folderManager.getParentFolder(folder).isPresent()) { folderTree.expand(Long.toString(folder.getObjectId()), state); } else { final List parents = folderManager - .getParentFolders(folder); + .getParentFolders(folder); parents - .stream() - .map(parent -> Long.toString(parent.getObjectId())) - .forEach(folderId -> folderTree.expand(folderId, - state)); + .stream() + .map(parent -> Long.toString(parent.getObjectId())) + .forEach(folderId -> folderTree.expand(folderId, + state)); } } } @@ -806,7 +908,7 @@ public class AssetPane extends LayoutPanel implements Resettable { private class FolderTreeCellRenderer implements TreeCellRenderer { private final RequestLocal invalidFoldersRequestLocal - = new RequestLocal(); + = new RequestLocal(); /** * 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) { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final AssetFolderBrowserController controller = cdiUtil - .findBean(AssetFolderBrowserController.class); + .findBean(AssetFolderBrowserController.class); invalidFolders = controller.createInvalidTargetsList( - Arrays.asList(getSources(state))); + Arrays.asList(getSources(state))); invalidFoldersRequestLocal.set(state, invalidFolders); } else { invalidFolders = (List) invalidFoldersRequestLocal - .get(state); + .get(state); } final Label label = new Label(value.toString()); if (invalidFolders.contains(String.format( - FOLDER_BROWSER_KEY_PREFIX_FOLDER + "%s", key))) { + FOLDER_BROWSER_KEY_PREFIX_FOLDER + "%s", key))) { return label; } @@ -857,11 +959,11 @@ public class AssetPane extends LayoutPanel implements Resettable { } private class TargetSelectorValidationListener - implements FormValidationListener { + implements FormValidationListener { @Override public void validate(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); @@ -873,24 +975,24 @@ public class AssetPane extends LayoutPanel implements Resettable { final FormData data = event.getFormData(); if (target == null) { data.addError(new GlobalizedMessage( - "cms.ui.folder.need_select_target_folder", - CmsConstants.CMS_FOLDER_BUNDLE)); + "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)); + "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); + PermissionChecker.class); if (!permissionChecker.isPermitted( - ItemPrivileges.CREATE_NEW, target)) { + ItemPrivileges.CREATE_NEW, target)) { data.addError("cms.ui.folder.no_permission_for_item", CmsConstants.CMS_FOLDER_BUNDLE); } @@ -911,34 +1013,34 @@ public class AssetPane extends LayoutPanel implements Resettable { final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final FolderRepository folderRepo = cdiUtil - .findBean(FolderRepository.class); + .findBean(FolderRepository.class); final AssetRepository assetRepo = cdiUtil - .findBean(AssetRepository.class); + .findBean(AssetRepository.class); final AssetManager assetManager = cdiUtil - .findBean(AssetManager.class); + .findBean(AssetManager.class); final AssetFolderBrowserController controller = cdiUtil - .findBean(AssetFolderBrowserController.class); + .findBean(AssetFolderBrowserController.class); final FolderManager folderManager = cdiUtil - .findBean(FolderManager.class); + .findBean(FolderManager.class); final PermissionChecker permissionChecker = cdiUtil.findBean( - PermissionChecker.class); + 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())); + 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))); + () -> 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); + .folderIsMovable(folder, target); switch (movable) { case DIFFERENT_SECTIONS: addErrorMessage(data, @@ -970,23 +1072,23 @@ public class AssetPane extends LayoutPanel implements Resettable { break; default: throw new UnexpectedErrorException(String.format( - "Unknown state '%s' for '%s'.", - movable, - FolderManager.FolderIsMovable.class. - getName())); + "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())); + 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))); + .findById(assetId) + .orElseThrow(() -> new IllegalArgumentException( + String.format( + "No asset with id %d in the database.", + assetId))); name = asset.getDisplayName(); @@ -997,11 +1099,11 @@ public class AssetPane extends LayoutPanel implements Resettable { 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)); + "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); @@ -1013,7 +1115,7 @@ public class AssetPane extends LayoutPanel implements Resettable { if (!(permissionChecker.isPermitted( ItemPrivileges.DELETE, object)) - && isMove(state)) { + && isMove(state)) { addErrorMessage(data, "cms.ui.folder.no_permission_for_item", object.getDisplayName()); @@ -1040,8 +1142,8 @@ public class AssetPane extends LayoutPanel implements Resettable { @Override protected Folder getRootFolder(final PageState state) { final ContentSection section = CMS - .getContext() - .getContentSection(); + .getContext() + .getContentSection(); return section.getRootAssetsFolder(); } @@ -1055,9 +1157,9 @@ public class AssetPane extends LayoutPanel implements Resettable { if (key instanceof String) { final Long keyAsLong; if (((String) key).startsWith( - FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { + FOLDER_BROWSER_KEY_PREFIX_FOLDER)) { keyAsLong = Long.parseLong(((String) key).substring( - FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); + FOLDER_BROWSER_KEY_PREFIX_FOLDER.length())); } else { keyAsLong = Long.parseLong((String) key); } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java index d09a9c741..772b56815 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BookmarkForm.java @@ -38,8 +38,6 @@ import org.librecms.contentsection.Asset; import java.net.MalformedURLException; import java.net.URL; 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() { add(new Label( - new GlobalizedMessage("cms.ui.assets.bookmark.description", - CmsConstants.CMS_BUNDLE))); + new GlobalizedMessage("cms.ui.assets.bookmark.description", + CmsConstants.CMS_BUNDLE))); description = new TextArea("bookmark-description"); add(description); @@ -72,7 +70,7 @@ public class BookmarkForm extends AssetForm { @Override public void validate(final FormSectionEvent event) - throws FormProcessException { + throws FormProcessException { final PageState state = event.getPageState(); final FormData data = event.getFormData(); @@ -81,8 +79,8 @@ public class BookmarkForm extends AssetForm { new URL((String) url.getValue(state)); } catch (MalformedURLException ex) { data.addError(new GlobalizedMessage( - "cms.ui.assets.bookmark.url.malformed", - CmsConstants.CMS_BUNDLE)); + "cms.ui.assets.bookmark.url.malformed", + CmsConstants.CMS_BUNDLE)); } } @@ -92,58 +90,45 @@ public class BookmarkForm extends AssetForm { @Override protected Asset createAsset(final PageState state) - throws FormProcessException { + throws FormProcessException { Objects.requireNonNull(state); final Bookmark bookmark = new Bookmark(); bookmark - .getDescription() - .addValue(KernelConfig.getConfig().getDefaultLocale(), - (String) description.getValue(state)); + .getDescription() + .addValue(KernelConfig.getConfig().getDefaultLocale(), + (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)); return bookmark; } @Override protected void updateAsset(final Asset asset, final PageState state) - throws FormProcessException { + throws FormProcessException { Objects.requireNonNull(asset); Objects.requireNonNull(state); if (!(asset instanceof Bookmark)) { 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'", - Bookmark.class.getName(), - asset.getClass().getName())); + Bookmark.class.getName(), + asset.getClass().getName())); } final Bookmark bookmark = (Bookmark) asset; bookmark - .getDescription() - .addValue(KernelConfig.getConfig().getDefaultLocale(), - (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)); - } + .getDescription() + .addValue(KernelConfig.getConfig().getDefaultLocale(), + (String) description.getValue(state)); + bookmark.setUrl((String) url.getValue(state)); } } diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/LegalMetadataForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/LegalMetadataForm.java index f3bc1249d..b1395322f 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/LegalMetadataForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/LegalMetadataForm.java @@ -51,35 +51,44 @@ public class LegalMetadataForm extends AssetForm { @Override 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"); add(rightsHolder); + add(new Label(new GlobalizedMessage( + "cms.ui.assets.legalmetadata.rights", + CmsConstants.CMS_BUNDLE))); rights = new TextArea("legalmetadata-rights"); add(rights); + add(new Label(new GlobalizedMessage( + "cms.ui.assets.legalmetadata.publisher", + CmsConstants.CMS_BUNDLE))); publisher = new TextArea("legalmetadata-rights"); add(publisher); + add(new Label(new GlobalizedMessage( + "cms.ui.assets.legalmetadata.creator", + CmsConstants.CMS_BUNDLE))); creator = new TextArea("legalmetadata-creator"); add(creator); } @Override protected Asset createAsset(final PageState state) - throws FormProcessException { + throws FormProcessException { Objects.requireNonNull(state); - + final LegalMetadata legalMetadata = new LegalMetadata(); legalMetadata.setRightsHolder((String) rightsHolder.getValue(state)); legalMetadata.getRights().addValue( - KernelConfig.getConfig().getDefaultLocale(), - (String) rights.getValue(state)); + KernelConfig.getConfig().getDefaultLocale(), + (String) rights.getValue(state)); legalMetadata.setPublisher((String) publisher.getValue(state)); legalMetadata.setCreator((String) creator.getValue(state)); @@ -89,25 +98,25 @@ public class LegalMetadataForm extends AssetForm { @Override protected void updateAsset(final Asset asset, final PageState state) - throws FormProcessException { - + throws FormProcessException { + Objects.requireNonNull(asset); Objects.requireNonNull(state); - + if (!(asset instanceof LegalMetadata)) { 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'.", - LegalMetadata.class.getName(), - asset.getClass().getName())); + LegalMetadata.class.getName(), + asset.getClass().getName())); } - + final LegalMetadata legalMetadata = (LegalMetadata) asset; - + legalMetadata.setRightsHolder((String) rightsHolder.getValue(state)); legalMetadata.getRights().addValue( - KernelConfig.getConfig().getDefaultLocale(), - (String) rights.getValue(state)); + KernelConfig.getConfig().getDefaultLocale(), + (String) rights.getValue(state)); legalMetadata.setPublisher((String) publisher.getValue(state)); legalMetadata.setCreator((String) creator.getValue(state)); diff --git a/ccm-cms/src/main/java/org/librecms/assets/AssetTypesManager.java b/ccm-cms/src/main/java/org/librecms/assets/AssetTypesManager.java index 32a38ad12..97db086a0 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/AssetTypesManager.java +++ b/ccm-cms/src/main/java/org/librecms/assets/AssetTypesManager.java @@ -58,15 +58,15 @@ public class AssetTypesManager { protected void initialize() { final ServiceLoader modules = ServiceLoader - .load(CcmModule.class); + .load(CcmModule.class); final SortedSet> assetTypes = new TreeSet<>( - (type1, type2) -> type1.getName().compareTo(type2.getName())); + (type1, type2) -> type1.getName().compareTo(type2.getName())); for (final CcmModule module : modules) { final AssetTypes annotation = module - .getClass() - .getAnnotation(AssetTypes.class); + .getClass() + .getAnnotation(AssetTypes.class); if (annotation == null) { continue; @@ -76,22 +76,22 @@ public class AssetTypesManager { } availableAssetTypes = assetTypes - .stream() - .filter(type -> type.getAnnotation(AssetType.class) != null) - .map(assetTypeClass -> createAssetTypeInfo(assetTypeClass)) - .collect(Collectors.toList()); + .stream() + .filter(type -> type.getAnnotation(AssetType.class) != null) + .map(assetTypeClass -> createAssetTypeInfo(assetTypeClass)) + .collect(Collectors.toList()); } /** * Helper method for creating the info object for a asset type. * * @param assetTypeClass The class which provides the implementation of the - * asset type. + * asset type. * * @return A {@link AssetTypeInfo} object describing the asset type. */ private AssetTypeInfo createAssetTypeInfo( - final Class assetTypeClass) { + final Class assetTypeClass) { Objects.requireNonNull(assetTypeClass); @@ -101,7 +101,7 @@ public class AssetTypesManager { final String defaultBundleName = String.format("%sBundle", assetTypeClass.getName()); final AssetType assetType = assetTypeClass - .getAnnotation(AssetType.class); + .getAnnotation(AssetType.class); if (assetType == null) { assetTypeInfo.setLabelBundle(defaultBundleName); @@ -156,7 +156,7 @@ public class AssetTypesManager { * @return A {@link AssetTypeInfo} object describing the asset type. */ public AssetTypeInfo getAssetTypeInfo( - final Class assetTypeClass) { + final Class assetTypeClass) { Objects.requireNonNull(assetTypeClass); @@ -168,13 +168,12 @@ public class AssetTypesManager { * asset type. * * @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. * * @throws IllegalArgumentException If no class with the provided name - * exists or the class is not a subclass of - * {@link Asset}. + * exists or the class is not a subclass of {@link Asset}. */ @SuppressWarnings("unchecked") public AssetTypeInfo getAssetTypeInfo(final String assetTypeClass) { @@ -186,15 +185,15 @@ public class AssetTypesManager { clazz = Class.forName(assetTypeClass); } catch (ClassNotFoundException ex) { throw new IllegalArgumentException(String.format( - "There is not class \"%s\".", assetTypeClass), + "There is no class \"%s\".", assetTypeClass), ex); } if (!Asset.class.isAssignableFrom(clazz)) { throw new IllegalArgumentException(String.format( - "Class \"%s\" is not a subclass of of \"%s\".", - assetTypeClass, - Asset.class.getName())); + "Class \"%s\" is not a subclass of of \"%s\".", + assetTypeClass, + Asset.class.getName())); } return getAssetTypeInfo((Class) clazz); diff --git a/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java b/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java index 92ad4d009..2c87119c9 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java +++ b/ccm-cms/src/main/java/org/librecms/assets/Bookmark.java @@ -73,7 +73,7 @@ public class Bookmark extends Asset implements Serializable { @Column(name = "URL", length = 2048, nullable = false) @NotEmpty - private URL url; + private String url; public Bookmark() { super(); @@ -88,11 +88,11 @@ public class Bookmark extends Asset implements Serializable { this.description = description; } - public URL getUrl() { + public String getUrl() { return url; } - public void setUrl(final URL url) { + public void setUrl(final String url) { this.url = url; } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/AssetRepository.java b/ccm-cms/src/main/java/org/librecms/contentsection/AssetRepository.java index 5ed508d3f..5f5be337d 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/AssetRepository.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/AssetRepository.java @@ -97,7 +97,8 @@ public class AssetRepository public void save( @RequiresPrivilege(AssetPrivileges.EDIT) final Asset asset) { - + + super.save(asset); } /** diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties index d9bbdd8b1..8c28191a6 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources.properties @@ -248,3 +248,7 @@ cms.ui.assets=Assets cms.ui.folder.no_assets=No assets cms.ui.assets.new=Create new 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 diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties index e666e32e1..b9eb95e88 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_de.properties @@ -247,3 +247,7 @@ cms.ui.assets=Medien & Daten cms.ui.folder.no_assets=Keine Medien oder Datens\u00e4tze vorhanden cms.ui.assets.new=Neues 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 diff --git a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties index f3a9b9a73..4d6ac5875 100644 --- a/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties +++ b/ccm-cms/src/main/resources/org/librecms/CmsResources_fr.properties @@ -206,3 +206,7 @@ cms.ui.assets=Assets cms.ui.folder.no_assets=No assets cms.ui.assets.new=Create new 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