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.");
+ }
+ }
+ }
+}
+