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 <d...@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")