1 57 package org.apache.wsif.util; 58 59 import java.io.BufferedReader ; 60 import java.io.IOException ; 61 import java.io.InputStreamReader ; 62 import java.net.URL ; 63 import java.security.AccessController ; 64 import java.security.PrivilegedAction ; 65 import java.util.ArrayList ; 66 import java.util.Enumeration ; 67 import java.util.HashMap ; 68 import java.util.Iterator ; 69 70 import org.apache.wsif.WSIFConstants; 71 import org.apache.wsif.WSIFException; 72 import org.apache.wsif.logging.MessageLogger; 73 import org.apache.wsif.logging.Trc; 74 import org.apache.wsif.spi.WSIFProvider; 75 76 109 public class WSIFPluggableProviders { 110 111 private static boolean autoLoadProviders = true; 113 114 private static ArrayList providersFromSPIFiles; 119 120 private static HashMap defaultNSProviders; 124 125 private static final String PLUGABLE_PROVIDER_FILENAME = 126 "META-INF/services/org.apache.wsif.spi.WSIFProvider"; 127 128 135 public static WSIFProvider getProvider(String namespaceURI) { 136 Trc.entry(null, namespaceURI); 137 WSIFProvider provider; 138 139 if (!namespaceURI.endsWith("/")) { 141 namespaceURI += "/"; 142 } 143 144 if (defaultNSProviders == null) { 145 defaultNSProviders = new HashMap (); 146 } else { 147 provider = (WSIFProvider) defaultNSProviders.get(namespaceURI); 148 if (provider != null) { 149 return provider; 150 } 151 } 152 ArrayList providers = getSupportingProviders(namespaceURI, true); 153 if (providers.size() == 0) { 154 return null; 155 } 156 if (providers.size() == 1) { 157 provider = (WSIFProvider) providers.get(0); 158 } else { 159 provider = chooseProvider(providers, namespaceURI); 160 } 161 defaultNSProviders.put(namespaceURI, provider); 162 Trc.exit(provider); 163 return provider; 164 } 165 166 175 public static void overrideDefaultProvider( 176 String providerNamespaceURI, 177 WSIFProvider provider) { 178 Trc.entry(null, providerNamespaceURI, provider); 179 180 if (defaultNSProviders == null) { 181 defaultNSProviders = new HashMap (); 182 } 183 184 if (!providerNamespaceURI.endsWith("/")) { 186 providerNamespaceURI += "/"; 187 } 188 189 if (provider == null) { 190 WSIFProvider p = 191 (WSIFProvider) defaultNSProviders.get(providerNamespaceURI); 192 if (defaultNSProviders != null) { 193 defaultNSProviders.remove(providerNamespaceURI); 194 } 195 } else { 196 defaultNSProviders.put(providerNamespaceURI, provider); 197 issueChosenProviderMsg(providerNamespaceURI, provider); 198 } 199 200 Trc.exit(); 201 } 202 203 209 public static boolean isProviderAvailable(String ns1) { 210 return isProviderAvailable(ns1, ns1); 211 } 212 213 220 public static boolean isProviderAvailable(String ns1, String ns2) { 221 boolean supported = false; 222 ArrayList ps = getSupportingProviders(ns1, false); 223 if (ps.size() > 0) { 224 if (ns2 == null || ns2.length() < 1 || ns2.equals(ns1)) { 225 supported = true; 226 } else { 227 String [] supportedNS; 228 for (int i = 0; i < ps.size() && !supported; i++) { 229 supportedNS = ((WSIFProvider)ps.get(i)).getAddressNamespaceURIs(); 230 for (int j=0; j<supportedNS.length && !supported; j++) { 231 if (ns2.equals(supportedNS[j])) { 232 supported = true; 233 } 234 } 235 } 236 } 237 } 238 return supported; 239 } 240 241 251 public static void setAutoLoadProviders(boolean b) { 252 Trc.entry(null, b); 253 if (autoLoadProviders != b) { 254 providersFromSPIFiles = null; 255 defaultNSProviders = null; 256 autoLoadProviders = b; 257 } 258 Trc.exit(); 259 } 260 261 266 public static boolean isAutoLoadProviders() { 267 Trc.entry(null); 268 Trc.exit(autoLoadProviders); 269 return autoLoadProviders; 270 } 271 272 281 private static ArrayList getSupportingProviders( 282 String namespaceURI, 283 boolean issueMessage) { 284 285 Trc.entry(null, namespaceURI, new Boolean (issueMessage)); 286 if (providersFromSPIFiles == null) { 287 providersFromSPIFiles = getAllDynamicWSIFProviders(); 288 } 289 ArrayList supportingProviders = new ArrayList (); 290 String [] uris; 291 WSIFProvider p; 292 for (Iterator i = providersFromSPIFiles.iterator(); i.hasNext();) { 293 p = (WSIFProvider) i.next(); 294 uris = p.getBindingNamespaceURIs(); 295 for (int j = 0; j < uris.length; j++) { 296 if (namespaceURI != null && namespaceURI.equals(uris[j])) { 297 Trc.event( 298 null, 299 "Adding provider " + p + " for namespace " + uris[j]); 300 supportingProviders.add(p); 301 } 302 } 303 } 304 if (defaultNSProviders != null) { 305 if (defaultNSProviders.get(namespaceURI) != null) { 306 Trc.event( 307 null, 308 "Adding default provider " 309 + defaultNSProviders.get(namespaceURI) 310 + " for namespace " 311 + namespaceURI); 312 supportingProviders.add(defaultNSProviders.get(namespaceURI)); 313 } 314 } 315 316 if (supportingProviders.size() > 1 && issueMessage) { 317 issueMultipleProvidersMsg(namespaceURI, supportingProviders); 318 } 319 320 Trc.exit(supportingProviders); 321 return supportingProviders; 322 } 323 324 330 private static ArrayList getAllDynamicWSIFProviders() { 331 Trc.entry(null); 332 if (!autoLoadProviders) { 333 return new ArrayList (); 334 } 335 336 ArrayList al = 337 (ArrayList ) AccessController.doPrivileged(new PrivilegedAction () { 338 public Object run() { 339 return findPlugableProviders(); 340 } 341 }); 342 Trc.exit(al); 343 return al; 344 } 345 346 private static ArrayList findPlugableProviders() { 347 Object o; 348 ArrayList classNames = new ArrayList (); 349 ArrayList providers = new ArrayList (); 350 351 ClassLoader loader = Thread.currentThread().getContextClassLoader(); 353 354 try { 355 for (Enumeration e = loader.getResources(PLUGABLE_PROVIDER_FILENAME); e.hasMoreElements();) { 356 readMETAINFClassNames((URL ) e.nextElement(), classNames); 357 } 358 } catch (Exception ex) { 359 Trc.exception(ex); 360 MessageLogger.log("WSIF.0003W", ex.getMessage()); 361 return providers; 362 } 363 364 for (Iterator i = classNames.iterator(); i.hasNext();) { 366 try { 367 o = Class.forName((String ) i.next(), true, loader).newInstance(); 368 if (o instanceof org.apache.wsif.spi.WSIFProvider) { 369 WSIFProvider p = (org.apache.wsif.spi.WSIFProvider) o; 370 if (p.getBindingNamespaceURIs().length > 0) { 371 Trc.event(null, "Registering provider: " + p); 372 providers.add(p); 373 } else { 374 WSIFException ex = 375 new WSIFException( 376 "Disabled WSIFProvider found:" 377 + p.getClass().getName()); 378 Trc.ignoredException(ex); 379 } 380 } else { 381 MessageLogger.log( 382 "WSIF.0003W", 383 "The provider class specified," 384 + ((o == null) ? null : o.getClass().getName()) 385 + ", does not implement org.apache.wsif.spi.WSIFProvider"); 386 } 387 } catch (ClassNotFoundException ex) { 388 Trc.exception(ex); 389 MessageLogger.log("WSIF.0003W", ex.getMessage()); 390 } catch (Exception ex) { 391 Trc.exception(ex); 392 MessageLogger.log("WSIF.0003W", ex.getMessage()); 393 } 394 } 395 396 return providers; 397 } 398 399 private static void readMETAINFClassNames(URL u, ArrayList classNames) { 400 Trc.entry(null, u); 401 Trc.event( 402 null, 403 "Reading provider class names from URL: " + u.toString()); 404 BufferedReader in = null; 405 String inputLine; 406 int i; 407 try { 408 in = new BufferedReader (new InputStreamReader (u.openStream())); 409 while ((inputLine = in.readLine()) != null) { 410 i = inputLine.indexOf('#'); 411 if (i >= 0) { 412 inputLine = inputLine.substring(0, i); 413 } 414 inputLine = inputLine.trim(); 415 if (inputLine.length() > 0) { 416 Trc.event(null, "Found provider class name: " + inputLine); 417 if (!classNames.contains(inputLine)) { 418 classNames.add(inputLine); 419 } 420 } 421 } 422 } catch (IOException ex) { 423 Trc.exception(ex); 424 MessageLogger.log("WSIF.0003W", ex.getMessage()); 425 } finally { 426 if (in != null) { 427 try { 428 in.close(); 429 } catch (IOException ex) { 430 Trc.exception(ex); 431 MessageLogger.log("WSIF.0003W", ex.getMessage()); 432 } 433 } 434 } 435 Trc.exit(); 436 } 437 438 447 private static WSIFProvider chooseProvider( 448 ArrayList providers, 449 String uri) { 450 if (providers == null || providers.size() < 1) { 451 return null; 452 } else if (providers.size() == 1) { 453 return (WSIFProvider) providers.get(0); 454 } 455 456 int i = providers.size() - 1; 457 while (i > 0 458 && !isDefaultProvider((WSIFProvider) providers.get(i), uri)) { 459 i--; 460 } 461 WSIFProvider p = (WSIFProvider) providers.get(i); 462 issueChosenProviderMsg(uri, p); 463 464 return p; 465 } 466 467 475 private static boolean isDefaultProvider( 476 WSIFProvider provider, 477 String uri) { 478 String className = provider.getClass().getName(); 479 String defaultURI; 480 try { 481 String key = WSIFConstants.WSIF_PROP_PROVIDER_PFX1 + className; 482 int n = Integer.parseInt(WSIFProperties.getProperty(key)); 483 for (int i = 1; i <= n; i++) { 484 key = 485 WSIFConstants.WSIF_PROP_PROVIDER_PFX2 + i + "." + className; 486 defaultURI = WSIFProperties.getProperty(key); 487 if (uri != null && uri.equals(defaultURI)) { 488 return true; 489 } 490 } 491 } catch (NumberFormatException e) { Trc.ignoredException(e); 493 } return false; 495 } 496 497 503 private static void issueMultipleProvidersMsg( 504 String uri, 505 ArrayList providers) { 506 String providerNames = providers.get(0).getClass().getName(); 507 for (int i = 1; i < providers.size(); i++) { 508 providerNames += ", " + providers.get(i).getClass().getName(); 509 } 510 MessageLogger.log("WSIF.0006W", uri, providerNames); 511 } 512 513 519 private static void issueChosenProviderMsg( 520 String uri, 521 WSIFProvider provider) { 522 523 MessageLogger.log( 524 "WSIF.0007I", 525 provider == null ? "null" : provider.getClass().getName(), 526 uri); 527 } 528 529 } 530
| Popular Tags
|