diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-12 00:43:48 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-11-12 00:43:48 +0000 |
commit | 9425990f532b1152c2d73db96c0f07ef5216a3d1 (patch) | |
tree | a8986fc31f96eb02484a0ae9d1c14cfa788e30ac /sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources | |
parent | 40523f9c6cb1f7a785c2dbd2466dc410ae6ddf66 (diff) |
Moving 2.x contribs
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@835178 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources')
5 files changed, 2343 insertions, 0 deletions
diff --git a/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory new file mode 100644 index 0000000000..d0f73cbdbb --- /dev/null +++ b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/META-INF/services/org.apache.tuscany.sca.provider.ImplementationProviderFactory @@ -0,0 +1,19 @@ +# 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.
+
+# Implementation class for the implementation extension
+org.apache.tuscany.sca.implementation.widget.provider.WidgetImplementationProviderFactory;model=org.apache.tuscany.sca.implementation.widget.WidgetImplementation
diff --git a/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/atomModel.js b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/atomModel.js new file mode 100644 index 0000000000..c64c3fc97c --- /dev/null +++ b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/atomModel.js @@ -0,0 +1,1590 @@ +/* + * 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; + }; + + /** + * Serialize this element to XML. + * atomUri = text + */ + this.toXML = function() { + xml = "<uri>"; + xml += this.value; + xml += "</uri>\n"; + return xml; + }; +} + +/* 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; + }; + + /** + * Serialize this element to XML. + * atomEmailAddress = xsd:string { pattern = ".+@.+" } + */ + this.toXML = function() { + xml = "<email>"; + xml += this.value; + xml += "</email>\n"; + return xml; + }; +} + +/** + * 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; + }; + + /** + * Serialize this element to XML. + * atomId = element atom:id { + * atomCommonAttributes, + * (atomUri) + * } + */ + this.toXML = function() { + xml = "<id"; + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null ) { + xml += " lang=\"" + this.lang + "\""; + } + xml += ">"; + xml += this.value; + xml += "</id>\n"; + return xml; + }; +} + + +/** + * 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; + }; + + /** + * Serialize this element to XML. + * atomLogo = element atom:logo { + * atomCommonAttributes, + * (atomUri) + * } + */ + this.toXML = function() { + xml = "<logo"; + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null ) { + xml += " lang=\"" + this.lang + "\""; + } + xml += ">"; + xml += this.value; + xml += "</logo>\n"; + return xml; + }; +} + +/** + * Class that defines a Text object. + */ +function Text( content, /* optional */ type ) { + this.content = content; + this.type = type; + if (type == null) 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; + }; + + /** Serialize this text element to XML. + * atomPlainTextConstruct = + * atomCommonAttributes, + * attribute type { "text" | "html" }?, + * text + * + * atomXHTMLTextConstruct = + * atomCommonAttributes, + * attribute type { "xhtml" }, + * xhtmlDiv + * + * atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct + */ + this.toXML = function( elementName ) { + if ( elementName == null ) { + elementName = "text"; + } + xml = "<" + elementName; + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null ) { + xml += " lang=\"" + this.lang + "\""; + } + xml += " type=\"" + this.type + "\""; + xml += ">"; + if ( this.type === "xhtml" ) { + xml += "<div xmlns=\"http://www.w3.org/1999/xhtml\">"; + } + xml += this.content; + if ( this.type === "xhtml" ) { + xml += "</div>"; + } + xml += "</" + elementName + ">"; + return xml; + } +} + +/** + * Class that defines a Person object. + */ +function Person( name, email ) { + this.name = name; + if ( email != null ) { + this.email = new Email( email ); + } + + this.setName = function( name ) { + this.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; + }; + + /** Serialize this text element to XML. + * atomPersonConstruct = + * atomCommonAttributes, + * (element atom:name { text } + * & element atom:uri { atomUri }? + * & element atom:email { atomEmailAddress }? + * & extensionElement*) + */ + this.toXML = function( elementName ) { + if ( elementName == null ) { + elementName = "person"; + } + xml = "<" + elementName; + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null ) { + xml += " lang=\"" + this.lang + "\""; + } + xml += ">\n"; + if ( this.name != null ) { + xml += "<name>" + this.name + "</name>\n"; + } + if ( this.uri != null ) { + xml += "<uri>" + this.uri + "</uri>\n"; + } + if ( this.email != null) { + xml += this.email.toXML(); + } + xml += "</" + elementName + ">\n"; + return xml; + } + } + +/** + * Class that defines a Generator object. + */ +function Generator( name, uri ) { + this.name = name; + this.uri = new Uri( uri ); + + this.setName = function( name ) { + this.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; + }; + + /** Serialize this text element to XML. + * atomGenerator = element atom:generator { + * atomCommonAttributes, + * attribute uri { atomUri }?, + * attribute version { text }?, + * text + * } + */ + this.toXML = function() { + xml = "<generator"; + if ( this.uri != null ) { + xml += " uri=\"" + this.uri.getValue() + "\""; + } + if ( this.lang != null) { + xml += " lang=\"" + this.lang + "\""; + } + if ( this.version != null ) { + xml += " version=\"" + this.version + "\""; + } + xml += ">"; + if ( this.name != null ) { + xml += this.name; + } + xml += "</generator>\n"; + return xml; + } +} + +/** + * Class that defines a Category object. + *atomCategory = + * element atom:category { + * atomCommonAttributes, + * attribute term { text }, + * attribute scheme { atomUri }?, + * attribute label { text }?, + * undefinedContent + * } + */ +function Category( label, content ) { + this.label = label; + this.content = content; + + 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.setContent = function( content ) { + this.content = content; + }; + + this.getContent = function() { + return this.content; + }; + + this.toString = function() { + return "Category label=" + this.label; + }; + + /** Serialize this text element to XML. + * atomCategory = + * element atom:category { + * atomCommonAttributes, + * attribute term { text }, + * attribute scheme { atomUri }?, + * attribute label { text }?, + * undefinedContent + * } + */ + this.toXML = function() { + xml = "<category>\n"; + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null) { + xml += " lang=\"" + this.lang + "\""; + } + if ( this.term != null) { + xml += " term=\"" + this.term + "\""; + } + if ( this.scheme != null) { + xml += " scheme=\"" + this.scheme + "\""; + } + if ( this.label != null) { + xml += " label=\"" + this.label + "\""; + } + xml += ">\n"; + if ( this.content != null ) { + xml += this.content + "\n"; + } + xml += "</category>\n"; + return xml; + } +} + +/** + * Class that defines a Link object. + */ +function Link( href, relation ) { + this.href = new Uri( href ); + this.relation = relation; + + 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; + }; + + this.setContent= function( content ) { + this.content = content; + }; + + this.getContent = function() { + return this.content; + }; + +/* +<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; + }; + + /** Serialize this text element to XML. + * atomLink = + * element atom:link { + * atomCommonAttributes, + * attribute href { atomUri }, + * attribute rel { atomNCName | atomUri }?, + * attribute type { atomMediaType }?, + * attribute hreflang { atomLanguageTag }?, + * attribute title { text }?, + * attribute length { text }?, + * undefinedContent + * } + */ + this.toXML = function() { + xml = "<link"; + if ( this.relation != null ) { + xml += " rel=\"" + this.relation + "\""; + } + if ( this.uri != null ) { + xml += " uri=\"" + this.uri.getValue() + "\""; + } + if ( this.lang != null) { + xml += " lang=\"" + this.lang + "\""; + } + if ( this.href != null ) { + xml += " href=\"" + this.href.getValue() + "\""; + } + if ( this.hreflang != null ) { + xml += " hreflang=\"" + this.hreflang + "\""; + } + if ( this.title != null ) { + xml += " title=\"" + this.title + "\""; + } + if ( this.length != null ) { + xml += " length=\"" + this.length + "\""; + } + if ( this.content != null ) { + xml += this.content + "\n"; + xml += "</link>\n"; + } else { + xml += "/>\n"; + } + return xml; + } + +} + +/** + * 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 + + this.authors = new Array(); + this.contributors = new Array(); + this.categories = new Array(); + this.links = new Array(); + + this.setNamespace = function( namespace ) { + this.namespace = namespace; + }; + + this.getNamespace = function() { + return this.namespace; + }; + + this.setId = function( id ) { + if (!((typeof id == "object") && (id instanceof Id))) + this.id = new Id( id ); + else + this.id = id; + } + + this.getId = function() { + return this.id; + }; + + 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.setRights = function( rights ) { + this.rights = rights; + } + + this.getRights = function() { + return this.rights; + }; + + this.setSource = function( source ) { + this.source = source; + } + + this.getSource = function() { + return this.source; + }; + + /* Type Text */ + this.setTitle = function( title ) { + if (!((typeof title == "object") && (title instanceof Text))) + this.title = new Text( title, "text" ); + else + this.title = title; + } + + this.getTitle = function() { + return this.title; + }; + + /* Type Text */ + this.setSummary = function( summary ) { + if (!((typeof summary == "object") && (summary instanceof Text))) + this.summary = new Text( summary, "text" ); + else + this.summary = summary; + } + + this.getSummary = function() { + return this.summary; + }; + + /* Type Text */ + this.setContent = function( content ) { + if (!((typeof content == "object") && (content instanceof Text))) + this.content = new Text( content, "text" ); + else + this.content = content; + } + + this.getContent = function() { + return this.content; + }; + + /** + * 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 = this.authors.length; + this.authors[ i ] = person; + } + + /** + * Get an author. + * @param name Author + */ + this.getAuthor = function(name) { + return this.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 this.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 = this.contributors.length; + this.contributors[ i ] = person; + } + + /** + * Get an contributor. + * @param name Contributor + */ + this.getContributor = function(name) { + return this.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 this.contributors; + } + + /** + * Add a category. + * @param name Category + */ + this.addCategory = function(category) { + if (!((typeof category == "object") && (category instanceof Category))) + error( "Entry category must be of type Category" ); + var i = this.categories.length + this.categories[ i ] = category; + } + + /** + * Get a names category. + * @param name Category + */ + this.getCategory = function(name) { + return this.categories[ name ]; + } + + /** + * Set list of categories + * @param name Author + */ + this.setCategories = function( categories ) { + return this.categories = categories; + } + + /** + * Get all categories. + * @param name Category + */ + this.getCategories = function() { + return this.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 = this.links.length; + this.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 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; + }; + + /** Serialize this text element to XML. + * atomEntry = + * element atom:entry { + * atomCommonAttributes, + * (atomAuthor* + * & atomContributor* + * & atomCategory* + * & atomLink* + * & atomTitle + * & atomId + * & atomPublished? + * & atomUpdated + * & atomContent? + * & atomRights? + * & atomSource? + * & atomSummary? + * & extensionElement*) + * } + */ + this.toXML = function() { + xml = "<entry"; + if ( this.namespace != null ) { + xml += " namespace=\"" + this.namespace + "\""; + } + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null ) { + xml += " lang=\"" + this.lang + "\""; + } + xml += ">"; + if ( this.title != null ) { + xml += this.title.toXML( "title" ); + } + if ( this.id != null ) { + xml += this.id.toXML(); + } + if ( this.published != null ) { + xml += "<published>" + this.published + "</published>\n"; + } + if ( this.updated != null ) { + xml += "<updated>" + this.updated + "</updated>\n"; + } + if ( this.authors != null ) { + for ( var i = 0; i < this.authors.length; i++ ) { + var author = this.authors[ i ]; + xml += author.toXML( "author" ); + } + } + if ( this.contributors != null ) { + for ( var i = 0; i < this.contributors.length; i++ ) { + var contributor = this.contributors[ i ]; + xml += contributor.toXML( "contributor" ); + } + } + if ( this.categories != null ) { + for ( var i = 0; i < this.categories.length; i++ ) { + var category = this.categories[ i ]; + xml += category.toXML(); + } + } + if ( this.links != null ) { + for ( var i = 0; i < this.links.length; i++ ) { + var link = this.links[ i ]; + xml += link.toXML(); + } + } + if ( this.rights != null ) { + xml += "<rights>" + this.rights + "</rights>\n"; + } + if ( this.source != null ) { + xml += "<source>" + this.source + "</source>\n"; + } + if ( this.summary != null ) { + xml += this.summary.toXML( "summary" ); + } + if ( this.content != null ) { + xml += this.content.toXML( "content" ); + } + xml += "</entry>"; + return xml; + } + + // 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" ); + } + } else if ( typeof init === 'string' ) { + this.setTitle( init ); + } + this.namespace = "http://www.w3.org/2005/Atom"; +} + +/** + * 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. + + this.authors = new Array(); + this.contributors = new Array(); + this.categories = new Array(); + this.links = new Array(); + this.entries = new Array(); + + this.setNamespace = function( namespace ) { + this.namespace = namespace; + }; + + this.getNamespace = function() { + return this.namespace; + }; + + 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.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))) + this.rights = new Text( rights, "text" ); + else + 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))) + this.title = new Text( title, "text" ); + else + this.title = title; + } + + this.getTitle = function() { + return this.title; + }; + + this.setSubtitle = function( subtitle ) { + if (!((typeof subtitle == "object") && (subtitle instanceof Text))) + this.subtitle = new Text( subtitle, "text" ); + else + this.subtitle = subtitle; + } + + this.getSubtitle = function() { + return this.subtitle; + }; + + /* Type Id */ + this.setId = function( id ) { + if (!((typeof id == "object") && (id instanceof Id))) + this.id = new Id( id ); + else + 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 = this.authors.length; + this.authors[ i ] = person; + } + + /** + * Get an author. + * @param name Author + */ + this.getAuthor = function(name) { + return this.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 this.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 = this.contributors.length; + this.contributors[ i ] = person; + } + + /** + * Get an contributor. + * @param name Contributor + */ + this.getContributor = function(name) { + return this.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 this.contributors; + } + + /** + * Add a category. + * @param name Category + */ + this.addCategory = function(category) { + if (!((typeof category == "object") && (category instanceof Category))) + error( "Feed category must be of type Category" ); + var i = this.categories.length; + this.categories[ i ] = category; + } + + /** + * Get a named contributor. + * @param name Category + */ + this.getCategory = function(name) { + return this.categories[ name ]; + } + + /** + * Set list of categories + * @param category + */ + this.setCategories = function( categories ) { + return this.categories = categories; + } + + /** + * Get all categories. + * @param name Category + */ + this.getCategories = function() { + return this.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 = this.links.length; + this.links[ i ] = link; + } + + /** + * Get an link. + * @param name Link + */ + this.getLink = function(name) { + return this.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 this.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 = this.entries.length; + this.entries[ i ] = entry; + } + + /** + * Get an entry by name. + * @param name Entry + */ + this.getEntry = function(name) { + return this.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 this.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 ) { + // 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; + }; + + /** Serialize this text element to XML. + * atomFeed = + * element atom:feed { + * atomCommonAttributes, + * (atomAuthor* + * & atomContributor* + * & atomCategory* + * & atomLink* + * & atomTitle + * & atomSubtitle? + * & atomId + * & atomUpdated + * & atomRights? + * & atomGenerator? + * & atomIcon? + * & atomLogo? + * & extensionElement*), + * atomEntry* + */ + this.toXML = function() { + xml = "<feed"; + if ( this.namespace != null ) { + xml += " namespace=\"" + this.namespace + "\""; + } + if ( this.uri != null ) { + xml += " uri=\"" + this.uri + "\""; + } + if ( this.lang != null ) { + xml += " lang=\"" + this.lang + "\""; + } + xml += ">\n"; + if ( this.title != null ) { + xml += this.title.toXML( "title" ); + } + if ( this.subtitle != null ) { + xml += this.subtitle.toXML( "subtitle" ); + } + if ( this.id != null ) { + xml += this.id.toXML(); + } + if ( this.published != null ) { + xml += "<published>" + this.published + "</published>\n"; + } + if ( this.updated != null ) { + xml += "<updated>" + this.updated + "</updated>\n"; + } + if ( this.authors != null ) { + for ( var i = 0; i < this.authors.length; i++ ) { + var author = this.authors[ i ]; + xml += author.toXML( "author" ); + } + } + if ( this.contributors != null ) { + for ( var i = 0; i < this.contributors.length; i++ ) { + var contributor = this.contributors[ i ]; + xml += contributor.toXML( "contributor" ); + } + } + if ( this.categories != null ) { + for ( var i = 0; i < this.categories.length; i++ ) { + var category = this.categories[ i ]; + xml += category.toXML(); + } + } + if ( this.links != null ) { + for ( var i = 0; i < this.links.length; i++ ) { + var link = this.links[ i ]; + xml += link.toXML(); + } + } + if ( this.rights != null ) { + xml += this.rights.toXML( "rights" ); + } + if ( this.source != null ) { + xml += "<source>" + this.source + "</source>\n"; + } + if ( this.logo != null ) { + xml += "<logo>" + this.logo + "</logo>\n"; + } + if ( this.icon != null ) { + xml += "<icon>" + this.icon + "</icon>\n"; + } + if ( this.generator != null ) { + xml += this.generator.toXML( "generator" ); + } + if ( this.summary != null ) { + xml += this.summary.toXML( "summary" ); + } + if ( this.entries != null ) { + for ( var i = 0; i < this.entries.length; i++ ) { + var entry = this.entries[ i ]; + xml += entry.toXML(); + } + } + xml += "</feed>\n"; + return xml; + } + + // 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" ); + } + } else if ( typeof init === 'string' ) { + this.setTitle( init ); + } + this.namespace = "http://www.w3.org/2005/Atom"; +} + +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/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-atom.js b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-atom.js new file mode 100644 index 0000000000..2719e9a9b9 --- /dev/null +++ b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-atom.js @@ -0,0 +1,137 @@ +/* + * 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. + */ + +function AtomClient(uri) { + + this.msxmlNames = [ "MSXML2.XMLHTTP.5.0", + "MSXML2.XMLHTTP.4.0", + "MSXML2.XMLHTTP.3.0", + "MSXML2.XMLHTTP", + "Microsoft.XMLHTTP" ]; + + this.uri=uri; + + this.get = function(id, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + var strDocument = xhr.responseText; + var xmlDocument = xhr.responseXML; + if(!xmlDocument || xmlDocument.childNodes.length==0){ + xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml"); + } + if (responseFunction != null) responseFunction(xmlDocument); + } else { + alert("get - Error getting data from the server"); + } + } + } + xhr.open("GET", uri + '/' + id, true); + xhr.send(null); + } + + this.post = function (entry, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 201) { + var strDocument = xhr.responseText; + var xmlDocument = xhr.responseXML; + if(!xmlDocument || xmlDocument.childNodes.length==0){ + xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml"); + } + if (responseFunction != null) responseFunction(xmlDocument); + } else { + alert("post - Error getting data from the server"); + } + } + } + xhr.open("POST", uri, true); + xhr.setRequestHeader("Content-Type", "application/atom+xml"); + xhr.send(entry); + } + + this.put = function (id, entry, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + var strDocument = xhr.responseText; + var xmlDocument = xhr.responseXML; + if(!xmlDocument || xmlDocument.childNodes.length==0){ + xmlDocument = (new DOMParser()).parseFromString(strDocument, "text/xml"); + } + if (responseFunction != null) responseFunction(xmlDocument); + } else { + alert("put - Error getting data from the server"); + } + } + } + xhr.open("PUT", uri + '/' + id, true); + xhr.setRequestHeader("Content-Type", "application/atom+xml"); + xhr.send(entry); + } + + this.del = function (id, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + if (responseFunction != null) responseFunction(); + } else { + alert("delete - Error getting data from the server"); + } + } + } + xhr.open("DELETE", uri + '/' + id, true); + xhr.send(null); + } + this.createXMLHttpRequest = function () { + /* Mozilla XMLHttpRequest */ + try {return new XMLHttpRequest();} catch(e) {} + + /* Microsoft MSXML ActiveX */ + for (var i=0;i < this.msxmlNames.length; i++) { + try {return new ActiveXObject(this.msxmlNames[i]);} catch (e) {} + } + alert("XML http request not supported"); + return null; + } + if (typeof DOMParser == "undefined") { + DOMParser = function () {} + + DOMParser.prototype.parseFromString = function (str, contentType) { + if (typeof ActiveXObject != "undefined") { + var d = new ActiveXObject("MSXML.DomDocument"); + d.loadXML(str); + return d; + } else if (typeof XMLHttpRequest != "undefined") { + var req = new XMLHttpRequest; + req.open("GET", "data:" + (contentType || "application/xml") + + ";charset=utf-8," + encodeURIComponent(str), false); + if (req.overrideMimeType) { + req.overrideMimeType(contentType); + } + req.send(null); + return req.responseXML; + } + } + } +} diff --git a/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-http.js b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-http.js new file mode 100644 index 0000000000..60bd841679 --- /dev/null +++ b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-http.js @@ -0,0 +1,105 @@ +/* + * 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. + */ + +function HTTPClient(uri) { + + this.msxmlNames = [ "MSXML2.XMLHTTP.5.0", + "MSXML2.XMLHTTP.4.0", + "MSXML2.XMLHTTP.3.0", + "MSXML2.XMLHTTP", + "Microsoft.XMLHTTP" ]; + + this.uri=uri; + + this.get = function(id, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + var strDocument = xhr.responseText; + if (responseFunction != null) responseFunction(strDocument); + } else { + alert("get - Error getting data from the server"); + } + } + } + xhr.open("GET", uri + '/' + id, true); + xhr.send(null); + } + + this.post = function (entry, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 201) { + var strDocument = xhr.responseText; + if (responseFunction != null) responseFunction(strDocument); + } else { + alert("post - Error getting data from the server"); + } + } + } + xhr.open("POST", uri, true); + xhr.setRequestHeader("Content-Type", "text/xml"); + xhr.send(entry); + } + + this.put = function (id, entry, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + var strDocument = xhr.responseText; + if (responseFunction != null) responseFunction(strDocument); + } else { + alert("put - Error getting data from the server"); + } + } + } + xhr.open("PUT", uri + '/' + id, true); + xhr.setRequestHeader("Content-Type", "text/xml"); + xhr.send(entry); + } + + this.del = function (id, responseFunction) { + var xhr = this.createXMLHttpRequest(); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == 200) { + if (responseFunction != null) responseFunction(); + } else { + alert("delete - Error getting data from the server"); + } + } + } + xhr.open("DELETE", uri + '/' + id, true); + xhr.send(null); + } + this.createXMLHttpRequest = function () { + /* Mozilla XMLHttpRequest */ + try {return new XMLHttpRequest();} catch(e) {} + + /* Microsoft MSXML ActiveX */ + for (var i=0;i < this.msxmlNames.length; i++) { + try {return new ActiveXObject(this.msxmlNames[i]);} catch (e) {} + } + alert("XML http request not supported"); + return null; + } +} diff --git a/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-jsonrpc.js b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-jsonrpc.js new file mode 100644 index 0000000000..ca3c2a8605 --- /dev/null +++ b/sca-java-2.x/contrib/modules/implementation-widget-runtime/src/main/resources/binding-jsonrpc.js @@ -0,0 +1,492 @@ +/* + * JSON-RPC JavaScript client + * + * $Id: jsonrpc.js,v 1.36.2.3 2006/03/08 15:09:37 mclark Exp $ + * + * Copyright (c) 2003-2004 Jan-Klaas Kollhof + * Copyright (c) 2005 Michael Clark, Metaparadigm Pte Ltd + * + * This code is based on Jan-Klaas' JavaScript o lait library (jsolait). + * + * Licensed 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. + * + */ + +/* + * Modifications for Apache Tuscany: + * - JSONRpcClient_createMethod changed so callback is last arg + */ + +/* escape a character */ + +escapeJSONChar = +function escapeJSONChar(c) +{ + if(c == "\"" || c == "\\") return "\\" + c; + else if (c == "\b") return "\\b"; + else if (c == "\f") return "\\f"; + else if (c == "\n") return "\\n"; + else if (c == "\r") return "\\r"; + else if (c == "\t") return "\\t"; + var hex = c.charCodeAt(0).toString(16); + if(hex.length == 1) return "\\u000" + hex; + else if(hex.length == 2) return "\\u00" + hex; + else if(hex.length == 3) return "\\u0" + hex; + else return "\\u" + hex; +}; + + +/* encode a string into JSON format */ + +escapeJSONString = +function escapeJSONString(s) +{ + /* The following should suffice but Safari's regex is b0rken + (doesn't support callback substitutions) + return "\"" + s.replace(/([^\u0020-\u007f]|[\\\"])/g, + escapeJSONChar) + "\""; + */ + + /* Rather inefficient way to do it */ + var parts = s.split(""); + for(var i=0; i < parts.length; i++) { + var c =parts[i]; + if(c == '"' || + c == '\\' || + c.charCodeAt(0) < 32 || + c.charCodeAt(0) >= 128) + parts[i] = escapeJSONChar(parts[i]); + } + return "\"" + parts.join("") + "\""; +}; + + +/* Marshall objects to JSON format */ + +toJSON = function toJSON(o) +{ + if(o == null) { + return "null"; + } else if(o.constructor == String) { + return escapeJSONString(o); + } else if(o.constructor == Number) { + return o.toString(); + } else if(o.constructor == Boolean) { + return o.toString(); + } else if(o.constructor == Date) { + return '{javaClass: "java.util.Date", time: ' + o.valueOf() +'}'; + } else if(o.constructor == Array) { + var v = []; + for(var i = 0; i < o.length; i++) v.push(toJSON(o[i])); + return "[" + v.join(", ") + "]"; + } else { + var v = []; + for(attr in o) { + if(o[attr] == null) v.push("\"" + attr + "\": null"); + else if(typeof o[attr] == "function"); /* skip */ + else v.push(escapeJSONString(attr) + ": " + toJSON(o[attr])); + } + return "{" + v.join(", ") + "}"; + } +}; + + +/* JSONRpcClient constructor */ + +JSONRpcClient = +function JSONRpcClient_ctor(serverURL, user, pass, objectID) +{ + this.serverURL = serverURL; + this.user = user; + this.pass = pass; + this.objectID = objectID; + + /* Add standard methods */ + if(this.objectID) { + this._addMethods(["listMethods"]); + var req = this._makeRequest("listMethods", []); + } else { + this._addMethods(["system.listMethods"]); + var req = this._makeRequest("system.listMethods", []); + } + var m = this._sendRequest(req); + this._addMethods(m); +}; + + +/* JSONRpcCLient.Exception */ + +JSONRpcClient.Exception = +function JSONRpcClient_Exception_ctor(code, message, javaStack) +{ + this.code = code; + var name; + if(javaStack) { + this.javaStack = javaStack; + var m = javaStack.match(/^([^:]*)/); + if(m) name = m[0]; + } + if(name) this.name = name; + else this.name = "JSONRpcClientException"; + this.message = message; +}; + +JSONRpcClient.Exception.CODE_REMOTE_EXCEPTION = 490; +JSONRpcClient.Exception.CODE_ERR_CLIENT = 550; +JSONRpcClient.Exception.CODE_ERR_PARSE = 590; +JSONRpcClient.Exception.CODE_ERR_NOMETHOD = 591; +JSONRpcClient.Exception.CODE_ERR_UNMARSHALL = 592; +JSONRpcClient.Exception.CODE_ERR_MARSHALL = 593; + +JSONRpcClient.Exception.prototype = new Error(); + +JSONRpcClient.Exception.prototype.toString = +function JSONRpcClient_Exception_toString(code, msg) +{ + return this.name + ": " + this.message; +}; + + +/* Default top level exception handler */ + +JSONRpcClient.default_ex_handler = +function JSONRpcClient_default_ex_handler(e) { alert(e); }; + + +/* Client settable variables */ + +JSONRpcClient.toplevel_ex_handler = JSONRpcClient.default_ex_handler; +JSONRpcClient.profile_async = false; +JSONRpcClient.max_req_active = 1; +JSONRpcClient.requestId = 1; + + +/* JSONRpcClient implementation */ + +JSONRpcClient.prototype._createMethod = +function JSONRpcClient_createMethod(methodName) +{ + var fn=function() + { + var args = []; + var callback = null; + for(var i=0;i<arguments.length;i++) args.push(arguments[i]); + +/* TUSCANY change callback to be last arg instead of first to match binding.ajax + if(typeof args[0] == "function") callback = args.shift(); +*/ + if(typeof args[arguments.length-1] == "function") callback = args.pop(); + + var req = fn.client._makeRequest.call(fn.client, fn.methodName, + args, callback); + if(callback == null) { + return fn.client._sendRequest.call(fn.client, req); + } else { + JSONRpcClient.async_requests.push(req); + JSONRpcClient.kick_async(); + return req.requestId; + } + }; + fn.client = this; + fn.methodName = methodName; + return fn; +}; + +JSONRpcClient.prototype._addMethods = +function JSONRpcClient_addMethods(methodNames) +{ + for(var i=0; i<methodNames.length; i++) { + var obj = this; + var names = methodNames[i].split("."); + for(var n=0; n<names.length-1; n++) { + var name = names[n]; + if(obj[name]) { + obj = obj[name]; + } else { + obj[name] = new Object(); + obj = obj[name]; + } + } + var name = names[names.length-1]; + if(!obj[name]) { + var method = this._createMethod(methodNames[i]); + obj[name] = method; + } + } +}; + +JSONRpcClient._getCharsetFromHeaders = +function JSONRpcClient_getCharsetFromHeaders(http) +{ + try { + var contentType = http.getResponseHeader("Content-type"); + var parts = contentType.split(/\s*;\s*/); + for(var i =0; i < parts.length; i++) { + if(parts[i].substring(0, 8) == "charset=") + return parts[i].substring(8, parts[i].length); + } + } catch (e) {} + return "UTF-8"; /* default */ +}; + +/* Async queue globals */ +JSONRpcClient.async_requests = []; +JSONRpcClient.async_inflight = {}; +JSONRpcClient.async_responses = []; +JSONRpcClient.async_timeout = null; +JSONRpcClient.num_req_active = 0; + +JSONRpcClient._async_handler = +function JSONRpcClient_async_handler() +{ + JSONRpcClient.async_timeout = null; + + while(JSONRpcClient.async_responses.length > 0) { + var res = JSONRpcClient.async_responses.shift(); + if(res.canceled) continue; + if(res.profile) res.profile.dispatch = new Date(); + try { + res.cb(res.result, res.ex, res.profile); + } catch(e) { + JSONRpcClient.toplevel_ex_handler(e); + } + } + + while(JSONRpcClient.async_requests.length > 0 && + JSONRpcClient.num_req_active < JSONRpcClient.max_req_active) { + var req = JSONRpcClient.async_requests.shift(); + if(req.canceled) continue; + req.client._sendRequest.call(req.client, req); + } +}; + +JSONRpcClient.kick_async = +function JSONRpcClient_kick_async() +{ + if(JSONRpcClient.async_timeout == null) + JSONRpcClient.async_timeout = + setTimeout(JSONRpcClient._async_handler, 0); +}; + +JSONRpcClient.cancelRequest = +function JSONRpcClient_cancelRequest(requestId) +{ + /* If it is in flight then mark it as canceled in the inflight map + and the XMLHttpRequest callback will discard the reply. */ + if(JSONRpcClient.async_inflight[requestId]) { + JSONRpcClient.async_inflight[requestId].canceled = true; + return true; + } + + /* If its not in flight yet then we can just mark it as canceled in + the the request queue and it will get discarded before being sent. */ + for(var i in JSONRpcClient.async_requests) { + if(JSONRpcClient.async_requests[i].requestId == requestId) { + JSONRpcClient.async_requests[i].canceled = true; + return true; + } + } + + /* It may have returned from the network and be waiting for its callback + to be dispatched, so mark it as canceled in the response queue + and the response will get discarded before calling the callback. */ + for(var i in JSONRpcClient.async_responses) { + if(JSONRpcClient.async_responses[i].requestId == requestId) { + JSONRpcClient.async_responses[i].canceled = true; + return true; + } + } + + return false; +}; + +JSONRpcClient.prototype._makeRequest = +function JSONRpcClient_makeRequest(methodName, args, cb) +{ + var req = {}; + req.client = this; + req.requestId = JSONRpcClient.requestId++; + + var obj = {}; + obj.id = req.requestId; + if (this.objectID) + obj.method = ".obj#" + this.objectID + "." + methodName; + else + obj.method = methodName; + obj.params = args; + + if (cb) req.cb = cb; + if (JSONRpcClient.profile_async) + req.profile = { "submit": new Date() }; + req.data = toJSON(obj); + + return req; +}; + +JSONRpcClient.prototype._sendRequest = +function JSONRpcClient_sendRequest(req) +{ + if(req.profile) req.profile.start = new Date(); + + /* Get free http object from the pool */ + var http = JSONRpcClient.poolGetHTTPRequest(); + JSONRpcClient.num_req_active++; + + /* Send the request */ + if (typeof(this.user) == "undefined") { + http.open("POST", this.serverURL, (req.cb != null)); + } else { + http.open("POST", this.serverURL, (req.cb != null), this.user, this.pass); + } + + /* setRequestHeader is missing in Opera 8 Beta */ + try { http.setRequestHeader("Content-type", "text/plain"); } catch(e) {} + + /* Construct call back if we have one */ + if(req.cb) { + var self = this; + http.onreadystatechange = function() { + if(http.readyState == 4) { + http.onreadystatechange = function () {}; + var res = { "cb": req.cb, "result": null, "ex": null}; + if (req.profile) { + res.profile = req.profile; + res.profile.end = new Date(); + } + try { res.result = self._handleResponse(http); } + catch(e) { res.ex = e; } + if(!JSONRpcClient.async_inflight[req.requestId].canceled) + JSONRpcClient.async_responses.push(res); + delete JSONRpcClient.async_inflight[req.requestId]; + JSONRpcClient.kick_async(); + } + }; + } else { + http.onreadystatechange = function() {}; + } + + JSONRpcClient.async_inflight[req.requestId] = req; + + try { + http.send(req.data); + } catch(e) { + JSONRpcClient.poolReturnHTTPRequest(http); + JSONRpcClient.num_req_active--; + throw new JSONRpcClient.Exception + (JSONRpcClient.Exception.CODE_ERR_CLIENT, "Connection failed"); + } + + if(!req.cb) return this._handleResponse(http); +}; + +JSONRpcClient.prototype._handleResponse = +function JSONRpcClient_handleResponse(http) +{ + /* Get the charset */ + if(!this.charset) { + this.charset = JSONRpcClient._getCharsetFromHeaders(http); + } + + /* Get request results */ + var status, statusText, data; + try { + status = http.status; + statusText = http.statusText; + data = http.responseText; + } catch(e) { + JSONRpcClient.poolReturnHTTPRequest(http); + JSONRpcClient.num_req_active--; + JSONRpcClient.kick_async(); + throw new JSONRpcClient.Exception + (JSONRpcClient.Exception.CODE_ERR_CLIENT, "Connection failed"); + } + + /* Return http object to the pool; */ + JSONRpcClient.poolReturnHTTPRequest(http); + JSONRpcClient.num_req_active--; + + /* Unmarshall the response */ + if(status != 200) { + throw new JSONRpcClient.Exception(status, statusText); + } + var obj; + try { + eval("obj = " + data); + } catch(e) { + throw new JSONRpcClient.Exception(550, "error parsing result"); + } + if(obj.error) + throw new JSONRpcClient.Exception(obj.error.code, obj.error.msg, + obj.error.trace); + var res = obj.result; + + /* Handle CallableProxy */ + if(res && res.objectID && res.JSONRPCType == "CallableReference") + return new JSONRpcClient(this.serverURL, this.user, + this.pass, res.objectID); + + return res; +}; + + +/* XMLHttpRequest wrapper code */ + +/* XMLHttpRequest pool globals */ +JSONRpcClient.http_spare = []; +JSONRpcClient.http_max_spare = 8; + +JSONRpcClient.poolGetHTTPRequest = +function JSONRpcClient_pool_getHTTPRequest() +{ + if(JSONRpcClient.http_spare.length > 0) { + return JSONRpcClient.http_spare.pop(); + } + return JSONRpcClient.getHTTPRequest(); +}; + +JSONRpcClient.poolReturnHTTPRequest = +function JSONRpcClient_poolReturnHTTPRequest(http) +{ + if(JSONRpcClient.http_spare.length >= JSONRpcClient.http_max_spare) + delete http; + else + JSONRpcClient.http_spare.push(http); +}; + +JSONRpcClient.msxmlNames = [ "MSXML2.XMLHTTP.5.0", + "MSXML2.XMLHTTP.4.0", + "MSXML2.XMLHTTP.3.0", + "MSXML2.XMLHTTP", + "Microsoft.XMLHTTP" ]; + +JSONRpcClient.getHTTPRequest = +function JSONRpcClient_getHTTPRequest() +{ + /* Mozilla XMLHttpRequest */ + try { + JSONRpcClient.httpObjectName = "XMLHttpRequest"; + return new XMLHttpRequest(); + } catch(e) {} + + /* Microsoft MSXML ActiveX */ + for (var i=0;i < JSONRpcClient.msxmlNames.length; i++) { + try { + JSONRpcClient.httpObjectName = JSONRpcClient.msxmlNames[i]; + return new ActiveXObject(JSONRpcClient.msxmlNames[i]); + } catch (e) {} + } + + /* None found */ + JSONRpcClient.httpObjectName = null; + throw new JSONRpcClient.Exception(0, "Can't create XMLHttpRequest object"); +}; |