Author: [email protected]
Date: Fri Jan  6 12:25:55 2012
New Revision: 1890

Log:
[AMDATUOPENSOCIAL-141] Fixed proper rendering of user preferences even if 
userprefs stored in AppData are non-Strings (which is theoretically impossible 
in the Shindig API, but has been proven to be possible)

Modified:
   
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java

Modified: 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
==============================================================================
--- 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
  (original)
+++ 
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
  Fri Jan  6 12:25:55 2012
@@ -85,7 +85,7 @@
 
     // Thread safe implementation of gadget spec cache
     private ConcurrentMap<String, FutureTask<Object[]>> m_gadgetSpecCache =
-        new ConcurrentHashMap<String, FutureTask<Object[]>>();
+                    new ConcurrentHashMap<String, FutureTask<Object[]>>();
 
     // Service dependencies injected by the dependency manager
     private volatile Tenant m_tenant;
@@ -103,14 +103,14 @@
 
         // Create a service dependency on the token provider for 'our' tenant
         String tenantFilter =
-            "(&(" + Tenant.TENANT_ID_SERVICEPROPERTY + "=" + m_tenant.getId() 
+ ")(" + Constants.OBJECTCLASS
-                + "=" + TokenProvider.class.getName() + "))";
+                        "(&(" + Tenant.TENANT_ID_SERVICEPROPERTY + "=" + 
m_tenant.getId() + ")(" + Constants.OBJECTCLASS
+                        + "=" + TokenProvider.class.getName() + "))";
         dependencies.add(m_dependencyManager.createServiceDependency()
             .setService(TokenProvider.class, 
tenantFilter).setRequired(true).setInstanceBound(true));
 
         String tenantFilter2 =
-            "(&(" + Tenant.TENANT_ID_SERVICEPROPERTY + "=" + m_tenant.getId() 
+ ")(" + Constants.OBJECTCLASS
-                + "=" + UserAdmin.class.getName() + "))";
+                        "(&(" + Tenant.TENANT_ID_SERVICEPROPERTY + "=" + 
m_tenant.getId() + ")(" + Constants.OBJECTCLASS
+                        + "=" + UserAdmin.class.getName() + "))";
         dependencies.add(m_dependencyManager.createServiceDependency()
             .setService(UserAdmin.class, 
tenantFilter2).setRequired(true).setInstanceBound(true));
 
@@ -171,12 +171,12 @@
                 gadgetSpec.put("title_url", 
spec.getModulePrefs().getTitleUrl().toString());
 
                 if (spec.getModulePrefs().getScreenshot() != null
-                    && 
!spec.getModulePrefs().getScreenshot().toString().isEmpty()) {
+                                && 
!spec.getModulePrefs().getScreenshot().toString().isEmpty()) {
                     gadgetSpec.put("screenshot", 
spec.getModulePrefs().getScreenshot().toString());
                 }
                 else {
                     gadgetSpec.put("screenshot", request.getContextPath() + 
Activator.ALIAS +
-                        "/static/images/defaultgadget.png");
+                                    "/static/images/defaultgadget.png");
                 }
 
                 return gadgetSpec;
@@ -194,7 +194,7 @@
     }
 
     private GadgetSpec loadGadgetSpec(final String gadgetUrl, Map<String, 
String> userPrefs)
-        throws ClientProtocolException, IOException, SpecParserException {
+                    throws ClientProtocolException, IOException, 
SpecParserException {
         String xml = loadXMLFromCache(gadgetUrl);
         if (xml != null) {
             GadgetSpec spec = new GadgetSpec(Uri.parse(gadgetUrl), xml);
@@ -221,7 +221,7 @@
                 localeUrl = locales.get(locale).getMessages().toString();
                 if (!localeUrl.isEmpty()) {
                     String messageXML =
-                        
cleanMessageXML(loadContentFromURL(locales.get(locale).getMessages().toString()));
+                                    
cleanMessageXML(loadContentFromURL(locales.get(locale).getMessages().toString()));
                     MessageBundle bundle = new 
MessageBundle(locales.get(locale), messageXML);
                     Substitutions substituter = new Substitutions();
                     substituter.addSubstitutions(Substitutions.Type.MESSAGE, 
bundle.getMessages());
@@ -260,8 +260,13 @@
                 up.setName(pref.getName());
                 up.setRequired(pref.getRequired());
                 if (userPrefValues != null && userPrefValues.containsKey(key)) 
{
-                    up.setValue(userPrefValues.get(key));
-                } else {
+                    // User preferences stored in AppData SHOULD always be 
strings (this is enforced
+                    // by the Shindig API). However, since this is enforced by 
using a generic Map,
+                    // in real-life it can still contain Integers and 
Booleans. So add this additional
+                    // check (also for backwards compatibility).
+                    up.setValue(toString(userPrefValues.get(key)));
+                }
+                else {
                     up.setValue(pref.getDefaultValue());
                 }
                 if ("enum".equalsIgnoreCase(up.getDatatype())) {
@@ -272,7 +277,7 @@
                     }
                     up.setEnumValues(enumValueBeans);
                 }
-                
+
                 userPrefsBean.addUserPref(up);
             }
             return userPrefsBean;
@@ -293,6 +298,19 @@
         return null;
     }
 
+    private String toString(Object userPref) {
+        if (userPref instanceof String) {
+            return (String) userPref;
+        }
+        else if (userPref instanceof Integer) {
+            return ((Integer) userPref).toString();
+        }
+        else if (userPref instanceof Boolean) {
+            return ((Boolean) userPref) ? "1" : "0";
+        }
+        return userPref.toString();
+    }
+
     private String loadContentFromURL(String url) throws 
ClientProtocolException, IOException {
         if (url == null || url.isEmpty()) {
             return "";
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to