diff options
Diffstat (limited to 'branches/sca-equinox/modules/implementation-widget-runtime')
5 files changed, 1326 insertions, 5 deletions
diff --git a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java index f694c758dc..bed053eeee 100644 --- a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java +++ b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java @@ -34,9 +34,9 @@ public class CatalogImpl implements Catalog { @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() { diff --git a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java index d4d2810d5c..37e8d0161a 100644 --- a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java +++ b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java @@ -47,7 +47,6 @@ public class ShoppingCartImpl implements Collection { for (Entry entry : cart.values()) { feed.addEntry(entry); } - return feed; } @@ -83,7 +82,7 @@ public class ShoppingCartImpl implements Collection { 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 @@ public class ShoppingCartImpl implements Collection { 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()) { diff --git a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js new file mode 100644 index 0000000000..f4e44bf589 --- /dev/null +++ b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js @@ -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 diff --git a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html new file mode 100644 index 0000000000..ae1fbb4356 --- /dev/null +++ b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html @@ -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> diff --git a/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite new file mode 100644 index 0000000000..e44a56e520 --- /dev/null +++ b/branches/sca-equinox/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite @@ -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>
|