Reviewers: dev_shindig.apache.org,

Description:
Currently when the container receives gadget metadata, that metadata
does not include the feature parameters. This prevents container-side
features that rely on gadget supplied parameters from being able to use
them. The patch adds getParams to the Feature interface in
org.apache.shindig.gadgets.servlet.GadgetsHandlerApi and adds Multimap
support to org.apache.shindig.protocol.conversion.BeanDelegator. The
resulting metadata includes feature params.

Please review this at http://codereview.appspot.com/4314055/

Affected files:
java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerApi.java


### Eclipse Workspace Patch 1.0
#P shindig-project
Index: java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerApi.java
===================================================================
--- java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerApi.java (revision 4252) +++ java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerApi.java (working copy)
@@ -20,6 +20,8 @@

 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.protocol.conversion.BeanFilter.Unfiltered;
+
+import com.google.common.collect.Multimap;
 // Keep imports clean, so it is clear what is used by API

 import java.util.List;
@@ -163,7 +165,7 @@
     public String getName();
     public boolean getRequired();
     // TODO: Handle multi map if params are needed
-    // public Multimap<String, String> getParams();
+  public Multimap<String, String> getParams();
   }

   public interface LinkSpec {
Index: java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java
===================================================================
--- java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java (revision 4252) +++ java/common/src/main/java/org/apache/shindig/protocol/conversion/BeanDelegator.java (working copy)
@@ -21,8 +21,10 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;

 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.uri.Uri;
@@ -161,6 +163,21 @@
       }
     }

+    // Proxy each item in a map (map key is not proxied)
+    if (source instanceof Multimap<?, ?>) {
+      Multimap<?, ?> mapSource = (Multimap<?, ?>) source;
+      if (!mapSource.isEmpty() && delegatedClasses.containsKey(
+          mapSource.values().iterator().next().getClass())) {
+        // Convert Map:
+ ImmutableMultimap.Builder<Object, Object> mapBuilder = ImmutableMultimap.builder();
+        for (Map.Entry<?, ?> entry : mapSource.entries()) {
+ mapBuilder.put(entry.getKey(), createDelegator(entry.getValue(), apiInterface));
+        }
+        return (T) mapBuilder.build();
+      } else {
+        return (T) source;
+      }
+    }
     // Proxy each item in a list
     if (source instanceof List<?>) {
       List<?> listSource = (List<?>) source;
@@ -250,6 +267,8 @@
         type = paramType.getActualTypeArguments()[0];
} else if (Map.class.isAssignableFrom((Class<?>) paramType.getRawType())) {
         type = paramType.getActualTypeArguments()[1];
+ } else if (Multimap.class.isAssignableFrom((Class<?>) paramType.getRawType())) {
+        type = paramType.getActualTypeArguments()[1];
       }
     }
     return (Class<?>) type;
@@ -313,6 +332,18 @@
         interfaceType = interfaceParamType.getActualTypeArguments()[1];
         return validateTypes(dataType, interfaceType);
       }
+
+ if (Multimap.class.isAssignableFrom((Class<?>) dataParamType.getRawType()) && + Multimap.class.isAssignableFrom((Class<?>) interfaceParamType.getRawType())) {
+            Type dataKeyType = dataParamType.getActualTypeArguments()[0];
+ Type interfaceKeyType = interfaceParamType.getActualTypeArguments()[0]; + if (dataKeyType != interfaceKeyType | | !PRIMITIVE_TYPE_CLASSES.contains(dataKeyType)) {
+              return false;
+            }
+            dataType = dataParamType.getActualTypeArguments()[1];
+            interfaceType = interfaceParamType.getActualTypeArguments()[1];
+            return validateTypes(dataType, interfaceType);
+          }
       // Only support Map and List generics
       return false;
     }


Reply via email to