diff --git a/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java b/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java
index 7bcf8003b..9b28bc83b 100644
--- a/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java
+++ b/ccm-cms/src/main/java/org/librecms/assets/AudioAsset.java
@@ -19,7 +19,7 @@
package org.librecms.assets;
import com.arsdigita.cms.ui.assets.forms.AudioForm;
-import com.arsdigita.cms.ui.assets.forms.ExternalVideoAssetForm;
+
import org.hibernate.envers.Audited;
import java.io.Serializable;
diff --git a/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java b/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java
index ef20797c2..f5f9624ee 100644
--- a/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java
+++ b/ccm-cms/src/main/java/org/librecms/assets/BinaryAsset.java
@@ -35,12 +35,10 @@ import javax.persistence.Lob;
import javax.persistence.Table;
import org.hibernate.envers.Audited;
-import org.hibernate.validator.constraints.NotEmpty;
import org.libreccm.jpa.utils.MimeTypeConverter;
import org.libreccm.l10n.LocalizedString;
import javax.persistence.Convert;
-import javax.validation.constraints.NotNull;
import static org.librecms.CmsConstants.*;
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AbstractAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AbstractAssetRenderer.java
new file mode 100644
index 000000000..fb275ae78
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AbstractAssetRenderer.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.contentsection.Asset;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public abstract class AbstractAssetRenderer {
+
+ public Map render(final Asset asset,
+ final Locale language) {
+
+ final Map result = new HashMap<>();
+
+ result.put("objectId", asset.getObjectId());
+ result.put("uuid", asset.getUuid());
+ result.put("displayName", asset.getDisplayName());
+ result.put("title", asset.getTitle().getValue(language));
+
+ renderAsset(asset, language, result);
+
+ return result;
+ }
+
+ protected abstract void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result);
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AssetRenderer.java
new file mode 100644
index 000000000..3298784e3
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AssetRenderer.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.contentsection.Asset;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@Qualifier
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD,
+ ElementType.FIELD,
+ ElementType.PARAMETER,
+ ElementType.TYPE})
+public @interface AssetRenderer {
+
+ Class extends Asset> renders();
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AssetRenderers.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AssetRenderers.java
new file mode 100644
index 000000000..3dce23d81
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AssetRenderers.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.inject.Instance;
+import javax.enterprise.util.AnnotationLiteral;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+public class AssetRenderers {
+
+ private static final Logger LOGGER = LogManager
+ .getLogger(AssetRenderers.class);
+
+ @Inject
+ private Instance renderers;
+
+ public AbstractAssetRenderer findRenderer(
+ final Class extends Asset> assetType) {
+
+ LOGGER.debug("Trying to find renderer for asset type \"{}\"...",
+ assetType.getName());
+
+ final AssetRendererLiteral literal = new AssetRendererLiteral(assetType);
+
+ final Instance instance = renderers
+ .select(literal);
+
+ if (instance.isUnsatisfied()) {
+
+ LOGGER.warn("No renderer for asset type \"{}\". "
+ + "Returning default renderer.",
+ assetType.getName());
+
+ return new AbstractAssetRenderer() {
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ //Nothing here.
+ }
+
+ };
+ } else {
+ return instance.iterator().next();
+ }
+ }
+
+ private class AssetRendererLiteral
+ extends AnnotationLiteral
+ implements AssetRenderer {
+
+ private static final long serialVersionUID = 2635180159989399554L;
+
+ private final Class extends Asset> renders;
+
+ public AssetRendererLiteral(final Class extends Asset> renders) {
+ this.renders = renders;
+ }
+
+ @Override
+ public Class extends Asset> renders() {
+ return renders;
+ }
+
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AudioAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AudioAssetRenderer.java
new file mode 100644
index 000000000..bbd24f63a
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/AudioAssetRenderer.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.AudioAsset;
+import org.librecms.assets.LegalMetadata;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = AudioAsset.class)
+public class AudioAssetRenderer extends BinaryAssetRenderer {
+
+ @Inject
+ @AssetRenderer(renders = LegalMetadata.class)
+ private AbstractAssetRenderer legalMetadataRenderer;
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ super.renderAsset(asset, language, result);
+
+ final AudioAsset audioAsset;
+ if (asset instanceof AudioAsset) {
+ audioAsset = (AudioAsset) asset;
+ } else {
+ return;
+ }
+
+ result.put("legalMetadata",
+ legalMetadataRenderer.render(audioAsset.getLegalMetadata(), language));
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/BinaryAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/BinaryAssetRenderer.java
new file mode 100644
index 000000000..dbcf89623
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/BinaryAssetRenderer.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.BinaryAsset;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class BinaryAssetRenderer extends AbstractAssetRenderer {
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ final BinaryAsset binaryAsset;
+ if (asset instanceof BinaryAsset) {
+ binaryAsset = (BinaryAsset) asset;
+ } else {
+ return;
+ }
+
+ result.put("description",
+ binaryAsset.getDescription().getValue(language));
+ result.put("fileName", binaryAsset.getFileName());
+ result.put("mimeType", Objects.toString(binaryAsset.getMimeType()));
+ result.put("size", binaryAsset.getSize());
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/BookmarkRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/BookmarkRenderer.java
new file mode 100644
index 000000000..76583e7bf
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/BookmarkRenderer.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.contentsection.Asset;
+import org.librecms.pagemodel.assets.AbstractAssetRenderer;
+import org.librecms.pagemodel.assets.AssetRenderer;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+
+import org.librecms.assets.Bookmark;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = Bookmark.class)
+public class BookmarkRenderer extends AbstractAssetRenderer {
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ final Bookmark bookmark;
+ if (asset instanceof Bookmark) {
+ bookmark = (Bookmark) asset;
+ } else {
+ return;
+ }
+
+ result.put("description", bookmark.getDescription().getValue(language));
+ result.put("url", bookmark.getUrl());
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ExternalAudioAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ExternalAudioAssetRenderer.java
new file mode 100644
index 000000000..2a0cc783c
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ExternalAudioAssetRenderer.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.ExternalAudioAsset;
+import org.librecms.assets.LegalMetadata;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = ExternalAudioAsset.class)
+public class ExternalAudioAssetRenderer extends BookmarkRenderer {
+
+ @Inject
+ @AssetRenderer(renders = LegalMetadata.class)
+ private AbstractAssetRenderer legalMetadataRenderer;
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ super.renderAsset(asset, language, result);
+
+ final ExternalAudioAsset externalAudioAsset;
+ if (asset instanceof ExternalAudioAsset) {
+ externalAudioAsset = (ExternalAudioAsset) asset;
+ } else {
+ return;
+ }
+
+ result.put("legalMetadata",
+ legalMetadataRenderer
+ .render(externalAudioAsset.getLegalMetadata(),
+ language));
+
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ExternalVideoAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ExternalVideoAssetRenderer.java
new file mode 100644
index 000000000..aedac5cd3
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ExternalVideoAssetRenderer.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.ExternalVideoAsset;
+import org.librecms.assets.LegalMetadata;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = ExternalVideoAsset.class)
+public class ExternalVideoAssetRenderer extends BookmarkRenderer {
+
+ @Inject
+ @AssetRenderer(renders = LegalMetadata.class)
+ private AbstractAssetRenderer legalMetadataRenderer;
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale locale,
+ final Map result) {
+
+ super.renderAsset(asset, locale, result);
+
+ final ExternalVideoAsset externalVideoAsset;
+ if (asset instanceof ExternalVideoAsset) {
+ externalVideoAsset = (ExternalVideoAsset) asset;
+ } else {
+ return;
+ }
+
+ result.put("legalMetadata",
+ legalMetadataRenderer
+ .render(externalVideoAsset.getLegalMetadata(), locale));
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/FileAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/FileAssetRenderer.java
new file mode 100644
index 000000000..842b6f3aa
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/FileAssetRenderer.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.FileAsset;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = FileAsset.class)
+public class FileAssetRenderer extends BinaryAssetRenderer {
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale locale,
+ final Map result) {
+
+ super.renderAsset(asset, locale, result);
+
+ //Nothing more yet
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ImageRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ImageRenderer.java
new file mode 100644
index 000000000..36cb43aae
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/ImageRenderer.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.Image;
+import org.librecms.assets.LegalMetadata;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@AssetRenderer(renders = Image.class)
+@RequestScoped
+public class ImageRenderer extends BinaryAssetRenderer {
+
+ @Inject
+ @AssetRenderer(renders = LegalMetadata.class)
+ private AbstractAssetRenderer legalMetadataRenderer;
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ super.renderAsset(asset, language, result);
+
+ final Image image;
+ if (asset instanceof Image) {
+ image = (Image) asset;
+ } else {
+ return;
+ }
+
+ result.put("width", image.getWidth());
+ result.put("height", image.getHeight());
+ result.put("legalMetadata",
+ legalMetadataRenderer.render(image.getLegalMetadata(),
+ language));
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/LegalMetadataRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/LegalMetadataRenderer.java
new file mode 100644
index 000000000..6e1025f47
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/LegalMetadataRenderer.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.LegalMetadata;
+import org.librecms.contentsection.Asset;
+
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = LegalMetadata.class)
+public class LegalMetadataRenderer extends AbstractAssetRenderer {
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ final LegalMetadata legalMetadata;
+ if (asset instanceof LegalMetadata) {
+ legalMetadata = (LegalMetadata) asset;
+ } else {
+ return;
+ }
+
+ result.put("rightsHolder", legalMetadata.getRightsHolder());
+ result.put("rights", legalMetadata.getRights().getValue(language));
+ result.put("publisher", legalMetadata.getPublisher());
+ result.put("creator", legalMetadata.getCreator());
+ result.put("contributors",
+ new ArrayList<>(legalMetadata.getContributors()));
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/RelatedLinkRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/RelatedLinkRenderer.java
new file mode 100644
index 000000000..c838fa720
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/RelatedLinkRenderer.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.Bookmark;
+import org.librecms.assets.RelatedLink;
+import org.librecms.contentsection.Asset;
+import org.librecms.contentsection.ContentItem;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = RelatedLink.class)
+public class RelatedLinkRenderer extends AbstractAssetRenderer {
+
+ @Inject
+ @AssetRenderer(renders = Bookmark.class)
+ private AbstractAssetRenderer bookmarkRenderer;
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ final RelatedLink relatedLink;
+ if (asset instanceof RelatedLink) {
+ relatedLink = (RelatedLink) asset;
+ } else {
+ return;
+ }
+
+ if (relatedLink.getTargetItem() != null) {
+ result.put("targetItem",
+ renderTargetItem(relatedLink.getTargetItem(),
+ language));
+ }
+
+ if (relatedLink.getBookmark() != null) {
+ result.put("bookmark",
+ bookmarkRenderer.render(relatedLink.getBookmark(),
+ language));
+ }
+ }
+
+ protected Map renderTargetItem(final ContentItem targetItem,
+ final Locale language) {
+
+ final Map result = new HashMap<>();
+
+ result.put("objectId", targetItem.getObjectId());
+ result.put("itemUuid", targetItem.getItemUuid());
+ result.put("displayName", targetItem.getDisplayName());
+ result.put("name", targetItem.getName().getValue(language));
+ result.put("title", targetItem.getTitle().getValue(language));
+ result.put("description",
+ targetItem.getDescription().getValue(language));
+
+ return result;
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/SideNoteRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/SideNoteRenderer.java
new file mode 100644
index 000000000..bd020e5bb
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/SideNoteRenderer.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.SideNote;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = SideNote.class)
+public class SideNoteRenderer extends AbstractAssetRenderer {
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale language,
+ final Map result) {
+
+ final SideNote siteNote;
+ if (asset instanceof SideNote) {
+ siteNote = (SideNote) asset;
+ } else {
+ return;
+ }
+
+ result.put("text", siteNote.getText().getValue(language));
+ }
+
+
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/assets/VideoAssetRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/VideoAssetRenderer.java
new file mode 100644
index 000000000..a826a4619
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/assets/VideoAssetRenderer.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package org.librecms.pagemodel.assets;
+
+import org.librecms.assets.LegalMetadata;
+import org.librecms.assets.VideoAsset;
+import org.librecms.contentsection.Asset;
+
+import java.util.Locale;
+import java.util.Map;
+
+import javax.enterprise.context.RequestScoped;
+import javax.inject.Inject;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+@RequestScoped
+@AssetRenderer(renders = VideoAsset.class)
+public class VideoAssetRenderer extends BinaryAssetRenderer {
+
+ @Inject
+ @AssetRenderer(renders = LegalMetadata.class)
+ private AbstractAssetRenderer legalMetadataRenderer;
+
+ @Override
+ protected void renderAsset(final Asset asset,
+ final Locale locale,
+ final Map result) {
+
+ super.renderAsset(asset, locale, result);
+
+ final VideoAsset videoAsset;
+ if (asset instanceof VideoAsset) {
+ videoAsset = (VideoAsset) asset;
+ } else {
+ return;
+ }
+
+ result.put("width", videoAsset.getWidth());
+ result.put("height", videoAsset.getHeight());
+ result.put("legalMetadata",
+ legalMetadataRenderer.render(videoAsset.getLegalMetadata(),
+ locale));
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java
index 44afd0ec5..21b1e2564 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java
@@ -18,12 +18,19 @@
*/
package org.librecms.pagemodel.contentitems;
+import org.librecms.pagemodel.assets.AbstractAssetRenderer;
+import org.librecms.contentsection.AttachmentList;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentType;
+import org.librecms.contentsection.ItemAttachment;
+import org.librecms.pagemodel.assets.AssetRenderers;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
/**
*
@@ -31,7 +38,10 @@ import java.util.Map;
*/
public abstract class AbstractContentItemRenderer {
- public Map render(final ContentItem item,
+ @Inject
+ private AssetRenderers assetRenderers;
+
+ public Map render(final ContentItem item,
final Locale language) {
final Map result = new HashMap<>();
@@ -49,15 +59,21 @@ public abstract class AbstractContentItemRenderer {
result.put("lastModified", item.getLastModified());
result.put("creationUserName", item.getCreationUserName());
result.put("lastModifyingUserName", item.getLastModifyingUserName());
+ result.put("attachments",
+ item
+ .getAttachments()
+ .stream()
+ .map(list -> renderAttachmentList(list, language))
+ .collect(Collectors.toList()));
renderItem(item, language, result);
-
+
return result;
}
protected abstract void renderItem(final ContentItem item,
- final Locale language,
- final Map result);
+ final Locale language,
+ final Map result);
protected Map renderContentType(
final ContentType contentType, final Locale language) {
@@ -72,4 +88,45 @@ public abstract class AbstractContentItemRenderer {
return result;
}
+ protected Map renderAttachmentList(
+ final AttachmentList attachmentList,
+ final Locale language) {
+
+ final Map result = new HashMap<>();
+
+ result.put("listId", attachmentList.getListId());
+ result.put("uuid", attachmentList.getUuid());
+ result.put("name", attachmentList.getName());
+ result.put("order", attachmentList.getOrder());
+ result.put("title", attachmentList.getTitle().getValue(language));
+ result.put("description",
+ attachmentList.getDescription().getValue(language));
+
+ result.put("attachments",
+ attachmentList
+ .getAttachments()
+ .stream()
+ .map(attachment -> renderAttachment(attachment, language))
+ .collect(Collectors.toList()));
+
+ return result;
+ }
+
+ protected Map renderAttachment(
+ final ItemAttachment> attachment,
+ final Locale language) {
+
+ final Map result = new HashMap<>();
+
+ result.put("attachmentId", attachment.getAttachmentId());
+ result.put("uuid", attachment.getUuid());
+ result.put("sortKey", attachment.getSortKey());
+
+ final AbstractAssetRenderer renderer = assetRenderers
+ .findRenderer(attachment.getAsset().getClass());
+ result.put("asset", renderer.render(attachment.getAsset(), language));
+
+ return result;
+ }
+
}
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderer.java
index f15fd4726..50591c054 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderer.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderer.java
@@ -35,7 +35,10 @@ import javax.inject.Qualifier;
*/
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.TYPE)
+@Target({ElementType.METHOD,
+ ElementType.FIELD,
+ ElementType.PARAMETER,
+ ElementType.TYPE})
public @interface ContentItemRenderer {
/**
diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java
index fee237a07..d39ed9705 100644
--- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java
+++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java
@@ -91,14 +91,7 @@ public class ContentItemRenderers {
return findRenderer(itemType);
}
} else {
- final AbstractContentItemRenderer renderer = instance
- .iterator()
- .next();
-
- @SuppressWarnings("unchecked")
- final AbstractContentItemRenderer result
- = renderer;
- return result;
+ return instance.iterator().next();
}
}
diff --git a/ccm-cms/src/main/java/org/librecms/ui/ContentItemEditor.java b/ccm-cms/src/main/java/org/librecms/ui/ContentItemEditor.java
index fb496aff7..c63f8cd65 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/ContentItemEditor.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/ContentItemEditor.java
@@ -38,14 +38,14 @@ import java.util.ResourceBundle;
*
* @author Jens Pelzetter
*/
-public class ContentItemEditor extends Window {
+public class ContentItemEditor extends Window {
private static final long serialVersionUID = 3341827053652019616L;
private List authoringsSteps;
public ContentItemEditor(final ContentSectionViewController controller,
- final ContentItem item) {
+ final T item) {
super();
@@ -101,7 +101,7 @@ public class ContentItemEditor extends Window {
private Component createAuthoringStep(
final ContentSectionViewController controller,
- final ContentItem item,
+ final T item,
final String componentClassName) {
try {
@@ -111,7 +111,7 @@ public class ContentItemEditor extends Window {
return stepClass
.getDeclaredConstructor(ContentSectionViewController.class,
- ContentItem.class)
+ item.getClass())
.newInstance(controller, item);
} catch (ClassNotFoundException
| NoSuchMethodException
diff --git a/ccm-cms/src/main/java/org/librecms/ui/ContentSectionViewController.java b/ccm-cms/src/main/java/org/librecms/ui/ContentSectionViewController.java
index db86a7d93..b99583dfc 100644
--- a/ccm-cms/src/main/java/org/librecms/ui/ContentSectionViewController.java
+++ b/ccm-cms/src/main/java/org/librecms/ui/ContentSectionViewController.java
@@ -21,6 +21,7 @@ package org.librecms.ui;
import com.vaadin.cdi.ViewScoped;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.security.PermissionChecker;
+import org.libreccm.ui.LocalizedStringWidgetController;
import org.librecms.contentsection.ContentSectionRepository;
import org.librecms.contentsection.FolderRepository;
import org.librecms.contenttypes.ContentTypesManager;
@@ -49,6 +50,9 @@ public class ContentSectionViewController {
@Inject
private GlobalizationHelper globalizationHelper;
+ @Inject
+ private LocalizedStringWidgetController localizedStringWidgetController;
+
@Inject
private PermissionChecker permissionChecker;
@@ -62,27 +66,31 @@ public class ContentSectionViewController {
return browseDocumentsDataProvider;
}
- protected FolderBrowserFolderTreeDataProvider getFolderTreeDataProvider() {
+ public FolderBrowserFolderTreeDataProvider getFolderTreeDataProvider() {
return folderTreeDataProvider;
}
- protected ContentTypesManager getContentTypesManager() {
+ public ContentTypesManager getContentTypesManager() {
return contentTypesManager;
}
- protected FolderRepository getFolderRepository() {
+ public FolderRepository getFolderRepository() {
return folderRepository;
}
- protected GlobalizationHelper getGlobalizationHelper() {
+ public GlobalizationHelper getGlobalizationHelper() {
return globalizationHelper;
}
- protected PermissionChecker getPermissionChecker() {
+ public LocalizedStringWidgetController getLocalizedStringWidgetController() {
+ return localizedStringWidgetController;
+ }
+
+ public PermissionChecker getPermissionChecker() {
return permissionChecker;
}
- protected ContentSectionRepository getSectionRepository() {
+ public ContentSectionRepository getSectionRepository() {
return sectionRepository;
}