Author: lindner
Date: Wed Sep  2 20:12:10 2009
New Revision: 810691

URL: http://svn.apache.org/viewvc?rev=810691&view=rev
Log:
SHINDIG-1159 | Patch from Shaopeng Jia | Not able to access 
gadgets.i18n.DateTimeConstants

Added:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriter.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriterTest.java
Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java

Added: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriter.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriter.java?rev=810691&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriter.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriter.java
 Wed Sep  2 20:12:10 2009
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.shindig.gadgets.render;
+
+import org.apache.shindig.common.util.ResourceLoader;
+import org.apache.shindig.common.xml.DomUtil;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.JsLibrary;
+import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Produce data constants that are needed by the opensocial-i18n
+ * feature based on user locale.
+ */
+public class OpenSocialI18NGadgetRewriter implements GadgetRewriter {
+  private static final String I18N_FEATURE_NAME = "opensocial-i18n";
+  private static final String DATA_PATH = "features/i18n/data/";
+  private Map<Locale, String> i18nConstantsCache = new HashMap<Locale, 
String>();
+
+  public void rewrite(Gadget gadget, MutableContent mutableContent) {
+    // Don't touch sanitized gadgets.
+    if (gadget.sanitizeOutput()) {
+      return;
+    }
+    // Quickly return if opensocial-i18n feature is not needed.
+    if (!gadget.getAllFeatures().contains(I18N_FEATURE_NAME)) {
+      return;
+    }
+
+    try {
+      Document document = mutableContent.getDocument();
+      Element head = 
(Element)DomUtil.getFirstNamedChildNode(document.getDocumentElement(), "head");
+      injectI18NConstants(gadget, head);
+      mutableContent.documentChanged();
+    } catch (GadgetException e) {
+      // TODO: Rewriter interface needs to be modified to handle 
GadgetException or
+      // RewriterException or something along those lines.
+      throw new RuntimeException(e);
+    } 
+  } 
+
+  private void injectI18NConstants(Gadget gadget, Node headTag) throws 
GadgetException {
+    StringBuilder inlineJs = new StringBuilder();
+    Locale locale = gadget.getContext().getLocale();
+    if (i18nConstantsCache.containsKey(locale)) {
+      inlineJs.append(i18nConstantsCache.get(locale));    
+    } else {
+      // load gadgets.i18n.DateTimeConstants and 
gadgets.i18n.NumberFormatConstants
+      String localeName = getLocaleNameForLoadingI18NConstants(locale);
+      JsLibrary dateTimeConstants = JsLibrary.create(JsLibrary.Type.RESOURCE,
+          DATA_PATH + "DateTimeConstants__" + localeName + ".js",
+          "opensocial-i18n", null);
+      JsLibrary numberConstants = JsLibrary.create(JsLibrary.Type.RESOURCE,
+          DATA_PATH + "NumberFormatConstants__" + localeName + ".js",
+          "opensocial-i18n", null);
+      inlineJs.append(dateTimeConstants.getContent())
+        .append("\n").append(numberConstants.getContent()); 
+      i18nConstantsCache.put(locale, inlineJs.toString());
+    }
+    Element inlineTag = headTag.getOwnerDocument().createElement("script");
+    headTag.appendChild(inlineTag);
+    
inlineTag.appendChild(headTag.getOwnerDocument().createTextNode(inlineJs.toString()));
    
+  }
+
+  String getLocaleNameForLoadingI18NConstants(Locale locale) {
+    String localeName = "en"; 
+    String language = locale.getLanguage();
+    String country = locale.getCountry(); 
+    if (!language.equalsIgnoreCase("ALL")) {
+      try {
+        String content = attemptToLoadResource(language);
+        localeName = language; 
+      } catch (IOException e) {
+      }
+    }
+
+    if (!country.equalsIgnoreCase("ALL")) {
+      try {
+        String content = attemptToLoadResource(localeName + "_" + country);
+        localeName += "_" + country; 
+      } catch (IOException e) {
+      }
+    } 
+    return localeName;
+  }
+
+  protected String attemptToLoadResource(String localeName) throws IOException 
{
+    return ResourceLoader.getContent(DATA_PATH
+        + "DateTimeConstants__" + localeName 
+        + ".js");
+  }
+}
+

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java?rev=810691&r1=810690&r2=810691&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
 Wed Sep  2 20:12:10 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
+import org.apache.shindig.gadgets.render.OpenSocialI18NGadgetRewriter;
 import org.apache.shindig.gadgets.render.RenderingGadgetRewriter;
 import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
 import org.apache.shindig.gadgets.render.SanitizingRequestRewriter;
@@ -52,7 +53,8 @@
         CssRequestRewriter cssRewriter,
         CajaContentRewriter cajaRewriter,
         SanitizingGadgetRewriter sanitizedRewriter,
-        RenderingGadgetRewriter renderingRewriter) {
+        RenderingGadgetRewriter renderingRewriter,
+        OpenSocialI18NGadgetRewriter i18nRewriter) {
       rewriters = Lists.newArrayList();
       rewriters.add(pipelineRewriter);
       rewriters.add(templateRewriter);
@@ -60,6 +62,7 @@
       rewriters.add(cajaRewriter);
       rewriters.add(sanitizedRewriter);
       rewriters.add(renderingRewriter);
+      rewriters.add(i18nRewriter);
     }
 
     public List<GadgetRewriter> get() {

Added: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriterTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriterTest.java?rev=810691&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriterTest.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/OpenSocialI18NGadgetRewriterTest.java
 Wed Sep  2 20:12:10 2009
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.shindig.gadgets.render;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.shindig.common.util.ResourceLoader;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+public class OpenSocialI18NGadgetRewriterTest {
+  private OpenSocialI18NGadgetRewriter i18nRewriter;
+  private Locale localeAtRendering;
+
+  @Before
+  public void setUp() throws Exception {
+    i18nRewriter = new FakeOpenSocialI18NGadgetRewriter();
+  }
+
+  @Test
+  public void localeNameForEnglish() throws Exception {
+    localeAtRendering = new Locale("en");
+    assertEquals("en",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+  
+  @Test
+  public void localeNameForEnglishUS() throws Exception {
+    localeAtRendering = new Locale("en", "US");
+    assertEquals("en_US",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+
+  @Test
+  public void localeNameForChinese() throws Exception {
+    localeAtRendering = new Locale("zh");
+    assertEquals("zh",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+
+  @Test
+  public void localeNameForChineseCN() throws Exception {
+    localeAtRendering = new Locale("zh", "CN");
+    assertEquals("zh_CN",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+
+  @Test
+  public void localeNameForChineseAll() throws Exception {
+    localeAtRendering = new Locale("zh", "All");
+    assertEquals("zh",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+
+  @Test
+  public void localeNameForAllCN() throws Exception {
+    localeAtRendering = new Locale("All", "CN");
+    assertEquals("en",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+
+  @Test
+  public void localeNameForDefault() throws Exception {
+    localeAtRendering = new Locale("All", "All");
+    assertEquals("en",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+ 
+  @Test
+  public void localeNameForInvalidCountry() throws Exception {
+    localeAtRendering = new Locale("zh", "foo");
+    assertEquals("zh",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+ 
+  @Test
+  public void localeNameForInvalidLanguage() throws Exception {
+    localeAtRendering = new Locale("foo", "CN");
+    assertEquals("en",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+
+  @Test
+  public void localeNameForInvalidLanguageAndCountry() throws Exception {
+    localeAtRendering = new Locale("foo", "foo");
+    assertEquals("en",
+                 
i18nRewriter.getLocaleNameForLoadingI18NConstants(localeAtRendering));
+  }
+  
+  private static class FakeOpenSocialI18NGadgetRewriter extends 
OpenSocialI18NGadgetRewriter {
+    private Map<String, String> resources = new HashMap<String,String>();
+    public FakeOpenSocialI18NGadgetRewriter() {
+      resources.put("features/i18n/data/DateTimeConstants__en.js", "content 
for en");
+      resources.put("features/i18n/data/DateTimeConstants__en_US.js", "content 
for en_US");
+      resources.put("features/i18n/data/DateTimeConstants__zh.js", "content 
for zh");
+      resources.put("features/i18n/data/DateTimeConstants__zh_CN.js", "content 
for zh_CN");
+    }
+
+    @Override
+    protected String attemptToLoadResource(String localeName) throws 
IOException {
+      String resource = "features/i18n/data/DateTimeConstants__" + localeName 
+ ".js";
+      if (resources.containsKey(resource)) {
+        return resources.get(resource);
+      } else {
+        throw new IOException("Resource Unavailable.");
+      }
+    } 
+  }
+}
+


Reply via email to