Great work Dan, I have couple comments

- Currently atomModel.js is only available in implementation.widget as
a test resource (not visible to other applications). I'd suggest
making this part of source/main/resources together with the other
bindings.

- I was looking at the atomModel usage, and saw it was being used to
consume feeds and entries, but the addToCart() was still creating an
entry manually
   var entry = '<entry
xmlns="http://www.w3.org/2005/Atom";><title>cart-item</title><content
type="text">'+items[i].value+'</content></entry>'
  Should we extend the javaScript atom client to allow something like
   var entry = new Entry()
   .....
   entry.toAtom() ?

I'll play a little more with the atomModel.js and update this thread
if I have other comments/questions.

On Mon, Sep 22, 2008 at 3:15 PM,  <[EMAIL PROTECTED]> wrote:
> Author: beckerdo
> Date: Mon Sep 22 15:15:29 2008
> New Revision: 698020
>
> URL: http://svn.apache.org/viewvc?rev=698020&view=rev
> Log: (empty)
>
> Added:
>    
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js
>    
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html
>    (with props)
>    
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite
> Modified:
>    
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java
>    
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java
>
> Modified: 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java?rev=698020&r1=698019&r2=698020&view=diff
> ==============================================================================
> --- 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java
>  (original)
> +++ 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java
>  Mon Sep 22 15:15:29 2008
> @@ -34,9 +34,9 @@
>
>     @Init
>     public void init() {
> -        catalog.add("Apple - US$ 2.99");
> -        catalog.add("Orange - US$ 3.55");
> -        catalog.add("Pear - US$ 1.55");
> +        catalog.add("Apple - $ 2.99");
> +        catalog.add("Orange - $ 3.55");
> +        catalog.add("Pear - $ 1.55");
>     }
>
>     public String[] get() {
>
> Modified: 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java?rev=698020&r1=698019&r2=698020&view=diff
> ==============================================================================
> --- 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java
>  (original)
> +++ 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java
>  Mon Sep 22 15:15:29 2008
> @@ -47,7 +47,6 @@
>         for (Entry entry : cart.values()) {
>             feed.addEntry(entry);
>         }
> -
>         return feed;
>     }
>
> @@ -83,7 +82,7 @@
>         entry.addLink(id, "edit");
>         entry.addLink(id, "alternate");
>
> -        entry.setEdited(new Date());
> +        entry.setUpdated(new Date());
>
>         cart.put(id, entry);
>         return entry;
> @@ -106,6 +105,7 @@
>         String currencySymbol = "";
>         if (!cart.isEmpty()) {
>             String item = 
> ((Entry)cart.values().iterator().next()).getContent();
> +            // Select first symbol after dash.
>             currencySymbol = item.substring(item.indexOf("-") + 2, 
> item.indexOf("-") + 3);
>         }
>         for (Entry entry : cart.values()) {
>
> Added: 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js?rev=698020&view=auto
> ==============================================================================
> --- 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js
>  (added)
> +++ 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js
>  Mon Sep 22 15:15:29 2008
> @@ -0,0 +1,1119 @@
> +/*
> + * 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.
> + */
> +
> +/**
> + * Class that defines a URI represented as a string,
> + */
> +function Uri( value ) {
> +   this.value = value;
> +   this.getValue = function() {
> +      return this.value;
> +   };
> +
> +   this.setValue = function(value) {
> +      this.value = value;
> +   };
> +
> +   this.toString = function() {
> +       return "Uri value=" + this.value;
> +   };
> +}
> +
> +/* Updated is Date */
> +/* Published is Date */
> +
> +/**
> + * Class that defines an Email represented as a string,
> + */
> +function Email( value ) {
> +   this.value = value;
> +   this.getValue = function() {
> +      return this.value;
> +   };
> +
> +   this.setValue = function(value) {
> +      this.value = value;
> +   };
> +
> +   this.toString = function() {
> +       return "Email value=" + this.value;
> +   };
> +}
> +
> +/**
> + * Class that defines an Id represented as a string,
> + */
> +function Id( value ) {
> +   this.value = value;
> +   this.getValue = function() {
> +      return this.value;
> +   };
> +
> +   this.setValue = function(value) {
> +      this.value = value;
> +   };
> +
> +   this.toString = function() {
> +       return "Id value=" + this.value;
> +   };
> +}
> +
> +
> +/**
> + * Class that defines an Id represented as a string,
> + */
> +function Logo( value ) {
> +   this.value = value;
> +   this.getValue = function() {
> +      return this.value;
> +   };
> +
> +   this.setValue = function(value) {
> +      this.value = value;
> +   };
> +
> +   this.toString = function() {
> +       return "Logo value=" + this.value;
> +   };
> +}
> +
> +/**
> + * Class that defines an Name represented as a string,
> + */
> +function Name( value ) {
> +   this.value = value;
> +   this.getValue = function() {
> +      return this.value;
> +   };
> +
> +   this.setValue = function(value) {
> +      this.value = value;
> +   };
> +
> +   this.toString = function() {
> +       return "Name value=" + this.value;
> +   };
> +}
> +
> +/**
> + * Class that defines a Text object.
> + */
> +function Text( content, /* optional */ type ) {
> +   this.content = content;
> +   this.type = type;
> +   if (!type) this.type = "text"; // If undefined or null, use text
> +
> +   this.getValue = function() {
> +      return this.value;
> +   };
> +
> +   this.setText = function(content) {
> +      this.content = content;
> +   };
> +
> +   this.getText = function() {
> +      return this.content;
> +   };
> +
> +   this.setType = function(type) {
> +      if ((type != "text") && (type != "html") && (type != "xhtml")) {
> +         error( "Text type must be one of text, html, or xhtml" );
> +      }
> +      this.type = type;
> +   };
> +
> +   this.getType = function() {
> +      return this.type;
> +   };
> +
> +   this.setLang = function(lang) {
> +      this.lang = lang;
> +   };
> +
> +   this.getLang = function() {
> +      return this.lang;
> +   };
> +
> +   this.setUri = function(uri) {
> +      this.uri = new Uri( uri );
> +   };
> +
> +   this.getUri = function() {
> +      return this.uri;
> +   };
> +
> +   this.toString = function() {
> +       return "Text type=" + this.type + ", content=" + this.content;
> +   };
> +}
> +
> +/**
> + * Class that defines a Person object.
> + * atomPersonConstruct =
> + *     atomCommonAttributes,
> + *     (element atom:name { text }
> + *      & element atom:uri { atomUri }?
> + *      & element atom:email { atomEmailAddress }?
> + *      & extensionElement*)
> + */
> +function Person( name, email ) {
> +   this.name = new Name( name );
> +   this.email = new Email( email );
> +
> +   this.setName = function( name ) {
> +      this.name = new Name( name );
> +   };
> +
> +   this.getName = function() {
> +      return this.name;
> +   };
> +
> +   this.setLang = function(lang) {
> +      this.lang = lang;
> +   };
> +
> +   this.getLang = function() {
> +      return this.lang;
> +   };
> +
> +   this.setEmail = function( email ) {
> +      this.email = new Email( email );
> +   };
> +
> +   this.getEmail = function() {
> +      return this.email;
> +   };
> +
> +   this.setUri = function( uri ) {
> +      this.uri = new Uri( uri );
> +   };
> +
> +   this.getUri = function() {
> +      return this.uri;
> +   };
> +
> +   this.toString = function() {
> +       return "Person name=" + this.name + ", email=" + this.email;
> +   };
> +}
> +
> +/**
> + * Class that defines a Generator object.
> + */
> +function Generator( name, uri ) {
> +   this.name = new Name( name );
> +   this.uri = new Uri( uri );
> +
> +   this.setName = function( name ) {
> +      this.name = new Name( name );
> +   };
> +
> +   this.getName = function() {
> +      return this.name;
> +   };
> +
> +   this.setVersion = function(version) {
> +      this.version = version;
> +   };
> +
> +   this.getVersion = function() {
> +      return this.version;
> +   };
> +
> +   this.setUri = function( uri ) {
> +      this.uri = new Email( uri );
> +   };
> +
> +   this.getUri = function() {
> +      return this.uri;
> +   };
> +
> +   this.toString = function() {
> +       return "Generator name=" + this.name + ", email=" + this.email;
> +   };
> +}
> +
> +/**
> + * Class that defines a Category object.
> + *atomCategory =
> + *     element atom:category {
> + *        atomCommonAttributes,
> + *        attribute term { text },
> + *        attribute scheme { atomUri }?,
> + *        attribute label { text }?,
> + *        undefinedContent
> + *     }
> + */
> +function Category( label, uri ) {
> +   this.label = new Label( label );
> +
> +   this.setLabel = function( label ) {
> +      this.label = label;
> +   };
> +
> +   this.getLabel = function() {
> +      return this.label;
> +   };
> +
> +   this.setLang = function(lang) {
> +      this.lang = lang;
> +   };
> +
> +   this.getLang = function() {
> +      return this.lang;
> +   };
> +
> +   this.setTerm = function(term) {
> +      this.term = term;
> +   };
> +
> +   this.getTerm = function() {
> +      return this.term;
> +   };
> +
> +   this.setScheme = function( scheme ) {
> +      this.scheme = scheme;
> +   };
> +
> +   this.getScheme = function() {
> +      return this.scheme;
> +   };
> +
> +   this.toString = function() {
> +       return "Category label=" + this.label;
> +   };
> +}
> +
> +/**
> + * Class that defines a Link object.
> + */
> +function Link( href ) {
> +   this.href = new Uri( href );
> +
> +   this.setHRef = function( uri ) {
> +      this.href = new Uri( uri );
> +   };
> +
> +   this.getHRef = function() {
> +      return this.href;
> +   };
> +
> +   this.setTitle = function( title ) {
> +      this.title = title;
> +   };
> +
> +   this.getTitle = function() {
> +      return this.title;
> +   };
> +
> +   this.setHRefLang = function(lang) {
> +      this.hrefLang = lang;
> +   };
> +
> +   this.getHRefLang = function() {
> +      return this.hreflang;
> +   };
> +
> +   this.setTitleLang = function(lang) {
> +      this.titleLang = lang;
> +   };
> +
> +   this.getTitleLang = function() {
> +      return this.titleLang;
> +   };
> +   this.setLength= function( length ) {
> +      this.length= length;
> +   };
> +
> +   this.getLength = function() {
> +      return this.length;
> +   };
> +
> +/*
> +<static>  <final> String       TYPE_ATOM
> +          Link type used for Atom content.
> +<static>  <final> String       TYPE_HTML
> +          Link type used for HTML content.
> +*/
> +   this.setMimeType = function(mimeType) {
> +      this.mimeType = mimeType;
> +   };
> +
> +   this.getMimeType = function() {
> +      return this.mimeType;
> +   };
> +
> +/*
> +<static>  <final> String       REL_ALTERNATE
> +          Link that provides the URI of an alternate format of the entry's 
> or feed's contents.
> +<static>  <final> String       REL_ENTRY_EDIT
> +          Link that provides the URI that can be used to edit the entry.
> +<static>  <final> String       REL_MEDIA_EDIT
> +          Link that provides the URI that can be used to edit the media 
> associated with an entry.
> +<static>  <final> String       REL_NEXT
> +          Link that provides the URI of next page in a paged feed.
> +<static>  <final> String       REL_PREVIOUS
> +          Link that provides the URI of previous page in a paged feed.
> +<static>  <final> String       REL_RELATED
> +          Link that provides the URI of a related link to the entry.
> +<static>  <final> String       REL_SELF
> +          Link that provides the URI of the feed or entry.
> +<static>  <final> String       REL_VIA
> +          Link that provides the URI that of link that provides the data for 
> the content in the feed.
> +*/
> +   this.setRelation = function( relation ) {
> +      this.relation = relation;
> +   };
> +
> +   this.getRelation = function() {
> +      return this.relation;
> +   };
> +
> +   this.toString = function() {
> +       return "Link href=" + this.href + ", title=" + this.title;
> +   };
> +}
> +
> +/**
> + * Class that defines an Entry object.
> + * atomEntry =
> + *     element atom:entry {
> + *        atomCommonAttributes,
> + *        (atomAuthor*
> + *         & atomCategory*
> + *         & atomContent?
> + *         & atomContributor*
> + *         & atomId
> + *         & atomLink*
> + *         & atomPublished?
> + *         & atomRights?
> + *         & atomSource?
> + *         & atomSummary?
> + *         & atomTitle
> + *         & atomUpdated
> + *         & extensionElement*)
> + *     }
> + */
> +function Entry( init ) {
> +   // Constructor code at bottom after function definition
> +
> +   var authors = new Array();
> +   var contributors = new Array();
> +   var categories = new Array();
> +   var links = new Array();
> +
> +   this.setPublished = function( published ) {
> +      this.published = published;
> +   };
> +
> +   this.getPublished = function() {
> +      return this.published;
> +   };
> +
> +   this.setUpdated = function( updated ) {
> +      this.updated = updated;
> +   };
> +
> +   this.getUpdated = function() {
> +      return this.updated;
> +   };
> +
> +   this.setNamespace = function( namespace ) {
> +      this.namespace = namespace;
> +   };
> +
> +   this.getNamespace = function() {
> +      return this.namespace;
> +   };
> +
> +   this.setContent = function( content ) {
> +      if (!((typeof content == "object") && (content instanceof Text)))
> +         error( "Entry content must be of type Text" );
> +
> +      this.content = content;
> +   }
> +
> +   this.getContent = function() {
> +      return this.content;
> +   };
> +
> +   this.setRights = function( rights ) {
> +      if (!((typeof rights == "object") && (rights instanceof Text)))
> +         error( "Entry rights must be of type Text" );
> +      this.rights = rights;
> +   }
> +
> +   this.getRights = function() {
> +      return this.rights;
> +   };
> +
> +   /* Type Text */
> +   this.setSummary = function( summary ) {
> +      this.summary = summary;
> +   }
> +
> +   this.getSummary = function() {
> +      return this.summary;
> +   };
> +
> +   /* Type Text */
> +   this.setTitle = function( title ) {
> +      if (!((typeof title == "object") && (title instanceof Text)))
> +         error( "Entry title must be of type Text" );
> +      this.title = title;
> +   }
> +
> +   this.getTitle = function() {
> +      return this.title;
> +   };
> +
> +   /* Type Id */
> +   this.setId = function( id ) {
> +      this.id = id;
> +   }
> +
> +   this.getId = function() {
> +      return this.id;
> +   };
> +
> +   /**
> +    * Add an author.
> +    * @param name Author
> +    */
> +   this.addAuthor = function(person) {
> +      if (!((typeof person == "object") && (person instanceof Person)))
> +         error( "Entry author must be of type Person" );
> +      var i = authors.length;
> +      authors[ i ] = person;
> +   }
> +
> +   /**
> +    * Get an author.
> +    * @param name Author
> +    */
> +   this.getAuthor = function(name) {
> +      return authors[ name ];
> +   }
> +
> +   /**
> +    * Set list of authors.
> +    * @param name Author
> +    */
> +   this.setAuthors = function( authors ) {
> +      return this.authors = authors;
> +   }
> +
> +   /**
> +    * Get an author"pom.xml".
> +    * @param name Author
> +    */
> +   this.getAuthors = function() {
> +      return authors;
> +   }
> +
> +   /**
> +    * Add an contributor.
> +    * @param name Contributor
> +    */
> +   this.addContributor = function(person) {
> +      if (!((typeof person == "object") && (person instanceof Person)))
> +         error( "Entry contributor must be of type Person" );
> +      var i = contributors.length;
> +      contributors[ i ] = person;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Contributor
> +    */
> +   this.getContributor = function(name) {
> +      return contributors[ name ];
> +   }
> +
> +   /**
> +    * Set list of contributors
> +    * @param name Author
> +    */
> +   this.setContributors = function( contributors ) {
> +      return this.contributors = contributors;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Contributor
> +    */
> +   this.getContributors = function() {
> +      return contributors;
> +   }
> +
> +   /**
> +    * Add an contributor.
> +    * @param name Category
> +    */
> +   this.addCategory = function(category) {
> +      if (!((typeof category == "object") && (person instanceof Category)))
> +         error( "Entry category must be of type Category" );
> +      var i = categories.length
> +      categories[ i ] = category;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Category
> +    */
> +   this.getCategory = function(name) {
> +      return categories[ name ];
> +   }
> +
> +   /**
> +    * Set list of categories
> +    * @param name Author
> +    */
> +   this.setCategories = function( categories ) {
> +      return this.categories = categories;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Category
> +    */
> +   this.getCategories = function() {
> +      return categories;
> +   }
> +
> +   /**
> +    * Add an link.
> +    * @param name Link
> +    */
> +   this.addLink = function(link) {
> +      if (!((typeof link == "object") && (link instanceof Link)))
> +         error( "Entry link must be of type Link" );
> +      var i = links.length;
> +      links[ i ] = link;
> +   }
> +
> +   /**
> +    * Get an link.
> +    * @param name Link
> +    */
> +   this.getLink = function(name) {
> +      return links[ name ];
> +   }
> +
> +   /**
> +    * Set list of links.
> +    * @param name Link
> +    */
> +   this.setLinks = function( links ) {
> +      return this.links = links;
> +   }
> +
> +   /**
> +    * Get an link.
> +    * @param name Link
> +    */
> +   this.getLinks = function() {
> +      return links;
> +   }
> +
> +   this.readFromXML = function( xml ) {
> +      if (!((typeof xml == "object") && (xml instanceof string)))
> +         error( "Entry xml must be of type string" );
> +      // To Do - Read from arbutrary XML such as
> +      // <entry>
> +      //   <title type="text">cart-item</title>
> +      //   <content type="text">Apple - $ 2.99</content>
> +      //   <id>cart-bd5323d6-1f59-4fae-a8f5-01f7654f1e77</id>
> +      //   <link href="cart-bd5323d6-1f59-4fae-a8f5-01f7654f1e77" 
> rel="edit"/>
> +      //   <link href="cart-bd5323d6-1f59-4fae-a8f5-01f7654f1e77" 
> rel="alternate"/>
> +      //   <updated>2008-09-21T23:06:43.921Z</updated>
> +      // </entry>
> +
> +   }
> +  this.readFromDoc = function( htmlDoc ) {
> +      // Expect HTML collection.
> +      var entryDoc = htmlDoc.getElementsByTagName("entry");
> +      for (var i = 0; i < entryDoc.length; i++) {
> +         this.readFromNode( entryDoc[ i ] );
> +      }
> +   }
> +
> +   this.readFromNode = function( entryNode ) {
> +      // Expect entry node
> +      var childNodes = entryNode.childNodes;
> +      for ( var i = 0; i < childNodes.length; i++ ) {
> +         var node = childNodes[ i ];
> +         if (node.nodeType == 1 /*Node.ELEMENT_NODE*/) {
> +            var tagName = node.tagName;
> +            if (tagName == "title" ) {
> +               var title = new Text( getTextContent( node ) );
> +               title.setType( "text" );
> +               this.setTitle( title );
> +            } else if ( tagName == "subtitle" ) {
> +               var title = new Text( getTextContent( node ) );
> +               title.setType( "text" );
> +               this.setSubTitle( title );
> +            } else if ( tagName == "id" ) {
> +               var id = new Id( getTextContent( node ) );
> +               this.setId( id );
> +            } else if ( tagName == "updated" ) {
> +               var dateText = getTextContent( node );
> +               var date = new Date( dateText ); // 2008-09-21T23:06:43.921Z
> +               this.setUpdated( date );
> +            } else if ( tagName == "link" ) {
> +               var href = node.attributes[ "href" ];
> +               var link = new Link( href.value );
> +               var rel = node.attributes[ "rel" ];
> +               link.setRelation( rel.value );
> +               this.addLink( link );
> +            } else if ( tagName == "content" ) {
> +               var content = new Text( getTextContent( node ) );
> +               var attr = node.attributes[ "type" ];
> +               if ( attr != null ) {
> +                  content.setType( attr.value );
> +               }
> +               this.setContent( content );
> +            } else {
> +               // To Do - implement rest of nodes
> +                          error( "undefined element node" );
> +            }
> +         } else if (node.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
> +            var attrName = node.tagName;
> +         } else if (node.nodeType == 3 /*Node.TEXT_NODE*/) {
> +         }
> +      }
> +   }
> +
> +   this.toString = function() {
> +       return "Entry title=" + this.title + ", updated=" + this.updated;
> +   };
> +
> +   // Initialize from constructor
> +   if (typeof init == 'object') {
> +      if ( init.nodeType == 1 ) { /* Document Node.ELEMENT_NODE 1 */
> +         this.readFromDoc( init );
> +      } else {
> +         error( "Feed init unknown type" );
> +      }
> +   }
> +}
> +
> +/**
> + * Class that defines an Feed object.
> + *  atomFeed =
> + *     element atom:feed {
> + *        atomCommonAttributes,
> + *        (atomAuthor*
> + *         & atomCategory*
> + *         & atomContributor*
> + *         & atomGenerator?
> + *         & atomIcon?
> + *         & atomId
> + *         & atomLink*
> + *         & atomLogo?
> + *         & atomRights?
> + *         & atomSubtitle?
> + *         & atomTitle
> + *         & atomUpdated
> + *         & extensionElement*),
> + *        atomEntry*
> + */
> +function Feed( init ) {
> +   // See init after functions have been defined.
> +
> +   var authors = new Array();
> +   var contributors = new Array();
> +   var categories = new Array();
> +   var links = new Array();
> +   var entries = new Array();
> +
> +   this.setPublished = function( published ) {
> +      this.published = published;
> +   };
> +
> +   this.getPublished = function() {
> +      return this.published;
> +   };
> +
> +   this.setUpdated = function( updated ) {
> +      this.updated = updated;
> +   };
> +
> +   this.getUpdated = function() {
> +      return this.updated;
> +   };
> +
> +   this.setNamespace = function( namespace ) {
> +      this.namespace = namespace;
> +   };
> +
> +   this.getNamespace = function() {
> +      return this.namespace;
> +   };
> +
> +   this.setContent = function( content ) {
> +      if (!((typeof content == "object") && (content instanceof Text)))
> +         error( "Entry content must be of type Text" );
> +
> +      this.content = content;
> +   }
> +
> +   this.getContent = function() {
> +      return this.content;
> +   };
> +
> +   this.setRights = function( rights ) {
> +      if (!((typeof rights == "object") && (rights instanceof Text)))
> +         error( "Feed rights must be of type Text" );
> +      this.rights = rights;
> +   }
> +
> +   this.getRights = function() {
> +      return this.rights;
> +   };
> +
> +   this.setSummary = function( summary ) {
> +      if (!((typeof summary == "object") && (summary instanceof Text)))
> +         error( "Feed summary must be of type Text" );
> +      this.summary = summary;
> +   }
> +
> +   this.getSummary = function() {
> +      return this.summary;
> +   };
> +
> +   this.setTitle = function( title ) {
> +      if (!((typeof title == "object") && (title instanceof Text)))
> +         error( "Feed title must be of type Text" );
> +      this.title = title;
> +   }
> +
> +   this.getTitle = function() {
> +      return this.title;
> +   };
> +
> +   this.setSubTitle = function( subtitle ) {
> +      if (!((typeof subtitle == "object") && (subtitle instanceof Text)))
> +         error( "Feed subtitle must be of type Text" );
> +      this.subtitle = subtitle;
> +   }
> +
> +   this.getSubTitle = function() {
> +      return this.subtitle;
> +   };
> +
> +   /* Type Id */
> +   this.setId = function( id ) {
> +      this.id = id;
> +   }
> +
> +   this.getId = function() {
> +      return this.id;
> +   };
> +
> +   this.setGenerator = function( generator ) {
> +      if (!((typeof generator == "object") && (generator instanceof 
> Generator)))
> +         error( "Feed generator must be of type Generator" );
> +      this.generator = generator;
> +   }
> +
> +   this.getGenerator = function() {
> +      return this.generator;
> +   };
> +
> +   this.setBase = function( base ) {
> +      this.base = base;
> +   }
> +
> +   this.getBase = function() {
> +      return this.base;
> +   };
> +
> +   this.setLogo = function( logo ) {
> +      this.logo = logo;
> +   }
> +
> +   this.getLogo = function() {
> +      return this.logo;
> +   };
> +
> +   /**
> +    * Add an author.
> +    * @param name Author
> +    */
> +   this.addAuthor = function(person) {
> +      if (!((typeof person == "object") && (person instanceof Person)))
> +         error( "Entry author must be of type Person" );
> +      var i = authors.length;
> +      authors[ i ] = person;
> +   }
> +
> +   /**
> +    * Get an author.
> +    * @param name Author
> +    */
> +   this.getAuthor = function(name) {
> +      return authors[ name ];
> +   }
> +
> +   /**
> +    * Set list of authors.
> +    * @param name Author
> +    */
> +   this.setAuthors = function( authors ) {
> +      return this.authors = authors;
> +   }
> +
> +   /**
> +    * Get an author.
> +    * @param name Author
> +    */
> +   this.getAuthors = function() {
> +      return authors;
> +   }
> +
> +   /**
> +    * Add an contributor.
> +    * @param name Contributor
> +    */
> +   this.addContributor = function(person) {
> +      if (!((typeof person == "object") && (person instanceof Person)))
> +         error( "Entry contributor must be of type Person" );
> +      var i = contributors.length;
> +      contributors[ i ] = person;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Contributor
> +    */
> +   this.getContributor = function(name) {
> +      return contributors[ name ];
> +   }
> +
> +   /**
> +    * Set list of contributors
> +    * @param name Author
> +    */
> +   this.setContributors = function( contributors ) {
> +      return this.contributors = contributors;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Contributor
> +    */
> +   this.getContributors = function() {
> +      return contributors;
> +   }
> +
> +   /**
> +    * Add an contributor.
> +    * @param name Category
> +    */
> +   this.addCategory = function(category) {
> +      if (!((typeof category == "object") && (person instanceof Category)))
> +         error( "Entry category must be of type Category" );
> +      var i = categories.length;
> +      categories[ i ] = category;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Category
> +    */
> +   this.getCategory = function(name) {
> +      return categories[ name ];
> +   }
> +
> +   /**
> +    * Set list of categories
> +    * @param name Author
> +    */
> +   this.setCategories = function( categories ) {
> +      return this.categories = categories;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Category
> +    */
> +   this.getCategories = function() {
> +      return categories;
> +   }
> +
> +   /**
> +    * Add an link.
> +    * @param name Link
> +    */
> +   this.addLink = function(link) {
> +      if (!((typeof link == "object") && (link instanceof Link)))
> +         error( "Entry link must be of type Link" );
> +      var i = links.length
> +      links[ i ] = link;
> +   }
> +
> +   /**
> +    * Get an link.
> +    * @param name Link
> +    */
> +   this.getLink = function(name) {
> +      return links[ name ];
> +   }
> +
> +   /**
> +    * Set list of links.
> +    * @param name Link
> +    */
> +   this.setLinks = function( links ) {
> +      return this.links = links;
> +   }
> +
> +   /**
> +    * Get an link.
> +    * @param name Link
> +    */
> +   this.getLinks = function() {
> +      return links;
> +   }
> +
> +   /**
> +    * Add an entry.
> +    * @param name Entry
> +    */
> +   this.addEntry = function(entry) {
> +      if (!((typeof entry == "object") && (entry instanceof Entry)))
> +         error( "Entry entry must be of type Entry" );
> +      var i = entries.length;
> +      entries[ i ] = entry;
> +   }
> +
> +   /**
> +    * Get an entry by name.
> +    * @param name Entry
> +    */
> +   this.getEntry = function(name) {
> +      return entries[ name ];
> +   }
> +
> +   /**
> +    * Set list of entries
> +    * @param name Author
> +    */
> +   this.setEntries = function( entries ) {
> +      return this.entries = entries;
> +   }
> +
> +   /**
> +    * Get an contributor.
> +    * @param name Entry
> +    */
> +   this.getEntries = function() {
> +      return entries;
> +   }
> +
> +   this.readFromXML = function( xml ) {
> +      // To Do Read from arbitraty XML such as
> +      // <feed xmlns="http://www.w3.org/2005/Atom";>
> +      // <title type="text">shopping cart</title>
> +      // <subtitle type="text">Total : $4.54</subtitle>
> +      // <entry>
> +      //    ...
> +      // </entry>
> +      // </feed>
> +   }
> +
> +   this.readFromDoc = function( htmlDoc ) {
> +      // Expect HTML collection.
> +      var feedDoc = htmlDoc.getElementsByTagName("feed");
> +      for (var i = 0; i < feedDoc.length; i++) {
> +         this.readFromNode( feedDoc[ i ] );
> +      }
> +   }
> +   this.readFromNode = function( feedNode ) {
> +      var entries = this.getEntries();
> +      var entryCount = 0;
> +      if ( entries != null ) {
> +         entryCount = entries.length;
> +      }
> +      // Expect feed node
> +      var childNodes = feedNode.childNodes;
> +      for ( var i = 0; i < childNodes.length; i++ ) {
> +         var node = childNodes[ i ];
> +         if (node.nodeType == 1 /*Node.ELEMENT_NODE*/) {
> +            var tagName = node.tagName;
> +            if (tagName == "title" ) {
> +               var title = new Text( getTextContent( node ) );
> +               title.setType( "text" );
> +               this.setTitle( title );
> +            } else if ( tagName == "subtitle" ) {
> +               var title = new Text( getTextContent( node ) );
> +               title.setType( "text" );
> +               this.setSubTitle( title );
> +            } else if ( tagName == "entry" ) {
> +               var entry = new Entry();
> +               entry.readFromNode( node );
> +               this.addEntry( entry );
> +            } else if ( tagName == "id" ) {
> +               var id = new Id( getTextContent( node ) );
> +               this.setId( id );
> +            } else if ( tagName == "updated" ) {
> +               var dateText = getTextContent( node );
> +               var date = new Date( dateText ); //2008-09-21T23:06:53.750Z
> +               this.setUpdated( date );
> +            } else if ( tagName == "link" ) {
> +               var href = node.attributes[ "href" ];
> +               var link = new Link( href.value );
> +               var rel = node.attributes[ "rel" ];
> +               link.setRelation( rel.value );
> +               this.addLink( link );
> +            } else {
> +               // To Do - implement rest of nodes
> +                          error( "undefined element node" );
> +            }
> +         } else if (node.nodeType == 2 /*Node.ATTRIBUTE_NODE*/) {
> +            var attrName = node.tagName;
> +         } else if (node.nodeType == 3 /*Node.TEXT_NODE*/) {
> +         }
> +      }
> +   }
> +
> +   this.toString = function() {
> +       return "Feed title=" + this.title + ", updated=" + this.updated;
> +   };
> +
> +   // Initialize from constructor
> +   if (typeof init == 'object') {
> +      if ( init.nodeType == 9 ) { /* Document Node.DOCUMENT_NODE 9 */
> +         this.readFromDoc( init );
> +      } else {
> +         error( "Feed init unknown type" );
> +      }
> +   }
> +}
> +
> +function error( message ) {
> +   alert( message );
> +}
> +
> +/* Returns inner text on both IE and modern browsers. */
> +function getTextContent(obj) {
> +   // innerText for IE, textContent for others, "" for others.
> +   return (obj.innerText) ? obj.innerText : (obj.textContent) ? 
> obj.textContent : "";
> +}
> \ No newline at end of file
>
> Added: 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html?rev=698020&view=auto
> ==============================================================================
> --- 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html
>  (added)
> +++ 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html
>  Mon Sep 22 15:15:29 2008
> @@ -0,0 +1,144 @@
> +<!--
> +    * 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.
> +-->
> +<html>
> +<head>
> +<title>Store</TITLE>
> +
> +<!-- one js include per sca component -->
> +<script type="text/javascript" src="storeJS.js"></script>
> +
> +<!-- Include Tuscany JavaScript client model for Atom.
> +        Using this JavaScript model, users can use syntax such as:
> +        item += "name=" + entry.getName() + ", price=" + entry.getContent()
> +        rather than
> +     item += 
> entries[i].getElementsByTagName("content")[0].firstChild.nodeValue;
> +       -->
> +<script type="text/javascript" src="atomModel.js"></script>
> +
> +<script language="JavaScript">
> +
> +       //@Reference
> +       var catalog = new Reference("Catalog");
> +
> +       //@Reference
> +       var shoppingCart = new Reference("ShoppingCart");
> +
> +       //@Property
> +       var locale = Property("locale");
> +
> +       function catalog_getResponse(items,exception) {
> +               if(exception){
> +                       alert(exception.message);
> +                       return;
> +               }
> +               var catalog = "";
> +               for (var i=0; i<items.length; i++)
> +                       catalog += '<input name="items" type="checkbox" 
> value="' +
> +                                               items[i] + '">' + items[i]+ ' 
> <br>';
> +               document.getElementById('catalog').innerHTML=catalog;
> +       }
> +
> +       function shoppingCart_getResponse(feedDoc) {
> +           // var xmlString = new XMLSerializer().serializeToString(feed);
> +           // alert("shoppingCart_getResponse feed xml=" + xmlString);
> +               var feed = new Feed( feedDoc );
> +
> +               if (feed != null) {
> +                       // var entries = feed.getElementsByTagName("entry");
> +                       var entries = feed.getEntries();
> +                       var list = "";
> +                       for (var i=0; i<entries.length; i++) {
> +                               // var item = 
> entries[i].getElementsByTagName("content")[0].firstChild.nodeValue;
> +                               var item = entries[i].getContent().getText();
> +                               list += item + ' <br>';
> +                       }
> +                       document.getElementById("shoppingCart").innerHTML = 
> list;
> +                       // document.getElementById('total').innerHTML = 
> feed.getElementsByTagName("subtitle")[0].firstChild.nodeValue;
> +                       var text =  feed.getSubTitle().getText();
> +                       document.getElementById('total').innerHTML = text;
> +               }
> +       }
> +
> +       function shoppingCart_postResponse(entry) {
> +               shoppingCart.get("", shoppingCart_getResponse);
> +       }
> +
> +       function addToCart() {
> +               var items  = document.catalogForm.items;
> +               var j = 0;
> +               for (var i=0; i<items.length; i++)
> +                       if (items[i].checked) {
> +                               var entry = '<entry 
> xmlns="http://www.w3.org/2005/Atom";><title>cart-item</title><content 
> type="text">'+items[i].value+'</content></entry>'
> +                               shoppingCart.post(entry, 
> shoppingCart_postResponse);
> +                               items[i].checked = false;
> +                       }
> +       }
> +
> +       function checkoutCart() {
> +               document.getElementById('store').innerHTML='<h2>' +
> +                               'Thanks for Shopping With Us!</h2>'+
> +                               '<h2>Your Order</h2>'+
> +                               '<form name="orderForm" 
> action="/ufs/store.html">'+
> +                                       
> document.getElementById('shoppingCart').innerHTML+
> +                                       '<br>'+
> +                                       
> document.getElementById('total').innerHTML+
> +                                       '<br>'+
> +                                       '<br>'+
> +                                       '<input type="submit" value="Continue 
> Shopping">'+
> +                               '</form>';
> +               shoppingCart.del("", null);
> +       }
> +       function deleteCart() {
> +               shoppingCart.del("", null);
> +               document.getElementById('shoppingCart').innerHTML = "";
> +               document.getElementById('total').innerHTML = "";
> +       }
> +
> +    //alert(locale);
> +       catalog.get(catalog_getResponse);
> +       shoppingCart.get("", shoppingCart_getResponse);
> +</script>
> +
> +</head>
> +
> +<body>
> +<h1>Store</h1>
> +  <div id="store">
> +       <h2>Catalog</h2>
> +       <form name="catalogForm">
> +               <div id="catalog" ></div>
> +               <br>
> +               <input type="button" onClick="addToCart()"  value="Add to 
> Cart">
> +       </form>
> +
> +       <br>
> +
> +       <h2>Your Shopping Cart</h2>
> +       <form name="shoppingCartForm">
> +               <div id="shoppingCart"></div>
> +               <br>
> +               <div id="total"></div>
> +               <br>
> +               <input type="button" onClick="checkoutCart()" 
> value="Checkout">
> +               <input type="button" onClick="deleteCart()" value="Empty">
> +               <a href="../ShoppingCart/">(feed)</a>
> +       </form>
> +  </div>
> +</body>
> +</html>
>
> Propchange: 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html
> ------------------------------------------------------------------------------
>    svn:keywords = Rev Date
>
> Added: 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite
> URL: 
> http://svn.apache.org/viewvc/tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite?rev=698020&view=auto
> ==============================================================================
> --- 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite
>  (added)
> +++ 
> tuscany/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite
>  Mon Sep 22 15:15:29 2008
> @@ -0,0 +1,58 @@
> +<?xml version="1.0" encoding="UTF-8"?>
> +<!--
> +    * 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.
> +-->
> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0";
> +    xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0";
> +       targetNamespace="http://sample/resource";
> +       xmlns:sr="http://sample/resource";
> +       name="resource">
> +
> +    <component name="storeJS">
> +       <!-- Note: the store.html and storeJS.html clients are similar
> +                except that store.html edits the client document using 
> JavaScript
> +                and many node queries, and storeJS.html uses the client Atom
> +                JavaScript mode (fewer node queries and less XML knowledge 
> needed.-->
> +        <tuscany:implementation.widget location="content/storeJS.html"/>
> +        <property name="locale">en</property>
> +        <service name="Widget">
> +               <tuscany:binding.http uri="/storeJS"/>
> +        </service>
> +               <reference name="Catalog" target="Catalog">
> +                       <tuscany:binding.jsonrpc uri="/Catalog"/>
> +                </reference>
> +                <reference name="ShoppingCart" target="ShoppingCart">
> +                       <tuscany:binding.atom uri="/ShoppingCart"/>
> +                </reference>
> +    </component>
> +
> +    <component name="Catalog">
> +               <implementation.java class="store.CatalogImpl"/>
> +               <service name="Catalog">
> +                       <tuscany:binding.jsonrpc uri="/Catalog"/>
> +               </service>
> +       </component>
> +
> +       <component name="ShoppingCart">
> +               <implementation.java class="store.ShoppingCartImpl"/>
> +               <service name="Collection">
> +                       <tuscany:binding.atom uri="/ShoppingCart"/>
> +               </service>
> +       </component>
> +
> +</composite>
>
>
>



-- 
Luciano Resende
Apache Tuscany, Apache PhotArk
http://people.apache.org/~lresende
http://lresende.blogspot.com/

Reply via email to