You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by aw...@apache.org on 2009/07/13 23:18:16 UTC

svn commit: r793715 - in /incubator/shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/rewrite/ main/java/org/apache/shindig/gadgets/templates/ test/java/org/apache/shindig/gadgets/rewrite/

Author: awiner
Date: Mon Jul 13 21:18:15 2009
New Revision: 793715

URL: http://svn.apache.org/viewvc?rev=793715&view=rev
Log:
Template library improvements:
- For "safe" template libraries, bypass sanitization of content (it was already bypassed for script and CSS resources)
- Support template libraries using custom tag instances
- Delete unused DefaultTemplateLibrary class
- Move OSML-loading code out of TemplateRewriter and into its own class

Added:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ContainerTagLibraryFactory.java   (with props)
Removed:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/DefaultTemplateLibrary.java
Modified:
    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/TemplateBasedTagHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java

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=793715&r1=793714&r2=793715&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 Mon Jul 13 21:18:15 2009
@@ -20,11 +20,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.JsonSerializer;
 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.config.ContainerConfig;
 import org.apache.shindig.expressions.Expressions;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
@@ -34,9 +30,9 @@
 import org.apache.shindig.gadgets.spec.Feature;
 import org.apache.shindig.gadgets.spec.MessageBundle;
 import org.apache.shindig.gadgets.templates.CompositeTagRegistry;
+import org.apache.shindig.gadgets.templates.ContainerTagLibraryFactory;
 import org.apache.shindig.gadgets.templates.DefaultTagRegistry;
 import org.apache.shindig.gadgets.templates.MessageELResolver;
-import org.apache.shindig.gadgets.templates.NullTemplateLibrary;
 import org.apache.shindig.gadgets.templates.TagHandler;
 import org.apache.shindig.gadgets.templates.TagRegistry;
 import org.apache.shindig.gadgets.templates.TemplateBasedTagHandler;
@@ -46,7 +42,6 @@
 import org.apache.shindig.gadgets.templates.TemplateParserException;
 import org.apache.shindig.gadgets.templates.TemplateProcessor;
 import org.apache.shindig.gadgets.templates.TemplateResource;
-import org.apache.shindig.gadgets.templates.XmlTemplateLibrary;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -57,17 +52,14 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
-import java.util.concurrent.ConcurrentMap;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import com.google.common.collect.MapMaker;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -91,7 +83,7 @@
   /** Enable client support? **/
   static final String CLIENT_SUPPORT_PARAM = "client";  
 
-  static private final Logger logger = Logger.getLogger(TemplateRewriter.class.getName());
+  private static final Logger logger = Logger.getLogger(TemplateRewriter.class.getName());
   
   /**
    * Provider of the processor.  TemplateRewriters are stateless and multithreaded,
@@ -102,55 +94,21 @@
   private final Expressions expressions;
   private final TagRegistry baseTagRegistry;
   private final TemplateLibraryFactory libraryFactory;
-  private final ContainerConfig config;
-  
-  private final ConcurrentMap<String, TemplateLibrary> osmlLibraryCache = 
-    new MapMaker().makeComputingMap(
-        new Function<String, TemplateLibrary>() {
-          public TemplateLibrary apply(String resourceName) {
-            return loadTrustedLibrary(resourceName);
-          }
-        });
+  private final ContainerTagLibraryFactory containerTags;
 
   @Inject
   public TemplateRewriter(Provider<TemplateProcessor> processor,
       MessageBundleFactory messageBundleFactory, Expressions expressions, 
       TagRegistry baseTagRegistry, TemplateLibraryFactory libraryFactory,
-      ContainerConfig config) {
+      ContainerTagLibraryFactory containerTags) {
     this.processor = processor;
     this.messageBundleFactory = messageBundleFactory;
     this.expressions = expressions;
     this.baseTagRegistry = baseTagRegistry;
     this.libraryFactory = libraryFactory;
-    this.config = config;
-  }
-
-  private TemplateLibrary getOsmlLibrary(Gadget gadget) {
-    String library = config.getString(gadget.getContext().getContainer(),
-        "${Cur['gadgets.features'].osml.library}");
-    if (StringUtils.isEmpty(library)) {
-      return NullTemplateLibrary.INSTANCE;
-    }
-    
-    return osmlLibraryCache.get(library);
+    this.containerTags = containerTags;
   }
-  
-  static private TemplateLibrary loadTrustedLibrary(String resource) {
-    try {
-      String content = ResourceLoader.getContent(resource);
-      return new XmlTemplateLibrary(Uri.parse("#OSML"), XmlUtil.parse(content), 
-          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 NullTemplateLibrary.INSTANCE;
-  }
-  
   public void rewrite(Gadget gadget, MutableContent content) {
     Feature f = gadget.getSpec().getModulePrefs().getFeatures()
         .get("opensocial-templates");
@@ -185,7 +143,8 @@
     // Built-in Java-based tags - Priority 1
     registries.add(baseTagRegistry);
     
-    TemplateLibrary osmlLibrary = getOsmlLibrary(gadget);
+    TemplateLibrary osmlLibrary = containerTags.getLibrary(gadget.getContext().getContainer());    
+    
     // OSML Built-in tags - Priority 2
     registries.add(osmlLibrary.getTagRegistry());
     libraries.add(osmlLibrary);

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ContainerTagLibraryFactory.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ContainerTagLibraryFactory.java?rev=793715&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ContainerTagLibraryFactory.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ContainerTagLibraryFactory.java Mon Jul 13 21:18:15 2009
@@ -0,0 +1,93 @@
+/*
+ * 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.templates;
+
+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.XmlException;
+import org.apache.shindig.common.xml.XmlUtil;
+import org.apache.shindig.config.ContainerConfig;
+import org.apache.shindig.gadgets.GadgetException;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.google.common.base.Function;
+import com.google.common.collect.MapMaker;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/**
+ * Serves up a per-container tag library to the TemplateRewriter.
+ */
+@Singleton
+public class ContainerTagLibraryFactory {
+  private static final Logger logger = Logger.getLogger(
+      ContainerTagLibraryFactory.class.getName());
+  
+  private final ContainerConfig config;
+  private final ConcurrentMap<String, TemplateLibrary> osmlLibraryCache = 
+    new MapMaker().makeComputingMap(
+        new Function<String, TemplateLibrary>() {
+          public TemplateLibrary apply(String resourceName) {
+            return loadTrustedLibrary(resourceName);
+          }
+        });
+
+  @Inject
+  public ContainerTagLibraryFactory(ContainerConfig config) {
+    this.config = config;
+  }
+
+  /**
+   * Return a per-container tag registry.
+   */
+  public TemplateLibrary getLibrary(String container) {
+    return getOsmlLibrary(container);
+  }
+  
+  private TemplateLibrary getOsmlLibrary(String container) {
+    String library = config.getString(container,
+        "${Cur['gadgets.features'].osml.library}");
+    if (StringUtils.isEmpty(library)) {
+      return NullTemplateLibrary.INSTANCE;
+    }
+    
+    return osmlLibraryCache.get(library);
+  }
+  
+  static private TemplateLibrary loadTrustedLibrary(String resource) {
+    try {
+      String content = ResourceLoader.getContent(resource);
+      return new XmlTemplateLibrary(Uri.parse("#OSML"), XmlUtil.parse(content), 
+          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 NullTemplateLibrary.INSTANCE;
+  }  
+}

Propchange: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/ContainerTagLibraryFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java?rev=793715&r1=793714&r2=793715&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/TemplateBasedTagHandler.java Mon Jul 13 21:18:15 2009
@@ -65,8 +65,8 @@
   /** Process the template content in the new EL state */
   protected void processTemplate(Node result, Element tagInstance, TemplateProcessor processor) {
     processor.processChildNodes(result, templateDefinition);
-    
   }
+  
   /**
    * Compute the value of ${My} for this tag execution.
    */

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java?rev=793715&r1=793714&r2=793715&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/templates/XmlTemplateLibrary.java Mon Jul 13 21:18:15 2009
@@ -21,6 +21,7 @@
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.common.xml.DomUtil;
 import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.render.SanitizingGadgetRewriter;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -113,6 +114,16 @@
     return source;
   }
   
+  /**
+   * Creates a tag handler wrapping an element.  By default, creates
+   * a {@link TemplateBasedTagHandler}.  Override this to create custom
+   * tag handlers.
+   */
+  protected TagHandler createTagHandler(Element template, String namespaceUri,
+      String localName) {
+    return new TemplateBasedTagHandler(template, namespaceUri, localName);
+  }
+  
   private Set<TagHandler> parseLibraryDocument(Element root)
       throws GadgetException, TemplateParserException {
     ImmutableSet.Builder<TagHandler> handlers = ImmutableSet.builder();
@@ -228,12 +239,33 @@
           "Can't create tags in undeclared namespace: " + nameParts[0]);
     }
     
+    if (isSafe()) {
+      bypassTemplateSanitization(template);
+    }
+    
     return new LibraryTagHandler(
-        new TemplateBasedTagHandler(template, namespaceUri, nameParts[1]),
+        createTagHandler(template, namespaceUri, nameParts[1]),
         resources);
   }
   
   /**
+   * For "safe" libraries, bypass sanitization.  Sanitization should
+   * be bypassed on each element in the tree, but not on the whole
+   * tree (false, not true, in the call to bypassSanitization() below),
+   * since os:Render elements will insert unsafe content.
+   */
+  private void bypassTemplateSanitization(Element template) {
+    SanitizingGadgetRewriter.bypassSanitization(template, false);
+    NodeList children = template.getChildNodes();
+    for (int i = 0; i < children.getLength(); i++) {
+      Node node = children.item(i);
+      if (node instanceof Element) {
+        bypassTemplateSanitization((Element) node);
+      }
+    }
+  }
+
+  /**
    * TagHandler delegate reponsible for adding necessary tag resources
    * as each tag gets processed. 
    */

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java?rev=793715&r1=793714&r2=793715&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/TemplateRewriterTest.java Mon Jul 13 21:18:15 2009
@@ -35,6 +35,7 @@
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 import org.apache.shindig.gadgets.spec.SpecParserException;
 import org.apache.shindig.gadgets.templates.AbstractTagHandler;
+import org.apache.shindig.gadgets.templates.ContainerTagLibraryFactory;
 import org.apache.shindig.gadgets.templates.DefaultTagRegistry;
 import org.apache.shindig.gadgets.templates.DefaultTemplateProcessor;
 import org.apache.shindig.gadgets.templates.TagHandler;
@@ -121,7 +122,7 @@
         Expressions.forTesting(),
         new DefaultTagRegistry(handlers), 
         new FakeTemplateLibraryFactory(),
-        new FakeContainerConfig());
+        new ContainerTagLibraryFactory(new FakeContainerConfig()));
   }
   
  private static TagHandler testTagHandler(String name, final String content) {