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) {