diff --git a/ccm-cms/package-lock.json b/ccm-cms/package-lock.json
index 48464e36d..80758876c 100644
--- a/ccm-cms/package-lock.json
+++ b/ccm-cms/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@librecms/ccm-cms",
- "version": "7.0.0-SNAPSHOT.2022-11-07T181703",
+ "version": "7.0.0-SNAPSHOT.2022-11-26T105237",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@librecms/ccm-cms",
- "version": "7.0.0-SNAPSHOT.2022-11-07T181703",
+ "version": "7.0.0-SNAPSHOT.2022-11-26T105237",
"license": "LGPL-3.0-or-later",
"dependencies": {
"@tiptap/core": "^2.0.0-beta.127",
diff --git a/ccm-cms/package.json b/ccm-cms/package.json
index ff68de440..1468ec041 100644
--- a/ccm-cms/package.json
+++ b/ccm-cms/package.json
@@ -1,6 +1,6 @@
{
"name": "@librecms/ccm-cms",
- "version": "7.0.0-SNAPSHOT.2022-11-07T181703",
+ "version": "7.0.0-SNAPSHOT.2022-11-26T105237",
"description": "JavaScript stuff for ccm-cms",
"main": "target/generated-resources/assets/@content-sections/cms-admin.js",
"types": "target/generated-resources/assets/@content-sections/cms-admin.d.ts",
diff --git a/ccm-cms/src/main/java/org/librecms/assets/AbstractContactableEntityImExporter.java b/ccm-cms/src/main/java/org/librecms/assets/AbstractContactableEntityImExporter.java
index b3c5877d1..cf19cbb12 100644
--- a/ccm-cms/src/main/java/org/librecms/assets/AbstractContactableEntityImExporter.java
+++ b/ccm-cms/src/main/java/org/librecms/assets/AbstractContactableEntityImExporter.java
@@ -23,6 +23,7 @@ import java.util.Set;
/**
*
* @author Jens Pelzetter
+ * @param Type of {@link ContactableEntity}.
*/
public abstract class AbstractContactableEntityImExporter
extends AbstractAssetImExporter {
@@ -31,7 +32,7 @@ public abstract class AbstractContactableEntityImExporter
@Inject
private ContentItemRepository itemRepository;
-
+
@Inject
@Any
@Processes(Categorization.class)
private CategorizationImExporter categorizationImExporter;
-
+
@Inject
@Any
@Processes(Permission.class)
private PermissionImExporter permissionImExporter;
-
+
+ @Inject
+ @Any
+ @Processes(RelatedLink.class)
+ private RelatedLinkImExporter relatedLinkImExporter;
+
@PostConstruct
@Override
- protected void init() {
+ protected final void init() {
addRequiredEntities(
Set.of(
Category.class,
@@ -67,9 +74,15 @@ public abstract class AbstractContentItemImExporter
);
categorizationImExporter.addRequiredEntities(Set.of(getEntityClass()));
permissionImExporter.addRequiredEntities(Set.of(getEntityClass()));
+
+ // Related link import requires all content items to be imported to
+ // get the target item.
+ relatedLinkImExporter.addRequiredEntities(Set.of(getEntityClass()));
+
+ initContentItemImExporter();
}
-
+ protected abstract void initContentItemImExporter();
@Override
@Transactional(Transactional.TxType.REQUIRED)
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java
index 3f74cd096..7bc051813 100644
--- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java
@@ -18,8 +18,10 @@
*/
package org.librecms.contentsection;
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIdentityReference;
import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import static org.librecms.CmsConstants.*;
@@ -575,6 +577,11 @@ import javax.xml.bind.annotation.XmlElementWrapper;
+ " )"
)
})
+@JsonIdentityInfo(
+ generator = ObjectIdGenerators.PropertyGenerator.class,
+ resolver = ContentItemIdResolver.class,
+ property = "uuid"
+)
public class ContentItem extends CcmObject implements Serializable, Exportable {
private static final long serialVersionUID = 5897287630227129653L;
diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemIdResolver.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemIdResolver.java
new file mode 100644
index 000000000..9c07b92b1
--- /dev/null
+++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemIdResolver.java
@@ -0,0 +1,72 @@
+/*
+ * 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.contentsection;
+
+import com.fasterxml.jackson.annotation.ObjectIdGenerator;
+import com.fasterxml.jackson.annotation.ObjectIdResolver;
+import org.libreccm.cdi.utils.CdiUtil;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ *
+ * @author Jens Pelzetter
+ */
+public class ContentItemIdResolver implements Serializable, ObjectIdResolver {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void bindItem(
+ final ObjectIdGenerator.IdKey id,
+ final Object object
+ ) {
+ // According to the Jackson JavaDoc, this method can be used to keep
+ // track of objects directly in a resolver implementation. We don't need
+ // this here therefore this method is empty.
+ }
+
+ @Override
+ public Object resolveId(final ObjectIdGenerator.IdKey id) {
+ return CdiUtil
+ .createCdiUtil()
+ .findBean(ContentItemRepository.class)
+ .findByUuid(id.key.toString())
+ .orElseThrow(
+ () -> new IllegalArgumentException(
+ String.format(
+ "No ContentItem with UUID %s found in the database.",
+ id.key.toString()
+ )
+ )
+ );
+ }
+
+ @Override
+ public ObjectIdResolver newForDeserialization(final Object context) {
+ return new ContentItemIdResolver();
+ }
+
+ @Override
+ public boolean canUseFor(final ObjectIdResolver resolverType) {
+ return resolverType instanceof ContentItemIdResolver;
+ }
+
+}
diff --git a/ccm-cms/src/main/java/org/librecms/contenttypes/ArticleImExporter.java b/ccm-cms/src/main/java/org/librecms/contenttypes/ArticleImExporter.java
index a3721f79c..e15e3d6b5 100644
--- a/ccm-cms/src/main/java/org/librecms/contenttypes/ArticleImExporter.java
+++ b/ccm-cms/src/main/java/org/librecms/contenttypes/ArticleImExporter.java
@@ -21,6 +21,7 @@ package org.librecms.contenttypes;
import org.libreccm.imexport.Processes;
import org.librecms.contentsection.AbstractContentItemImExporter;
+import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
/**
@@ -31,6 +32,12 @@ import javax.enterprise.context.RequestScoped;
@Processes(Article.class)
public class ArticleImExporter extends AbstractContentItemImExporter {
+ @Override
+ @PostConstruct
+ protected void initContentItemImExporter() {
+ // Nothing
+ }
+
@Override
public Class getEntityClass() {
return Article.class;
diff --git a/ccm-cms/src/main/java/org/librecms/contenttypes/EventImExporter.java b/ccm-cms/src/main/java/org/librecms/contenttypes/EventImExporter.java
index cf79b0069..8f0f9dc62 100644
--- a/ccm-cms/src/main/java/org/librecms/contenttypes/EventImExporter.java
+++ b/ccm-cms/src/main/java/org/librecms/contenttypes/EventImExporter.java
@@ -21,6 +21,7 @@ package org.librecms.contenttypes;
import org.libreccm.imexport.Processes;
import org.librecms.contentsection.AbstractContentItemImExporter;
+import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
/**
@@ -31,6 +32,12 @@ import javax.enterprise.context.RequestScoped;
@Processes(Event.class)
public class EventImExporter extends AbstractContentItemImExporter {
+ @Override
+ @PostConstruct
+ protected void initContentItemImExporter() {
+ // Nothing
+ }
+
@Override
public Class getEntityClass() {
return Event.class;
diff --git a/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticleImExporter.java b/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticleImExporter.java
index fb8814b1a..3806b224a 100644
--- a/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticleImExporter.java
+++ b/ccm-cms/src/main/java/org/librecms/contenttypes/MultiPartArticleImExporter.java
@@ -22,6 +22,7 @@ import org.libreccm.imexport.Processes;
import org.librecms.contentsection.AbstractContentItemImExporter;
import org.librecms.contentsection.ContentItemRepository;
+import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
@@ -32,12 +33,18 @@ import javax.transaction.Transactional;
*/
@RequestScoped
@Processes(MultiPartArticle.class)
-public class MultiPartArticleImExporter
+public class MultiPartArticleImExporter
extends AbstractContentItemImExporter {
-
+
+ @Override
+ @PostConstruct
+ protected void initContentItemImExporter() {
+ // Nothing
+ }
+
@Inject
private ContentItemRepository itemRepository;
-
+
@Inject
private MultiPartArticleSectionRepository sectionRepo;
@@ -45,8 +52,8 @@ public class MultiPartArticleImExporter
public Class getEntityClass() {
return MultiPartArticle.class;
}
-
- @Override
+
+ @Override
@Transactional(Transactional.TxType.REQUIRED)
public void saveImportedEntity(final MultiPartArticle entity) {
for (final MultiPartArticleSection section : entity.getSections()) {
@@ -54,5 +61,5 @@ public class MultiPartArticleImExporter
}
itemRepository.save(entity);
}
-
+
}
diff --git a/ccm-cms/src/main/java/org/librecms/contenttypes/NewsImExporter.java b/ccm-cms/src/main/java/org/librecms/contenttypes/NewsImExporter.java
index 6cd83da5f..d171a711c 100644
--- a/ccm-cms/src/main/java/org/librecms/contenttypes/NewsImExporter.java
+++ b/ccm-cms/src/main/java/org/librecms/contenttypes/NewsImExporter.java
@@ -21,6 +21,7 @@ package org.librecms.contenttypes;
import org.libreccm.imexport.Processes;
import org.librecms.contentsection.AbstractContentItemImExporter;
+import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
/**
@@ -31,6 +32,12 @@ import javax.enterprise.context.RequestScoped;
@Processes(News.class)
public class NewsImExporter extends AbstractContentItemImExporter {
+ @Override
+ @PostConstruct
+ protected void initContentItemImExporter() {
+ // Nothing
+ }
+
@Override
public Class getEntityClass() {
return News.class;