OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

sdo message

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]


Subject: Re: AW: [sdo] New HelperProvider implementation


Hi Frank,

I'm still looking for ways to have the default resolver handle OSGi 
(nothing to propose yet).  The pluggable resolver approach is something 
I have borrowed from the EclipseLink JPA team.

Thinking about the SDOImplementation class more, I think it requires 
some additional createHelperContext methods.  I have attached the 
updated class, the new create methods are also shown below:

  /**
   * 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);


-Blaise

Frank Budinsky wrote:
> 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;
>           }
>       }
>
>   }
>
> }
>
>
>
> ---------------------------------------------------------------------
> 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 java.util.Map;

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();

  /**
   * 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);

  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]