You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by jo...@apache.org on 2008/02/01 00:56:58 UTC

svn commit: r617309 - in /incubator/shindig/trunk: java/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ javascript/samplecontainer/

Author: johnh
Date: Thu Jan 31 15:56:48 2008
New Revision: 617309

URL: http://svn.apache.org/viewvc?rev=617309&view=rev
Log:
Views support for Shindig.

This implements SHINDIG-41, conforming to the canonical Gadget XSD. View ID semantics are
that view IDs are split on commas, and each view ID found appends to the content for that view.
This allows for code sharing between views and provides a relatively clean implementation.

A blank or nonexistent view maps to ID "default".

Changes are made to be backwards-compatible, maintaining the old parameter-less
GadgetSpec.getContentData() API. TBD: whether to deprecate this method.

Also: Updating pom.*xml to Caja r422 (further updates should be done soon).


Modified:
    incubator/shindig/trunk/java/gadgets/pom.jar.xml
    incubator/shindig/trunk/java/gadgets/pom.xml
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
    incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html

Modified: incubator/shindig/trunk/java/gadgets/pom.jar.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/pom.jar.xml?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/pom.jar.xml (original)
+++ incubator/shindig/trunk/java/gadgets/pom.jar.xml Thu Jan 31 15:56:48 2008
@@ -108,7 +108,7 @@
     <dependency>
       <groupId>caja</groupId>
       <artifactId>caja</artifactId>
-      <version>r394</version>
+      <version>r422</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>

Modified: incubator/shindig/trunk/java/gadgets/pom.xml
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/pom.xml?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/pom.xml (original)
+++ incubator/shindig/trunk/java/gadgets/pom.xml Thu Jan 31 15:56:48 2008
@@ -100,7 +100,7 @@
     <dependency>
       <groupId>caja</groupId>
       <artifactId>caja</artifactId>
-      <version>r394</version>
+      <version>r422</version>
       <scope>compile</scope>
     </dependency>
   </dependencies>

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java Thu Jan 31 15:56:48 2008
@@ -284,7 +284,16 @@
    * @throws IllegalStateException if contentType is not HTML.
    */
   public String getContentData() {
-    return substitutions.substitute(baseSpec.getContentData());
+    return getContentData(null);
+  }
+  
+  /**
+   * @param view ID of the view whose content to retrieve
+   * @return Gadget contents for the given view with all substitutions applied
+   * @throws IllegalStateException if contentType is not HTML
+   */
+  public String getContentData(String view) {
+    return substitutions.substitute(baseSpec.getContentData(view));
   }
 
   private MessageBundle currentMessageBundle = MessageBundle.EMPTY;

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java Thu Jan 31 15:56:48 2008
@@ -48,6 +48,9 @@
 
     // Caja error
     MALFORMED_FOR_SAFE_INLINING,
+    
+    // View errors
+    UNKNOWN_VIEW_SPECIFIED,
 
     // Blacklisting
     BLACKLISTED_GADGET

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java Thu Jan 31 15:56:48 2008
@@ -22,6 +22,8 @@
  * Represents a Gadget specification.
  */
 public interface GadgetSpec {
+  public static final String DEFAULT_VIEW = "default";
+  
   public String getTitle();
   public URI getTitleURI();
   public String getDirectoryTitle();
@@ -75,7 +77,7 @@
   public List<UserPref> getUserPrefs();
 
   public static enum ContentType {
-      HTML, URL
+    HTML, URL
   }
 
   public ContentType getContentType();
@@ -89,10 +91,18 @@
   public URI getContentHref();
 
   /**
-   * @return The HTML content for this gadget spec.
+   * @return The HTML content for the default view of this gadget spec.
    * @throws IllegalStateException if contentType is not HTML.
    */
   public String getContentData();
+  
+  /**
+   * @param view Identifier of the desired view to retrieve. 
+   * @return The HTML content for the specified view of this gadget spec,
+   *         or null if no such view was defined.
+   * @throws IllegalStateException if contentType is not HTML.
+   */
+  public String getContentData(String view);
 
   /**
    * @return A copy of the spec. This is NOT the same as clone().

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java Thu Jan 31 15:56:48 2008
@@ -58,7 +58,7 @@
       throw new SpecParserException("Empty XML document.");
     }
 
-    Document doc  ;
+    Document doc;
     try {
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       InputSource is = new InputSource(new Utf8InputStream(xml));
@@ -87,10 +87,8 @@
     }
 
     NodeList content = root.getElementsByTagName("Content");
-    if (content.getLength() != 1) {
-      throw new SpecParserException("Missing or duplicated <Content>");
-    } else {
-      processContent(spec, content.item(0));
+    for (int i = 0, j = content.getLength(); i < j; ++i) {
+      processContent(spec, content.item(i));
     }
 
     NodeList requires = root.getElementsByTagName("Require");
@@ -286,10 +284,15 @@
       }
     } else {
       spec.contentType = GadgetSpec.ContentType.HTML;
+      Node viewNode = attrs.getNamedItem("view");
+      String viewStr = (viewNode == null) ? "" : viewNode.getNodeValue();
+      String views[] = viewStr.split(",");
       Node child = content.getFirstChild();
       String contentData = content.getTextContent();
       if (contentData.length() > 0) {
-        spec.contentData = contentData;
+        for (String view : views) {
+          spec.addContent(view, contentData);
+        }
       } else {
         throw new SpecParserException("Empty or malformed <Content> section!");
       }
@@ -349,7 +352,8 @@
     private String directoryTitle;
     private ContentType contentType;
     private URI contentHref;
-    private String contentData;
+    private Map<String, StringBuilder> contentData
+        = new HashMap<String, StringBuilder>();
     private List<Icon> icons = new ArrayList<Icon>();
     private List<LocaleSpec> localeSpecs = new ArrayList<LocaleSpec>();
     private List<String> preloads = new ArrayList<String>();
@@ -370,7 +374,7 @@
       spec.directoryTitle = directoryTitle;
       spec.contentType = contentType;
       spec.contentHref = contentHref;
-      spec.contentData = contentData;
+      spec.contentData = new HashMap<String, StringBuilder>(contentData);
       spec.icons = new ArrayList<Icon>(icons);
       spec.localeSpecs = new ArrayList<LocaleSpec>(localeSpecs);
       spec.preloads = new ArrayList<String>(preloads);
@@ -542,9 +546,31 @@
     }
 
     public String getContentData() {
+      return getContentData(DEFAULT_VIEW);
+    }
+    
+    public String getContentData(String view) {
       Check.is(contentType == ContentType.HTML,
                "getContentData() requires contentType HTML");
-      return contentData;
+      if (view == null || view == "") {
+        view = DEFAULT_VIEW;
+      }
+      if (!contentData.containsKey(view)) {
+        return null;
+      }
+      return contentData.get(view).toString();
+    }
+    
+    public synchronized void addContent(String view, String content) {
+      if (view == null || view.equals("")) {
+        view = DEFAULT_VIEW;
+      }
+
+      if (!contentData.containsKey(view)) {
+        contentData.put(view, new StringBuilder());
+      }
+      
+      contentData.get(view).append(content);
     }
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java Thu Jan 31 15:56:48 2008
@@ -151,13 +151,15 @@
     }
 
     Gadget gadget = null;
+    String view = req.getParameter("view");
+    view = (view == null || view == "") ? GadgetSpec.DEFAULT_VIEW : view;
     try {
       gadget = gadgetServer.processGadget(gadgetId,
                                           getPrefsFromRequest(req),
                                           context.getLocale(),
                                           RenderingContext.GADGET,
                                           options);
-      outputGadget(gadget, options, contentFilters, resp);
+      outputGadget(gadget, view, options, contentFilters, resp);
     } catch (GadgetServer.GadgetProcessException e) {
       outputErrors(e, resp);
     }
@@ -167,6 +169,7 @@
    * Renders a successfully processed gadget.
    *
    * @param gadget
+   * @param view
    * @param options
    * @param contentFilters
    * @param resp
@@ -174,13 +177,14 @@
    * @throws GadgetServer.GadgetProcessException
    */
   private void outputGadget(Gadget gadget,
+                            String view,
                             ProcessingOptions options,
                             List<GadgetContentFilter> contentFilters,
                             HttpServletResponse resp)
       throws IOException, GadgetServer.GadgetProcessException {
     switch(gadget.getContentType()) {
     case HTML:
-      outputHtmlGadget(gadget, options, contentFilters, resp);
+      outputHtmlGadget(gadget, view, options, contentFilters, resp);
       break;
     case URL:
       outputUrlGadget(gadget, options, resp);
@@ -196,6 +200,7 @@
    * Handles type=html gadget output.
    *
    * @param gadget
+   * @param view
    * @param options
    * @param contentFilters
    * @param resp
@@ -203,6 +208,7 @@
    * @throws GadgetServer.GadgetProcessException
    */
   private void outputHtmlGadget(Gadget gadget,
+                                String view,
                                 ProcessingOptions options,
                                 List<GadgetContentFilter> contentFilters,
                                 HttpServletResponse resp)
@@ -256,14 +262,24 @@
     }
 
     List<GadgetException> gadgetExceptions = new LinkedList<GadgetException>();
-    String content = gadget.getContentData();
-    for (GadgetContentFilter filter : contentFilters) {
-      try {
-        content = filter.filter(content);
-      } catch (GadgetException e) {
-        gadgetExceptions.add(e);
+    String content = gadget.getContentData(view);
+    if (content == null) {
+      // unknown view
+      gadgetExceptions.add(
+          new GadgetException(
+              GadgetException.Code.UNKNOWN_VIEW_SPECIFIED,
+              "View: '" + view + "' invalid for gadget: " +
+              gadget.getId().getKey()));
+    } else {
+      for (GadgetContentFilter filter : contentFilters) {
+        try {
+          content = filter.filter(content);
+        } catch (GadgetException e) {
+          gadgetExceptions.add(e);
+        }
       }
     }
+    
     if (gadgetExceptions.size() > 0) {
       throw new GadgetServer.GadgetProcessException(gadgetExceptions);
     }

Modified: incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html?rev=617309&r1=617308&r2=617309&view=diff
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html (original)
+++ incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html Thu Jan 31 15:56:48 2008
@@ -33,7 +33,7 @@
 <script type="text/javascript" src="../container/gadgets.js"></script>
 <script type="text/javascript">
 
-var specUrl = 'http://localhost:8080/gadgets/samplecontainer/examples/SocialHelloWorld.xml';
+var specUrl = 'http://hosting.gmodules.com/ig/gadgets/file/117247905274371511495/SocialHelloWorld.xml';
 var useCaja = false;
 var useCache = true;
 var usePermissive = false;
@@ -102,7 +102,7 @@
       <input type="text" size="75" id="gadgetUrl"/>
       <input type="checkbox" id="useCajaCheckbox"/>use caja
       <input type="checkbox" id="usePermissiveCheckbox"/>use permissive
-      <div style="display:none"><input type="checkbox" id="useCacheCheckbox" checked="true"/>use cache</div>
+      <input type="checkbox" id="useCacheCheckbox" checked="true"/>use cache
       <input type="button" value="reset" onclick="changeGadgetUrl();"/>
     </div>
     <div style="clear:both; height: 1px;">&nbsp;</div>



Re: svn commit: r617309 - in /incubator/shindig/trunk: java/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ javascript/samplecontainer/

Posted by Jamey Wood <Ja...@sun.com>.
johnh@apache.org wrote:
> Author: johnh
> Date: Thu Jan 31 15:56:48 2008
> New Revision: 617309
>
> URL: http://svn.apache.org/viewvc?rev=617309&view=rev
> Log:
> Views support for Shindig.
>
> This implements SHINDIG-41, conforming to the canonical Gadget XSD. View ID semantics are
> that view IDs are split on commas, and each view ID found appends to the content for that view.
> This allows for code sharing between views and provides a relatively clean implementation.
>
> A blank or nonexistent view maps to ID "default".
>
> Changes are made to be backwards-compatible, maintaining the old parameter-less
> GadgetSpec.getContentData() API. TBD: whether to deprecate this method.
>   

I'm now seeing compilation errors:

src/test/java/org/apache/shindig/gadgets/GadgetSpecTestFixture.java:[97,30] 
<anonymous org.apache.shindig.gadgets.GadgetSpecTestFixture$1> is not 
abstract and does not override abstract method 
getContentData(java.lang.String) in org.apache.shindig.gadgets.GadgetSpec

I presume that GadgetSpecTestFixture should be changed to have the new 
"getContentData(String view)" method (along the lines of the attached diff)?

Thanks,
Jamey

Re: svn commit: r617309 - in /incubator/shindig/trunk: java/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/ java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ javascript/samplecontainer/

Posted by Kevin Brown <et...@apache.org>.
We need this to get updated too:
https://svn.apache.org/repos/asf/incubator/shindig/trunk/features/views/views.js

It's very broken right now.

Will you handle this, or should I tackle it?

~Kevin

On Jan 31, 2008 3:56 PM, <jo...@apache.org> wrote:

> Author: johnh
> Date: Thu Jan 31 15:56:48 2008
> New Revision: 617309
>
> URL: http://svn.apache.org/viewvc?rev=617309&view=rev
> Log:
> Views support for Shindig.
>
> This implements SHINDIG-41, conforming to the canonical Gadget XSD. View
> ID semantics are
> that view IDs are split on commas, and each view ID found appends to the
> content for that view.
> This allows for code sharing between views and provides a relatively clean
> implementation.
>
> A blank or nonexistent view maps to ID "default".
>
> Changes are made to be backwards-compatible, maintaining the old
> parameter-less
> GadgetSpec.getContentData() API. TBD: whether to deprecate this method.
>
> Also: Updating pom.*xml to Caja r422 (further updates should be done
> soon).
>
>
> Modified:
>    incubator/shindig/trunk/java/gadgets/pom.jar.xml
>    incubator/shindig/trunk/java/gadgets/pom.xml
>
>  incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
>
>  incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
>
>  incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java
>
>  incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
>
>  incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
>    incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html
>
> Modified: incubator/shindig/trunk/java/gadgets/pom.jar.xml
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/pom.jar.xml?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> --- incubator/shindig/trunk/java/gadgets/pom.jar.xml (original)
> +++ incubator/shindig/trunk/java/gadgets/pom.jar.xml Thu Jan 31 15:56:48
> 2008
> @@ -108,7 +108,7 @@
>     <dependency>
>       <groupId>caja</groupId>
>       <artifactId>caja</artifactId>
> -      <version>r394</version>
> +      <version>r422</version>
>       <scope>compile</scope>
>     </dependency>
>   </dependencies>
>
> Modified: incubator/shindig/trunk/java/gadgets/pom.xml
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/pom.xml?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> --- incubator/shindig/trunk/java/gadgets/pom.xml (original)
> +++ incubator/shindig/trunk/java/gadgets/pom.xml Thu Jan 31 15:56:48 2008
> @@ -100,7 +100,7 @@
>     <dependency>
>       <groupId>caja</groupId>
>       <artifactId>caja</artifactId>
> -      <version>r394</version>
> +      <version>r422</version>
>       <scope>compile</scope>
>     </dependency>
>   </dependencies>
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/Gadget.java
> Thu Jan 31 15:56:48 2008
> @@ -284,7 +284,16 @@
>    * @throws IllegalStateException if contentType is not HTML.
>    */
>   public String getContentData() {
> -    return substitutions.substitute(baseSpec.getContentData());
> +    return getContentData(null);
> +  }
> +
> +  /**
> +   * @param view ID of the view whose content to retrieve
> +   * @return Gadget contents for the given view with all substitutions
> applied
> +   * @throws IllegalStateException if contentType is not HTML
> +   */
> +  public String getContentData(String view) {
> +    return substitutions.substitute(baseSpec.getContentData(view));
>   }
>
>   private MessageBundle currentMessageBundle = MessageBundle.EMPTY;
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetException.java
> Thu Jan 31 15:56:48 2008
> @@ -48,6 +48,9 @@
>
>     // Caja error
>     MALFORMED_FOR_SAFE_INLINING,
> +
> +    // View errors
> +    UNKNOWN_VIEW_SPECIFIED,
>
>     // Blacklisting
>     BLACKLISTED_GADGET
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpec.java
> Thu Jan 31 15:56:48 2008
> @@ -22,6 +22,8 @@
>  * Represents a Gadget specification.
>  */
>  public interface GadgetSpec {
> +  public static final String DEFAULT_VIEW = "default";
> +
>   public String getTitle();
>   public URI getTitleURI();
>   public String getDirectoryTitle();
> @@ -75,7 +77,7 @@
>   public List<UserPref> getUserPrefs();
>
>   public static enum ContentType {
> -      HTML, URL
> +    HTML, URL
>   }
>
>   public ContentType getContentType();
> @@ -89,10 +91,18 @@
>   public URI getContentHref();
>
>   /**
> -   * @return The HTML content for this gadget spec.
> +   * @return The HTML content for the default view of this gadget spec.
>    * @throws IllegalStateException if contentType is not HTML.
>    */
>   public String getContentData();
> +
> +  /**
> +   * @param view Identifier of the desired view to retrieve.
> +   * @return The HTML content for the specified view of this gadget spec,
> +   *         or null if no such view was defined.
> +   * @throws IllegalStateException if contentType is not HTML.
> +   */
> +  public String getContentData(String view);
>
>   /**
>    * @return A copy of the spec. This is NOT the same as clone().
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/GadgetSpecParser.java
> Thu Jan 31 15:56:48 2008
> @@ -58,7 +58,7 @@
>       throw new SpecParserException("Empty XML document.");
>     }
>
> -    Document doc  ;
> +    Document doc;
>     try {
>       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance
> ();
>       InputSource is = new InputSource(new Utf8InputStream(xml));
> @@ -87,10 +87,8 @@
>     }
>
>     NodeList content = root.getElementsByTagName("Content");
> -    if (content.getLength() != 1) {
> -      throw new SpecParserException("Missing or duplicated <Content>");
> -    } else {
> -      processContent(spec, content.item(0));
> +    for (int i = 0, j = content.getLength(); i < j; ++i) {
> +      processContent(spec, content.item(i));
>     }
>
>     NodeList requires = root.getElementsByTagName("Require");
> @@ -286,10 +284,15 @@
>       }
>     } else {
>       spec.contentType = GadgetSpec.ContentType.HTML;
> +      Node viewNode = attrs.getNamedItem("view");
> +      String viewStr = (viewNode == null) ? "" : viewNode.getNodeValue();
> +      String views[] = viewStr.split(",");
>       Node child = content.getFirstChild();
>       String contentData = content.getTextContent();
>       if (contentData.length() > 0) {
> -        spec.contentData = contentData;
> +        for (String view : views) {
> +          spec.addContent(view, contentData);
> +        }
>       } else {
>         throw new SpecParserException("Empty or malformed <Content>
> section!");
>       }
> @@ -349,7 +352,8 @@
>     private String directoryTitle;
>     private ContentType contentType;
>     private URI contentHref;
> -    private String contentData;
> +    private Map<String, StringBuilder> contentData
> +        = new HashMap<String, StringBuilder>();
>     private List<Icon> icons = new ArrayList<Icon>();
>     private List<LocaleSpec> localeSpecs = new ArrayList<LocaleSpec>();
>     private List<String> preloads = new ArrayList<String>();
> @@ -370,7 +374,7 @@
>       spec.directoryTitle = directoryTitle;
>       spec.contentType = contentType;
>       spec.contentHref = contentHref;
> -      spec.contentData = contentData;
> +      spec.contentData = new HashMap<String, StringBuilder>(contentData);
>       spec.icons = new ArrayList<Icon>(icons);
>       spec.localeSpecs = new ArrayList<LocaleSpec>(localeSpecs);
>       spec.preloads = new ArrayList<String>(preloads);
> @@ -542,9 +546,31 @@
>     }
>
>     public String getContentData() {
> +      return getContentData(DEFAULT_VIEW);
> +    }
> +
> +    public String getContentData(String view) {
>       Check.is(contentType == ContentType.HTML,
>                "getContentData() requires contentType HTML");
> -      return contentData;
> +      if (view == null || view == "") {
> +        view = DEFAULT_VIEW;
> +      }
> +      if (!contentData.containsKey(view)) {
> +        return null;
> +      }
> +      return contentData.get(view).toString();
> +    }
> +
> +    public synchronized void addContent(String view, String content) {
> +      if (view == null || view.equals("")) {
> +        view = DEFAULT_VIEW;
> +      }
> +
> +      if (!contentData.containsKey(view)) {
> +        contentData.put(view, new StringBuilder());
> +      }
> +
> +      contentData.get(view).append(content);
>     }
>   }
>  }
>
> Modified:
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
> (original)
> +++
> incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java
> Thu Jan 31 15:56:48 2008
> @@ -151,13 +151,15 @@
>     }
>
>     Gadget gadget = null;
> +    String view = req.getParameter("view");
> +    view = (view == null || view == "") ? GadgetSpec.DEFAULT_VIEW : view;
>     try {
>       gadget = gadgetServer.processGadget(gadgetId,
>                                           getPrefsFromRequest(req),
>                                           context.getLocale(),
>                                           RenderingContext.GADGET,
>                                           options);
> -      outputGadget(gadget, options, contentFilters, resp);
> +      outputGadget(gadget, view, options, contentFilters, resp);
>     } catch (GadgetServer.GadgetProcessException e) {
>       outputErrors(e, resp);
>     }
> @@ -167,6 +169,7 @@
>    * Renders a successfully processed gadget.
>    *
>    * @param gadget
> +   * @param view
>    * @param options
>    * @param contentFilters
>    * @param resp
> @@ -174,13 +177,14 @@
>    * @throws GadgetServer.GadgetProcessException
>    */
>   private void outputGadget(Gadget gadget,
> +                            String view,
>                             ProcessingOptions options,
>                             List<GadgetContentFilter> contentFilters,
>                             HttpServletResponse resp)
>       throws IOException, GadgetServer.GadgetProcessException {
>     switch(gadget.getContentType()) {
>     case HTML:
> -      outputHtmlGadget(gadget, options, contentFilters, resp);
> +      outputHtmlGadget(gadget, view, options, contentFilters, resp);
>       break;
>     case URL:
>       outputUrlGadget(gadget, options, resp);
> @@ -196,6 +200,7 @@
>    * Handles type=html gadget output.
>    *
>    * @param gadget
> +   * @param view
>    * @param options
>    * @param contentFilters
>    * @param resp
> @@ -203,6 +208,7 @@
>    * @throws GadgetServer.GadgetProcessException
>    */
>   private void outputHtmlGadget(Gadget gadget,
> +                                String view,
>                                 ProcessingOptions options,
>                                 List<GadgetContentFilter> contentFilters,
>                                 HttpServletResponse resp)
> @@ -256,14 +262,24 @@
>     }
>
>     List<GadgetException> gadgetExceptions = new
> LinkedList<GadgetException>();
> -    String content = gadget.getContentData();
> -    for (GadgetContentFilter filter : contentFilters) {
> -      try {
> -        content = filter.filter(content);
> -      } catch (GadgetException e) {
> -        gadgetExceptions.add(e);
> +    String content = gadget.getContentData(view);
> +    if (content == null) {
> +      // unknown view
> +      gadgetExceptions.add(
> +          new GadgetException(
> +              GadgetException.Code.UNKNOWN_VIEW_SPECIFIED,
> +              "View: '" + view + "' invalid for gadget: " +
> +              gadget.getId().getKey()));
> +    } else {
> +      for (GadgetContentFilter filter : contentFilters) {
> +        try {
> +          content = filter.filter(content);
> +        } catch (GadgetException e) {
> +          gadgetExceptions.add(e);
> +        }
>       }
>     }
> +
>     if (gadgetExceptions.size() > 0) {
>       throw new GadgetServer.GadgetProcessException(gadgetExceptions);
>     }
>
> Modified:
> incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html
> URL:
> http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html?rev=617309&r1=617308&r2=617309&view=diff
>
> ==============================================================================
> ---
> incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html
> (original)
> +++
> incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.html Thu
> Jan 31 15:56:48 2008
> @@ -33,7 +33,7 @@
>  <script type="text/javascript" src="../container/gadgets.js"></script>
>  <script type="text/javascript">
>
> -var specUrl = '
> http://localhost:8080/gadgets/samplecontainer/examples/SocialHelloWorld.xml
> ';
> +var specUrl = '
> http://hosting.gmodules.com/ig/gadgets/file/117247905274371511495/SocialHelloWorld.xml
> ';
>  var useCaja = false;
>  var useCache = true;
>  var usePermissive = false;
> @@ -102,7 +102,7 @@
>       <input type="text" size="75" id="gadgetUrl"/>
>       <input type="checkbox" id="useCajaCheckbox"/>use caja
>       <input type="checkbox" id="usePermissiveCheckbox"/>use permissive
> -      <div style="display:none"><input type="checkbox"
> id="useCacheCheckbox" checked="true"/>use cache</div>
> +      <input type="checkbox" id="useCacheCheckbox" checked="true"/>use
> cache
>       <input type="button" value="reset" onclick="changeGadgetUrl();"/>
>     </div>
>     <div style="clear:both; height: 1px;">&nbsp;</div>
>
>
>