diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/ExternalAudioAssetForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/ExternalAudioAssetForm.java
new file mode 100644
index 000000000..4d07dca79
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/ExternalAudioAssetForm.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2017 LibreCCM Foundation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+package com.arsdigita.cms.ui.assets.forms;
+
+import com.arsdigita.bebop.FormProcessException;
+import com.arsdigita.bebop.Label;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.event.FormSectionEvent;
+import com.arsdigita.cms.ui.assets.AssetPane;
+import com.arsdigita.cms.ui.assets.AssetSearchWidget;
+import com.arsdigita.globalization.GlobalizedMessage;
+import org.libreccm.cdi.utils.CdiUtil;
+import org.librecms.CmsConstants;
+import org.librecms.assets.Bookmark;
+import org.librecms.assets.ExternalAudioAsset;
+import org.librecms.assets.LegalMetadata;
+import org.librecms.contentsection.Asset;
+import org.librecms.contentsection.AssetRepository;
+
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ * @author Yannick Bülter
+ */
+public class ExternalAudioAssetForm extends BookmarkForm {
+
+ private AssetSearchWidget assetSearchWidget;
+
+ public ExternalAudioAssetForm(final AssetPane assetPane) {
+ super(assetPane);
+ }
+
+ @Override
+ public void addWidgets() {
+ super.addWidgets();
+
+ add(new Label(new GlobalizedMessage(
+ "cms.ui.assets.external_audio_asset.legal_metadata.label",
+ CmsConstants.CMS_BUNDLE)));
+ assetSearchWidget = new AssetSearchWidget("legal-metadata",
+ LegalMetadata.class);
+ add(assetSearchWidget);
+ }
+
+ @Override
+ protected void initForm(final PageState state,
+ final Optional selectedAsset) {
+ super.initForm(state, selectedAsset);
+
+ if (selectedAsset.isPresent()) {
+ final ExternalAudioAsset externalAudioAsset
+ = (ExternalAudioAsset) selectedAsset
+ .get();
+
+ final LegalMetadata legalMetadata = externalAudioAsset
+ .getLegalMetadata();
+ if (legalMetadata != null) {
+ assetSearchWidget.setValue(state, legalMetadata.getObjectId());
+ }
+ }
+ }
+
+ @Override
+ protected Asset createAsset(final FormSectionEvent event)
+ throws FormProcessException {
+
+ Objects.requireNonNull(event);
+
+ final PageState state = event.getPageState();
+
+ final ExternalAudioAsset ExternalAudioAsset = new ExternalAudioAsset();
+
+ updateData((Bookmark) ExternalAudioAsset, state);
+ updateData(ExternalAudioAsset, state);
+
+ return ExternalAudioAsset;
+ }
+
+ protected void updateData(final ExternalAudioAsset ExternalAudioAsset,
+ final PageState state) {
+
+ final Long legalMetadataId = (Long) assetSearchWidget.getValue(state);
+ if (legalMetadataId != null) {
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final AssetRepository assetRepo = cdiUtil.findBean(
+ AssetRepository.class);
+ final LegalMetadata legalMetadata = (LegalMetadata) assetRepo
+ .findById(legalMetadataId)
+ .orElseThrow(() -> new IllegalArgumentException(String.format(
+ "No LegalMetadata asset with ID %d in the database.",
+ legalMetadataId)));
+
+ ExternalAudioAsset.setLegalMetadata(legalMetadata);
+ }
+ }
+
+ @Override
+ protected void updateAsset(final Asset asset,
+ final FormSectionEvent event) {
+
+ Objects.requireNonNull(asset);
+ Objects.requireNonNull(event);
+
+ final PageState state = event.getPageState();
+
+ if (!(asset instanceof ExternalAudioAsset)) {
+ throw new IllegalArgumentException(String.format(
+ "Provided asset is not an instance of class (or sub class of) "
+ + "'%s' but is an instance of class '%s'",
+ ExternalAudioAsset.class.getName(),
+ asset.getClass().getName()));
+ }
+
+ final ExternalAudioAsset ExternalAudioAsset = (ExternalAudioAsset) asset;
+
+ updateData((Bookmark) ExternalAudioAsset, state);
+ updateData(ExternalAudioAsset, state);
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/Cms.java b/ccm-cms/src/main/java/org/librecms/Cms.java
index e83e3de4d..aff604c98 100644
--- a/ccm-cms/src/main/java/org/librecms/Cms.java
+++ b/ccm-cms/src/main/java/org/librecms/Cms.java
@@ -19,10 +19,7 @@ import org.libreccm.modules.ShutdownEvent;
import org.libreccm.modules.UnInstallEvent;
import org.libreccm.web.ApplicationType;
import org.libreccm.web.CcmApplication;
-import org.librecms.assets.AssetTypes;
-import org.librecms.assets.Bookmark;
-import org.librecms.assets.ExternalVideoAsset;
-import org.librecms.assets.LegalMetadata;
+import org.librecms.assets.*;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionCreator;
import org.librecms.contentsection.ContentSectionSetup;
@@ -36,9 +33,6 @@ import org.librecms.contenttypes.News;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
-import org.librecms.assets.FileAsset;
-
-import org.librecms.assets.SideNote;
@Module(//packageName = "org.librecms.cms",
requiredModules = {
@@ -70,6 +64,7 @@ import org.librecms.assets.SideNote;
News.class})
@AssetTypes({Bookmark.class,
ExternalVideoAsset.class,
+ ExternalAudioAsset.class,
FileAsset.class,
LegalMetadata.class,
SideNote.class})
diff --git a/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java b/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java
index ed64f5676..a9e0ff5d0 100644
--- a/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java
+++ b/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java
@@ -18,6 +18,7 @@
*/
package org.librecms.assets;
+import com.arsdigita.cms.ui.assets.forms.ExternalAudioAssetForm;
import org.hibernate.envers.Audited;
import java.io.Serializable;
@@ -29,6 +30,7 @@ import javax.persistence.OneToOne;
import javax.persistence.Table;
import static org.librecms.CmsConstants.*;
+import static org.librecms.assets.AssetConstants.*;
/**
* An asset for an external audio file (an audio file which is
@@ -36,10 +38,16 @@ import static org.librecms.CmsConstants.*;
* stored in the database of LibreCCM.
*
* @author Jens Pelzetter
+ * @author Yannick Bülter
*/
@Entity
@Table(name = "EXTERNAL_AUDIO_ASSETS", schema = DB_SCHEMA)
@Audited
+@AssetType(assetForm = ExternalAudioAssetForm.class,
+ labelKey = "external_audio_asset.label",
+ labelBundle = ASSETS_BUNDLE,
+ descriptionKey = "external_audio_asset.description",
+ descriptionBundle = ASSETS_BUNDLE)
public class ExternalAudioAsset extends Bookmark implements Serializable {
private static final long serialVersionUID = 1190735204910197490L;