@@ -98,15 +98,47 @@ protected JsonProvider() {
9898     * 
9999     * @see ServiceLoader 
100100     * @return a JSON provider 
101+      *  
101102     */ 
102103    public  static  JsonProvider  provider () {
104+         return  provider (null );
105+     }
106+     
107+     /** 
108+      * Creates a JSON provider object. 
109+      * 
110+      * Implementation discovery consists of following steps: 
111+      * <ol> 
112+      * <li>If the system property {@value #JSONP_PROVIDER_FACTORY} exists, 
113+      *    then its value is assumed to be the provider factory class. 
114+      *    This phase of the look up enables per-JVM override of the JsonProvider implementation.</li> 
115+      * <li>The provider is loaded using the {@link ServiceLoader#load(Class)} method. When 'providerClassName' 
116+      *    is not null, it will return the instance having the same class qualified name if exists. This 
117+      *    is useful when more than one JsonProvider is loaded by the {@link ServiceLoader#load(Class)}.</li> 
118+      * <li>If all the steps above fail, then the rest of the look up is unspecified. That said, 
119+      *    the recommended behavior is to simply look for some hard-coded platform default Jakarta 
120+      *    JSON Processing implementation. This phase of the look up is so that a platform can have 
121+      *    its own Jakarta JSON Processing implementation as the last resort.</li> 
122+      * </ol> 
123+      * Users are recommended to cache the result of this method. 
124+      * 
125+      * @see ServiceLoader 
126+      * @param providerClassName The name of the class to be found from the {@link ServiceLoader#load(Class)}. 
127+      * @return a JSON provider 
128+      *  
129+      * @since 2.1.1 
130+      */ 
131+     public  static  JsonProvider  provider (String  providerClassName ) {
103132        if  (LazyFactoryLoader .JSON_PROVIDER  != null ) {
104133            return  newInstance (LazyFactoryLoader .JSON_PROVIDER );
105134        }
106135        ServiceLoader <JsonProvider > loader  = ServiceLoader .load (JsonProvider .class );
107136        Iterator <JsonProvider > it  = loader .iterator ();
108-         if  (it .hasNext ()) {
109-             return  it .next ();
137+         while  (it .hasNext ()) {
138+             JsonProvider  provider  = it .next ();
139+             if  (providerClassName  == null  || provider .getClass ().getName ().equals (providerClassName )) {
140+                 return  provider ;
141+             }
110142        }
111143
112144        // handling OSGi (specific default) 
0 commit comments