You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2006/06/28 21:34:40 UTC

svn commit: r417856 [3/22] - in /incubator/openjpa/trunk/openjpa-lib: java/ main/ main/java/ main/java/org/apache/openjpa/lib/ant/ main/java/org/apache/openjpa/lib/conf/ main/java/org/apache/openjpa/lib/jdbc/ main/java/org/apache/openjpa/lib/log/ main/...

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/Configurations.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/Configurations.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/Configurations.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/Configurations.java Wed Jun 28 12:34:33 2006
@@ -15,11 +15,6 @@
  */
 package org.apache.openjpa.lib.conf;
 
-
-import java.io.*;
-import java.util.*;
-import javax.naming.*;
-
 import org.apache.commons.lang.exception.*;
 
 import org.apache.openjpa.lib.log.*;
@@ -27,646 +22,656 @@
 
 import serp.util.*;
 
+import java.io.*;
+
+import java.util.*;
+
+import javax.naming.*;
+
 
 /**
- *	<p>Utility methods dealing with configuration.</p>
+ *  <p>Utility methods dealing with configuration.</p>
  *
- *	@author	Abe White
- *	@nojavadoc
- */
-public class Configurations
-{
-	private static final Localizer _loc = Localizer.forPackage 
-		(Configurations.class);
-
-
-	/**
-	 *	Return the class name from the given plugin string, or null if none.
- 	 */
-	public static String getClassName (String plugin)
-	{
-		return getPluginComponent (plugin, true);
-	}
-
-
-	/**
-	 *	Return the properties part of the given plugin string, or null if none.
-	 */
-	public static String getProperties (String plugin)
-	{
-		return getPluginComponent (plugin, false);
-	}
-
-
-	/**
-	 *	Return either the class name or properties string from a plugin string.
-	 */
-	private static String getPluginComponent (String plugin, boolean clsName)
-	{
-		if (plugin != null)
-			plugin = plugin.trim ();
-		if (plugin == null || plugin.length () == 0)
-			return null;
-
-		int openParen = -1;
-		if (plugin.charAt (plugin.length () - 1) == ')')
-			openParen = plugin.indexOf ('(');
-		if (openParen == -1)
-		{
-			int eq = plugin.indexOf ('=');
-			if (eq == -1)
-				return (clsName) ? plugin : null;	
-			return (clsName) ? null : plugin;
-		}
-
-		// clsName(props) form
-		if (clsName)
-			return plugin.substring (0, openParen).trim ();
-		String prop = plugin.substring (openParen + 1, 
-			plugin.length () - 1).trim ();
-		return (prop.length () == 0) ? null : prop;
-	}
-
-
-	/**
-	 *	Combine the given class name and properties into a plugin string.
-	 */
-	public static String getPlugin (String clsName, String props)
-	{
-		if (clsName == null || clsName.length () == 0)
-			return props;
-		if (props == null || props.length () == 0)
-			return clsName;
-		return clsName + "(" + props + ")";
-	}
-
-
-	/**
-	 *	Create the instance with the given class name, using the given
-	 *	class loader.  No configuration of the instance is performed by 
-	 *	this method.
-	 */
-	public static Object newInstance (String clsName, ClassLoader loader)
-	{	
-		return newInstance (clsName, null, null, loader, true);
-	}
-
-
-	/**
-	 *	Create and configure an instance with the given class name and
-	 *	properties.
-	 */
-	public static Object newInstance (String clsName, Configuration conf,
-		String props, ClassLoader loader)
-	{
-		Object obj = newInstance (clsName, null, conf, loader, true);
-		configureInstance (obj, conf, props);
-		return obj;
-	}
-
-
-	/**
-	 *	Helper method used by members of this package to instantiate plugin
-	 *	values.
-	 */
-	static Object newInstance (String clsName, Value val, Configuration conf,
-		ClassLoader loader, boolean fatal)
-	{
-		if (clsName == null || clsName.length () == 0)
-			return null;
-		if (loader == null && conf != null)
-			loader = conf.getClass ().getClassLoader ();
-
-		Class cls = null;
-		try
-		{
-			cls = Strings.toClass (clsName, loader);
-		}
-		catch (RuntimeException re)
-		{
-			if (val != null)
-				re = getCreateException (clsName, val, re);
-			if (fatal)
-				throw re;
-			Log log = (conf == null) ? null : conf.getConfigurationLog ();
-			if (log != null && log.isErrorEnabled ())
-				log.error (re);
-			return null;
-		}
-
-		try
-		{
-			return cls.newInstance ();
-		}
-		catch (Exception e)
-		{
-			RuntimeException re = new NestableRuntimeException (_loc.get 
-				("obj-create", cls), e);
-			if (fatal)
-				throw re;
-			Log log = (conf == null) ? null : conf.getConfigurationLog ();
-			if (log != null && log.isErrorEnabled ())
-				log.error (re);
-			return null;
-		}
-	}
-
-
-	/**
-	 *	Helper method to throw an informative description on instantiation 
-	 *	error.
-	 */
-	private static RuntimeException getCreateException (String clsName, 
-		Value val, Exception e)
-	{
-		// re-throw the exception with some better information
-		final String msg;
-		final Object[] params;
-
-		String alias = val.alias (clsName);
-		String[] aliases = val.getAliases ();
-		String[] keys;
-		if (aliases.length == 0)
-			keys = aliases;
-		else
-		{
-			keys = new String[aliases.length / 2];
-			for (int i = 0; i < aliases.length; i += 2)
-				keys[i / 2] = aliases[i];
-		}
-
-		String closest;
-		if (keys.length == 0)
-		{
-			msg = "invalid-plugin";
-			params = new Object[] { val.getProperty (), alias, e.toString (), };
-		}
-		else if ((closest = StringDistance.getClosestLevenshteinDistance
-			(alias, keys, 0.5f)) == null)
-		{
-			msg = "invalid-plugin-aliases";
-			params = new Object[] { 
-				val.getProperty (), alias, e.toString (), 
-				new TreeSet (Arrays.asList (keys)),
-			};
-		}
-		else
-		{
-			msg = "invalid-plugin-aliases-hint";
-			params = new Object[] { 
-				val.getProperty (), alias, e.toString (), 
-				new TreeSet (Arrays.asList (keys)), closest,
-			};
-		}
-		return new ParseException (_loc.get (msg, params), e);
-	}
-
-
-	/**
-	 *	Configures the given object with the given properties by
-	 *	matching the properties string to the object's setter
-	 *	methods. The properties string should be in the form
-	 *	"prop1=val1, prop2=val2 ...". Does not validate that setter
-	 *	methods exist for the properties.
-	 *
-	 *	@throws		RuntimeException on configuration error
-	 */
-	public static void configureInstance (Object obj, Configuration conf, 
-		String properties)
-	{
-		configureInstance (obj, conf, properties, null);
-	}
-
-
-	/**
-	 *	Configures the given object with the given properties by
-	 *	matching the properties string to the object's setter
-	 *	methods. The properties string should be in the form
-	 *	"prop1=val1, prop2=val2 ...". Validates that setter methods
-	 *	exist for the properties.
-	 *
-	 *	@throws		RuntimeException on configuration error
-	 */
-	public static void configureInstance (Object obj, Configuration conf, 
-		String properties, String configurationName)
-	{
-		if (obj == null)
-			return;
-
-		Properties props = null;
-		if (properties != null && properties.length () > 0)
-			props = parseProperties (properties);
-		configureInstance (obj, conf, props, configurationName);
-	}
-
-
-	/**
-	 *	Configures the given object with the given properties by
-	 *	matching the properties string to the object's setter
-	 *	methods. Does not validate that setter methods exist for the
-	 *	properties.
-	 *
-	 *	@throws		RuntimeException on configuration error
-	 */
-	public static void configureInstance (Object obj, Configuration conf, 
-		Properties properties)
-	{
-		configureInstance (obj, conf, properties, null);
-	}
-
-
-	/**
-	 *	Configures the given object with the given properties by
-	 *	matching the properties string to the object's setter
-	 *	methods. If <code>configurationName</code> is
-	 *	non-<code>null</code>, validates that setter methods exist for
-	 *	the properties.
-	 *
-	 *	@throws		RuntimeException on configuration error
-	 */
-	public static void configureInstance (Object obj, Configuration conf, 
-		Properties properties, String configurationName)
-	{
-		if (obj == null)
-			return;
-
-		Options opts = null;
-		if (properties instanceof Options)
-			opts = (Options) properties;
-		else if (properties != null)
-		{
-			opts = new Options ();
-			opts.putAll (properties);	
-		}
-
-		Configurable configurable = null;
-		if (conf != null && obj instanceof Configurable)
-			configurable = (Configurable) obj;
-
-		if (configurable != null)
-		{
-			configurable.setConfiguration (conf);	
-			configurable.startConfiguration ();
-		}
-		if (opts != null)
-		{
-			Map invalidEntries = opts.setInto (obj);
-			if (obj instanceof GenericConfigurable)
-				((GenericConfigurable) obj).setInto (invalidEntries);
-
-			if (!invalidEntries.isEmpty () && configurationName != null)
-			{
-				String msg = null;
-				String first = (String) invalidEntries.keySet ().iterator ()
-					.next ();
-				if (invalidEntries.keySet ().size () == 1 &&
-					first.indexOf ('.') == -1)
-				{
-					// if there's just one misspelling and this is not a
-					// path traversal, check for near misses.
-					Collection options =
-						Options.findOptionsFor (obj.getClass ());
-					String close = StringDistance.getClosestLevenshteinDistance
-						(first, options, 0.75f);
-					if (close != null)
-						msg = _loc.get ("invalid-config-param-hint",
-							new Object[] {
-								configurationName,
-								obj.getClass (),
-								first,
-								close,
-								options,
-							});
-				}
-
-				if (msg == null)
-				{
-					msg = _loc.get ("invalid-config-params", new String[] {
-						configurationName,
-						obj.getClass ().getName (),
-						invalidEntries.keySet ().toString (),
-						Options.findOptionsFor (obj.getClass ()).toString (),
-					});
-				}
-				throw new ParseException (msg);
-			}
-		}
-		if (configurable != null)
-			configurable.endConfiguration ();
-	}
-
-
-	/**
-	 *	Turn a set of properties into a comma-separated string.
-	 */
-	public static String serializeProperties (Map map)
-	{
-		if (map == null || map.isEmpty ())
-			return null;
-	
-		StringBuffer buf = new StringBuffer ();
-		Map.Entry entry;
-		String val;
-		for (Iterator itr = map.entrySet ().iterator (); itr.hasNext ();)
-		{
-			entry = (Map.Entry) itr.next ();
-			if (buf.length () > 0)
-				buf.append (", ");
-			buf.append (entry.getKey ()).append ('=');
-			val = String.valueOf (entry.getValue ());
-			if (val.indexOf (',') != -1)
-				buf.append ('"').append (val).append ('"');
-			else
-				buf.append (val);
-		}
-		return buf.toString ();
-	}
-
-
-	/**
-	 *	Parse a set of properties from a comma-separated string.
-	 */
-	public static Options parseProperties (String properties)
-	{
-		Options opts = new Options ();
-		if (properties == null)
-			return opts;
-		properties = properties.trim ();
-		if (properties.length () == 0)
-			return opts;
-
-		try
-		{
-			String[] props = Strings.split (properties, ",", 0);
-			int idx;
-			char quote;
-			String prop;
-			String val;
-			for (int i = 0; i < props.length; i++)
-			{
-				idx = props[i].indexOf ('=');
-				if (idx == -1)
-				{
-					// if the key is not assigned to any value, set the
-					// value to the same thing as the key, and continue.
-					// This permits GenericConfigurable instances to
-					// behave meaningfully. We might consider setting the
-					// value to some well-known "value was not set, but
-					// key is present" string so that instances getting
-					// values injected can differentiate between a mentioned
-					// property and one set to a particular value.
-					prop = props[i];
-					val = prop;
-				}
-				else
-				{
-					prop = props[i].substring (0, idx).trim ();
-					val = props[i].substring (idx + 1).trim ();
-				}
-
-				// if the value is quoted, read until the end quote
-				if (((val.startsWith ("\"") && val.endsWith ("\""))
-					|| (val.startsWith ("'") && val.endsWith ("'")))
-					&& val.length () > 1)
-					val = val.substring (1, val.length () - 1);
-				else if (val.startsWith ("\"") || val.startsWith ("'"))
-				{
-					quote = val.charAt (0);
-					StringBuffer buf = new StringBuffer (val.substring (1));
-					int quotIdx;
-					while (++i < props.length)
-					{
-						buf.append (",");
-
-						quotIdx = props[i].indexOf (quote);
-						if (quotIdx != -1)
-						{
-							buf.append (props[i].substring (0, quotIdx));
-							if (quotIdx + 1 < props[i].length ())
-								buf.append (props[i].substring (quotIdx + 1));
-							break;
-						}
-						else
-							buf.append (props[i]);
-					}
-		
-					val = buf.toString ();
-				}
-
-				opts.put (prop, val);
-			}
-			return opts;
-		}
-		catch (RuntimeException re)
-		{
-			throw new ParseException (_loc.get ("prop-parse", properties), re);
-		}
-	}
-
-
-	/**
-	 *	Set the given {@link Configuration} instance from the command line
-	 *	options provided.  All property names of the given configuration are
-	 *	recognized; additionally, if a <code>properties</code> or 
-	 *	<code>p</code> argument exists, the resource it
-	 *	points to will be loaded and set into the given configuration instance.
-	 *	It can point to either a file or a resource name. 
-	 */
-	public static void populateConfiguration (Configuration conf, Options opts)
-	{
-		String props = opts.removeProperty ("properties", "p", null);
-		if (props != null && props.length () > 0)
-		{
-			File file = new File (props);
-			ConfigurationProvider provider;
-			if (file.isFile ())
-				provider = load (file, null);	
-			else
-			{
-				file = new File ("META-INF" + File.separatorChar + props);
-				if (file.isFile ())
-					provider = load (file, null);
-				else
-					provider = load (props, null);
-			}
-			provider.setInto (conf);
-		}
-		opts.setInto (conf);
-	}
-
-
-	/**
-	 *	Return a {@link ConfigurationProvider} that has parsed system defaults,
-	 *	or null if no provider or defaults found.
-	 */
-	public static ConfigurationProvider loadDefaults (ClassLoader loader)
-	{
-		if (loader == null)
-			loader = Thread.currentThread ().getContextClassLoader ();
-		Class[] impls = Services.getImplementorClasses
-			(ConfigurationProvider.class, loader);
-		ConfigurationProvider provider = null;
-		StringBuffer errs = null;
-		for (int i = 0; i < impls.length; i++)
-		{
-			provider = newProvider (impls[i]);
-			try
-			{
-				if (provider != null && provider.loadDefaults (loader))
-					return provider;
-			}
-			catch (MissingResourceException mre)
-			{
-				throw mre;
-			}
-			catch (Exception e)
-			{
-				if (errs == null)
-					errs = new StringBuffer ();
-				else
-					errs.append (", ");
-				errs.append (e.toString ());
-			}
-		}
-		if (errs != null)
-			throw new MissingResourceException (errs.toString (),
-				Configurations.class.getName (), "defaults");
-		return null;
-	}
-
-
-	/**
-	 *	Return a new new configuration provider instance of the given class,
-	 *	or null if the class cannot be instantiated.
-	 */
-	private static ConfigurationProvider newProvider (Class cls)
-	{
-		try
-		{
-			return (ConfigurationProvider) cls.newInstance ();
-		}
-		catch (InstantiationException e)
-		{
-			return null;
-		}
-		catch (IllegalAccessException e)
-		{
-			return null;
-		}
-	}
-
-
-	/**
-	 *	Return a {@link ConfigurationProvider} that has parsed the given 
-	 *	resource.  Throws {@link MissingResourceException} if resource does
-	 *	not exist.
-	 */
-	public static ConfigurationProvider load (String resource, 
-		ClassLoader loader)
-	{
-		if (resource == null || resource.length () == 0)
-			return null;
-
-		if (loader == null)
-			loader = Thread.currentThread ().getContextClassLoader ();
-		Class[] impls = Services.getImplementorClasses
-			(ConfigurationProvider.class, loader);
-		ConfigurationProvider provider = null;
-		StringBuffer errs = null;
-		for (int i = 0; i < impls.length; i++)
-		{
-			provider = newProvider (impls[i]);
-			try
-			{
-				if (provider != null && provider.load (resource, loader))
-					return provider;
-			}
-			catch (MissingResourceException mre)
-			{
-				throw mre;
-			}
-			catch (Exception e)
-			{
-				if (errs == null)
-					errs = new StringBuffer ();
-				else
-					errs.append (", ");
-				errs.append (e.toString ());
-			}
-		}
-		String msg = (errs == null) ? resource : errs.toString ();
-		throw new MissingResourceException (msg,
-			Configurations.class.getName (), resource);
-	}
-
-
-	/**
-	 *	Return a {@link ConfigurationProvider} that has parsed the given 
-	 *	file.  Throws {@link MissingResourceException} if file does
-	 *	not exist.
-	 */
-	public static ConfigurationProvider load (File file, ClassLoader loader)
-	{
-		if (file == null)
-			return null;
-
-		if (loader == null)
-			loader = Thread.currentThread ().getContextClassLoader ();
-		Class[] impls = Services.getImplementorClasses
-			(ConfigurationProvider.class, loader);
-		ConfigurationProvider provider = null;
-		StringBuffer errs = null;
-		for (int i = 0; i < impls.length; i++)
-		{
-			provider = newProvider (impls[i]);
-			try
-			{
-				if (provider != null && provider.load (file))
-					return provider;
-			}
-			catch (MissingResourceException mre)
-			{
-				throw mre;
-			}
-			catch (Exception e)
-			{
-				if (errs == null)
-					errs = new StringBuffer ();
-				else
-					errs.append (", ");
-				errs.append (e.toString ());
-			}
-		}
-		String msg = (errs == null) ? file.toString () : errs.toString ();
-		throw new MissingResourceException (msg,
-			Configurations.class.getName (), file.toString ());
-	}
-
-
-	/**
-	 *	Looks up the given name in JNDI.  If the name is null, null is 
-	 *	returned.
-	 */
-	public static Object lookup (String name)
-	{
-		if (name == null || name.length () == 0)
-			return null;
-
-		Context ctx = null;
-		try
-		{
-			ctx = new InitialContext ();
-			return ctx.lookup (name);	
-		}
-		catch (NamingException ne)
-		{
-			throw new NestableRuntimeException (_loc.get ("naming-err", name), 
-				ne);
-		}
-		finally
-		{
-			if (ctx != null)
-				try { ctx.close (); } catch (Exception e) {}
-		}
-	}
+ *  @author Abe White
+ *  @nojavadoc */
+public class Configurations {
+    private static final Localizer _loc = Localizer.forPackage(Configurations.class);
+
+    /**
+     *  Return the class name from the given plugin string, or null if none.
+      */
+    public static String getClassName(String plugin) {
+        return getPluginComponent(plugin, true);
+    }
+
+    /**
+     *  Return the properties part of the given plugin string, or null if none.
+     */
+    public static String getProperties(String plugin) {
+        return getPluginComponent(plugin, false);
+    }
+
+    /**
+     *  Return either the class name or properties string from a plugin string.
+     */
+    private static String getPluginComponent(String plugin, boolean clsName) {
+        if (plugin != null) {
+            plugin = plugin.trim();
+        }
+
+        if ((plugin == null) || (plugin.length() == 0)) {
+            return null;
+        }
+
+        int openParen = -1;
+
+        if (plugin.charAt(plugin.length() - 1) == ')') {
+            openParen = plugin.indexOf('(');
+        }
+
+        if (openParen == -1) {
+            int eq = plugin.indexOf('=');
+
+            if (eq == -1) {
+                return (clsName) ? plugin : null;
+            }
+
+            return (clsName) ? null : plugin;
+        }
+
+        // clsName(props) form
+        if (clsName) {
+            return plugin.substring(0, openParen).trim();
+        }
+
+        String prop = plugin.substring(openParen + 1, plugin.length() - 1).trim();
+
+        return (prop.length() == 0) ? null : prop;
+    }
+
+    /**
+     *  Combine the given class name and properties into a plugin string.
+     */
+    public static String getPlugin(String clsName, String props) {
+        if ((clsName == null) || (clsName.length() == 0)) {
+            return props;
+        }
+
+        if ((props == null) || (props.length() == 0)) {
+            return clsName;
+        }
+
+        return clsName + "(" + props + ")";
+    }
+
+    /**
+     *  Create the instance with the given class name, using the given
+     *  class loader.  No configuration of the instance is performed by
+     *  this method.
+     */
+    public static Object newInstance(String clsName, ClassLoader loader) {
+        return newInstance(clsName, null, null, loader, true);
+    }
+
+    /**
+     *  Create and configure an instance with the given class name and
+     *  properties.
+     */
+    public static Object newInstance(String clsName, Configuration conf,
+        String props, ClassLoader loader) {
+        Object obj = newInstance(clsName, null, conf, loader, true);
+        configureInstance(obj, conf, props);
+
+        return obj;
+    }
+
+    /**
+     *  Helper method used by members of this package to instantiate plugin
+     *  values.
+     */
+    static Object newInstance(String clsName, Value val, Configuration conf,
+        ClassLoader loader, boolean fatal) {
+        if ((clsName == null) || (clsName.length() == 0)) {
+            return null;
+        }
+
+        if ((loader == null) && (conf != null)) {
+            loader = conf.getClass().getClassLoader();
+        }
+
+        Class cls = null;
+
+        try {
+            cls = Strings.toClass(clsName, loader);
+        } catch (RuntimeException re) {
+            if (val != null) {
+                re = getCreateException(clsName, val, re);
+            }
+
+            if (fatal) {
+                throw re;
+            }
+
+            Log log = (conf == null) ? null : conf.getConfigurationLog();
+
+            if ((log != null) && log.isErrorEnabled()) {
+                log.error(re);
+            }
+
+            return null;
+        }
+
+        try {
+            return cls.newInstance();
+        } catch (Exception e) {
+            RuntimeException re = new NestableRuntimeException(_loc.get(
+                        "obj-create", cls), e);
+
+            if (fatal) {
+                throw re;
+            }
+
+            Log log = (conf == null) ? null : conf.getConfigurationLog();
+
+            if ((log != null) && log.isErrorEnabled()) {
+                log.error(re);
+            }
+
+            return null;
+        }
+    }
+
+    /**
+     *  Helper method to throw an informative description on instantiation
+     *  error.
+     */
+    private static RuntimeException getCreateException(String clsName,
+        Value val, Exception e) {
+        // re-throw the exception with some better information
+        final String msg;
+        final Object[] params;
+
+        String alias = val.alias(clsName);
+        String[] aliases = val.getAliases();
+        String[] keys;
+
+        if (aliases.length == 0) {
+            keys = aliases;
+        } else {
+            keys = new String[aliases.length / 2];
+
+            for (int i = 0; i < aliases.length; i += 2)
+                keys[i / 2] = aliases[i];
+        }
+
+        String closest;
+
+        if (keys.length == 0) {
+            msg = "invalid-plugin";
+            params = new Object[] { val.getProperty(), alias, e.toString(), };
+        } else if ((closest = StringDistance.getClosestLevenshteinDistance(
+                        alias, keys, 0.5f)) == null) {
+            msg = "invalid-plugin-aliases";
+            params = new Object[] {
+                    val.getProperty(), alias, e.toString(),
+                    new TreeSet(Arrays.asList(keys)),
+                };
+        } else {
+            msg = "invalid-plugin-aliases-hint";
+            params = new Object[] {
+                    val.getProperty(), alias, e.toString(),
+                    new TreeSet(Arrays.asList(keys)), closest,
+                };
+        }
+
+        return new ParseException(_loc.get(msg, params), e);
+    }
+
+    /**
+     *  Configures the given object with the given properties by
+     *  matching the properties string to the object's setter
+     *  methods. The properties string should be in the form
+     *  "prop1=val1, prop2=val2 ...". Does not validate that setter
+     *  methods exist for the properties.
+     *
+     *  @throws RuntimeException on configuration error
+     */
+    public static void configureInstance(Object obj, Configuration conf,
+        String properties) {
+        configureInstance(obj, conf, properties, null);
+    }
+
+    /**
+     *  Configures the given object with the given properties by
+     *  matching the properties string to the object's setter
+     *  methods. The properties string should be in the form
+     *  "prop1=val1, prop2=val2 ...". Validates that setter methods
+     *  exist for the properties.
+     *
+     *  @throws RuntimeException on configuration error
+     */
+    public static void configureInstance(Object obj, Configuration conf,
+        String properties, String configurationName) {
+        if (obj == null) {
+            return;
+        }
+
+        Properties props = null;
+
+        if ((properties != null) && (properties.length() > 0)) {
+            props = parseProperties(properties);
+        }
+
+        configureInstance(obj, conf, props, configurationName);
+    }
+
+    /**
+     *  Configures the given object with the given properties by
+     *  matching the properties string to the object's setter
+     *  methods. Does not validate that setter methods exist for the
+     *  properties.
+     *
+     *  @throws RuntimeException on configuration error
+     */
+    public static void configureInstance(Object obj, Configuration conf,
+        Properties properties) {
+        configureInstance(obj, conf, properties, null);
+    }
+
+    /**
+     *  Configures the given object with the given properties by
+     *  matching the properties string to the object's setter
+     *  methods. If <code>configurationName</code> is
+     *  non-<code>null</code>, validates that setter methods exist for
+     *  the properties.
+     *
+     *  @throws RuntimeException on configuration error
+     */
+    public static void configureInstance(Object obj, Configuration conf,
+        Properties properties, String configurationName) {
+        if (obj == null) {
+            return;
+        }
+
+        Options opts = null;
+
+        if (properties instanceof Options) {
+            opts = (Options) properties;
+        } else if (properties != null) {
+            opts = new Options();
+            opts.putAll(properties);
+        }
+
+        Configurable configurable = null;
+
+        if ((conf != null) && obj instanceof Configurable) {
+            configurable = (Configurable) obj;
+        }
+
+        if (configurable != null) {
+            configurable.setConfiguration(conf);
+            configurable.startConfiguration();
+        }
+
+        if (opts != null) {
+            Map invalidEntries = opts.setInto(obj);
+
+            if (obj instanceof GenericConfigurable) {
+                ((GenericConfigurable) obj).setInto(invalidEntries);
+            }
+
+            if (!invalidEntries.isEmpty() && (configurationName != null)) {
+                String msg = null;
+                String first = (String) invalidEntries.keySet().iterator().next();
+
+                if ((invalidEntries.keySet().size() == 1) &&
+                        (first.indexOf('.') == -1)) {
+                    // if there's just one misspelling and this is not a
+                    // path traversal, check for near misses.
+                    Collection options = Options.findOptionsFor(obj.getClass());
+                    String close = StringDistance.getClosestLevenshteinDistance(first,
+                            options, 0.75f);
+
+                    if (close != null) {
+                        msg = _loc.get("invalid-config-param-hint",
+                                new Object[] {
+                                    configurationName, obj.getClass(), first,
+                                    close, options,
+                                });
+                    }
+                }
+
+                if (msg == null) {
+                    msg = _loc.get("invalid-config-params",
+                            new String[] {
+                                configurationName, obj.getClass().getName(),
+                                invalidEntries.keySet().toString(),
+                                Options.findOptionsFor(obj.getClass()).toString(),
+                            });
+                }
+
+                throw new ParseException(msg);
+            }
+        }
+
+        if (configurable != null) {
+            configurable.endConfiguration();
+        }
+    }
+
+    /**
+     *  Turn a set of properties into a comma-separated string.
+     */
+    public static String serializeProperties(Map map) {
+        if ((map == null) || map.isEmpty()) {
+            return null;
+        }
+
+        StringBuffer buf = new StringBuffer();
+        Map.Entry entry;
+        String val;
+
+        for (Iterator itr = map.entrySet().iterator(); itr.hasNext();) {
+            entry = (Map.Entry) itr.next();
+
+            if (buf.length() > 0) {
+                buf.append(", ");
+            }
+
+            buf.append(entry.getKey()).append('=');
+            val = String.valueOf(entry.getValue());
+
+            if (val.indexOf(',') != -1) {
+                buf.append('"').append(val).append('"');
+            } else {
+                buf.append(val);
+            }
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     *  Parse a set of properties from a comma-separated string.
+     */
+    public static Options parseProperties(String properties) {
+        Options opts = new Options();
+
+        if (properties == null) {
+            return opts;
+        }
+
+        properties = properties.trim();
+
+        if (properties.length() == 0) {
+            return opts;
+        }
+
+        try {
+            String[] props = Strings.split(properties, ",", 0);
+            int idx;
+            char quote;
+            String prop;
+            String val;
+
+            for (int i = 0; i < props.length; i++) {
+                idx = props[i].indexOf('=');
+
+                if (idx == -1) {
+                    // if the key is not assigned to any value, set the
+                    // value to the same thing as the key, and continue.
+                    // This permits GenericConfigurable instances to
+                    // behave meaningfully. We might consider setting the
+                    // value to some well-known "value was not set, but
+                    // key is present" string so that instances getting
+                    // values injected can differentiate between a mentioned
+                    // property and one set to a particular value.
+                    prop = props[i];
+                    val = prop;
+                } else {
+                    prop = props[i].substring(0, idx).trim();
+                    val = props[i].substring(idx + 1).trim();
+                }
+
+                // if the value is quoted, read until the end quote
+                if (((val.startsWith("\"") && val.endsWith("\"")) ||
+                        (val.startsWith("'") && val.endsWith("'"))) &&
+                        (val.length() > 1)) {
+                    val = val.substring(1, val.length() - 1);
+                } else if (val.startsWith("\"") || val.startsWith("'")) {
+                    quote = val.charAt(0);
+
+                    StringBuffer buf = new StringBuffer(val.substring(1));
+                    int quotIdx;
+
+                    while (++i < props.length) {
+                        buf.append(",");
+
+                        quotIdx = props[i].indexOf(quote);
+
+                        if (quotIdx != -1) {
+                            buf.append(props[i].substring(0, quotIdx));
+
+                            if ((quotIdx + 1) < props[i].length()) {
+                                buf.append(props[i].substring(quotIdx + 1));
+                            }
+
+                            break;
+                        } else {
+                            buf.append(props[i]);
+                        }
+                    }
+
+                    val = buf.toString();
+                }
+
+                opts.put(prop, val);
+            }
+
+            return opts;
+        } catch (RuntimeException re) {
+            throw new ParseException(_loc.get("prop-parse", properties), re);
+        }
+    }
+
+    /**
+     *  Set the given {@link Configuration} instance from the command line
+     *  options provided.  All property names of the given configuration are
+     *  recognized; additionally, if a <code>properties</code> or
+     *  <code>p</code> argument exists, the resource it
+     *  points to will be loaded and set into the given configuration instance.
+     *  It can point to either a file or a resource name.
+     */
+    public static void populateConfiguration(Configuration conf, Options opts) {
+        String props = opts.removeProperty("properties", "p", null);
+
+        if ((props != null) && (props.length() > 0)) {
+            File file = new File(props);
+            ConfigurationProvider provider;
+
+            if (file.isFile()) {
+                provider = load(file, null);
+            } else {
+                file = new File("META-INF" + File.separatorChar + props);
+
+                if (file.isFile()) {
+                    provider = load(file, null);
+                } else {
+                    provider = load(props, null);
+                }
+            }
+
+            provider.setInto(conf);
+        }
+
+        opts.setInto(conf);
+    }
+
+    /**
+     *  Return a {@link ConfigurationProvider} that has parsed system defaults.
+     */
+    public static ConfigurationProvider loadDefaults(ClassLoader loader) {
+        if (loader == null) {
+            loader = Thread.currentThread().getContextClassLoader();
+        }
+
+        Class[] impls = Services.getImplementorClasses(ConfigurationProvider.class,
+                loader);
+        ConfigurationProvider provider = null;
+        StringBuffer errs = null;
+
+        for (int i = 0; i < impls.length; i++) {
+            provider = newProvider(impls[i]);
+
+            try {
+                if ((provider != null) && provider.loadDefaults(loader)) {
+                    return provider;
+                }
+            } catch (MissingResourceException mre) {
+                throw mre;
+            } catch (Exception e) {
+                if (errs == null) {
+                    errs = new StringBuffer();
+                } else {
+                    errs.append(", ");
+                }
+
+                errs.append(e.toString());
+            }
+        }
+
+        if (errs != null) {
+            throw new MissingResourceException(errs.toString(),
+                Configurations.class.getName(), "defaults");
+        }
+
+        return null;
+    }
+
+    /**
+     *  Return a new new configuration provider instance of the given class,
+     *  or null if the class cannot be instantiated.
+     */
+    private static ConfigurationProvider newProvider(Class cls) {
+        try {
+            return (ConfigurationProvider) cls.newInstance();
+        } catch (Throwable e) {
+            return null;
+        }
+    }
+
+    /**
+     *  Return a {@link ConfigurationProvider} that has parsed the given
+     *  resource.  Throws {@link MissingResourceException} if resource does
+     *  not exist.
+     */
+    public static ConfigurationProvider load(String resource, ClassLoader loader) {
+        if ((resource == null) || (resource.length() == 0)) {
+            return null;
+        }
+
+        if (loader == null) {
+            loader = Thread.currentThread().getContextClassLoader();
+        }
+
+        Class[] impls = Services.getImplementorClasses(ConfigurationProvider.class,
+                loader);
+        ConfigurationProvider provider = null;
+        StringBuffer errs = null;
+
+        for (int i = 0; i < impls.length; i++) {
+            provider = newProvider(impls[i]);
+
+            try {
+                if ((provider != null) && provider.load(resource, loader)) {
+                    return provider;
+                }
+            } catch (MissingResourceException mre) {
+                throw mre;
+            } catch (Exception e) {
+                if (errs == null) {
+                    errs = new StringBuffer();
+                } else {
+                    errs.append(", ");
+                }
+
+                errs.append(e.toString());
+            }
+        }
+
+        String msg = (errs == null) ? resource : errs.toString();
+        throw new MissingResourceException(msg, Configurations.class.getName(),
+            resource);
+    }
+
+    /**
+     *  Return a {@link ConfigurationProvider} that has parsed the given
+     *  file.  Throws {@link MissingResourceException} if file does
+     *  not exist.
+     */
+    public static ConfigurationProvider load(File file, ClassLoader loader) {
+        if (file == null) {
+            return null;
+        }
+
+        if (loader == null) {
+            loader = Thread.currentThread().getContextClassLoader();
+        }
+
+        Class[] impls = Services.getImplementorClasses(ConfigurationProvider.class,
+                loader);
+        ConfigurationProvider provider = null;
+        StringBuffer errs = null;
+
+        for (int i = 0; i < impls.length; i++) {
+            provider = newProvider(impls[i]);
+
+            try {
+                if ((provider != null) && provider.load(file)) {
+                    return provider;
+                }
+            } catch (MissingResourceException mre) {
+                throw mre;
+            } catch (Exception e) {
+                if (errs == null) {
+                    errs = new StringBuffer();
+                } else {
+                    errs.append(", ");
+                }
+
+                errs.append(e.toString());
+            }
+        }
+
+        String msg = (errs == null) ? file.toString() : errs.toString();
+        throw new MissingResourceException(msg, Configurations.class.getName(),
+            file.toString());
+    }
+
+    /**
+     *  Looks up the given name in JNDI.  If the name is null, null is
+     *  returned.
+     */
+    public static Object lookup(String name) {
+        if ((name == null) || (name.length() == 0)) {
+            return null;
+        }
+
+        Context ctx = null;
+
+        try {
+            ctx = new InitialContext();
+
+            return ctx.lookup(name);
+        } catch (NamingException ne) {
+            throw new NestableRuntimeException(_loc.get("naming-err", name), ne);
+        } finally {
+            if (ctx != null) {
+                try {
+                    ctx.close();
+                } catch (Exception e) {
+                }
+            }
+        }
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/DoubleValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/DoubleValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/DoubleValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/DoubleValue.java Wed Jun 28 12:34:33 2006
@@ -17,69 +17,57 @@
 
 
 /**
- *	A double {@link Value}.
+ *  A double {@link Value}.
  *
- *	@author	Marc Prud'hommeaux
+ *  @author Marc Prud'hommeaux
  */
-public class DoubleValue
-	extends Value
-{
- 	private double value;
-
-
-	public DoubleValue (String prop)
-	{
-		super (prop);
-	}
-
-
-	public Class getValueType ()
-	{
-		return double.class;
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public void set (double value)
-	{
-		double oldValue = this.value;
-		this.value = value;
-		if (oldValue != value)
-			valueChanged ();
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public double get ()
-	{
-		return value;
-	}
-
-
-	protected String getInternalString ()
-	{
-		return String.valueOf (value);
-	}
-
-
-	protected void setInternalString (String val)
-	{
-		if (val == null || val.length () == 0)
-			set (0D);
-		else
-			set (Double.parseDouble (val));
-	}
-
-
-	protected void setInternalObject (Object obj)
-	{
-		if (obj == null)
-			set (0D);
-		else
-			set (((Number) obj).doubleValue ());
-	}
+public class DoubleValue extends Value {
+    private double value;
+
+    public DoubleValue(String prop) {
+        super(prop);
+    }
+
+    public Class getValueType() {
+        return double.class;
+    }
+
+    /**
+     *  The internal value.
+     */
+    public void set(double value) {
+        double oldValue = this.value;
+        this.value = value;
+
+        if (oldValue != value) {
+            valueChanged();
+        }
+    }
+
+    /**
+     *  The internal value.
+     */
+    public double get() {
+        return value;
+    }
+
+    protected String getInternalString() {
+        return String.valueOf(value);
+    }
+
+    protected void setInternalString(String val) {
+        if ((val == null) || (val.length() == 0)) {
+            set(0D);
+        } else {
+            set(Double.parseDouble(val));
+        }
+    }
+
+    protected void setInternalObject(Object obj) {
+        if (obj == null) {
+            set(0D);
+        } else {
+            set(((Number) obj).doubleValue());
+        }
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/FileValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/FileValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/FileValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/FileValue.java Wed Jun 28 12:34:33 2006
@@ -15,71 +15,55 @@
  */
 package org.apache.openjpa.lib.conf;
 
-import java.io.*;
-
 import org.apache.commons.lang.*;
 
+import java.io.*;
+
 
 /**
- *	A {@link File} {@link Value}.
+ *  A {@link File} {@link Value}.
  *
- *	@author	Marc Prud'hommeaux
+ *  @author Marc Prud'hommeaux
  */
-public class FileValue
-	extends Value
-{
- 	private File value;
-
-
-	public FileValue (String prop)
-	{
-		super (prop);
-	}
-
-
-	public Class getValueType ()
-	{
-		return File.class;
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public void set (File value)
-	{
-		File oldValue = this.value;
-		this.value = value;
-		if (!ObjectUtils.equals (oldValue, value))
-			valueChanged ();
-	}
+public class FileValue extends Value {
+    private File value;
 
-
-	/**
-	 *	The internal value.
-	 */
-	public File get ()
-	{
-		return value;
-	}
-
-
-	protected String getInternalString ()
-	{
-		return (value == null) ? null : value.getAbsolutePath ();
-	}
-
-
-	protected void setInternalString (String val)
-	{
-		set (new File (val));
-	}
-
-
-	protected void setInternalObject (Object obj)
-	{
-		set ((File) obj);
-	}
+    public FileValue(String prop) {
+        super(prop);
+    }
+
+    public Class getValueType() {
+        return File.class;
+    }
+
+    /**
+     *  The internal value.
+     */
+    public void set(File value) {
+        File oldValue = this.value;
+        this.value = value;
+
+        if (!ObjectUtils.equals(oldValue, value)) {
+            valueChanged();
+        }
+    }
+
+    /**
+     *  The internal value.
+     */
+    public File get() {
+        return value;
+    }
+
+    protected String getInternalString() {
+        return (value == null) ? null : value.getAbsolutePath();
+    }
+
+    protected void setInternalString(String val) {
+        set(new File(val));
+    }
+
+    protected void setInternalObject(Object obj) {
+        set((File) obj);
+    }
 }
-
-

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/GenericConfigurable.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/GenericConfigurable.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/GenericConfigurable.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/GenericConfigurable.java Wed Jun 28 12:34:33 2006
@@ -15,27 +15,25 @@
  */
 package org.apache.openjpa.lib.conf;
 
-
 import java.util.*;
 
 
 /**
- *	<p>Implementations of this interface may perform additional
- *	generic configuration with any key-value pairs that cannot be set
- *	into the object via the normal {@link org.apache.openjpa.lib.util.Options#setInto}
- *	means.</p>
+ *  <p>Implementations of this interface may perform additional
+ *  generic configuration with any key-value pairs that cannot be set
+ *  into the object via the normal {@link org.apache.openjpa.lib.util.Options#setInto}
+ *  means.</p>
  *
- *	@author	Patrick Linskey
+ *  @author Patrick Linskey
  */
-public interface GenericConfigurable
-{
-	/**
-	 *	Perform any generic configuration based on the data in
-	 *	<code>m</code>. This method should remove any values in
-	 *	<code>m</code> that have been successfully processed; if any
-	 *	values remain in <code>m</code> after this method is executed,
-	 *	an exception will be thrown identifying those key-value pairs
-	 *	as invalid.
-	 */
-	public void setInto (Map m);
+public interface GenericConfigurable {
+    /**
+     *  Perform any generic configuration based on the data in
+     *  <code>m</code>. This method should remove any values in
+     *  <code>m</code> that have been successfully processed; if any
+     *  values remain in <code>m</code> after this method is executed,
+     *  an exception will be thrown identifying those key-value pairs
+     *  as invalid.
+     */
+    public void setInto(Map m);
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/IntValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/IntValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/IntValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/IntValue.java Wed Jun 28 12:34:33 2006
@@ -15,71 +15,61 @@
  */
 package org.apache.openjpa.lib.conf;
 
+import serp.util.*;
+
 
 /**
- *	An int {@link Value}.
+ *  An int {@link Value}.
  *
- *	@author	Marc Prud'hommeaux
+ *  @author Marc Prud'hommeaux
  */
-public class IntValue
-	extends Value
-{
- 	private int value;
-
-
-	public IntValue (String prop)
-	{
-		super (prop);
-	}
-
-
-	public Class getValueType ()
-	{
-		return int.class;
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public void set (int value)
-	{
-		int oldValue = this.value;
-		this.value = value;
-		if (value != oldValue)
-			valueChanged ();
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public int get ()
-	{
-		return this.value;
-	}
-
-
-	protected String getInternalString ()
-	{
-		return String.valueOf (this.value);
-	}
-
-
-	protected void setInternalString (String val)
-	{
-		if (val == null || val.length () == 0)
-			set (0);
-		else
-			set (Integer.parseInt (val));
-	}
-
-
-	protected void setInternalObject (Object obj)
-	{
-		if (obj == null)
-			set (0);
-		else
-			set (((Number) obj).intValue ());
-	}
+public class IntValue extends Value {
+    private int value;
+
+    public IntValue(String prop) {
+        super(prop);
+    }
+
+    public Class getValueType() {
+        return int.class;
+    }
+
+    /**
+     *  The internal value.
+     */
+    public void set(int value) {
+        int oldValue = this.value;
+        this.value = value;
+
+        if (value != oldValue) {
+            valueChanged();
+        }
+    }
+
+    /**
+     *  The internal value.
+     */
+    public int get() {
+        return this.value;
+    }
+
+    protected String getInternalString() {
+        return String.valueOf(this.value);
+    }
+
+    protected void setInternalString(String val) {
+        if ((val == null) || (val.length() == 0)) {
+            set(0);
+        } else {
+            set(Integer.parseInt(val));
+        }
+    }
+
+    protected void setInternalObject(Object obj) {
+        if (obj == null) {
+            set(0);
+        } else {
+            set(((Number) obj).intValue());
+        }
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/MapConfigurationProvider.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/MapConfigurationProvider.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/MapConfigurationProvider.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/MapConfigurationProvider.java Wed Jun 28 12:34:33 2006
@@ -15,99 +15,91 @@
  */
 package org.apache.openjpa.lib.conf;
 
-
-import java.io.*;
-import java.util.*;
+import org.apache.commons.collections.*;
 
 import org.apache.openjpa.lib.log.*;
 import org.apache.openjpa.lib.util.*;
 
+import java.io.*;
+
+import java.util.*;
+
 
 /**
- *	<p>Simple configuration provider that sets configuration based on a 
- *	provided map.</p>
+ *  <p>Simple configuration provider that sets configuration based on a
+ *  provided map.</p>
  *
- *	@author		Abe White 
- *	@nojavadoc
- */
-public class MapConfigurationProvider
-	implements ConfigurationProvider
-{
-	private static final Localizer _loc = Localizer.forPackage
-		(MapConfigurationProvider.class);
-
-	private Map _props = null;
-
-
-	/**
-	 *	Construct with null properties.
-	 */
-	public MapConfigurationProvider ()
-	{
-	}
-
-
-	/**
-	 *	Constructor; supply properties map.
-	 */
-	public MapConfigurationProvider (Map props)
-	{
-		addProperties (props);
-	}
-
-
-	public boolean loadDefaults (ClassLoader loader)
-		throws Exception
-	{
-		return false;
-	}
-
-
-	public boolean load (String resource, ClassLoader loader)
-		throws Exception
-	{
-		return false;
-	}
-
-
-	public boolean load (File file)
-		throws Exception
-	{
-		return false;
-	}
-
-
-	public Map getProperties ()
-	{
-		return _props;
-	}
-
-
-	public void addProperties (Map props)
-	{
-		if (props == null || props.isEmpty ())
-			return;
-		if (_props == null)
-			_props = props;
-		else
-			_props.putAll (props);
-	}
-
-
-	public void setInto (Configuration conf)
-	{
-		setInto (conf, conf.getConfigurationLog ());
-	}
-
-
-	/**
-	 *	Set properties into configuration.  If the log is non-null, will log
-	 *	a TRACE message about the set.
-	 */
-	protected void setInto (Configuration conf, Log log)
-	{
-		if (log != null && log.isTraceEnabled ())
-			log.trace (_loc.get ("conf-load", _props));
-		conf.fromProperties (_props);
-	}
+ *  @author Abe White
+ *  @nojavadoc */
+public class MapConfigurationProvider implements ConfigurationProvider {
+    private static final Localizer _loc = Localizer.forPackage(MapConfigurationProvider.class);
+    private Map _props = null;
+
+    /**
+     *  Construct with null properties.
+     */
+    public MapConfigurationProvider() {
+    }
+
+    /**
+     *  Constructor; supply properties map.
+     */
+    public MapConfigurationProvider(Map props) {
+        addProperties(props);
+    }
+
+    public boolean loadDefaults(ClassLoader loader) throws Exception {
+        return false;
+    }
+
+    public boolean load(String resource, ClassLoader loader)
+        throws Exception {
+        return false;
+    }
+
+    public boolean load(File file) throws Exception {
+        return false;
+    }
+
+    public Map getProperties() {
+        return (_props == null) ? Collections.EMPTY_MAP : _props;
+    }
+
+    public void addProperties(Map props) {
+        if ((props == null) || props.isEmpty()) {
+            return;
+        }
+
+        if (_props == null) {
+            _props = new HashMap();
+        }
+
+        _props.putAll(props);
+    }
+
+    public Object addProperty(String key, Object value) {
+        if (_props == null) {
+            _props = new HashMap();
+        }
+
+        return _props.put(key, value);
+    }
+
+    public void setInto(Configuration conf) {
+        setInto(conf, conf.getConfigurationLog());
+    }
+
+    /**
+     *  Set properties into configuration.  If the log is non-null, will log
+     *  a TRACE message about the set.
+     */
+    protected void setInto(Configuration conf, Log log) {
+        if ((log != null) && log.isTraceEnabled()) {
+            log.trace(_loc.get("conf-load", getProperties()));
+        }
+
+        if (_props != null) {
+            conf.fromProperties(_props);
+        }
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/ObjectValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/ObjectValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/ObjectValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/ObjectValue.java Wed Jun 28 12:34:33 2006
@@ -15,100 +15,103 @@
  */
 package org.apache.openjpa.lib.conf;
 
-
 import org.apache.commons.lang.*;
 
 import org.apache.openjpa.lib.util.*;
 
 
 /**
- *	<p>An object {@link Value}.</p>
+ *  <p>An object {@link Value}.</p>
  *
- *	@author		Abe White
+ *  @author Abe White
  */
-public class ObjectValue
-	extends Value
-{
-	private static final Localizer _loc = Localizer.forPackage 
-		(ObjectValue.class);
-
-	private Object _value = null;
-
-
-	public ObjectValue (String prop)
-	{
-		super (prop);
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public Object get ()
-	{
-		return _value;
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public void set (Object obj)
-	{
-		set (obj, false);
-	}
-
-
-	/**
-	 *	The internal value.
-	 *
-	 *	@param	derived	if true, this value was derived from other properties
-	 */
-	public void set (Object obj, boolean derived)
-	{
-		Object oldValue = _value;
-		_value = obj;
-		if (!derived && !ObjectUtils.equals (obj, oldValue))
-		{
-			objectChanged ();
-			valueChanged ();
-		}
-	}
-
-
-	public Class getValueType ()
-	{
-		return Object.class;
-	}
-
-
-	/**
-	 *	Implement this method to synchronize internal data with the new
-	 *	object value.
-	 */
-	protected void objectChanged ()
-	{
-	}
-
-
-	protected String getInternalString ()
-	{
-		return null;
-	}
-
-
-	protected void setInternalString (String str)
-	{
-		if (str == null)
-			set (null);
-		else
-			throw new IllegalArgumentException (_loc.get ("cant-set-string", 
-				getProperty ()));
-	}
-
-
-	protected void setInternalObject (Object obj)
-	{
-		set (obj);
-	}
-} 
+public class ObjectValue extends Value {
+    private static final Localizer _loc = Localizer.forPackage(ObjectValue.class);
+    private Object _value = null;
+
+    public ObjectValue(String prop) {
+        super(prop);
+    }
+
+    /**
+     *  The internal value.
+     */
+    public Object get() {
+        return _value;
+    }
+
+    /**
+     *  The internal value.
+     */
+    public void set(Object obj) {
+        set(obj, false);
+    }
+
+    /**
+     *  The internal value.
+     *
+     *  @param derived        if true, this value was derived from other properties
+     */
+    public void set(Object obj, boolean derived) {
+        Object oldValue = _value;
+        _value = obj;
+
+        if (!derived && !ObjectUtils.equals(obj, oldValue)) {
+            objectChanged();
+            valueChanged();
+        }
+    }
+
+    /**
+     *  Instantiate the object as an instance of the given class. Equivalent
+     *  to <code>instantiate (type, conf, true)</code>.
+     */
+    public Object instantiate(Class type, Configuration conf) {
+        return instantiate(type, conf, true);
+    }
+
+    /**
+     *  Instantiate the object as an instance of the given class.
+     */
+    public Object instantiate(Class type, Configuration conf, boolean fatal) {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     *  Allow subclasses to instantiate additional plugins.  This method does
+     *  not perform configuration.
+     */
+    public Object newInstance(String clsName, Class type, Configuration conf,
+        boolean fatal) {
+        return Configurations.newInstance(clsName, this, conf,
+            type.getClassLoader(), fatal);
+    }
+
+    public Class getValueType() {
+        return Object.class;
+    }
+
+    /**
+     *  Implement this method to synchronize internal data with the new
+     *  object value.
+     */
+    protected void objectChanged() {
+    }
+
+    protected String getInternalString() {
+        return null;
+    }
+
+    protected void setInternalString(String str) {
+        if (str == null) {
+            set(null);
+        } else {
+            throw new IllegalArgumentException(_loc.get("cant-set-string",
+                    getProperty()));
+        }
+    }
+
+    protected void setInternalObject(Object obj) {
+        set(obj);
+    }
+}

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginListValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginListValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginListValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginListValue.java Wed Jun 28 12:34:33 2006
@@ -15,249 +15,228 @@
  */
 package org.apache.openjpa.lib.conf;
 
+import org.apache.openjpa.lib.util.*;
 
 import java.lang.reflect.*;
+
 import java.util.*;
 
 
 /**
- *	<p>A list of plugins.  Defaults and aliases on plugin lists apply only
- *	to individual class names.</p>
+ *  <p>A list of plugins.  Defaults and aliases on plugin lists apply only
+ *  to individual class names.</p>
  *
- *	@see	PluginValue
- *	@author	Abe White
+ *  @see PluginValue
+ *  @author Abe White
  */
-public class PluginListValue
-	extends ObjectValue
-{
-	private static final String[] EMPTY = new String[0];
-
-	private String[] _names	= EMPTY;
-	private String[] _props	= EMPTY;	
-
-
-	public PluginListValue (String prop)
-	{
-		super (prop);
-	}
-
-	
-	/**
-	 *	The plugin class names.
-	 */
-	public String[] getClassNames ()
-	{
-		return _names;
-	}
-
-
-	/**
-	 *	The plugin class names.
-	 */
-	public void setClassNames (String[] names)
-	{
-		if (names == null)
-			names = EMPTY;
-		_names = names;
-		set (null, true);
-		valueChanged ();
-	}
-
-	
-	/**
-	 *	The plugin properties.
-	 */
-	public String[] getProperties ()
-	{
-		return _props;
-	}
-
-
-	/**
-	 *	The plugin properties.
-	 */
-	public void setProperties (String[] props)
-	{
-		if (props == null)
-			props = EMPTY;
-		_props = props;
-		set (null, true);
-		valueChanged ();
-	}
-
-
-	/** 
-	 *  Instantiate the plugins as instances of the given class.
-	 */
-	public Object[] instantiate (Class elemType, Configuration conf)
-	{
-		return instantiate (elemType, conf, true);
-	}
-
-
-	/** 
-	 *  Instantiate the plugins as instances of the given class.
-	 */
-	public Object[] instantiate (Class elemType, Configuration conf,
-		boolean fatal)
-	{
-		Object[] ret;
-		if (_names.length == 0)
-			ret = (Object[]) Array.newInstance (elemType, 0);
-		else
-		{
-			ret = (Object[]) Array.newInstance (elemType, _names.length);
-			for (int i = 0; i < ret.length; i++)
-			{
-				ret[i] = newInstance (_names[i], elemType, conf, fatal);
-				Configurations.configureInstance (ret[i], conf, _props[i], 
-					getProperty ());
-			}
-		}
-		set (ret, true);
-		return ret;
-	}
-
-
-	/**
-	 *	Allow subclasses to instantiate additional plugins.  This method does
-	 *	not perform configuration.
-	 */
-	public Object newInstance (String clsName, Class type, 
-		Configuration conf, boolean fatal)
-	{
-		return Configurations.newInstance (clsName, this, conf,
-			type.getClassLoader (), fatal);
-	}
-
-
-	/**
-	 *	Override to recognize aliases of the class name without the attached	
-	 *	properties string.
-	 */
-	public String getString ()
-	{
-		if (_names.length == 0)
-			return null;
-
-		StringBuffer buf = new StringBuffer ();
-		for (int i = 0; i < _names.length; i++)
-		{
-			if (i > 0)
-				buf.append (", ");
-			buf.append (Configurations.getPlugin (alias(_names[i]), _props[i]));
-		}
-		if (buf.length () == 0)
-			return null;
-		return buf.toString ();
-	}
-
-
-	/**
-	 *	Override to recognize aliases of the plugin name without the attached	
-	 *	properties string.
-	 */
-	public void setString (String str)
-	{
-		if (str == null || str.length () == 0)
-			str = getDefault ();
-		if (str == null || str.length () == 0)
-		{
-			_names = EMPTY;
-			_props = EMPTY;
-			set (null, true);
-			valueChanged ();
-			return;
-		}
-
-		// split up the string; each element might be a class name, or a
-		// class name with properties settings
-		List plugins = new ArrayList ();
-		StringBuffer plugin = new StringBuffer ();
-		boolean inParen = false;
-		char c;
-		for (int i = 0; i < str.length (); i++)
-		{
-			c = str.charAt (i);
-			switch (c)
-			{
-			case '(':
-				inParen = true;
-				plugin.append (c);
-				break;
-			case ')':
-				inParen = false;
-				plugin.append (c);
-				break;
-			case ',':
-				if (inParen)
-					plugin.append (c);
-				else
-				{
-					plugins.add (plugin.toString ());
-					plugin = new StringBuffer ();
-				}
-				break;
-			default:
-				plugin.append (c);
-			}
-		}
-		if (plugin.length () > 0)
-			plugins.add (plugin.toString ());
-
-		// parse each plugin element into its name and properties
-		List names = new ArrayList ();
-		List props = new ArrayList ();
-		String clsName;
-		for (int i = 0; i < plugins.size (); i++)
-		{
-			str = (String) plugins.get (i);
-			clsName = unalias (Configurations.getClassName (str));
-			if (clsName != null)
-			{
-				names.add (clsName);
-				props.add (Configurations.getProperties (str));
-			}
-		}
-		_names = (String[]) names.toArray (new String[names.size ()]);
-		_props = (String[]) props.toArray (new String[props.size ()]);
-		set (null, true);
-		valueChanged ();
-	}
-
-
-	public Class getValueType ()
-	{
-		return Object[].class;
-	}
-
-
-	protected void objectChanged ()
-	{
-		Object[] vals = (Object[]) get ();
-		if (vals == null || vals.length == 0)
-			_names = EMPTY;
-		else
-		{
-			_names = new String[vals.length];
-			for (int i = 0; i < vals.length; i++)
-				_names[i] = (vals[i] == null) ? null 
-					: vals[i].getClass ().getName ();
-		}
-		_props = EMPTY;
-	}
-
-
-	protected String getInternalString ()
-	{
-		// should never get called
-		throw new IllegalStateException ();
-	}
-
-
-	protected void setInternalString (String str)
-	{
-		// should never get called
-		throw new IllegalStateException ();
-	}
+public class PluginListValue extends ObjectValue {
+    private static final String[] EMPTY = new String[0];
+    private static final Localizer _loc = Localizer.forPackage(PluginListValue.class);
+    private String[] _names = EMPTY;
+    private String[] _props = EMPTY;
+
+    public PluginListValue(String prop) {
+        super(prop);
+    }
+
+    /**
+     *  The plugin class names.
+     */
+    public String[] getClassNames() {
+        return _names;
+    }
+
+    /**
+     *  The plugin class names.
+     */
+    public void setClassNames(String[] names) {
+        if (names == null) {
+            names = EMPTY;
+        }
+
+        _names = names;
+        set(null, true);
+        valueChanged();
+    }
+
+    /**
+     *  The plugin properties.
+     */
+    public String[] getProperties() {
+        return _props;
+    }
+
+    /**
+     *  The plugin properties.
+     */
+    public void setProperties(String[] props) {
+        if (props == null) {
+            props = EMPTY;
+        }
+
+        _props = props;
+        set(null, true);
+        valueChanged();
+    }
+
+    /**
+     *  Instantiate the plugins as instances of the given class.
+     */
+    public Object instantiate(Class elemType, Configuration conf, boolean fatal) {
+        Object[] ret;
+
+        if (_names.length == 0) {
+            ret = (Object[]) Array.newInstance(elemType, 0);
+        } else {
+            ret = (Object[]) Array.newInstance(elemType, _names.length);
+
+            for (int i = 0; i < ret.length; i++) {
+                ret[i] = newInstance(_names[i], elemType, conf, fatal);
+                Configurations.configureInstance(ret[i], conf, _props[i],
+                    getProperty());
+            }
+        }
+
+        set(ret, true);
+
+        return ret;
+    }
+
+    /**
+     *  Override to recognize aliases of the class name without the attached
+     *  properties string.
+     */
+    public String getString() {
+        if (_names.length == 0) {
+            return null;
+        }
+
+        StringBuffer buf = new StringBuffer();
+
+        for (int i = 0; i < _names.length; i++) {
+            if (i > 0) {
+                buf.append(", ");
+            }
+
+            buf.append(Configurations.getPlugin(alias(_names[i]), _props[i]));
+        }
+
+        if (buf.length() == 0) {
+            return null;
+        }
+
+        return buf.toString();
+    }
+
+    /**
+     *  Override to recognize aliases of the plugin name without the attached
+     *  properties string.
+     */
+    public void setString(String str) {
+        if ((str == null) || (str.length() == 0)) {
+            str = getDefault();
+        }
+
+        if ((str == null) || (str.length() == 0)) {
+            _names = EMPTY;
+            _props = EMPTY;
+            set(null, true);
+            valueChanged();
+
+            return;
+        }
+
+        // split up the string; each element might be a class name, or a
+        // class name with properties settings
+        List plugins = new ArrayList();
+        StringBuffer plugin = new StringBuffer();
+        boolean inParen = false;
+        char c;
+
+        for (int i = 0; i < str.length(); i++) {
+            c = str.charAt(i);
+
+            switch (c) {
+            case '(':
+                inParen = true;
+                plugin.append(c);
+
+                break;
+
+            case ')':
+                inParen = false;
+                plugin.append(c);
+
+                break;
+
+            case ',':
+
+                if (inParen) {
+                    plugin.append(c);
+                } else {
+                    plugins.add(plugin.toString());
+                    plugin = new StringBuffer();
+                }
+
+                break;
+
+            default:
+                plugin.append(c);
+            }
+        }
+
+        if (plugin.length() > 0) {
+            plugins.add(plugin.toString());
+        }
+
+        // parse each plugin element into its name and properties
+        List names = new ArrayList();
+        List props = new ArrayList();
+        String clsName;
+
+        for (int i = 0; i < plugins.size(); i++) {
+            str = (String) plugins.get(i);
+            clsName = unalias(Configurations.getClassName(str));
+
+            if (clsName != null) {
+                names.add(clsName);
+                props.add(Configurations.getProperties(str));
+            }
+        }
+
+        _names = (String[]) names.toArray(new String[names.size()]);
+        _props = (String[]) props.toArray(new String[props.size()]);
+        set(null, true);
+        valueChanged();
+    }
+
+    public Class getValueType() {
+        return Object[].class;
+    }
+
+    protected void objectChanged() {
+        Object[] vals = (Object[]) get();
+
+        if ((vals == null) || (vals.length == 0)) {
+            _names = EMPTY;
+        } else {
+            _names = new String[vals.length];
+
+            for (int i = 0; i < vals.length; i++)
+                _names[i] = (vals[i] == null) ? null
+                                              : vals[i].getClass().getName();
+        }
+
+        _props = EMPTY;
+    }
+
+    protected String getInternalString() {
+        // should never get called
+        throw new IllegalStateException();
+    }
+
+    protected void setInternalString(String str) {
+        // should never get called
+        throw new IllegalStateException();
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/PluginValue.java Wed Jun 28 12:34:33 2006
@@ -15,188 +15,145 @@
  */
 package org.apache.openjpa.lib.conf;
 
-
 import org.apache.commons.lang.*;
 
 import org.apache.openjpa.lib.util.*;
 
 
 /**
- *	<p>A plugin {@link Value} consisting of plugin name and properties.  
- *	Plugins should be specified in the form:<br /> 
- *	<code>&lt;plugin-name&gt;(&lt;prop1&gt;=&lt;val1&gt;, ...)</code><br />
- *	Both the plugin name and prop list are optional, so that the following
- *	forms are also valid:<br />
- *	<code>&lt;plugin-name&gt;</code><br />
- *	<code>&lt;prop1&gt;=&lt;val1&gt; ...</code></p>
+ *  <p>A plugin {@link Value} consisting of plugin name and properties.
+ *  Plugins should be specified in the form:<br />
+ *  <code>&lt;plugin-name&gt;(&lt;prop1&gt;=&lt;val1&gt;, ...)</code><br />
+ *  Both the plugin name and prop list are optional, so that the following
+ *  forms are also valid:<br />
+ *  <code>&lt;plugin-name&gt;</code><br />
+ *  <code>&lt;prop1&gt;=&lt;val1&gt; ...</code></p>
  *
- *	<p>Defaults and aliases on plugin values apply only to the plugin name.</p>
+ *  <p>Defaults and aliases on plugin values apply only to the plugin name.</p>
  *
- *	@author	Abe White
+ *  @author Abe White
  */
-public class PluginValue
-	extends ObjectValue
-{
-	private static final Localizer _loc = Localizer.forPackage
-		(PluginValue.class);
-
-	private final boolean	_singleton;
-	private String 			_name 	= null;
-	private String 			_props 	= null;
-
-
-	public PluginValue (String prop, boolean singleton)
-	{
-		super (prop);
-		_singleton = singleton;
-	}
-
-
-	/**
-	 *	Whether this value is a singleton.
-	 */
-	public boolean isSingleton ()
-	{
-		return _singleton;
-	}
-
-	
-	/**
-	 *	The plugin class name.
-	 */
-	public String getClassName ()
-	{
-		return _name;
-	}
-
-
-	/**
-	 *	The plugin class name.
-	 */
-	public void setClassName (String name)
-	{
-		String oldName = _name;
-		_name = name;
-		if (!StringUtils.equals (oldName, name))
-		{
-			if (_singleton)
-				set (null, true);
-			valueChanged ();
-		}
-	}
-
-
-	/**
-	 *	The plugin properties.
-	 */
-	public String getProperties ()
-	{
-		return _props;	
-	}
-
-
-	/**
-	 *	The plugin properties.
-	 */
-	public void setProperties (String props)
-	{
-		String oldProps = _props;
-		_props = props;
-		if (!StringUtils.equals (oldProps, props))
-		{
-			if (_singleton)
-				set (null, true);
-			valueChanged ();
-		}
-	}
-
-
-	/** 
-	 *  Instantiate the plugin as an instance of the given class. Equivalent
-	 *	to <code>instantiate (type, conf, true)</code>.
-	 */
-	public Object instantiate (Class type, Configuration conf)
-	{
-		return instantiate (type, conf, true);
-	}
-
-
-	/** 
-	 *  Instantiate the plugin as an instance of the given class.
-	 */
-	public Object instantiate (Class type, Configuration conf, boolean fatal)
-	{ 
-		Object obj = newInstance (_name, type, conf, true);
-		Configurations.configureInstance (obj, conf, _props, 
-			(fatal) ? getProperty () : null);
-		if (_singleton)
-			set (obj, true);
-		return obj;
-	}
-
-
-	/**
-	 *	Allow subclasses to instantiate additional plugins.  This method does
-	 *	not perform configuration.
-	 */
-	public Object newInstance (String clsName, Class type, 
-		Configuration conf, boolean fatal)
-	{
-		return Configurations.newInstance (clsName, this, conf,
-			type.getClassLoader (), fatal);
-	}
-
-
-	public void set (Object obj, boolean derived)
-	{
-		if (!_singleton)
-			throw new IllegalStateException (_loc.get ("not-singleton",
-				getProperty ()));
-		super.set (obj, derived);
-	}
-
-
-	public String getString ()
-	{
-		return Configurations.getPlugin (alias (_name), _props);
-	}
-
-
-	public void setString (String str)
-	{
-		_name = Configurations.getClassName (str);
-		_name = unalias (_name);
-		_props = Configurations.getProperties (str);
-		if (_singleton)
-			set (null, true);
-		valueChanged ();
-	}
-
-
-	public Class getValueType ()
-	{
-		return Object.class;
-	}
-
-
-	protected void objectChanged ()
-	{
-		Object obj = get ();
-		_name = (obj == null) ? unalias (null) : obj.getClass ().getName ();
-		_props = null;
-	}
-
-
-	protected String getInternalString ()
-	{
-		// should never get called
-		throw new IllegalStateException ();
-	}
-
-
-	protected void setInternalString (String str)
-	{
-		// should never get called
-		throw new IllegalStateException ();
-	}
+public class PluginValue extends ObjectValue {
+    private static final Localizer _loc = Localizer.forPackage(PluginValue.class);
+    private final boolean _singleton;
+    private String _name = null;
+    private String _props = null;
+
+    public PluginValue(String prop, boolean singleton) {
+        super(prop);
+        _singleton = singleton;
+    }
+
+    /**
+     *  Whether this value is a singleton.
+     */
+    public boolean isSingleton() {
+        return _singleton;
+    }
+
+    /**
+     *  The plugin class name.
+     */
+    public String getClassName() {
+        return _name;
+    }
+
+    /**
+     *  The plugin class name.
+     */
+    public void setClassName(String name) {
+        String oldName = _name;
+        _name = name;
+
+        if (!StringUtils.equals(oldName, name)) {
+            if (_singleton) {
+                set(null, true);
+            }
+
+            valueChanged();
+        }
+    }
+
+    /**
+     *  The plugin properties.
+     */
+    public String getProperties() {
+        return _props;
+    }
+
+    /**
+     *  The plugin properties.
+     */
+    public void setProperties(String props) {
+        String oldProps = _props;
+        _props = props;
+
+        if (!StringUtils.equals(oldProps, props)) {
+            if (_singleton) {
+                set(null, true);
+            }
+
+            valueChanged();
+        }
+    }
+
+    /**
+     *  Instantiate the plugin as an instance of the given class.
+     */
+    public Object instantiate(Class type, Configuration conf, boolean fatal) {
+        Object obj = newInstance(_name, type, conf, fatal);
+        Configurations.configureInstance(obj, conf, _props,
+            (fatal) ? getProperty() : null);
+
+        if (_singleton) {
+            set(obj, true);
+        }
+
+        return obj;
+    }
+
+    public void set(Object obj, boolean derived) {
+        if (!_singleton) {
+            throw new IllegalStateException(_loc.get("not-singleton",
+                    getProperty()));
+        }
+
+        super.set(obj, derived);
+    }
+
+    public String getString() {
+        return Configurations.getPlugin(alias(_name), _props);
+    }
+
+    public void setString(String str) {
+        _name = Configurations.getClassName(str);
+        _name = unalias(_name);
+        _props = Configurations.getProperties(str);
+
+        if (_singleton) {
+            set(null, true);
+        }
+
+        valueChanged();
+    }
+
+    public Class getValueType() {
+        return Object.class;
+    }
+
+    protected void objectChanged() {
+        Object obj = get();
+        _name = (obj == null) ? unalias(null) : obj.getClass().getName();
+        _props = null;
+    }
+
+    protected String getInternalString() {
+        // should never get called
+        throw new IllegalStateException();
+    }
+
+    protected void setInternalString(String str) {
+        // should never get called
+        throw new IllegalStateException();
+    }
 }

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringListValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringListValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringListValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringListValue.java Wed Jun 28 12:34:33 2006
@@ -15,73 +15,57 @@
  */
 package org.apache.openjpa.lib.conf;
 
-
 import serp.util.*;
 
 
 /**
- *	<p>A comma-separated list of string values.</p>
+ *  <p>A comma-separated list of string values.</p>
  *
- *	@author	Abe White
+ *  @author Abe White
  */
-public class StringListValue
-	extends Value
-{
-	public static final String[] EMPTY = new String[0];
-
- 	private String[] _values = EMPTY;
-
-
-	public StringListValue (String prop)
-	{
-		super (prop);
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public void set (String[] values)
-	{
-		_values = (values == null) ? EMPTY : values;
-		valueChanged ();
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public String[] get ()
-	{
-		return _values;
-	}
-
-
-	public Class getValueType ()
-	{
-		return String[].class;
-	}
-
-
-	protected String getInternalString ()
-	{
-		return Strings.join (_values, ", ");
-	}
-
-
-	protected void setInternalString (String val)
-	{
-		String[] vals = Strings.split (val, ",", 0);
-		if (vals != null)
-			for (int i = 0; i < vals.length; i++)
-				vals[i] = vals[i].trim ();
-		set (vals);
-	}
-
-
-	protected void setInternalObject (Object obj)
-	{
-		set ((String[]) obj);
-	}
+public class StringListValue extends Value {
+    public static final String[] EMPTY = new String[0];
+    private String[] _values = EMPTY;
+
+    public StringListValue(String prop) {
+        super(prop);
+    }
+
+    /**
+     *  The internal value.
+     */
+    public void set(String[] values) {
+        _values = (values == null) ? EMPTY : values;
+        valueChanged();
+    }
+
+    /**
+     *  The internal value.
+     */
+    public String[] get() {
+        return _values;
+    }
+
+    public Class getValueType() {
+        return String[].class;
+    }
+
+    protected String getInternalString() {
+        return Strings.join(_values, ", ");
+    }
+
+    protected void setInternalString(String val) {
+        String[] vals = Strings.split(val, ",", 0);
+
+        if (vals != null) {
+            for (int i = 0; i < vals.length; i++)
+                vals[i] = vals[i].trim();
+        }
+
+        set(vals);
+    }
+
+    protected void setInternalObject(Object obj) {
+        set((String[]) obj);
+    }
 }
-

Modified: incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringValue.java?rev=417856&r1=415364&r2=417856&view=diff
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringValue.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/main/java/org/apache/openjpa/lib/conf/StringValue.java Wed Jun 28 12:34:33 2006
@@ -19,64 +19,49 @@
 
 
 /**
- *	A string {@link Value}.
+ *  A string {@link Value}.
  *
- *	@author	Marc Prud'hommeaux
+ *  @author Marc Prud'hommeaux
  */
-public class StringValue
-	extends Value
-{
- 	private String value;
+public class StringValue extends Value {
+    private String value;
 
-
-	public StringValue (String prop)
-	{
-		super (prop);
-	}
-
-
-	public Class getValueType ()
-	{
-		return String.class;
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public String get ()
-	{
-		return value;
-	}
-
-
-	/**
-	 *	The internal value.
-	 */
-	public void set (String value)
-	{
-		String oldValue = this.value;
-		this.value = value;
-		if (!StringUtils.equals (value, oldValue))
-			valueChanged ();
-	}
-
-
-	protected String getInternalString ()
-	{
-		return get ();
-	}
-
-
-	protected void setInternalString (String val)
-	{
-		set (val);
-	}
-
-
-	protected void setInternalObject (Object obj)
-	{
-		set ((String) obj);
-	}
+    public StringValue(String prop) {
+        super(prop);
+    }
+
+    public Class getValueType() {
+        return String.class;
+    }
+
+    /**
+     *  The internal value.
+     */
+    public String get() {
+        return value;
+    }
+
+    /**
+     *  The internal value.
+     */
+    public void set(String value) {
+        String oldValue = this.value;
+        this.value = value;
+
+        if (!StringUtils.equals(value, oldValue)) {
+            valueChanged();
+        }
+    }
+
+    protected String getInternalString() {
+        return get();
+    }
+
+    protected void setInternalString(String val) {
+        set(val);
+    }
+
+    protected void setInternalObject(Object obj) {
+        set((String) obj);
+    }
 }
-