You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/12/03 14:43:57 UTC

[isis] branch master updated (a3cbd17 -> 7bf1199)

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

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


    from a3cbd17  ISIS-2199: reinstates code that had been commented out.
     new 2597fef  ISIS-2202: exclude org.springframework from the metamodel:
     new b9d6072  ISIS-2200: improves ordering of swagger paths
     new 01198e1  ISIS-2203 - fixes NPE by passing the ObjectSpec down (rather than attempt to obtain from a possibly null ObjectAdapter)
     new 7bf1199  ISIS-2204: fixes algorithm, was allowing create(...) returning an entity as being visible while list(): List<Entity> was not.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../classsubstitutor/ClassSubstitutorDefault.java  |   7 ++
 .../services/swagger/SwaggerServiceDefault.java    |   7 +-
 .../services/swagger/internal/ClassExcluder.java   |  46 +-------
 ...assExcluder.java => ClassExcluderAbstract.java} |  22 +++-
 .../swagger/internal/ClassExcluderDefault.java}    |  16 ++-
 .../services/swagger/internal/Generation.java      |  67 ++++++------
 .../swagger/internal/SwaggerSpecGenerator.java     |  24 ++++-
 .../services/swagger/internal/Tagger.java          |  64 +----------
 .../internal/{Tagger.java => TaggerDefault.java}   |  36 +++----
 .../metamodel/services/swagger/internal/Util.java  |  42 +++++---
 .../swagger/internal/ValuePropertyFactory.java     | 119 +--------------------
 ...ctory.java => ValuePropertyFactoryDefault.java} |   7 +-
 .../swagger/internal/ValuePropertyPlugin.java      |   6 +-
 .../services/swagger/internal/GenerationTest.java  |   2 +-
 .../services/swagger/internal/TaggerTest.java      |  16 +--
 .../rendering/domainobjects/JsonValueEncoder.java  |  12 +--
 .../domainobjects/ObjectPropertyReprRenderer.java  |  20 ++--
 .../JsonValueEncoderTest_appendValueAndFormat.java |  50 ++++-----
 .../fixtures/fixturescripts/FixtureResult.java     |   2 +-
 19 files changed, 206 insertions(+), 359 deletions(-)
 copy core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/{ClassExcluder.java => ClassExcluderAbstract.java} (68%)
 copy core/{viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domaintypes/ParentSpecAndAction.java => metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderDefault.java} (71%)
 copy core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/{Tagger.java => TaggerDefault.java} (70%)
 copy core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/{ValuePropertyFactory.java => ValuePropertyFactoryDefault.java} (96%)


[isis] 04/04: ISIS-2204: fixes algorithm, was allowing create(...) returning an entity as being visible while list(): List was not.

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 7bf1199d587a2a10049c06c9676e70ba9aded890
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Dec 3 14:43:32 2019 +0000

    ISIS-2204: fixes algorithm, was allowing create(...) returning an entity as being visible while list(): List<Entity> was not.
---
 .../metamodel/services/swagger/internal/Util.java  | 42 +++++++++++++---------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Util.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Util.java
index 4f1c460..1f77574 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Util.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Util.java
@@ -42,25 +42,29 @@ public final class Util {
     private Util(){}
 
     static boolean isVisibleForPublic(final ObjectAction objectAction) {
+
         final ObjectSpecification specification = objectAction.getReturnType();
-        boolean visible = isVisibleForPublic(specification);
-        if(!visible) {
-            final TypeOfFacet typeOfFacet = objectAction.getFacet(TypeOfFacet.class);
-            if(typeOfFacet != null) {
-                ObjectSpecification elementSpec = typeOfFacet.valueSpec();
-                if(!isVisibleForPublic(elementSpec)) {
-                    return false;
-                }
-            }
-        }
-        List<ObjectSpecification> parameterTypes = objectAction.getParameterTypes();
-        for (ObjectSpecification parameterType : parameterTypes) {
-            boolean paramVisible = isVisibleForPublic(parameterType);
-            if(!paramVisible) {
-                return false;
-            }
+        return ( isVisibleForPublic(specification) || isTypeOfVisibleForPublic(objectAction) )
+                && isVisibleForPublic(objectAction.getParameterTypes());
+    }
+
+    private static boolean isTypeOfVisibleForPublic(ObjectAction objectAction) {
+        final TypeOfFacet typeOfFacet = objectAction.getFacet(TypeOfFacet.class);
+        if (typeOfFacet == null) {
+            return false;
         }
-        return true;
+        return isVisibleForPublic(typeOfFacet.valueSpec());
+    }
+
+    private static boolean isVisibleForPublic(List<ObjectSpecification> parameterTypes) {
+
+        final boolean atLeastOneParamNotVisible =
+                parameterTypes.stream()
+                    .map(Util::isNotVisibleForPublic)
+                    .findAny()
+                    .isPresent();
+
+        return !atLeastOneParamNotVisible;
     }
 
     static boolean isVisibleForPublic(final ObjectAssociation objectAssociation) {
@@ -68,6 +72,10 @@ public final class Util {
         return isVisibleForPublic(specification);
     }
 
+    static boolean isNotVisibleForPublic(final ObjectSpecification specification) {
+        return ! isVisibleForPublic(specification);
+    }
+
     static boolean isVisibleForPublic(final ObjectSpecification specification) {
         if (specification == null) {
             return true;


[isis] 02/04: ISIS-2200: improves ordering of swagger paths

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b9d6072ca38bb610d6d9bb36fd9ea716858bad43
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Dec 3 14:37:10 2019 +0000

    ISIS-2200: improves ordering of swagger paths
    
    and refactors the Tagger, ClassExcluder and ValuePropertyFactory under Spring control so that they can be substituted if necessary.
---
 .../services/swagger/SwaggerServiceDefault.java    |   7 +-
 .../services/swagger/internal/ClassExcluder.java   |  46 +-------
 ...assExcluder.java => ClassExcluderAbstract.java} |  22 +++-
 ...lassExcluder.java => ClassExcluderDefault.java} |  27 ++---
 .../services/swagger/internal/Generation.java      |  67 ++++++------
 .../swagger/internal/SwaggerSpecGenerator.java     |  24 ++++-
 .../services/swagger/internal/Tagger.java          |  64 +----------
 .../internal/{Tagger.java => TaggerDefault.java}   |  36 +++----
 .../swagger/internal/ValuePropertyFactory.java     | 119 +--------------------
 ...ctory.java => ValuePropertyFactoryDefault.java} |   7 +-
 .../swagger/internal/ValuePropertyPlugin.java      |   6 +-
 .../services/swagger/internal/GenerationTest.java  |   2 +-
 .../services/swagger/internal/TaggerTest.java      |  16 +--
 .../fixtures/fixturescripts/FixtureResult.java     |   2 +-
 14 files changed, 129 insertions(+), 316 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
index 0efcf68..af5bda9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/SwaggerServiceDefault.java
@@ -19,7 +19,6 @@
 package org.apache.isis.metamodel.services.swagger;
 
 import javax.inject.Inject;
-import javax.inject.Singleton;
 
 import org.springframework.stereotype.Service;
 
@@ -37,13 +36,17 @@ import static org.apache.isis.commons.internal.resources._Resources.prependConte
 public class SwaggerServiceDefault implements SwaggerService {
 
     @Inject SpecificationLoader specificationLoader;
+    private final SwaggerSpecGenerator swaggerSpecGenerator;
+
+    public SwaggerServiceDefault(SwaggerSpecGenerator swaggerSpecGenerator) {
+        this.swaggerSpecGenerator = swaggerSpecGenerator;
+    }
 
     @Override
     public String generateSwaggerSpec(
             final Visibility visibility,
             final Format format) {
 
-        final SwaggerSpecGenerator swaggerSpecGenerator = new SwaggerSpecGenerator(specificationLoader);
         final String swaggerSpec = swaggerSpecGenerator.generate(basePath.get(), visibility, format);
         return swaggerSpec;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
index c0e2ccd..f7a6c2c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
@@ -1,49 +1,9 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
 package org.apache.isis.metamodel.services.swagger.internal;
 
-import java.util.List;
-
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 
-public class ClassExcluder {
-
-    protected boolean exclude(final ObjectSpecification objectSpec) {
-        if(objectSpec == null) {
-            return false;
-        }
-        return objectSpec.isExcludedFromMetamodel();
-    }
-
-    public boolean exclude(final ObjectAction objectAction) {
-        final ObjectSpecification returnType = objectAction.getReturnType();
-        if(exclude(returnType)) {
-            return true;
-        }
-
-        final List<ObjectSpecification> parameterTypes = objectAction.getParameterTypes();
-        for (ObjectSpecification parameterType : parameterTypes) {
-            if(exclude(parameterType)) {
-                return true;
-            }
-        }
-        return false;
-    }
+public interface ClassExcluder {
+    boolean exclude(final ObjectSpecification objectSpec);
+    boolean exclude(ObjectAction objectAction);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderAbstract.java
similarity index 68%
copy from core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
copy to core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderAbstract.java
index c0e2ccd..5f8920e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderAbstract.java
@@ -19,19 +19,35 @@
 package org.apache.isis.metamodel.services.swagger.internal;
 
 import java.util.List;
+import java.util.Set;
 
+import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
+import org.springframework.stereotype.Component;
 
-public class ClassExcluder {
+public abstract class ClassExcluderAbstract implements ClassExcluder {
 
-    protected boolean exclude(final ObjectSpecification objectSpec) {
+    private final Set<String> packageNamesToIgnore = _Sets.newHashSet();
+
+    protected void ignorePackage(final String packageName) {
+        packageNamesToIgnore.add(packageName);
+    }
+
+    @Override
+    public boolean exclude(final ObjectSpecification objectSpec) {
         if(objectSpec == null) {
             return false;
         }
-        return objectSpec.isExcludedFromMetamodel();
+        if (objectSpec.isExcludedFromMetamodel()) {
+            return true;
+        }
+
+        return packageNamesToIgnore.stream()
+                .anyMatch(packageName ->  objectSpec.getCorrespondingClass().getName().startsWith(packageName));
     }
 
+    @Override
     public boolean exclude(final ObjectAction objectAction) {
         final ObjectSpecification returnType = objectAction.getReturnType();
         if(exclude(returnType)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderDefault.java
similarity index 59%
copy from core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
copy to core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderDefault.java
index c0e2ccd..0ee84fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ClassExcluderDefault.java
@@ -19,31 +19,18 @@
 package org.apache.isis.metamodel.services.swagger.internal;
 
 import java.util.List;
+import java.util.Set;
 
+import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
+import org.springframework.stereotype.Component;
 
-public class ClassExcluder {
+@Component
+public class ClassExcluderDefault extends ClassExcluderAbstract {
 
-    protected boolean exclude(final ObjectSpecification objectSpec) {
-        if(objectSpec == null) {
-            return false;
-        }
-        return objectSpec.isExcludedFromMetamodel();
+    public ClassExcluderDefault() {
+        ignorePackage("org.apache.isis.commons.internal");
     }
 
-    public boolean exclude(final ObjectAction objectAction) {
-        final ObjectSpecification returnType = objectAction.getReturnType();
-        if(exclude(returnType)) {
-            return true;
-        }
-
-        final List<ObjectSpecification> parameterTypes = objectAction.getParameterTypes();
-        for (ObjectSpecification parameterType : parameterTypes) {
-            if(exclude(parameterType)) {
-                return true;
-            }
-        }
-        return false;
-    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java
index 18d044a..b279e25 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Generation.java
@@ -18,11 +18,7 @@
  */
 package org.apache.isis.metamodel.services.swagger.internal;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import org.apache.isis.applib.annotation.SemanticsOf;
@@ -76,26 +72,16 @@ class Generation {
     public Generation(
             final String basePath,
             final SwaggerService.Visibility visibility,
-            final SpecificationLoader specificationLoader) {
+            final SpecificationLoader specificationLoader,
+            final Tagger tagger,
+            final ClassExcluder classExcluder,
+            final ValuePropertyFactory valuePropertyFactory) {
         this.basePath = basePath;
         this.visibility = visibility;
         this.specificationLoader = specificationLoader;
-
-        this.valuePropertyFactory = newValuePropertyFactory();
-        this.tagger = newTagger();
-        this.classExcluder = newClassExcluder();
-    }
-
-    protected ValuePropertyFactory newValuePropertyFactory() {
-        return new ValuePropertyFactory();
-    }
-
-    protected ClassExcluder newClassExcluder() {
-        return new ClassExcluder();
-    }
-
-    protected Tagger newTagger() {
-        return new Tagger();
+        this.tagger = tagger;
+        this.classExcluder = classExcluder;
+        this.valuePropertyFactory = valuePropertyFactory;
     }
 
     Swagger generate() {
@@ -121,12 +107,36 @@ class Generation {
 
         appendDefinitionsForOrphanedReferences();
 
+        swagger.setPaths(sorted(swagger.getPaths()));
+
         return swagger;
     }
 
+    private Map<String, Path> sorted(Map<String, Path> paths) {
+
+        final List<Map.Entry<String, Path>> entries = new ArrayList<>(paths.entrySet());
+        entries.sort(new Comparator<Map.Entry<String, Path>>() {
+            @Override
+            public int compare(Map.Entry<String, Path> o1, Map.Entry<String, Path> o2) {
+                final String tag1 = tagFor(o1);
+                final String tag2 = tagFor(o2);
+                final int tag = tag1.compareTo(tag2);
+                return tag != 0 ? tag : o1.getKey().compareTo(o2.getKey());
+            }
+
+            protected String tagFor(Map.Entry<String, Path> o1) {
+                return o1.getValue().getOperations().stream().findFirst().map(operation -> operation.getTags().stream().findFirst().orElse("(no tag)")).orElse("(no tag)");
+            }
+        });
+
+        final LinkedHashMap<String, Path> sorted = new LinkedHashMap<>();
+        entries.forEach(entry -> sorted.put(entry.getKey(), entry.getValue()));
+
+        return sorted;
+    }
+
     void appendServicePathsAndDefinitions() {
-        // (previously we took a protective copy to avoid a concurrent modification exception,
-        // but this is now done by SpecificationLoader itself)
+
         for (val spec : specificationLoader.snapshotSpecifications()) {
 
             val domainServiceFacet = spec.getFacet(DomainServiceFacet.class);
@@ -166,15 +176,6 @@ class Generation {
         }
     }
 
-    //    @SuppressWarnings("unused")
-    //    private void debugAllLoadedClasses(final Collection<ObjectSpecification> allSpecs) {
-    //        final ImmutableList<String> specs = FluentIterable.from(allSpecs)
-    //                .transform((final ObjectSpecification objectSpecification)->
-    //                        objectSpecification.getCorrespondingClass().getName())
-    //                .toSortedList(Ordering.natural());
-    //        final String all = Joiner.on(",").join(specs);
-    //        System .out.println(all);
-    //    }
 
     void appendObjectPathsAndDefinitions() {
         // (previously we took a protective copy to avoid a concurrent modification exception,
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/SwaggerSpecGenerator.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
index 9a2c5f8..ae679c4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/SwaggerSpecGenerator.java
@@ -22,17 +22,32 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 import org.apache.isis.applib.services.swagger.SwaggerService;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.springframework.stereotype.Component;
 
 import io.swagger.models.Swagger;
 import io.swagger.util.Json;
 import io.swagger.util.Yaml;
 
+import javax.inject.Inject;
+
+@Component
 public class SwaggerSpecGenerator {
 
     private final SpecificationLoader specificationLoader;
+    private final Tagger tagger;
+    private final ClassExcluder classExcluder;
+    private final ValuePropertyFactory valuePropertyFactory;
 
-    public SwaggerSpecGenerator(final SpecificationLoader specificationLoader) {
+    @Inject
+    public SwaggerSpecGenerator(
+            final SpecificationLoader specificationLoader,
+            final Tagger tagger,
+            final ClassExcluder classExcluder,
+            final ValuePropertyFactory valuePropertyFactory) {
         this.specificationLoader = specificationLoader;
+        this.tagger = tagger;
+        this.classExcluder = classExcluder;
+        this.valuePropertyFactory = valuePropertyFactory;
     }
 
     public String generate(
@@ -58,7 +73,12 @@ public class SwaggerSpecGenerator {
     }
 
     protected Generation newGeneration(final String basePath, final SwaggerService.Visibility visibility) {
-        return new Generation(basePath, visibility, specificationLoader);
+        return new Generation(
+                basePath, visibility,
+                specificationLoader,
+                tagger,
+                classExcluder,
+                valuePropertyFactory);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java
index eff6cb9..501d6a7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java
@@ -18,67 +18,11 @@
  */
 package org.apache.isis.metamodel.services.swagger.internal;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.apache.isis.applib.annotation.Programmatic;
 
-class Tagger {
+public interface Tagger {
 
-    
-    static Pattern tagSpringFramework = Pattern.compile("^org\\.springframework\\.([^\\.]+)\\.(.+)$");
-    static Pattern tagPatternIsisExtensions = Pattern.compile("^org\\.apache\\.isis\\.extensions\\.([^\\.]+)\\.(.+)$");
-    static Pattern tagPatternIsisAddons = Pattern.compile("^org\\.isisaddons\\.module\\.([^\\.]+)\\.(.+)$");
-    static Pattern tagPatternIncodeCatalog = Pattern.compile("^org\\.incode\\.module\\.([^\\.]+)\\.(.+)$");
-    static Pattern tagPatternForFqcn = Pattern.compile("^.*\\.([^\\.]+)\\.([^\\.]+)$");
-    static Pattern tagPatternForTwoParts = Pattern.compile("^([^\\.]+)\\.([^\\.]+)$");
-    static Pattern tagPatternForJaxbDto = Pattern.compile("^.*\\.([^\\.]+)\\.(v[0-9][^\\.]*)\\.([^\\.]+)$");
-
-    String tagForObjectType(final String objType, final String fallback) {
-        if (objType.startsWith("org.apache.isis.")) {
-            return "> apache isis internals";
-        }
-        
-        Matcher matcher;
-        matcher = tagSpringFramework.matcher(objType);
-        if (matcher.matches()) {
-            return "> spring framework " + matcher.group(1);
-        }
-        matcher = tagPatternIsisExtensions.matcher(objType);
-        if (matcher.matches()) {
-            return "apache isis extensions " + matcher.group(1);
-        }
-        matcher = tagPatternIsisAddons.matcher(objType);
-        if (matcher.matches()) {
-            return "isisaddons.org " + matcher.group(1);
-        }
-        matcher = tagPatternIncodeCatalog.matcher(objType);
-        if (matcher.matches()) {
-            return "catalog.incode.org " + matcher.group(1);
-        }
-        matcher = tagPatternForJaxbDto.matcher(objType);
-        if (matcher.matches()) {
-            return matcher.group(1);
-        }
-        matcher = tagPatternForFqcn.matcher(objType);
-        if (matcher.matches()) {
-            return matcher.group(1);
-        }
-        matcher = tagPatternForTwoParts.matcher(objType);
-        if (matcher.matches()) {
-            if (objType.startsWith("isisApplib")) {
-                return "> apache isis applib";
-            }
-            if (objType.startsWith("isissecurity")) {
-                return "> apache isis extensions";
-            }
-            // special cases for other Isis addons, eg "isisxxxx"
-            if (objType.startsWith("isis")) {
-                return "isisaddons " + objType.substring(4, objType.indexOf("."));
-            }
-            
-            return matcher.group(1);
-        }
-        
-        return fallback != null? fallback: objType;
-    }
+    @Programmatic
+    String tagForObjectType(String objType, String fallback);
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/TaggerDefault.java
similarity index 70%
copy from core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java
copy to core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/TaggerDefault.java
index eff6cb9..d53ff1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/Tagger.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/TaggerDefault.java
@@ -21,18 +21,23 @@ package org.apache.isis.metamodel.services.swagger.internal;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-class Tagger {
+import org.apache.isis.applib.annotation.Programmatic;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TaggerDefault implements Tagger {
 
-    
     static Pattern tagSpringFramework = Pattern.compile("^org\\.springframework\\.([^\\.]+)\\.(.+)$");
+    static Pattern tagPatternIsisExtensions2 = Pattern.compile("^isisExt(.+)$");
     static Pattern tagPatternIsisExtensions = Pattern.compile("^org\\.apache\\.isis\\.extensions\\.([^\\.]+)\\.(.+)$");
-    static Pattern tagPatternIsisAddons = Pattern.compile("^org\\.isisaddons\\.module\\.([^\\.]+)\\.(.+)$");
-    static Pattern tagPatternIncodeCatalog = Pattern.compile("^org\\.incode\\.module\\.([^\\.]+)\\.(.+)$");
     static Pattern tagPatternForFqcn = Pattern.compile("^.*\\.([^\\.]+)\\.([^\\.]+)$");
     static Pattern tagPatternForTwoParts = Pattern.compile("^([^\\.]+)\\.([^\\.]+)$");
     static Pattern tagPatternForJaxbDto = Pattern.compile("^.*\\.([^\\.]+)\\.(v[0-9][^\\.]*)\\.([^\\.]+)$");
 
-    String tagForObjectType(final String objType, final String fallback) {
+    @Override
+    @Programmatic
+    public String tagForObjectType(final String objType, final String fallback) {
+
         if (objType.startsWith("org.apache.isis.")) {
             return "> apache isis internals";
         }
@@ -44,15 +49,7 @@ class Tagger {
         }
         matcher = tagPatternIsisExtensions.matcher(objType);
         if (matcher.matches()) {
-            return "apache isis extensions " + matcher.group(1);
-        }
-        matcher = tagPatternIsisAddons.matcher(objType);
-        if (matcher.matches()) {
-            return "isisaddons.org " + matcher.group(1);
-        }
-        matcher = tagPatternIncodeCatalog.matcher(objType);
-        if (matcher.matches()) {
-            return "catalog.incode.org " + matcher.group(1);
+            return "> apache isis extensions - " + matcher.group(1);
         }
         matcher = tagPatternForJaxbDto.matcher(objType);
         if (matcher.matches()) {
@@ -67,14 +64,11 @@ class Tagger {
             if (objType.startsWith("isisApplib")) {
                 return "> apache isis applib";
             }
-            if (objType.startsWith("isissecurity")) {
-                return "> apache isis extensions";
-            }
-            // special cases for other Isis addons, eg "isisxxxx"
-            if (objType.startsWith("isis")) {
-                return "isisaddons " + objType.substring(4, objType.indexOf("."));
+
+            if (objType.startsWith("isisExt")) {
+                return "> apache isis extensions - " + matcher.group(1);
             }
-            
+
             return matcher.group(1);
         }
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java
index 6e1d4b6..a00f88f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java
@@ -18,123 +18,8 @@
  */
 package org.apache.isis.metamodel.services.swagger.internal;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.function.Supplier;
-
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalDateTime;
-
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.context._Plugin;
-import org.apache.isis.metamodel.services.swagger.internal.ValuePropertyPlugin.ValuePropertyCollector;
-
-import io.swagger.models.properties.BooleanProperty;
-import io.swagger.models.properties.ByteArrayProperty;
-import io.swagger.models.properties.DateProperty;
-import io.swagger.models.properties.DateTimeProperty;
-import io.swagger.models.properties.DecimalProperty;
-import io.swagger.models.properties.DoubleProperty;
-import io.swagger.models.properties.FloatProperty;
-import io.swagger.models.properties.IntegerProperty;
-import io.swagger.models.properties.LongProperty;
 import io.swagger.models.properties.Property;
-import io.swagger.models.properties.StringProperty;
-import io.swagger.models.properties.UUIDProperty;
-
-public class ValuePropertyFactory {
-
-    private final Map<Class<?>, Factory> propertyFactoryByClass = _Maps.newHashMap();
-
-    public static interface Factory extends Supplier<Property> {};
-
-    public ValuePropertyFactory() {
-
-        propertyFactoryByClass.put(boolean.class, BooleanProperty::new);
-        propertyFactoryByClass.put(Boolean.class, BooleanProperty::new);
-
-        propertyFactoryByClass.put(byte.class, IntegerProperty::new);
-        propertyFactoryByClass.put(Byte.class, IntegerProperty::new);
-        propertyFactoryByClass.put(short.class, IntegerProperty::new);
-        propertyFactoryByClass.put(Short.class, IntegerProperty::new);
-        propertyFactoryByClass.put(int.class, IntegerProperty::new);
-        propertyFactoryByClass.put(Integer.class, IntegerProperty::new);
-        propertyFactoryByClass.put(BigInteger.class, IntegerProperty::new);
-
-        propertyFactoryByClass.put(long.class, LongProperty::new);
-        propertyFactoryByClass.put(Long.class, LongProperty::new);
-        propertyFactoryByClass.put(java.sql.Timestamp.class, LongProperty::new);
-
-        propertyFactoryByClass.put(BigDecimal.class, DecimalProperty::new);
-
-        propertyFactoryByClass.put(float.class, FloatProperty::new);
-        propertyFactoryByClass.put(Float.class, FloatProperty::new);
-
-        propertyFactoryByClass.put(double.class, DoubleProperty::new);
-        propertyFactoryByClass.put(Double.class, DoubleProperty::new);
-
-        propertyFactoryByClass.put(char.class, StringProperty::new);
-        propertyFactoryByClass.put(Character.class, StringProperty::new);
-        propertyFactoryByClass.put(char[].class, StringProperty::new);
-        propertyFactoryByClass.put(String.class, StringProperty::new);
-
-        propertyFactoryByClass.put(UUID.class, UUIDProperty::new);
-
-        propertyFactoryByClass.put(java.util.Date.class, DateTimeProperty::new);
-        propertyFactoryByClass.put(DateTime.class, DateTimeProperty::new);
-        propertyFactoryByClass.put(LocalDateTime.class, DateTimeProperty::new);
-
-        propertyFactoryByClass.put(java.sql.Date.class, DateProperty::new);
-        propertyFactoryByClass.put(LocalDate.class, DateProperty::new);
-
-        propertyFactoryByClass.put(byte[].class, ByteArrayProperty::new);
-        propertyFactoryByClass.put(org.apache.isis.applib.value.Blob.class, ByteArrayProperty::new);
-
-        // add propertyFactories from plugins
-        discoverValueProperties().visitEntries(propertyFactoryByClass::put);
-
-    }
-
-    public Property newProperty(Class<?> cls) {
-        if(cls == null) {
-            return null;
-        }
-
-        final Factory factory = propertyFactoryByClass.get(cls);
-        if(factory != null) {
-            return factory.get();
-        }
-
-        // special case, want to treat as a value
-        if(cls.isEnum()) {
-            final StringProperty property = new StringProperty();
-            final Object[] enumConstants = cls.getEnumConstants();
-
-            final List<String> enumNames = _Lists.map(
-                    Arrays.asList(enumConstants), input->((Enum<?>)input).name());
-            property.setEnum(enumNames);
-            return property;
-        }
-
-        return null;
-    }
-
-    // -- HELPER
-
-    private static ValuePropertyCollector discoverValueProperties() {
-        final Set<ValuePropertyPlugin> plugins = _Plugin.loadAll(ValuePropertyPlugin.class);
-        final ValuePropertyCollector collector = ValuePropertyPlugin.collector();
-        plugins.forEach(plugin->{
-            plugin.plugin(collector);
-        });
-        return collector;
-    }
 
+public interface ValuePropertyFactory {
+    Property newProperty(Class<?> cls);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactoryDefault.java
similarity index 96%
copy from core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java
copy to core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactoryDefault.java
index 6e1d4b6..8fc57c0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyFactoryDefault.java
@@ -35,6 +35,7 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.context._Plugin;
 import org.apache.isis.metamodel.services.swagger.internal.ValuePropertyPlugin.ValuePropertyCollector;
+import org.springframework.stereotype.Component;
 
 import io.swagger.models.properties.BooleanProperty;
 import io.swagger.models.properties.ByteArrayProperty;
@@ -49,13 +50,14 @@ import io.swagger.models.properties.Property;
 import io.swagger.models.properties.StringProperty;
 import io.swagger.models.properties.UUIDProperty;
 
-public class ValuePropertyFactory {
+@Component
+public class ValuePropertyFactoryDefault implements ValuePropertyFactory {
 
     private final Map<Class<?>, Factory> propertyFactoryByClass = _Maps.newHashMap();
 
     public static interface Factory extends Supplier<Property> {};
 
-    public ValuePropertyFactory() {
+    public ValuePropertyFactoryDefault() {
 
         propertyFactoryByClass.put(boolean.class, BooleanProperty::new);
         propertyFactoryByClass.put(Boolean.class, BooleanProperty::new);
@@ -102,6 +104,7 @@ public class ValuePropertyFactory {
 
     }
 
+    @Override
     public Property newProperty(Class<?> cls) {
         if(cls == null) {
             return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyPlugin.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyPlugin.java
index 9926d6b..112c554 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyPlugin.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/swagger/internal/ValuePropertyPlugin.java
@@ -23,15 +23,15 @@ import java.util.Objects;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.metamodel.services.swagger.internal.ValuePropertyFactory.Factory;
+import org.apache.isis.metamodel.services.swagger.internal.ValuePropertyFactoryDefault.Factory;
 
 public interface ValuePropertyPlugin {
 
     // -- CONTRACT
 
     public static interface ValuePropertyCollector {
-        public void addValueProperty(final Class<?> cls, final ValuePropertyFactory.Factory factory);
-        public void visitEntries(BiConsumer<Class<?>, ValuePropertyFactory.Factory> visitor);
+        public void addValueProperty(final Class<?> cls, final ValuePropertyFactoryDefault.Factory factory);
+        public void visitEntries(BiConsumer<Class<?>, ValuePropertyFactoryDefault.Factory> visitor);
     }
 
     public static ValuePropertyCollector collector() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/GenerationTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/GenerationTest.java
index 0800c83..0c317ae 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/GenerationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/GenerationTest.java
@@ -31,7 +31,7 @@ public class GenerationTest {
     @Test
     public void testAddReference() throws Exception {
 
-        Generation context = new Generation(null, null, null);
+        Generation context = new Generation(null, null, null, new TaggerDefault(), new ClassExcluderDefault(), new ValuePropertyFactoryDefault());
 
         context.addSwaggerReference("foo");
         context.addSwaggerReference("bar");
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/TaggerTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/TaggerTest.java
index 66ddac0..0e719ac 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/TaggerTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/swagger/internal/TaggerTest.java
@@ -30,49 +30,49 @@ public class TaggerTest {
 
         @Test
         public void fullyQualifiedClass() throws Exception {
-            String tag = new Tagger().tagForObjectType("foo.bar.Abc", null);
+            String tag = new TaggerDefault().tagForObjectType("foo.bar.Abc", null);
             assertThat(tag, is(equalTo("bar")));
         }
 
         @Test
         public void jaxb() throws Exception {
-            String tag = new Tagger().tagForObjectType("todoapp.app.viewmodels.todoitem.v1_0.ToDoItemDto", null);
+            String tag = new TaggerDefault().tagForObjectType("todoapp.app.viewmodels.todoitem.v1_0.ToDoItemDto", null);
             assertThat(tag, is(equalTo("todoitem")));
         }
 
         @Test
         public void schemaClass() throws Exception {
-            String tag = new Tagger().tagForObjectType("bar.Abc", null);
+            String tag = new TaggerDefault().tagForObjectType("bar.Abc", null);
             assertThat(tag, is(equalTo("bar")));
         }
 
         @Test
         public void noPackage() throws Exception {
-            String tag = new Tagger().tagForObjectType("Abc", null);
+            String tag = new TaggerDefault().tagForObjectType("Abc", null);
             assertThat(tag, is(equalTo("Abc")));
         }
 
         @Test
         public void isisAddons() throws Exception {
-            String tag = new Tagger().tagForObjectType("org.isisaddons.module.security.app.feature.ApplicationClass", null);
+            String tag = new TaggerDefault().tagForObjectType("org.isisaddons.module.security.app.feature.ApplicationClass", null);
             assertThat(tag, is(equalTo("isisaddons.org security")));
         }
 
         @Test
         public void incodeCatalog() throws Exception {
-            String tag = new Tagger().tagForObjectType("org.incode.module.communications.foo.bar.FooBar", null);
+            String tag = new TaggerDefault().tagForObjectType("org.incode.module.communications.foo.bar.FooBar", null);
             assertThat(tag, is(equalTo("catalog.incode.org communications")));
         }
 
         @Test
         public void internals() throws Exception {
-            String tag = new Tagger().tagForObjectType("org.apache.isis.applib.fixturescripts.FixtureResult", null);
+            String tag = new TaggerDefault().tagForObjectType("org.apache.isis.applib.fixturescripts.FixtureResult", null);
             assertThat(tag, is(equalTo("> apache isis internals")));
         }
 
         @Test
         public void applib() throws Exception {
-            String tag = new Tagger().tagForObjectType("isisApplib.ConfigurationServiceMenu", null);
+            String tag = new TaggerDefault().tagForObjectType("isisApplib.ConfigurationServiceMenu", null);
             assertThat(tag, is(equalTo("> apache isis applib")));
         }
 
diff --git a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureResult.java b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureResult.java
index 701c189..3933718 100644
--- a/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureResult.java
+++ b/extensions/testing/fixtures/src/main/java/org/apache/isis/extensions/fixtures/fixturescripts/FixtureResult.java
@@ -42,7 +42,7 @@ import lombok.Setter;
 
 @DomainObject(
         nature = Nature.VIEW_MODEL,
-        objectType = "extFixture.FixtureResult"
+        objectType = "isisExtFixture.FixtureResult"
         )
 @ViewModelLayout(paged=500)
 @XmlRootElement(name = "fixtureResult")


[isis] 03/04: ISIS-2203 - fixes NPE by passing the ObjectSpec down (rather than attempt to obtain from a possibly null ObjectAdapter)

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 01198e145c402a5a1aca25a16c5aa40d78975d9e
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Dec 3 14:42:13 2019 +0000

    ISIS-2203 - fixes NPE by passing the ObjectSpec down (rather than attempt to obtain from a possibly null ObjectAdapter)
---
 .../rendering/domainobjects/JsonValueEncoder.java  | 12 +++---
 .../domainobjects/ObjectPropertyReprRenderer.java  | 20 ++++-----
 .../JsonValueEncoderTest_appendValueAndFormat.java | 50 +++++++++++-----------
 3 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index 518d3e0..f8d295d 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -125,17 +125,17 @@ public class JsonValueEncoder {
     }
 
     public Object appendValueAndFormat(
-            ManagedObject objectAdapter, 
-            JsonRepresentation repr, 
-            String format, 
+            ManagedObject objectAdapter,
+            ObjectSpecification objectSpecification,
+            JsonRepresentation repr,
+            String format,
             boolean suppressExtensions) {
 
-        val spec = objectAdapter.getSpecification();
-        val jsonValueConverter = converterBySpecId.get(spec.getSpecId());
+        val jsonValueConverter = converterBySpecId.get(objectSpecification.getSpecId());
         if(jsonValueConverter != null) {
             return jsonValueConverter.appendValueAndFormat(objectAdapter, format, repr, suppressExtensions);
         } else {
-            val encodableFacet = spec.getFacet(EncodableFacet.class);
+            val encodableFacet = objectSpecification.getFacet(EncodableFacet.class);
             if (encodableFacet == null) {
                 throw new IllegalArgumentException("objectSpec expected to have EncodableFacet");
             }
diff --git a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index e0caa7a..eefbb76 100644
--- a/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/core/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -85,10 +85,10 @@ extends AbstractObjectMemberReprRenderer<ObjectPropertyReprRenderer, OneToOneAss
     // ///////////////////////////////////////////////////
 
     private Object addValue(final LinkFollowSpecs linkFollower) {
-        val valueAdapter = objectMember.get(objectAdapter, getInteractionInitiatedBy());
+        val valueAdapterIfAny = objectMember.get(objectAdapter, getInteractionInitiatedBy());
 
         // use the runtime type if we have a value, else the compile time type of the member otherwise
-        val spec = valueAdapter != null? valueAdapter.getSpecification(): objectMember.getSpecification();
+        val spec = valueAdapterIfAny != null? valueAdapterIfAny.getSpecification(): objectMember.getSpecification();
 
         val valueFacet = spec.getFacet(ValueFacet.class);
         if (valueFacet != null) {
@@ -99,7 +99,7 @@ extends AbstractObjectMemberReprRenderer<ObjectPropertyReprRenderer, OneToOneAss
                 final BigDecimalValueFacet bigDecimalValueFacet =
                         getFacet(BigDecimalValueFacet.class,
                                 objectMember,
-                                valueAdapter != null? valueAdapter.getSpecification(): null);
+                                valueAdapterIfAny != null? valueAdapterIfAny.getSpecification(): null);
                 if(bigDecimalValueFacet != null) {
                     final Integer precision = bigDecimalValueFacet.getPrecision();
                     final Integer scale = bigDecimalValueFacet.getScale();
@@ -110,31 +110,31 @@ extends AbstractObjectMemberReprRenderer<ObjectPropertyReprRenderer, OneToOneAss
                 final BigIntegerValueFacet bigIntegerValueFacet =
                         getFacet(BigIntegerValueFacet.class,
                                 objectMember,
-                                valueAdapter != null? valueAdapter.getSpecification(): null);
+                                valueAdapterIfAny != null? valueAdapterIfAny.getSpecification(): null);
                 if(bigIntegerValueFacet != null) {
                     format = String.format("big-integer");
                 }
             }
-            return jsonValueEncoder.appendValueAndFormat(valueAdapter, representation, format, resourceContext.suppressMemberExtensions());
+            return jsonValueEncoder.appendValueAndFormat(valueAdapterIfAny, spec, representation, format, resourceContext.suppressMemberExtensions());
         }
 
         boolean eagerlyRender =
-                (renderEagerly() && resourceContext.canEagerlyRender(valueAdapter))
+                (renderEagerly() && resourceContext.canEagerlyRender(valueAdapterIfAny))
                 || (linkFollower != null && !linkFollower.isTerminated());
 
-        if(valueAdapter == null) {
+        if(valueAdapterIfAny == null) {
             final NullNode value = NullNode.getInstance();
             representation.mapPut("value", value);
             return value;
         } else {
             final TitleFacet titleFacet = spec.getFacet(TitleFacet.class);
-            final String title = titleFacet.title(valueAdapter);
+            final String title = titleFacet.title(valueAdapterIfAny);
 
-            final LinkBuilder valueLinkBuilder = DomainObjectReprRenderer.newLinkToBuilder(resourceContext, Rel.VALUE, valueAdapter).withTitle(title);
+            final LinkBuilder valueLinkBuilder = DomainObjectReprRenderer.newLinkToBuilder(resourceContext, Rel.VALUE, valueAdapterIfAny).withTitle(title);
             if(eagerlyRender) {
                 final DomainObjectReprRenderer renderer = 
                         new DomainObjectReprRenderer(resourceContext, linkFollower, JsonRepresentation.newMap());
-                renderer.with(valueAdapter);
+                renderer.with(valueAdapterIfAny);
                 if(mode.isEventSerialization()) {
                     renderer.asEventSerialization();
                 }
diff --git a/core/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java b/core/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
index 8799c20..9e1ed7e 100644
--- a/core/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
+++ b/core/viewers/restfulobjects/rendering/src/test/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoderTest_appendValueAndFormat.java
@@ -73,7 +73,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(String.class);
         allowingObjectAdapterToReturn("aString");
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("aString"));
 
@@ -86,7 +86,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Boolean.class);
         allowingObjectAdapterToReturn(Boolean.TRUE);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isBoolean("value"), is(true));
         assertThat(representation.getBoolean("value"), is(Boolean.TRUE));
 
@@ -98,7 +98,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(boolean.class);
         allowingObjectAdapterToReturn(true);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isBoolean("value"), is(true));
         assertThat(representation.getBoolean("value"), is(true));
 
@@ -110,7 +110,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Byte.class);
         allowingObjectAdapterToReturn(Byte.valueOf((byte)123));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getByte("value"), is(Byte.valueOf((byte)123)));
 
@@ -123,7 +123,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(byte.class);
         allowingObjectAdapterToReturn((byte)123);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getByte("value"), is((byte)123));
 
@@ -136,7 +136,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Short.class);
         allowingObjectAdapterToReturn(Short.valueOf((short)12345));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getShort("value"), is(Short.valueOf((short)12345)));
 
@@ -149,7 +149,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(short.class);
         allowingObjectAdapterToReturn((short)12345);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getShort("value"), is((short)12345));
 
@@ -162,7 +162,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Integer.class);
         allowingObjectAdapterToReturn(Integer.valueOf(12345678));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getInt("value"), is(Integer.valueOf(12345678)));
 
@@ -175,7 +175,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(int.class);
         allowingObjectAdapterToReturn(12345678);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getInt("value"), is(12345678));
 
@@ -188,7 +188,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Long.class);
         allowingObjectAdapterToReturn(Long.valueOf(12345678901234L));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getLong("value"), is(Long.valueOf(12345678901234L)));
 
@@ -201,7 +201,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(long.class);
         allowingObjectAdapterToReturn(12345678901234L);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isIntegralNumber("value"), is(true));
         assertThat(representation.getLong("value"), is(12345678901234L));
 
@@ -214,7 +214,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Float.class);
         allowingObjectAdapterToReturn(Float.valueOf((float)123.45));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getFloat("value"), is(Float.valueOf((float)123.45)));
 
@@ -227,7 +227,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Float.class);
         allowingObjectAdapterToReturn((float)123.45);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getFloat("value"), is((float)123.45));
 
@@ -240,7 +240,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Double.class);
         allowingObjectAdapterToReturn(Double.valueOf(12345.6789));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getDouble("value"), is(Double.valueOf(12345.6789)));
 
@@ -253,7 +253,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(double.class);
         allowingObjectAdapterToReturn(12345.6789);
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isDecimal("value"), is(true));
         assertThat(representation.getDouble("value"), is(12345.6789));
 
@@ -266,7 +266,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(Character.class);
         allowingObjectAdapterToReturn(Character.valueOf('a'));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getChar("value"), is(Character.valueOf('a')));
 
@@ -279,7 +279,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(char.class);
         allowingObjectAdapterToReturn('a');
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getChar("value"), is('a'));
 
@@ -292,7 +292,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(java.util.Date.class);
         allowingObjectAdapterToReturn(asDateTime("2014-04-25T12:34:45Z"));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z"));
 
@@ -305,7 +305,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(java.sql.Date.class);
         allowingObjectAdapterToReturn(asSqlDate("2014-04-25"));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25"));
 
@@ -318,7 +318,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(org.joda.time.DateTime.class);
         allowingObjectAdapterToReturn(new org.joda.time.DateTime(asDateTime("2014-04-25T12:34:45Z")));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z"));
 
@@ -331,7 +331,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(org.joda.time.LocalDateTime.class);
         allowingObjectAdapterToReturn(new org.joda.time.LocalDateTime(asDateTime("2014-04-25T12:34:45Z")));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25T12:34:45Z"));
 
@@ -344,7 +344,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(org.joda.time.LocalDate.class);
         allowingObjectAdapterToReturn(new org.joda.time.LocalDate(2014,4,25));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.getString("value"), is("2014-04-25"));
 
@@ -358,7 +358,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         final long time = asDateTime("2014-04-25T12:34:45Z").getTime();
         allowingObjectAdapterToReturn(new Timestamp(time));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, null, false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, null, false);
         assertThat(representation.isLong("value"), is(true));
         assertThat(representation.getLong("value"), is(time));
 
@@ -371,7 +371,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(BigInteger.class);
         allowingObjectAdapterToReturn(new BigInteger("12345678901234567890"));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, "big-integer(22)", false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, "big-integer(22)", false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.isBigInteger("value"), is(true));
         assertThat(representation.getBigInteger("value"), is(new BigInteger("12345678901234567890")));
@@ -385,7 +385,7 @@ public class JsonValueEncoderTest_appendValueAndFormat {
         allowingObjectSpecToReturnSpecIdFor(BigDecimal.class);
         allowingObjectAdapterToReturn(new BigDecimal("12345678901234567890.1234"));
 
-        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, representation, "big-decimal(27,4)", false);
+        jsonValueEncoder.appendValueAndFormat(mockObjectAdapter, mockObjectSpec, representation, "big-decimal(27,4)", false);
         assertThat(representation.isString("value"), is(true));
         assertThat(representation.isBigDecimal("value"), is(true));
         assertThat(representation.getBigDecimal("value"), is(new BigDecimal("12345678901234567890.1234")));


[isis] 01/04: ISIS-2202: exclude org.springframework from the metamodel:

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 2597fef670c7f7ed9db6e1ab64927dd4049ce445
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Tue Dec 3 14:34:05 2019 +0000

    ISIS-2202: exclude org.springframework from the metamodel:
---
 .../services/classsubstitutor/ClassSubstitutorDefault.java         | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/classsubstitutor/ClassSubstitutorDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/classsubstitutor/ClassSubstitutorDefault.java
index 7e5638c..874ca97 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/classsubstitutor/ClassSubstitutorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/classsubstitutor/ClassSubstitutorDefault.java
@@ -28,6 +28,7 @@ public class ClassSubstitutorDefault extends ClassSubstitutorAbstract {
 
         ignoreCglib();
         ignoreJavassist();
+        ignoreApacheIsisInternals();
         ignoreSpringFramework();
         ignoreJacksonAndGson();
         skipDataNucleusProxy();
@@ -47,6 +48,12 @@ public class ClassSubstitutorDefault extends ClassSubstitutorAbstract {
 
     protected void ignoreSpringFramework() {
         ignoreClass("org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator");
+        ignorePackage("org.springframework.");
+    }
+
+    private void ignoreApacheIsisInternals() {
+        // can't ignoring this class ... will result in NPEs...
+        // ignoreClass("org.apache.isis.commons.internal.ioc.spring.BeanAdapterSpring");
     }
 
     protected void ignoreJacksonAndGson() {