From scm-return-50684-archive-asf-public=cust-asf.ponee.io@geronimo.apache.org Fri Jun 22 23:00:39 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id CE6FC180647 for ; Fri, 22 Jun 2018 23:00:38 +0200 (CEST) Received: (qmail 11244 invoked by uid 500); 22 Jun 2018 21:00:37 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 11235 invoked by uid 99); 22 Jun 2018 21:00:37 -0000 Received: from Unknown (HELO svn01-us-west.apache.org) (209.188.14.144) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 22 Jun 2018 21:00:37 +0000 Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 180DF3A0096 for ; Fri, 22 Jun 2018 21:00:36 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1834162 - in /geronimo/specs/trunk: geronimo-json_1.0_spec/pom.xml geronimo-json_1.0_spec/src/main/java/javax/json/spi/JsonProvider.java geronimo-json_1.1_spec/pom.xml geronimo-json_1.1_spec/src/main/java/javax/json/spi/JsonProvider.java Date: Fri, 22 Jun 2018 21:00:36 -0000 To: scm@geronimo.apache.org From: rotty3000@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20180622210037.180DF3A0096@svn01-us-west.apache.org> Author: rotty3000 Date: Fri Jun 22 21:00:36 2018 New Revision: 1834162 URL: http://svn.apache.org/viewvc?rev=1834162&view=rev Log: GERONIMO-6560 JSON spec jar is not able to load provider in an OSGi environment Based on https://github.com/apache/geronimo-specs/pull/6 by @sseifert Signed-off-by: Raymond Auge Modified: geronimo/specs/trunk/geronimo-json_1.0_spec/pom.xml geronimo/specs/trunk/geronimo-json_1.0_spec/src/main/java/javax/json/spi/JsonProvider.java geronimo/specs/trunk/geronimo-json_1.1_spec/pom.xml geronimo/specs/trunk/geronimo-json_1.1_spec/src/main/java/javax/json/spi/JsonProvider.java Modified: geronimo/specs/trunk/geronimo-json_1.0_spec/pom.xml URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-json_1.0_spec/pom.xml?rev=1834162&r1=1834161&r2=1834162&view=diff ============================================================================== --- geronimo/specs/trunk/geronimo-json_1.0_spec/pom.xml (original) +++ geronimo/specs/trunk/geronimo-json_1.0_spec/pom.xml Fri Jun 22 21:00:36 2018 @@ -100,6 +100,10 @@ ='1.0' ]]> + Modified: geronimo/specs/trunk/geronimo-json_1.0_spec/src/main/java/javax/json/spi/JsonProvider.java URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-json_1.0_spec/src/main/java/javax/json/spi/JsonProvider.java?rev=1834162&r1=1834161&r2=1834162&view=diff ============================================================================== --- geronimo/specs/trunk/geronimo-json_1.0_spec/src/main/java/javax/json/spi/JsonProvider.java (original) +++ geronimo/specs/trunk/geronimo-json_1.0_spec/src/main/java/javax/json/spi/JsonProvider.java Fri Jun 22 21:00:36 2018 @@ -28,21 +28,16 @@ import javax.json.stream.JsonGenerator; import javax.json.stream.JsonGeneratorFactory; import javax.json.stream.JsonParser; import javax.json.stream.JsonParserFactory; -import java.io.BufferedReader; -import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; import java.lang.ref.WeakReference; -import java.lang.reflect.Method; -import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; -import java.util.Enumeration; -import java.util.List; +import java.util.Iterator; import java.util.Map; +import java.util.ServiceLoader; import java.util.WeakHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; @@ -155,17 +150,8 @@ public abstract class JsonProvider { if (tccl == null) { tccl = ClassLoader.getSystemClassLoader(); } - try { - final Class clazz = Class.forName("org.apache.geronimo.osgi.locator.ProviderLocator"); - final Method getServices = clazz.getDeclaredMethod("getServices", String.class, Class.class, ClassLoader.class); - final List osgiProviders = (List) getServices.invoke(null, JsonProvider.class.getName(), JsonProvider.class, tccl); - if (osgiProviders != null && !osgiProviders.isEmpty()) { - return osgiProviders.iterator().next(); - } - } catch (final Throwable e) { - // locator not available, try normal mode - } + // try to load provider specified via system property final String className = System.getProperty(JsonProvider.class.getName()); if (className != null) { try { @@ -175,47 +161,13 @@ public abstract class JsonProvider { } } - // don't use Class.forName() to avoid to bind class to tccl if thats a classloader facade - // so implementing a simple SPI when ProviderLocator is not here - final String name = "META-INF/services/" + JsonProvider.class.getName(); - try { - final Enumeration configs = tccl.getResources(name); - if (configs.hasMoreElements()) { - InputStream in = null; - BufferedReader r = null; - try { - in = configs.nextElement().openStream(); - r = new BufferedReader(new InputStreamReader(in, "utf-8")); - String l; - while ((l = r.readLine()) != null) { - if (l.startsWith("#")) { - continue; - } - return JsonProvider.class.cast(tccl.loadClass(l).newInstance()); - } - } catch (final IOException x) { - // no-op - } finally { - try { - if (r != null) { - r.close(); - } - } catch (final IOException y) { - // no-op - } - try { - if (in != null) { - in.close(); - } - } catch (final IOException y) { - // no-op - } - } - } - } catch (final Exception ex) { - // no-op + // try to load via ServiceLoader (as registered in META-INF/services) + Iterator providers = ServiceLoader.load(JsonProvider.class).iterator(); + if (providers.hasNext()) { + return providers.next(); } + // try to load to default provider try { return JsonProvider.class.cast(tccl.loadClass(DEFAULT_PROVIDER).newInstance()); } catch (final Throwable cnfe) { @@ -224,4 +176,3 @@ public abstract class JsonProvider { } } } - Modified: geronimo/specs/trunk/geronimo-json_1.1_spec/pom.xml URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-json_1.1_spec/pom.xml?rev=1834162&r1=1834161&r2=1834162&view=diff ============================================================================== --- geronimo/specs/trunk/geronimo-json_1.1_spec/pom.xml (original) +++ geronimo/specs/trunk/geronimo-json_1.1_spec/pom.xml Fri Jun 22 21:00:36 2018 @@ -86,6 +86,10 @@ ='1.1,1.0' ]]> + Modified: geronimo/specs/trunk/geronimo-json_1.1_spec/src/main/java/javax/json/spi/JsonProvider.java URL: http://svn.apache.org/viewvc/geronimo/specs/trunk/geronimo-json_1.1_spec/src/main/java/javax/json/spi/JsonProvider.java?rev=1834162&r1=1834161&r2=1834162&view=diff ============================================================================== --- geronimo/specs/trunk/geronimo-json_1.1_spec/src/main/java/javax/json/spi/JsonProvider.java (original) +++ geronimo/specs/trunk/geronimo-json_1.1_spec/src/main/java/javax/json/spi/JsonProvider.java Fri Jun 22 21:00:36 2018 @@ -55,8 +55,10 @@ import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; /** * JsonProvider is the actual implementation of all the Json logic. @@ -88,69 +90,30 @@ public abstract class JsonProvider { } private static JsonProvider doLoadProvider() throws JsonException { - final ClassLoader tccl = Thread.currentThread().getContextClassLoader(); - try { - final Class clazz = Class.forName("org.apache.geronimo.osgi.locator.ProviderLocator"); - final Method getServices = clazz.getDeclaredMethod("getServices", String.class, Class.class, ClassLoader.class); - final List osgiProviders = (List) getServices.invoke(null, JsonProvider.class.getName(), JsonProvider.class, tccl); - if (osgiProviders != null && !osgiProviders.isEmpty()) { - return osgiProviders.iterator().next(); - } - } catch (final Throwable e) { - // locator not available, try normal mode + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + if (tccl == null) { + tccl = ClassLoader.getSystemClassLoader(); } - // don't use Class.forName() to avoid to bind class to tccl if thats a classloader facade - // so implementing a simple SPI when ProviderLocator is not here - final String name = "META-INF/services/" + JsonProvider.class.getName(); - try { - Enumeration configs; - if (tccl == null) { - configs = ClassLoader.getSystemResources(name); - } else { - configs = tccl.getResources(name); + // try to load provider specified via system property + final String className = System.getProperty(JsonProvider.class.getName()); + if (className != null) { + try { + return JsonProvider.class.cast(tccl.loadClass(className.trim()).newInstance()); + } catch (final Exception e) { + throw new JsonException("Specified provider as system property can't be loaded: " + className, e); } + } - if (configs.hasMoreElements()) { - InputStream in = null; - BufferedReader r = null; - final List names = new ArrayList(); - try { - in = configs.nextElement().openStream(); - r = new BufferedReader(new InputStreamReader(in, "utf-8")); - String l; - while ((l = r.readLine()) != null) { - if (l.startsWith("#")) { - continue; - } - return JsonProvider.class.cast(tccl.loadClass(l).newInstance()); - } - } catch (final IOException x) { - // no-op - } finally { - try { - if (r != null) { - r.close(); - } - } catch (final IOException y) { - // no-op - } - try { - if (in != null) { - in.close(); - } - } catch (final IOException y) { - // no-op - } - } - } - } catch (final Exception ex) { - // no-op + // try to load via ServiceLoader (as registered in META-INF/services) + Iterator providers = ServiceLoader.load(JsonProvider.class).iterator(); + if (providers.hasNext()) { + return providers.next(); } + // try to load to default provider try { - final Class clazz = tccl.loadClass(DEFAULT_PROVIDER); - return JsonProvider.class.cast(clazz.newInstance()); + return JsonProvider.class.cast(tccl.loadClass(DEFAULT_PROVIDER).newInstance()); } catch (final Throwable cnfe) { throw new JsonException(DEFAULT_PROVIDER + " not found", cnfe); }