[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: AW: [sdo] New HelperProvider implementation
|
Hello All, If there are expectations that even though deprecated HelperProvider still continue to work in a reasonable manner, then the attached version of HelperProviderImpl could be used. I have also attached slightly updated versions of SDO and HelperContextFactory. -Blaise Blaise Doughan wrote: 499464EE.1030804@oracle.com" type="cite"> Hi Frank, |
/**
* <copyright>
*
* Service Data Objects
* Version 3.0
* Licensed Materials
*
* (c) Copyright BEA Systems, Inc., International Business Machines Corporation,
* Oracle Corporation, Primeton Technologies Ltd., Rogue Wave Software, SAP AG.,
* Software AG., Sun Microsystems, Sybase Inc., Xcalia, Zend Technologies,
* 2005-2008. All rights reserved.
*
* </copyright>
*
*/
package commonj.sdo.helper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.HashMap;
public class SDO {
private static ImplementationResolver implementationResolver;
public static ImplementationResolver getImplementationResolver() {
if (null == implementationResolver) {
implementationResolver = new DefaultImplementationResolver();
}
return implementationResolver;
}
public static void setImplementationResolver(ImplementationResolver anImplementationResolver) {
implementationResolver = anImplementationResolver;
}
public static HelperContextFactory getHelperContextFactory() {
return getImplementationResolver().getHelperContextFactory();
}
public static HelperContextFactory getHelperContextFactory(String implName) {
return getImplementationResolver().getHelperContextFactory(implName);
}
public static interface ImplementationResolver {
/**
* The name of the system property that will be checked for an implementation name.
*/
static final String PROPERTY_NAME = "commonj.sdo.helper.HelperContextFactory";
/**
* The name of the resource that is used for service location.
*/
static final String SERVICE_RESOURCE_NAME = "META-INF/services/" + PROPERTY_NAME;
HelperContextFactory getHelperContextFactory();
HelperContextFactory getHelperContextFactory(String implName);
}
private static class DefaultImplementationResolver implements ImplementationResolver {
/**
* Locate and instantiate the default HelperContextFactory.
*
* @see getInstance(String)
*/
public HelperContextFactory getHelperContextFactory() {
return getHelperContextFactory(null);
}
/**
* Locate and instantiate a HelperContextFactory. <p/> If the specified
* implName is not null, attempt to instantiate an implementation class
* with that name. If implName is null, then the name of the
* implementation to use is determined by the value of the
* "commonj.sdo.helper.HelperContextFactory" system property. If this is not
* set or this code does not have permission to read it then the name
* will be retrieved from the
* META-INF/services/commonj.sdo.helper.HelperContextFactory resource. <p/>
* Name lookup and class loading is done using first the Thread's
* current context classloader and then, if that is not set, not
* readable, or does not provide an implementation, using the
* classloader used to load the HelperContextFactory class itself. <p/>
*
* @param implName
* The name of the implementation class.
* @return A singleton instance of the selected HelperContextFactory.
*/
public HelperContextFactory getHelperContextFactory(String implName) {
if (implName == null) {
implName = getImplementationName();
}
ClassLoader cl = getContextClassLoader();
if (cl != null) {
HelperContextFactory impl = getHelperContextFactory(cl, implName);
if (impl != null) {
return impl;
}
}
cl = HelperContextFactory.class.getClassLoader();
HelperContextFactory impl = getHelperContextFactory(cl, implName);
if (impl != null) {
return impl;
}
return null;
}
/**
* Map from implementation classes to their corresponding singleton instances.
*/
protected final HashMap<Class, HelperContextFactory> instanceMap = new HashMap<Class, HelperContextFactory>();
protected HelperContextFactory getHelperContextFactory(ClassLoader cl, String implName) {
try {
if (implName == null) {
implName = getImplementationName(cl);
if (implName == null)
return null;
}
Class instanceClass = cl.loadClass(implName);
HelperContextFactory instance = instanceMap.get(instanceClass);
if (instance == null) {
instance = (HelperContextFactory) instanceClass.newInstance();
instanceMap.put(instanceClass, instance);
}
return instance;
} catch (Exception e) {
return null;
}
}
protected String getImplementationName(ClassLoader cl) throws IOException {
InputStream is = cl.getResourceAsStream(SERVICE_RESOURCE_NAME);
if (is == null) return null;
InputStreamReader in = new InputStreamReader(is, "UTF-8");
BufferedReader reader = new BufferedReader(in, 128);
try {
String line;
while ((line = reader.readLine()) != null) {
int i = line.indexOf('#');
if (i != -1) {
line = line.substring(0, i);
}
line = line.trim();
if (line.length() > 0) return line;
}
return null;
} finally {
reader.close();
}
}
protected String getImplementationName() {
try {
return (String)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return System.getProperty(PROPERTY_NAME);
}
});
} catch (SecurityException e) {
return null;
}
}
protected ClassLoader getContextClassLoader() {
try {
return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return Thread.currentThread().getContextClassLoader();
}
});
} catch (SecurityException e) {
return null;
}
}
}
}
/**
* <copyright>
*
* Service Data Objects
* Version 3.0
* Licensed Materials
*
* (c) Copyright BEA Systems, Inc., International Business Machines Corporation,
* Oracle Corporation, Primeton Technologies Ltd., Rogue Wave Software, SAP AG.,
* Software AG., Sun Microsystems, Sybase Inc., Xcalia, Zend Technologies,
* 2005-2008. All rights reserved.
*
* </copyright>
*
*/
package commonj.sdo.helper;
import java.util.Map;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.impl.ExternalizableDelegator.Resolvable;
public abstract class HelperContextFactory {
public HelperContextFactory() {
}
/**
* Gets the implementation's default HelperContext.
* @return a HelperContext object
*/
public abstract HelperContext getDefaultHelperContext();
/**
* Create a new HelperContext in this implementation.
* @return a HelperContext object
*/
public abstract HelperContext createHelperContext();
/**
* Create a new HelperContext in this implementation.
* @param properties - Properties required to initialize the HelperContext.
* @return a HelperContext object
*/
public abstract HelperContext createHelperContext(Map properties);
/**
* Create a new HelperContext in this implementation.
* @param classLoader - The class loader for the generated static classes (if any).
* @return a HelperContext object
*/
public abstract HelperContext createHelperContext(ClassLoader classLoader);
/**
* Create a new HelperContext in this implementation.
* @param classLoader - The class loader for the generated static classes (if any).
* @param properties - Properties required to initialize the HelperContext.
* @return a HelperContext object
*/
public abstract HelperContext createHelperContext(ClassLoader classLoader, Map properties);
public abstract Resolvable createResolvable();
public abstract Resolvable createResolvable(Object target);
}
/**
* <copyright>
*
* Service Data Objects
* Version 3.0
* Licensed Materials
*
* (c) Copyright BEA Systems, Inc., International Business Machines Corporation,
* Oracle Corporation, Primeton Technologies Ltd., Rogue Wave Software, SAP AG.,
* Software AG., Sun Microsystems, Sybase Inc., Xcalia, Zend Technologies,
* 2005-2008. All rights reserved.
*
* </copyright>
*
*/
package commonj.sdo.impl;
import commonj.sdo.helper.CopyHelper;
import commonj.sdo.helper.DataFactory;
import commonj.sdo.helper.DataHelper;
import commonj.sdo.helper.EqualityHelper;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.SDO;
import commonj.sdo.helper.TypeHelper;
import commonj.sdo.helper.XMLHelper;
import commonj.sdo.helper.XSDHelper;
public class HelperProviderImpl extends HelperProvider {
private static final HelperContext defaultHelperContext = SDO.getHelperContextFactory().getDefaultHelperContext();
public HelperProviderImpl() {
super();
}
public CopyHelper copyHelper() {
return defaultHelperContext.getCopyHelper();
}
public DataFactory dataFactory() {
return defaultHelperContext.getDataFactory();
}
public DataHelper dataHelper() {
return defaultHelperContext.getDataHelper();
}
public EqualityHelper equalityHelper() {
return defaultHelperContext.getEqualityHelper();
}
public TypeHelper typeHelper() {
return defaultHelperContext.getTypeHelper();
}
public XMLHelper xmlHelper() {
return defaultHelperContext.getXMLHelper();
}
public XSDHelper xsdHelper() {
return defaultHelperContext.getXSDHelper();
}
public ExternalizableDelegator.Resolvable resolvable() {
return SDO.getHelperContextFactory().createResolvable();
}
public ExternalizableDelegator.Resolvable resolvable(Object target) {
return SDO.getHelperContextFactory().createResolvable(target);
}
}
/**
* <copyright>
*
* Service Data Objects
* Version 2.1.1
* Licensed Materials
*
* (c) Copyright BEA Systems, Inc., International Business Machines Corporation,
* Oracle Corporation, Primeton Technologies Ltd., Rogue Wave Software, SAP AG.,
* Software AG., Sun Microsystems, Sybase Inc., Xcalia, Zend Technologies,
* 2005-2008. All rights reserved.
*
* </copyright>
*
*/
package commonj.sdo.impl;
import commonj.sdo.helper.CopyHelper;
import commonj.sdo.helper.DataFactory;
import commonj.sdo.helper.DataHelper;
import commonj.sdo.helper.EqualityHelper;
import commonj.sdo.helper.HelperContext;
import commonj.sdo.helper.TypeHelper;
import commonj.sdo.helper.XMLHelper;
import commonj.sdo.helper.XSDHelper;
import commonj.sdo.impl.ExternalizableDelegator.Resolvable;
/**
* This class instantiates a HelperProviderImpl that returns concrete helpers.
* This class may be replaced by another implementation.
* @deprecated
*/
public abstract class HelperProvider
{
static HelperProvider INSTANCE = getHelperProviderImpl();
static HelperProvider getHelperProviderImpl()
{
try
{
return (HelperProvider)Class.forName("commonj.sdo.impl.HelperProviderImpl").newInstance();
} catch (Exception e)
{
throw new RuntimeException(e);
}
} // end method getHelperProvider()
HelperProvider()
{
}
/**
* Gets a CopyHelper
* @return a CopyHelper object
*/
public static CopyHelper getCopyHelper()
{
return INSTANCE.copyHelper();
}
/**
* Gets a DataFactory
* @return a DataFactory object
*/
public static DataFactory getDataFactory()
{
return INSTANCE.dataFactory();
}
/**
* Gets a DataHelper
* @return a DataHelper object
*/
public static DataHelper getDataHelper()
{
return INSTANCE.dataHelper();
}
/**
* Gets an EqualityHelper
* @return an EqualityHelper object
*/
public static EqualityHelper getEqualityHelper()
{
return INSTANCE.equalityHelper();
}
/**
* Gets a TypeHelper
* @return a TypeHelper object
*/
public static TypeHelper getTypeHelper()
{
return INSTANCE.typeHelper();
}
/**
* Gets an XMLHelper
* @return an XMLHelper object
*/
public static XMLHelper getXMLHelper()
{
return INSTANCE.xmlHelper();
}
/**
* Gets an XSDHelper
* @return an XSDHelper object
*/
public static XSDHelper getXSDHelper()
{
return INSTANCE.xsdHelper();
}
/**
* Gets a Resolvable
* @return a Resolvable object
* @see ExternalizableDelegator
*/
public static Resolvable createResolvable()
{
return INSTANCE.resolvable();
}
/**
* Gets a Resolvable
* @param target the target object for the Resolvable
* @return a Resolvable object
* @see ExternalizableDelegator
*/
public static Resolvable createResolvable(Object target)
{
return INSTANCE.resolvable(target);
}
abstract CopyHelper copyHelper();
abstract DataFactory dataFactory();
abstract DataHelper dataHelper();
abstract EqualityHelper equalityHelper();
abstract TypeHelper typeHelper();
abstract XMLHelper xmlHelper();
abstract XSDHelper xsdHelper();
abstract Resolvable resolvable();
abstract Resolvable resolvable(Object target);
////////////////////////////////////////////////////////////////////////////////////////////////////
// New in SDO 2.1
////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* Gets the default HelperContext
* @return a HelperContext object
*/
public static HelperContext getDefaultContext()
{
return INSTANCE.helperContext();
}
HelperContext helperContext()
{
return defaultContext;
}
static HelperContext defaultContext = new DefaultHelperContext();
static class DefaultHelperContext implements HelperContext
{
public CopyHelper getCopyHelper() { return INSTANCE.copyHelper(); }
public DataFactory getDataFactory() { return INSTANCE.dataFactory(); }
public DataHelper getDataHelper() { return INSTANCE.dataHelper(); }
public EqualityHelper getEqualityHelper() { return INSTANCE.equalityHelper(); }
public TypeHelper getTypeHelper() { return INSTANCE.typeHelper(); }
public XMLHelper getXMLHelper() { return INSTANCE.xmlHelper(); }
public XSDHelper getXSDHelper() { return INSTANCE.xsdHelper(); }
}
}
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]