Author: cziegeler
Date: Mon Mar 27 11:53:35 2017
New Revision: 1788910

URL: http://svn.apache.org/viewvc?rev=1788910&view=rev
Log:
SLING-6687 : Replace commons.json usage in org.apache.sling.adapter

Added:
    
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java
   (with props)
Modified:
    sling/trunk/bundles/extensions/adapter/pom.xml
    
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptor.java
    
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
    
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
    
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
    
sling/trunk/bundles/extensions/adapter/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java

Modified: sling/trunk/bundles/extensions/adapter/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/pom.xml?rev=1788910&r1=1788909&r2=1788910&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/adapter/pom.xml (original)
+++ sling/trunk/bundles/extensions/adapter/pom.xml Mon Mar 27 11:53:35 2017
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling</artifactId>
-        <version>26</version>
+        <version>30</version>
         <relativePath />
     </parent>
 
@@ -53,20 +53,10 @@
         <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>
-                        <Export-Package>
-                            org.apache.sling.adapter;version=2.1.0
-                        </Export-Package>
-                        <Private-Package>
-                            org.apache.sling.adapter.internal
-                        </Private-Package>
                         <Import-Package>
                             org.apache.sling.api.adapter;version="[2.2,2.3)",
                             *
@@ -98,44 +88,54 @@
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.osgi</artifactId>
-            <version>2.1.0</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.sling</groupId>
-            <artifactId>org.apache.sling.commons.json</artifactId>
-            <version>2.0.2-incubator</version>
+            <artifactId>org.apache.sling.commons.johnzon</artifactId>
+            <version>0.1.0-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.compendium</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
+            <artifactId>osgi.core</artifactId>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
         <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-simple</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>javax.servlet</groupId>
+            <artifactId>javax.servlet-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>servlet-api</artifactId>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.osgi</artifactId>
+            <version>2.1.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.commons.osgi</artifactId>
+            <version>2.1.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component</artifactId>
+            <version>1.3.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.event</artifactId>
+            <version>1.3.1</version>
+            <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.jmock</groupId>
@@ -148,9 +148,9 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-            <version>2.5</version>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.5</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptor.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptor.java?rev=1788910&r1=1788909&r2=1788910&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptor.java
 (original)
+++ 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptor.java
 Mon Mar 27 11:53:35 2017
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.adapter.internal;
 
+import org.apache.sling.adapter.Adaption;
 import org.apache.sling.api.adapter.AdapterFactory;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
@@ -34,15 +35,15 @@ public class AdapterFactoryDescriptor {
 
     private final String[] adapters;
 
-    private final ServiceReference reference;
+    private final ServiceReference<AdapterFactory> reference;
 
     private final ComponentContext context;
 
-    private ServiceRegistration adaption;
+    private volatile ServiceRegistration<Adaption> adaption;
 
     public AdapterFactoryDescriptor(
             final ComponentContext context,
-            final ServiceReference reference,
+            final ServiceReference<AdapterFactory> reference,
             final String[] adapters) {
         this.reference = reference;
         this.context = context;
@@ -51,7 +52,7 @@ public class AdapterFactoryDescriptor {
 
     public AdapterFactory getFactory() {
         if ( factory == null ) {
-            factory = (AdapterFactory) context.locateService(
+            factory = context.locateService(
                     "AdapterFactory", reference);
         }
         return factory;
@@ -61,11 +62,11 @@ public class AdapterFactoryDescriptor {
         return adapters;
     }
 
-    public ServiceRegistration getAdaption() {
+    public ServiceRegistration<Adaption> getAdaption() {
         return adaption;
     }
 
-    public void setAdaption(ServiceRegistration adaption) {
+    public void setAdaption(ServiceRegistration<Adaption> adaption) {
         this.adaption = adaption;
     }
 }

Modified: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java?rev=1788910&r1=1788909&r2=1788910&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
 (original)
+++ 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterFactoryDescriptorMap.java
 Mon Mar 27 11:53:35 2017
@@ -20,6 +20,7 @@ package org.apache.sling.adapter.interna
 
 import java.util.TreeMap;
 
+import org.apache.sling.api.adapter.AdapterFactory;
 import org.osgi.framework.ServiceReference;
 
 /**
@@ -36,7 +37,7 @@ import org.osgi.framework.ServiceReferen
  * removed the eventual second instance may actually be used instead.
  */
 public class AdapterFactoryDescriptorMap extends
-        TreeMap<ServiceReference, AdapterFactoryDescriptor> {
+        TreeMap<ServiceReference<AdapterFactory>, AdapterFactoryDescriptor> {
 
     private static final long serialVersionUID = 2L;
 

Modified: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java?rev=1788910&r1=1788909&r2=1788910&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java
 Mon Mar 27 11:53:35 2017
@@ -32,13 +32,6 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-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.adapter.Adaption;
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.adapter.AdapterFactory;
@@ -49,6 +42,10 @@ import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
+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.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
 import org.osgi.service.packageadmin.PackageAdmin;
@@ -61,15 +58,11 @@ import org.slf4j.LoggerFactory;
  * interface to be used by any clients.
  *
  */
-@Component(immediate=true)
-@Service
-@Properties({
-    @Property(name=Constants.SERVICE_DESCRIPTION, value="Sling Adapter 
Manager"),
-    @Property(name=Constants.SERVICE_VENDOR, value="The Apache Software 
Foundation")
-
-})
-@Reference(name="AdapterFactory", referenceInterface=AdapterFactory.class,
-cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, 
policy=ReferencePolicy.DYNAMIC)
+@Component(service = AdapterManager.class, immediate=true,
+    property = {
+            Constants.SERVICE_DESCRIPTION + "=Sling Adapter Manager",
+            Constants.SERVICE_VENDOR + "=The Apache Software Foundation"
+    })
 public class AdapterManagerImpl implements AdapterManager {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -85,7 +78,7 @@ public class AdapterManagerImpl implemen
      * the manager has been activated. These bound services will be accessed as
      * soon as the manager is being activated.
      */
-    private final List<ServiceReference> boundAdapterFactories = new 
LinkedList<ServiceReference>();
+    private final List<ServiceReference<AdapterFactory>> boundAdapterFactories 
= new LinkedList<>();
 
     /**
      * A map of {@link AdapterFactoryDescriptorMap} instances. The map is
@@ -95,7 +88,7 @@ public class AdapterManagerImpl implemen
      *
      * @see AdapterFactoryDescriptorMap
      */
-    private final Map<String, AdapterFactoryDescriptorMap> descriptors = new 
HashMap<String, AdapterFactoryDescriptorMap>();
+    private final Map<String, AdapterFactoryDescriptorMap> descriptors = new 
HashMap<>();
 
     /**
      * Matrix of {@link AdapterFactoryDescriptor} instances primarily indexed 
by the fully
@@ -107,12 +100,12 @@ public class AdapterManagerImpl implemen
      * whenever an adapter factory is registered on unregistered.
      */
     private final ConcurrentMap<String, Map<String, 
List<AdapterFactoryDescriptor>>> factoryCache
-    = new ConcurrentHashMap<String, Map<String, 
List<AdapterFactoryDescriptor>>>();
+    = new ConcurrentHashMap<>();
 
     /**
      * The service tracker for the event admin
      */
-    @Reference(cardinality=ReferenceCardinality.OPTIONAL_UNARY, 
policy=ReferencePolicy.DYNAMIC)
+    @Reference(cardinality=ReferenceCardinality.OPTIONAL, 
policy=ReferencePolicy.DYNAMIC)
     private volatile EventAdmin eventAdmin;
 
     @Reference
@@ -126,6 +119,7 @@ public class AdapterManagerImpl implemen
      *
      * @see 
org.apache.sling.api.adapter.AdapterManager#getAdapter(java.lang.Object, 
java.lang.Class)
      */
+    @Override
     public <AdapterType> AdapterType getAdapter(final Object adaptable,
             final Class<AdapterType> type) {
 
@@ -171,12 +165,12 @@ public class AdapterManagerImpl implemen
         this.context = context;
 
         // register all adapter factories bound before activation
-        final List<ServiceReference> refs;
+        final List<ServiceReference<AdapterFactory>> refs;
         synchronized ( this.boundAdapterFactories ) {
-            refs = new ArrayList<ServiceReference>(this.boundAdapterFactories);
+            refs = new ArrayList<>(this.boundAdapterFactories);
             boundAdapterFactories.clear();
         }
-        for (final ServiceReference reference : refs) {
+        for (final ServiceReference<AdapterFactory> reference : refs) {
             registerAdapterFactory(context, reference);
         }
 
@@ -196,7 +190,9 @@ public class AdapterManagerImpl implemen
     /**
      * Bind a new adapter factory.
      */
-    protected void bindAdapterFactory(final ServiceReference reference) {
+    @Reference(name="AdapterFactory", service=AdapterFactory.class,
+            cardinality=ReferenceCardinality.MULTIPLE, 
policy=ReferencePolicy.DYNAMIC)
+    protected void bindAdapterFactory(final ServiceReference<AdapterFactory> 
reference) {
         boolean create = true;
         if (context == null) {
             synchronized ( this.boundAdapterFactories ) {
@@ -214,7 +210,7 @@ public class AdapterManagerImpl implemen
     /**
      * Unbind a adapter factory.
      */
-    protected void unbindAdapterFactory(final ServiceReference reference) {
+    protected void unbindAdapterFactory(final ServiceReference<AdapterFactory> 
reference) {
         unregisterAdapterFactory(reference);
     }
 
@@ -245,7 +241,7 @@ public class AdapterManagerImpl implemen
      * <code>reference</code> from the registry.
      */
     private void registerAdapterFactory(final ComponentContext context,
-            final ServiceReference reference) {
+            final ServiceReference<AdapterFactory> reference) {
         final String[] adaptables = 
PropertiesUtil.toStringArray(reference.getProperty(ADAPTABLE_CLASSES));
         final String[] adapters = 
PropertiesUtil.toStringArray(reference.getProperty(ADAPTER_CLASSES));
 
@@ -287,12 +283,12 @@ public class AdapterManagerImpl implemen
         this.factoryCache.clear();
 
         // register adaption
-        final Dictionary<String, Object> props = new Hashtable<String, 
Object>();
+        final Dictionary<String, Object> props = new Hashtable<>();
         props.put(SlingConstants.PROPERTY_ADAPTABLE_CLASSES, adaptables);
         props.put(SlingConstants.PROPERTY_ADAPTER_CLASSES, adapters);
 
-        ServiceRegistration adaptionRegistration = 
this.context.getBundleContext().registerService(
-                Adaption.class.getName(), AdaptionImpl.INSTANCE, props);
+        ServiceRegistration<Adaption> adaptionRegistration = 
this.context.getBundleContext().registerService(
+                Adaption.class, AdaptionImpl.INSTANCE, props);
         if (log.isDebugEnabled()) {
             log.debug("Registered service {} with {} : {} and {} : {}", new 
Object[] { Adaption.class.getName(),
                     SlingConstants.PROPERTY_ADAPTABLE_CLASSES, 
Arrays.toString(adaptables),
@@ -307,7 +303,7 @@ public class AdapterManagerImpl implemen
                     props));
         }
     }
-    
+
     static String getPackageName(String clazz) {
         final int lastDot = clazz.lastIndexOf('.');
         return lastDot <= 0 ? "" : clazz.substring(0, lastDot);
@@ -316,13 +312,13 @@ public class AdapterManagerImpl implemen
     /**
      * Check that the package containing the class is exported or is a java.*
      * class.
-     * 
+     *
      * @param packageAdmin the PackageAdmin service
      * @param clazz the class name
      * @return true if the package is exported
      */
     static boolean checkPackage(PackageAdmin packageAdmin, String clazz) {
-        final String packageName = getPackageName(clazz); 
+        final String packageName = getPackageName(clazz);
         if (packageName.startsWith("java.")) {
             return true;
         }
@@ -333,7 +329,7 @@ public class AdapterManagerImpl implemen
      * Unregisters the {@link AdapterFactory} referred to by the service
      * <code>reference</code> from the registry.
      */
-    private void unregisterAdapterFactory(final ServiceReference reference) {
+    private void unregisterAdapterFactory(final 
ServiceReference<AdapterFactory> reference) {
         synchronized ( this.boundAdapterFactories ) {
             boundAdapterFactories.remove(reference);
         }
@@ -389,7 +385,7 @@ public class AdapterManagerImpl implemen
         // send event
         final EventAdmin localEA = this.eventAdmin;
         if ( localEA != null ) {
-            final Dictionary<String, Object> props = new Hashtable<String, 
Object>();
+            final Dictionary<String, Object> props = new Hashtable<>();
             props.put(SlingConstants.PROPERTY_ADAPTABLE_CLASSES, adaptables);
             props.put(SlingConstants.PROPERTY_ADAPTER_CLASSES, adapters);
             localEA.postEvent(new 
Event(SlingConstants.TOPIC_ADAPTER_FACTORY_REMOVED,
@@ -433,7 +429,7 @@ public class AdapterManagerImpl implemen
      *         <code>clazz</code>.
      */
     private Map<String, List<AdapterFactoryDescriptor>> 
createAdapterFactoryMap(final Class<?> clazz) {
-        final Map<String, List<AdapterFactoryDescriptor>> afm = new 
HashMap<String, List<AdapterFactoryDescriptor>>();
+        final Map<String, List<AdapterFactoryDescriptor>> afm = new 
HashMap<>();
 
         // AdapterFactories for this class
         AdapterFactoryDescriptorMap afdMap = null;
@@ -443,7 +439,7 @@ public class AdapterManagerImpl implemen
         if (afdMap != null) {
             final List<AdapterFactoryDescriptor> afdSet;
             synchronized ( afdMap ) {
-                afdSet = new 
ArrayList<AdapterFactoryDescriptor>(afdMap.values());
+                afdSet = new ArrayList<>(afdMap.values());
             }
             for (final AdapterFactoryDescriptor afd : afdSet) {
                 final String[] adapters = afd.getAdapters();
@@ -451,7 +447,7 @@ public class AdapterManagerImpl implemen
                     // to handle service ranking, we add to the end of the 
list or create a new list
                     List<AdapterFactoryDescriptor> factoryDescriptors = 
afm.get(adapter);
                     if (factoryDescriptors == null) {
-                        factoryDescriptors = new 
ArrayList<AdapterFactoryDescriptor>();
+                        factoryDescriptors = new ArrayList<>();
                         afm.put(adapter, factoryDescriptors);
                     }
                     factoryDescriptors.add(afd);
@@ -498,7 +494,7 @@ public class AdapterManagerImpl implemen
             List<AdapterFactoryDescriptor> factoryDescriptors = 
dest.get(entry.getKey());
 
             if (factoryDescriptors == null) {
-                factoryDescriptors = new ArrayList<AdapterFactoryDescriptor>();
+                factoryDescriptors = new ArrayList<>();
                 dest.put(entry.getKey(), factoryDescriptors);
             }
             for (AdapterFactoryDescriptor descriptor : entry.getValue()) {

Modified: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java?rev=1788910&r1=1788909&r2=1788910&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
 (original)
+++ 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/internal/AdapterWebConsolePlugin.java
 Mon Mar 27 11:53:35 2017
@@ -22,6 +22,7 @@ import static org.apache.sling.api.adapt
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
+import java.io.StringReader;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -32,6 +33,15 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import javax.json.Json;
+import javax.json.JsonArray;
+import javax.json.JsonArrayBuilder;
+import javax.json.JsonException;
+import javax.json.JsonNumber;
+import javax.json.JsonObject;
+import javax.json.JsonObjectBuilder;
+import javax.json.JsonString;
+import javax.json.JsonValue;
 import javax.servlet.Servlet;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -39,16 +49,8 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.builder.CompareToBuilder;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Properties;
-import org.apache.felix.scr.annotations.Property;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.Service;
+import org.apache.commons.lang3.builder.CompareToBuilder;
 import org.apache.sling.api.adapter.AdapterFactory;
-import org.apache.sling.commons.json.JSONArray;
-import org.apache.sling.commons.json.JSONException;
-import org.apache.sling.commons.json.JSONObject;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
@@ -59,22 +61,25 @@ import org.osgi.framework.Filter;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@Component
-@Service(Servlet.class)
-@Properties({ @Property(name = Constants.SERVICE_DESCRIPTION, value = "Adapter 
Web Console Plugin"),
-    @Property(name = Constants.SERVICE_VENDOR, value = "The Apache Software 
Foundation"),
-    @Property(name = "felix.webconsole.label", value = "adapters"),
-    @Property(name = "felix.webconsole.title", value = "Sling Adapters"),
-    @Property(name = "felix.webconsole.css", value = 
"/adapters/res/ui/adapters.css"),
-    @Property(name = "felix.webconsole.configprinter.modes", value = "always"),
-    @Property(name = "felix.webconsole.category", value = "Sling")})
 @SuppressWarnings("serial")
+@Component(service = Servlet.class,
+    property = {
+            Constants.SERVICE_DESCRIPTION + "=Adapter Web Console Plugin",
+            Constants.SERVICE_VENDOR + "=The Apache Software Foundation",
+            "felix.webconsole.label=adapters",
+            "felix.webconsole.title=Sling Adapters",
+            "felix.webconsole.css=/adapters/res/ui/adapters.css",
+            "felix.webconsole.configprinter.modes=always",
+            "felix.webconsole.category=Sling"
+    })
 public class AdapterWebConsolePlugin extends HttpServlet implements 
ServiceTrackerCustomizer, BundleListener {
 
     private static final int INDENT = 4;
@@ -84,7 +89,7 @@ public class AdapterWebConsolePlugin ext
     private static final String ADAPTER_DEPRECATED = "adapter.deprecated";
 
     private final Logger logger = 
LoggerFactory.getLogger(AdapterWebConsolePlugin.class);
-    
+
     @Reference
     private PackageAdmin packageAdmin;
 
@@ -96,6 +101,7 @@ public class AdapterWebConsolePlugin ext
 
     private BundleContext bundleContext;
 
+    @Override
     public Object addingService(final ServiceReference reference) {
         final Object service = this.bundleContext.getService(reference);
         addServiceMetadata(reference, service);
@@ -107,7 +113,7 @@ public class AdapterWebConsolePlugin ext
         final String condition = 
PropertiesUtil.toString(reference.getProperty(ADAPTER_CONDITION), null);
         final boolean deprecated = 
PropertiesUtil.toBoolean(reference.getProperty(ADAPTER_DEPRECATED), false);
         final String[] adaptables = 
PropertiesUtil.toStringArray(reference.getProperty(ADAPTABLE_CLASSES));
-        final List<AdaptableDescription> descriptions = new 
ArrayList<AdaptableDescription>(adaptables.length);
+        final List<AdaptableDescription> descriptions = new 
ArrayList<>(adaptables.length);
         for (final String adaptable : adaptables) {
             descriptions.add(new AdaptableDescription(reference.getBundle(), 
adaptable, adapters, condition, deprecated));
         }
@@ -117,6 +123,7 @@ public class AdapterWebConsolePlugin ext
         }
     }
 
+    @Override
     public void bundleChanged(final BundleEvent event) {
         if (event.getType() == BundleEvent.STOPPED) {
             removeBundle(event.getBundle());
@@ -125,10 +132,12 @@ public class AdapterWebConsolePlugin ext
         }
     }
 
+    @Override
     public void modifiedService(final ServiceReference reference, final Object 
service) {
         addServiceMetadata(reference, service);
     }
 
+    @Override
     public void removedService(final ServiceReference reference, final Object 
service) {
         synchronized (this) {
             adapterServiceReferences.remove(reference);
@@ -138,7 +147,7 @@ public class AdapterWebConsolePlugin ext
 
     @SuppressWarnings("unchecked")
     private void addBundle(final Bundle bundle) {
-        final List<AdaptableDescription> descs = new 
ArrayList<AdaptableDescription>();
+        final List<AdaptableDescription> descs = new ArrayList<>();
         try {
             final Enumeration<URL> files = 
bundle.getResources("SLING-INF/adapters.json");
             if (files != null) {
@@ -146,18 +155,20 @@ public class AdapterWebConsolePlugin ext
                     final InputStream stream = 
files.nextElement().openStream();
                     final String contents = IOUtils.toString(stream);
                     IOUtils.closeQuietly(stream);
-                    final JSONObject obj = new JSONObject(contents);
-                    for (final Iterator<String> adaptableNames = obj.keys(); 
adaptableNames.hasNext();) {
+                    Map<String, Object> config = new HashMap<>();
+                    config.put("org.apache.johnzon.supports-comments", true);
+                    final JsonObject obj = 
Json.createReaderFactory(config).createReader(new 
StringReader(contents)).readObject();
+                    for (final Iterator<String> adaptableNames = 
obj.keySet().iterator(); adaptableNames.hasNext();) {
                         final String adaptableName = adaptableNames.next();
-                        final JSONObject adaptable = 
obj.getJSONObject(adaptableName);
-                        for (final Iterator<String> conditions = 
adaptable.keys(); conditions.hasNext();) {
+                        final JsonObject adaptable = 
obj.getJsonObject(adaptableName);
+                        for (final Iterator<String> conditions = 
adaptable.keySet().iterator(); conditions.hasNext();) {
                             final String condition = conditions.next();
                             String[] adapters;
                             final Object value = adaptable.get(condition);
-                            if (value instanceof JSONArray) {
-                                adapters = toStringArray((JSONArray) value);
+                            if (value instanceof JsonArray) {
+                                adapters = toStringArray((JsonArray) value);
                             } else {
-                                adapters = new String[] { value.toString() };
+                                adapters = new String[] { 
unbox(value).toString() };
                             }
                             descs.add(new AdaptableDescription(bundle, 
adaptableName, adapters, condition, false));
                         }
@@ -172,7 +183,7 @@ public class AdapterWebConsolePlugin ext
             }
         } catch (final IOException e) {
             logger.error("Unable to load adapter descriptors for bundle " + 
bundle, e);
-        } catch (final JSONException e) {
+        } catch (final JsonException e) {
             logger.error("Unable to load adapter descriptors for bundle " + 
bundle, e);
         } catch (IllegalStateException e) {
             logger.debug("Unable to load adapter descriptors for bundle " + 
bundle);
@@ -180,12 +191,32 @@ public class AdapterWebConsolePlugin ext
 
     }
 
-    private String[] toStringArray(final JSONArray value) throws JSONException 
{
-        final List<String> result = new ArrayList<String>(value.length());
-        for (int i = 0; i < value.length(); i++) {
+    private Object unbox(Object o) {
+        if (o instanceof JsonValue) {
+            switch (((JsonValue)o).getValueType()) {
+                case FALSE:
+                    return false;
+                case TRUE:
+                    return true;
+                case NULL:
+                    return null;
+                case NUMBER:
+                    return ((JsonNumber) o).isIntegral() ? 
((JsonNumber)o).longValue() : ((JsonNumber) o).doubleValue();
+                case STRING:
+                    return ((JsonString) o).getString();
+                default:
+                    return o;
+            }
+        }
+        return o;
+    }
+
+    private String[] toStringArray(final JsonArray value) {
+        final List<String> result = new ArrayList<>(value.size());
+        for (int i = 0; i < value.size(); i++) {
             result.add(value.getString(i));
         }
-        return result.toArray(new String[value.length()]);
+        return result.toArray(new String[value.size()]);
     }
 
     private void removeBundle(final Bundle bundle) {
@@ -196,7 +227,7 @@ public class AdapterWebConsolePlugin ext
     }
 
     private void update() {
-        final List<AdaptableDescription> newList = new 
ArrayList<AdaptableDescription>();
+        final List<AdaptableDescription> newList = new ArrayList<>();
         for (final List<AdaptableDescription> descriptions : 
adapterServiceReferences.values()) {
             newList.addAll(descriptions);
         }
@@ -209,8 +240,8 @@ public class AdapterWebConsolePlugin ext
 
     protected void activate(final ComponentContext ctx) throws 
InvalidSyntaxException {
         this.bundleContext = ctx.getBundleContext();
-        this.adapterServiceReferences = new HashMap<ServiceReference, 
List<AdaptableDescription>>();
-        this.adapterBundles = new HashMap<Bundle, 
List<AdaptableDescription>>();
+        this.adapterServiceReferences = new HashMap<>();
+        this.adapterBundles = new HashMap<>();
         for (final Bundle bundle : this.bundleContext.getBundles()) {
             if (bundle.getState() == Bundle.ACTIVE) {
                 addBundle(bundle);
@@ -243,22 +274,56 @@ public class AdapterWebConsolePlugin ext
     private void getJson(final HttpServletResponse resp) throws 
ServletException, IOException {
         resp.setContentType("application/json");
         try {
-            final JSONObject obj = new JSONObject();
+            Map<String, Map<String, List<String>>> values = new HashMap<>();
             for (final AdaptableDescription desc : allAdaptables) {
-                final JSONObject adaptableObj;
-                if (obj.has(desc.adaptable)) {
-                    adaptableObj = obj.getJSONObject(desc.adaptable);
-                } else {
-                    adaptableObj = new JSONObject();
-                    obj.put(desc.adaptable, adaptableObj);
+                final Map<String, List<String>> adaptableObj;
+                if (values.containsKey(desc.adaptable))
+                {
+                    adaptableObj = values.get(desc.adaptable);
+                }
+                else {
+                    adaptableObj = new HashMap<>();
+                    values.put(desc.adaptable, adaptableObj);
                 }
                 for (final String adapter : desc.adapters) {
-                    adaptableObj.accumulate(desc.condition == null ? "" : 
desc.condition, adapter);
+                    List<String> conditions = adaptableObj.get(desc.condition 
== null ? "" : desc.condition);
+                    if (conditions == null)
+                    {
+                        conditions = new ArrayList<>();
+                        adaptableObj.put(desc.condition == null ? "" : 
desc.condition, conditions);
+                    }
+                    conditions.add(adapter);
+                }
+
+            }
+            final JsonObjectBuilder obj = Json.createObjectBuilder();
+
+            for (Map.Entry<String, Map<String, List<String>>> entry : 
values.entrySet())
+            {
+                JsonObjectBuilder adaptable = Json.createObjectBuilder();
+
+                for (Map.Entry<String, List<String>> subEnty : 
entry.getValue().entrySet())
+                {
+                    if (subEnty.getValue().size() > 1)
+                    {
+                        JsonArrayBuilder array = Json.createArrayBuilder();
+                        for (String condition : subEnty.getValue())
+                        {
+                            array.add(condition);
+                        }
+                        adaptable.add(subEnty.getKey(),  array);
+                    }
+                    else
+                    {
+                        adaptable.add(subEnty.getKey(), 
subEnty.getValue().get(0));
+                    }
                 }
 
+                obj.add(entry.getKey(), adaptable);
             }
-            resp.getWriter().println(obj.toString(INDENT));
-        } catch (final JSONException e) {
+
+            Json.createGenerator(resp.getWriter()).write(obj.build()).flush();
+        } catch (final JsonException e) {
             throw new ServletException("Unable to produce JSON", e);
         }
     }
@@ -369,6 +434,7 @@ public class AdapterWebConsolePlugin ext
                             + ", condition=" + this.condition + ", bundle=" + 
this.bundle + ", deprecated= " + this.deprecated + "]";
         }
 
+        @Override
         public int compareTo(final AdaptableDescription o) {
             return new CompareToBuilder().append(this.adaptable, 
o.adaptable).append(this.condition, o.condition)
                             .append(this.adapters.length, o.adapters.length)

Added: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java?rev=1788910&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java
 (added)
+++ 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java
 Mon Mar 27 11:53:35 2017
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+
+@Version("2.1.0")
+package org.apache.sling.adapter;
+
+import org.osgi.annotation.versioning.Version;
+

Propchange: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/bundles/extensions/adapter/src/main/java/org/apache/sling/adapter/package-info.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Modified: 
sling/trunk/bundles/extensions/adapter/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/adapter/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java?rev=1788910&r1=1788909&r2=1788910&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/adapter/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/adapter/src/test/java/org/apache/sling/adapter/internal/AdapterManagerTest.java
 Mon Mar 27 11:53:35 2017
@@ -18,6 +18,14 @@
  */
 package org.apache.sling.adapter.internal;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Dictionary;
+import java.util.Map;
+
 import org.apache.sling.adapter.Adaption;
 import org.apache.sling.adapter.mock.MockAdapterFactory;
 import org.apache.sling.api.adapter.AdapterFactory;
@@ -39,14 +47,7 @@ import org.osgi.service.component.Compon
 import org.osgi.service.packageadmin.ExportedPackage;
 import org.osgi.service.packageadmin.PackageAdmin;
 
-import java.util.Dictionary;
-import java.util.Map;
-
 import junitx.util.PrivateAccessor;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 @RunWith(JMock.class)
 public class AdapterManagerTest {
@@ -100,7 +101,7 @@ public class AdapterManagerTest {
             allowing(bundleCtx).getServiceReferences(with(any(String.class)), 
with(any(String.class)));
             will(returnValue(null));
             
allowing(bundleCtx).removeServiceListener(with(any(ServiceListener.class)));
-            
allowing(bundleCtx).registerService(with(Adaption.class.getName()), 
with(AdaptionImpl.INSTANCE), with(any(Dictionary.class)));
+            allowing(bundleCtx).registerService(with(Adaption.class), 
with(AdaptionImpl.INSTANCE), with(any(Dictionary.class)));
             will(returnValue(null));
         }});
         return ctx;
@@ -126,14 +127,14 @@ public class AdapterManagerTest {
             allowing(bundleCtx).getServiceReferences(with(any(String.class)), 
with(any(String.class)));
             will(returnValue(null));
             
allowing(bundleCtx).removeServiceListener(with(any(ServiceListener.class)));
-            
allowing(bundleCtx).registerService(with(Adaption.class.getName()), 
with(AdaptionImpl.INSTANCE), with(any(Dictionary.class)));
+            allowing(bundleCtx).registerService(with(Adaption.class), 
with(AdaptionImpl.INSTANCE), with(any(Dictionary.class)));
             will(returnValue(null));
         }});
         return ctx;
     }
 
     public static <T> Matcher<T> any(Class<T> type) {
-        return new IsAnything<T>();
+        return new IsAnything<>();
     }
 
     /**
@@ -156,21 +157,25 @@ public class AdapterManagerTest {
             this.classes = classes;
         }
 
+        @Override
         public boolean isAssignableTo(Bundle bundle, String className) {
             // TODO Auto-generated method stub
             return false;
         }
 
+        @Override
         public Bundle[] getUsingBundles() {
             // TODO Auto-generated method stub
             return null;
         }
 
+        @Override
         public String[] getPropertyKeys() {
             // TODO Auto-generated method stub
             return null;
         }
 
+        @Override
         public Object getProperty(String key) {
             if ( key.equals(Constants.SERVICE_RANKING) ) {
                 return ranking;
@@ -185,11 +190,13 @@ public class AdapterManagerTest {
             return null;
         }
 
+        @Override
         public Bundle getBundle() {
             // TODO Auto-generated method stub
             return null;
         }
 
+        @Override
         public int compareTo(Object reference) {
             Integer ranking1 = (Integer)getProperty(Constants.SERVICE_RANKING);
             Integer ranking2 = 
(Integer)((ServiceReference)reference).getProperty(Constants.SERVICE_RANKING);
@@ -493,6 +500,7 @@ public class AdapterManagerTest {
 
     public class FirstImplementationAdapterFactory implements AdapterFactory {
 
+        @Override
         @SuppressWarnings("unchecked")
         public <AdapterType> AdapterType getAdapter(Object adaptable, 
Class<AdapterType> type) {
             if (adaptable instanceof AdapterObject) {
@@ -511,6 +519,7 @@ public class AdapterManagerTest {
 
     public class SecondImplementationAdapterFactory implements AdapterFactory {
 
+        @Override
         @SuppressWarnings("unchecked")
         public <AdapterType> AdapterType getAdapter(Object adaptable, 
Class<AdapterType> type) {
             if (adaptable instanceof AdapterObject) {


Reply via email to