You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2019/07/11 13:45:46 UTC

[sling-org-apache-sling-models-jacksonexporter] 01/01: SLING-8452 migrate to OSGi R6 annotations

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

kwin pushed a commit to branch feature/osgi-annotations
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-jacksonexporter.git

commit dd43f2d9df5f7b1daa98b217884225663936cef7
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Thu Jul 11 15:44:29 2019 +0200

    SLING-8452 migrate to OSGi R6 annotations
---
 bnd.bnd                                            |  2 +
 pom.xml                                            | 52 +++++++---------------
 .../models/jacksonexporter/ModuleProvider.java     |  3 +-
 .../jacksonexporter/impl/JacksonExporter.java      | 42 +++++++----------
 .../impl/RequestModuleProvider.java                | 23 ++++------
 .../impl/ResourceModuleProvider.java               | 40 +++++++----------
 .../sling/models/jacksonexporter/package-info.java |  4 +-
 7 files changed, 66 insertions(+), 100 deletions(-)

diff --git a/bnd.bnd b/bnd.bnd
new file mode 100644
index 0000000..68235fa
--- /dev/null
+++ b/bnd.bnd
@@ -0,0 +1,2 @@
+ <Embed-Dependency>*;scope=compile</Embed-Dependency>
+Conditional-Package: org.apache.sling.commons.osgi
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 4fca997..72e53ac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,14 +13,13 @@
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.sling</groupId>
-        <artifactId>sling</artifactId>
-        <version>25</version>
+        <artifactId>sling-bundle-parent</artifactId>
+        <version>35</version>
         <relativePath />
     </parent>
 
     <artifactId>org.apache.sling.models.jacksonexporter</artifactId>
     <version>1.0.9-SNAPSHOT</version>
-    <packaging>bundle</packaging>
     <name>Apache Sling Models Jackson Exporter</name>
     <description>Apache Sling Models Client Model Exporter - Jackson</description>
 
@@ -29,25 +28,6 @@
         <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-jacksonexporter.git</developerConnection>
         <url>https://gitbox.apache.org/repos/asf?p=sling-org-apache-sling-models-jacksonexporter.git</url>
     </scm>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-scr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-                <configuration>
-                    <instructions>
-                        <Embed-Dependency>*;scope=compile</Embed-Dependency>
-                        <Conditional-Package>org.apache.sling.commons.osgi</Conditional-Package>
-                    </instructions>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
     <dependencies>
         <dependency>
             <groupId>org.apache.sling</groupId>
@@ -57,22 +37,30 @@
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
+            <artifactId>org.osgi.annotation.versioning</artifactId>
             <scope>provided</scope>
         </dependency>
+        <!-- OSGi annotations -->
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
+            <version>1.3.0</version> <!-- downgrade to DS 1.3 (OSGi R6), as this leads to a run time dependency -->
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.metatype.annotations</artifactId>
+            <version>1.3.0</version> <!-- downgrade to metatype 1.3 (OSGi R6) -->
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.framework</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -94,7 +82,6 @@
         <dependency>
             <groupId>org.jetbrains</groupId>
             <artifactId>annotations</artifactId>
-            <version>16.0.2</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -110,15 +97,10 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.4.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>servlet-api</artifactId>
             <scope>provided</scope>
+            <version>2.4</version><!-- still Servlet 2.4 -->
         </dependency>
         <dependency>
             <groupId>commons-collections</groupId>
diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/ModuleProvider.java b/src/main/java/org/apache/sling/models/jacksonexporter/ModuleProvider.java
index 01d9b0a..6373d94 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/ModuleProvider.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/ModuleProvider.java
@@ -16,7 +16,8 @@
  */
 package org.apache.sling.models.jacksonexporter;
 
-import aQute.bnd.annotation.ConsumerType;
+import org.osgi.annotation.versioning.ConsumerType;
+
 import com.fasterxml.jackson.databind.Module;
 
 /**
diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporter.java b/src/main/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporter.java
index a4da47e..a1df164 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporter.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/impl/JacksonExporter.java
@@ -20,32 +20,30 @@ package org.apache.sling.models.jacksonexporter.impl;
 
 import java.io.IOException;
 import java.io.StringWriter;
+import java.util.List;
 import java.util.Map;
 
-import com.fasterxml.jackson.databind.MapperFeature;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.ReferencePolicy;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.sling.commons.osgi.Order;
-import org.apache.sling.commons.osgi.RankedServices;
+import org.apache.commons.collections.iterators.ReverseListIterator;
 import org.apache.sling.models.export.spi.ModelExporter;
 import org.apache.sling.models.factory.ExportException;
+import org.apache.sling.models.jacksonexporter.ModuleProvider;
 import org.jetbrains.annotations.NotNull;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
+import org.osgi.service.component.annotations.ReferencePolicy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.core.SerializableString;
 import com.fasterxml.jackson.core.io.CharacterEscapes;
+import com.fasterxml.jackson.databind.MapperFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
-import org.apache.sling.models.jacksonexporter.ModuleProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-@Component
-@Service
+@Component(service=ModelExporter.class)
 public class JacksonExporter implements ModelExporter {
 
     private static final Logger log = LoggerFactory.getLogger(JacksonExporter.class);
@@ -58,9 +56,8 @@ public class JacksonExporter implements ModelExporter {
 
     private static final int MAPPER_FEATURE_PREFIX_LENGTH = MAPPER_FEATURE_PREFIX.length();
 
-    @Reference(name = "moduleProvider", referenceInterface = ModuleProvider.class,
-            cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)
-    private final RankedServices<ModuleProvider> moduleProviders = new RankedServices<ModuleProvider>(Order.ASCENDING);
+    @Reference(name = "moduleProvider", cardinality = ReferenceCardinality.MULTIPLE, policy = ReferencePolicy.DYNAMIC)
+    private volatile List<ModuleProvider> moduleProviders;
 
     @Override
     public boolean isSupported(@NotNull Class<?> clazz) {
@@ -91,7 +88,10 @@ public class JacksonExporter implements ModelExporter {
                 }
             }
         }
-        for (ModuleProvider moduleProvider : moduleProviders) {
+        ReverseListIterator moduleProvidersReverseIterator = new ReverseListIterator(moduleProviders);
+        // going from one with lowest ranking to one with highest
+        while (moduleProvidersReverseIterator.hasNext()) {
+            ModuleProvider moduleProvider = (ModuleProvider)moduleProvidersReverseIterator.next();
             mapper.registerModule(moduleProvider.getModule());
         }
 
@@ -124,14 +124,6 @@ public class JacksonExporter implements ModelExporter {
         }
     }
 
-    protected void bindModuleProvider(final ModuleProvider moduleProvider, final Map<String, Object> props) {
-        moduleProviders.bind(moduleProvider, props);
-    }
-
-    protected void unbindModuleProvider(final ModuleProvider moduleProvider, final Map<String, Object> props) {
-        moduleProviders.unbind(moduleProvider, props);
-    }
-
     @Override
     public @NotNull String getName() {
         return "jackson";
diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/impl/RequestModuleProvider.java b/src/main/java/org/apache/sling/models/jacksonexporter/impl/RequestModuleProvider.java
index 0ee0d8c..70b1566 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/impl/RequestModuleProvider.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/impl/RequestModuleProvider.java
@@ -16,25 +16,20 @@
  */
 package org.apache.sling.models.jacksonexporter.impl;
 
-import com.fasterxml.jackson.databind.Module;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.databind.module.SimpleSerializers;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
+import java.util.Enumeration;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.resource.Resource;
 import org.apache.sling.models.jacksonexporter.ModuleProvider;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Component;
 
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-import java.util.Enumeration;
+import com.fasterxml.jackson.databind.Module;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 
-@Component
-@Service
-@Property(name = Constants.SERVICE_RANKING, intValue = 0)
+@Component(property=Constants.SERVICE_RANKING+":Integer=0", service=ModuleProvider.class)
 public class RequestModuleProvider implements ModuleProvider {
 
     private final SimpleModule moduleInstance;
diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/impl/ResourceModuleProvider.java b/src/main/java/org/apache/sling/models/jacksonexporter/impl/ResourceModuleProvider.java
index 343fd37..cfdb6fd 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/impl/ResourceModuleProvider.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/impl/ResourceModuleProvider.java
@@ -16,41 +16,35 @@
  */
 package org.apache.sling.models.jacksonexporter.impl;
 
-import com.fasterxml.jackson.databind.Module;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.databind.module.SimpleSerializers;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.models.jacksonexporter.ModuleProvider;
 import org.osgi.framework.Constants;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 
-import java.util.Map;
+import com.fasterxml.jackson.databind.Module;
+import com.fasterxml.jackson.databind.module.SimpleModule;
 
-@Component(metatype = true, label = "Apache Sling Models Jackson Exporter - Resource object support",
-    description = "Provider of a Jackson Module which enables support for proper serialization of Resource objects")
-@Service
-@Property(name = Constants.SERVICE_RANKING, intValue = 0, propertyPrivate = true)
+@Component(property=Constants.SERVICE_RANKING+":Integer=0", service=ModuleProvider.class)
+@Designate(ocd = ResourceModuleProvider.ResourceModuleProviderConfiguration.class)
 public class ResourceModuleProvider implements ModuleProvider {
 
-    private static final int DEFAULT_MAX_RECURSION_LEVELS = -1;
-
-    @Property(label = "Maximum Recursion Levels",
-            description = "Maximum number of levels of child resources which will be exported for each resource. Specify -1 for infinite.",
-            intValue = DEFAULT_MAX_RECURSION_LEVELS)
-    private static final String PROP_MAX_RECURSION_LEVELS = "max.recursion.levels";
-
     private SimpleModule moduleInstance;
+    
+    @ObjectClassDefinition(name = "Apache Sling Models Jackson Exporter - Resource object support", description = "Provider of a Jackson Module which enables support for proper serialization of Resource objects")
+    static @interface ResourceModuleProviderConfiguration {
+        @AttributeDefinition(name = "Maximum Recursion Levels", description = "Maximum number of levels of child resources which will be exported for each resource. Specify -1 for infinite." )
+        int max_recursion_levels() default -1;
+    }
 
     @Activate
-    private void activate(Map<String, Object> props) {
-        final int maxRecursionLevels = PropertiesUtil.toInteger(props.get(PROP_MAX_RECURSION_LEVELS), DEFAULT_MAX_RECURSION_LEVELS);
+    private void activate(ResourceModuleProviderConfiguration config) {
         this.moduleInstance = new SimpleModule();
         ModelSkippingSerializers serializers = new ModelSkippingSerializers();
-        serializers.addSerializer(Resource.class, new ResourceSerializer(maxRecursionLevels));
+        serializers.addSerializer(Resource.class, new ResourceSerializer(config.max_recursion_levels()));
         moduleInstance.setSerializers(serializers);
     }
 
diff --git a/src/main/java/org/apache/sling/models/jacksonexporter/package-info.java b/src/main/java/org/apache/sling/models/jacksonexporter/package-info.java
index 58da044..a21bfdd 100644
--- a/src/main/java/org/apache/sling/models/jacksonexporter/package-info.java
+++ b/src/main/java/org/apache/sling/models/jacksonexporter/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-@Version("1.0.0")
+@Version("1.0.1")
 package org.apache.sling.models.jacksonexporter;
 
-import aQute.bnd.annotation.Version;
\ No newline at end of file
+import org.osgi.annotation.versioning.Version;
\ No newline at end of file