[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