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());
}
}