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:45 UTC

[sling-org-apache-sling-models-jacksonexporter] branch feature/osgi-annotations created (now dd43f2d)

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

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


      at dd43f2d  SLING-8452 migrate to OSGi R6 annotations

This branch includes the following new commits:

     new dd43f2d  SLING-8452 migrate to OSGi R6 annotations

The 1 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.



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

Posted by kw...@apache.org.
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