From 79c85df4a368ef1b5058aada5e4282586552b23e Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sat, 29 Jan 2022 17:12:14 +0100 Subject: [PATCH] Include attachments into ContentItemModel --- .../models/AbstractAssetModelBuilder.java | 31 +++-- .../AbstractBinaryAssetModelBuilder.java | 2 - .../pages/models/AssetModelBuilder.java | 2 +- .../pages/models/AttachmentListModel.java | 112 ++++++++++++++++++ .../pages/models/AttachmentModel.java | 77 ++++++++++++ .../pages/models/ContentItemModel.java | 99 +++++++++++++++- 6 files changed, 305 insertions(+), 18 deletions(-) create mode 100644 ccm-cms/src/main/java/org/librecms/pages/models/AttachmentListModel.java create mode 100644 ccm-cms/src/main/java/org/librecms/pages/models/AttachmentModel.java diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/AbstractAssetModelBuilder.java b/ccm-cms/src/main/java/org/librecms/pages/models/AbstractAssetModelBuilder.java index 501676ec3..586ed79b6 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/models/AbstractAssetModelBuilder.java +++ b/ccm-cms/src/main/java/org/librecms/pages/models/AbstractAssetModelBuilder.java @@ -29,31 +29,40 @@ import javax.inject.Inject; * @param * @param */ -public abstract class AbstractAssetModelBuilder -implements AssetModelBuilder { - +public abstract class AbstractAssetModelBuilder + implements AssetModelBuilder { + @Inject private GlobalizationHelper globalizationHelper; - + @Override @SuppressWarnings("unchecked") - public M buildAssetModel(final T asset) { + public M buildAssetModel(final Asset asset) { + if (!asset.getClass().isAssignableFrom(buildsAssetModelFor())) { + throw new IllegalArgumentException( + String.format( + "This builder can only process Assets of type %s.", + buildsAssetModelFor().getName() + ) + ); + } + final M model = buildModel(); model.setDisplayName(asset.getDisplayName()); model.setTitle( globalizationHelper.getValueFromLocalizedString(asset.getTitle()) ); model.setUuid(asset.getUuid()); - - addProperties(asset, model); - + + addProperties((T) asset, model); + return model; } - + protected abstract M buildModel(); - + protected void addProperties(final T asset, final M model) { // Nothing in the default implementation. } - + } diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/AbstractBinaryAssetModelBuilder.java b/ccm-cms/src/main/java/org/librecms/pages/models/AbstractBinaryAssetModelBuilder.java index 735040ab8..aa9eb03d6 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/models/AbstractBinaryAssetModelBuilder.java +++ b/ccm-cms/src/main/java/org/librecms/pages/models/AbstractBinaryAssetModelBuilder.java @@ -22,7 +22,6 @@ import org.libreccm.l10n.GlobalizationHelper; import org.librecms.assets.BinaryAsset; import org.librecms.contentsection.AssetManager; -import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.transaction.Transactional; @@ -32,7 +31,6 @@ import javax.transaction.Transactional; * @param * @param */ -@RequestScoped public abstract class AbstractBinaryAssetModelBuilder extends AbstractAssetModelBuilder { diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/AssetModelBuilder.java b/ccm-cms/src/main/java/org/librecms/pages/models/AssetModelBuilder.java index e0d9ee76b..c2f2d6b8b 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/models/AssetModelBuilder.java +++ b/ccm-cms/src/main/java/org/librecms/pages/models/AssetModelBuilder.java @@ -28,7 +28,7 @@ import org.librecms.contentsection.Asset; */ public interface AssetModelBuilder { - M buildAssetModel(T asset); + M buildAssetModel(Asset asset); Class buildsAssetModelFor(); diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/AttachmentListModel.java b/ccm-cms/src/main/java/org/librecms/pages/models/AttachmentListModel.java new file mode 100644 index 000000000..b4163e259 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/pages/models/AttachmentListModel.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2022 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.pages.models; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * + * @author Jens Pelzetter + */ +public class AttachmentListModel implements Comparable{ + + private long listId; + + private String uuid; + + private String name; + + private long listOrder; + + private String title; + + private String description; + + private List attachments; + + public long getListId() { + return listId; + } + + public void setListId(final long listId) { + this.listId = listId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getListOrder() { + return listOrder; + } + + public void setListOrder(final long listOrder) { + this.listOrder = listOrder; + } + + public String getTitle() { + return title; + } + + public void setTitle(final String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public List getAttachments() { + return Collections.unmodifiableList(attachments); + } + + public void setAttachments(final List attachments) { + this.attachments = new ArrayList<>(attachments); + } + + @Override + public int compareTo(final AttachmentListModel other) { + return Comparator + .comparing(AttachmentListModel::getListOrder) + .thenComparing( + AttachmentListModel::getName, String::compareToIgnoreCase + ) + .compare(this, other); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/AttachmentModel.java b/ccm-cms/src/main/java/org/librecms/pages/models/AttachmentModel.java new file mode 100644 index 000000000..0eb48c58d --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/pages/models/AttachmentModel.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2022 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.pages.models; + +import java.util.Comparator; + +/** + * + * @author Jens Pelzetter + */ +public class AttachmentModel implements Comparable{ + + private long attachmentId; + + private String uuid; + + private long sortKey; + + private AbstractAssetModel asset; + + public long getAttachmentId() { + return attachmentId; + } + + public void setAttachmentId(final long attachmentId) { + this.attachmentId = attachmentId; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public long getSortKey() { + return sortKey; + } + + public void setSortKey(final long sortKey) { + this.sortKey = sortKey; + } + + public AbstractAssetModel getAsset() { + return asset; + } + + public void setAsset(final AbstractAssetModel asset) { + this.asset = asset; + } + + @Override + public int compareTo(final AttachmentModel other) { + return Comparator + .comparing(AttachmentModel::getSortKey) + .thenComparing(AttachmentModel::getAttachmentId) + .compare(this, other); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/pages/models/ContentItemModel.java b/ccm-cms/src/main/java/org/librecms/pages/models/ContentItemModel.java index 09037d248..c919c3927 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/models/ContentItemModel.java +++ b/ccm-cms/src/main/java/org/librecms/pages/models/ContentItemModel.java @@ -21,22 +21,31 @@ package org.librecms.pages.models; import org.libreccm.categorization.CategoryRepository; import org.libreccm.core.CcmObject; import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.contentsection.Asset; +import org.librecms.contentsection.AttachmentList; import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItemVersion; +import org.librecms.contentsection.ItemAttachment; import org.librecms.pages.PagesController; import org.librecms.pages.PagesRouter; import org.librecms.pages.PagesService; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Instance; import javax.inject.Inject; import javax.inject.Named; import javax.transaction.Transactional; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Response; /** * Retrieves a categorized content item for the current category. To work, the @@ -50,6 +59,11 @@ import javax.transaction.Transactional; @Named("CmsPagesCategorizedItemModel") public class ContentItemModel { + /** + * Provides access to the builders for asset models. + */ + private AssetModelBuilders assetModelBuilders; + /** * Category repository used to retrieve the current category. */ @@ -483,10 +497,79 @@ public class ContentItemModel { data.setCreationUser(item.getCreationUserName()); data.setLastModifyingUserName(item.getLastModifyingUserName()); - //ToDo Attachments + data.setAttachmentLists( + item + .getAttachments() + .stream() + .map(this::buildAttachmentListModel) + .sorted() + .collect(Collectors.toList()) + ); + return data; } + private AttachmentListModel buildAttachmentListModel( + final AttachmentList attachmentList + ) { + final AttachmentListModel model = new AttachmentListModel(); + model.setAttachments( + attachmentList + .getAttachments() + .stream() + .map(this::buildAttachmentModel) + .sorted() + .collect(Collectors.toList()) + ); + model.setDescription( + globalizationHelper.getValueFromLocalizedString( + attachmentList.getDescription() + ) + ); + model.setListId(attachmentList.getListId()); + model.setListOrder(attachmentList.getListOrder()); + model.setName(attachmentList.getName()); + model.setTitle( + globalizationHelper.getValueFromLocalizedString( + attachmentList.getTitle() + ) + ); + model.setUuid(attachmentList.getUuid()); + + return model; + } + + private AttachmentModel buildAttachmentModel( + final ItemAttachment attachment + ) { + final AttachmentModel model = new AttachmentModel(); + final Asset asset = attachment.getAsset(); + final AssetModelBuilder assetModelBuilder + = assetModelBuilders + .getModelBuilderFor(asset.getClass()) + .orElseThrow( + () -> new WebApplicationException( + Response + .status(Response.Status.INTERNAL_SERVER_ERROR) + .entity( + String.format( + "Unknown asset type %s.", + asset.getClass().getName() + ) + ) + .build() + ) + ); + model.setAsset( + assetModelBuilder.buildAssetModel(attachment.getAsset()) + ); + model.setAttachmentId(attachment.getAttachmentId()); + model.setSortKey(attachment.getSortKey()); + model.setUuid(attachment.getUuid()); + + return model; + } + /** * Encapsulates the data of content item provided by this model. To avoid to * have to many fields in this model class we use an internal class to @@ -519,6 +602,8 @@ public class ContentItemModel { private String lastModifyingUserName; + private List attachmentLists; + public long getObjectId() { return objectId; } @@ -617,9 +702,15 @@ public class ContentItemModel { this.lastModifyingUserName = lastModifyingUserName; } -// private List getAttachments() { -// throw new UnsupportedOperationException("Not implemented yet."); -// } + public List getAttachmentLists() { + return Collections.unmodifiableList(attachmentLists); + } + + public void setAttachmentLists( + final List attachmentLists) { + this.attachmentLists = new ArrayList<>(attachmentLists); + } + } }