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/
