You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by lr...@apache.org on 2009/05/07 00:35:37 UTC

svn commit: r772451 - in /incubator/shindig/trunk/java/gadgets: ./ src/main/java/org/apache/shindig/gadgets/rewrite/ src/main/java/org/apache/shindig/gadgets/templates/ src/main/resources/ src/main/resources/org/ src/main/resources/org/apache/ src/main...

Author: lryan
Date: Wed May  6 22:35:36 2009
New Revision: 772451

URL: http://svn.apache.org/viewvc?rev=772451&view=rev
Log:
Apply server-side template library support patch contributed by Lev. https://issues.apache.org/jira/browse/SHINDIG-1042

Added:
    incubator/shindig/trunk/java/gadgets/src/main/resources/
    incubator/shindig/trunk/java/gadgets/src/main/resources/org/
    incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/
    incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/
    incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/
    incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/templates/
    incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/templates/OSML_library.xml
Modified:
    incubator/shindig/trunk/java/gadgets/pom.xml
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibrary.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateLibraryTest.java

Modified: incubator/shindig/trunk/java/gadgets/pom.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/pom.xml?rev=772451&r1=772450&r2=772451&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/pom.xml (original)
+++ incubator/shindig/trunk/java/gadgets/pom.xml Wed May  6 22:35:36 2009
@@ -73,6 +73,7 @@
           <include>**/*.*</include>
         </includes>
       </resource>
+    
       <resource>
         <targetPath>config</targetPath>
         <directory>${basedir}/../../config</directory>
@@ -80,6 +81,11 @@
           <include>oauth.json</include>
         </includes>
       </resource>
+
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+      </resource>
     </resources>
   </build>
 

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java?rev=772451&r1=772450&r2=772451&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/TemplateRewriter.java Wed May  6 22:35:36 2009
@@ -17,14 +17,19 @@
  */
 package org.apache.shindig.gadgets.rewrite;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.common.util.ResourceLoader;
 import org.apache.shindig.common.xml.DomUtil;
+import org.apache.shindig.common.xml.XmlException;
+import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.expressions.Expressions;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.MessageBundleFactory;
+import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
 import org.apache.shindig.gadgets.spec.Feature;
 import org.apache.shindig.gadgets.spec.MessageBundle;
 import org.apache.shindig.gadgets.templates.CompositeTagRegistry;
@@ -41,6 +46,7 @@
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -83,6 +89,8 @@
   private final Expressions expressions;
   private final TagRegistry baseTagRegistry;
   private final TemplateLibraryFactory libraryFactory;
+  
+  private final TemplateLibrary osmlLibrary;
 
   @Inject
   public TemplateRewriter(Provider<TemplateProcessor> processor,
@@ -93,8 +101,24 @@
     this.expressions = expressions;
     this.baseTagRegistry = baseTagRegistry;
     this.libraryFactory = libraryFactory;
+    this.osmlLibrary = loadOsmlLibrary();
   }
 
+  private TemplateLibrary loadOsmlLibrary() {
+    try {
+      String content = ResourceLoader.getContent(
+          "org/apache/shindig/gadgets/templates/OSML_library.xml");              
+      return new TemplateLibrary(Uri.parse("#OSML"), XmlUtil.parse(content), true);
+    } catch (IOException ioe) {
+      logger.log(Level.WARNING, null, ioe);
+    } catch (XmlException xe) {
+      logger.log(Level.WARNING, null, xe);
+    } catch (GadgetException tpe) {
+      logger.log(Level.WARNING, null, tpe);
+    }
+    return null;
+  }
+  
   public void rewrite(Gadget gadget, MutableContent content) {
     Feature f = gadget.getSpec().getModulePrefs().getFeatures()
         .get("opensocial-templates");
@@ -120,23 +144,28 @@
   }
 
   private void rewriteImpl(Gadget gadget, Feature f, MutableContent content)
-      throws GadgetException {
-    List<Element> templates = ImmutableList.copyOf(
-      Iterables.filter(
-          DomUtil.getElementsByTagNameCaseInsensitive(content.getDocument(), TAGS),
-          new Predicate<Element>() {
-            public boolean apply(Element element) {
-              return "text/os-template".equals(element.getAttribute("type"));
-            }
-          }));
-    
+      throws GadgetException {   
     List<TagRegistry> registries = Lists.newArrayList();
-    
-    registries.add(baseTagRegistry);
 
     Element head = (Element) DomUtil.getFirstNamedChildNode(
         content.getDocument().getDocumentElement(), "head");
+    
+    registries.add(baseTagRegistry);
+    
+    if (osmlLibrary != null) {
+      registries.add(osmlLibrary.getTagRegistry());
+      injectTemplateLibrary(osmlLibrary, head);
+    }
 
+    List<Element> templates = ImmutableList.copyOf(
+        Iterables.filter(
+            DomUtil.getElementsByTagNameCaseInsensitive(content.getDocument(), TAGS),
+            new Predicate<Element>() {
+              public boolean apply(Element element) {
+                return "text/os-template".equals(element.getAttribute("type"));
+              }
+            }));
+    
     loadTemplateLibraries(gadget.getContext(), f, registries, head);
     registries.add(registerCustomTags(templates));
     
@@ -157,23 +186,9 @@
         TemplateLibrary library = libraryFactory.loadTemplateLibrary(context, uri);
         String script = library.getJavaScript();
         
-        // Append any needed Javascript
-        if (!StringUtils.isEmpty(script)) {
-          Element scriptElement = head.getOwnerDocument().createElement("script");
-          scriptElement.setAttribute("type", "text/javascript");
-          scriptElement.setTextContent(script);
-          head.appendChild(scriptElement);
-        }
+        // TODO: Only inject if used?
+        injectTemplateLibrary(library, head);
         
-        // Append any needed CSS
-        String style = library.getStyle();
-        if (!StringUtils.isEmpty(style)) {
-          Element styleElement = head.getOwnerDocument().createElement("style");
-          styleElement.setAttribute("type", "text/css");
-          styleElement.setTextContent(style);
-          head.appendChild(styleElement);
-        }
-
         registries.add(library.getTagRegistry());
       } catch (TemplateParserException te) {
         // Suppress exceptions due to malformed template libraries
@@ -182,6 +197,32 @@
     }
   }
   
+  private void injectTemplateLibrary(TemplateLibrary library, Element head) {  
+    // Append any needed Javascript
+    String script = library.getJavaScript();
+    if (!StringUtils.isEmpty(script)) {
+      Element scriptElement = head.getOwnerDocument().createElement("script");
+      scriptElement.setAttribute("type", "text/javascript");
+      scriptElement.setTextContent(script);
+      if (library.isSafe()) {
+        SanitizingGadgetRewriter.bypassSanitization(scriptElement, false);
+      }
+      head.appendChild(scriptElement);
+    }
+    
+    // Append any needed CSS
+    String style = library.getStyle();
+    if (!StringUtils.isEmpty(style)) {
+      Element styleElement = head.getOwnerDocument().createElement("style");
+      styleElement.setAttribute("type", "text/css");
+      styleElement.setTextContent(style);
+      if (library.isSafe()) {
+        SanitizingGadgetRewriter.bypassSanitization(styleElement, false);
+      }
+      head.appendChild(styleElement);
+    } 
+  }
+  
   /**
    * Register templates with a "tag" attribute.
    */

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibrary.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibrary.java?rev=772451&r1=772450&r2=772451&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibrary.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateLibrary.java Wed May  6 22:35:36 2009
@@ -33,7 +33,6 @@
 
 /**
  * An Object representing a Library of Template-based custom OSML tags.
- * TODO: support embedded style and script per tag 
  */
 public class TemplateLibrary {
 
@@ -45,19 +44,35 @@
   public static final String TEMPLATEDEF_TAG = "TemplateDef";
   
   private final Uri libraryUri;
+  private final boolean safe;
   private TagRegistry registry;
   private String nsPrefix;
   private String nsUri;
   private String style;
   private String javaScript;
-  
+
+  /**
+   * @param uri URI of the template library
+   * @param root Element representing the Templates tag of this library
+   */
   public TemplateLibrary(Uri uri, Element root) throws GadgetException, TemplateParserException {
+    this(uri, root, false);
+  }
+
+  /**
+   * @param uri URI of the template library
+   * @param root Element representing the Templates tag of this library
+   * @param safe Is this library exempt from being sanitized?
+   */
+  public TemplateLibrary(Uri uri, Element root, boolean safe) 
+      throws GadgetException, TemplateParserException {
     libraryUri = uri;
     registry = new DefaultTagRegistry(parseLibraryDocument(root));
+    this.safe = safe;
   }
-  
+
   /**
-   * @return a registry of tags.
+   * @return a registry of tags in this library.
    */
   public TagRegistry getTagRegistry() {
     return registry;
@@ -79,6 +94,14 @@
   }
   
   /**
+   * @return this library is safe and its content doesn't need to be sanitized. 
+   */
+  public boolean isSafe() {
+    return safe;
+  }
+  
+  /**
+   * TODO: Minify javascript (here or elsewhere)
    * @return the concatenated contents of JavaScript elements for the library.
    */
   public String getJavaScript() {
@@ -125,6 +148,16 @@
     if (handler != null) {
       handlers.add(handler);
     }
+    
+    Element scriptElement = (Element) DomUtil.getFirstNamedChildNode(defElement, JAVASCRIPT_TAG);
+    if (scriptElement != null) {
+      processJavaScript(scriptElement);
+    }
+    
+    Element styleElement = (Element) DomUtil.getFirstNamedChildNode(defElement, STYLE_TAG);
+    if (styleElement != null) {
+      processStyle(styleElement);
+    }
   }
 
   private void processTemplate(Builder<TagHandler> handlers, Element templateElement)

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java?rev=772451&r1=772450&r2=772451&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateModule.java Wed May  6 22:35:36 2009
@@ -42,10 +42,10 @@
     private final Set<TagHandler> handlers;
     
     @Inject
-    public TagHandlersProvider(HtmlTagHandler htmlHandler, NameTagHandler nameHandler,
+    public TagHandlersProvider(HtmlTagHandler htmlHandler, 
         IfTagHandler ifHandler, RepeatTagHandler repeatHandler, 
         RenderTagHandler renderHandler, FlashTagHandler flashHandler) {
-      handlers = ImmutableSet.of((TagHandler) htmlHandler, nameHandler, ifHandler,
+      handlers = ImmutableSet.of((TagHandler) htmlHandler, ifHandler,
           repeatHandler, renderHandler, flashHandler);
     }
     

Added: incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/templates/OSML_library.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/templates/OSML_library.xml?rev=772451&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/templates/OSML_library.xml (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/resources/org/apache/shindig/gadgets/templates/OSML_library.xml Wed May  6 22:35:36 2009
@@ -0,0 +1,81 @@
+<Templates xmlns:os="http://ns.opensocial.org/2008/markup">
+  <Namespace prefix="os" url="http://ns.opensocial.org/2008/markup"/>
+  <Template tag="os:Name">
+    <os:If condition="${!My.person.profileUrl}">
+      ${My.person.name.formatted}
+    </os:If>
+    <a href="${My.person.profileUrl}" if="${My.person.profileUrl}">${My.person.name.formatted}</a>
+  </Template>
+  <Template tag="os:Badge">
+    <div>
+      <img src="${My.person.thumbnailUrl}" if="${My.person.thumbnailUrl}"/>
+      <os:If condition="${!My.person.profileUrl}">
+        ${My.person.name.formatted}
+      </os:If>
+      <a href="${My.person.profileUrl}" if="${My.person.profileUrl}">${My.person.name.formatted}</a>
+    </div> 
+  </Template>
+  <TemplateDef tag="os:PeopleSelector">
+    <Template>
+      <select onchange="os_PeopleSelector_onchange(this)" 
+          name="${My.inputName}" 
+          multiple="${My.multiple}"
+          x-var="${My.var}"
+          x-max="${My.max}"
+          x-onselect="${My.onselect}">
+        <option repeat="${My.group}" value="${Cur.id}" selected="${Cur.id == My.selected}">${Cur.name.formatted}</option>          
+      </select>
+    </Template>
+    <JavaScript><![CDATA[
+        function os_PeopleSelector_onchange(select) {
+          var selected;
+          if (!select.multiple) {
+            selected = select.options[select.selectedIndex].value;
+          } else {
+            selected = [];
+            for (var i = 0; i < select.options.length; i++) {
+              if (select.options[i].selected) {
+                selected.push(select.options[i].value);
+              }
+            }
+            var max = select.getAttribute("x-max");
+            try {
+              max = 1*max;
+            } catch (e) {
+              max = 0;
+            }
+            if (max && selected.length > max && select['x-selected']) {
+              selected = select['x-selected'];
+              for (var i = 0; i < select.options.length; i++) {
+                select.options[i].selected = false;
+                for (var j = 0; j < selected.length; j++) {
+                  if (select.options[i].value == selected[j]) {
+                    select.options[i].selected = true;
+                    break;
+                  }
+                }
+              }
+            }
+          }
+          select['x-selected'] = selected;          
+          var varAttr = select.getAttribute("x-var");
+          if (varAttr) {
+            if (opensocial.data) {
+              opensocial.data.getDataContext().putDataSet(varAttr, selected);
+            }
+          }
+          var onSelect = select.getAttribute("x-onselect");
+          if (onSelect) {
+            if (window[onSelect] && typeof(window[onSelect]) == 'function') {
+              window[onSelect](selected);
+            } else {
+              if (!select['x-onselect-fn']) {
+                select['x-onselect-fn'] = new Function(onSelect);
+              }
+              select['x-onselect-fn'].apply(select);
+            }
+          }
+        }
+    ]]></JavaScript>
+  </TemplateDef>
+</Templates>

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateLibraryTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateLibraryTest.java?rev=772451&r1=772450&r2=772451&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateLibraryTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/templates/TemplateLibraryTest.java Wed May  6 22:35:36 2009
@@ -45,6 +45,8 @@
     "  <Template tag='my:Flat'>Flat tag</Template>" +
     "  <TemplateDef tag='my:Def'>" +
     "    <Template>Def tag</Template>" +
+    "    <JavaScript>script3</JavaScript>" +
+    "    <Style>style3</Style>" +
     "  </TemplateDef>" +
     "</Templates>";
   
@@ -77,11 +79,11 @@
 
   @Test
   public void testScript() {
-    assertEquals("script\nscript2", lib.getJavaScript());
+    assertEquals("script\nscript2\nscript3", lib.getJavaScript());
   }
   
   @Test
   public void testStyle() {
-    assertEquals("style\nstyle2", lib.getStyle());
+    assertEquals("style\nstyle2\nstyle3", lib.getStyle());
   }
 }