[jboss-cvs] JBossAS SVN: r84841 - in projects/jboss-man/branches/Branch_2_1/metatype/src: main/java/org/jboss/metatype/plugins/values and 1 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Feb 26 23:39:57 EST 2009
Author: scott.stark at jboss.org
Date: 2009-02-26 23:39:57 -0500 (Thu, 26 Feb 2009)
New Revision: 84841
Modified:
projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/api/values/MapCompositeValueSupport.java
projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/CompositeValueInvocationHandler.java
projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/DefaultMetaValueFactory.java
projects/jboss-man/branches/Branch_2_1/metatype/src/test/java/org/jboss/test/metatype/values/factory/test/CompositeValueFactoryUnitTestCase.java
Log:
JBMAN-61, handle unwrapping MapCompositeMetaType into Map
Modified: projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/api/values/MapCompositeValueSupport.java
===================================================================
--- projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/api/values/MapCompositeValueSupport.java 2009-02-27 04:32:55 UTC (rev 84840)
+++ projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/api/values/MapCompositeValueSupport.java 2009-02-27 04:39:57 UTC (rev 84841)
@@ -92,6 +92,11 @@
map.put(key, value);
}
+ public MetaValue remove(String key)
+ {
+ return map.remove(key);
+ }
+
public MetaValue[] getAll(String[] keys)
{
List<MetaValue> values = new ArrayList<MetaValue>();
Modified: projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/CompositeValueInvocationHandler.java
===================================================================
--- projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/CompositeValueInvocationHandler.java 2009-02-27 04:32:55 UTC (rev 84840)
+++ projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/CompositeValueInvocationHandler.java 2009-02-27 04:39:57 UTC (rev 84841)
@@ -26,11 +26,17 @@
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
+import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import java.util.WeakHashMap;
+import java.util.Map.Entry;
+import org.jboss.metatype.api.types.MapCompositeMetaType;
import org.jboss.metatype.api.values.CompositeValue;
+import org.jboss.metatype.api.values.MapCompositeValueSupport;
import org.jboss.metatype.api.values.MetaValue;
import org.jboss.metatype.api.values.MetaValueFactory;
import org.jboss.util.UnreachableStatementException;
@@ -40,6 +46,8 @@
*
* @author <a href="mailto:ales.justin at jboss.com">Ales Justin</a>
* @author <a href="adrian at jboss.com">Adrian Brock</a>
+ * @author Scott.Stark at jboss.org
+ * @version $Revision:$
*/
public class CompositeValueInvocationHandler implements InvocationHandler, Serializable
{
@@ -78,15 +86,16 @@
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
- if (Object.class.equals(method.getDeclaringClass()))
+ Class<?> declaringClass = method.getDeclaringClass();
+ if (Object.class.equals(declaringClass))
return handleObjectInvocation(method.getName(), args);
- // Map size
+ Type returnType = method.getGenericReturnType();
+ // size
if(method.getName().equals("size"))
return compositeValue.values().size();
MetaValue value = compositeValue.get(getCompositeDataKey(method));
- Type returnType = method.getGenericReturnType();
return factory.unwrap(value, returnType);
}
@@ -158,4 +167,137 @@
compositeDataKeyCache.put(method, result);
return result;
}
+
+ /*
+ static class MapCVProxy implements Map<String, Object>
+ {
+ private CompositeValue delegate;
+
+ MapCVProxy(CompositeValue delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public void clear()
+ {
+ }
+
+ public boolean containsKey(Object key)
+ {
+ return delegate.containsKey(key.toString());
+ }
+
+ public boolean containsValue(Object value)
+ {
+ if ((value instanceof MetaValue) == false)
+ {
+ value = factory.create(value);
+ }
+ MetaValue mv = MetaValue.class.cast(value);
+ return delegate.containsValue(mv);
+ }
+
+ public Set<Entry<String, Object>> entrySet()
+ {
+ HashSet<Entry<String, MetaValue>> entrySet = new HashSet<Entry<String, MetaValue>>();
+ for(String key : delegate.getMetaType().itemSet())
+ {
+ MetaValue value = delegate.get(key);
+ Map.Entry<String, Object> entry = new MapCVProxyEntry(key, value);
+ entrySet.add(entry);
+ }
+ return entrySet;
+ }
+
+ public MetaValue get(Object key)
+ {
+ return delegate.get(key.toString());
+ }
+
+ public boolean isEmpty()
+ {
+ return delegate.values().size() == 0;
+ }
+
+ public Set<String> keySet()
+ {
+ return delegate.getMetaType().itemSet();
+ }
+
+ public MetaValue put(String key, MetaValue value)
+ {
+ MetaValue old = null;
+ if (delegate instanceof MapCompositeValueSupport)
+ {
+ MapCompositeValueSupport mcvs = (MapCompositeValueSupport) delegate;
+ old = mcvs.get(key);
+ if ((value instanceof MetaValue) == false)
+
+ mcvs.put(key, value);
+ }
+ return old;
+ }
+
+ public void putAll(Map<? extends String, ? extends Object> map)
+ {
+ if (delegate instanceof MapCompositeValueSupport)
+ {
+ MapCompositeValueSupport mcvs = (MapCompositeValueSupport) delegate;
+ for(String key : map.keySet())
+ {
+ Object mv = map.get(key);
+ if ((mv instanceof MetaValue) == false)
+ mv = factory.create(mv);
+ mcvs.put(key, (MetaValue) mv);
+ }
+ }
+ }
+
+ public Object remove(Object key)
+ {
+ if (delegate instanceof MapCompositeValueSupport)
+ {
+ MapCompositeValueSupport mcvs = (MapCompositeValueSupport) delegate;
+ return mcvs.remove(key.toString());
+ }
+ return null;
+ }
+
+ public int size()
+ {
+ return delegate.values().size();
+ }
+
+ public Collection<Object> values()
+ {
+ return delegate.values();
+ }
+
+ }
+ static class MapCVProxyEntry implements Entry<String, Object>
+ {
+ private String key;
+ private Object value;
+ MapCVProxyEntry(String key, Object value)
+ {
+ this.key = key;
+ this.value = value;
+ }
+ public String getKey()
+ {
+ return key;
+ }
+ public Object getValue()
+ {
+ return value;
+ }
+
+ public Object setValue(Object value)
+ {
+ Object old = value;
+ this.value = value;
+ return old;
+ }
+ }
+ */
}
Property changes on: projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/CompositeValueInvocationHandler.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Modified: projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/DefaultMetaValueFactory.java
===================================================================
--- projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/DefaultMetaValueFactory.java 2009-02-27 04:32:55 UTC (rev 84840)
+++ projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/DefaultMetaValueFactory.java 2009-02-27 04:39:57 UTC (rev 84841)
@@ -87,7 +87,8 @@
*
* @author <a href="ales.justin at jboss.com">Ales Justin</a>
* @author <a href="adrian at jboss.com">Adrian Brock</a>
- * @version $Revision: 1.1 $
+ * @author Scott.Stark at jboss.org
+ * @version $Revision$
*/
public class DefaultMetaValueFactory extends MetaValueFactory
{
@@ -738,8 +739,12 @@
ClassInfo classInfo = beanInfo.getClassInfo();
if (classInfo.isInterface())
{
+ Class<?> clazz = classInfo.getType();
+ // Handle map specially
+ if (clazz.isAssignableFrom(Map.class))
+ return unwrapCompositeMap(compositeValue);
+
InvocationHandler handler = createCompositeValueInvocationHandler(compositeValue);
- Class<?> clazz = classInfo.getType();
Class<?>[] interfaces = new Class[]{clazz};
return Proxy.newProxyInstance(clazz.getClassLoader(), interfaces, handler);
}
@@ -759,6 +764,19 @@
}
}
+ protected Map unwrapCompositeMap(CompositeValue compositeValue)
+ {
+ HashMap map = new HashMap();
+ CompositeMetaType metaType = compositeValue.getMetaType();
+ for(String key : metaType.itemSet())
+ {
+ MetaValue mv = compositeValue.get(key);
+ Object value = unwrap(mv);
+ map.put(key, value);
+ }
+ return map;
+ }
+
/**
* Create composite invocation handler.
*
Property changes on: projects/jboss-man/branches/Branch_2_1/metatype/src/main/java/org/jboss/metatype/plugins/values/DefaultMetaValueFactory.java
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Modified: projects/jboss-man/branches/Branch_2_1/metatype/src/test/java/org/jboss/test/metatype/values/factory/test/CompositeValueFactoryUnitTestCase.java
===================================================================
--- projects/jboss-man/branches/Branch_2_1/metatype/src/test/java/org/jboss/test/metatype/values/factory/test/CompositeValueFactoryUnitTestCase.java 2009-02-27 04:32:55 UTC (rev 84840)
+++ projects/jboss-man/branches/Branch_2_1/metatype/src/test/java/org/jboss/test/metatype/values/factory/test/CompositeValueFactoryUnitTestCase.java 2009-02-27 04:39:57 UTC (rev 84841)
@@ -249,4 +249,30 @@
assertTrue("CV contains propertyReplace", cmv.containsKey("propertyReplace"));
assertTrue("CV contains type", cmv.containsKey("type"));
}
+
+ /**
+ * JBMAN-61, validate proxy for MapCompositeValue unwrapping intercepts the
+ * Map.get(key) calls.
+ */
+ public void testMapCompositeValueProxy()
+ {
+ Properties props = System.getProperties();
+ log.debug(props);
+ // Convert to MetaValue
+ MetaValue propsMV = createMetaValue(props);
+ assertNotNull(propsMV);
+ assertTrue(propsMV instanceof CompositeValue);
+ // Unwrap to excercise the proxy via a Map interface
+ Map map = (Map) unwrapMetaValue(propsMV);
+ assertEquals(props.size(), map.size());
+ assertEquals(props.getProperty("java.runtime.name"), map.get("java.runtime.name"));
+ assertEquals(props.getProperty("java.library.path"), map.get("java.library.path"));
+ assertTrue("java.runtime.name", map.containsKey("java.runtime.name"));
+ assertTrue("java.runtime.name", map.containsValue(props.getProperty("java.runtime.name")));
+ assertFalse(map.isEmpty());
+ assertEquals(map.keySet(), props.keySet());
+ map.put("testMapCompositeValueProxy", "testMapCompositeValueProxy-value");
+ assertTrue("testMapCompositeValueProxy", map.containsKey("java.runtime.name"));
+ assertEquals("testMapCompositeValueProxy-value", map.get("testMapCompositeValueProxy"));
+ }
}
More information about the jboss-cvs-commits
mailing list