From 8769dc6b68dff03c99abbeb0e49bb8f0c8905908 Mon Sep 17 00:00:00 2001 From: jensp Date: Thu, 25 Oct 2018 09:50:46 +0000 Subject: [PATCH] Several bugfixes for export git-svn-id: https://svn.libreccm.org/ccm/trunk@5714 8810af33-2d31-482b-a856-94f89814c4df --- .../src/com/arsdigita/core/Initializer.java | 1 + .../src/com/arsdigita/kernel/Initializer.java | 22 ++++++++ .../kernel/permissions/Permission.java | 2 +- .../categorization/CategoriesExporter.java | 55 ++++++++++++------- .../core/AbstractResourceTypesExporter.java | 3 +- .../libreccm/core/ResourceTypesExporter.java | 3 +- .../export/AbstractDomainObjectsExporter.java | 2 +- .../org/libreccm/export/ExportManager.java | 12 +++- .../security/PermissionsExporter.java | 4 +- .../security/RoleMembershipsExporter.java | 1 - .../workflow/AbstractTasksExporter.java | 5 +- .../workflow/AssignableTasksExporter.java | 15 +++-- 12 files changed, 85 insertions(+), 40 deletions(-) diff --git a/ccm-core/src/com/arsdigita/core/Initializer.java b/ccm-core/src/com/arsdigita/core/Initializer.java index e73a99703..add1573c5 100755 --- a/ccm-core/src/com/arsdigita/core/Initializer.java +++ b/ccm-core/src/com/arsdigita/core/Initializer.java @@ -23,6 +23,7 @@ import com.arsdigita.db.DbHelper; import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObjectInstantiator; import com.arsdigita.kernel.ACSObjectInstantiator; +import com.arsdigita.kernel.ResourceType; import com.arsdigita.mimetypes.MimeType; import com.arsdigita.persistence.DataObject; import com.arsdigita.persistence.Session; diff --git a/ccm-core/src/com/arsdigita/kernel/Initializer.java b/ccm-core/src/com/arsdigita/kernel/Initializer.java index 4c21154b7..fc43868e2 100755 --- a/ccm-core/src/com/arsdigita/kernel/Initializer.java +++ b/ccm-core/src/com/arsdigita/kernel/Initializer.java @@ -20,6 +20,8 @@ package com.arsdigita.kernel; import com.arsdigita.developersupport.DeveloperSupport; import com.arsdigita.domain.DomainObject; +import com.arsdigita.domain.DomainObjectInstantiator; +import com.arsdigita.kernel.permissions.Permission; import com.arsdigita.kernel.permissions.PermissionManager; import com.arsdigita.kernel.permissions.PrivilegeDescriptor; import com.arsdigita.persistence.DataObject; @@ -120,6 +122,26 @@ public class Initializer extends GenericInitializer { return new Role(dobj); } } ); + + evt.getFactory().registerInstantiator( + ResourceType.BASE_DATA_OBJECT_TYPE, + new DomainObjectInstantiator() { + + @Override + protected DomainObject doNewInstance(final DataObject dataObject) { + return new ResourceType(dataObject); + } + }); + + evt.getFactory().registerInstantiator( + Permission.BASE_DATA_OBJECT_TYPE, + new DomainObjectInstantiator() { + + @Override + protected DomainObject doNewInstance(final DataObject dataObject) { + return new Permission(dataObject); + } + }); /* Register URLFinders with the URLService */ // PackageInstance is the only kernel object type for which kernel diff --git a/ccm-core/src/com/arsdigita/kernel/permissions/Permission.java b/ccm-core/src/com/arsdigita/kernel/permissions/Permission.java index 3f35e5d3e..2ff7a2b28 100755 --- a/ccm-core/src/com/arsdigita/kernel/permissions/Permission.java +++ b/ccm-core/src/com/arsdigita/kernel/permissions/Permission.java @@ -99,7 +99,7 @@ public class Permission extends DomainObject { * * @see com.arsdigita.domain.DomainObject#DomainObject(DataObject) */ - protected Permission(DataObject data) { + public Permission(DataObject data) { super(data); } diff --git a/ccm-core/src/org/libreccm/categorization/CategoriesExporter.java b/ccm-core/src/org/libreccm/categorization/CategoriesExporter.java index 6bdb5b9a8..139a3c8ed 100644 --- a/ccm-core/src/org/libreccm/categorization/CategoriesExporter.java +++ b/ccm-core/src/org/libreccm/categorization/CategoriesExporter.java @@ -3,6 +3,8 @@ package org.libreccm.categorization; import com.arsdigita.categorization.Category; import com.arsdigita.categorization.CategoryLocalization; import com.arsdigita.categorization.CategoryLocalizationCollection; +import com.arsdigita.persistence.DataAssociation; +import com.arsdigita.persistence.DataAssociationCursor; import com.arsdigita.util.UncheckedWrapperException; import com.fasterxml.jackson.core.JsonEncoding; @@ -20,6 +22,8 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import static com.arsdigita.categorization.Category.*; + /** * * @author Jens Pelzetter @@ -42,14 +46,12 @@ public class CategoriesExporter extends AbstractDomainObjectsExporter } @Override - protected List exportDomainObject(final Category domainObject, + protected List exportDomainObject(final Category category, final Path targetDir) { - final String uuid = generateUuid(domainObject); + final String uuid = generateUuid(category); - final Path targetFilePath = targetDir - .resolve("org.libreccm.categorization.Categorization") - .resolve(String.format("%s.json", uuid)); + final Path targetFilePath = generateTargetFilePath(targetDir, uuid); final File targetFile = targetFilePath.toFile(); final JsonFactory jsonFactory = new JsonFactory(); @@ -63,9 +65,9 @@ public class CategoriesExporter extends AbstractDomainObjectsExporter jsonGenerator.writeStringField("uuid", uuid); jsonGenerator.writeStringField("uniqueId", uuid); - jsonGenerator.writeStringField("name", domainObject.getName()); + jsonGenerator.writeStringField("name", category.getName()); - final CategoryLocalizationCollection localizations = domainObject + final CategoryLocalizationCollection localizations = category .getCategoryLocalizationCollection(); final Map titles = new HashMap<>(); final Map descriptions = new HashMap<>(); @@ -96,21 +98,22 @@ public class CategoriesExporter extends AbstractDomainObjectsExporter jsonGenerator.writeEndObject(); jsonGenerator.writeBooleanField("enabled", - domainObject.isEnabled()); + category.isEnabled()); jsonGenerator.writeBooleanField("visible", - domainObject.isVisible()); + category.isVisible()); jsonGenerator.writeBooleanField("abstractCategory", - domainObject.isAbstract()); + category.isAbstract()); - jsonGenerator.writeStringField( - "parentCategory", - generateUuid(domainObject.getDefaultParentCategory())); - jsonGenerator.writeNumberField( - "categoryOrder", - domainObject - .getDefaultParentCategory() - .getSortKey(domainObject) - .longValue()); + if (hasParentCategory(category)) { + jsonGenerator.writeStringField( + "parentCategory", + generateUuid(category.getDefaultParentCategory())); + jsonGenerator.writeNumberField( + "categoryOrder", + category + .getDefaultParentCategory() + .getSortKey(category)); + } jsonGenerator.writeEndObject(); @@ -121,6 +124,18 @@ public class CategoriesExporter extends AbstractDomainObjectsExporter throw new UncheckedWrapperException(ex); } } - + + private boolean hasParentCategory(final Category category) { + + final DataAssociationCursor cursor = ((DataAssociation) category + .get(PARENTS)).cursor(); + + cursor.addEqualsFilter("link.isDefault", Boolean.TRUE); + + final boolean result = cursor.next(); + cursor.close(); + + return result; + } } diff --git a/ccm-core/src/org/libreccm/core/AbstractResourceTypesExporter.java b/ccm-core/src/org/libreccm/core/AbstractResourceTypesExporter.java index a6d9a6a6e..b5b844da9 100644 --- a/ccm-core/src/org/libreccm/core/AbstractResourceTypesExporter.java +++ b/ccm-core/src/org/libreccm/core/AbstractResourceTypesExporter.java @@ -37,8 +37,7 @@ public abstract class AbstractResourceTypesExporter final Path targetDir) { final String uuid = generateUuid(domainObject); - final Path targetFilePath = generateTargetFilePath( - targetDir, exportsType().getName(), uuid); + final Path targetFilePath = generateTargetFilePath(targetDir, uuid); final JsonFactory jsonFactory = new JsonFactory(); try (JsonGenerator jsonGenerator = jsonFactory diff --git a/ccm-core/src/org/libreccm/core/ResourceTypesExporter.java b/ccm-core/src/org/libreccm/core/ResourceTypesExporter.java index 93060b0ac..18691eaf9 100644 --- a/ccm-core/src/org/libreccm/core/ResourceTypesExporter.java +++ b/ccm-core/src/org/libreccm/core/ResourceTypesExporter.java @@ -4,8 +4,6 @@ import com.arsdigita.kernel.ResourceType; import com.fasterxml.jackson.core.JsonGenerator; -import java.util.Arrays; -import java.util.List; /** * @@ -29,6 +27,7 @@ public class ResourceTypesExporter return "org.libreccm.core.ResourceType"; } + @Override protected void exportResourceTypeProperties( final ResourceType resourceType, final JsonGenerator jsonGenerator) { diff --git a/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java b/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java index 8a2100c12..ddce6acd7 100644 --- a/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java +++ b/ccm-core/src/org/libreccm/export/AbstractDomainObjectsExporter.java @@ -143,7 +143,7 @@ public abstract class AbstractDomainObjectsExporter { final DomainObject domainObject = DomainObjectFactory .newInstance(dataObject); - if (!(domainObject.getClass().isAssignableFrom(exportsType()))) { + if (!(exportsType().isAssignableFrom(domainObject.getClass()))) { throw new ExportException(String.format( "DomainObject is not of type \"%s\" but of type \"%s\".", exportsType().getName(), diff --git a/ccm-core/src/org/libreccm/export/ExportManager.java b/ccm-core/src/org/libreccm/export/ExportManager.java index 830d84864..a44d8c90b 100644 --- a/ccm-core/src/org/libreccm/export/ExportManager.java +++ b/ccm-core/src/org/libreccm/export/ExportManager.java @@ -17,6 +17,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.ArrayList; import java.util.Set; import java.util.stream.Collectors; @@ -31,7 +32,7 @@ public final class ExportManager { private List> exporters; private ExportManager() { - // Nothing + exporters = new ArrayList<>(); } public static ExportManager getInstance() { @@ -44,7 +45,7 @@ public final class ExportManager { .stream() .map(exporter -> exporter.convertsToType()) .collect(Collectors.toSet()); - for(final String type : types) { + for (final String type : types) { try { final Path typeDirPath = targetDirPath.resolve(type); Files.createDirectories(typeDirPath); @@ -68,9 +69,16 @@ public final class ExportManager { final Map> exportedEntities = new HashMap<>(); for (final AbstractDomainObjectsExporter< ?> exporter : exporters) { + System.out.printf("Exporting entities of type \"%s\" and " + + "converting them to \"%s\"...%n", + exporter.exportsBaseDataObjectType(), + exporter.convertsToType()); final List uuids = exporter .exportDomainObjects(targetDirPath); exportedEntities.put(exporter.convertsToType(), uuids); + System.out.printf("Exported %d entities of type \"%s\".%n", + uuids.size(), + exporter.convertsToType()); } final Path manifestFilePath = targetDirPath.resolve("ccm-export.json"); diff --git a/ccm-core/src/org/libreccm/security/PermissionsExporter.java b/ccm-core/src/org/libreccm/security/PermissionsExporter.java index f1c150cb0..63261bec8 100644 --- a/ccm-core/src/org/libreccm/security/PermissionsExporter.java +++ b/ccm-core/src/org/libreccm/security/PermissionsExporter.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -108,7 +107,8 @@ public class PermissionsExporter extends AbstractDomainObjectsExporterJens Pelzetter * @param */ - - public abstract class AbstractTasksExporter extends AbstractDomainObjectsExporter { @@ -37,8 +35,7 @@ public abstract class AbstractTasksExporter final Path targetDir) { final String uuid = generateUuid(domainObject); - final Path targetFilePath = generateTargetFilePath( - targetDir, exportsType().getName(), uuid); + final Path targetFilePath = generateTargetFilePath(targetDir, uuid); final JsonFactory jsonFactory = new JsonFactory(); try (JsonGenerator jsonGenerator = jsonFactory diff --git a/ccm-core/src/org/libreccm/workflow/AssignableTasksExporter.java b/ccm-core/src/org/libreccm/workflow/AssignableTasksExporter.java index ca9dfca78..35d12ab48 100644 --- a/ccm-core/src/org/libreccm/workflow/AssignableTasksExporter.java +++ b/ccm-core/src/org/libreccm/workflow/AssignableTasksExporter.java @@ -43,8 +43,10 @@ public class AssignableTasksExporter extends AbstractTasksExporter { jsonGenerator.writeBooleanField("locked", task.isLocked()); final User lockingUser = task.getLockedUser(); - final String lockingUserUuid = generateUuid(lockingUser); - jsonGenerator.writeStringField("lockingUser", lockingUserUuid); + if (lockingUser != null) { + final String lockingUserUuid = generateUuid(lockingUser); + jsonGenerator.writeStringField("lockingUser", lockingUserUuid); + } final SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssZ", Locale.ROOT); @@ -56,9 +58,12 @@ public class AssignableTasksExporter extends AbstractTasksExporter { task.getDuration().getDuration()); final Party notificationSender = task.getNotificationSender(); - final String notificationSenderUuid = generateUuid(notificationSender); - jsonGenerator.writeStringField("notificationSender", - notificationSenderUuid); + if (notificationSender != null) { + final String notificationSenderUuid = generateUuid( + notificationSender); + jsonGenerator.writeStringField("notificationSender", + notificationSenderUuid); + } } }