You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2022/08/23 11:01:44 UTC

[isis] branch master updated: ISIS-3162: fixes regression in layout export

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new a0151904b7 ISIS-3162: fixes regression in layout export
a0151904b7 is described below

commit a0151904b76ab77916c2a46261a66cf3577efdff
Author: andi-huber <ah...@apache.org>
AuthorDate: Tue Aug 23 13:01:37 2022 +0200

    ISIS-3162: fixes regression in layout export
---
 .../isis/applib/services/grid/GridService.java     |  1 +
 .../org/apache/isis/commons/functional/Try.java    | 24 +++++++++
 .../services/layout/LayoutServiceDefault.java      | 59 ++++++++++++++--------
 3 files changed, 63 insertions(+), 21 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridService.java b/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridService.java
index 0ac8a1ba1d..5a24134100 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridService.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/grid/GridService.java
@@ -165,6 +165,7 @@ public interface GridService {
         if(grid == null) {
             grid = defaultGridFor(domainClass);
         }
+        grid = normalize(grid); // required so the grid's tns and schema-locations get populated
         if (style == LayoutExportStyle.COMPLETE) {
             return complete(grid);
         }
diff --git a/commons/src/main/java/org/apache/isis/commons/functional/Try.java b/commons/src/main/java/org/apache/isis/commons/functional/Try.java
index 540f6beeea..64a21e4f97 100644
--- a/commons/src/main/java/org/apache/isis/commons/functional/Try.java
+++ b/commons/src/main/java/org/apache/isis/commons/functional/Try.java
@@ -137,6 +137,16 @@ public interface Try<T> {
             final @NonNull Function<Throwable, L> failureMapper,
             final @NonNull Function<Optional<T>, R> successMapper);
 
+    // -- TERMINATE
+
+    /**
+     * Either consumes the success or the failure.
+     * @apiNote Order of arguments conforms to {@link #map(Function, Function)}
+     */
+    void accept(
+            final @NonNull Consumer<Throwable> failureConsumer,
+            final @NonNull Consumer<Optional<T>> successConsumer);
+
     // -- FOLDING
 
     /**
@@ -225,6 +235,13 @@ public interface Try<T> {
             return Try.run(runnable);
         }
 
+        @Override
+        public void accept(
+                final @NonNull Consumer<Throwable> failureConsumer,
+                final @NonNull Consumer<Optional<T>> successConsumer) {
+            successConsumer.accept(getValue());
+        }
+
         @Override
         public <R> R fold(
                 final @NonNull Function<Throwable, R> failureMapper,
@@ -306,6 +323,13 @@ public interface Try<T> {
             return new Failure<>(throwable);
         }
 
+        @Override
+        public void accept(
+                final @NonNull Consumer<Throwable> failureConsumer,
+                final @NonNull Consumer<Optional<T>> successConsumer) {
+            failureConsumer.accept(throwable);
+        }
+
         @Override
         public <R> R fold(
                 final @NonNull Function<Throwable, R> failureMapper,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
index 3e3605ac3f..0c56970199 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/layout/LayoutServiceDefault.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.services.layout;
 
 import java.io.File;
+import java.util.Objects;
 
 import javax.annotation.Priority;
 import javax.inject.Inject;
@@ -26,6 +27,7 @@ import javax.inject.Named;
 import javax.xml.bind.Marshaller;
 
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.lang.Nullable;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
@@ -37,6 +39,7 @@ import org.apache.isis.applib.services.layout.LayoutExportStyle;
 import org.apache.isis.applib.services.layout.LayoutService;
 import org.apache.isis.applib.services.menu.MenuBarsService;
 import org.apache.isis.applib.util.ZipWriter;
+import org.apache.isis.commons.functional.Try;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.IsisModuleCoreMetamodel;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -44,12 +47,14 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 import lombok.RequiredArgsConstructor;
 import lombok.val;
+import lombok.extern.log4j.Log4j2;
 
 @Service
 @Named(IsisModuleCoreMetamodel.NAMESPACE + ".LayoutServiceDefault")
 @Priority(PriorityPrecedence.MIDPOINT)
 @Qualifier("Default")
 @RequiredArgsConstructor(onConstructor_ = {@Inject})
+@Log4j2
 public class LayoutServiceDefault implements LayoutService {
 
     private final SpecificationLoader specificationLoader;
@@ -60,11 +65,7 @@ public class LayoutServiceDefault implements LayoutService {
     @Override
     public String toXml(final Class<?> domainClass, final LayoutExportStyle style) {
         final Grid grid = gridService.toGridForExport(domainClass, style);
-        return jaxbService.toXml(grid,
-                _Maps.unmodifiable(
-                        Marshaller.JAXB_SCHEMA_LOCATION,
-                        grid.getTnsAndSchemaLocation()
-                        ));
+        return gridToXml(grid);
     }
 
     @Override
@@ -78,28 +79,23 @@ public class LayoutServiceDefault implements LayoutService {
 
         for (val objectSpec : domainObjectSpecs) {
             val domainClass = objectSpec.getCorrespondingClass();
-            val grid = gridService.toGridForExport(domainClass, style);
-            if(grid != null) {
-                zipWriter.nextEntry(zipEntryNameFor(objectSpec), writer->{
-
-                    val xmlString = jaxbService.toXml(grid,
-                            _Maps.unmodifiable(
-                                    Marshaller.JAXB_SCHEMA_LOCATION,
-                                    grid.getTnsAndSchemaLocation()
-                                    ));
-                    writer.writeCharactersUtf8(xmlString);
+
+            tryGridToXml(domainClass, style)
+            .accept(failure->{
+                log.warn("failed to generate layout XML for {}", domainClass);//, failure);
+            },
+            xmlIfAny->{
+                xmlIfAny.ifPresent(xmlString->{
+                    zipWriter.nextEntry(zipEntryNameFor(objectSpec), writer->
+                        writer.writeCharactersUtf8(xmlString)
+                    );
                 });
-            }
+            });
         }
 
         return zipWriter.toBytes();
     }
 
-    private static String zipEntryNameFor(final ObjectSpecification objectSpec) {
-        final String fqn = objectSpec.getFullIdentifier();
-        return fqn.replace(".", File.separator)+".layout.xml";
-    }
-
     @Override
     public String toMenuBarsXml(final MenuBarsService.Type type) {
         final MenuBars menuBars = menuBarsService.menuBars(type);
@@ -110,6 +106,27 @@ public class LayoutServiceDefault implements LayoutService {
                 ));
     }
 
+    // -- HELPER
+
+    private Try<String> tryGridToXml(final Class<?> domainClass, final LayoutExportStyle style) {
+        final Grid grid = gridService.toGridForExport(domainClass, style);
+        return Try.call(()->gridToXml(grid));
+    }
+
+    private String gridToXml(final @Nullable Grid grid) {
+        if(grid==null) {
+            return null;
+        }
+        return jaxbService.toXml(grid,
+                _Maps.unmodifiable(
+                        Marshaller.JAXB_SCHEMA_LOCATION,
+                        Objects.requireNonNull(grid.getTnsAndSchemaLocation())
+                        ));
+    }
 
+    private static String zipEntryNameFor(final ObjectSpecification objectSpec) {
+        final String fqn = objectSpec.getFullIdentifier();
+        return fqn.replace(".", File.separator)+".layout.xml";
+    }
 
 }