[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: AW: [sdo] New HelperProvider implementation
Hi Blaise, I think that the added flexibility of a pluggable resolver approach sounds good. I also think we should also try to make the default resolver handle all the cases we can think of so that needing to plug in a custom resolver will be less likely. Is there something else that we should/could do in the default resolver to handle the OSGi case? Thanks, Frank Blaise Doughan <blaise.doughan@oracle.com> 02/06/2009 12:13 PM To Frank Budinsky/Toronto/IBM@IBMCA cc sdo@lists.oasis-open.org Subject Re: AW: [sdo] New HelperProvider implementation Hi Frank, What about making the implementation look-up more pluggable? Attached is a modified version of SDOImplementation that provides a plug-in mechanism for looking up implementations (ImplmentationResolver). By default it behaves exactly as what you proposed. The plugin-mechanism would allow the behaviour to be changed for other environments such as OSGi. -Blaise Blaise Doughan wrote: Hi Frank, Along with your proposed changes the following would be required to ExternalizableDelegator (also attached). public ExternalizableDelegator() { delegate = SDOImplementation.getInstance().resolvable(); } public ExternalizableDelegator(Object target) { delegate = SDOImplementation.getInstance().resolvable(target); } I think in general this means that the HelperContext used for deserialization will become: SDOImplementation.getInstance().getDefaultContext(); As opposed to: HelperProvider.getDefaultContext(); -Blaise Frank Budinsky wrote: Hi Guys, Since we'd like to get rid of all the INSTANCE fields for SDO-96, I was thinking that all the static getXXXHelper() methods in HelperProvider should also go. Once we remove all this, I think we're not left with much interesting content in HelperProvider, so I think that maybe we should just deprecate the entire class HelperProvider, and replace it with a clean new API. I've attached my first pass at this, class SDOImplementation. I've deprecated HelperProvider, but made it a subclass of SDOImplementation, for backward compatibility. Comments welcome. Thanks, Frank. Frank Budinsky/Toronto/IBM@IBMCA 01/13/2009 10:51 AM To sdo@lists.oasis-open.org cc Subject Re: AW: [sdo] New HelperProvider implementation Hi Ron, Thanks for looking at it. You're right that is is a partial resolution to SDO-96. My thinking was that SDO-96 is one of the issues that we can resolve in the virtual F2F, but I wanted to get some starting material for discussion on the table before that. I think there are several aspects to the issue that we'll want to discuss in detail. One thing that I definitely had intended this class to do, but forgot, was to allow more that one impl/service to be located. I've attached a slightly modified version here. Thanks, Frank. "Barack, Ron" <ron.barack@sap.com> 01/13/2009 10:01 AM To Frank Budinsky/Toronto/IBM@IBMCA, <sdo@lists.oasis-open.org> cc Subject AW: [sdo] New HelperProvider implementation Hi Frank, I'm guessing that this is a partial resolution to SDO-96, is that right? If not, what is the issue that is being addressed here. I think holding the information in a file in meta-inf is OK, certainly an improvement over what we have now, but in order to handle the bootstrapping problem, I think we need some additional options. The problem with having things in a file in meta-inf is that it doesn't really change the situation about having only one SDO on the classpath, which the user always gets, no matter what. A lot of systems allow specifying the implementation class through the API... InitialContext is a famous example of this. Others allow configuration through system properties ("-D"s). I think SDO should allow for all 3 configuration options, with the API given highest priority, System properties second, the mechanism which you provide third, and the fallback solution should be the fixed class name constant, as you have given it. Best Regards, Ron -----Ursprüngliche Nachricht----- Von: Frank Budinsky [mailto:frankb@ca.ibm.com] Gesendet: Montag, 12. Januar 2009 22:57 An: sdo@lists.oasis-open.org Betreff: [sdo] New HelperProvider implementation Hi Guys, Attached is a proposed new implementation for class HelperProvider. The advantages of this impl are: 1. It allows SDO implementations be registered as a Java Service Provider - http://java.sun.com/j2se/1.4.2/docs/guide/jar/jar.html#Service%20Provider 2. Implementations should not need to replace this impl, but instead simply plug in an subclass with necessary overrides. 3. I believe it's backward compatible with the previous version. Please take a look at this impl, and let me know what you think. Maybe we can discuss in tomorrow's call? Thanks, Frank. --------------------------------------------------------------------- To unsubscribe from this mail list, you must leave the OASIS TC that generates this mail. Follow this link to all your TCs in OASIS at: https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php [attachment "HelperProvider.java" deleted by Frank Budinsky/Toronto/IBM] --------------------------------------------------------------------- To unsubscribe from this mail list, you must leave the OASIS TC that generates this mail. Follow this link to all your TCs in OASIS at: https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php --------------------------------------------------------------------- To unsubscribe from this mail list, you must leave the OASIS TC that generates this mail. Follow this link to all your TCs in OASIS at: https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php --------------------------------------------------------------------- To unsubscribe from this mail list, you must leave the OASIS TC that generates this mail. Follow this link to all your TCs in OASIS at: https://www.oasis-open.org/apps/org/workgroup/portal/my_workgroups.php /** * <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 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; import commonj.sdo.helper.HelperContext; import commonj.sdo.impl.ExternalizableDelegator.Resolvable; /** * Central access to an implementation of SDO. */ public abstract class SDOImplementation { /** * 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(); 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 SDOImplementation getInstance() { return getImplementationResolver().getInstance(); } public static SDOImplementation getInstance(String implName) { return getImplementationResolver().getInstance(implName); } protected SDOImplementation() { } protected abstract Resolvable resolvable(); protected abstract Resolvable resolvable(Object target); 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.impl.SDOImplementation"; /** * The name of the resource that is used for service location. */ static final String SERVICE_RESOURCE_NAME = "META-INF/services/commonj.sdo.impl.SDOImplementation"; SDOImplementation getInstance(); SDOImplementation getInstance(String implName); } private static class DefaultImplementationResolver implements ImplementationResolver { /** * Locate and instantiate the default SDOImplementation. * @see getInstance(String) */ public SDOImplementation getInstance() { return getInstance(null); } /** * Locate and instantiate an SDOImplementation. * <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.impl.SDOImplementation" 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.impl.SDOImplementation 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 SDOImplementation class itself. * <p/> * @param implName The name of the implementation class. * @return A singleton instance of the selected SDOImplementation. */ public SDOImplementation getInstance(String implName) { if (implName == null) { implName = getImplementationName(); } ClassLoader cl = getContextClassLoader(); if (cl != null) { SDOImplementation impl = getInstance(cl, implName); if (impl != null) { return impl; } } cl = SDOImplementation.class.getClassLoader(); SDOImplementation impl = getInstance(cl, implName); if (impl != null) { return impl; } return null; } /** * Map from implementation classes to their corresponding singleton instances. */ protected final HashMap<Class, SDOImplementation> instanceMap = new HashMap<Class, SDOImplementation>(); protected SDOImplementation getInstance(ClassLoader cl, String implName) { try { if (implName == null) { implName = getImplementationName(cl); if (implName == null) return null; } Class instanceClass = cl.loadClass(implName); SDOImplementation instance = instanceMap.get(instanceClass); if (instance == null) { instance = (SDOImplementation)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; } } } }
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]