ServiceFactory.java |
/* * JBoss, the OpenSource EJB server * * Distributable under LGPL license. * See terms of license at gnu.org. */ package javax.xml.rpc; import javax.xml.namespace.QName; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Properties; /** The javax.xml.rpc.ServiceFactory is an abstract class that provides a * factory for the creation of instances of the type javax.xml.rpc.Service. * This abstract class follows the abstract static factory design pattern. * This enables a J2SE based client to create a Service instance in a portable * manner without using the constructor of the Service implementation class. * * The ServiceFactory implementation class is set using the * javax.xml.rpc.ServiceFactory System property. * * @author Scott.Stark@jboss.org * @author Thomas.Diesler@jboss.org * @version 1.1 */ public abstract class ServiceFactory { private static ServiceFactory factory; /** A constant representing the property used to lookup the name of a ServiceFactory implementation class. */ public static final String SERVICEFACTORY_PROPERTY = "javax.xml.rpc.ServiceFactory"; private static final String JBOSS_SERVICE_FACTORY = "org.jboss.webservice.client.ServiceFactoryImpl"; private static final String AXIS_SERVICE_FACTORY = "org.jboss.axis.client.ServiceFactory"; protected ServiceFactory() { } /** Gets an instance of the ServiceFactory * Only one copy of a factory exists and is returned to the application each time this method is called. * * The implementation class to be used can be overridden by setting the javax.xml.rpc.ServiceFactory system property. * * @return The ServiceFactory singleton * @throws ServiceException on failure to instantiate the ServiceFactory impl */ public static synchronized ServiceFactory newInstance() throws ServiceException { // Create the factory singleton if needed if (factory == null) { PrivilegedAction action = new PropertyAccessAction(SERVICEFACTORY_PROPERTY, JBOSS_SERVICE_FACTORY); String factoryName = (String)AccessController.doPrivileged(action); ClassLoader loader = Thread.currentThread().getContextClassLoader(); try { Class factoryClass = null; try { factoryClass = loader.loadClass(factoryName); factory = (ServiceFactory)factoryClass.newInstance(); } catch (ClassNotFoundException ignore) { factoryName = AXIS_SERVICE_FACTORY; factoryClass = loader.loadClass(factoryName); factory = (ServiceFactory)factoryClass.newInstance(); } } catch (Throwable e) { throw new ServiceException("Failed to create factory: " + factoryName, e); } } return factory; } /** Create an instance of the generated service implementation class for a given service interface, if available. * @param serviceInterface Service interface * @return A Service * @throws ServiceException If there is any error while creating the specified service, including the case where a * generated service implementation class cannot be located */ public abstract Service loadService(Class serviceInterface) throws ServiceException; /** * Create an instance of the generated service implementation class for a given service interface, if available. * An implementation may use the provided wsdlDocumentLocation and properties to help locate the generated implementation class. * If no such class is present, a ServiceException will be thrown. * * @param wsdlDocumentLocation URL for the WSDL document location for the service or null * @param serviceInterface Service interface * @param props A set of implementation-specific properties to help locate the generated service implementation class * @return A Service * @throws ServiceException If there is any error while creating the specified service, including the case where a * generated service implementation class cannot be located */ public abstract Service loadService(URL wsdlDocumentLocation, Class serviceInterface, Properties props) throws ServiceException; /** * Create an instance of the generated service implementation class for a given service, if available. * The service is uniquely identified by the wsdlDocumentLocation and serviceName arguments. * An implementation may use the provided properties to help locate the generated implementation class. * If no such class is present, a ServiceException will be thrown. * * @param wsdlDocumentLocation URL for the WSDL document location for the service or null * @param serviceName Qualified name for the service * @param props A set of implementation-specific properties to help locate the generated service implementation class * @return A Service * @throws ServiceException If there is any error while creating the specified service, including the case where a generated service implementation class cannot be located */ public abstract Service loadService(URL wsdlDocumentLocation, QName serviceName, Properties props) throws ServiceException; /** * Create a <code>Service</code> instance. * * @param serviceName QName for the service * @return Service. * @throws ServiceException If any error in creation of the specified service */ public abstract Service createService(QName serviceName) throws ServiceException; /** * Create a <code>Service</code> instance. * * @param wsdlDocumentLocation URL for the WSDL document location * @param serviceName QName for the service. * @return Service. * @throws ServiceException If any error in creation of the * specified service */ public abstract Service createService(URL wsdlDocumentLocation, QName serviceName) throws ServiceException; private static class PropertyAccessAction implements PrivilegedAction { private String name; private String defaultValue; PropertyAccessAction(String name, String defaultValue) { this.name = name; this.defaultValue = defaultValue; } public Object run() { return System.getProperty(name, defaultValue); } } }
ServiceFactory.java |