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) {