From 60744a36aae604ac3c4499ed54f1082ab8f5947d Mon Sep 17 00:00:00 2001 From: lresende Date: Wed, 19 Nov 2008 00:10:54 +0000 Subject: Copying modules from Equinox branch, to start merging the delta changes from 1.x/original trunk git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@718815 13f79535-47bb-0310-9956-ffa450edef68 --- .../widget/WidgetImplementationTestCase.java | 54 + .../src/test/java/store/Catalog.java | 32 + .../src/test/java/store/CatalogImpl.java | 47 + .../src/test/java/store/ShoppingCartImpl.java | 124 +++ .../src/test/resources/content/atomModel.js | 1144 ++++++++++++++++++++ .../src/test/resources/content/store.html | 127 +++ .../src/test/resources/content/storeJS.html | 144 +++ .../src/test/resources/widget.composite | 54 + .../src/test/resources/widgetJS.composite | 58 + 9 files changed, 1784 insertions(+) create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/java/org/apache/tuscany/sca/implementation/widget/WidgetImplementationTestCase.java create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/java/store/Catalog.java create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/resources/content/store.html create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/resources/widget.composite create mode 100644 java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite (limited to 'java/sca/modules/implementation-widget-runtime/src/test') diff --git a/java/sca/modules/implementation-widget-runtime/src/test/java/org/apache/tuscany/sca/implementation/widget/WidgetImplementationTestCase.java b/java/sca/modules/implementation-widget-runtime/src/test/java/org/apache/tuscany/sca/implementation/widget/WidgetImplementationTestCase.java new file mode 100644 index 0000000000..3d559c20d5 --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/java/org/apache/tuscany/sca/implementation/widget/WidgetImplementationTestCase.java @@ -0,0 +1,54 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.implementation.widget; + +import java.net.Socket; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.node.Contribution; +import org.apache.tuscany.sca.node.ContributionLocationHelper; +import org.apache.tuscany.sca.node.Node; +import org.apache.tuscany.sca.node.NodeFactory; + +/** + * @version $Rev$ $Date$ + */ +public class WidgetImplementationTestCase extends TestCase { + + private Node node; + + @Override + protected void setUp() throws Exception { + String contribution = ContributionLocationHelper.getContributionLocation(getClass()); + node = NodeFactory.newInstance().createNode("widget.composite", new Contribution("test", contribution)); + node.start(); + } + + @Override + protected void tearDown() throws Exception { + node.stop(); + node.destroy(); + } + + public void testPing() throws Exception { + new Socket("127.0.0.1", 8085); + } + +} diff --git a/java/sca/modules/implementation-widget-runtime/src/test/java/store/Catalog.java b/java/sca/modules/implementation-widget-runtime/src/test/java/store/Catalog.java new file mode 100644 index 0000000000..370474f29f --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/java/store/Catalog.java @@ -0,0 +1,32 @@ +/* + * 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. + */ + +package store; + +import org.osoa.sca.annotations.Remotable; + +/** + * Interface for the Catalog Service. + * + * @version $Rev$ $Date$ + */ +@Remotable +public interface Catalog { + String[] get(); +} diff --git a/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java b/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java new file mode 100644 index 0000000000..bed053eeee --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/java/store/CatalogImpl.java @@ -0,0 +1,47 @@ +/* + * 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. + */ + +package store; + +import java.util.ArrayList; +import java.util.List; + +import org.osoa.sca.annotations.Init; + +/** + * Implementation of the Catalog Service. + * + * @version $Rev$ $Date$ + */ +public class CatalogImpl implements Catalog { + private List catalog = new ArrayList(); + + @Init + public void init() { + catalog.add("Apple - $ 2.99"); + catalog.add("Orange - $ 3.55"); + catalog.add("Pear - $ 1.55"); + } + + public String[] get() { + String[] catalogArray = new String[catalog.size()]; + catalog.toArray(catalogArray); + return catalogArray; + } +} diff --git a/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java b/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java new file mode 100644 index 0000000000..37e8d0161a --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/java/store/ShoppingCartImpl.java @@ -0,0 +1,124 @@ +/* + * 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. + */ + +package store; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import org.apache.abdera.Abdera; +import org.apache.abdera.model.Entry; +import org.apache.abdera.model.Feed; +import org.apache.tuscany.sca.binding.atom.collection.Collection; +import org.apache.tuscany.sca.binding.atom.collection.NotFoundException; + +/** + * Implementation of a Shopping Cart. + * + * @version $Rev$ $Date$ + */ +public class ShoppingCartImpl implements Collection { + + private static Map cart = new HashMap(); + + public Feed getFeed() { + Feed feed = Abdera.getNewFactory().newFeed(); + feed.setTitle("shopping cart"); + feed.setSubtitle("Total : " + getTotal()); + + for (Entry entry : cart.values()) { + feed.addEntry(entry); + } + return feed; + } + + public Feed query(String queryString) { + if (queryString.startsWith("name=")) { + String name = queryString.substring(5); + + Feed feed = Abdera.getNewFactory().newFeed(); + feed.setTitle("shopping cart"); + feed.setSubtitle("Total : " + getTotal()); + + for (Entry entry : cart.values()) { + if (entry.getTitle().contains(name)) { + feed.addEntry(entry); + } + } + return feed; + + } else { + return getFeed(); + } + } + + public Entry get(String id) throws NotFoundException { + return cart.get(id); + } + + public Entry post(Entry entry) { + System.out.println("post" + entry); + String id = "cart-" + UUID.randomUUID().toString(); + entry.setId(id); + + entry.addLink(id, "edit"); + entry.addLink(id, "alternate"); + + entry.setUpdated(new Date()); + + cart.put(id, entry); + return entry; + } + + public void put(String id, Entry entry) throws NotFoundException { + entry.setUpdated(new Date()); + cart.put(id, entry); + } + + public void delete(String id) throws NotFoundException { + if (id.equals("")) + cart.clear(); + else + cart.remove(id); + } + + private String getTotal() { + float total = 0; + 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()) { + String item = entry.getContent(); + + int index = item.length()-1; + char digit; + while ((digit = item.charAt(index)) == '.' || Character.isDigit(digit)) { + index--; + } + + total += Float.valueOf(item.substring(index)); + } + return currencySymbol + String.valueOf(total); + } +} diff --git a/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js b/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js new file mode 100644 index 0000000000..fa0396a4d8 --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/resources/content/atomModel.js @@ -0,0 +1,1144 @@ +/* + * 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.setText = function(content) { + this.content = content; + }; + + this.getText = function() { + return this.content; + }; + + this.getValue = 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; + }; + +/* + String TYPE_ATOM + Link type used for Atom content. + String TYPE_HTML + Link type used for HTML content. +*/ + this.setMimeType = function(mimeType) { + this.mimeType = mimeType; + }; + + this.getMimeType = function() { + return this.mimeType; + }; + +/* + String REL_ALTERNATE + Link that provides the URI of an alternate format of the entry's or feed's contents. + String REL_ENTRY_EDIT + Link that provides the URI that can be used to edit the entry. + String REL_MEDIA_EDIT + Link that provides the URI that can be used to edit the media associated with an entry. + String REL_NEXT + Link that provides the URI of next page in a paged feed. + String REL_PREVIOUS + Link that provides the URI of previous page in a paged feed. + String REL_RELATED + Link that provides the URI of a related link to the entry. + String REL_SELF + Link that provides the URI of the feed or entry. + 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 + // + // cart-item + // Apple - $ 2.99 + // cart-bd5323d6-1f59-4fae-a8f5-01f7654f1e77 + // + // + // 2008-09-21T23:06:43.921Z + // + + } + 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 text = getTextContent( node ); + var type = node.getAttribute( "type" ); + if ( type == undefined ) + type = "text"; + var title = new Text( text, type ); + this.setTitle( title ); + } else if ( tagName == "subtitle" ) { + var text = getTextContent( node ); + var type = node.getAttribute( "type" ); + if ( type == undefined ) + type = "text"; + var title = new Text( text, type ); + 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" ]; // Works on modern browsers. + var attrVal = node.getAttribute( "href" ); + var link = new Link( attrVal ); + attrVal = node.getAttribute( "rel" ); + if ( attrVal ) + link.setRelation( attrVal ); + this.addLink( link ); + } else if ( tagName == "content" ) { + var text = getTextContent( node ); + var type = node.getAttribute( "type" ); + if (type == undefined) + type = "text"; + var content = new Text( text, type ); + 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 + // + // shopping cart + // Total : $4.54 + // + // ... + // + // + } + + 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 ) { + // 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 text = getTextContent( node ); + var type = node.getAttribute( "type" ); + if ( type == undefined ) + type = "text"; + var title = new Text( text, type ); + this.setTitle( title ); + } else if ( tagName == "subtitle" ) { + var text = getTextContent( node ); + var type = node.getAttribute( "type" ); + if ( type == undefined ) + type = "text"; + var title = new Text( text, type ); + 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" ]; // Works on modern browsers. + var attrVal = node.getAttribute( "href" ); + var link = new Link( attrVal ); + attrVal = node.getAttribute( "rel" ); + if ( attrVal ) + link.setRelation( attrVal ); + 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(node) { + // innerText for IE, textContent for others, child text node, "" for others. + if ( node.innerText ) + return node.innerText; + if ( node.textContent ) + return node.textContent; + if ( node.hasChildNodes() ) { + var childNodes = node.childNodes + for ( var j = 0; j < childNodes.length; j++ ) { + var childNode = childNodes[ j ]; + var childType = childNode.nodeType; + if (childNode.nodeType == 3 /*Node.TEXT_NODE*/) { + return childNode.nodeValue; + } + } + } + return undefined; +} \ No newline at end of file diff --git a/java/sca/modules/implementation-widget-runtime/src/test/resources/content/store.html b/java/sca/modules/implementation-widget-runtime/src/test/resources/content/store.html new file mode 100644 index 0000000000..58f9f560a7 --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/resources/content/store.html @@ -0,0 +1,127 @@ + + + +Store + + + + + + + + + +

Store

+
+

Catalog

+
+
+
+ +
+ +
+ +

Your Shopping Cart

+
+
+
+
+
+ + + (feed) +
+
+ + diff --git a/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html b/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html new file mode 100644 index 0000000000..e58f14a635 --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/resources/content/storeJS.html @@ -0,0 +1,144 @@ + + + +Store + + + + + + + + + + + + +

Store

+
+

Catalog

+
+
+
+ +
+ +
+ +

Your Shopping Cart

+
+
+
+
+
+ + + (feed) +
+
+ + diff --git a/java/sca/modules/implementation-widget-runtime/src/test/resources/widget.composite b/java/sca/modules/implementation-widget-runtime/src/test/resources/widget.composite new file mode 100644 index 0000000000..f23d6a20f5 --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/resources/widget.composite @@ -0,0 +1,54 @@ + + + + + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite b/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite new file mode 100644 index 0000000000..e44a56e520 --- /dev/null +++ b/java/sca/modules/implementation-widget-runtime/src/test/resources/widgetJS.composite @@ -0,0 +1,58 @@ + + + + + + + + en + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3