diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-02-28 19:40:06 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2010-02-28 19:40:06 +0000 |
commit | e982b4ef38fd043c15e89bdd60763b10434a087e (patch) | |
tree | 6b9d9c3fc9aff22edb0f137040164c1cbf2359af /sca-cpp/branches/cpp-contrib | |
parent | 64e2486555a0a14f7d9690c2fc62c30bde803a91 (diff) |
Moving old inactive code to a branch as it's confusing code assist, searches and indexing in trunk.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@917273 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-cpp/branches/cpp-contrib')
1155 files changed, 115535 insertions, 0 deletions
diff --git a/sca-cpp/branches/cpp-contrib/AUTHORS b/sca-cpp/branches/cpp-contrib/AUTHORS new file mode 100644 index 0000000000..b06da1bf3a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/AUTHORS @@ -0,0 +1,5 @@ +Apache Tuscany SCA Runtime +========================== + +The Apache Software Foundation (http://www.apache.org/) + diff --git a/sca-cpp/branches/cpp-contrib/COPYING b/sca-cpp/branches/cpp-contrib/COPYING new file mode 100755 index 0000000000..6b0b1270ff --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/COPYING @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + diff --git a/sca-cpp/branches/cpp-contrib/ChangeLog b/sca-cpp/branches/cpp-contrib/ChangeLog new file mode 100644 index 0000000000..a4151dc22a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/ChangeLog @@ -0,0 +1,12 @@ +Apache Tuscany SCA Runtime +========================== + +For a log of all changes see the Tuscany commits mailing list: +commits@tuscany.apache.org + +Archives: +http://www.mail-archive.com/commits@tuscany.apache.org + +To subscribe send an email to: +commits-subscribe@tuscany.apache.org + diff --git a/sca-cpp/branches/cpp-contrib/INSTALL b/sca-cpp/branches/cpp-contrib/INSTALL new file mode 100644 index 0000000000..2fe522d7e4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/INSTALL @@ -0,0 +1,175 @@ +Apache Tuscany SCA Runtime +========================== + +Building +======== + +The Tuscany SCA Linux build uses the GNU Autotools tool chain. + +First install the following development tools: +autoconf-2.64 +automake-1.4 +g++-4.4.1 +libtool-2.2.6 +doxygen-1.6.1 + +Install the following binaries: +curl-7.19.5 (http://curl.haxx.se) +memcached-1.2.8 (http://memcached.org/) + + +Then install the following development dependencies: + +Apache HTTP server and APR: +httpd-2.2-13 (http://httpd.apache.org/) +libapr-1-0.3.8 (http://apr.apache.org/) +libaprutil-1-0.3.9 + +XML: +libxml2-2.7.5 (http://xmlsoft.org/) + +CURL: +libcurl4-7.19.5 (http://curl.haxx.se) + +JSON: +Mozilla SpiderMonkey libmozjs (http://www.mozilla.org/js/spidermonkey/) +included in xulrunner-1.9.1.7 + +Optional dependencies: + +Web Services: +Apache Axis2/C 1.6.0 (http://ws.apache.org/axis2/c/) + +Queueing: +Apache Qpid/C++ 0.6 (http://qpid.apache.org/) + +Python: +Python 2.6 (http://www.python.org/) + +Java: +a Java 5+ JDK (http://openjdk.java.net/, http://harmony.apache.org/) + +XMPP Chat: +Libstrophe (http://code.stanziq.com/cgit/strophe/libstrophe/) +build it from source at git://code.stanziq.com//libstrophe + + +To configure the Tuscany SCA build do this: +./bootstrap +./configure --prefix=<install dir> + +To enable debugging and strict warning compile options, add: +--enable-maintainer-mode + +To enable gprof profiling, add: +--enable-profiling + +To enable multi-threading (required by the Queue and Chat components and +for running with the HTTPD worker or event multi-threaded MPMs): +--enable-threads + +To enable support for Python component implementations: +--enable-python + +To enable support for Java component implementations: +--enable-java + +To build the Web service utility component (requires Apache Axis2/C): +--enable-webservice + +To build the Queue utility component (requires Apache Qpid/C++): +--enable-queue + +To build the Chat utility component (requires Libstrophe): +--enable-chat + +To generate doxygen documentation, add: +--enable-doxygen + +To configure where to find dependencies, see the --with-* options described +in the configure help: +./configure --help + + +Here's an example configuration, tested on Ubuntu 9.10, with the system +dependencies installed in the standard system directories and some of the +dependencies installed under $HOME: + +./configure --prefix=$HOME/tuscany-sca-cpp-bin \ +--with-apr=$HOME/httpd-2.2.13-bin --with-httpd=$HOME/httpd-2.2.13-bin \ +--with-libcurl=/usr --with-libxml2=/usr \ +--with-js-include=/usr/include/xulrunner-1.9.1.7/unstable \ +--with-js-lib=/usr/lib/xulrunner-1.9.1.7 \ +--enable-threads \ +--enable-python --with-python=/usr \ +--enable-java --with-java=/usr/lib/jvm/default-java \ +--enable-webservice --with-axis2c=$HOME/axis2c-1.6.0-bin \ +--enable-queue --with-qpidc=$HOME/qpidc-0.6-bin \ +--enable-chat --with-libstrophe=$HOME/libstrophe \ +--enable-maintainer-mode + + +To build the Tuscany SCA runtime, do this: +make + +To run the tests, do this: +make check + +To build ctags for the source, do this: +make ctags + +To build a source distribution, do this: +make dist + +To build a binary distribution, do this: +make bindist + + +Installing +========== + +To install the Tuscany SCA binaries, do this: +make install + + +Building dependencies from source +================================= + +Here are example build and install steps for some of the dependencies. + +Apache HTTPD, including APR, using the HTTP prefork MPM (recommended): +./configure --enable-ssl --enable-proxy --enable-rewrite --with-included-apr \ +--with-mpm=prefork --prefix=$HOME/httpd-2.2.13-bin +make +make install +export PATH=$HOME/httpd-2-2.13-bin/bin:$PATH + +Apache Axis2/C: +./configure --enable-libxml2 --enable-openssl --enable-libcurl \ +--with-apache2=$HOME/httpd-2.2.13-bin/include --prefix=$HOME/axis2c-1.6.0-bin +make +make install +export AXIS2C_HOME=$HOME/axis2c-1.6.0-bin + +Apache Qpid/C++: +git clone git://git.apache.org/qpid.git +cd qpid +git checkout -b 0.6-release origin/0.6-release +cd qpid/cpp +./bootstrap +./configure --prefix=$HOME/qpidc-0.6-bin +make +make install + +Libstrophe: +git clone git://code.stanziq.com/libstrophe +cd libstrophe +git submodule init +git submodule update +aclocal +automake --add-missing --foreign --copy +autoconf +./configure --prefix=$HOME/libstrophe-bin +make +make install + diff --git a/sca-cpp/branches/cpp-contrib/LICENSE b/sca-cpp/branches/cpp-contrib/LICENSE new file mode 100755 index 0000000000..e0962b23e3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/LICENSE @@ -0,0 +1,323 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +================================================================================ + +Apache Tuscany SCA C++ Subcomponents: + +The Tuscany SCA C++ release includes a number of subcomponents with separate +copyright notices and license terms. Your use of the source code for these +subcomponents is subject to the terms and conditions of the following licenses. + +================================================================================ + +The xsd component includes XML files under the following license: + +Copyright OASIS 2005, 2009. All Rights Reserved. +All capitalized terms in the following text have the meanings assigned to them in the OASIS Intellectual +Property Rights Policy (the "OASIS IPR Policy"). The full Policy may be found at the OASIS website. +This document and translations of it may be copied and furnished to others, and derivative works that +comment on or otherwise explain it or assist in its implementation may be prepared, copied, published, +and distributed, in whole or in part, without restriction of any kind, provided that the above copyright +notice and this section are included on all such copies and derivative works. However, this document +itself may not be modified in any way, including by removing the copyright notice or references to OASIS, +except as needed for the purpose of developing any document or deliverable produced by an OASIS +Technical Committee (in which case the rules applicable to copyrights, as set forth in the OASIS IPR +Policy, must be followed) or as required to translate it into languages other than English. +The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors +or assigns. +This document and the information contained herein is provided on an "AS IS" basis and OASIS +DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY +WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP +RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. +OASIS requests that any OASIS Party or any other party that believes it has patent claims that would +necessarily be infringed by implementations of this OASIS Committee Specification or OASIS Standard, +to notify OASIS TC Administrator and provide an indication of its willingness to grant patent licenses to +such patent claims in a manner consistent with the IPR Mode of the OASIS Technical Committee that +produced this specification. +OASIS invites any party to contact the OASIS TC Administrator if it is aware of a claim of ownership of +any patent claims that would necessarily be infringed by implementations of this specification by a patent +holder that is not willing to provide a license to such patent claims in a manner consistent with the IPR +Mode of the OASIS Technical Committee that produced this specification. OASIS may include such +claims on its website, but disclaims any obligation to do so. +OASIS takes no position regarding the validity or scope of any intellectual property or other rights that +might be claimed to pertain to the implementation or use of the technology described in this document or +the extent to which any license under such rights might or might not be available; neither does it represent +that it has made any effort to identify any such rights. Information on OASIS' procedures with respect to +rights in any document or deliverable produced by an OASIS Technical Committee can be found on the +OASIS website. Copies of claims of rights made available for publication and any assurances of licenses +to be made available, or the result of an attempt made to obtain a general license or permission for the use +of such proprietary rights by implementers or users of this OASIS Committee Specification or OASIS +Standard, can be obtained from the OASIS TC Administrator. OASIS makes no representation that any +information or list of intellectual property rights will at any time be complete, or that any claims in such list +are, in fact, Essential Claims. +The names "OASIS", are trademarks of OASIS, the owner and developer of this specification, and should +be used only to refer to the organization and its official outputs. OASIS welcomes reference to, and +implementation and use of, specifications, while reserving the right to enforce its marks against misleading +uses. Please see http://www.oasis-open.org/who/trademark.php for above guidance. + +================================================================================ + +The xsd component includes XML files under the following license: + +http://www.w3.org/Consortium/Legal/copyright-software-19980720 + +W3C® SOFTWARE NOTICE AND LICENSE +Copyright (c) 1994-2002 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche +en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related items) is being provided by the copyright holders under +the following license. By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, +and will comply with the following terms and conditions: + +Permission to use, copy, modify, and distribute this software and its documentation, with or without modification, +for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies +of the software and documentation or portions thereof, including modifications, that you make: + + 1. The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. + 2. Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, a short +notice of the following form (hypertext is preferred, text is permitted) should be used within the body of any redistributed +or derivative code: "Copyright (c) [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of Technology, +Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/" + 3. Notice of any changes or modifications to the W3C files, including the date changes were made. (We recommend you provide URIs +to the location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE +OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE +OF THE SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software +without specific, written prior permission. Title to copyright in this software and any associated documentation will +at all times remain with copyright holders. + +================================================================================ + +The components/chat component includes the Libstrophe library under the +following MIT license: + +Copyright (c) 2005-2009 Collecta, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +================================================================================ + diff --git a/sca-cpp/branches/cpp-contrib/Makefile.am b/sca-cpp/branches/cpp-contrib/Makefile.am new file mode 100644 index 0000000000..df348fbc3c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/Makefile.am @@ -0,0 +1,52 @@ +# 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. + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = kernel modules components test doc + +datadir=$(prefix) +data_DATA = INSTALL README LICENSE COPYING NOTICE +nobase_data_DATA = xsd/*.* + +DIST_SUBDIRS = kernel modules components test doc samples +EXTRA_DIST = LICENSE COPYING INSTALL README NOTICE autogen.sh xsd + +install-data-hook: + rm -rf $(prefix)/doc + cp -r doc $(prefix) + rm -f $(prefix)/doc/Makefile* $(prefix)/doc/Doxyfile* + rm -rf `find $(prefix)/doc -type d -name .svn` + rm -rf `find $(prefix)/doc -type d -name .deps` + + rm -rf $(prefix)/samples + cp -r samples $(prefix) + rm -rf `find $(prefix)/samples -type d -name .svn` + rm -rf `find $(prefix)/samples -type d -name .deps` + +dist-hook: + rm -rf `find $(distdir)/ -type d -name .svn` + rm -rf `find $(distdir)/ -type d -name .deps` + +bindist: install + rm -rf ${PACKAGE}-${PACKAGE_VERSION}-bin + mkdir ${PACKAGE}-${PACKAGE_VERSION}-bin + cp -r $(prefix)/* ${PACKAGE}-${PACKAGE_VERSION}-bin + rm -rf ${PACKAGE}-${PACKAGE_VERSION}-bin/test + tar -cf - ${PACKAGE}-${PACKAGE_VERSION}-bin | gzip -c > ${PACKAGE}-${PACKAGE_VERSION}-bin.tar.gz + rm -rf ${PACKAGE}-${PACKAGE_VERSION}-bin + diff --git a/sca-cpp/branches/cpp-contrib/NEWS b/sca-cpp/branches/cpp-contrib/NEWS new file mode 100644 index 0000000000..dea502fcae --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/NEWS @@ -0,0 +1,13 @@ +Apache Tuscany SCA Runtime +========================== + +For any news see the Tuscany development mailing list: +dev@tuscany.apache.org + +Archives: +http://www.mail-archive.com/dev@tuscany.apache.org +http://marc.info/?l=tuscany-dev + +To subscribe send an email to: +dev-subscribe@tuscany.apache.org + diff --git a/sca-cpp/branches/cpp-contrib/NOTICE b/sca-cpp/branches/cpp-contrib/NOTICE new file mode 100644 index 0000000000..d91c24207e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/NOTICE @@ -0,0 +1,42 @@ +Apache Tuscany SCA C++ +Copyright 2005, 2010 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/) + +This product includes software under the OASIS Specification License +with the following copyright: + +Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. +OASIS trademark, IPR and other policies apply. + +This product includes software under the W3C(c) Software License +with the following copyright: + +Copyright (c) 2008 World Wide Web Consortium, (Massachusetts Institute of Technology, +European Research Consortium for Informatics and Mathematics, Keio University). +All Rights Reserved. This work is distributed under the W3C(c) Software License [1] in +the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied +warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + +This product includes software under the W3C(c) Software License +with the following copyright: + +Copyright 2001 The Internet Society and W3C (Massachusetts Institute +of Technology, Institut National de Recherche en Informatique et en +Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +This document is governed by the W3C Software License [1] as described +in the FAQ [2]. + +[1] http://www.w3.org/Consortium/Legal/copyright-software-19980720 +[2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD + +This product includes software under the MIT license +with the following copyright: + +Copyright (c) 2005-2009 Collecta, Inc. + diff --git a/sca-cpp/branches/cpp-contrib/README b/sca-cpp/branches/cpp-contrib/README new file mode 100644 index 0000000000..5a5b884efe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/README @@ -0,0 +1,79 @@ +Apache Tuscany SCA Runtime +========================== + +Getting the source code +======================= + +To checkout the source code with commit access, do this: +git svn init -s https://svn.apache.org/repos/asf/tuscany/sca-cpp tuscany-sca-cpp +cd tuscany-sca-cpp +wget -P .git http://git.apache.org/authors.txt +git config svn.authorsfile .git/authors.txt +git config user.email <you>@apache.org +git config svn.rmdir true +git svn fetch --log-window-size 10000 + +To checkout the source without commit access, do this: +git clone git://git.apache.org/tuscany-sca-cpp +or +svn checkout http://svn.apache.org/repos/asf/tuscany/sca-cpp tuscany-sca-cpp + + +Layout +====== + +Here's a rough guide to the Tuscany SCA source tree: + + / + |-- trunk Master development branch + | | + | |-- kernel SCA runtime kernel + | | + | |-- modules Modules that plug into the runtime + | | |-- atom AtomPub encoding support + | | |-- json JSON-RPC encoding support + | | |-- http HTTP protocol support + | | |-- java Support for Java components + | | |-- python Support for Python components + | | |-- scheme Support for Scheme components + | | |-- server Apache HTTPD server integration + | | + | |-- components Useful SCA components + | | |-- cache Key/value cache + | | |-- chat XMPP chat + | | |-- log Logger + | | |-- queue AMQP message queue + | | |-- store Persistent store + | | |-- webservice Web service gateway + | | + | |-- test Integration tests + | | + | |-- samples Sample Applications + | | + | |-- contrib Various contributions to the project + | + |-- branches Topic and release branches + | + |-- tags Release tags + + +Building +======== + +See the INSTALL file. + + +Contributing to the project +=========================== + +To contribute to the project or report issues see the Tuscany development +mailing list: +dev@tuscany.apache.org + +Archives: +http://www.mail-archive.com/dev@tuscany.apache.org +http://marc.info/?l=tuscany-dev + +To subscribe send an email to: +dev-subscribe@tuscany.apache.org + diff --git a/sca-cpp/branches/cpp-contrib/bootstrap b/sca-cpp/branches/cpp-contrib/bootstrap new file mode 100755 index 0000000000..af38864985 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/bootstrap @@ -0,0 +1,31 @@ +#!/bin/bash + +# 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. + +for i in "libtoolize --force" aclocal autoconf autoheader +do + echo -n "Running $i..." + $i || exit 1 + echo 'done.' +done + +echo -n 'Running automake...' +automake --add-missing +echo 'done.' +exit 0 + diff --git a/sca-cpp/branches/cpp-contrib/components/Makefile.am b/sca-cpp/branches/cpp-contrib/components/Makefile.am new file mode 100644 index 0000000000..e4a0f051f0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +SUBDIRS = cache chat log queue store webservice + +includedir = $(prefix)/include/components +nobase_include_HEADERS = */*.hpp + +compdir = $(prefix)/components +nobase_comp_DATA = */*.composite diff --git a/sca-cpp/branches/cpp-contrib/components/cache/Makefile.am b/sca-cpp/branches/cpp-contrib/components/cache/Makefile.am new file mode 100644 index 0000000000..69946a13fb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/Makefile.am @@ -0,0 +1,31 @@ +# 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. + +noinst_PROGRAMS = mcache-test client-test + +compdir=$(prefix)/components/cache +comp_LTLIBRARIES = libmcache.la + +libmcache_la_SOURCES = mcache.cpp + +mcache_test_SOURCES = mcache-test.cpp +mcache_test_LDFLAGS = -lxml2 + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs + +TESTS = memcached-test server-test diff --git a/sca-cpp/branches/cpp-contrib/components/cache/client-test.cpp b/sca-cpp/branches/cpp-contrib/components/cache/client-test.cpp new file mode 100644 index 0000000000..ddf093a6dc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/client-test.cpp @@ -0,0 +1,130 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test cache component. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" + +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "perf.hpp" +#include "../../modules/http/curl.hpp" + +namespace tuscany { +namespace cache { + +const string uri("http://localhost:8090/mcache"); + +bool testCache() { + http::CURLSession cs; + + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); + const list<value> a = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + const failable<value> id = http::post(a, uri, cs); + assert(hasContent(id)); + + const string p = path(content(id)); + { + const failable<value> val = http::get(uri + p, cs); + assert(hasContent(val)); + assert(content(val) == a); + } + + const list<value> j = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$3.55")); + const list<value> b = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), j); + + { + const failable<value> r = http::put(b, uri + p, cs); + assert(hasContent(r)); + assert(content(r) == value(true)); + } + { + const failable<value> val = http::get(uri + p, cs); + assert(hasContent(val)); + assert(content(val) == b); + } + { + const failable<value> r = http::del(uri + p, cs); + assert(hasContent(r)); + assert(content(r) == value(true)); + } + { + const failable<value> val = http::get(uri + p, cs); + assert(!hasContent(val)); + } + + return true; +} + +struct getLoop { + const string path; + const value entry; + http::CURLSession cs; + getLoop(const string& path, const value& entry, http::CURLSession cs) : path(path), entry(entry), cs(cs) { + } + const bool operator()() const { + const failable<value> val = http::get(uri + path, cs); + assert(hasContent(val)); + assert(content(val) == entry); + return true; + } +}; + +bool testGetPerf() { + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$4.55")); + const value a = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + http::CURLSession cs; + const failable<value> id = http::post(a, uri, cs); + assert(hasContent(id)); + const string p = path(content(id)); + + const lambda<bool()> gl = getLoop(p, a, cs); + cout << "Cache get test " << time(gl, 5, 200) << " ms" << endl; + + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::cache::testCache(); + tuscany::cache::testGetPerf(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/cache/mcache-test.cpp b/sca-cpp/branches/cpp-contrib/components/cache/mcache-test.cpp new file mode 100644 index 0000000000..316372c5be --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/mcache-test.cpp @@ -0,0 +1,82 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test Memcached access functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "perf.hpp" +#include "mcache.hpp" + +namespace tuscany { +namespace cache { + +bool testMemCached() { + MemCached ch("127.0.0.1", 11211); + const value k = mklist<value>("a"); + + assert(hasContent(post(k, string("AAA"), ch))); + assert((get(k, ch)) == value(string("AAA"))); + assert(hasContent(put(k, string("aaa"), ch))); + assert((get(k, ch)) == value(string("aaa"))); + assert(hasContent(del(k, ch))); + assert(!hasContent(get(k, ch))); + + return true; +} + +struct getLoop { + const value k; + MemCached& ch; + getLoop(const value& k, MemCached& ch) : k(k), ch(ch) { + } + const bool operator()() const { + assert((get(k, ch)) == value(string("CCC"))); + return true; + } +}; + +bool testGetPerf() { + const value k = mklist<value>("c"); + MemCached ch("127.0.0.1", 11211); + assert(hasContent(post(k, string("CCC"), ch))); + + const lambda<bool()> gl = getLoop(k, ch); + cout << "Memcached get test " << time(gl, 5, 200) << " ms" << endl; + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::cache::testMemCached(); + tuscany::cache::testGetPerf(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/cache/mcache.composite b/sca-cpp/branches/cpp-contrib/components/cache/mcache.composite new file mode 100644 index 0000000000..15411dd702 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/mcache.composite @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="mcache"> + + <component name="mcache"> + <implementation.cpp path=".libs" library="libmcache"/> + <service name="mcache"> + <t:binding.http uri="mcache"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/components/cache/mcache.cpp b/sca-cpp/branches/cpp-contrib/components/cache/mcache.cpp new file mode 100644 index 0000000000..782de605c6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/mcache.cpp @@ -0,0 +1,133 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Memcached-based cache component implementation. + */ + +#include <apr_uuid.h> + +#include "string.hpp" + +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "mcache.hpp" + +namespace tuscany { +namespace mcache { + +/** + * Get an item from the cache. + */ +const failable<value> get(const list<value>& params, cache::MemCached& ch) { + return cache::get(car(params), ch); +} + +/** + * Post an item to the cache. + */ +const value uuidValue() { + apr_uuid_t uuid; + apr_uuid_get(&uuid); + char buf[APR_UUID_FORMATTED_LENGTH]; + apr_uuid_format(buf, &uuid); + return value(string(buf, APR_UUID_FORMATTED_LENGTH)); +} + +const failable<value> post(const list<value>& params, cache::MemCached& ch) { + const value id = append<value>(car(params), mklist(uuidValue())); + const failable<bool> val = cache::post(id, cadr(params), ch); + if (!hasContent(val)) + return mkfailure<value>(reason(val)); + return id; +} + +/** + * Put an item into the cache. + */ +const failable<value> put(const list<value>& params, cache::MemCached& ch) { + const failable<bool> val = cache::put(car(params), cadr(params), ch); + if (!hasContent(val)) + return mkfailure<value>(reason(val)); + return value(content(val)); +} + +/** + * Delete an item from the cache. + */ +const failable<value> del(const list<value>& params, cache::MemCached& ch) { + const failable<bool> val = cache::del(car(params), ch); + if (!hasContent(val)) + return mkfailure<value>(reason(val)); + return value(content(val)); +} + +/** + * Component implementation lambda function. + */ +class applyCache { +public: + applyCache(cache::MemCached& ch) : ch(ch) { + } + + const value operator()(const list<value>& params) const { + const value func(car(params)); + if (func == "get") + return get(cdr(params), ch); + if (func == "post") + return post(cdr(params), ch); + if (func == "put") + return put(cdr(params), ch); + if (func == "delete") + return del(cdr(params), ch); + return tuscany::mkfailure<tuscany::value>(); + } + +private: + cache::MemCached& ch; +}; + +/** + * Start the component. + */ +const failable<value> start(unused const list<value>& params) { + // Connect to memcached + cache::MemCached& ch = *(new (gc_new<cache::MemCached>()) cache::MemCached("127.0.0.1", 11211)); + + // Return the component implementation lambda function + return value(lambda<value(const list<value>&)>(applyCache(ch))); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "start") + return tuscany::mcache::start(cdr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/cache/mcache.hpp b/sca-cpp/branches/cpp-contrib/components/cache/mcache.hpp new file mode 100644 index 0000000000..4751975099 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/mcache.hpp @@ -0,0 +1,175 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_mcache_hpp +#define tuscany_mcache_hpp + +/** + * Memcached access functions. + */ + +#include "apr.h" +#include "apu.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_hash.h" +#include "apr_memcache.h" +#include "apr_network_io.h" + +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../../modules/scheme/eval.hpp" + +namespace tuscany { +namespace cache { + +/** + * Represents a memcached context. + */ +class MemCached { +public: + MemCached() : owner(false) { + } + + MemCached(const string host, const int port) : owner(true) { + apr_pool_create(&pool, NULL); + apr_memcache_create(pool, 1, 0, &mc); + init(host, port); + } + + MemCached(const MemCached& c) : owner(false) { + pool = c.pool; + mc = c.mc; + } + + ~MemCached() { + if (!owner) + return; + apr_pool_destroy(pool); + } + +private: + bool owner; + apr_pool_t* pool; + apr_memcache_t* mc; + + friend const failable<bool> post(const value& key, const value& val, const MemCached& cache); + friend const failable<bool> put(const value& key, const value& val, const MemCached& cache); + friend const failable<value> get(const value& key, const MemCached& cache); + friend const failable<bool> del(const value& key, const MemCached& cache); + + /** + * Initialize the memcached context. + */ + const failable<bool> init(const string& host, const int port) { + apr_memcache_server_t *server; + const apr_status_t sc = apr_memcache_server_create(pool, c_str(host), (apr_port_t)port, 0, 1, 1, 60, &server); + if (sc != APR_SUCCESS) + return mkfailure<bool>("Could not create server"); + const apr_status_t as = apr_memcache_add_server(mc, server); + if (as != APR_SUCCESS) + return mkfailure<bool>("Could not add server"); + return true; + } +}; + +/** + * Post a new item to the cache. + */ +const failable<bool> post(const value& key, const value& val, const MemCached& cache) { + debug(key, "cache::post::key"); + debug(val, "cache::post::value"); + + const string ks(scheme::writeValue(key)); + const string vs(scheme::writeValue(val)); + const apr_status_t rc = apr_memcache_add(cache.mc, c_str(ks), const_cast<char*>(c_str(vs)), length(vs), 0, 27); + if (rc != APR_SUCCESS) + return mkfailure<bool>("Could not add entry"); + + debug(true, "cache::post::result"); + return true; +} + +/** + * Update an item in the cache. If the item doesn't exist it is added. + */ +const failable<bool> put(const value& key, const value& val, const MemCached& cache) { + debug(key, "cache::put::key"); + debug(val, "cache::put::value"); + + const string ks(scheme::writeValue(key)); + const string vs(scheme::writeValue(val)); + const apr_status_t rc = apr_memcache_set(cache.mc, c_str(ks), const_cast<char*>(c_str(vs)), length(vs), 0, 27); + if (rc != APR_SUCCESS) + return mkfailure<bool>("Could not add entry"); + + debug(true, "cache::put::result"); + return true; +} + +/** + * Get an item from the cache. + */ +const failable<value> get(const value& key, const MemCached& cache) { + debug(key, "cache::get::key"); + + const string ks(scheme::writeValue(key)); + apr_pool_t* vpool; + const apr_status_t pc = apr_pool_create(&vpool, cache.pool); + if (pc != APR_SUCCESS) + return mkfailure<value>("Could not allocate memory"); + + char *data; + apr_size_t size; + const apr_status_t rc = apr_memcache_getp(cache.mc, cache.pool, c_str(ks), &data, &size, NULL); + if (rc != APR_SUCCESS) { + apr_pool_destroy(vpool); + return mkfailure<value>("Could not get entry"); + } + + const value val(scheme::readValue(string(data, size))); + apr_pool_destroy(vpool); + + debug(val, "cache::get::result"); + return val; +} + +/** + * Delete an item from the cache + */ +const failable<bool> del(const value& key, const MemCached& cache) { + debug(key, "cache::delete::key"); + + const string ks(scheme::writeValue(key)); + const apr_status_t rc = apr_memcache_delete(cache.mc, c_str(ks), 0); + if (rc != APR_SUCCESS) + return mkfailure<bool>("Could not delete entry"); + + debug(true, "cache::delete::result"); + return true; +} + +} +} + +#endif /* tuscany_mcache_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/components/cache/memcached-start b/sca-cpp/branches/cpp-contrib/components/cache/memcached-start new file mode 100755 index 0000000000..cd27faf046 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/memcached-start @@ -0,0 +1,21 @@ +#!/bin/sh + +# 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. + +# Start memcached +memcached -l 127.0.0.1 -m 4 -p 11211 & diff --git a/sca-cpp/branches/cpp-contrib/components/cache/memcached-stop b/sca-cpp/branches/cpp-contrib/components/cache/memcached-stop new file mode 100755 index 0000000000..b999228b46 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/memcached-stop @@ -0,0 +1,23 @@ +#!/bin/sh + +# 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. + +# Stop memcached +mc="memcached -l 127.0.0.1 -m 4 -p 11211" + +kill `ps -f | grep -v grep | grep "${mc}" | awk '{ print $2 }'` diff --git a/sca-cpp/branches/cpp-contrib/components/cache/memcached-test b/sca-cpp/branches/cpp-contrib/components/cache/memcached-test new file mode 100755 index 0000000000..d4b9c04eda --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/memcached-test @@ -0,0 +1,30 @@ +#!/bin/sh + +# 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. + +# Setup +./memcached-start +sleep 1 + +# Test +./mcache-test 2>/dev/null +rc=$? + +# Cleanup +./memcached-stop +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/cache/server-test b/sca-cpp/branches/cpp-contrib/components/cache/server-test new file mode 100755 index 0000000000..4942f547bc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/cache/server-test @@ -0,0 +1,41 @@ +#!/bin/sh + +# 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. + +# Setup +../../modules/http/httpd-conf tmp 8090 ../../modules/http/htdocs +../../modules/server/server-conf tmp +../../modules/server/scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite mcache.composite +EOF + +./memcached-start +../../modules/http/httpd-start tmp +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +../../modules/http/httpd-stop tmp +./memcached-stop +sleep 2 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/chat/Makefile.am b/sca-cpp/branches/cpp-contrib/components/chat/Makefile.am new file mode 100644 index 0000000000..11e3179e8a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/Makefile.am @@ -0,0 +1,36 @@ +# 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. + +if WANT_CHAT + +noinst_PROGRAMS = xmpp-test client-test + +INCLUDES = -I${LIBSTROPHE_INCLUDE} -I${LIBSTROPHE_INCLUDE}/src + +compdir=$(prefix)/components/chat +comp_LTLIBRARIES = libchatter.la + +libchatter_la_SOURCES = chatter.cpp +libchatter_la_LDFLAGS = -L${LIBSTROPHE_LIB} -R${LIBSTROPHE_LIB} -lstrophe -lexpat -lssl -lresolv + +xmpp_test_SOURCES = xmpp-test.cpp +xmpp_test_LDFLAGS = -L${LIBSTROPHE_LIB} -R${LIBSTROPHE_LIB} -lstrophe -lexpat -lssl -lresolv + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs -L${LIBSTROPHE_LIB} -R${LIBSTROPHE_LIB} -lstrophe -lexpat -lssl -lresolv + +endif diff --git a/sca-cpp/branches/cpp-contrib/components/chat/chat.composite b/sca-cpp/branches/cpp-contrib/components/chat/chat.composite new file mode 100644 index 0000000000..569dbfc4b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/chat.composite @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="chat"> + + <component name="print-sender"> + <implementation.cpp path=".libs" library="libchatter"/> + <property name="jid">sca1@localhost</property> + <property name="password">sca1</property> + <service name="print-sender"> + <t:binding.http uri="print-sender"/> + </service> + </component> + + <component name="print-chatter"> + <implementation.cpp path=".libs" library="libchatter"/> + <property name="jid">sca2@localhost</property> + <property name="password">sca2</property> + <service name="print-chatter"> + <t:binding.http uri="print-chatter"/> + </service> + <reference name="relay" target="print"/> + </component> + + <component name="print"> + <t:implementation.scheme script="server-test.scm"/> + <service name="print"> + <t:binding.http uri="print"/> + </service> + <reference name="report" target="print-chatter"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/components/chat/chatter.cpp b/sca-cpp/branches/cpp-contrib/components/chat/chatter.cpp new file mode 100644 index 0000000000..95f2d40077 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/chatter.cpp @@ -0,0 +1,162 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * XMPP chatter component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "parallel.hpp" +#include "xmpp.hpp" + +namespace tuscany { +namespace chat { + +/** + * Post an item to an XMPP JID. + */ +const failable<value> post(const list<value>& params, XMPPClient& xc) { + const value to = car<value>(car(params)); + const value val = cadr(params); + debug(to, "chat::post::jid"); + debug(val, "chat::post::value"); + const failable<bool> r = post(to, val, xc); + if (!hasContent(r)) + return mkfailure<value>(reason(r)); + return value(mklist<value>(to)); +} + +/** + * A relay function that posts the XMPP messages it receives to a relay component reference. + */ +class relay { +public: + relay(const lambda<value(const list<value>&)>& rel) : rel(rel) { + } + + const failable<bool> operator()(const value& jid, const value& val, unused XMPPClient& xc) const { + if (isNil(rel)) + return true; + debug(jid, "chat::relay::jid"); + debug(val, "chat::relay::value"); + const value res = rel(mklist<value>("post", mklist<value>(jid), val)); + return true; + } + +private: + const lambda<value(const list<value>&)> rel; +}; + +/** + * Subscribe and listen to an XMPP session. + */ +class subscribe { +public: + subscribe(const lambda<failable<bool>(const value&, const value&, XMPPClient&)>& l, XMPPClient& xc) : l(l), xc(xc) { + } + + const failable<bool> operator()() const { + gc_pool pool; + debug("chat::subscribe::listen"); + const failable<bool> r = listen(l, const_cast<XMPPClient&>(xc)); + debug("chat::subscribe::stopped"); + return r; + } + +private: + const lambda<failable<bool>(const value&, const value&, XMPPClient&)> l; + XMPPClient xc; +}; + +/** + * Chatter component lambda function + */ +class chatter { +public: + chatter(XMPPClient& xc, worker& w) : xc(xc), w(w) { + } + + const value operator()(const list<value>& params) const { + const tuscany::value func(car(params)); + if (func == "post") + return post(cdr(params), const_cast<XMPPClient&>(xc)); + + // Stop the chatter component + if (func != "stop") + return tuscany::mkfailure<tuscany::value>(); + debug("chat::chatter::stop"); + + // Disconnect and shutdown the worker thread + disconnect(const_cast<XMPPClient&>(xc)); + cancel(const_cast<worker&>(w)); + debug("chat::chatter::stopped"); + + return failable<value>(value(lambda<value(const list<value>&)>())); + } + +private: + const XMPPClient xc; + worker w; +}; + +/** + * Start the component. + */ +const failable<value> start(const list<value>& params) { + // Extract the relay reference and the XMPP JID and password + const bool hasRelay = !isNil(cddr(params)); + const value rel = hasRelay? car(params) : value(lambda<value(const list<value>&)>()); + const list<value> props = hasRelay? cdr(params) : params; + const value jid = ((lambda<value(list<value>)>)car(props))(list<value>()); + const value pass = ((lambda<value(list<value>)>)cadr(props))(list<value>()); + + // Create an XMPP client session + XMPPClient xc(jid, pass, false); + const failable<bool> r = connect(xc); + if (!hasContent(r)) + return mkfailure<value>(reason(r)); + + // Listen and relay messages in a worker thread + worker w(3); + const lambda<failable<bool>(const value&, const value&, XMPPClient&)> rl = relay(rel); + submit<failable<bool> >(w, lambda<failable<bool>()>(subscribe(rl, xc))); + + // Return the chatter component lambda function + return value(lambda<value(const list<value>&)>(chatter(xc, w))); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "start") + return tuscany::chat::start(cdr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/chat/client-test.cpp b/sca-cpp/branches/cpp-contrib/components/chat/client-test.cpp new file mode 100644 index 0000000000..f9ca2cabd6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/client-test.cpp @@ -0,0 +1,111 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test chat component. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "perf.hpp" +#include "parallel.hpp" +#include "../../modules/http/curl.hpp" +#include "xmpp.hpp" + +namespace tuscany { +namespace chat { + +const value jid1("sca1@localhost"); +const value pass1("sca1"); +const value jid2("sca2@localhost"); +const value pass2("sca2"); +const value jid3("sca3@localhost"); +const value pass3("sca3"); + +const list<value> item = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); +const list<value> entry = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), item); + +worker w(2); +bool received; + +const failable<bool> listener(const value& from, const value& val, unused XMPPClient& xc) { + assert(contains(from, "sca2@localhost")); + assert(val == entry); + received = true; + return false; +} + +struct subscribe { + XMPPClient& xc; + subscribe(XMPPClient& xc) : xc(xc) { + } + const failable<bool> operator()() const { + const lambda<failable<bool>(const value&, const value&, XMPPClient&)> l(listener); + listen(l, xc); + return true; + } +}; + +bool testListen() { + received = false; + XMPPClient& xc = *(new (gc_new<XMPPClient>()) XMPPClient(jid3, pass3)); + const failable<bool> c = connect(xc); + assert(hasContent(c)); + const lambda<failable<bool>()> subs = subscribe(xc); + submit(w, subs); + return true; +} + +bool testPost() { + gc_scoped_pool pool; + http::CURLSession ch; + const failable<value> id = http::post(entry, "http://localhost:8090/print-sender/sca2@localhost", ch); + assert(hasContent(id)); + return true; +} + +bool testReceived() { + shutdown(w); + assert(received == true); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::chat::testListen(); + tuscany::chat::testPost(); + tuscany::chat::testReceived(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/chat/server-test b/sca-cpp/branches/cpp-contrib/components/chat/server-test new file mode 100755 index 0000000000..919a798fa5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/server-test @@ -0,0 +1,39 @@ +#!/bin/sh + +# 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. + +# Setup +../../modules/http/httpd-conf tmp 8090 ../../modules/http/htdocs +../../modules/server/server-conf tmp +../../modules/server/scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite chat.composite +EOF + +../../modules/http/httpd-start tmp +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +../../modules/http/httpd-stop tmp +sleep 1 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/chat/server-test.scm b/sca-cpp/branches/cpp-contrib/components/chat/server-test.scm new file mode 100644 index 0000000000..a6023708e1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/server-test.scm @@ -0,0 +1,20 @@ +; 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. + +; Chat test case + +(define (post key val report) (report "post" '("sca3@localhost") val)) diff --git a/sca-cpp/branches/cpp-contrib/components/chat/xmpp-test.cpp b/sca-cpp/branches/cpp-contrib/components/chat/xmpp-test.cpp new file mode 100644 index 0000000000..6b7fa3439f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/xmpp-test.cpp @@ -0,0 +1,103 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test XMPP support functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "monad.hpp" +#include "value.hpp" +#include "perf.hpp" +#include "parallel.hpp" +#include "xmpp.hpp" + +namespace tuscany { +namespace chat { + +const value jid1("sca1@localhost"); +const value pass1("sca1"); +const value jid2("sca2@localhost"); +const value pass2("sca2"); + +worker w(2); +bool received; + +const failable<bool> listener(const value& from, const value& val, unused XMPPClient& xc) { + assert(contains(from, "sca1@localhost")); + assert(val == "hey"); + received = true; + return false; +} + +struct subscribe { + XMPPClient& xc; + subscribe(XMPPClient& xc) : xc(xc) { + } + const failable<bool> operator()() const { + const lambda<failable<bool>(const value&, const value&, XMPPClient&)> l(listener); + listen(l, xc); + return true; + } +}; + +bool testListen() { + received = false; + XMPPClient& xc = *(new (gc_new<XMPPClient>()) XMPPClient(jid2, pass2)); + const failable<bool> c = connect(xc); + assert(hasContent(c)); + const lambda<failable<bool>()> subs = subscribe(xc); + submit(w, subs); + return true; +} + +bool testPost() { + XMPPClient xc(jid1, pass1); + const failable<bool> c = connect(xc); + assert(hasContent(c)); + const failable<bool> p = post(jid2, "hey", xc); + assert(hasContent(p)); + return true; +} + +bool testReceived() { + shutdown(w); + assert(received == true); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::chat::testListen(); + tuscany::chat::testPost(); + tuscany::chat::testReceived(); + + tuscany::cout << "OK" << tuscany::endl; + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/chat/xmpp.hpp b/sca-cpp/branches/cpp-contrib/components/chat/xmpp.hpp new file mode 100644 index 0000000000..34ab13ed98 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/chat/xmpp.hpp @@ -0,0 +1,330 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_queue_hpp +#define tuscany_queue_hpp + +/** + * XMPP support functions. + */ + +#include <apr_uuid.h> + +#include "strophe.h" +extern "C" { +#include "common.h" +} +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../../modules/scheme/eval.hpp" + +namespace tuscany { +namespace chat { + +/** + * XMPP runtime, one per process. + */ +class XMPPRuntime { +public: + XMPPRuntime() { + xmpp_initialize(); + log = xmpp_get_default_logger(XMPP_LEVEL_DEBUG); + } + + ~XMPPRuntime() { + xmpp_shutdown(); + } + +private: + friend class XMPPClient; + xmpp_log_t* log; + +} xmppRuntime; + +/** + * Represents an XMPP client. + */ +const string resourceUUID() { + apr_uuid_t uuid; + apr_uuid_get(&uuid); + char buf[APR_UUID_FORMATTED_LENGTH]; + apr_uuid_format(buf, &uuid); + return string(buf, APR_UUID_FORMATTED_LENGTH); +} + +class XMPPClient { +public: + XMPPClient(const string& jid, const string& pass, bool owner = true) : owner(owner), ctx(xmpp_ctx_new(NULL, xmppRuntime.log)), conn(xmpp_conn_new(ctx)), connecting(false), connected(false), disconnecting(false) { + xmpp_conn_set_jid(conn, c_str(jid + "/" + resourceUUID())); + xmpp_conn_set_pass(conn, c_str(pass)); + } + + XMPPClient(const XMPPClient& xc) : owner(false), ctx(xc.ctx), conn(xc.conn), listener(xc.listener), connecting(xc.connecting), connected(xc.connected), disconnecting(xc.disconnecting) { + } + + ~XMPPClient() { + extern const failable<bool> disconnect(XMPPClient& xc); + if (!owner) + return; + if (!disconnecting) + disconnect(*this); + xmpp_conn_release(conn); + xmpp_ctx_free(ctx); + } + +private: + friend int versionHandler(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const udata); + friend void connHandler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int err, xmpp_stream_error_t* const errstream, void *const udata); + friend int messageHandler(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const udata); + friend const failable<bool> connect(XMPPClient& xc); + friend const failable<int> send(const char* data, const int len, XMPPClient& xc); + friend const failable<int> send(xmpp_stanza_t* const stanza, XMPPClient& xc); + friend const failable<bool> post(const value& to, const value& val, XMPPClient& xc); + friend const failable<bool> disconnect(XMPPClient& xc); + friend const failable<bool> listen(const lambda<failable<bool>(const value&, const value&, XMPPClient&)>& listener, XMPPClient& xc); + + const bool owner; + xmpp_ctx_t* ctx; + xmpp_conn_t* conn; + lambda<failable<bool>(const value&, const value&, XMPPClient&)> listener; + bool connecting; + bool connected; + bool disconnecting; +}; + +/** + * Make a text stanza. + */ +xmpp_stanza_t* textStanza(const char* text, xmpp_ctx_t* ctx) { + xmpp_stanza_t* stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_text(stanza, text); + return stanza; +} + +/** + * Make a named stanza. + */ +xmpp_stanza_t* namedStanza(const char* ns, const char* name, xmpp_ctx_t* ctx) { + xmpp_stanza_t* stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(stanza, name); + if (ns != NULL) + xmpp_stanza_set_ns(stanza, ns); + return stanza; +} + +/** + * Make a named stanza using a qualified name. + */ +xmpp_stanza_t* namedStanza(const char* name, xmpp_ctx_t* ctx) { + xmpp_stanza_t* stanza = xmpp_stanza_new(ctx); + xmpp_stanza_set_name(stanza, name); + return stanza; +} + +/** + * XMPP version handler. + */ +int versionHandler(xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const udata) { + XMPPClient& xc = *(XMPPClient*)udata; + + // Build version reply stanza + xmpp_stanza_t* reply = namedStanza("iq", xc.ctx); + xmpp_stanza_set_type(reply, "result"); + xmpp_stanza_set_id(reply, xmpp_stanza_get_id(stanza)); + xmpp_stanza_set_attribute(reply, "to", xmpp_stanza_get_attribute(stanza, "from")); + xmpp_stanza_t* query = namedStanza(xmpp_stanza_get_ns(xmpp_stanza_get_children(stanza)), "query", xc.ctx); + xmpp_stanza_add_child(reply, query); + xmpp_stanza_t* name = namedStanza("name", xc.ctx); + xmpp_stanza_add_child(query, name); + xmpp_stanza_add_child(name, textStanza("Apache Tuscany", xc.ctx)); + xmpp_stanza_t* version = namedStanza("version", xc.ctx); + xmpp_stanza_add_child(query, version); + xmpp_stanza_add_child(version, textStanza("1.0", xc.ctx)); + + // Send it + xmpp_send(conn, reply); + xmpp_stanza_release(reply); + return 1; +} + +/** + * XMPP message handler + */ +int messageHandler(unused xmpp_conn_t* const conn, xmpp_stanza_t* const stanza, void* const udata) { + // Ignore noise + if(xmpp_stanza_get_child_by_name(stanza, "body") == NULL) + return 1; + if(!strcmp(xmpp_stanza_get_attribute(stanza, "type"), "error")) + return 1; + + // Call the client listener function + XMPPClient& xc = *(XMPPClient*)udata; + const char* from = xmpp_stanza_get_attribute(stanza, "from"); + const char* text = xmpp_stanza_get_text(xmpp_stanza_get_child_by_name(stanza, "body")); + if (isNil(xc.listener)) + return 1; + const value val(scheme::readValue(text)); + debug(from, "chat::messageHandler::from"); + debug(val, "chat::messageHandler::body"); + const failable<bool> r = xc.listener(value(string(from)), val, xc); + if (!hasContent(r) || !content(r)) { + // Stop listening + xc.listener = lambda<failable<bool>(const value&, const value&, XMPPClient&)>(); + return 0; + } + return 1; +} + +/** + * XMPP connection handler. + */ +void connHandler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, unused const int err, unused xmpp_stream_error_t* const errstream, void *const udata) { + XMPPClient& xc = *(XMPPClient*)udata; + xc.connecting = false; + + if (status == XMPP_CONN_CONNECT) { + debug("chat::connHandler::connected"); + xmpp_handler_add(conn, versionHandler, "jabber:iq:version", "iq", NULL, &xc); + + // Send a <presence/> stanza so that we appear online to contacts + xmpp_stanza_t* pres = xmpp_stanza_new(xc.ctx); + xmpp_stanza_set_name(pres, "presence"); + xmpp_send(conn, pres); + xmpp_stanza_release(pres); + xc.connected = true; + return; + } + + debug("chat::connHandler::disconnected"); + xc.connected = false; + if (xc.ctx->loop_status == XMPP_LOOP_RUNNING) + xc.ctx->loop_status = XMPP_LOOP_QUIT; +} + +/** + * Connect to an XMPP server. + */ +const failable<bool> connect(XMPPClient& xc) { + xc.connecting = true; + xmpp_connect_client(xc.conn, NULL, 0, connHandler, &xc); + while(xc.connecting) + xmpp_run_once(xc.ctx, 20L); + if (!xc.connected) + return mkfailure<bool>("Couldn't connect to XMPP server"); + return true; +} + +/** + * Send a buffer on an XMPP session. + */ +const failable<int> send(const char* data, const int len, XMPPClient& xc) { + if (len == 0) + return 0; + const int written = xc.conn->tls? tls_write(xc.conn->tls, data, len) : sock_write(xc.conn->sock, data, len); + if (written < 0) { + xc.conn->error = xc.conn->tls? tls_error(xc.conn->tls) : sock_error(); + return mkfailure<int>("Couldn't send stanza to XMPP server"); + } + return send(data + written, len - written, xc); +} + +/** + * Send a string on an XMPP session. + */ +const failable<int> send(const string& data, XMPPClient& xc) { + return send(c_str(data), length(data), xc); +} + +/** + * Send a stanza on an XMPP session. + */ +const failable<int> send(xmpp_stanza_t* const stanza, XMPPClient& xc) { + char *buf; + size_t len; + const int rc = xmpp_stanza_to_text(stanza, &buf, &len); + if (rc != 0) + return mkfailure<int>("Couldn't convert stanza to text"); + const failable<int> r = send(buf, len, xc); + if (!hasContent(r)) { + xmpp_free(xc.conn->ctx, buf); + return r; + } + xmpp_debug(xc.conn->ctx, "conn", "SENT: %s", buf); + xmpp_free(xc.conn->ctx, buf); + return content(r); +} + +/** + * Post a message to an XMPP jid. + */ +const failable<bool> post(const value& to, const value& val, XMPPClient& xc) { + debug(to, "chat::post::to"); + debug(val, "chat::post::body"); + + // Convert the value to a string + const string vs(scheme::writeValue(val)); + + // Build message stanza + xmpp_stanza_t* stanza = namedStanza("message", xc.ctx); + xmpp_stanza_set_type(stanza, "chat"); + xmpp_stanza_set_attribute(stanza, "to", c_str(string(to))); + xmpp_stanza_t* body = namedStanza("body", xc.ctx); + xmpp_stanza_add_child(stanza, body); + xmpp_stanza_add_child(body, textStanza(c_str(vs), xc.ctx)); + + // Send it + const failable<int> r = send(stanza, xc); + xmpp_stanza_release(stanza); + if (!hasContent(r)) + return mkfailure<bool>(reason(r)); + return true; +} + +/** + * Disconnect an XMPP session. + */ +const failable<bool> disconnect(XMPPClient& xc) { + xc.disconnecting = true; + const failable<int> r = send("</stream:stream>", xc); + if (!hasContent(r)) + return mkfailure<bool>(reason(r)); + return true; +} + +/** + * Listen to messages received by an XMPP client. + */ +const failable<bool> listen(const lambda<failable<bool>(const value&, const value&, XMPPClient&)>& listener, XMPPClient& xc) { + debug("chat::listen"); + xc.listener = listener; + xmpp_handler_add(xc.conn, messageHandler, NULL, "message", NULL, &xc); + xc.ctx->loop_status = XMPP_LOOP_RUNNING; + while(xc.connected && !isNil(xc.listener) && xc.ctx->loop_status == XMPP_LOOP_RUNNING) + xmpp_run_once(xc.ctx, 1000L); + return true; +} + +} +} + +#endif /* tuscany_xmpp_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/components/log/Makefile.am b/sca-cpp/branches/cpp-contrib/components/log/Makefile.am new file mode 100644 index 0000000000..de5c2d1b1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/log/Makefile.am @@ -0,0 +1,17 @@ +# 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. + diff --git a/sca-cpp/branches/cpp-contrib/components/log/log.composite b/sca-cpp/branches/cpp-contrib/components/log/log.composite new file mode 100644 index 0000000000..2b0a557e4e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/log/log.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="log"> + + <component name="log"> + <implementation.cpp path=".libs" library="liblog"/> + <property name="file">sample.log</property>property> + <service name="log"> + <t:binding.http uri="log"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/components/queue/Makefile.am b/sca-cpp/branches/cpp-contrib/components/queue/Makefile.am new file mode 100644 index 0000000000..09ff0e54a4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/Makefile.am @@ -0,0 +1,45 @@ +# 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. + +if WANT_QUEUE + +noinst_PROGRAMS = qpid-test client-test + +INCLUDES = -I${QPIDC_INCLUDE} + +compdir=$(prefix)/components/queue +comp_LTLIBRARIES = libqueue-sender.la libqueue-listener.la +comp_DATA = qpidc.prefix + +libqueue_sender_la_SOURCES = queue-sender.cpp +libqueue_sender_la_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient + +libqueue_listener_la_SOURCES = queue-listener.cpp +libqueue_listener_la_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient + +qpid_test_SOURCES = qpid-test.cpp +qpid_test_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient + +qpidc.prefix: $(top_builddir)/config.status + echo ${QPIDC_PREFIX} >qpidc.prefix + +TESTS = send-test server-test + +endif diff --git a/sca-cpp/branches/cpp-contrib/components/queue/client-test.cpp b/sca-cpp/branches/cpp-contrib/components/queue/client-test.cpp new file mode 100644 index 0000000000..a448d1fccd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/client-test.cpp @@ -0,0 +1,99 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test queue component. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "perf.hpp" +#include "../../modules/http/curl.hpp" +#include "qpid.hpp" + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +namespace tuscany { +namespace queue { + +const value key(mklist<value>(string("report"))); +const string qname("reportq"); + +const list<value> item = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); +const list<value> entry = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), item); + +bool testDeclareQueue() { + QpidConnection qc; + QpidSession qs(qc); + const failable<bool> r = declareQueue(key, qname, qs); + assert(hasContent(r)); + return true; +} + +const bool listener(const value& k, const value& v) { + cerr << "k " << k << " v " << v << endl; + assert(k == key); + assert(v == entry); + return false; +} + +bool testListen() { + QpidConnection qc; + QpidSession qs(qc); + QpidSubscription qsub(qs); + const lambda<bool(const value&, const value&)> l(listener); + listen(qname, l, qsub); + return true; +} + +bool testPost() { + gc_scoped_pool pool; + http::CURLSession ch; + const failable<value> id = http::post(entry, "http://localhost:8090/print-sender", ch); + assert(hasContent(id)); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::queue::testDeclareQueue(); + tuscany::queue::testPost(); + tuscany::queue::testListen(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/queue/qpid-test.cpp b/sca-cpp/branches/cpp-contrib/components/queue/qpid-test.cpp new file mode 100644 index 0000000000..1a650157b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/qpid-test.cpp @@ -0,0 +1,97 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test Qpid support functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "monad.hpp" +#include "value.hpp" +#include "perf.hpp" +#include "qpid.hpp" + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +namespace tuscany { +namespace queue { + +const value key(mklist<value>("test")); +const string qname("testq"); + +bool testDeclareQueue() { + QpidConnection qc; + QpidSession qs(qc); + const failable<bool> r = declareQueue(key, qname, qs); + assert(hasContent(r)); + return true; +} + +const list<value> item = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); +const list<value> entry = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), item); + +bool testPost() { + QpidConnection qc; + QpidSession qs(qc); + const failable<bool> r = post(key, entry, qs); + assert(hasContent(r)); + return true; +} + +const bool listener(const value& k, const value& v) { + assert(k == key); + assert(v == entry); + return false; +} + +bool testListen() { + QpidConnection qc; + QpidSession qs(qc); + QpidSubscription qsub(qs); + const lambda<bool(const value&, const value&)> l(listener); + listen(qname, l, qsub); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::queue::testDeclareQueue(); + tuscany::queue::testPost(); + tuscany::queue::testListen(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/queue/qpid.hpp b/sca-cpp/branches/cpp-contrib/components/queue/qpid.hpp new file mode 100644 index 0000000000..8b466cedcc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/qpid.hpp @@ -0,0 +1,260 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_queue_hpp +#define tuscany_queue_hpp + +/** + * AMQP queue access functions. + */ + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +#include <qpid/client/Connection.h> +#include <qpid/client/Session.h> +#include <qpid/client/MessageListener.h> +#include <qpid/client/SubscriptionManager.h> + +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../../modules/scheme/eval.hpp" + +namespace tuscany { +namespace queue { + +/** + * Represents a Qpid connection. + */ +class QpidConnection { +public: + QpidConnection() : owner(true) { + c.open("localhost", 5672); + } + + QpidConnection(const bool owner) : owner(owner) { + c.open("localhost", 5672); + } + + QpidConnection(const QpidConnection& qc) : owner(false), c(qc.c) { + } + + ~QpidConnection() { + if (!owner) + return; + c.close(); + } + +private: + friend const failable<bool> close(QpidConnection& qc); + friend class QpidSession; + + const bool owner; + qpid::client::Connection c; + +}; + +/** + * Close a Qpid connection. + */ +const failable<bool> close(QpidConnection& qc) { + qc.c.close(); + return true; +} + +/** + * Represents a Qpid session. + */ +class QpidSession { +public: + QpidSession(QpidConnection& qc) : owner(true), s(qc.c.newSession()) { + } + + QpidSession(QpidConnection& qc, const bool owner) : owner(owner), s(qc.c.newSession()) { + } + + QpidSession(const QpidSession& qs) : owner(false), s(qs.s) { + } + + ~QpidSession() { + if (!owner) + return; + s.close(); + } + +private: + friend const failable<bool> close(QpidSession& qs); + friend const failable<bool> declareQueue(const value& key, const string& name, QpidSession& qs); + friend const failable<bool> post(const value& key, const value& val, QpidSession& qs); + friend class QpidSubscription; + + const bool owner; + qpid::client::Session s; +}; + +/** + * Close a Qpid session. + */ +const failable<bool> close(QpidSession& qs) { + try { + qs.s.close(); + } catch (const qpid::Exception& e) { + return mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + return true; +} + +/** + * Declare a key / AMQP queue pair. + */ +const failable<bool> declareQueue(const value& key, const string& name, QpidSession& qs) { + const string ks(scheme::writeValue(key)); + try { + qs.s.queueDeclare(qpid::client::arg::queue=c_str(name)); + qs.s.exchangeBind(qpid::client::arg::exchange="amq.direct", qpid::client::arg::queue=c_str(name), qpid::client::arg::bindingKey=c_str(ks)); + } catch (const qpid::Exception& e) { + return mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + return true; +} + +/** + * Post a key / value pair message to an AMQP broker. + */ +const failable<bool> post(const value& key, const value& val, QpidSession& qs) { + + // Send in a message with the given key. + const string ks(scheme::writeValue(key)); + const string vs(scheme::writeValue(val)); + try { + qpid::client::Message message; + message.getDeliveryProperties().setRoutingKey(c_str(ks)); + message.setData(c_str(vs)); + qs.s.messageTransfer(qpid::client::arg::content=message, qpid::client::arg::destination="amq.direct"); + } catch (const qpid::Exception& e) { + return mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + return true; +} + +/** + * Represents a Qpid subscription. + */ +class QpidSubscription { +public: + QpidSubscription(QpidSession& qs) : owner(true), subs(qs.s) { + } + + QpidSubscription(QpidSession& qs, const bool owner) : owner(owner), subs(qs.s) { + } + + QpidSubscription(const QpidSubscription& qsub) : owner(false), subs(qsub.subs) { + } + + ~QpidSubscription() { + if (!owner) + return; + try { + subs.stop(); + } catch (const qpid::Exception& e) { + mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + } + +private: + friend const failable<bool> listen(const string& name, const lambda<bool(const value&, const value&)>& l, QpidSubscription& qsub); + friend const failable<bool> stop(QpidSubscription& qsub); + + const bool owner; + qpid::client::SubscriptionManager subs; +}; + +/** + * Register a listener function with an AMQP queue. + */ +class Listener : public qpid::client::MessageListener { +public: + Listener(const lambda<bool(const value&, const value&)> l, qpid::client::SubscriptionManager& subs) : l(l), subs(subs) { + } + + virtual void received(qpid::client::Message& msg) { + + // Call the listener function + const value k(scheme::readValue(msg.getDeliveryProperties().getRoutingKey().c_str())); + const value v(scheme::readValue(msg.getData().c_str())); + const bool r = l(k, v); + if (!r) { + try { + subs.cancel(msg.getDestination()); + } catch (const qpid::Exception& e) { + mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + } + } + +private: + const lambda<bool(const value&, const value&)> l; + qpid::client::SubscriptionManager& subs; +}; + + +const failable<bool> listen(const string& name, const lambda<bool(const value&, const value&)>& l, QpidSubscription& qsub) { + debug("queue::listen"); + Listener listener(l, qsub.subs); + try { + qsub.subs.subscribe(listener, c_str(name)); + qsub.subs.run(); + } catch (const qpid::Exception& e) { + return mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + debug("queue::listen::stopped"); + return true; +} + +/** + * Stop an AMQP subscription. + */ +const failable<bool> stop(QpidSubscription& qsub) { + debug("queue::stop"); + try { + qsub.subs.stop(); + } catch (const qpid::Exception& e) { + return mkfailure<bool>(string("Qpid failure: ") + e.what()); + } + debug("queue::stopped"); + return true; +} + +} +} + +// Re-enable conversion and redundant declarations warnings +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic warning "-Wconversion" +#pragma GCC diagnostic warning "-Wredundant-decls" +#endif + +#endif /* tuscany_qpid_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/components/queue/qpidd-start b/sca-cpp/branches/cpp-contrib/components/queue/qpidd-start new file mode 100755 index 0000000000..02e048c41e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/qpidd-start @@ -0,0 +1,24 @@ +#!/bin/sh + +# 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. + +# Start qpidd +here=`readlink -f $0`; here=`dirname $here` + +qpid_prefix=`cat $here/qpidc.prefix` +$qpid_prefix/sbin/qpidd & diff --git a/sca-cpp/branches/cpp-contrib/components/queue/qpidd-stop b/sca-cpp/branches/cpp-contrib/components/queue/qpidd-stop new file mode 100755 index 0000000000..6fb0467cff --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/qpidd-stop @@ -0,0 +1,26 @@ +#!/bin/sh + +# 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. + +# Stop qpidd +here=`readlink -f $0`; here=`dirname $here` + +qpid_prefix=`cat $here/qpidc.prefix` +qpidd="$qpid_prefix/sbin/qpidd" + +kill `ps -f | grep -v grep | grep "${qpidd}" | awk '{ print $2 }'` diff --git a/sca-cpp/branches/cpp-contrib/components/queue/queue-listener.cpp b/sca-cpp/branches/cpp-contrib/components/queue/queue-listener.cpp new file mode 100644 index 0000000000..d714101583 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/queue-listener.cpp @@ -0,0 +1,158 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * AMQP queue listener component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "parallel.hpp" +#include "qpid.hpp" + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +namespace tuscany { +namespace queue { + +/** + * A relay function that posts the AMQP messages it receives to a relay component reference. + */ +class relay { +public: + relay(const lambda<value(const list<value>&)>& rel) : rel(rel) { + } + + const bool operator()(const value& k, const value& v) const { + debug(k, "queue::relay::key"); + debug(v, "queue::relay::value"); + const value res = rel(mklist<value>("post", isList(k)? (list<value>)k : mklist<value>(k), v)); + return true; + } + +private: + const lambda<value(const list<value>&)> rel; +}; + +/** + * Subscribe and listen to an AMQP queue. + */ +class subscribe { +public: + subscribe(const string& qname, const lambda<bool(const value&, const value&)>& l, const QpidSubscription& qsub) : qname(qname), l(l), qsub(qsub) { + } + + const failable<bool> operator()() const { + gc_pool pool; + debug(qname, "queue::subscribe::listen"); + const failable<bool> r = listen(qname, l, const_cast<QpidSubscription&>(qsub)); + debug(qname, "queue::subscribe::stopped"); + return r; + } + +private: + const string qname; + const lambda<bool(const value&, const value&)> l; + const QpidSubscription qsub; +}; + +/** + * Listener lambda function, responsible for starting an AMQP subscription in a worker thread, and + * apply any function calls to the listener component. The only supported function is stop(), + * called to stop the listener component and shutdown the worker thread. + */ +class listener { +public: + listener(QpidConnection& qc, QpidSession& qs, QpidSubscription& qsub, worker& w) : qc(qc), qs(qs), qsub(qsub), w(w) { + } + + const value operator()(const list<value>& params) const { + const tuscany::value func(car(params)); + + // Stop the component + if (func != "stop") + return tuscany::mkfailure<tuscany::value>(); + debug("queue::listener::stop"); + + // TODO check why stop() and close() hang in child processes + stop(const_cast<QpidSubscription&>(qsub)); + close(const_cast<QpidSession&>(qs)); + close(const_cast<QpidConnection&>(qc)); + cancel(const_cast<worker&>(w)); + + debug("queue::listener::stopped"); + return failable<value>(value(lambda<value(const list<value>&)>())); + } + +private: + QpidConnection qc; + QpidSession qs; + QpidSubscription qsub; + worker w; +}; + +/** + * Start the component. + */ +const failable<value> start(const list<value>& params) { + // Extract the relay reference and the AMQP key and queue name + const value rel = car(params); + const value pk = ((lambda<value(list<value>)>)cadr(params))(list<value>()); + const value key = isList(pk)? (list<value>)pk : mklist<value>(pk); + const value qname = ((lambda<value(list<value>)>)caddr(params))(list<value>()); + + // Create an AMQP session + QpidConnection qc(false); + QpidSession qs(qc, false); + + // Declare the configured AMQP key / queue pair + declareQueue(key, qname, qs); + + // Listen and relay messages in a worker thread + QpidSubscription qsub(qs, false); + worker w(3); + const lambda<bool(const value&, const value&)> rl = relay(rel); + submit<failable<bool> >(w, lambda<failable<bool>()>(subscribe(qname, rl, qsub))); + + // Return the listener component lambda function + return value(lambda<value(const list<value>&)>(listener(qc, qs, qsub, w))); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "start") + return tuscany::queue::start(cdr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/queue/queue-sender.cpp b/sca-cpp/branches/cpp-contrib/components/queue/queue-sender.cpp new file mode 100644 index 0000000000..07f8491f54 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/queue-sender.cpp @@ -0,0 +1,72 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * AMQP queue sender component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "qpid.hpp" + +// Ignore conversion issues and redundant declarations in Qpid headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif + +namespace tuscany { +namespace queue { + +/** + * Post an item to a queue. + */ +const failable<value> post(const list<value>& params) { + QpidConnection qc; + QpidSession qs(qc); + + // Post the item + const value pk = ((lambda<value(list<value>)>)caddr(params))(list<value>()); + const value key = isList(pk)? append<value>(pk, (list<value>)car(params)) : cons<value>(pk, (list<value>)car(params)); + debug(key, "queue::post::key"); + debug(cadr(params), "queue::post::value"); + const failable<bool> r = post(key, cadr(params), qs); + if (!hasContent(r)) + return mkfailure<value>(reason(r)); + return key; +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "post") + return tuscany::queue::post(cdr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/queue/queue.composite b/sca-cpp/branches/cpp-contrib/components/queue/queue.composite new file mode 100644 index 0000000000..535680c6c3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/queue.composite @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="queue"> + + <component name="print-sender"> + <implementation.cpp path=".libs" library="libqueue-sender"/> + <property name="key">print</property> + <service name="print-sender"> + <t:binding.http uri="print-sender"/> + </service> + </component> + + <component name="print-listener"> + <implementation.cpp path=".libs" library="libqueue-listener"/> + <property name="key">print</property> + <property name="queue">printq</property> + <reference name="relay" target="print"/> + </component> + + <component name="print"> + <t:implementation.scheme script="server-test.scm"/> + <service name="print"> + <t:binding.http uri="print"/> + </service> + <reference name="report" target="report-sender"/> + </component> + + <component name="report-sender"> + <implementation.cpp path=".libs" library="libqueue-sender"/> + <property name="key">report</property> + <service name="report-sender"> + <t:binding.http uri="report-sender"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/components/queue/send-test b/sca-cpp/branches/cpp-contrib/components/queue/send-test new file mode 100755 index 0000000000..ec6d9d9083 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/send-test @@ -0,0 +1,31 @@ +#!/bin/sh + +# 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. + +# Setup +./qpidd-start +sleep 1 + +# Test +./qpid-test 2>/dev/null +rc=$? + +# Cleanup +./qpidd-stop +sleep 1 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/queue/server-test b/sca-cpp/branches/cpp-contrib/components/queue/server-test new file mode 100755 index 0000000000..3fc94e6f35 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/server-test @@ -0,0 +1,43 @@ +#!/bin/sh + +# 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. + +# Setup +../../modules/http/httpd-conf tmp 8090 ../../modules/http/htdocs +../../modules/server/server-conf tmp +../../modules/server/scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite queue.composite +EOF + +./qpidd-start +sleep 1 +../../modules/http/httpd-start tmp +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +../../modules/http/httpd-stop tmp +sleep 1 +./qpidd-stop +sleep 1 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/queue/server-test.scm b/sca-cpp/branches/cpp-contrib/components/queue/server-test.scm new file mode 100644 index 0000000000..1a89ce8b31 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/queue/server-test.scm @@ -0,0 +1,20 @@ +; 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. + +; Queue test case + +(define (post key val report) (report "post" '() val)) diff --git a/sca-cpp/branches/cpp-contrib/components/store/Makefile.am b/sca-cpp/branches/cpp-contrib/components/store/Makefile.am new file mode 100644 index 0000000000..09cb5fa26a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/store/Makefile.am @@ -0,0 +1,20 @@ +# 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. + +if WANT_STORE + +endif diff --git a/sca-cpp/branches/cpp-contrib/components/store/store.composite b/sca-cpp/branches/cpp-contrib/components/store/store.composite new file mode 100644 index 0000000000..ccfd61fc4d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/store/store.composite @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="store"> + + <component name="store"> + <implementation.cpp path=".libs" library="libstore"/> + <service name="store"> + <t:binding.http uri="store"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/Makefile.am b/sca-cpp/branches/cpp-contrib/components/webservice/Makefile.am new file mode 100644 index 0000000000..264b150c93 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/Makefile.am @@ -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. + +if WANT_WEBSERVICE + +noinst_PROGRAMS = axiom-test axis2-test client-test + +INCLUDES = -I${AXIS2C_INCLUDE} + +compdir=$(prefix)/components/webservice +comp_LTLIBRARIES = libwebservice-client.la libwebservice-listener.la libaxis2-dispatcher.la libaxis2-service.la +comp_DATA = axis2c.prefix + +libwebservice_client_la_SOURCES = webservice-client.cpp +libwebservice_client_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +libwebservice_listener_la_SOURCES = webservice-listener.cpp +libwebservice_listener_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +libaxis2_dispatcher_la_SOURCES = axis2-dispatcher.cpp +libaxis2_dispatcher_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +libaxis2_service_la_SOURCES = axis2-service.cpp +libaxis2_service_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +axiom_test_SOURCES = axiom-test.cpp +axiom_test_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +axis2_test_SOURCES = axis2-test.cpp +axis2_test_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine + +axis2c.prefix: $(top_builddir)/config.status + echo ${AXIS2C_PREFIX} >axis2c.prefix + +TESTS = axiom-test echo-test server-test + +endif diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axiom-test.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/axiom-test.cpp new file mode 100644 index 0000000000..a3ab8e7e8f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axiom-test.cpp @@ -0,0 +1,85 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test Web service Axiom support functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "monad.hpp" +#include "value.hpp" +#include "perf.hpp" +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + +const string customerElement = +"<customer>" +"<name>jdoe</name>" +"<address><city>san francisco</city><state>ca</state></address>" +"<account><id>1234</id><balance>1000</balance></account>" +"<account><id>6789</id><balance>2000</balance></account>" +"<account><id>4567</id><balance>3000</balance></account>" +"</customer>"; + +bool testAxiom() { + const Axis2Context ax; + { + const failable<axiom_node_t*> n = stringToAxiomNode(customerElement, ax); + assert(hasContent(n)); + const failable<const string> c = axiomNodeToString(content(n), ax); + assert(hasContent(c)); + assert(content(c) == customerElement); + } + { + const list<value> arg = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + + (list<value>() + "text" + string("Hello World!"))); + const failable<axiom_node_t*> n = valuesToAxiomNode(arg, ax); + assert(hasContent(n)); + const failable<const string> x = axiomNodeToString(content(n), ax); + assert(hasContent(x)); + assert(content(x) == "<ns1:echoString xmlns:ns1=\"http://ws.apache.org/axis2/services/echo\"><text>Hello World!</text></ns1:echoString>"); + const failable<const list<value> > l = axiomNodeToValues(content(n), ax); + assert(hasContent(l)); + assert(l == arg); + } + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::webservice::testAxiom(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axis2-conf b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-conf new file mode 100755 index 0000000000..2e1f6116cd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-conf @@ -0,0 +1,53 @@ +#!/bin/sh + +# 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. + +# Generate an Axis2 server conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` +axis2_prefix=`cat axis2c.prefix` + +# Create an Axis2 home directory +mkdir -p $root/axis2c +ln -f -s $axis2_prefix/lib $root/axis2c/lib +mkdir -p $root/axis2c/logs +mkdir -p $root/axis2c/modules +ln -f -s $axis2_prefix/modules/addressing $root/axis2c/modules/addressing +ln -f -s $axis2_prefix/modules/logging $root/axis2c/modules/logging +mkdir -p $root/axis2c/services + +# Install Tuscany Axis2 module and service +mkdir -p $root/axis2c/modules/tuscany +ln -f -s $here/.libs/libaxis2-dispatcher.so $root/axis2c/modules/tuscany/libaxis2-dispatcher.so +ln -f -s $here/module.xml $root/axis2c/modules/tuscany/module.xml +mkdir -p $root/axis2c/services/tuscany +ln -f -s $here/.libs/libaxis2-service.so $root/axis2c/services/tuscany/libaxis2-service.so +ln -f -s $here/services.xml $root/axis2c/services/tuscany/services.xml +cp $here/axis2.xml $root/axis2c/axis2.xml + +# Configure HTTPD Axis2 module +cat >>$root/conf/httpd.conf <<EOF +SetEnv AXIS2C_HOME $root/axis2c +LoadModule axis2_module $root/axis2c/lib/libmod_axis2.so +Axis2RepoPath $root/axis2c +Axis2LogFile $root/axis2c/logs/mod_axis2.log +Axis2LogLevel debug +<Location /axis2> + SetHandler axis2_module +</Location> +EOF diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axis2-dispatcher.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-dispatcher.cpp new file mode 100644 index 0000000000..3f753e0e35 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-dispatcher.cpp @@ -0,0 +1,138 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Axis2/C module that dispatches all server requests to the Tuscany Axis/2C service. + */ + +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + +/** + * Determine the service and operation to dispatch a request to. + */ +axis2_svc_t* AXIS2_CALL dispatchFindService(axis2_msg_ctx_t* msg_ctx, const axutil_env_t* env) { + const axis2_conf_ctx_t* conf_ctx = axis2_msg_ctx_get_conf_ctx(msg_ctx, env); + const axis2_conf_t* conf = axis2_conf_ctx_get_conf(conf_ctx, env); + axis2_svc_t* svc = axis2_conf_get_svc(conf, env, "TuscanyService"); + return svc; +} + +axis2_op_t *AXIS2_CALL dispatchFindOp(unused axis2_msg_ctx_t* msg_ctx, const axutil_env_t* env, axis2_svc_t* svc) { + axutil_qname_t* op_qname = axutil_qname_create(env, "execute", NULL, NULL); + axis2_op_t *op = axis2_svc_get_op_with_name(svc, env, axutil_qname_get_localpart(op_qname, env)); + axutil_qname_free(op_qname, env); + return op; +} + +/** + * Dispatcher invoke function, called by Axis2/C. + */ +axis2_status_t AXIS2_CALL dispatchInvoke( struct axis2_handler* handler, const axutil_env_t* env, axis2_msg_ctx_t* msg_ctx) { + if (!(axis2_msg_ctx_get_server_side(msg_ctx, env))) + return AXIS2_SUCCESS; + axis2_msg_ctx_set_find_svc(msg_ctx, env, dispatchFindService); + axis2_msg_ctx_set_find_op(msg_ctx, env, dispatchFindOp); + return axis2_disp_find_svc_and_op(handler, env, msg_ctx); +} + +/** + * Create a dispatch handler. + */ +AXIS2_EXPORT axis2_handler_t* AXIS2_CALL dispatchHandler(const axutil_env_t* env, unused axutil_string_t* name) { + axis2_handler_t *handler = axis2_handler_create(env); + if (handler == NULL) + return NULL; + axis2_handler_set_invoke(handler, env, dispatchInvoke); + return handler; +} + +/** + * Initialize dispatch module. + */ +axis2_status_t AXIS2_CALL dispatchInit(unused axis2_module_t * module, unused const axutil_env_t * env, unused axis2_conf_ctx_t * conf_ctx, unused axis2_module_desc_t * module_desc) { + return AXIS2_SUCCESS; +} + +/** + * Initialize dispatch module function map. + */ +axis2_status_t AXIS2_CALL dispatchFuncMap(axis2_module_t * module, const axutil_env_t * env) { + module->handler_create_func_map = axutil_hash_make(env); + axutil_hash_set(module->handler_create_func_map, "TuscanyDispatcher", AXIS2_HASH_KEY_STRING, (const void *)dispatchHandler); + return AXIS2_SUCCESS; +} + +/** + * Shutdown dispatch module. + */ +axis2_status_t AXIS2_CALL dispatchShutdown(axis2_module_t* module, const axutil_env_t* env) { + if (module->handler_create_func_map != NULL) { + axutil_hash_free(module->handler_create_func_map, env); + module->handler_create_func_map = NULL; + } + AXIS2_FREE(env->allocator, module); + return AXIS2_SUCCESS; +} + +/** + * Return a new dispatch module. + */ +const axis2_module_ops_t dispatchOps = { + dispatchInit, + dispatchShutdown, + dispatchFuncMap +}; + +axis2_module_t * dispatchModule(const axutil_env_t* env) { + axis2_module_t *module = (axis2_module_t*)AXIS2_MALLOC(env->allocator, sizeof(axis2_module_t)); + if (module == NULL) + return NULL; + module->ops = &dispatchOps; + module->handler_create_func_map = NULL; + return module; +} + +} +} + +extern "C" +{ + +/** + * Axis2/C module entry point functions. + */ +AXIS2_EXPORT int axis2_get_instance(axis2_module_t** inst, const axutil_env_t* env) { + *inst = tuscany::webservice::dispatchModule(env); + if(*inst == NULL) + return AXIS2_FAILURE; + return AXIS2_SUCCESS; +} + +AXIS2_EXPORT int axis2_remove_instance(axis2_module_t* inst, const axutil_env_t* env) { + if (inst != NULL) + return tuscany::webservice::dispatchShutdown(inst, env); + return AXIS2_FAILURE; +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axis2-service.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-service.cpp new file mode 100644 index 0000000000..4c0ce22722 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-service.cpp @@ -0,0 +1,151 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Axis2/C service implementation that dispatches requests to SCA Web service components. + */ + +#include "value.hpp" +#include "string.hpp" +#include "../../modules/http/httpd.hpp" +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + +/** + * Initialize the service. + */ +int AXIS2_CALL serviceInit(unused axis2_svc_skeleton_t* svc_skeleton, unused const axutil_env_t* env) { + return AXIS2_SUCCESS; +} + +/** + * Free the service. + */ +int AXIS2_CALL serviceFree(axis2_svc_skeleton_t* svc_skeleton, const axutil_env_t* env) { + if (svc_skeleton) + AXIS2_FREE(env->allocator, svc_skeleton); + return AXIS2_SUCCESS; +} + +typedef struct axis2_apache2_out_transport_info { + axis2_http_out_transport_info_t out_transport_info; + request_rec *request; + axis2_char_t *encoding; +} axis2_apache2_out_transport_info_t; + +extern "C" { + extern module axis2_module; +} + +/** + * Service invoke function, called by Axis2/C. + */ +axiom_node_t *AXIS2_CALL serviceInvoke(unused axis2_svc_skeleton_t* svc_skeleton, const axutil_env_t* env, axiom_node_t* node, axis2_msg_ctx_t* msg_ctx) { + + // Check that we have an input node + if (node == NULL || axiom_node_get_node_type(node, env) != AXIOM_ELEMENT) + return NULL; + axiom_element_t *e = (axiom_element_t *) axiom_node_get_data_element(node, env); + if (e == NULL) + return NULL; + + // Get the function name + const char* func = axiom_element_get_localname(e, env); + if (func == NULL) + return NULL; + + // Get the target endpoint address + const axis2_endpoint_ref_t* epr = axis2_msg_ctx_get_from(msg_ctx, env); + if (epr == NULL) + return NULL; + string address = axis2_endpoint_ref_get_address(epr, env); + + // Get the underlying HTTPD request + axis2_out_transport_info_t* tinfo = axis2_msg_ctx_get_out_transport_info(msg_ctx, env); + axis2_apache2_out_transport_info_t* httpinfo = (axis2_apache2_out_transport_info_t*)tinfo; + request_rec* r = httpinfo->request; + httpdDebugRequest(r, "webservice::serviceInvoke"); + + // Parse the request Axiom node and construct request expression + Axis2Context ax(env); + const failable<const list<value> > lv = axiomNodeToValues(node, ax); + if (!hasContent(lv)) + return NULL; + const value expr = mklist<value>(func, content(lv)); + debug(expr, "webservice::serviceInvoke::expr"); + + // Retrieve the target lambda function from the HTTPD request and invoke it + const value* rv = const_cast<const value*>((value*)ap_get_module_config(r->request_config, &axis2_module)); + cout << "relay: " << rv << endl; + const lambda<value(const list<value>&)> relay = *rv; + const value res = relay(expr); + debug(res, "webservice::serviceInvoke::result"); + + // Construct response Axiom node + const failable<axiom_node_t*> rnode = valuesToAxiomNode(res, ax); + if (!hasContent(rnode)) + return NULL; + return content(rnode); +} + +/** + * Return a new service skeleton. + */ +const axis2_svc_skeleton_ops_t serviceOps = { + serviceInit, + serviceInvoke, + NULL, + serviceFree, + NULL +}; + +AXIS2_EXTERN axis2_svc_skeleton_t *AXIS2_CALL serviceSkeleton(const axutil_env_t* env) { + axis2_svc_skeleton_t* svc_skeleton = (axis2_svc_skeleton_t*)AXIS2_MALLOC(env->allocator, sizeof(axis2_svc_skeleton_t)); + svc_skeleton->ops = &serviceOps; + svc_skeleton->func_array = NULL; + return svc_skeleton; +} + +} +} + +extern "C" +{ + +/** + * Axis2/C service entry point functions. + */ +AXIS2_EXPORT int axis2_get_instance(struct axis2_svc_skeleton** inst, const axutil_env_t* env) { + *inst = tuscany::webservice::serviceSkeleton(env); + if (inst == NULL) + return AXIS2_FAILURE; + return AXIS2_SUCCESS; +} + +AXIS2_EXPORT int axis2_remove_instance(axis2_svc_skeleton_t* inst, const axutil_env_t* env) { + if (inst != NULL) + return AXIS2_SVC_SKELETON_FREE(inst, env); + return AXIS2_FAILURE; +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axis2-test.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-test.cpp new file mode 100644 index 0000000000..d7c2f3b671 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axis2-test.cpp @@ -0,0 +1,71 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test WebService Axis2 client support functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "monad.hpp" +#include "value.hpp" +#include "perf.hpp" +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + +bool testEval() { + const Axis2Context ax; + + const value func = "http://ws.apache.org/axis2/c/samples/echoString"; + const list<value> arg = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + + (list<value>() + "text" + string("Hello World!"))); + + const failable<value> rval = evalExpr(mklist<value>(func, arg, string("http://localhost:9090/axis2/services/echo")), ax); + assert(hasContent(rval)); + + const list<value> r = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/c/samples")) + + (list<value>() + "text" + string("Hello World!"))); + assert(content(rval) == r); + + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::webservice::testEval(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axis2.hpp b/sca-cpp/branches/cpp-contrib/components/webservice/axis2.hpp new file mode 100644 index 0000000000..c2886edb71 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axis2.hpp @@ -0,0 +1,194 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_webservice_hpp +#define tuscany_webservice_hpp + +/** + * Web service invocation functions using Axis2. + */ +#include "config.hpp" + +// Ignore redundant declarations in Axiom headers +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic ignored "-Wredundant-decls" +#endif +#include <axiom.h> +#include <axis2_client.h> +#include <axis2_module.h> +#include <axis2_addr_mod.h> +#include <axis2_conf_ctx.h> +#include <axis2_disp.h> +#include <axis2_http_out_transport_info.h> +#ifdef WANT_MAINTAINER_MODE +#pragma GCC diagnostic warning "-Wredundant-decls" +#endif + +#include "string.hpp" +#include "sstream.hpp" +#include "list.hpp" +#include "value.hpp" +#include "xml.hpp" +#include "monad.hpp" + +namespace tuscany { +namespace webservice { + +/** + * Represents an Axis2 runtime context. + */ +class Axis2Context { +public: + Axis2Context() : env(axutil_env_create_all("axis2.log", AXIS2_LOG_LEVEL_WARNING)), owner(true) { + } + + Axis2Context(const Axis2Context& ax) : env(ax.env), owner(false) { + } + + Axis2Context(const axutil_env_t* env) : env(const_cast<axutil_env_t*>(env)), owner(false) { + } + + ~Axis2Context() { + if (!owner || env == NULL) + return; + axutil_env_free(env); + } + +private: + axutil_env_t* env; + bool owner; + + friend const axutil_env_t* env(const Axis2Context& ax); +}; + +const axutil_env_t* env(const Axis2Context& ax) { + return ax.env; +} + +/** + * Return the latest Axis2 error in an Axis2 context. + */ +const string axis2Error(const Axis2Context& ax) { + ostringstream os; + os << env(ax)->error->error_number << " : " << AXIS2_ERROR_GET_MESSAGE(env(ax)->error); + return str(os); +} + +/** + * Convert a string to an Axiom node. + */ +const failable<axiom_node_t*> stringToAxiomNode(const string& s, const Axis2Context& ax) { + axiom_node_t* node = axiom_node_create_from_buffer(env(ax), const_cast<axis2_char_t*>(c_str(s))); + if (node == NULL) + return mkfailure<axiom_node_t*>(string("Couldn't convert XML to Axiom node: ") + axis2Error(ax)); + return node; +} + +/** + * Convert a list of values representing XML elements to an Axiom node. + */ +const failable<axiom_node_t*> valuesToAxiomNode(const list<value>& l, const Axis2Context& ax) { + const failable<list<string> > xml = writeXML(valuesToElements(l), false); + if (!hasContent(xml)) + return mkfailure<axiom_node_t*>(reason(xml)); + ostringstream os; + write(content(xml), os); + return stringToAxiomNode(str(os), ax); +} + +/** + * Convert an axiom node to a string. + */ +const failable<const string> axiomNodeToString(axiom_node_t* node, const Axis2Context& ax) { + const char* c = axiom_node_to_string(node, env(ax)); + if (c == NULL) + return mkfailure<const string>(string("Couldn't convert Axiom node to XML: ") + axis2Error(ax)); + const string s(c); + AXIS2_FREE(env(ax)->allocator, const_cast<char*>(c)); + return s; +} + +/** + * Convert an axiom node to a list of values representing XML elements. + */ +const failable<const list<value> > axiomNodeToValues(axiom_node_t* node, const Axis2Context& ax) { + const failable<const string> s = axiomNodeToString(node, ax); + if (!hasContent(s)) + return mkfailure<const list<value> >(reason(s)); + istringstream is(content(s)); + const failable<const list<value> > l = readXML(streamList(is)); + if (!hasContent(l)) + return l; + return elementsToValues(content(l)); +} + +/** + * Evaluate an expression in the form (soap-action-string, document, uri). Send the + * SOAP action and document to the Web Service at the given URI using Axis2. + */ +const failable<value> evalExpr(const value& expr, const Axis2Context& ax) { + debug(expr, "webservice::evalExpr::input"); + + // Extract func name and single argument + const value func(car<value>(expr)); + const list<value> param(cadr<value>(expr)); + const value uri(caddr<value>(expr)); + + // Create Axis2 client + axis2_svc_client_t *client = axis2_svc_client_create(env(ax), getenv("AXIS2C_HOME")); + if (client == NULL) + return mkfailure<value>("Couldn't create Axis2 client: " + axis2Error(ax)); + axis2_endpoint_ref_t *epr = axis2_endpoint_ref_create(env(ax), c_str(uri)); + axis2_options_t *opt = axis2_options_create(env(ax)); + axis2_options_set_to(opt, env(ax), epr); + axis2_options_set_action(opt, env(ax), (const axis2_char_t*)c_str(func)); + axis2_svc_client_set_options(client, env(ax), opt); + axis2_svc_client_engage_module(client, env(ax), AXIS2_MODULE_ADDRESSING); + + // Construct request Axiom node + const failable<axiom_node_t*> req = valuesToAxiomNode(param, ax); + if (!hasContent(req)) + return mkfailure<value>(reason(req)); + + // Call the Web service + axiom_node_t* res = axis2_svc_client_send_receive(client, env(ax), content(req)); + if (res == NULL) { + axis2_svc_client_free(client, env(ax)); + return mkfailure<value>("Couldn't invoke Axis2 service: " + axis2Error(ax)); + } + + // Parse result Axiom node + const failable<const list<value> > lval = axiomNodeToValues(res, ax); + if (!hasContent(lval)) + return mkfailure<value>(reason(lval)); + const value rval = content(lval); + debug(rval, "webservice::evalExpr::result"); + + // Cleanup + axis2_svc_client_free(client, env(ax)); + + return rval; +} + +} +} + +#endif /* tuscany_webservice_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/axis2.xml b/sca-cpp/branches/cpp-contrib/components/webservice/axis2.xml new file mode 100644 index 0000000000..ea9b6d2194 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/axis2.xml @@ -0,0 +1,148 @@ +<!-- + 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. +--> +<axisconfig name="Axis2/C"> + <!-- ================================================= --> + <!-- Parameters --> + <!-- ================================================= --> + <!-- Uncomment following to enable MTOM support globally --> + <!--parameter name="enableMTOM" locked="false">true</parameter--> + + <!-- Set the suitable size for optimum memory usage when sending large attachments --> + <!--parameter name="MTOMBufferSize" locked="false">10</parameter--> + <!--parameter name="MTOMMaxBuffers" locked="false">1000</parameter--> + <!--parameter name="EnableMTOMServiceCallback" locked="false">true</parameter--> + <!--parameter name="attachmentDIR" locked="false">/path/to/the/attachment/caching/dir/</parameter--> + <!--parameter name="MTOMCachingCallback" locked="false">/path/to/the/caching_callback</parameter--> + <!--parameter name="MTOMSendingCallback" locked="false">/path/to/the/sending_callback</parameter--> + + <!-- Enable REST --> + <parameter name="enableREST" locked="false">true</parameter> + + <!-- Uncomment following to persist op_ctx, useful with RM --> + <!--parameter name="persistOperationContext" locked="false">true</parameter--> + + <!--if you want to extract the service archive file and work with that please uncomment this--> + <!--else , it wont extract archive file or does not take into consideration if someone drop--> + <!--exploded directory into /service directory--> + <!--<parameter name="extractServiceArchive" locked="false">true</parameter>--> + + + <!-- ================================================= --> + <!-- Message Receivers --> + <!-- ================================================= --> + <!-- This is the Deafult Message Receiver for the Request Response style Operations --> + <!--messageReceiver mep="INOUT" class="axis2_receivers"/--> + + + <!-- ================================================= --> + <!-- Transport Ins --> + <!-- ================================================= --> + + <transportReceiver name="http" class="axis2_http_receiver"> + <parameter name="port" locked="false">6060</parameter> + <parameter name="exposeHeaders" locked="true">false</parameter> + </transportReceiver> + + <!--transportReceiver name="https" class="axis2_http_receiver"> + <parameter name="port" locked="false">6060</parameter> + <parameter name="exposeHeaders" locked="true">false</parameter> + </transportReceiver--> + + <!--transportReceiver name="tcp" class="axis2_tcp_receiver"> + <parameter name="port" locked="false">6060</parameter> + </transportReceiver--> + + + <!-- ================================================= --> + <!-- Transport Outs --> + <!-- ================================================= --> + + <transportSender name="http" class="axis2_http_sender"> + <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> + <parameter name="xml-declaration" insert="false"/> + <!--parameter name="Transfer-Encoding">chunked</parameter--> + <!--parameter name="HTTP-Authentication" username="" password="" locked="true"/--> + <!--parameter name="PROXY" proxy_host="127.0.0.1" proxy_port="8080" proxy_username="" proxy_password="" locked="true"/--> + </transportSender> + + <!-- Uncomment the following with appropriate parameters to enable the SSL transport sender. + Also make sure that the appropriate transport receiver is enabled above.--> + <!--transportSender name="https" class="axis2_http_sender"> + <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> + <parameter name="xml-declaration" insert="false"/> + </transportSender> + <parameter name="SERVER_CERT">/path/to/ca/certificate</parameter> + <parameter name="KEY_FILE">/path/to/client/certificate/chain/file</parameter> + <parameter name="SSL_PASSPHRASE">passphrase</parameter> + --> + + <!-- Uncomment this one with the appropriate papameters to enable the TCP transport Sender--> + <!--transportSender name="tcp" class="axis2_tcp_sender"> + <parameter name="PROTOCOL" locked="false">TCP</parameter> + <parameter name="xml-declaration" insert="false"/> + </transportSender--> + + + <!-- ================================================= --> + <!-- Global Modules --> + <!-- ================================================= --> + <!-- Comment this to disable Addressing --> + <module ref="addressing"/> + + <!-- Tuscany dispatcher module --> + <module ref="tuscany"/> + + <!--Configuring module , providing paramters for modules whether they refer or not--> + <!--<moduleConfig name="addressing">--> + <!--<parameter name="addressingPara" locked="false">N/A</parameter>--> + <!--</moduleConfig>--> + + <!-- ================================================= --> + <!-- Phases --> + <!-- ================================================= --> + <phaseOrder type="inflow"> + <!-- System pre defined phases --> + <phase name="Transport"/> + <phase name="PreDispatch"/> + <phase name="Dispatch"/> + <phase name="PostDispatch"/> + <!--phase name="Security"/--> + <!-- End system pre defined phases --> + <!-- After PostDispatch phase, module or service author can add any phase as required --> + <!-- User defined phases could be added here --> + <!--phase name="userphase1"/--> + </phaseOrder> + <phaseOrder type="outflow"> + <!-- User defined phases could be added here --> + <!--phase name="userphase1"/--> + <!--system predefined phase--> + <phase name="MessageOut"/> + <!--phase name="Security"/--> + </phaseOrder> + <phaseOrder type="INfaultflow"> + <!-- User defined phases could be added here --> + <!--phase name="userphase1"/--> + </phaseOrder> + <phaseOrder type="Outfaultflow"> + <!-- User defined phases could be added here --> + <!--phase name="userphase1"/--> + <phase name="MessageOut"/> + </phaseOrder> +</axisconfig> + diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/client-test.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/client-test.cpp new file mode 100644 index 0000000000..9030a77676 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/client-test.cpp @@ -0,0 +1,94 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test Web service component. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "element.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "perf.hpp" +#include "../../modules/http/curl.hpp" +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + + +bool testModAxis2() { + const Axis2Context ax; + + const value func = "http://ws.apache.org/axis2/c/samples/echoString"; + const list<value> arg = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + + (list<value>() + "text" + string("Hello World!"))); + + const failable<value> rval = evalExpr(mklist<value>(func, arg, string("http://localhost:8090/echo-listener")), ax); + assert(hasContent(rval)); + + const list<value> r = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + + (list<value>() + "text" + string("Hello World!"))); + assert(content(rval) == r); + + return true; +} + +bool testEval() { + http::CURLSession cs; + + const value func = "http://ws.apache.org/axis2/c/samples/echoString"; + const list<value> arg = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + + (list<value>() + "text" + string("Hello World!"))); + + const failable<value> rval = http::evalExpr(mklist<value>(func, arg), "http://localhost:8090/echo-client", cs); + assert(hasContent(rval)); + + const list<value> r = mklist<value>( + list<value>() + "ns1:echoString" + + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/c/samples")) + + (list<value>() + "text" + string("Hello World!"))); + assert(content(rval) == r); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::webservice::testModAxis2(); + tuscany::webservice::testEval(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/echo-test b/sca-cpp/branches/cpp-contrib/components/webservice/echo-test new file mode 100755 index 0000000000..e5cd1d9a9d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/echo-test @@ -0,0 +1,37 @@ +#!/bin/sh + +# 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. + +# Setup +axis2_prefix=`cat axis2c.prefix` +export AXIS2C_HOME=$axis2_prefix +axis2="$axis2_prefix/bin/axis2_http_server" +pwd=`pwd` +cd "$axis2_prefix/bin" +$axis2 & +cd $pwd +sleep 1 + +# Test +./axis2-test 2>/dev/null +rc=$? + +# Cleanup +kill `ps -f | grep -v grep | grep "$axis2" | awk '{ print $2 }'` +sleep 1 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/module.xml b/sca-cpp/branches/cpp-contrib/components/webservice/module.xml new file mode 100644 index 0000000000..8f6ba5018f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/module.xml @@ -0,0 +1,25 @@ +<!-- + 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. +--> +<module name="tuscany" class="axis2-dispatcher"> + <inflow> + <handler name="TuscanyDispatcher" class="axis2-dispatcher"> + <order phase="Dispatch"/> + </handler> + </inflow> +</module> diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/server-test b/sca-cpp/branches/cpp-contrib/components/webservice/server-test new file mode 100755 index 0000000000..8311b94220 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/server-test @@ -0,0 +1,49 @@ +#!/bin/sh + +# 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. + +# Setup +../../modules/http/httpd-conf tmp 8090 ../../modules/http/htdocs +../../modules/server/server-conf tmp +../../modules/server/scheme-conf tmp +./axis2-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite webservice.composite +EOF + +../../modules/http/httpd-start tmp + +axis2_prefix=`cat axis2c.prefix` +export AXIS2C_HOME=$axis2_prefix +axis2="$axis2_prefix/bin/axis2_http_server" +pwd=`pwd` +cd "$axis2_prefix/bin" +$axis2 & +cd $pwd +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +kill `ps -f | grep -v grep | grep "${axis2}" | awk '{ print $2 }'` +../../modules/http/httpd-stop tmp +sleep 2 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/server-test.scm b/sca-cpp/branches/cpp-contrib/components/webservice/server-test.scm new file mode 100644 index 0000000000..44e4eee92a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/server-test.scm @@ -0,0 +1,21 @@ +; 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. + +; Web service test case + +(define (echoString x) x) + diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/services.xml b/sca-cpp/branches/cpp-contrib/components/webservice/services.xml new file mode 100644 index 0000000000..0adf136f4f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/services.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<serviceGroup> +<service name="TuscanyService"> + <parameter name="ServiceClass" locked="xsd:false">axis2-service</parameter> + <operation name="execute"/> +</service> +</serviceGroup> diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/webservice-client.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/webservice-client.cpp new file mode 100644 index 0000000000..06db6c01b8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/webservice-client.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Web service client component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + +/** + * Apply a function provided by a remote Web service using Axis2. + */ +const failable<value> apply(const value& func, const list<value>& params) { + const Axis2Context ax; + + // Extract parameters + const value doc = car<value>(params); + const lambda<value(const list<value>&)> l = cadr<value>(params); + + // Call the URI property lambda function to get the configured URI + const value uri = l(list<value>()); + + // Evaluate using Axis2 + return evalExpr(mklist<value>(func, doc, uri), ax); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "start") + return tuscany::mkfailure<tuscany::value>(); + return tuscany::webservice::apply(func, cdr(params)); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/webservice-listener.cpp b/sca-cpp/branches/cpp-contrib/components/webservice/webservice-listener.cpp new file mode 100644 index 0000000000..2127ecf0df --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/webservice-listener.cpp @@ -0,0 +1,86 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Web service listener component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../../modules/http/httpd.hpp" +#include "axis2.hpp" + +namespace tuscany { +namespace webservice { + +/** + * Redirect an HTTP request to the Axis2/C HTTPD module. The given relay lambda function + * is stored in the HTTPD request, for later retrieval by the Axis2 service to relay the request + * to a target component. + */ +extern "C" { + extern module axis2_module; +} + +const value redirectToAxis2(const string& uri, request_rec* r, const value& relay) { + const failable<request_rec*, int> nr = httpd::internalRedirectRequest(uri, r); + if (!hasContent(nr)) + return value(reason(nr)); + ap_set_module_config(content(nr)->request_config, &axis2_module, const_cast<void*>((const void*)&relay)); + return value(httpd::internalRedirect(content(nr))); +} + +/** + * Handle an HTTP request. + */ +const failable<value> handle(const list<value>& params) { + + // Extract HTTPD request from the params + request_rec* r = httpd::request(car(params)); + httpdDebugRequest(r, "webservice::handle"); + + // Extract the relay lambda from the params and store it in the HTTPD request, + // for later retrieval by our Axis2 service + const value relay = cadr(params); + cout << "relay: " << &relay << endl; + + // Redirect HTTPD request to Mod-axis2 + if (r->args == NULL) + return redirectToAxis2(httpd::redirectURI("/axis2", string(r->uri)), r, relay); + return redirectToAxis2(httpd::redirectURI("/axis2", string(r->uri), string(r->args)), r, relay); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "handle") + return tuscany::webservice::handle(cdr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/components/webservice/webservice.composite b/sca-cpp/branches/cpp-contrib/components/webservice/webservice.composite new file mode 100644 index 0000000000..6d4055aad3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/components/webservice/webservice.composite @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="webservice-client"> + + <component name="webservice-client"> + <implementation.cpp path=".libs" library="libwebservice-client"/> + <property name="uri">http://localhost:9090/axis2/services/echo</property> + <service name="webservice-client"> + <t:binding.jsonrpc uri="echo-client"/> + </service> + </component> + + <component name="webservice-listener"> + <implementation.cpp path=".libs" library="libwebservice-listener"/> + <service name="webservice-listener"> + <t:binding.http uri="echo-listener"/> + </service> + <reference name="relay" target="echo"/> + </component> + + <component name="echo"> + <t:implementation.scheme script="server-test.scm"/> + <service name="echo"> + <t:binding.jsonrpc uri="echo"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/configure.ac b/sca-cpp/branches/cpp-contrib/configure.ac new file mode 100644 index 0000000000..0aaec2814d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/configure.ac @@ -0,0 +1,543 @@ +# 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. + +dnl run autogen.sh to generate the configure script. + +AC_PREREQ(2.59) +AC_INIT(tuscany-sca, 1.0, dev@tuscany.apache.org) +AC_CONFIG_MACRO_DIR([m4]) +AC_CANONICAL_SYSTEM +AM_CONFIG_HEADER(config.h) +AM_INIT_AUTOMAKE([tar-ustar]) +AC_PREFIX_DEFAULT(/usr/local/tuscany/sca) + +# Check for required programs. +AC_MSG_NOTICE([checking for programs]) +AC_PROG_CXX +AC_PROG_AWK +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL +AC_PATH_PROG(MEMCACHED, memcached, , ${PATH}) +if test "${MEMCACHED}" = ""; then + AC_MSG_ERROR([could not find memcached]) +fi + +# Check for running on Darwin. +AC_MSG_CHECKING([if running on Darwin]) +UNAME=`uname -s` +if test "${UNAME}" = "Darwin"; then + AC_DEFINE([IS_DARWIN], 1, [running on Darwin]) + AC_MSG_RESULT(yes) + AC_SUBST([libsuffix],[".dylib"]) + AM_CONDITIONAL([DARWIN], true) +else + AC_MSG_RESULT(no) + AC_SUBST([libsuffix],[".so"]) + AM_CONDITIONAL([DARWIN], false) +fi + +# Configure path to LIBCURL includes and lib. +AC_MSG_CHECKING([for libcurl]) +AC_ARG_WITH([libcurl], [AC_HELP_STRING([--with-libcurl=PATH], [path to installed libcurl [default=/usr]])], [ + LIBCURL_INCLUDE="${withval}/include" + LIBCURL_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + LIBCURL_INCLUDE="/usr/include" + LIBCURL_LIB="/usr/lib" + AC_MSG_RESULT(/usr) +]) +AC_SUBST(LIBCURL_INCLUDE) +AC_SUBST(LIBCURL_LIB) + +# Configure path to libxml2 includes and lib. +AC_MSG_CHECKING([for libxml2]) +AC_ARG_WITH([libxml2], [AC_HELP_STRING([--with-libxml2=PATH], [path to installed libxml2 [default=/usr]])], [ + LIBXML2_INCLUDE="${withval}/include/libxml2" + LIBXML2_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + LIBXML2_INCLUDE="/usr/include/libxml2" + LIBXML2_LIB="/usr/lib" + AC_MSG_RESULT(/usr) +]) +AC_SUBST(LIBXML2_INCLUDE) +AC_SUBST(LIBXML2_LIB) + +# Configure path to libmozjs includes and lib. +AC_MSG_CHECKING([for js-include]) +AC_ARG_WITH([js-include], [AC_HELP_STRING([--with-js-include=PATH], [path to installed SpiderMonkey include dir + [default=/usr/include/xulrunner-1.9.1.7/unstable]])], [ + JS_INCLUDE="${withval}" + AC_MSG_RESULT("${withval}") +], [ + JS_INCLUDE="/usr/include/xulrunner-1.9.1.7/unstable" + AC_MSG_RESULT(/usr/include/xulrunner-1.9.1.7/unstable) +]) +AC_MSG_CHECKING([for js-lib]) +AC_ARG_WITH([js-lib], [AC_HELP_STRING([--with-js-lib=PATH], [path to installed SpiderMonkey lib dir [default=/usr/lib/xulrunner-1.9.1.7]])], [ + JS_LIB="${withval}" + AC_MSG_RESULT("${withval}") +], [ + JS_LIB="/usr/lib/xulrunner-1.9.1.7" + AC_MSG_RESULT(/usr/lib/xulrunner-1.9.1.7) +]) +AC_SUBST(JS_INCLUDE) +AC_SUBST(JS_LIB) + +# Configure path to Apache APR and HTTPD includes and libs. +AC_MSG_CHECKING([for apr]) +AC_ARG_WITH([apr], [AC_HELP_STRING([--with-apr=PATH], [path to installed Apache APR [default=/usr/local/apache2]])], [ + APR_INCLUDE="${withval}/include" + APR_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + APR_INCLUDE="/usr/local/apache2/include" + APR_LIB="/usr/local/apache2/lib" + AC_MSG_RESULT(/usr/local/apache2/lib) +]) +AC_SUBST(APR_INCLUDE) +AC_SUBST(APR_LIB) + +AC_MSG_CHECKING([for httpd]) +AC_ARG_WITH([httpd], [AC_HELP_STRING([--with-httpd=PATH], [path to installed Apache HTTPD [default=/usr/local/apache2]])], [ + HTTPD_PREFIX="${withval}" + HTTPD_INCLUDE="${withval}/include" + AC_MSG_RESULT("${withval}") +], [ + HTTPD_PREFIX="/usr/local/apache2" + HTTPD_INCLUDE="/usr/local/apache2/include" + AC_MSG_RESULT(/usr/local/apache2/lib) +]) +AC_SUBST(HTTPD_PREFIX) +AC_SUBST(HTTPD_INCLUDE) + +# Configure TUSCANY_SCACPP path variable. +TUSCANY_SCACPP=`echo "${TUSCANY_SCACPP}"` +if test "${TUSCANY_SCACPP}" = ""; then + pwd=`pwd` + AC_SUBST([TUSCANY_SCACPP], ["${pwd}"]) +fi + +# Initialize default GCC C++ and LD options. +cxxflags="" +ldflags="${LDFLAGS}" +defaultlibs="${LIBS}" + +# Configure default includes. +cxxflags="${cxxflags} ${INCLUDES} -I. -I${TUSCANY_SCACPP}/kernel -I${APR_INCLUDE} -I${LIBXML2_INCLUDE} -I${JS_INCLUDE} -I${LIBCURL_INCLUDE}" + +# Check for libraries required by all modules and add them to LD options. +AC_MSG_NOTICE([checking for required libraries]) +LIBS="-L${APR_LIB} ${defaultlibs}" +AC_CHECK_LIB([apr-1], [apr_pool_initialize], [AC_MSG_NOTICE([found])], [AC_MSG_ERROR([couldn't find a suitable libapr-1, use --with-apr=PATH])]) +ldflags="${ldflags} -L${APR_LIB} -R${APR_LIB} -lapr-1 -laprutil-1" + +# Check for libraries only required by some modules and add their search path to LD options. +LIBS="-L${LIBCURL_LIB} ${defaultlibs}" +AC_CHECK_LIB([curl], [curl_global_init], [], [AC_MSG_ERROR([couldn't find a suitable libcurl, use --with-libcurl=PATH])]) +LIBS="-L${JS_LIB} ${defaultlibs}" +AC_CHECK_LIB([mozjs], [JS_NewContext], [], [AC_MSG_ERROR([couldn't find a suitable libmozjs, use --with-js-lib=PATH])]) +LIBS="-L${LIBXML2_LIB} ${defaultlibs}" +AC_CHECK_LIB([xml2], [xmlInitParser], [], [AC_MSG_ERROR([couldn't find a suitable libxml2, use --with-libxml2=PATH])]) +ldflags="${ldflags} -L${LIBCURL_LIB} -R${LIBCURL_LIB} -L${JS_LIB} -R${JS_LIB} -L${LIBXML2_LIB} -R${LIBXML2_LIB}" + +# Check for required header files. +AC_MSG_NOTICE([checking for header files]) +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([string.h sys/time.h]) + +# Check for typedefs, structures, and compiler characteristics. +AC_MSG_NOTICE([checking for typedefs, structures, and compiler characteristics]) +AC_HEADER_STDBOOL +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T + +# Check for required library functions. +AC_MSG_NOTICE([checking for library functions]) +AC_CHECK_FUNCS([gettimeofday select]) + +# Enable debugging and compile-time warnings. +AC_MSG_CHECKING([whether to compile with debugging and compile-time warnings]) +AC_ARG_ENABLE(maintainer-mode, [AS_HELP_STRING([--enable-maintainer-mode], [compile with debugging and compile-time warnings [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_maintainer_mode=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_maintainer_mode}" = "true"; then + cxxflags="${cxxflags} -D_DEBUG -O0 -ggdb -g3 -Werror -Wall -Wextra -Wno-ignored-qualifiers -Winit-self -Wmissing-include-dirs -Wcast-qual -Wcast-align -Wwrite-strings -Wpointer-arith -Wconversion -Waddress -Wlogical-op -Wredundant-decls -std=c++0x -fmessage-length=0" + ldflags="${ldflags} -pg" + AM_CONDITIONAL([WANT_MAINTAINER_MODE], true) + AC_DEFINE([WANT_MAINTAINER_MODE], 1, [compile with debugging and compile-time warnings]) +else + cxxflags="${cxxflags} -O3 -std=c++0x -fmessage-length=0" + AM_CONDITIONAL([WANT_MAINTAINER_MODE], false) +fi + +# Enable profiling with gprof. +AC_MSG_CHECKING([whether to compile with profiling]) +AC_ARG_ENABLE(profiling, [AS_HELP_STRING([--enable-profiling], [compile with profiling [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_profiling=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_profiling}" = "true"; then + cxxflags="${cxxflags} -pg" + ldflags="${ldflags} -pg" + AM_CONDITIONAL([WANT_PROFILING], true) + AC_DEFINE([WANT_PROFILING], 1, [compile with profiling]) +else + AM_CONDITIONAL([WANT_PROFILING], false) +fi + +# Enable multi-threading support. +AC_MSG_CHECKING([whether to compile for multi-threaded execution]) +AC_ARG_ENABLE(threads, [AS_HELP_STRING([--enable-threads], [compile for multi-threaded execution [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_threads=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_threads}" = "true"; then + AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([couldn't find a suitable libpthread])]) + LIBS="${defaultlibs}" + cxxflags="${cxxflags} -D_REENTRANT" + ldflags="${ldflags} -lpthread" + AM_CONDITIONAL([WANT_THREADS], true) + AC_DEFINE([WANT_THREADS], 1, [compile for multi-threaded execution]) +else + AM_CONDITIONAL([WANT_THREADS], false) +fi + +# Configure exuberant ctags. +TAGSFILE="`pwd`/tags" +AC_SUBST([CTAGSFLAGS], ["${CTAGSFLAGS} --c++-kinds=+p --fields=+iaS --extra=+q --append --tag-relative=yes -f ${TAGSFILE}"]) + +# Enable Doxygen documentation. +AC_MSG_CHECKING([whether to build Doxygen documentation]) +AC_ARG_ENABLE(doxygen, [AS_HELP_STRING([--enable-doxygen], [build Doxygen documentation [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_doxygen=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_doxygen}" = "true"; then + AC_PATH_PROG(DOXYGEN, doxygen, , ${PATH}) + if test "${DOXYGEN}" = ""; then + AC_MSG_ERROR([could not find doxygen]) + fi + AM_CONDITIONAL([WANT_DOXYGEN], true) + AC_DEFINE([WANT_DOXYGEN], 1, [build Doxygen documentation]) +else + AM_CONDITIONAL([WANT_DOXYGEN], false) +fi + +# Configure path to Python 2.6 includes and lib. +AC_MSG_CHECKING([for python]) +AC_ARG_WITH([python], [AC_HELP_STRING([--with-python=PATH], [path to installed Python 2.6 [default=/usr]])], [ + PYTHON_INCLUDE="${withval}/include" + PYTHON_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + PYTHON_INCLUDE="/usr/include" + PYTHON_LIB="/usr/lib" + AC_MSG_RESULT(/usr) +]) +AC_SUBST(PYTHON_INCLUDE) +AC_SUBST(PYTHON_LIB) + +# Enable Python 2.6 support. +AC_MSG_CHECKING([whether to enable Python support]) +AC_ARG_ENABLE(python, [AS_HELP_STRING([--enable-python], [enable Python support [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_python=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_python}" = "true"; then + LIBS="-L${PYTHON_LIB} ${default_LIBS}" + AC_CHECK_LIB([python2.6], [Py_Initialize], [], [AC_MSG_ERROR([couldn't find a suitable libpython2.6, use --with-python=PATH])]) + AM_CONDITIONAL([WANT_PYTHON], true) + AC_DEFINE([WANT_PYTHON], 1, [enable Python support]) +else + AM_CONDITIONAL([WANT_PYTHON], false) +fi + +# Configure path to Java includes and lib. +AC_MSG_CHECKING([for java]) +AC_ARG_WITH([java], [AC_HELP_STRING([--with-java=PATH], [path to installed Java [default=/usr/lib/jvm/default-java]])], [ + JAVA_PREFIX="${withval}" + JAVA_INCLUDE="${withval}/include" + JAVA_LIB="${withval}/jre/lib/i386" + JAVAC="${withval}/bin/javac" + JAR="${withval}/bin/jar" + AC_MSG_RESULT("${withval}") +], [ + JAVA_PREFIX="/usr/lib/jvm/default-java" + JAVA_INCLUDE="/usr/lib/jvm/default-java/include" + JAVA_LIB="/usr/lib/jvm/default-java/jre/lib/i386" + JAVAC="/usr/lib/jvm/default-java/bin/javac" + JAR="/usr/lib/jvm/default-java/bin/jar" + AC_MSG_RESULT(/usr/lib/jvm/default-java) +]) +AC_SUBST(JAVA_PREFIX) +AC_SUBST(JAVA_INCLUDE) +AC_SUBST(JAVA_LIB) +AC_SUBST(JAVAC) +AC_SUBST(JAR) + +# Enable Java support. +AC_MSG_CHECKING([whether to enable Java support]) +AC_ARG_ENABLE(java, [AS_HELP_STRING([--enable-java], [enable Java support [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_java=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_java}" = "true"; then + LIBS="-L${JAVA_LIB} -L${JAVA_LIB}/server ${default_LIBS}" + AC_CHECK_LIB([java], [JNI_CreateJavaVM], [], [AC_MSG_ERROR([couldn't find a suitable libjava, use --with-java=PATH])], [-ljvm -lverify]) + AC_MSG_CHECKING([for javac]) + if test -x "${JAVAC}"; then + AC_MSG_RESULT("${JAVAC}") + else + AC_MSG_ERROR([couldn't find a suitable javac tool, use --with-java=PATH]) + fi + AC_MSG_CHECKING([for jar]) + if test -x "${JAR}"; then + AC_MSG_RESULT("${JAR}") + else + AC_MSG_ERROR([couldn't find a suitable jar tool, use --with-java=PATH]) + fi + AM_CONDITIONAL([WANT_JAVA], true) + AC_DEFINE([WANT_JAVA], 1, [enable Java support]) +else + AM_CONDITIONAL([WANT_JAVA], false) +fi + +# Configure path to Apache Axis2C includes and lib. +AC_MSG_CHECKING([for axis2c]) +AC_ARG_WITH([axis2c], [AC_HELP_STRING([--with-axis2c=PATH], [path to installed Apache Axis2C [default=/usr/local/axis2c]])], [ + AXIS2C_PREFIX="${withval}" + AXIS2C_INCLUDE="${withval}/include/axis2-1.6.0" + AXIS2C_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + AXIS2C_PREFIX="/usr/local/axis2c" + AXIS2C_INCLUDE="/usr/local/axis2c/include/axis2-1.6.0" + AXIS2C_LIB="/usr/local/axis2c/lib" + AC_MSG_RESULT(/usr/local/axis2c) +]) +AC_SUBST(AXIS2C_PREFIX) +AC_SUBST(AXIS2C_INCLUDE) +AC_SUBST(AXIS2C_LIB) + +# Enable Web service component. +AC_MSG_CHECKING([whether to enable the Web service component]) +AC_ARG_ENABLE(webservice, [AS_HELP_STRING([--enable-webservice], [enable Web service component [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_webservice=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_webservice}" = "true"; then + LIBS="-L${AXIS2C_LIB} ${default_LIBS}" + AC_CHECK_LIB([axis2_engine], [axis2_svc_client_create], [], [AC_MSG_ERROR([couldn't find a suitable libaxis2_engine, use --with-axis2c=PATH])]) + AM_CONDITIONAL([WANT_WEBSERVICE], true) + AC_DEFINE([WANT_WEBSERVICE], 1, [enable Web service component]) +else + AM_CONDITIONAL([WANT_WEBSERVICE], false) +fi + +# Enable Store component. +AC_MSG_CHECKING([whether to enable the Store component]) +AC_ARG_ENABLE(store, [AS_HELP_STRING([--enable-store], [enable Store component [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_store=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_store}" = "true"; then + AM_CONDITIONAL([WANT_STORE], true) + AC_DEFINE([WANT_STORE], 1, [enable Store component]) +else + AM_CONDITIONAL([WANT_STORE], false) +fi + +# Configure path to Apache Qpid/C++ includes and lib. +AC_MSG_CHECKING([for qpidc]) +AC_ARG_WITH([qpidc], [AC_HELP_STRING([--with-qpidc=PATH], [path to installed Apache Qpid/C++ [default=/usr/local]])], [ + QPIDC_PREFIX="${withval}" + QPIDC_INCLUDE="${withval}/include" + QPIDC_LIB="${withval}/lib" + AC_MSG_RESULT("${withval}") +], [ + QPIDC_PREFIX="/usr/local" + QPIDC_INCLUDE="/usr/local/include" + QPIDC_LIB="/usr/local/lib" + AC_MSG_RESULT(/usr/local) +]) +AC_SUBST(QPIDC_PREFIX) +AC_SUBST(QPIDC_INCLUDE) +AC_SUBST(QPIDC_LIB) + +# Enable Queue component. +AC_MSG_CHECKING([whether to enable the Queue component]) +AC_ARG_ENABLE(queue, [AS_HELP_STRING([--enable-queue], [enable Queue component [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_queue=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_queue}" = "true"; then + if test "${want_threads}" != "true"; then + AC_MSG_ERROR([--enable-queue requires multi-threading, use --enable-threads]) + fi + LIBS="-L${QPIDC_LIB} ${default_LIBS}" + AC_CHECK_LIB([qpidclient], [_init], [], [AC_MSG_ERROR([couldn't find a suitable libqpidclient, use --with-qpidc=PATH])]) + AM_CONDITIONAL([WANT_QUEUE], true) + AC_DEFINE([WANT_QUEUE], 1, [enable Queue component]) +else + AM_CONDITIONAL([WANT_QUEUE], false) +fi + +# Configure path to Libstrophe includes and lib. +AC_MSG_CHECKING([for libstrophe]) +AC_ARG_WITH([libstrophe], [AC_HELP_STRING([--with-libstrophe=PATH], [path to libstrophe source [default=${HOME}/libstrophe]])], [ + LIBSTROPHE_INCLUDE="${withval}" + LIBSTROPHE_LIB="${withval}" + AC_MSG_RESULT("${withval}") +], [ + LIBSTROPHE_INCLUDE="${HOME}/libstrophe" + LIBSTROPHE_LIB="${HOME}/libstrophe" + AC_MSG_RESULT(${HOME}/libstrophe) +]) +AC_SUBST(LIBSTROPHE_INCLUDE) +AC_SUBST(LIBSTROPHE_LIB) + +# Enable Chat component. +AC_MSG_CHECKING([whether to enable the Chat component]) +AC_ARG_ENABLE(chat, [AS_HELP_STRING([--enable-chat], [enable Chat component [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + want_chat=true + ;; + esac ], +[ AC_MSG_RESULT(no)]) +if test "${want_chat}" = "true"; then + if test "${want_threads}" != "true"; then + AC_MSG_ERROR([--enable-chat requires multi-threading, use --enable-threads]) + fi + LIBS="-L${LIBSTROPHE_LIB} ${default_LIBS}" + AC_CHECK_LIB([strophe], [xmpp_initialize], [], [AC_MSG_ERROR([couldn't find a suitable libstrophe, use --with-libstrophe=PATH])], [-lexpat -lssl -lresolv]) + AM_CONDITIONAL([WANT_CHAT], true) + AC_DEFINE([WANT_CHAT], 1, [enable Chat component]) +else + AM_CONDITIONAL([WANT_CHAT], false) +fi + +# Configure GCC C++ and LD options. +AC_SUBST([CXXFLAGS], ["${cxxflags}"]) +AC_SUBST([LDFLAGS], ["${ldflags}"]) +LIBS="${defaultlibs}" + +AC_CONFIG_FILES([Makefile + kernel/Makefile + modules/Makefile + modules/scheme/Makefile + modules/atom/Makefile + modules/json/Makefile + modules/scdl/Makefile + modules/http/Makefile + modules/python/Makefile + modules/java/Makefile + modules/server/Makefile + components/Makefile + components/cache/Makefile + components/log/Makefile + components/chat/Makefile + components/queue/Makefile + components/store/Makefile + components/webservice/Makefile + samples/Makefile + test/Makefile + test/store-scheme/Makefile + test/store-cpp/Makefile + test/store-python/Makefile + test/store-java/Makefile + doc/Makefile + doc/Doxyfile + ]) +AC_OUTPUT + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/Axis2CWSExtension.html b/sca-cpp/branches/cpp-contrib/contrib/doc/Axis2CWSExtension.html new file mode 100644 index 0000000000..17b9676650 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/Axis2CWSExtension.html @@ -0,0 +1,498 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("css/maven-base.css"); +@import url("css/maven-theme.css"); + </STYLE> + + <LINK HREF="css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native - Axis2/C Web Services Extension</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native - Axis2/C Web Services Extension</H1> + + <P>This document describes the installation, deployment and use of the Axis2/C Web Service + support in the Apache Tuscany SCA Native runtime. + </P> + <P>The WS service code is based on <A HREF="http://ws.apache.org/axis2/c">Apache + Axis2/C version 0.96</A> and allows SCA components to be invoked via Web + Service calls. + </P> + <P>WS service currently supports Document/literal Wrapped style Web Services + only. There are also restrictions about the parameter and return types of the + operations in SCA components that can be exposed as Web Services, see below + for more details. + </P> + <P>See the <A HREF="http://www.osoa.org/display/Main/Service+Component+Architecture+Specifications">SCA + Web Service binding specification</A> for more details about SCA Web + Service support. + </P> + <P>Also, see the <A HREF="../samples/GettingStarted.html">samples</A> for various + demonstrations of the use of the binding.ws service support. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#requirements">System Requirements</A></LI> + <LI><A HREF="#install">Installing the Tuscany SCA Axis2/C Web Services Extension..</A> + <UL> + <LI><A HREF="#linuxbin">..from the binary release on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxsrc">..from the source release on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbin">..from the binary release on Windows</A></LI> + <LI><A HREF="#winsrc">..from the source release on Windows</A></LI> + </UL></LI> + <LI><A HREF="#deploy">Deploying the Tuscany Web Service support to Axis2/C..</A> + <UL> + <LI><A HREF="#autodeploy">..automatically via scripts</A></LI> + <LI><A HREF="#mandeploy">..manually</A></LI> + </UL></LI> + <LI><A HREF="#deployhttpd">Deploying Axis2/C to the Apache HTTPD server</A></LI> + <LI><A HREF="#use">Defining an SCA Composite with a WS service</A></LI> + <LI><A HREF="#maptable">XML Schema Type to C++ Type Mapping</A></LI> + <LI><A HREF="#creatingwsdl">Notes on creating WSDL</A></LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="requirements"><H2>System Requirements</H2></A> + + <P>In order to install and use the Tuscany SCA Axis2/C Web Services Extension there are some + extra requirements in addition to the <A HREF="../GettingStarted.html#requirements">Tuscany + SCA requirements</A>:</P> + <TABLE CLASS="bodyTable"> + + <TBODY> + <TR CLASS="a"> + <TD><B>Software</B></TD> + <TD><B>Download Link</B></TD> + </TR> + <TR CLASS="b"> + <TD>Axis2/C version 0.96</TD> + + <TD> + <A HREF="http://ws.apache.org/axis2/c/download.cgi" + TARGET="_blank">http://ws.apache.org/axis2/c/download.cgi</A><BR/> + Please download and follow the installation instructions. Ensure you can run + the Axis2/C samples. + </TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A NAME="install"><H2>Installing the Tuscany SCA Axis2/C Extension</H2></A> + <A NAME="linuxbin"><H3>Getting the Tuscany SCA Axis2/C Extension working with the binary release on Linux and Mac OS X</H3></A> + <OL> + <LI>Ensure the AXIS2C_HOME environment variable is set to the Axis2/C installation</LI> + <LI>Deploy the Axis2/C Web Services extension by following the <A HREF="#deploy">deployment steps</A></LI> + </OL> + <A NAME="linuxsrc"><H3>Getting the Tuscany SCA Axis2/C Extension working with the source release on Linux and Mac OS X</H3></A> + <OL> + <LI>You will need the Tuscany SCA and SDO libraries - follow the instructions + <A HREF="../GettingStarted.html">here</A> to build the SCA libraries and default extensions</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C installation></LI> + </UL></LI> + <LI>Build the Axis2/C source only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir></LI> + <LI>./configure --prefix=$TUSCANY_SCACPP --enable-wsbinding --enable-cpp=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide a --prefix configure option, it will by default install into + /usr/local/tuscany/sca</LI> + </OL> + + <A NAME="winbin"><H3>Getting the Tuscany SCA Axis2/C Extension working with the binary release on Windows</H3></A> + <OL> + <LI>Ensure the AXIS2C_HOME environment variable is set to the Axis2/C installation</LI> + <LI>Deploy the Axis2/C Web Services extension by following the <A HREF="#deploy">deployment steps</A></LI> + </OL> + <A NAME="winsrc"><H3>Getting the Tuscany SCA Axis2/C Extension working with the source release on Windows</H3></A> + <OL> + <LI>Unzip the supplied source zip file</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C installation></LI> + </UL></LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. The build command + will call vcvars32 to set the environment. Ensure the directory containing this is on your path. + This will be where you installed the compiler.</LI> + <LI>Build the source: + <UL> + <LI>cd <to where you unzipped the source></LI> + <LI>build</LI> + </UL> + This will build all the projects and put the required output into the 'deploy' directory<BR/><BR/> + Alternatively, open the workspace at <tuscany_sca_install_dir>/projects/tuscany_sca/tuscany_sca.dsw + in Visual Studio 6 or at at <tuscany_sca_install_dir>/projectsvc7/tuscany_sca/tuscany_sca.sln + in Visual Studio 7.1 - you can build projects individually + or build the samples to rebuild all the projects</LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="deploy"><H2>Deploying the Tuscany Web Service support to Axis2/C</H2></A> + <A NAME="autodeploy"><H3>Deploying via scripts</H3></A> + <P>Tuscany provides simple shell scripts to deploy the Web Service support to Axis2/C. + However, the script <STRONG>will overwrite your Axis2/C axis.xml file</STRONG>, so if you + have altered your axis2.xml from the default provided by the Axis2/C distribution, it is + recommended that you follow the <A HREF="#mandeploy">manual deployment</A> steps + outlined below. + </P> + <P>To automatically deploy Tuscany Web Service support to Axis2/C on Linux and Mac OS X: + <OL> + <LI>The AXIS2C_HOME environment variable is required: + <UL> + <LI>set AXIS2C_HOME=<path to axis2c version 0.96></LI> + </UL></LI> + <LI>Use the following command sequence to run the deploy script: + <UL> + <LI>cd <tuscany_sca_install_dir>/extensions/ws/service</LI> + <LI>./deploy.sh</LI> + </UL> + </LI> + </OL> + </P> + <P>To automatically deploy Tuscany Web Service support to Axis2/C on Windows: + <OL> + <LI>The AXIS2C_HOME environment variable is required: + <UL> + <LI>export AXIS2C_HOME=<path to axis2c version 0.96></LI> + </UL></LI> + <LI>Use the following command sequence to run the deploy script: + <UL> + <LI>cd <tuscany_sca_install_dir>\extensions\ws\service</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </P> + + + <A NAME="mandeploy"><H3>Deploying manually</H3></A> + <P>To deploy Tuscany Web Service support to Axis2/C manually, use the following steps: + </P> + <OL> + <LI> + Linux and Mac OS X: + <OL> + <LI>cd <axis2c version 0.96>/services</LI> + <LI>ln -sf <tuscany_sca_install_dir>/extensions/ws/service/services/tuscany</LI> + <LI>cd <axis2c version 0.96>/modules</LI> + <LI>ln -sf <tuscany_sca_install_dir>/extensions/ws/service/modules/tuscany</LI> + </OL> + Windows: + <OL> + <LI>Create a <axis2c version 0.96>\services\tuscany directory + </LI> + <LI>Copy all the files in <tuscany_sca_install_dir>\extensions\ws\service\services\tuscany + to the directory created above + </LI> + <LI>Create a <axis2c version 0.96>\modules\tuscany directory + </LI> + <LI>Copy all the files in <tuscany_sca_install_dir>\extensions\ws\service\modules\tuscany + to the directory created above + </LI> + </OL> + </LI> + <LI>Edit the <axis2c version 0.96>/axis2.xml file to add a <ref module="tuscany"> + element. This will register the above module. E.g.: + <PRE>... + <!-- ================================================= --> + <!-- Global Modules --> + <!-- ================================================= --> + <!-- Comment this to disable Addressing --> + <module ref="addressing"/> + + <module ref="tuscany"/> + +... </PRE> + </LI> + + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="deployhttpd"><H2>Deploying Axis2/C to the Apache HTTPD server</H2></A> + <P>Follow the <A HREF="http://ws.apache.org/axis2/c/docs/installationguide.html#installing-apache2">Axis2/C documentation</A> + to deploy Axis2/C to Apache HTTPD. Also see the <A HREF="../samples/HTTPDBigBank/README.html">HTTPDBigBank</A> + sample, which demonstrates running Axis2/C under Apache HTTPD.</P> + </DIV> + + + <DIV CLASS="section"> + <A NAME="use"><H2>Defining an SCA Composite with a WS service</H2></A> + + <P>In this section we will use the Calculator sample as a worked example. + The Calculator code and files can be found at + <tuscany_sca_install_dir>samples/CppCalculator. + </P> + <P>Pre-requisites: + <UL> + <LI>At least one working component within a composite and solution + composite. The component(s) can be implemented in C++, Ruby or Python. + If this includes C++ components, the SCAGEN generated Proxy and Wrapper + classes and the component class files must have been compiled into a + .dll or .so library. The *.composite and *.componentType files must + also be available and working. + </LI> + </UL> + </P> + <OL> + <LI>Optionally, create the WSDL that defines the interface of your SCA component. See the + table <A HREF="#maptable">XML Schema Type to C++ Type Mapping</A> and + <A HREF="#creatingwsdl">Notes on creating WSDL</A> below + for mapping the parameters and return types of the component operations to XML + schema types in the WSDL. This file will need to be accessible from the component, + so place it in the same directory as the component or in a subdirectory. + <BR/> + See the <tuscany_sca_install_dir>/samples/CppCalculator/sample.calculator/Calculator.wsdl + file as an example. + <BR/> + If you do not provide a WSDL file describing the service interface then the service will + accept any incoming document/literal wrapped XML request that matches an operation on the + target service (the wrapper element name and types of the sub-elements must match the operation + name and its parameter types). Additionally, if the target component is a Python or Ruby + scripting component, it will accept any parameter type so you can pretty much pass whatever + data you want, as long at the incoming XML request matches to an operation name with the + correct number of parameters on the target service. + </LI> + <LI>Add a service definition to the component .composite file. If you have created a WSDL + definition, set the interface.wsdl interface attribute to the namespace and port name + specified in the WSDL, in the form: "<namespace>#wsdl.interface(<port-name>)". + Link a reference from this service definition to your + component, give the service a name and set the multiplicity if required. + <BR/> + E.g. for the Calculator component, based on the Calculator.wsdl file: + <PRE><service name="CalculatorService"> + <interface.wsdl interface="http://sample/calculator#wsdl.interface(Calculator)"/> + <binding.ws/> + <reference>CalculatorComponent/CalculatorService</reference> +</service></PRE> + If the Calculator.wsdl file were not included, the service definition would simply + be as follows: + <PRE><service name="CalculatorService"> + <binding.ws/> + <reference>CalculatorComponent/CalculatorService</reference> +</service></PRE> + </LI> + <LI>You are now ready to start the Axis2/C HTTP server. Remember you will need to have the + TUSCANY_SCACPP, TUSCANY_SDOCPP and AXIS2C_HOME environment variables set, + as well as the SCA and SDO bin directories and the Axis2/C lib directory on + your PATH on Windows or the SCA, SDO and Axis2/C lib directories on + your LD_LIBRARY_PATH on Linux and your DYLD_LIBRARY_PATH on Mac OS X. + You will also need to set the TUSCANY_SCACPP_SYSTEM_ROOT + and TUSCANY_SCACPP_DEFAULT_COMPONENT environment variables to the + path to your SCA component directory structure and the default component respectively. + E.g. on Windows run the following commands: + <UL> + <LI>set TUSCANY_SCACPP=C:/tuscany_sca </LI> + <LI>set TUSCANY_SDOCPP=C:/tuscany_sdo </LI> + <LI>set AXIS2C_HOME=C:/axis2c-bin-0.96-win32 </LI> + <LI>set PATH=%PATH%;C:/tuscany_sca/bin;C:/tuscany_sdo/bin;C:/axis2c-bin-0.96-win32/lib</LI> + <LI>set TUSCANY_SCACPP_SYSTEM_ROOT=C:/tuscany_sca/samples/CppCalculator/deploy </LI> + <LI>set TUSCANY_SCACPP_DEFAULT_COMPONENT=sample.calculator.CalculatorComponent </LI> + <LI>cd %AXIS2C_HOME%/bin/ </LI> + <LI>./axis2_http_server.exe </LI> + </UL> + </LI> + <LI>Optionally, enable Tuscany logging by setting the TUSCANY_SCACPP_LOGGING + environment variable with the level you wish to log at (0 for minimal + logging, up to 9 for more detailed logging) and the TUSCANY_SCACPP_LOG + environment variable to define the file to log to (if this is not set, + logging will go to the console). E.g. on Windows run the following + commands: + <UL> + <LI>set TUSCANY_SCACPP_LOGGING=5 </LI> + <LI>set TUSCANY_SCACPP_LOG=C:/tuscany/mylogfile.txt</LI> + </UL> + </LI> + </OL> + <P>Your component should now be exposed as an Axis2/C Web Service, via the WS + service you created. See the Axis2/C documentation for writing clients to + invoke the Web Service, or you can use any other Web Service client platform + (e.g. <A HREF="http://ws.apache.org/axis2">Axis2 for Java</A>), or you can + invoke your service from another SCA application by using Tuscany's WS + reference support. + </P> + + </DIV> + + <DIV CLASS="section"> + <A name="maptable"><H2>XML Schema Type to C++ Type Mapping</H2></A> + <P>To help define the WSDL that describes the interface of your component, the + table below lists how incoming XML data in Web Service messages is mapped to + C++ types used in the parameters and return types of your component operations. + </P> + <P>This lists the only C++ types that can currently be used on the operations of a + component exposed as a Web Service. For other types, use an SDO DataObject to + wrap the data, and define that wrapping as a complexType in the WSDL. See the + <A HREF="http://www.osoa.org/display/Main/SDO+-+Previously+Published+Specifications">SDO + specifications</A> for the C++ types that SDO supports. + </P> + <TABLE CLASS="bodyTable"> + <TBODY> + <TR CLASS="a"> + <TD><STRONG>XML Schema Type</STRONG></TD> + <TD><STRONG>C++ Type</STRONG></TD> + </TR> + <TR CLASS="b"> + <TD>string</TD> + <TD>std::string</TD> + </TR> + <TR CLASS="a"> + <TD>int</TD> + <TD>long</TD> + </TR> + <TR CLASS="b"> + <TD>integer</TD> + <TD>long</TD> + </TR> + <TR CLASS="a"> + <TD>short</TD> + <TD>short</TD> + </TR> + <TR CLASS="b"> + <TD>float</TD> + <TD>float</TD> + </TR> + <TR CLASS="a"> + <TD>double</TD> + <TD>long double</TD> + </TR> + <TR CLASS="b"> + <TD>boolean</TD> + <TD>bool</TD> + </TR> + <TR CLASS="a"> + <TD>hexBinary</TD> + <TD>char*</TD> + </TR> + <TR CLASS="b"> + <TD>base64Binary</TD> + <TD>char*</TD> + </TR> + <TR CLASS="a"> + <TD>byte</TD> + <TD>char</TD> + </TR> + <TR CLASS="b"> + <TD>complexType</TD> + <TD>commonj::sdo::DataObjectPtr</TD> + </TR> + <TR CLASS="a"> + <TD>any</TD> + <TD>commonj::sdo::DataObjectPtr with OpenDataObjectType</TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A name="creatingwsdl"><H2>Notes on creating WSDL</H2></A> + <P>Currently only Document/literal Wrapped style Web Services are supported by + WS EntryPoint, support for RPC style Web Services is planned for future + releases. + </P> + <P>See <A HREF="http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/">this article</A> + for an explanation of Document/literal Wrapped style WSDL and Web Services + </P> + <P>Document/literal Wrapped services require that the operation name is used as + the name of the incoming element that wraps the operation parameters. Additionally, + operation parameter and return messages that are defined in the WSDL must be + XML Schema elements containing a complexType. + </P> + <P>For example, a component operation defined in C++ as: + <PRE>long myOperation(std::string arg1, short arg2, DataObjectPtr arg3);</PRE> + will need to be described in WSDL with messages like: + <PRE><wsdl:message name="myOperationRequestMsg"> + <wsdl:part element="tns:myOperation" name="myOperationRequestPart"/> +</wsdl:message> +<wsdl:message name="myOperationResponseMsg"> + <wsdl:part element="tns:myOperationResponse" name="myOperationResponsePart"/> +</wsdl:message></PRE> + and will need an XML schema to define the types like: + <PRE><xsd:element name="myOperation"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="arg1" type="xsd:string" minOccurs="1"/> + <xsd:element name="arg2" type="xsd:short" minOccurs="1"/> + <xsd:element name="arg3" minOccurs="1"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="dataObjectFloatData" type="xsd:float"/> + <xsd:element name="dataObjectStringData" type="xsd:string"/> + <xsd:element name="dataObjectIntData" type="xsd:int"/> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + </xsd:sequence> + </xsd:complexType> +</xsd:element> + +<xsd:element name="myOperationResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" type="xsd:int" minOccurs="1"/> + </xsd:sequence> + </xsd:complexType> +</xsd:element></PRE> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>First place to look is at the Tuscany FAQ at + <A HREF="http://incubator.apache.org/tuscany/faq.html" + TARGET="_blank">http://incubator.apache.org/tuscany/faq.html</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://incubator.apache.org/tuscany/mail-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/CPPGeneratorTool.txt b/sca-cpp/branches/cpp-contrib/contrib/doc/CPPGeneratorTool.txt new file mode 100644 index 0000000000..c004799791 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/CPPGeneratorTool.txt @@ -0,0 +1,362 @@ + +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. + + + +Tuscany SCA For C++ - scagen C++ generator tool +=============================================== + + +See cpp/build.txt in the parent directory or the cpp/sca/INSTALL file +for build instructions. + +Building the tools +------------------ + +NOTE: this is built and installed by the build step above. + +Currently, there is only one tool: "scagen". It can be built using the +ant build script at \tuscany\cpp\sca\tools\scagen\build.xml. +The default target "all" will build the java jars, documentation, +scripts and a zip file of the whole thing. This is all the ant +build tasks apart from "test" which runs all the junit tests. + +The ant build script can be altered to add the junit tests to the +default target. Replace the line + +<property name="junit.jar.folder" value="${basedir}/lib" /> + +The "test" task was not included in "all" as it requires a +junit jar file to run. This jar is available here: +http://www.junit.org/index.htm testing has been done with +Junit version 3.8.1. + +Running the scagen tool +----------------------- + +The scagen tool user interface is quite basic in this initial release. +It can be run from the scagen.jar file using "java -jar scagen.jar" +or from small scripts - scagen.bat for Windows and scagen.sh for Unix. +The parameters are: + -dir <the path to the sca composite root directory> + -output <the path to an output directory where the generated file will be placed> + +e.g. + scagen -dir c:\mycomposites\composite1 -output c:\mycomposites\bld\composite1 + +What scagen does +---------------- + +The input directory passed to the scagen tools as +the -dir parameter method is taken to be the SCA +composite root directory. All the sca.composite and .fragment +files in that directory are inspected to resolve all +the <component/> elements within them. + +Each <component/> element found is inspected +to see if it has a <implementation.cpp/> element within it. + +Each <implementation.cpp/> element should have a +header attribute that represents a C++ header file +that contains function prototypes for the C++ +implementation of the service. An optional class +attribute can be used to select one class if more than +one that is present in the header file. The default +class is the one with the same name as the header file. +The tool will verify that the implementation header +contains an appropriate class prototype. + +The directory that contains the implementation header +should also contain a matching .componentType file for +the equivalent SCA component. So for example, a +MyServiceImpl.h file would have a corresponding +MyServiceImpl.componentType file in the same directory. + +Each componentType file is inspected for <service/> +and <reference/> elements. For each <service/> element +that is found that contains a <interface.cpp/> element +within it, + +the header attribute of the <interface.cpp/> is taken +as the filename of the C++ interface header for the +SCA service. This C++ header file is opened and used +as a means for specifying the SCA service resulting +in an appropriate wrapper and proxy being generated +for this service interface. Both method bodies and h +eaders are generated in the given output directory. +The processing of a <reference/> element is the same +except that only a proxy header and implementation +re generated. + + +Getting started with the code +----------------------------- + +The following is a list of tasks that are performed by the scagen tool +for each task we will describe technically how it is accomplished and +the location of the code that can be inspected/changed to alter the +behaviour. + +Here are the tasks listed, below is a paragraph for each one: + + o (Overall structure of the code) + o Walking the input directory + o Scanning the .composite and .fragment files + o finding the C++ implementation headers + o finding/checking the classname in the C++ implementation headers + o find the matching .componentTemplate files + o going into the componentTemplate files to extract the interface header filenames + o going into the interface header files and parsing them to extract the method signatures + into a network of objects we can inspect. + o taking all the meta data stored as objects and building a DOM for XSLT processing + o using XSLT to produce a proxy header + o using XSLT to produce a proxy implementation + o using XSLT to produce a wrapper header + o using XSLT to produce a wrapper implementation + + +Overall structure of the code +----------------------------- + +There are two packages org.apache.tuscany.sca.cpp.tools.common and +org.apache.tuscany.sca.cpp.tools.services. The ...common package is +taken from some existing code that was also contributed to axis that +was used to parse C++ code and do various tasks like insert trace. +This code was repackaged and shipped as a tuscany package but there +has been a desire not to change it significantly from the equivalent +org.apache.axis.tools.common package to leave the door open for +future convergence. + +Where the ...common package has been amended (for example to cope with +namespaces better or the provision of an Options.reset method to reset a static +variable and enable the tuscany junit tests to run independently) these +have been flagged with a "Tuscany" comment. The ...common package basically +provides two functions - 1) the ability to go into a directory (see DirectoryTree.java) +and process files that fit a particular filter (e.g. "*.hpp") by passing them to +implementer of the FileActor Interface (see the classes "Headers" for the +actor that processes C++ headers and "XMLFileActor" for the file actor that +processes the .componentType and sca.composite/fragment files.) + +The ...services package contains the majority of code written afresh for the +scagen tool including the subclasses of XMLFileActor (see ComponentTypeFileHandler.java +and CompositeOrFragmentFileHandler.java) that are the classes that tie this +package to the ...common package and which are called by the +DirectoryTree walker. + +Walking the composite root input directory +--------------------------------------- + +The main method of the scagen class creates an instance of +"DirectoryScanner" and registers with it a file handler of +type "CompositeOrFragmentFileHandler" for all files that end +in ".composite" or ".fragment". On calling the "walkTree" method +on the scanner it will in turn call the actOnFile method on the +CompositeOrFragmentFileHandler for appropriate files. + +Scanning the .composite and .fragment files +---------------------------------------- + +The scanning of these files by the respective "CompositeOrFragmentFileHandler" +and "ComponentTypeFileHandler" is mostly handled by the superclass +"XMLFileActor". This class will recursively goes through the whole +XML file and considers the name of the XML element it finds. +"XMLFileActor" contains a map of element names to element handlers +that will "flatten out" the structure of the XML file "above" the +level of node we are interested in. + +So for example the ComponentTypeFile handler sets up the handlers +map as follows: + + GenericDomNodeHandler gdnh = new GenericDomNodeHandler(); + handlers.put("componentType", gdnh); + handlers.put("interface.cpp", gdnh); + ServiceDomNodeHandler sdnh = new ServiceDomNodeHandler(); + handlers.put("service", sdnh); + + ReferenceDomNodeHandler rdnh = new ReferenceDomNodeHandler(); + handlers.put("reference", rdnh); + +The majority of processing done by these DomNOdeHandlers is to +place the attributes and values discovered into another map that +maps an (static version of) the XPath of a value to the value itself. +So for example "/componentType/service/interface.cpp/@header" might contain +the current ("root to here") value of the header attribute of the current +interface. + +Particular handlers for the "leaves" of this tree +such as ServiceDomNodeHandler and ReferenceDomNodeHandler +can then consume these values from the map without having +to be concerned with the actual names of things, +like the service name, appearing in the key. It should be +understood though that there are multiple values placed in the map +for one "key" as the processing works its way through the +XML tree. For example the processing of a second component will +overlay its data over the same keys as the first component. +(After "wiping" the appropriate subtree.) + +Finding the C++ implementation headers +-------------------------------------- + +The "/composite/component/implementation.cpp/@header" and +is used to key into the name of the implementation header +and this is opened directly and passed to the +actOnFileMethod of a Headers object from the ...common package +bypassing the DirectoryScanner code. The path is relative to +the given (-dir option) composite root directory. + +Finding/checking the classname in the C++ implementation headers +----------------------------------------------------------------- + +This implementation header is not used to define the +methods of the SCA service but rather is opened to check + any given implementation.cpp/@class attribute +(or find out the name of the implementation class +in the header if this is not specified in the XML. This +is done using the same method that later parses the interface +C++ headers into java objects - we just them inspect the +class attribute of the "Signature" objects that represent the methods +we find in the header. + +Find the matching .componentType files +------------------------------------------ + +By SCA convention we go to the same directory as the implementation +files and look for the XXX.componentType files with the same name. +A instance of the ComponentDOMNodeHandler handles the data in the +Component Element and pre-creates a ComponentTypeFileHandler that +will eventually be called to process the .componentType file. This +object receives a number of "setParameter" calls to poke into it +matadata that is available prior/outside the the actual .componentType +file it will read. + +Go into the componentType files to extract the interface header filenames +----------------------------------------------------------------------------- + +We open up the .componentTemplateFiles with exactly the same +mechanism as we read the sca.composite/fragment file (by creating +a DOM and descending through it this time using a ComponentTypeFileHandler that it +has had various data values ( e.g. the implementation class and namespace used later) +poked into it. The ComponentTypeFileHandler itself has individual +handlers for the service and reference XML/DOM element/nodes +that is comes across (ServiceDomNodeHandler and ReferenceDomNodeHandler +respectively). Each these handlers will pull out the name of +a C++ interface header and use it to resolve the interface of the +SCA Service. + +Parsing the interface header files for signatures +------------------------------------------------- + +The Service/Reference DOM Node hander both call the + ServicesGenerator.handleInterfaceHeader(parameters, true); +method, the second parameter is used to differentiate +the call source as we don't need wrapper files for +SCA references (just proxies). + +The ServicesGenerator uses the Headers file actor from +the ...common package to create a List of Signature +objects that describe the interface methods in the C++ +header. + +Take all the meta data stored as objects and build a DOM +-------------------------------------------------------- +We now have a List of Signature objects and a map that +represents the flattened information that we have pulled +from the XML files in the ServiceGenerator class. +We call a "createDOMofMethods" method +to consolidate all this information into one DOM +(this task should be split into more than one method as the +signature/parameter list of the method is too large). + +Use XSLT to produce the output files (Proxy/Wrapper headers and Implementations) +-------------------------------------------------------------------------------- + +The ServicesGenerator.handleInterfaceHeader(parameters, forReference); +method closes of with the code: + + createProxyCPPFromDom(outputDir, dom); + createProxyHeaderFromDom(outputDir, dom); + + if (!forReference) { + createWrapperCPPFromDom(outputDir, dom); + createWrapperHeaderFromDom(outputDir, dom); + } + + +Each of the create methods sets up the output +file name and a different XSLT transform and calls +"createOutputFromDom" to transform/filter the data in the +"model" that is held in our DOM of the data to a particular +"view" as expressed in the C++ output file. + +The four XSLT style sheets are in rough order of the output +file and this corresponds very roughly to a depth first descent +of the DOM tree so, for example, we could have in a stylesheet: + +... + void* </xsl:text> + <xsl:value-of select="$class"/><xsl:text>::newImplementation() + { + return new </xsl:text><xsl:value-of select="../@implClass"/><xsl:text><xsl:text>(target); + } + +which would be output as: + + void* MyClassImpl_MyClass_Proxy::newImplementation() + { + return new MyClassImpl(target) + } + +given appropriate valies for $class and "../@implClass" and +$class might be defined to be: +xsl:variable name="clazz"> + <xsl:value-of select="../@implClass"/> + <xsl:text>_</xsl:text> + <xsl:value-of select="../@nameOfServiceOrReference"/> + <xsl:text>_Proxy</xsl:text> +</xsl:variable> + +giving "MyClassImpl_MyClass_Proxy" + +The stylesheets can be found in the xsl subdirectory of the +org.apache.tuscany.sca.cpp.tools.services package. + +Unit Testing Scagen Code Changes +-------------------------------- + +The junit unit test + /tuscany/cpp/sca/tools/scagen/ + junit/org/apache/tuscany/sca/cpp/tools/junit/TestAllCompositesTest.java + +will dynamically look for all the subdirectores of the directory +path given by TuscanyTestCase.junit_composites and run the scagen +tool on them as if they were composites roots. + +By convention an "expected_output" directory is located +(see the CVS tree or the test program) and the actual +and expected results compared. This testcase is thus a +good first/basic regression test for any changes. + +New test cases can thus be added without having to write +any new junit java code by by creating new SCA composites and +the associated expected Scagen output - perhaps by using the tool +initially and checking the output is satisfactory before copying +it to the expected output directory at: + +/tuscany/cpp/sca/tools/scagen/junit/testoutput/<composite>/expected_output +where input data is taken from +/tuscany/cpp/sca/tools/scagen/junit/testinput/composites/<composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/CppExtension.html b/sca-cpp/branches/cpp-contrib/contrib/doc/CppExtension.html new file mode 100644 index 0000000000..6e7420a9d4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/CppExtension.html @@ -0,0 +1,430 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("css/maven-base.css"); +@import url("css/maven-theme.css"); + </STYLE> + + <LINK HREF="css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native - Creating C++ SCA Components</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native - C++ Extension</H1> + <P>The Tuscany C++ extension allows C++ classes to be used as components in + SCA composites and as clients that can invoke SCA services. + </P> + <P>This document describes how to build and install the C++ extension and create and run SCA + components in Tuscany SCA Native milestone release 3. + </P> + <P>See the <A HREF="http://www.osoa.org/display/Main/Service+Component+Architecture+Specifications">SCA + C++ Client and Implementation specification</A> for more details about the SCA C++ + programming model. + </P> + <P>See <A HREF="../samples/CppCalculator/README.html">CppCalculator</A> or + <A HREF="../samples/CppBigBank/README.html">CppBigBank</A> for samples that + demonstrate the use of C++ components + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#requirements">System Requirements</A></LI> + <LI><A HREF="#install">Installing the Tuscany SCA C++ Extension..</A> + <UL> + <LI><A HREF="#linuxbin">..from the binary release on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxsrc">..from the source release on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbin">..from the binary release on Windows</A></LI> + <LI><A HREF="#winsrc">..from the source release on Windows</A></LI> + </UL></LI> + <LI><A HREF="#components">Creating and deploying an SCA C++ Component</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + <DIV CLASS="section"> + <A NAME="requirements"><H2>System Requirements</H2></A> + + <P>In order to install and use the Tuscany SCA C++ Extension there are some + extra requirements in addition to the <A HREF="../GettingStarted.html#requirements">Tuscany + SCA requirements</A>:</P> + <TABLE CLASS="bodyTable"> + + <TBODY> + <TR CLASS="a"> + <TD><B>Software</B></TD> + <TD><B>Download Link</B></TD> + </TR> + <TR CLASS="b"> + <TD>Java SDK 1.4 or later</TD> + <TD><A HREF="http://java.sun.com/javase/downloads/index.jsp" + TARGET="_blank">http://java.sun.com/javase/downloads</A><BR/> + For building and running the SCAGEN code generation tool, which is used when developing + Tuscany SCA C++ components. Please download and follow the installation instructions</TD> + </TR> + <TR CLASS="a"> + <TD>Apache Ant 1.6 or later</TD> + <TD><A HREF="http://ant.apache.org" TARGET="_blank">http://ant.apache.org</A><BR/> + For building the SCAGEN code generation tool. This is only required when building + the C++ extension from a source distribution of Tuscany SCA Native. + Please download and follow the installation instructions</TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A NAME="install"><H2>Installing the Tuscany SCA C++ Extension</H2></A> + <A NAME="linuxbin"><H3>Getting the Tuscany SCA C++ Extension working with the binary release on Linux and Mac OS X</H3></A> + <OL> + <LI>Add the <tuscany_sca_install_dir>/extensions/cpp/lib directory to the PATH environment variable</LI> + </OL> + <A NAME="linuxsrc"><H3>Getting the Tuscany SCA C++ Extension working with the source release on Linux and Mac OS X</H3></A> + <OL> + <LI>You will need the Tuscany SCA kernel and SDO libraries - follow the instructions + <A HREF="../GettingStarted.html">here</A> to build the SCA libraries and default extensions</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL></LI> + <LI>Build the C++ source only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir></LI> + <LI>./configure --prefix=$TUSCANY_SCACPP --enable-cpp --enable-wsbinding=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide a --prefix configure option, it will by default install into + /usr/local/tuscany/sca</LI> + </OL> + + <A NAME="winbin"><H3>Getting the Tuscany SCA C++ Extension working with the binary release on Windows</H3></A> + <OL> + <LI>Add the <tuscany_sca_install_dir>/extensions/cpp/lib directory to the PATH environment variable</LI> + </OL> + <A NAME="winsrc"><H3>Getting the Tuscany SCA C++ Extension working with the source release on Windows</H3></A> + <OL> + <LI>Unzip the supplied source zip file</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. The build command + will call vcvars32 to set the environment. Ensure the directory containing this is on your path. + This will be where you installed the compiler.</LI> + <LI>Build the source: + <UL> + <LI>cd <to where you unzipped the source></LI> + <LI>build</LI> + </UL> + This will build all the projects and put the required output into the 'deploy' directory<BR/><BR/> + Alternatively, open the workspace at <tuscany_sca_install_dir>/projects/tuscany_sca/tuscany_sca.dsw + in Visual Studio 6 or at at <tuscany_sca_install_dir>/projectsvc7/tuscany_sca/tuscany_sca.sln + in Visual Studio 7.1 - you can build projects individually + <LI>Set the TUSCANY_SCACPP environment variable to point to the 'deploy' directory that was just created</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="components"><H2>Creating and deploying an SCA C++ Component</H2></A> + <P>Each SCA C++ component needs: + </P> + <UL> + <LI>A service header file that defines the operations that can be invoked on the + component + </LI> + <LI>An implementation header file that defines the implementation and extends + the service header file + </LI> + <LI>A C++ implementation of the service that implements the operations defined + in the service header file + </LI> + <LI>Proxy and wrapper header and implementation files generated by the Tuscany + C++ SCAGEN tool + </LI> + <LI>A service definition in a .componentType file + </LI> + <LI>An SCDL component definition within an SCDL composite file. Usually this + composite file will contain multiple components configured and assembled together. + </LI> + </UL> + <P>Once these items are in place for each component in your composite, you will need to + deploy this composite to your SCA system. In this release we are + using the SCA recursive composition model to do this. You simply create another + SCDL component definition in a separate composite file that will represent the composite + you created above in the SCA system. Follow the steps below to see each of these items + being created and used. + </P> + <P>In this section we will use the Calculator sample as a worked example. + The Calculator code and files can be found at samples/CppCalculator and has been + developed further than the details specified below. In the interests of + readability, the example used below takes the simplest path. + </P> + <OL> + <LI>Create the service header file that defines the operations your component + will implement. E.g. Calculator.h contains the following:<BR/> + <PRE>#ifndef CALCULATOR_H +#define CALCULATOR_H +class Calculator +{ +public: + virtual float add(float arg1, float arg2) = 0; + virtual float sub(float arg1, float arg2) = 0; + virtual float mul(float arg1, float arg2) = 0; + virtual float div(float arg1, float arg2) = 0; +}; + +#endif</PRE> + </LI> + <LI>Create the implementation header file that extends the service header file. + E.g. CalculatorImpl.h contains the following:<BR/> + <PRE>#ifndef CALCULATORIMPL_H +#define CALCULATORIMPL_H + +#include "Calculator.h" + +class CalculatorImpl : public Calculator +{ +public: + CalculatorImpl(); + virtual ~CalculatorImpl(); + + // Calculator interface + virtual float add(float arg1, float arg2); + virtual float sub(float arg1, float arg2); + virtual float mul(float arg1, float arg2); + virtual float div(float arg1, float arg2); +}; + +#endif</PRE> + </LI> + <LI>Create the implementation for the component based on the implementation + header file. E.g. CalculatorImpl.cpp contains the following code:<BR/> + <PRE>#include "CalculatorImpl.h" +#include <stdio.h> + +CalculatorImpl::CalculatorImpl() +{ +} + +CalculatorImpl::~CalculatorImpl() +{ +} + +// Calculator interface +float CalculatorImpl::add(float arg1, float arg2) +{ + float result = arg1 + arg2; + + printf("CalculatorImpl::add %f + %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::sub(float arg1, float arg2) +{ + float result = arg1 - arg2; + printf("CalculatorImpl::sub %f - %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::div(float arg1, float arg2) +{ + float result = arg1 / arg2; + printf("CalculatorImpl::div %f / %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::mul(float arg1, float arg2) +{ + float result = arg1 * arg2; + printf("CalculatorImpl::mul %f * %f = %f\n", arg1, arg2, result); + return result; +}</PRE> + </LI> + <LI>Create the componentType file for your component to define the service that + your component provides. The file must be named after your implementation + class and specifies the name of the service and the service header file + (which describes the service operations). E.g. CalculatorImpl.componentType + contains the following XML:<BR/> + <PRE><componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="CalculatorService"> + <interface.cpp header="Calculator.h"/> + </service> + +</componentType></PRE> + </LI> + <LI>Create a sample.calculator.composite file for your composite and define your + component within it. The component definition specifies the implementation + library to use (a .dll file on Windows, a .so file on Linux and a .dylib file on Mac OS X) and the + implementation header file (which describes the implementation class). Component + properties and references to other services can also be specified here. E.g. the + Calculator sample.calculator.composite file contains the following XML:<BR/> + <PRE><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> + + <component name="CalculatorComponent"> + <implementation.cpp library="Calculator" header="CalculatorImpl.h"/> + </component> + +</composite></PRE> + </LI> + <LI>Generate the proxy and wrapper classes and header files using the SCAGEN + tool. These classes are used by the Tuscany SCA C++ runtime to enable + service implementations to be invoked from a client or another component. + Run the SCAGEN tool, specifying the directory where your header files, + sca.composite and componentType file are and the directory where you + want the generated files to be placed. E.g. on Windows, the + following command is run from the directory where Tuscany SCA is deployed:<BR/> + <PRE>./extensions/cpp/bin/scagen.bat -dir ./samples/CppCalculator/sample.calculator -output ./samples/CppCalculator/sample.calculator</PRE> + which produces the following files: + <UL> + <LI>CalculatorImpl_CalculatorService_Proxy.h</LI> + <LI>CalculatorImpl_CalculatorService_Proxy.cpp</LI> + <LI>CalculatorImpl_CalculatorService_Wrapper.h</LI> + <LI>CalculatorImpl_CalculatorService_Wrapper.cpp</LI> + </UL> + </LI> + <LI>Compile and link the code that has been written and generated. This will + produce a .dll or .so library file. The name should match the library name + specified in the sample.calculator.composite file. + </LI> + <LI>Create the sample.calculator.solution.composite file and define the Calculator composite + as a component within it. This is used to include the Calculator composite in the SCA system + and should specify the composite name used in the sample.calculator.composite file. + E.g. the Calculator sample.calculator.solution.composite + file contains the following XML:<BR/> + <PRE><composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.solution"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + +</composite></PRE> + </LI> + <LI>Deploy the various files into the SCA directory structure, as follows: + <UL> + <LI><deploy_root>/CompositeName/CompositeName.composite </LI> + <LI><deploy_root>/CompositeName/Implementation.componentType </LI> + <LI><deploy_root>/CompositeName/Implementation.dll (or .so on Linux and .dylib on Mac OS X) </LI> + <LI><deploy_root>/SolutionName.composite </LI> + </UL> + E.g. for the Calculator sample the structure is: + <UL> + <LI>samples/CppCalculator/deploy/sample.calculator/Calculator.h </LI> + <LI>samples/CppCalculator/deploy/sample.calculator/CalculatorImpl.h </LI> + <LI>samples/CppCalculator/deploy/sample.calculator/sample.calculator.composite </LI> + <LI>samples/CppCalculator/deploy/sample.calculator/CalculatorImpl.componentType</LI> + <LI>samples/CppCalculator/deploy/sample.calculator/Calculator.dll </LI> + <LI>samples/CppCalculator/deploy/sample.calculator.solution.composite</LI> + </UL> + </LI> + <LI>Your component, composite and subsystem are now ready to be invoked. Create a + client that will call the service. E.g. the Calculator client (in the + CalculatorClient.cpp file) contains code similar to the following:<BR/> + <PRE>try +{ + // Locate the service + CompositeContext myContext = CompositeContext::getCurrent(); + Calculator *calcService = (Calculator*) myContext.locateService("CalculatorComponent/CalculatorService"); + if (calcService == 0) + { + cout << "calculator_client: Unable to find Calculator service" << endl; + } + else + { + float result = calcService->add(arg1, arg2); + cout << "calculator_client add(" << arg1 << "," << arg2 << ") = " << result << endl; + } +} +catch (ServiceRuntimeException& ex) +{ + cout << "calculator_client: Error whilst invoking Tuscany: " << + ex.getMessageText() << endl; +} +</PRE> + </LI> + <LI>Compile, link and run the client that has been created. You should + (hopefully!) see your component invoked. Remember you will need to have the + TUSCANY_SCACPP and TUSCANY_SDOCPP environment variables set, + as well as the SCA and SDO bin directories on + your PATH on Windows or the SCA and SDO lib directories on your LD_LIBRARY_PATH on Linux + and your DYLD_LIBRARY_PATH on Mac OS X. You will also need to set the TUSCANY_SCACPP_SYSTEM_ROOT + and TUSCANY_SCACPP_DEFAULT_COMPONENT environment variables to the + path to your SCA component directory structure and the default component respectively. + TUSCANY_SCACPP_SYSTEM_ROOT is the directory where the SCA runtime will look for any + .composite files and TUSCANY_SCACPP_DEFAULT_COMPONENT is the name of the base component + to be used by SCA clients or containers when finding services - this component must be + an instance of a composite (i.e. contain an <implementation.composite> element). + <BR/> + E.g. on Windows run the following commands: + <UL> + <LI>set TUSCANY_SCACPP=C:/tuscany_sca </LI> + <LI>set TUSCANY_SDOCPP=C:/tuscany_sdo </LI> + <LI>set PATH=%PATH%;C:/tuscany_sca/bin;C:/tuscany_sdo/bin </LI> + <LI>set TUSCANY_SCACPP_SYSTEM_ROOT=C:/tuscany_sca/samples/CppCalculator/deploy</LI> + <LI>set TUSCANY_SCACPP_DEFAULT_COMPONENT=sample.calculator.CalculatorComponent</LI> + <LI>./calculator_client.exe </LI> + </UL> + </LI> + <LI>Optionally, enable Tuscany logging by setting the TUSCANY_SCACPP_LOGGING + environment variable with the level you wish to log at (0 for minimal + logging, up to 9 for more detailed logging) and the TUSCANY_SCACPP_LOG + environment variable to define the file to log to (if this is not set, + logging will go to the console). E.g. on Windows run the following + commands: + <UL> + <LI>set TUSCANY_SCACPP_LOGGING=5 </LI> + <LI>set TUSCANY_SCACPP_LOG=C:/tuscany/mylogfile.txt</LI> + </UL> + </LI> + </OL> + </DIV> + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>First place to look is at the Tuscany FAQ at + <A HREF="http://incubator.apache.org/tuscany/faq.html" + TARGET="_blank">http://incubator.apache.org/tuscany/faq.html</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://incubator.apache.org/tuscany/mail-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/PythonExtension.html b/sca-cpp/branches/cpp-contrib/contrib/doc/PythonExtension.html new file mode 100644 index 0000000000..f51af0d6c9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/PythonExtension.html @@ -0,0 +1,281 @@ +<!-- + 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. +--> + + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("css/maven-base.css"); +@import url("css/maven-theme.css"); + </STYLE> + + <LINK HREF="css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native - Python Extension</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native - Python Extension</H1> + + <P>The Tuscany Python extension allows Python scripts to be used as components in + SCA composites and as clients that can invoke SCA services. + </P> + <P>The following samples demonstrate use of the Python extension:</P> + <UL> + <LI><A HREF="../samples/PythonCalculator/README.html">PythonCalculator</A></LI> + <LI><A HREF="../samples/PythonWeatherForecast/README.html">PythonWeatherForecast</A></LI> + <LI><A HREF="../samples/RestCustomer/README.html">RestCustomer</A></LI> + <LI><A HREF="../samples/RestYahoo/README.html">RestYahoo</A></LI> + <LI><A HREF="../samples/AlertAggregator/README.html">AlertAggregator</A></LI> + </UL> + + </DIV> + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#requirements">System Requirements</A></LI> + <LI><A HREF="#install">Installing the Tuscany SCA Python Extension..</A> + <UL> + <LI><A HREF="#linuxbin">..from the binary release on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxsrc">..from the source release on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbin">..from the binary release on Windows</A></LI> + <LI><A HREF="#winsrc">..from the source release on Windows</A></LI> + </UL></LI> + <LI><A HREF="#pm">The Tuscany Python Programming Model</A></LI> + <UL> + <LI><A HREF="#clients">Clients</A></LI> + <LI><A HREF="#components">SCA Components</A></LI> + <LI><A HREF="#references">Component references</A></LI> + <LI><A HREF="#properties">Component properties</A></LI> + </UL> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + <DIV CLASS="section"> + <A NAME="requirements"><H2>System Requirements</H2></A> + + <P>In order to install and use the Tuscany SCA Python Extension there are some + extra requirements in addition to the <A HREF="../GettingStarted.html#requirements">Tuscany + SCA requirements</A>:</P> + <TABLE CLASS="bodyTable"> + + <TBODY> + <TR CLASS="a"> + <TD><B>Software</B></TD> + <TD><B>Download Link</B></TD> + </TR> + <TR CLASS="b"> + <TD>Python version 2.5</TD> + + <TD> + <A HREF="http://www.python.org/download/" + TARGET="_blank">http://www.python.org/download/</A><BR/> + Please download and follow the installation instructions. + </TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A NAME="install"><H2>Installing the Tuscany SCA Python Extension</H2></A> + <A NAME="linuxbin"><H3>Getting the Tuscany SCA Python Extension working with the binary release on Linux and Mac OS X</H3></A> + <OL> + <LI>Ensure the Python libraries are available on the PATH environment variable</LI> + <LI>Add the <tuscany_sca_install_dir>/extensions/python/lib directory to the PYTHONPATH environment variable</LI> + </OL> + <A NAME="linuxsrc"><H3>Getting the Tuscany SCA Python Extension working with the source release on Linux and Mac OS X</H3></A> + <OL> + <LI>You will need the Tuscany SCA and SDO libraries - follow the instructions + <A HREF="../GettingStarted.html">here</A> to build the SCA libraries and default extensions</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + <LI>PYTHON_LIB=<path to Python libraries></LI> + <LI>PYTHON_INCLUDE=<path to Python includes></LI> + <LI>PYTHON_VERSION=<name of the Python version><BR/> + Note: If you are using a default installation of Python 2.5 these are usually:<BR/> + PYTHON_LIB=/usr/lib<BR/> + PYTHON_INCLUDE=/usr/include/python2.5<BR/> + PYTHON_VERSION=python2.5<BR/></LI> + </UL></LI> + <LI>Build the Python source only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir></LI> + <LI>./configure --prefix=$TUSCANY_SCACPP --enable-python --enable-cpp=no --enable-wsbinding=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide a --prefix configure option, it will by default install into + /usr/local/tuscany/sca</LI> + </OL> + + <A NAME="winbin"><H3>Getting the Tuscany SCA Python Extension working with the binary release on Windows</H3></A> + <OL> + <LI>Ensure the Python libraries are available on the PATH environment variable</LI> + <LI>Add the <tuscany_sca_install_dir>\extensions\python\bin directory to the PYTHONPATH environment variable</LI> + </OL> + <A NAME="winsrc"><H3>Getting the Tuscany SCA Python Extension working with the source release on Windows</H3></A> + <OL> + <LI>Unzip the supplied source zip file</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + <LI>PYTHON_HOME=<path to installed Python> + </UL></LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. The build command + will call vcvars32 to set the environment. Ensure the directory containing this is on your path. + This will be where you installed the compiler.</LI> + <LI>Build the source: + <UL> + <LI>cd <to where you unzipped the source></LI> + <LI>build</LI> + </UL> + This will build all the projects and put the required output into the 'deploy' directory<BR/><BR/> + Alternatively, open the workspace at <tuscany_sca_install_dir>/projects/tuscany_sca/tuscany_sca.dsw + in Visual Studio 6 or at at <tuscany_sca_install_dir>/projectsvc7/tuscany_sca/tuscany_sca.sln + in Visual Studio 7.1 - you can build projects individually + <LI>Set the TUSCANY_SCACPP environment variable to point to the 'deploy' directory that was just created</LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="pm"><H2>The Tuscany Python Programming Model</H2></A> + <P>This section will explain + the Tuscany Python programming model to help you to write your own Python + components and clients. + </P> + <P>The Tuscany Python component and client support comes from a Python extension + package that is built in the <tuscany_sca_install_dir>/extensions/python/bin + directory on Windows and <tuscany_sca_install_dir>/extensions/python/lib on + Linux and Mac OS X. This package must be made available to your Python environment by + adding this directory to your PYTHONPATH environment variable. This makes the sca + module available for use by clients and allows references and properties to be + used in your Python components + </P> + <A NAME="clients"><H3>Clients</H3></A> + <P>Using the sca module, a Python client can search for an SCA service with: + </P> +<PRE>import sca + +calculator = sca.locateservice("CalculatorComponent/CalculatorService") +</PRE> + <P>This finds the component and service as defined in the composite and componentType + side files and returns a proxy object that can call the SCA service. You can then + simply call a business method on "calculator", like this: + </P> +<PRE>result = calculator.add(12.3, 45.6)</PRE> + </P> + <A NAME="components"><H3>Components</H3></A> + <P>Python component implementations are standard Python scripts, where class-level + functions or module-level functions can be invoked by the Tuscany runtime. To + use a Python component implementation, use the implementation.python element in + your .composite file. For example, the following snippet will use the Python script + at path/to/module/PythonModuleName.py, where the path is relative to the location of + the composite file: + </P> +<PRE><implementation.python module="PythonModuleName" path="path/to/module"/> +</PRE> + <P>To instantiate a class instance and use a class-level function, the Python class must + have a default constructor (an __init__ method that takes no arguments besides + 'self') and the class attribute must be defined in the implementation.python element + in your composite, like so: + </P> +<PRE><implementation.python module="PythonModuleName" path="path/to/module" class="PythonClassName"/> +</PRE> + <P>Tuscany currently supports passing simple types (strings, ints, floats, etc) as well + as Service Data Objects into and out of Ruby components. Service Data Objects are represented + in Python as xml.etree.ElementTree Element objects (see the <A HREF="../samples/PythonWeatherForecast/README.html"> + PythonWeatherForecast sample</A> for a demonstration). + </P> + <P>You can write a componentType file for your Python component, but you don't have to - the Python + extension automatically exposes a service and adds references and properties to your Python component + implementation classes based on the information in the composite file. + </P> + + <A NAME="references"><H3>References</H3></A> + <P>References are automatically added to your Python component implementation when + the runtime loads the implementation script, so they can be used like so: + </P> +<PRE># The module-level div function +def div(val1, val2): + # Use the divideService reference + result = divideService.divide(val1, val2) + return result +</PRE> + <P>and in your composite file: + </P> +<PRE><component name="CalculatorComponent"> + <implementation.python module="CalculatorImpl"/> + <reference name="divideService">DivideComponent/DivideService</reference> +</component> +</PRE> + <A NAME="properties"><H3>Properties</H3></A> + <P>A composite with a property defined for a component like so: + </P> +<PRE><component name="DivideComponent"> + <implementation.python module="DivideImpl"/> + <property name="doRounding">true</property> +</component> +</PRE> + <P>means the property is automatically instantiated and assigned the + property value in the Python component implementation, so it can be + used like so: + </P> +<PRE>def divide(val1, val2): + result = float(val1) / float(val2) + print "Python - DivideImpl.divide " + str(val1) + " / " + str(val2) + " = " + str(result) + + # Use the doRounding property + if doRounding: + result = round(result) + print "Python - DivideImpl.divide is rounding the result to " + str(result) + + return result +</PRE> +</P> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>First place to look is at the Tuscany FAQ at + <A HREF="http://incubator.apache.org/tuscany/faq.html" + TARGET="_blank">http://incubator.apache.org/tuscany/faq.html</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://incubator.apache.org/tuscany/mail-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/RESTExtension.html b/sca-cpp/branches/cpp-contrib/contrib/doc/RESTExtension.html new file mode 100644 index 0000000000..71482d43ec --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/RESTExtension.html @@ -0,0 +1,291 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("css/maven-base.css"); +@import url("css/maven-theme.css"); + </STYLE> + + <LINK HREF="css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native - REST Extension</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native - REST Extension</H1> + + <P>This document describes the deployment and use of the REST + binding support in the Apache Tuscany SCA Native runtime. + </P> + <P>The Tuscany REST extension allows SCA services and references to be invoked + via HTTP REST calls + </P> + <P>The following samples demonstrate use of the REST extension:</P> + <UL> + <LI><A HREF="../samples/RestCalculator/README.html">RestCalculator</A></LI> + <LI><A HREF="../samples/RestCustomer/README.html">RestCustomer</A></LI> + <LI><A HREF="../samples/RestYahoo/README.html">RestYahoo</A></LI> + <LI><A HREF="../samples/AlertAggregator/README.html">AlertAggregator</A></LI> + </UL> + </DIV> + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#requirements">System Requirements</A></LI> + <LI><A HREF="#install">Installing the Tuscany SCA REST Extension..</A> + <UL> + <LI><A HREF="#linuxbin">..from the binary release on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxsrc">..from the source release on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbin">..from the binary release on Windows</A></LI> + <LI><A HREF="#winsrc">..from the source release on Windows</A></LI> + </UL></LI> + <LI><A HREF="#deploy">Deploying the Tuscany REST Service extension to the HTTPD server</A></LI> + <LI><A HREF="#resource">The Tuscany REST extension resource pattern</A></LI> + <LI><A HREF="#rpc">The Tuscany REST extension RPC pattern</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + <DIV CLASS="section"> + <A NAME="requirements"><H2>System Requirements</H2></A> + + <P>In order to install and use the Tuscany SCA REST Extension there are some + extra requirements in addition to the <A HREF="../GettingStarted.html#requirements">Tuscany + SCA requirements</A>:</P> + <TABLE CLASS="bodyTable"> + + <TBODY> + <TR CLASS="a"> + <TD><B>Software</B></TD> + <TD><B>Download Link</B></TD> + </TR> + <TR CLASS="b"> + <TD>Apache HTTPD version 2.2</TD> + <TD> + <A HREF="http://httpd.apache.org" + TARGET="_blank">http://httpd.apache.org</A><BR/> + Please download and follow the installation instructions. This is required + for building the REST Service extension and for hosting and running REST services. + </TD> + </TR> + <TR CLASS="a"> + <TD>libcurl version 7.15 or higher</TD> + <TD> + <A HREF="http://curl.haxx.se/download.html" + TARGET="_blank">http://curl.haxx.se/download.html</A><BR/> + Please download and follow the installation instructions. This is required + for building the REST Reference extension and for calling REST references.<BR/> + On Windows, the extension was developed and tested against the "Win32 - MSVC 7.15.1 devel" + library provided by Chris Drake. On Linux the libcurl libraries were built from + the 7.16.1 source. On Mac OS X the library was downloaded, built and installed via the + standard "port" command. + </TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A NAME="install"><H2>Installing the Tuscany SCA REST Extension</H2></A> + <A NAME="linuxbin"><H3>Getting the Tuscany SCA REST Extension working with the binary release on Linux and Mac OS X</H3></A> + <OL> + <LI>Follow the <A HREF="#deploy">deployment steps</A> below to ensure the HTTPD server + invokes Tuscany when it receives an appropriate HTTP request</LI> + <LI>Ensure the libcurl and HTTPD libraries are available on the LD_LIBRARY_PATH environment variable on Linux and + the DYLD_LIBRARY_PATH environment variable on Mac OS X</LI> + </OL> + <A NAME="linuxsrc"><H3>Getting the Tuscany SCA REST Extension working with the source release on Linux and Mac OS X</H3></A> + <OL> + <LI>You will need the Tuscany SCA and SDO libraries - follow the instructions + <A HREF="../GettingStarted.html">here</A> to build the SCA libraries and default extensions</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + <LI>APR_INCLUDE=<path to APR includes></LI> + <LI>HTTPD_INCLUDE=<path to HTTPD includes><BR/> + Note: If you are using a default installation of HTTPD these are usually:<BR/> + APR_INCLUDE=/usr/include/apr-1<BR/> + HTTPD_INCLUDE=/usr/include/httpd</LI> + <LI>CURL_INCLUDE=<path to libcurl includes></LI> + <LI>CURL_LIB<path to libcurl libraries><BR/> + Note: If you are using a default installation of libcurl these are usually:<BR/> + CURL_INCLUDE=/usr/include/curl<BR/> + CURL_LIB=/usr/lib</LI> + </UL></LI> + <LI>Build the REST source only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir></LI> + <LI>./configure --prefix=$TUSCANY_SCACPP --enable-restbinding --enable-cpp=no --enable-wsbinding=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide a --prefix configure option, it will by default install into + /usr/local/tuscany/sca</LI> + </OL> + + <A NAME="winbin"><H3>Getting the Tuscany SCA REST Extension working with the binary release on Windows</H3></A> + <OL> + <LI>Follow the <A HREF="#deploy">deployment steps</A> below to ensure the HTTPD server + invokes Tuscany when it receives an appropriate HTTP request</LI> + <LI>Ensure the libcurl and HTTPD libraries are available on the PATH environment variable</LI> + </OL> + <A NAME="winsrc"><H3>Getting the Tuscany SCA REST Extension working with the source release on Windows</H3></A> + <OL> + <LI>Unzip the supplied source zip file</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + <LI>HTTPD_HOME=<path to installed HTTPD server> + <LI>LIBCURL_HOME=<path to installed libcurl libraries> + </UL></LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. The build command + will call vcvars32 to set the environment. Ensure the directory containing this is on your path. + This will be where you installed the compiler.</LI> + <LI>Build the source: + <UL> + <LI>cd <to where you unzipped the source></LI> + <LI>build</LI> + </UL> + This will build all the projects and put the required output into the 'deploy' directory<BR/><BR/> + Alternatively, open the workspace at <tuscany_sca_install_dir>/projects/tuscany_sca/tuscany_sca.dsw + in Visual Studio 6 or at at <tuscany_sca_install_dir>/projectsvc7/tuscany_sca/tuscany_sca.sln + in Visual Studio 7.1 - you can build projects individually + or build the samples to rebuild all the projects</LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="deploy"><H2>Deploying the Tuscany REST Service extension to the HTTPD server</H2></A> + <P>The following samples demonstrate use of the REST extension:</P> + <UL> + <LI><A HREF="../samples/RestCalculator/README.html">RestCalculator</A></LI> + <LI><A HREF="../samples/RestCustomer/README.html">RestCustomer</A></LI> + <LI><A HREF="../samples/RestYahoo/README.html">RestYahoo</A></LI> + <LI><A HREF="../samples/AlertAggregator/README.html">AlertAggregator</A></LI> + </UL> + <P>Each of these samples generate a set of configuration files for the HTTPD server. Use the startserver + script that comes with each sample to generate the files and start the server with the REST Service + extension enabled. The instructions below detail the information that is provided in these configuration + files.</P> + <OL> + <LI>On Windows, load the sca_rest_module into HTTPD by adding the following line to the conf/httpd.conf file: +<PRE>LoadModule sca_rest_module <path to installed Tuscany SCA>/extensions/rest/service/bin/tuscany_sca_mod_rest.dll</PRE> + On Linux, use the following line: +<PRE>LoadModule sca_rest_module <path to installed Tuscany SCA>/extensions/rest/service/lib/libtuscany_sca_mod_rest.so</PRE> + On Mac OS X, use the following line: +<PRE>LoadModule sca_rest_module <path to installed Tuscany SCA>/extensions/rest/service/lib/libtuscany_sca_mod_rest.dylib</PRE> + </LI> + <LI>Set a TuscanyHome directive to the installation of Tuscany SCA Native: +<PRE>TuscanyHome <path to installed Tuscany SCA></PRE> + </LI> + <LI>Create a Location directive for the URL to be used and set the sca_rest_module as the handler to + be invoked when requests for the location are received. Also set the TuscanyRoot directive for + this Location, set to the location of the SCA application to be invoked: +<PRE> +<Location /rest> + SetHandler sca_rest_module + TuscanyRoot <path to installed Tuscany SCA>/samples/RestCalculator/deploy/ +</Location> +</PRE> + The above example will mean that calls to http://myserver/rest will be handled by Tuscany SCA Native + and configured to invoke the RestCalculator sample application. + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="resource"><H2>Tuscany REST Extension Resource Pattern</H2></A> + <P>If the SCA service or reference uses an <interface.rest> interface, CRUD + (Create, Retrieve, Update, Delete) methods are mapped to HTTP verbs to access resource + representations as follows:</P> + <UL> + <LI>uri = create(resource)<BR/> + HTTP POST <binding-uri> + an XML element representing the resource to create<BR/> + Returns Location header containing the uri of the created resource</LI> + <LI>resource = retrieve()<BR/> + HTTP GET <binding-uri><BR/> + Returns an XML element representing the REST resource</LI> + <LI>resource = retrieve(uri, parm-value-1, parm-value-n)<BR/> + HTTP GET uri/parm-value-1/parm-value-n<BR/> + or if uri ends with a '?':<BR/> + HTTP GET uri?parm-name-1=parm-value1&parm-name-n=parm-value-n<BR/> + Returns an XML element representing the REST resource</LI> + <LI>update(resource)<BR/> + HTTP PUT <binding-uri> + an XML element representing the updated resource</LI> + <LI>update(uri, parm-1, parm-n, resource)<BR/> + HTTP PUT uri/parm-value-1/parm-value-n + an XML element representing the updated resource<BR/> + or if uri ends with a '?':<BR/> + HTTP PUT uri?parm-name-1=parm-value1&parm-name-n=parm-value-n + an XML element representing the updated resource</LI> + <LI>delete()<BR/> + HTTP DELETE <binding-uri></LI> + <LI>delete(uri, parm-1, parm-n)<BR/> + HTTP DELETE uri/parm-value-1/parm-value-n<BR/> + or if uri ends with a '?':<BR/> + HTTP DELETE uri?parm-name-1=parm-value1&parm-name-n=parm-value-n</LI> + </UL> + <P>In this mode, HTTP return codes are used almost as described in the Atom spec. Also + GET returns etags with the retrieved resource representations to help caching by clients.</P> + </DIV> + + <DIV CLASS="section"> + <A NAME="rpc"><H2>Tuscany REST Extension RPC Pattern</H2></A> + <P>If the SCA service/reference does not use an <interface.rest> interface, then this is + not a real REST pattern, we simply flow method calls over XML / HTTP as follows:</P> + <UL><LI>result = method-abc(parm-1, parm-n) + <UL> + <LI>if single input parameter of complex type:<BR/> + HTTP POST <binding-uri>/method-abc + XML element representing the complex parameter</LI> + <LI>or if multiple parameters including parameters of complex types:<BR/> + HTTP POST <binding-uri>/method-abc + Mime multipart/form-data body containing one parameter per part</LI> + <LI>or if multiple parameters all of simple types:<BR/> + HTTP GET <binding-uri>/method-abc?parm-1-name=parm-1-value&parm-n-name=parm-n-value</LI> + </UL> + Returns an XML element representing the result</LI> + </UL> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>First place to look is at the Tuscany FAQ at + <A HREF="http://incubator.apache.org/tuscany/faq.html" + TARGET="_blank">http://incubator.apache.org/tuscany/faq.html</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://incubator.apache.org/tuscany/mail-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/RubyExtension.html b/sca-cpp/branches/cpp-contrib/contrib/doc/RubyExtension.html new file mode 100644 index 0000000000..96a4ad2b82 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/RubyExtension.html @@ -0,0 +1,292 @@ +<!-- + 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. +--> + + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("css/maven-base.css"); +@import url("css/maven-theme.css"); + </STYLE> + + <LINK HREF="css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native - Ruby Extension</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native - Ruby Extension</H1> + + <P>The Tuscany Ruby extension allows Ruby scripts to be used as components in + SCA composites and as clients that can invoke SCA services. + </P> + <P>The following samples demonstrate use of the Ruby extension:</P> + <UL> + <LI><A HREF="../samples/RubyCalculator/README.html">RubyCalculator</A></LI> + <LI><A HREF="../samples/RubyBigBank/README.html">RubyBigBank</A></LI> + <LI><A HREF="../samples/RestCalculator/README.html">RestCalculator</A></LI> + <LI><A HREF="../samples/RestYahoo/README.html">RestYahoo</A></LI> + <LI><A HREF="../samples/HTTPDBigBank/README.html">HTTPDBigBank</A></LI> + </UL> + </DIV> + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#requirements">System Requirements</A></LI> + <LI><A HREF="#install">Installing the Tuscany SCA Ruby Extension..</A> + <UL> + <LI><A HREF="#linuxbin">..from the binary release on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxsrc">..from the source release on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbin">..from the binary release on Windows</A></LI> + <LI><A HREF="#winsrc">..from the source release on Windows</A></LI> + </UL></LI> + <LI><A HREF="#pm">The Tuscany Ruby Programming Model</A></LI> + <UL> + <LI><A HREF="#clients">Clients</A></LI> + <LI><A HREF="#components">SCA Components</A></LI> + <LI><A HREF="#references">Component references</A></LI> + <LI><A HREF="#properties">Component properties</A></LI> + </UL> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + <DIV CLASS="section"> + <A NAME="requirements"><H2>System Requirements</H2></A> + + <P>In order to install and use the Tuscany SCA Ruby Extension there are some + extra requirements in addition to the <A HREF="../GettingStarted.html#requirements">Tuscany + SCA requirements</A>:</P> + <TABLE CLASS="bodyTable"> + + <TBODY> + <TR CLASS="a"> + <TD><B>Software</B></TD> + <TD><B>Download Link</B></TD> + </TR> + <TR CLASS="b"> + <TD>Ruby version 1.8.x</TD> + + <TD> + <A HREF="http://www.ruby-lang.org" + TARGET="_blank">http://www.ruby-lang.org</A><BR/> + Please download and follow the installation instructions. You should + be able to build the Tuscany SCA Ruby Extension with other versions of Ruby. + The extension has been tested with the + <A HREF="http://rubyforge.org/frs/download.php/12751/ruby185-21.exe">Ruby 1.8.5 One-Click Installer</A> + on Windows and the <A HREF="ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.5-p12.tar.gz">1.8.5 source code</A> + (compiled locally) on Linux. + </TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A NAME="install"><H2>Installing the Tuscany SCA Ruby Extension</H2></A> + <A NAME="linuxbin"><H3>Getting the Tuscany SCA Ruby Extension working with the binary release on Linux and Mac OS X</H3></A> + <OL> + <LI>Ensure the Ruby libraries are available on the PATH environment variable</LI> + </OL> + <A NAME="linuxsrc"><H3>Getting the Tuscany SCA Ruby Extension working with the source release on Linux and Mac OS X</H3></A> + <OL> + <LI>You will need the Tuscany SCA and SDO libraries - follow the instructions + <A HREF="../GettingStarted.html">here</A> to build the SCA libraries and default extensions</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + <LI>RUBY_LIB=<path to Ruby libraries></LI> + <LI>RUBY_INCLUDE=<path to Ruby includes><BR/> + Note: If you are using a default installation of Ruby these are usually:<BR/> + RUBY_LIB=/usr/lib<BR/> + RUBY_INCLUDE=/usr/lib/ruby/1.8/i386-linux</LI> + </UL></LI> + <LI>Build the Ruby source only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir></LI> + <LI>./configure --prefix=$TUSCANY_SCACPP --enable-ruby --enable-cpp=no --enable-wsbinding=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide a --prefix configure option, it will by default install into + /usr/local/tuscany/sca</LI> + </OL> + + <A NAME="winbin"><H3>Getting the Tuscany SCA Ruby Extension working with the binary release on Windows</H3></A> + <OL> + <LI>Ensure the Ruby libraries are available on the PATH environment variable</LI> + </OL> + <A NAME="winsrc"><H3>Getting the Tuscany SCA Ruby Extension working with the source release on Windows</H3></A> + <OL> + <LI>Unzip the supplied source zip file</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + <LI>RUBY_HOME=<path to installed Ruby> + </UL></LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. The build command + will call vcvars32 to set the environment. Ensure the directory containing this is on your path. + This will be where you installed the compiler.</LI> + <LI>Build the source: + <UL> + <LI>cd <to where you unzipped the source></LI> + <LI>build</LI> + </UL> + This will build all the projects and put the required output into the 'deploy' directory<BR/><BR/> + Alternatively, open the workspace at <tuscany_sca_install_dir>/projects/tuscany_sca/tuscany_sca.dsw + in Visual Studio 6 or at at <tuscany_sca_install_dir>/projectsvc7/tuscany_sca/tuscany_sca.sln + in Visual Studio 7.1 - you can build projects individually + or build the samples to rebuild all the projects</LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="pm"><H2>The Tuscany Ruby Programming Model</H2></A> + <P>This section will explain the Tuscany Ruby programming model to help you to + write your own Ruby components and clients. + </P> + <P>The Tuscany Ruby component and client support comes from a Ruby extension + library that is built in the <tuscany_sca_install_dir>/extensions/ruby/bin + directory on Windows and <tuscany_sca_install_dir>/extensions/ruby/lib on + Linux and Mac OS X. + </P> + <A NAME="clients"><H3>Clients</H3></A> + <P>Using the Ruby SCA extension library, a Ruby client can search for an SCA service with: + </P> +<PRE>require("libtuscany_sca_ruby") + +calculator = SCA::locateService("CalculatorComponent/CalculatorService") +</PRE> + <P>This finds the component and service as defined in the composite and componentType + side files and returns a proxy object that can call the SCA service. You can then + simply call a business method on "calculator", like this: + </P> +<PRE>result = calculator.add(12.3, 45.6)</PRE> + </P> + <A NAME="components"><H3>Components</H3></A> + <P>Ruby component implementations are standard Ruby scripts, where class-level + functions or module-level functions can be invoked by the Tuscany runtime. To + use a Ruby component implementation, use the implementation.ruby element in + your .composite file. For example: + </P> +<PRE><implementation.ruby script="CalculatorImpl.rb"/> +</PRE> + <P>To instantiate a class instance and use a class-level function, the Ruby class must + have a default constructor (an initialize() method that takes no arguments) and the + class attribute must be definde in the implementation.ruby element + in your composite, like so: + </P> +<PRE><implementation.ruby script="CalculatorImpl.rb" class="CalculatorImpl"/> +</PRE> + <P>Tuscany currently supports passing simple types (strings, ints, floats, etc) as well + as Service Data Objects into and out of Ruby components. Service Data Objects are represented + in Ruby as REXML Document objects (see the <A HREF="../samples/RubyBigBank/README.html"> + Ruby BigBank sample</A> for a demonstration). + </P> + <P>You can write a componentType file for your Ruby component, but you don't have to - the Ruby + extension introspects Ruby component implementation classes for you and binds public + attributes to references and properties. + </P> + <A NAME="references"><H3>References</H3></A> + <P>References can be invoked from Ruby component implementations by the use of public + attributes in the component implementation classes, like this: + </P> +<PRE>class CalculatorImpl + + # Define the public attribute that corresponds to the divideService reference + attr_writer :divideService + +... + + def div(arg1, arg2) + print "Ruby - CalculatorImpl.div\n" + # Invoke the divideService reference + @divideService.divide(arg1.to_f, arg2.to_f) + end + +... +end +</PRE> + <P>and in your composite file: + </P> +<PRE><component name="CalculatorComponent"> + <implementation.ruby script="CalculatorImpl.rb"/> + <reference name="divideService">DivideComponent/DivideService</reference> +</component> +</PRE> + <A NAME="properties"><H3>Properties</H3></A> + <P>A composite with a property defined for a component like so: + </P> +<PRE><component name="DivideComponent"> + <implementation.ruby script="DivideImpl.rb" class="DivideImpl"/> + <property name="round">true</property> +</component> +</PRE> + <P>allows a public attribute of a Ruby component implementation class to be + assigned the property value, so it can be used like so: + </P> +<PRE>class DivideImpl + + # Define the public attribute that corresponds to the round property + attr_writer :round + +... + + def divide(arg1, arg2) + print "Ruby - DivideImpl.divide ", arg1, " / ", arg2, "\n" + res = arg1.to_f / arg2.to_f + # Use the round property + if @round then + res = res.round + print "DivideImpl.divide rounding\n" + end + print "DivideImpl.divide ", res, "\n" + res + end +end +</PRE> +</P> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>First place to look is at the Tuscany FAQ at + <A HREF="http://incubator.apache.org/tuscany/faq.html" + TARGET="_blank">http://incubator.apache.org/tuscany/faq.html</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://incubator.apache.org/tuscany/mail-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/SCAExtension.html b/sca-cpp/branches/cpp-contrib/contrib/doc/SCAExtension.html new file mode 100644 index 0000000000..63157dc9bf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/SCAExtension.html @@ -0,0 +1,173 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("css/maven-base.css"); +@import url("css/maven-theme.css"); + </STYLE> + + <LINK HREF="css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native - SCA Binding Extension</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native - SCA Binding Extension</H1> + + <P>This document describes the deployment and use of the SCA + binding support in the Apache Tuscany SCA Native runtime. + </P> + <P>The SCA binding allows components to be invoked via an + implementation specific protocol. Currently, in the Tuscany SCA binding + extension, the <A HREF="Axis2CWSExtension.html">Axis2/C Web Service binding extension</A> + is used to provide the implementaion, so calls use the SOAP protocol + </P> + <P>The <A HREF="../samples/HTTPDBigBank/README.html">HTTPDBigBank</A> sample demonstrates the + use of the SCA binding extension. + </P> + </DIV> + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#requirements">System Requirements</A></LI> + <LI><A HREF="#install">Installing the Tuscany SCA Binding Extension..</A> + <UL> + <LI><A HREF="#linuxbin">..from the binary release on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxsrc">..from the source release on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbin">..from the binary release on Windows</A></LI> + <LI><A HREF="#winsrc">..from the source release on Windows</A></LI> + </UL></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + <DIV CLASS="section"> + <A NAME="requirements"><H2>System Requirements</H2></A> + + <P>In order to install and use the Tuscany SCA Binding Extension there are some + extra requirements in addition to the <A HREF="../GettingStarted.html#requirements">Tuscany + SCA requirements</A>:</P> + <TABLE CLASS="bodyTable"> + + <TBODY> + <TR CLASS="a"> + <TD><B>Software</B></TD> + <TD><B>Details</B></TD> + </TR> + <TR CLASS="b"> + <TD><A HREF="Axis2CWSExtension.html">Tuscany Axis2/C Web Service binding extension</A></TD> + + <TD> + Please follow the installation instructions. The Axis2/C Web Service extension requires + <A HREF="http://ws.apache.org/axis2/c">Axis2/C version 0.96</A>. + </TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + <DIV CLASS="section"> + <A NAME="install"><H2>Installing the Tuscany SCA Binding Extension</H2></A> + <A NAME="linuxbin"><H3>Getting the Tuscany SCA Binding Extension working with the binary release on Linux and Mac OS X</H3></A> + <OL> + <LI>Ensure the AXIS2C_HOME environment variable is set to the Axis2/C installation</LI> + <LI>Deploy the Axis2/C Web Services extension by following the <A HREF="Axis2CWSExtension.html#deploy">deployment steps</A></LI> + <LI>Ensure the Axis2/C Web Service extension and SCA Binding extension libraries are available + on the LD_LIBRARY_PATH environment variable on Linux and the DYLD_LIBRARY_PATH environment variable on Mac OS X</LI> + </OL> + <A NAME="linuxsrc"><H3>Getting the Tuscany SCA Binding Extension working with the source release on Linux and Mac OS X</H3></A> + <OL> + <LI>You will need the Tuscany SCA and SDO libraries - follow the instructions + <A HREF="../GettingStarted.html">here</A> to build the SCA libraries and default extensions</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL></LI> + <LI>Build the SCA Binding source only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir></LI> + <LI>./configure --prefix=$TUSCANY_SCACPP --enable-scabinding --enable-cpp=no --enable-wsbinding=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide a --prefix configure option, it will by default install into + /usr/local/tuscany/sca</LI> + </OL> + + <A NAME="winbin"><H3>Getting the Tuscany SCA Binding Extension working with the binary release on Windows</H3></A> + <OL> + <LI>Ensure the AXIS2C_HOME environment variable is set to the Axis2/C installation</LI> + <LI>Deploy the Axis2/C Web Services extension by following the <A HREF="Axis2CWSExtension.html#deploy">deployment steps</A></LI> + <LI>Ensure the Axis2/C Web Services extension and SCA Binding extension libraries are available + on the PATH environment variable</LI> + </OL> + <A NAME="winsrc"><H3>Getting the Tuscany SCA Binding Extension working with the source release on Windows</H3></A> + <OL> + <LI>Unzip the supplied source zip file</LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to built Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. The build command + will call vcvars32 to set the environment. Ensure the directory containing this is on your path. + This will be where you installed the compiler.</LI> + <LI>Build the source: + <UL> + <LI>cd <to where you unzipped the source></LI> + <LI>build</LI> + </UL> + This will build all the projects and put the required output into the 'deploy' directory<BR/><BR/> + Alternatively, open the workspace at <tuscany_sca_install_dir>/projects/tuscany_sca/tuscany_sca.dsw + in Visual Studio 6 or at at <tuscany_sca_install_dir>/projectsvc7/tuscany_sca/tuscany_sca.sln + in Visual Studio 7.1 - you can build projects individually + or build the samples to rebuild all the projects</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>First place to look is at the Tuscany FAQ at + <A HREF="http://incubator.apache.org/tuscany/faq.html" + TARGET="_blank">http://incubator.apache.org/tuscany/faq.html</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://incubator.apache.org/tuscany/mail-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/css/maven-base.css b/sca-cpp/branches/cpp-contrib/contrib/doc/css/maven-base.css new file mode 100644 index 0000000000..e23caf04e5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/css/maven-base.css @@ -0,0 +1,168 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +body { + margin: 0px; + padding: 0px; +} +img { + border:none; +} +table { + padding:0px; + width: 100%; + margin-left: -2px; + margin-right: -2px; +} +acronym { + cursor: help; + border-bottom: 1px dotted #feb; +} +table.bodyTable th, table.bodyTable td { + padding: 2px 4px 2px 4px; + vertical-align: top; +} +div.clear{ + clear:both; + visibility: hidden; +} +div.clear hr{ + display: none; +} +#bannerLeft, #bannerRight { + font-size: xx-large; + font-weight: bold; +} +#bannerLeft img, #bannerRight img { + margin: 0px; +} +.xleft, #bannerLeft img { + float:left; + text-shadow: #7CFC00; +} +.xright, #bannerRight img { + float:right; + text-shadow: #7CFC00; +} +#banner { + padding: 0px; +} +#banner img { + border: none; +} +#breadcrumbs { + padding: 3px 10px 3px 10px; +} +#leftColumn { + width: 150px; + float:left; +} +#bodyColumn { + margin-right: 1.5em; + margin-left: 30px; +} +#legend { + padding: 8px 0 8px 0; +} +#navcolumn { + padding: 8px 4px 0 8px; +} +#navcolumn h5 { + margin: 0; + padding: 0; + font-size: small; +} +#navcolumn ul { + margin: 0; + padding: 0; + font-size: small; +} +#navcolumn li { + list-style-type: none; + background-image: none; + background-repeat: no-repeat; + background-position: 0 0.4em; + padding-left: 16px; + list-style-position: ouside; + line-height: 1.2em; + font-size: smaller; +} +#navcolumn li.expanded { + background-image: url(../images/expanded.gif); +} +#navcolumn li.collapsed { + background-image: url(../images/collapsed.gif); +} +#poweredBy { + text-align: center; +} +#navcolumn img { + margin-top: 10px; + margin-bottom: 3px; +} +#poweredBy img { + display:block; + margin: 20px 0 20px 17px; + border: 1px solid black; + width: 90px; + height: 30px; +} +#search img { + margin: 0px; + display: block; +} +#search #q, #search #btnG { + border: 1px solid #999; + margin-bottom:10px; +} +#search form { + margin: 0px; +} +#lastPublished { + font-size: x-small; +} +.navSection { + margin-bottom: 2px; + padding: 8px; +} +.navSectionHead { + font-weight: bold; + font-size: x-small; +} +.section { + padding: 4px; +} +#footer { + padding: 3px 10px 3px 10px; + font-size: x-small; +} +#breadcrumbs { + font-size: x-small; + margin: 0pt; +} +.source { + padding: 12px; + margin: 1em 7px 1em 7px; +} +.source pre { + margin: 0px; + padding: 0px; +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/doc/css/maven-theme.css b/sca-cpp/branches/cpp-contrib/contrib/doc/css/maven-theme.css new file mode 100644 index 0000000000..91cf29cda2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/doc/css/maven-theme.css @@ -0,0 +1,173 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +body { + padding: 0px 0px 10px 0px; +} +body, td, select, input, li{ + font-family: Verdana, Helvetica, Arial, sans-serif; + #font-size: 13px; + padding: 4px 4px 4px 4px; + line-height: 1.5em; + font-size: small; +} +code{ + font-family: Courier, monospace; + font-size: 13px; +} +a { + text-decoration: none; +} +a:link { + color:#36a; +} +a:visited { + color:#47a; +} +a:active, a:hover { + color:#69c; +} +#legend li.externalLink { + background: url(../images/external.png) left top no-repeat; + padding-left: 18px; +} +a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover { + background: url(../images/external.png) right center no-repeat; + padding-right: 18px; +} +#legend li.newWindow { + background: url(../images/newwindow.png) left top no-repeat; + padding-left: 18px; +} +a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover { + background: url(../images/newwindow.png) right center no-repeat; + padding-right: 18px; +} +h1 { + font-size: x-large; + line-height: 1em; +} + + +h2 { + padding: 4px 4px 4px 6px; + border: 1px solid #999; + color: #900; + background-color: #ddd; + + font-size: large; +} +h3 { + padding: 4px 4px 4px 6px; + border: 1px solid #aaa; + color: #900; + background-color: #eee; + font-weight: normal; + font-size: large; +} +h4 { + padding: 4px 4px 4px 6px; + border: 1px solid #bbb; + color: #900; + background-color: #fff; + font-weight: normal; + font-size: large; +} +h5 { + padding: 4px 4px 4px 6px; + color: #900; + font-size: normal; +} +p { + line-height: 1.5em; + font-size: small; +} +#breadcrumbs { + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; + background-color: #ccc; +} +#leftColumn { + margin: 10px 0 0 5px; + border: 1px solid #999; + background-color: #eee; +} +#navcolumn h5 { + font-size: smaller; + border-bottom: 1px solid #aaaaaa; + padding-top: 2px; + color: #000; +} + +table.bodyTable th { + color: white; + background-color: #bbb; + text-align: left; + font-weight: bold; +} + +table.bodyTable th, table.bodyTable td { + font-size: small; +} + +table.bodyTable tr.a { + background-color: #ddd; +} + +table.bodyTable tr.b { + background-color: #eee; +} + +.source { + border: 1px solid #999; +} +dl { + padding: 4px 4px 4px 6px; + border: 1px solid #aaa; + background-color: #ffc; +} +dt { + color: #900; +} +#organizationLogo img, #projectLogo img, #projectLogo span{ + margin: 8px; +} +#banner { + border-bottom: 1px solid #fff; +} +.sourcecode { + border: 1px solid #999; + font-family: Courier, monospace; + font-size: 13px; + white-space: pre; + padding: 4px 4px 4px 6px; + margin: 4px 4px 4px 6px; +} +pre { + border: 1px solid #999; + font-family: Courier, monospace; + font-size: 13px; + white-space: pre; + padding: 4px 4px 4px 6px; + margin: 4px 4px 4px 6px; +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/Makefile.am new file mode 100644 index 0000000000..a03650cd83 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/Makefile.am @@ -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. + +SUBDIRS = core extensions + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/Makefile.am new file mode 100644 index 0000000000..f833a2cb08 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +SUBDIRS = src test +nobase_data_DATA = xsd/*.* + +EXTRA_DIST = xsd + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/Makefile.am new file mode 100644 index 0000000000..ebba243583 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/Makefile.am @@ -0,0 +1,78 @@ +# 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. + +lib_LTLIBRARIES = libtuscany_sca.la + +nobase_include_HEADERS = \ +tuscany/sca/*.h \ +tuscany/sca/core/*.h \ +tuscany/sca/model/*.h \ +tuscany/sca/util/*.h \ +tuscany/sca/extension/*.h + +## To list the source files execute the following: +## ls -1 tuscany/sca/util/*.cpp tuscany/sca/extension/*.cpp tuscany/sca/model/*.cpp tuscany/sca/core/*.cpp tuscany/sca/cpp/*.cpp tuscany/sca/ws/*.cpp | awk '{ print $1 " \\" }' +## and copy/paste the output below +libtuscany_sca_la_SOURCES = \ +tuscany/sca/core/Exceptions.cpp \ +tuscany/sca/core/Operation.cpp \ +tuscany/sca/core/SCARuntime.cpp \ +tuscany/sca/core/ServiceProxy.cpp \ +tuscany/sca/core/ServiceWrapper.cpp \ +tuscany/sca/extension/ImplementationExtension.cpp \ +tuscany/sca/extension/InterfaceExtension.cpp \ +tuscany/sca/extension/ReferenceBindingExtension.cpp \ +tuscany/sca/extension/ServiceBindingExtension.cpp \ +tuscany/sca/model/Binding.cpp \ +tuscany/sca/model/Component.cpp \ +tuscany/sca/model/ComponentType.cpp \ +tuscany/sca/model/Composite.cpp \ +tuscany/sca/model/CompositeReference.cpp \ +tuscany/sca/model/CompositeReferenceBinding.cpp \ +tuscany/sca/model/CompositeService.cpp \ +tuscany/sca/model/Contract.cpp \ +tuscany/sca/model/Interface.cpp \ +tuscany/sca/model/ModelLoader.cpp \ +tuscany/sca/model/ReferenceBinding.cpp \ +tuscany/sca/model/Reference.cpp \ +tuscany/sca/model/ReferenceType.cpp \ +tuscany/sca/model/ServiceBinding.cpp \ +tuscany/sca/model/Service.cpp \ +tuscany/sca/model/ServiceType.cpp \ +tuscany/sca/model/Wire.cpp \ +tuscany/sca/model/WSDLDefinition.cpp \ +tuscany/sca/model/WSDLInterface.cpp \ +tuscany/sca/model/WSDLMessagePart.cpp \ +tuscany/sca/model/WSDLOperation.cpp \ +tuscany/sca/util/DefaultLogWriter.cpp \ +tuscany/sca/util/File.cpp \ +tuscany/sca/util/FileLogWriter.cpp \ +tuscany/sca/util/Library.cpp \ +tuscany/sca/util/Logger.cpp \ +tuscany/sca/util/LogWriter.cpp \ +tuscany/sca/util/Mutex.cpp \ +tuscany/sca/util/Queue.cpp \ +tuscany/sca/util/SDOUtils.cpp \ +tuscany/sca/util/Thread.cpp \ +tuscany/sca/util/ThreadLocal.cpp \ +tuscany/sca/util/Utils.cpp + +libtuscany_sca_la_LIBADD = -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo -lpthread + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Exceptions.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Exceptions.cpp new file mode 100644 index 0000000000..7fa9c5e6b9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Exceptions.cpp @@ -0,0 +1,285 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <sstream> +#if defined(WIN32) || defined (_WINDOWS) || defined (IS_DARWIN) +#else +#include <execinfo.h> +#endif + +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Logging.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + + // ======================================================================== + // Constructor + // ======================================================================== + TuscanyRuntimeException :: TuscanyRuntimeException(const char* name, + severity_level sev, + const char* msg_text) + { + severity = sev; + location_set = 0; + class_name = new char[strlen(name) + 1]; + strcpy(class_name,name); + message_text = new char[strlen(msg_text)+1]; + strcpy(message_text,msg_text); + +#if defined(WIN32) || defined (_WINDOWS) || defined (IS_DARWIN) +#else + void* array[25]; + stacktrace_size = backtrace(array, 25); + stacktrace_symbols = backtrace_symbols(array, stacktrace_size); +#endif + + logwarning("%s raised: %s", class_name, message_text); + + } // end TuscanyRuntimeException constuctor + + // ======================================================================== + // Constructor + // ======================================================================== + TuscanyRuntimeException :: TuscanyRuntimeException(const TuscanyRuntimeException& c) + { + severity = c.getSeverity(); + location_set = c.location_set; + class_name = new char[strlen(c.getEClassName()) + 1]; + strcpy(class_name, c.getEClassName()); + message_text = new char[strlen(c.getMessageText())+1]; + strcpy(message_text,c.getMessageText()); + + for (int i=0; i < location_set; i++) + { + locations[i].file = new char[strlen(c.locations[i].file) + 1]; + strcpy(locations[i].file,c.locations[i].file); + locations[i].line = c.locations[i].line; + locations[i].function = new char[strlen(c.locations[i].function) + 1]; + strcpy(locations[i].function, c.locations[i].function); + } + +#if defined(WIN32) || defined (_WINDOWS) || defined (IS_DARWIN) +#else + void* array[25]; + stacktrace_size = backtrace(array, 25); + stacktrace_symbols = backtrace_symbols(array, stacktrace_size); +#endif + + logwarning("%s raised: %s", class_name, message_text); + } + + // ======================================================================== + // Constructor + // ======================================================================== + TuscanyRuntimeException :: TuscanyRuntimeException(const commonj::sdo::SDORuntimeException& c) + { + class_name = new char[strlen(c.getEClassName()) + 1]; + strcpy(class_name, c.getEClassName()); + message_text = new char[strlen(c.getMessageText())+1]; + strcpy(message_text,c.getMessageText()); + severity = Warning; + const char* file = c.getFileName(); + unsigned long line = c.getLineNumber(); + const char* function = c.getFunctionName(); + location_set = 0; + if (file) + { + setLocation(file, line, function); + } + +#if defined(WIN32) || defined (_WINDOWS) || defined (IS_DARWIN) +#else + void* array[25]; + stacktrace_size = backtrace(array, 25); + stacktrace_symbols = backtrace_symbols(array, stacktrace_size); +#endif + + logwarning("%s raised: %s", class_name, message_text); + } + + // ======================================================================== + // Destructor + // ======================================================================== + TuscanyRuntimeException :: ~TuscanyRuntimeException() + { + if (class_name) delete class_name; + if (message_text) delete message_text; + for (int i=0;i<location_set;i++) + { + if (locations[i].file) delete locations[i].file; + if (locations[i].function) delete locations[i].function; + } + +#if defined(WIN32) || defined (_WINDOWS) || defined (IS_DARWIN) +#else + free(stacktrace_symbols); +#endif + + } // end TuscanyRuntimeException destructor + + // ======================================================================== + // Return class name of this exception + // ======================================================================== + const char* TuscanyRuntimeException :: getEClassName() const + { + return class_name; + } // end getClassName() + + // ======================================================================== + // Return severity + // ======================================================================== + TuscanyRuntimeException::severity_level TuscanyRuntimeException :: getSeverity() const + { + return severity; + } // end getSeverity() + + // ======================================================================== + // Return message text associated with exception + // ======================================================================== + const char* TuscanyRuntimeException :: getMessageText() const + { + return message_text; + } // end getMessageText() + + // ======================================================================== + // Return file name where exception was raised + // ======================================================================== + const char* TuscanyRuntimeException :: getFileName() const + { + return locations[0].file; + } // end getFileName() + + // ======================================================================== + // Return line number where exception was raised + // ======================================================================== + unsigned long TuscanyRuntimeException :: getLineNumber() const + { + return locations[0].line; + } // end getLineNumber() + + // ======================================================================== + // Return function name where exception was raised + // ======================================================================== + const char* TuscanyRuntimeException :: getFunctionName() const + { + return locations[0].function; + } // end getFunctionName() + + + // ======================================================================== + // set severity of exception + // ======================================================================== + void TuscanyRuntimeException :: setSeverity(severity_level sev) + { + severity = sev; + } // end setSeverity(severity_level sev) const + + // ======================================================================== + // set message text associated with exception + // ======================================================================== + void TuscanyRuntimeException :: setMessageText(const char* msg_text) + { + if (message_text != 0) delete message_text; + message_text = new char[strlen(msg_text) + 1]; + strcpy(message_text,msg_text); + } // end setMessageText(const string &msg_text) const + + // ======================================================================== + // set location of most recent handling of the exception + // ======================================================================== + void TuscanyRuntimeException :: setLocation(const char* file, + unsigned long line, + const char* function) + { + if (location_set < num_locations) + { + locations[location_set].file = new char[strlen(file) + 1]; + strcpy(locations[location_set].file,file); + locations[location_set].line = line; + locations[location_set].function = new char[strlen(function) + 1]; + strcpy(locations[location_set].function,function); + + location_set++; + } + } // end setLocation() + + + // ======================================================================== + // print self + // ======================================================================== + ostream& TuscanyRuntimeException :: PrintSelf(ostream &os) const + { + + os << "Exception" << endl; + os << " Class: " << class_name << endl; + os << " Description: " << message_text << endl; + if (location_set != 0) + { + os << " Origin:" << endl; + os << " File: " << locations[0].file << endl; + char lineNumber[100]; + sprintf(lineNumber, "%lu",locations[0].line); + os << " Line: " << lineNumber << endl; + os << " Function: " << locations[0].function << endl; + + if (location_set >1) + { + os << " Path:" << endl; + int i=1; + while (i < location_set) + { + os << " File: " << locations[i].file << endl; + os << " Line: " << locations[i].line << endl; + os << " Function: " << locations[i].function << endl; + i++; + } + } + } +#if defined(WIN32) || defined (_WINDOWS) || defined (IS_DARWIN) +#else + if (stacktrace_size != 0) + { + os << " Backtrace:" << endl; + for (int j = 0; j < stacktrace_size; j++) + { + os << " " << stacktrace_symbols[j] << endl; + } + } +#endif + return os; + } // end ostream operator << + + + // ======================================================================== + // ostream operator << + // ======================================================================== + SCA_API ostream& operator<< (ostream &os, const TuscanyRuntimeException &except) + { + return except.PrintSelf(os); + } // end ostream operator << + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Exceptions.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Exceptions.h new file mode 100644 index 0000000000..50cf91f7d4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Exceptions.h @@ -0,0 +1,346 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_core_exceptions_h +#define tuscany_sca_core_exceptions_h + +#include <ostream> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + /** + * Top level exception to represent all the exceptions that may be + * thrown by an SCA runtime implementation. + */ + class SCA_API TuscanyRuntimeException + { + public: + /** + * Represents the possible severity levels for an exception. + */ + enum severity_level + { + Normal, + Warning, + Error, + Severe + }; + + /** + * Constructor. + * @param name Class name of the exception. + * @param sev Severity level. + * @param msg_text Detailed description of the exception. + */ + TuscanyRuntimeException( + const char *name = "TuscanyRuntimeException", + severity_level sev = Severe, + const char* msg_text = ""); + + TuscanyRuntimeException(const TuscanyRuntimeException& c); + TuscanyRuntimeException(const commonj::sdo::SDORuntimeException& c); + + // Destructor + virtual ~TuscanyRuntimeException(); + + /** + * Return class name of this exception. + */ + const char* getEClassName() const; + + /** + * Return severity. + */ + severity_level getSeverity() const; + + /** + * Return message text associated with exception. + */ + const char* getMessageText() const; + + /* + * Return file name where the exception was raised. + */ + const char* getFileName() const; + + /** + * Return line number where the exception was raised. + */ + unsigned long getLineNumber() const; + + /** + * Return function name where the exception was raised. + */ + const char* getFunctionName() const; + + /** + * Set the exception severity. + */ + void setSeverity(severity_level sev); + + /** + * Set the message text associated with exception. + */ + void setMessageText(const char* msg_text); + + /** + * Set the location where the exception was raised. + * @param file Name of the file. + * @param line Line number in the file. + * @param function Name of the function. + */ + void setLocation(const char* file, + unsigned long line, + const char* function=""); + + /** + * Append exception details to ostream. + */ + virtual std::ostream& PrintSelf(std::ostream &os) const; + + /** + * Operator to send exceptions details to a stream. + */ + SCA_API friend std::ostream& operator<< (std::ostream &os, const TuscanyRuntimeException &except); + + protected: + + private: + /** + * Class name of the exception. + */ + char* class_name; + + /** + * Severity level of the exception. + */ + severity_level severity; + + /** + * Description of the exception. + */ + char* message_text; // Description of exception + + /** + * Location where the exception was thrown or handled and thrown. + */ + class location + { + public: + char* file; // File name (from __FILE__) + unsigned long line; // Line number (from __LINE__) + char* function; // Function name + }; + + + enum {num_locations=5}; + /** + * Array of locations where the exception has been handled and thrown. + */ + location locations[num_locations]; + + /** + * The current location (index into TuscanyRuntimeException#location). + */ + int location_set; + + /** + * A snapshot of the stack when the exception was constructed + */ +#if defined(WIN32) || defined (_WINDOWS) +#else + int stacktrace_size; + char** stacktrace_symbols; +#endif + + }; // End TuscanyRuntimeException class definition + + + /** + * Indicates a problem in the consistency of the SCA model provided to the + * Tuscany runtime. + */ + class SCA_API SystemConfigurationException: public TuscanyRuntimeException + { + public: + SystemConfigurationException(const char* msg) + : TuscanyRuntimeException("SystemConfigurationException", Severe, + msg) + { + } + + SystemConfigurationException( + const char *name, + severity_level sev, + const char* msg_text) + : TuscanyRuntimeException(name, sev, msg_text) + { + } + + SystemConfigurationException(const commonj::sdo::SDORuntimeException& c) + : TuscanyRuntimeException(c) + { + } + private: + }; + + /** + * Indicates a problem while invoking a service. + */ + class SCA_API ServiceInvocationException: public TuscanyRuntimeException + { + public: + ServiceInvocationException(const char* msg) + : TuscanyRuntimeException("ServiceInvocationException", Severe, msg) + { + } + + ServiceInvocationException( + const char *name, + severity_level sev, + const char* msg_text) + : TuscanyRuntimeException(name, sev, msg_text) + { + } + + ServiceInvocationException(const commonj::sdo::SDORuntimeException& c) + : TuscanyRuntimeException(c) + { + } + + private: + }; + + /** + * Indicates a problem while working with service data. + */ + class SCA_API ServiceDataException: public TuscanyRuntimeException + { + public: + ServiceDataException(const char* msg) + : TuscanyRuntimeException("ServiceDataException", Severe, + msg) + { + } + + ServiceDataException( + const char *name, + severity_level sev, + const char* msg_text) + : TuscanyRuntimeException(name, sev, msg_text) + { + } + + ServiceDataException(const commonj::sdo::SDORuntimeException& c) + : TuscanyRuntimeException(c) + { + } + private: + }; + + } // End namespace sca +} // End namespace tuscany + + +/** + * ========================================================================= + * Macro - throwException + * + * adds the current file name, line number and function name to the exception. + * then throws the exception. + * The parameter 'function_name' should be the name of the function throwing + * this exception. + * The parameter 'type' is the class of exception to throw and must be a + * SDORuntimeException or a class derived from SDORuntimeException. + * The parameter 'parameter' is the construction parameter for the exception + * ========================================================================= +*/ + +#if defined(WIN32) || defined (_WINDOWS) +#define throwException(type, parameter) \ +{\ + type __TuscanyThrownException__(parameter); \ + __TuscanyThrownException__.setLocation(__FILE__,__LINE__,__FUNCTION__); \ + throw __TuscanyThrownException__;\ +} +#else +#define throwException(type, parameter) \ +{\ + type __TuscanyThrownException__(parameter); \ + __TuscanyThrownException__.setLocation(__FILE__,__LINE__,__PRETTY_FUNCTION__); \ + throw __TuscanyThrownException__;\ +} +#endif + +/** + ========================================================================= + * Macro - rethrowException + * + * adds the current file name, line number and function name to the exception. + * then re-throws the exception. + * The parameter 'function_name' should be the name of the function throwing + * this exception. + * ========================================================================= +*/ +#if defined(WIN32) || defined (_WINDOWS) +#define rethrowException(exception) \ +{\ + (exception).setLocation(__FILE__,__LINE__,__FUNCTION__); \ + throw (exception);\ +} +#else +#define rethrowException(exception) \ +{\ + (exception).setLocation(__FILE__,__LINE__,__PRETTY_FUNCTION__); \ + throw (exception);\ +} +#endif + +/** + * ========================================================================= + * Macro - handleException + * + * adds the current file name, line number and function name to the exception. + * Writes an exception trace entry then continues. + * The parameter 'function_name' should be the name of the function handling + * this exception. + * ========================================================================= +*/ +#if defined(WIN32) || defined (_WINDOWS) +#define handleException(__PRETTY_FUNCTION__, exception) \ +{\ + (exception).setLocation(__FILE__,__LINE__,__FUNCTION__); \ +} +#else +#define handleException(__PRETTY_FUNCTION__, exception) \ +{\ + (exception).setLocation(__FILE__,__LINE__,__PRETTY_FUNCTION__); \ +} +#endif + +#endif // tuscany_sca_core_exceptions_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Operation.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Operation.cpp new file mode 100644 index 0000000000..335ed5d369 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Operation.cpp @@ -0,0 +1,578 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <stdarg.h> +#include <sstream> + +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; +using namespace commonj::sdo; + + +namespace tuscany +{ + namespace sca + { + // =========== + // Constructor + // =========== + Operation::Operation(const char* operationName) + { + logentry(); + if (operationName != 0) + { + name = operationName; + } + } + + // ========== + // Destructor + // ========== + Operation::~Operation() + { + logentry(); + clean(); + } + + // ========== + // Copy Constructor + // ========== + Operation::Operation(const Operation& op) + { + logentry(); + copy(op); + } + + // ========== + // operator= + // ========== + Operation& Operation::operator=(const Operation& op) + { + logentry(); + if (&op != this) + { + copy(op); + } + return *this; + } + + // ========== + // Clean + // ========== + void Operation::clean() + { + logentry(); + for (unsigned int i = 0; i < getNParms(); i++) + { + const Parameter& parm = getParameter(i); + if (parm.getType() == DATAOBJECT) + { + delete (DataObjectPtr*)parm.getValue(); + } + } + + parameters.empty(); + + if (getReturnType() == DATAOBJECT) + { + delete (DataObjectPtr*)getReturnValue(); + } + } + + // ========== + // Copy + // ========== + void Operation::copy(const Operation& op) + { + logentry(); + clean(); + for (unsigned int i = 0; i < op.getNParms(); i++) + { + const Parameter& parm = op.getParameter(i); + if (parm.getType() == DATAOBJECT) + { + addParameter((const DataObject*)parm.getValue()); + } + else + { + parameters.insert(parameters.end(), parm); + } + } + + if (getReturnType() == DATAOBJECT) + { + setReturnValue((const DataObjectPtr*)op.getReturnValue()); + } + else + { + returnValue = op.returnValue; + } + } + + // ============================================== + // getParameter: return parameter at position pos + // ============================================== + void* Operation::getParameterValue(unsigned int pos) const + { + logentry(); + if (pos < parameters.size()) + { + return parameters[pos].getValue(); + } + + return 0; + } + + // ================================================== + // getParameter: return parameter value based on name + // ================================================== + void* Operation::getParameterValue(const string& name) const + { + logentry(); + try + { + return getParameter(name).getValue(); + } + catch(ServiceInvocationException) + {} + + return 0; + } + + // ====================================================== + // getParameter: return parameter based on index position + // ====================================================== + const Operation::Parameter& Operation::getParameter(unsigned int pos) const + { + logentry(); + if (pos < parameters.size()) + { + return parameters[pos]; + } + + throwException(ServiceInvocationException, "Index out of range"); + } + + // =============================================== + // getParameter: return of parameter based on name + // =============================================== + const Operation::Parameter& Operation::getParameter(const string& name) const + { + logentry(); + for(unsigned int pos=0; pos < parameters.size(); pos++) + { + if(parameters[pos].getName() == name) + { + return parameters[pos]; + } + } + + throwException(ServiceInvocationException, "Parameter name not found"); + } + + + // ============================================================ + // getParameterType: return type of parameter based on position + // ============================================================ + Operation::ParameterType Operation::getParameterType(unsigned int pos) const + { + logentry(); + if (pos < parameters.size()) + { + return parameters[pos].getType(); + } + + return VOID_TYPE; + } + + // ======================================================== + // getParameterType: return type of parameter based on name + // ======================================================== + Operation::ParameterType Operation::getParameterType(const string& name) const + { + logentry(); + try + { + return getParameter(name).getType(); + } + catch(ServiceInvocationException) + {} + + return VOID_TYPE; + } + + const string emptyString = string(); + + // ============================================== + // getParameterName: return name of parameter + // ============================================== + const string& Operation::getParameterName(unsigned int pos) const + { + logentry(); + if (pos < parameters.size()) + { + return parameters[pos].getName(); + } + + return emptyString; + } + + // =========================================== + // addParameter: set parameter at position pos + // =========================================== + void Operation::addParameter(const void *parm) + { + logentry(); + loginfo("Adding operation parameter, type: void, value: %p", parm); + parameters.insert(parameters.end(), Parameter((void*)parm, VOID_TYPE)); + } + + void Operation::addParameter(const bool *parm) + { + logentry(); + loginfo("Adding operation parameter, type: bool, value: %d", (int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, BOOL)); + } + + void Operation::addParameter(const short *parm) + { + logentry(); + loginfo("Adding operation parameter, type: short, value: %hd", (short)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, SHORT)); + } + + void Operation::addParameter(const int *parm) + { + logentry(); + loginfo("Adding operation parameter, type: int, value: %d", (int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, INT)); + } + + void Operation::addParameter(const long *parm) + { + logentry(); + loginfo("Adding operation parameter, type: long, value: %ld", (long)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, LONG)); + } + + void Operation::addParameter(const unsigned short *parm) + { + logentry(); + loginfo("Adding operation parameter, type: unsigned short, value: %hu", (unsigned short)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, USHORT)); + } + + void Operation::addParameter(const unsigned int *parm) + { + logentry(); + loginfo("Adding operation parameter, type: unsigned int, value: %u", (unsigned int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, UINT)); + } + + void Operation::addParameter(const unsigned long *parm) + { + logentry(); + loginfo("Adding operation parameter, type: unsigned long, value: %lu", (unsigned long)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, ULONG)); + } + + void Operation::addParameter(const float *parm) + { + logentry(); + loginfo("Adding operation parameter, type: float, value: %f", (float)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, FLOAT)); + } + + void Operation::addParameter(const double *parm) + { + logentry(); + loginfo("Adding operation parameter, type: double, value: %lf", (double)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, DOUBLE)); + } + + void Operation::addParameter(const long double *parm) + { + logentry(); + loginfo("Adding operation parameter, type: long double, value: %Lf", (long double)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, LONGDOUBLE)); + } + + void Operation::addParameter(const char* *parm) + { + logentry(); + loginfo("Adding operation parameter, type: char*, value: %s", (const char*)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, CHARS)); + } + + void Operation::addParameter(const char *parm) + { + logentry(); + loginfo("Adding operation parameter, type: char, value: %d", (int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, CHAR)); + } + + void Operation::addParameter(const string *parm) + { + logentry(); + loginfo("Adding operation parameter, type: string, value: %s", (const char*)(*parm).c_str()); + parameters.insert(parameters.end(), Parameter((void*)parm, STRING)); + } + + void Operation::addParameter(const DataObjectPtr *parm) + { + logentry(); + ostringstream os; + os << *parm; + loginfo("Adding operation parameter, type: DataObject, value: %s", os.str().c_str()); + parameters.insert(parameters.end(), Parameter((void*)new DataObjectPtr(*parm), DATAOBJECT)); + } + + // ======================================================= + // addParameter: set parameter at position pos with a name + // ======================================================= + void Operation::addParameter(const string& name, const void *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: void, value: %p", name.c_str(), parm); + parameters.insert(parameters.end(), Parameter((void*)parm, VOID_TYPE, (string&) name)); + } + + void Operation::addParameter(const string& name, const bool *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: bool, value: %d", name.c_str(), (int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, BOOL, (string&) name)); + } + + void Operation::addParameter(const string& name, const short *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: short, value: %hd", name.c_str(), (short)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, SHORT, (string&) name)); + } + + void Operation::addParameter(const string& name, const int *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: int, value: %d", name.c_str(), (int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, INT, (string&) name)); + } + + void Operation::addParameter(const string& name, const long *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: long, value: %ld", name.c_str(), (long)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, LONG, (string&) name)); + } + + void Operation::addParameter(const string& name, const unsigned short *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: unsigned short, value: %hu", (unsigned short)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, USHORT, (string&) name)); + } + + void Operation::addParameter(const string& name, const unsigned int *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: unsigned int, value: %u", name.c_str(), (unsigned int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, UINT, (string&) name)); + } + + void Operation::addParameter(const string& name, const unsigned long *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: unsigned long, value: %lu", name.c_str(), (unsigned long)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, ULONG, (string&) name)); + } + + void Operation::addParameter(const string& name, const float *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: float, value: %f", name.c_str(), (float)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, FLOAT, (string&) name)); + } + + void Operation::addParameter(const string& name, const double *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: double, value: %lf", name.c_str(), (double)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, DOUBLE, (string&) name)); + } + + void Operation::addParameter(const string& name, const long double *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: long double, value: %Lf", name.c_str(), (long double)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, LONGDOUBLE, (string&) name)); + } + + void Operation::addParameter(const string& name, const char* *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: char*, value: %s", name.c_str(), (const char*)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, CHARS, (string&) name)); + } + + void Operation::addParameter(const string& name, const char *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: char, value: %d", name.c_str(), (int)*parm); + parameters.insert(parameters.end(), Parameter((void*)parm, CHAR, (string&) name)); + } + + void Operation::addParameter(const string& name, const string *parm) + { + logentry(); + loginfo("Adding operation parameter, name: %s, type: string, value: %s", name.c_str(), (const char*)(*parm).c_str()); + parameters.insert(parameters.end(), Parameter((void*)parm, STRING, (string&) name)); + } + + void Operation::addParameter(const string& name, const DataObjectPtr *parm) + { + logentry(); + ostringstream os; + os << *parm; + loginfo("Adding operation parameter, name: %s, type: DataObject, value: %s", name.c_str(), os.str().c_str()); + parameters.insert(parameters.end(), Parameter((void*)new DataObjectPtr(*parm), DATAOBJECT, (string&) name)); + } + + Operation::Parameter::Parameter(void* val, Operation::ParameterType typ, const string& nam) + : value(val), type(typ), name(nam) + { + } + + // =========================================== + // setReturnValue + // =========================================== + void Operation::setReturnValue(const void *parm) + { + logentry(); + loginfo("Setting operation return value, type: void, value: %p", parm); + returnValue = Parameter((void*)parm, VOID_TYPE); + } + + void Operation::setReturnValue(const bool *parm) + { + logentry(); + loginfo("Setting operation return value, type: bool, value: %d", (bool)*parm); + returnValue = Parameter((void*)parm, BOOL); + } + + void Operation::setReturnValue(const short *parm) + { + logentry(); + loginfo("Setting operation return value, type: short, value: %h", (short)*parm); + returnValue = Parameter((void*)parm, SHORT); + } + + void Operation::setReturnValue(const int *parm) + { + logentry(); + loginfo("Setting operation return value, type: int, value: %d", (int)*parm); + returnValue = Parameter((void*)parm, INT); + } + + void Operation::setReturnValue(const long *parm) + { + logentry(); + loginfo("Setting operation return value, type: long, value: %l", (long)*parm); + returnValue = Parameter((void*)parm, LONG); + } + + void Operation::setReturnValue(const unsigned short *parm) + { + logentry(); + loginfo("Setting operation return value, type: unsigned short, value: %hu", (unsigned short)*parm); + returnValue = Parameter((void*)parm, USHORT); + } + + void Operation::setReturnValue(const unsigned int *parm) + { + logentry(); + loginfo("Setting operation return value, type: unsigned short, value: %u", (unsigned int)*parm); + returnValue = Parameter((void*)parm, UINT); + } + + void Operation::setReturnValue(const unsigned long *parm) + { + logentry(); + loginfo("Setting operation return value, type: unsigned long, value: %lu", (unsigned long)*parm); + returnValue = Parameter((void*)parm, ULONG); + } + + void Operation::setReturnValue(const float *parm) + { + logentry(); + loginfo("Setting operation return value, type: float, value: %f", (float)*parm); + returnValue = Parameter((void*)parm, FLOAT); + } + + void Operation::setReturnValue(const double *parm) + { + logentry(); + loginfo("Setting operation return value, type: double, value: %lf", (double)*parm); + returnValue = Parameter((void*)parm, DOUBLE); + } + + void Operation::setReturnValue(const long double *parm) + { + logentry(); + loginfo("Setting operation return value, type: long double, value: %Lf", (long double)*parm); + returnValue = Parameter((void*)parm, LONGDOUBLE); + } + + void Operation::setReturnValue(const char *parm) + { + logentry(); + loginfo("Setting operation return value, type: char, value: %d", (char)*parm); + returnValue = Parameter((void*)parm, CHAR); + } + + void Operation::setReturnValue(const char* *parm) + { + logentry(); + loginfo("Setting operation return value, type: char*, value: %s", (char*)*parm); + returnValue = Parameter((void*)parm, CHARS); + } + + void Operation::setReturnValue(const string *parm) + { + logentry(); + loginfo("Setting operation return value, type: string, value: %s", (*parm).c_str()); + returnValue = Parameter((void*)parm, STRING); + } + + void Operation::setReturnValue(const DataObjectPtr *parm) + { + logentry(); + ostringstream os; + os << *parm; + loginfo("Setting operation return value, type: DataObject, value: %s", os.str().c_str()); + returnValue = Parameter((void*)new DataObjectPtr(*parm), DATAOBJECT); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Operation.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Operation.h new file mode 100644 index 0000000000..89cf0b63b7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/Operation.h @@ -0,0 +1,251 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_core_operation_h +#define tuscany_sca_core_operation_h + +#include <string> +#include <vector> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + /** + * Holds the details of a single invocation of a business method. + * This class is used to pass the parameters and operation name from the + * client to a service. It will also hold the return value on the + * return from the business method. + */ + class Operation + { + public: + /** + * Create a new operation. + * @param operationName The method name of the business method to be invoked. + * @param numParameters The number of parameters to be passed. + */ + SCA_API Operation(const char* operationName = 0); + + /** + * Destructor. + */ + SCA_API virtual ~Operation(); + + /** + * Copy constructor. + */ + SCA_API Operation(const Operation& op); + + /** + * Assignment operator. + */ + SCA_API Operation& operator=(const Operation& op); + + /** + * Return the operation name. + * @return The name of the operation. + */ + SCA_API const std::string& getName() const {return name;} + + + enum ParameterType + { + UNSET = 0, + VOID_TYPE, + BOOL, + SHORT, + INT, + LONG, + USHORT, + UINT, + ULONG, + FLOAT, + DOUBLE, + LONGDOUBLE, + CHARS, + CHAR, + STRING, + DATAOBJECT + }; + + class Parameter + { + public: + SCA_API Parameter(void* value = NULL, ParameterType type = VOID_TYPE, const std::string& name = ""); + SCA_API void* getValue() const {return value;} + SCA_API ParameterType getType() const {return type;} + SCA_API const std::string& getName() const {return name;} + SCA_API bool hasName() const {return (name.length() > 0);} + + private: + std::string name; + void* value; + ParameterType type; + }; + + /** + * Set a return value for the operation. + * @param retVal Pointer to the return value. + */ + SCA_API void setReturnValue(const void *retVal); + SCA_API void setReturnValue(const bool *retVal); + SCA_API void setReturnValue(const short *retVal); + SCA_API void setReturnValue(const int *retVal); + SCA_API void setReturnValue(const long *retVal); + SCA_API void setReturnValue(const unsigned short *retVal); + SCA_API void setReturnValue(const unsigned int *retVal); + SCA_API void setReturnValue(const unsigned long *retVal); + SCA_API void setReturnValue(const float *retVal); + SCA_API void setReturnValue(const double *retVal); + SCA_API void setReturnValue(const long double *retVal); + SCA_API void setReturnValue(const char *retVal); + SCA_API void setReturnValue(const char* *retVal); + SCA_API void setReturnValue(const std::string *retVal); + SCA_API void setReturnValue(const commonj::sdo::DataObjectPtr *retVal); + + /** + * Set a parameter on the operation. + * @param parm Pointer to the parameter to be passed. + */ + SCA_API void addParameter(const void *parm); + SCA_API void addParameter(const bool *parm); + SCA_API void addParameter(const short *parm); + SCA_API void addParameter(const int *parm); + SCA_API void addParameter(const long *parm); + SCA_API void addParameter(const unsigned short *parm); + SCA_API void addParameter(const unsigned int *parm); + SCA_API void addParameter(const unsigned long *parm); + SCA_API void addParameter(const float *parm); + SCA_API void addParameter(const double *parm); + SCA_API void addParameter(const long double *parm); + SCA_API void addParameter(const char *parm); + SCA_API void addParameter(const char* *parm); + SCA_API void addParameter(const std::string *parm); + SCA_API void addParameter(const commonj::sdo::DataObjectPtr *parm); + + /** + * Set a parameter on the operation. + * @param name The name of the parameter in the parameter list. + * @param parm Pointer to the parameter to be passed. + */ + SCA_API void addParameter(const std::string& name, const void *parm); + SCA_API void addParameter(const std::string& name, const bool *parm); + SCA_API void addParameter(const std::string& name, const short *parm); + SCA_API void addParameter(const std::string& name, const int *parm); + SCA_API void addParameter(const std::string& name, const long *parm); + SCA_API void addParameter(const std::string& name, const unsigned short *parm); + SCA_API void addParameter(const std::string& name, const unsigned int *parm); + SCA_API void addParameter(const std::string& name, const unsigned long *parm); + SCA_API void addParameter(const std::string& name, const float *parm); + SCA_API void addParameter(const std::string& name, const double *parm); + SCA_API void addParameter(const std::string& name, const long double *parm); + SCA_API void addParameter(const std::string& name, const char *parm); + SCA_API void addParameter(const std::string& name, const char* *parm); + SCA_API void addParameter(const std::string& name, const std::string *parm); + SCA_API void addParameter(const std::string& name, const commonj::sdo::DataObjectPtr *parm); + + SCA_API unsigned int getNParms() const {return parameters.size();} + + /** + * Get a parameter from the operation. + * @param pos The position of the parameter in the parameter list. + * @return Pointer to the paramter at the given postion. Should be + * cast to the appropriate type. + */ + SCA_API const Parameter& getParameter(unsigned int pos) const; + + /** + * Get a parameter from the operation. + * @param name The name of the parameter in the parameter list. + * @return Pointer to the paramter with the given name. Should be + * cast to the appropriate type. + */ + SCA_API const Parameter& getParameter(const std::string& name) const; + + /** + * Get a parameter type from the operation. + * @param pos The position of the parameter in the parameter list. + * @return Type of the parameter at the given position. + */ + SCA_API ParameterType getParameterType(unsigned int pos) const; + + /** + * Get a parameter type from the operation. + * @param name The name of the parameter in the parameter list. + * @return Type of the parameter with the given name. + */ + SCA_API ParameterType getParameterType(const std::string& name) const; + + /** + * Get a parameter name from the operation. + * @param pos The position of the parameter in the parameter list. + * @return Name of the parameter at the given position. + */ + SCA_API const std::string& getParameterName(unsigned int pos) const; + + /** + * Get the parameter value from the operation. + * @param pos The position of the parameter in the parameter list. + * @return Pointer to the value of the parameter at the given postion. Should be + * cast to the appropriate type. + */ + SCA_API void* getParameterValue(unsigned int pos) const; + + /** + * Get the parameter value from the operation. + * @param name The name of the parameter in the parameter list. + * @return Pointer to the value of the parameter with the given name. Should be + * cast to the appropriate type. + */ + SCA_API void* getParameterValue(const std::string& name) const; + + SCA_API ParameterType getReturnType() const {return returnValue.getType();} + SCA_API void* getReturnValue() const {return returnValue.getValue();} + + private: + /** + * Operation name (method name). + */ + std::string name; + + /** + * Array of parameters. + */ + typedef std::vector<Parameter> PARAMETER_VECTOR; + + PARAMETER_VECTOR parameters; + + Parameter returnValue; + + void clean(); + void copy(const Operation& op); + + }; + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_core_operation_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/SCARuntime.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/SCARuntime.cpp new file mode 100644 index 0000000000..d605f37f95 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/SCARuntime.cpp @@ -0,0 +1,616 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/ModelLoader.h" +#include "tuscany/sca/util/File.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" + +using namespace std; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + /** + * Environment variable names + */ + static const char* TUSCANY_SCACPP = "TUSCANY_SCACPP"; + static const char* TUSCANY_SCACPP_SYSTEM_ROOT = "TUSCANY_SCACPP_SYSTEM_ROOT"; + static const char* TUSCANY_SCACPP_DEFAULT_COMPONENT = "TUSCANY_SCACPP_DEFAULT_COMPONENT"; + + static const char* TUSCANY_SCACPP_ROOT = "TUSCANY_SCACPP_ROOT"; + static const char* TUSCANY_SCACPP_COMPONENT = "TUSCANY_SCACPP_COMPONENT"; + static const char* TUSCANY_SCACPP_PATH = "TUSCANY_SCACPP_PATH"; + static const char* TUSCANY_SCACPP_BASE_URI = "TUSCANY_SCACPP_BASE_URI"; + + // Initialize statics + SCARuntime* SCARuntime::sharedRuntime = NULL; + Mutex SCARuntime::sharedRuntimeLock; + ThreadLocal SCARuntime::current; + + + // =================================================================== + // Constructor for the SCARuntime class. This will + // hold all the information about the current runtime. + // =================================================================== + SCARuntime::SCARuntime(const string& insRoot, + const string& sysRoot, const string& sysPath, + const string& base, const string& defName) + : system(0), + installRoot(insRoot), systemRoot(sysRoot), systemPath(sysPath), + defaultBaseURI(base), defaultComponentName(defName) + { + logentry(); + + if (installRoot == "") + { + // Get install dir from environment variable TUSCANY_SCACPP + const char* root = getenv(TUSCANY_SCACPP); + if (root != NULL) + { + installRoot = root; + } + else + { + string msg = TUSCANY_SCACPP; + msg += " environment variable not set"; + throwException(SystemConfigurationException, msg.c_str()); + } + } + loginfo("SCA runtime install root: %s", installRoot.c_str()); + + if (systemRoot == "") + { + // Get root from environment variable TUSCANY_SCACPP_ROOT + char* systemRootEnv = getenv(TUSCANY_SCACPP_ROOT); + if (systemRootEnv == 0) + { + // Get root from environment variable TUSCANY_SCACPP_SYSTEM_ROOT + systemRootEnv = getenv(TUSCANY_SCACPP_SYSTEM_ROOT); + } + if (systemRootEnv == 0) + { + string msg = TUSCANY_SCACPP_ROOT; + msg += " environment variable not set"; + throwException(SystemConfigurationException, msg.c_str()); + } + + systemRoot = systemRootEnv; + } + else + { + loginfo("System root: %s", systemRoot.c_str()); + } + + if (systemPath == "") + { + + // Get system path from environment variable TUSCANY_SCACPP_PATH + char* systemPathEnv = getenv(TUSCANY_SCACPP_PATH); + if (systemPathEnv != 0) + { + systemPath = systemPathEnv; + } + } + else + { + loginfo("System path: %s", systemPath.c_str()); + } + + if (defaultBaseURI == "") + { + + // Get default base URI from environment variable TUSCANY_SCACPP_BASE_URI + char* baseURI = getenv(TUSCANY_SCACPP_BASE_URI); + if (baseURI != 0) + { + defaultBaseURI = baseURI; + } + } + else + { + loginfo("Default base URI: %s", defaultBaseURI.c_str()); + } + + if (defaultComponentName == "") + { + const char* defComp = getenv(TUSCANY_SCACPP_COMPONENT); + if (!defComp) + { + defComp = getenv(TUSCANY_SCACPP_DEFAULT_COMPONENT); + } + if (defComp) + { + defaultComponentName = defComp; + } + } + loginfo("Default component: %s", defaultComponentName.c_str()); + + SCARuntime* currentRuntime = (SCARuntime*)current.getValue(); + current.setValue(this); + try + { + + // Load the runtime extensions + loadExtensions(); + + // Load the system composite + loadSystem(); + } + catch (...) + { + current.setValue(currentRuntime); + throw; + } + current.setValue(currentRuntime); + + // Find the default component + if (defaultComponentName != "") + { + Component* comp = system->findComponent(defaultComponentName); + if (!comp) + { + string message = "Component \'" + defaultComponentName + "\' not found"; + throwException(SystemConfigurationException, message.c_str()); + } + defaultComponent.setValue(comp); + } + + } + + // =================================================================== + // Destructor for the SCARuntime class. + // =================================================================== + SCARuntime::~SCARuntime() + { + logentry(); + + if (system) + { + delete system; + } + } + + // ========================================================== + // Returns the system configuration root + // ========================================================== + const string& SCARuntime::getSystemRoot() + { + return systemRoot; + } + + // ========================================================== + // Returns the system path + // ========================================================== + const string& SCARuntime::getSystemPath() + { + return systemPath; + } + + // ========================================================== + // Returns the default component name + // ========================================================== + const string& SCARuntime::getDefaultComponentName() + { + return defaultComponentName ; + } + + // ========================================================== + // Returns the default base URI + // ========================================================== + const string& SCARuntime::getDefaultBaseURI() + { + return defaultBaseURI; + } + + // ========================================================== + // Returns the install root + // ========================================================== + const string& SCARuntime::getInstallRoot() + { + return installRoot; + } + + // ============================================================= + // Get the runtime associated with the current thread. + // ============================================================= + SCARuntime* SCARuntime::getCurrentRuntime() + { + logentry(); + + SCARuntime* runtime = (SCARuntime*)current.getValue(); + if (runtime == NULL) + { + runtime = getSharedRuntime(); + if (runtime != NULL) + { + setCurrentRuntime(runtime); + } + else + { + runtime = new SCARuntime(); + setCurrentRuntime(runtime); + } + } + loginfo("Runtime: %p", runtime); + return runtime; + } + + // ============================================================= + // Set the runtime associated with the current thread. + // ============================================================= + void SCARuntime::setCurrentRuntime(SCARuntime* runtime) + { + logentry(); + + loginfo("Runtime: %p", runtime); + current.setValue(runtime); + } + + // ============================================================= + // Get the runtime associated with the current process. + // ============================================================= + SCARuntime* SCARuntime::getSharedRuntime() + { + logentry(); + + sharedRuntimeLock.lock(); + SCARuntime* runtime = sharedRuntime; + sharedRuntimeLock.unlock(); + + return runtime; + } + + // ============================================================= + // Initialize the runtime associated with the current process. + // ============================================================= + SCARuntime* SCARuntime::initializeSharedRuntime(const string& installRoot, const string& systemRoot, + const string& systemPath, const string& baseURI, const string& defaultComponentName) + { + logentry(); + + SCARuntime* runtime; + + sharedRuntimeLock.lock(); + try + { + if (sharedRuntime == NULL) + { + sharedRuntime = new SCARuntime(installRoot, systemRoot, systemPath, baseURI, defaultComponentName); + } + else + { + if (installRoot.size() != 0 && sharedRuntime->getInstallRoot() != installRoot) + { + string msg = "Cannot reconfigure runtime installation directory: " + string(installRoot); + throwException(SystemConfigurationException, msg.c_str()); + } + if (systemRoot.size() != 0 && sharedRuntime->getSystemRoot() != systemRoot) + { + string msg = "Cannot reconfigure SCA system root: " + string(systemRoot); + throwException(SystemConfigurationException, msg.c_str()); + } + if (systemPath.size() != 0 && sharedRuntime->getSystemPath() != systemPath) + { + string msg = "Cannot reconfigure SCA system path: " + string(systemPath); + throwException(SystemConfigurationException, msg.c_str()); + } + if (baseURI.size() != 0 && sharedRuntime->getDefaultBaseURI() != baseURI) + { + string msg = "Cannot reconfigure SCA system URI: " + string(baseURI); + throwException(SystemConfigurationException, msg.c_str()); + } + if (defaultComponentName.size() != 0 && sharedRuntime->getDefaultComponentName() != defaultComponentName) + { + string msg = "Cannot reconfigure main SCA component: " + string(baseURI); + throwException(SystemConfigurationException, msg.c_str()); + } + } + + runtime = sharedRuntime; + } + catch (...) + { + sharedRuntimeLock.unlock(); + throw; + } + sharedRuntimeLock.unlock(); + + return runtime; + } + + // ====================================== + // Load the system composite + // ====================================== + void SCARuntime::loadSystem() + { + logentry(); + + system = new Composite("tuscany/sca/system", ""); + ModelLoader loader(this, system); + loader.load(systemRoot, systemPath); + } + + // ====================================== + // Load up extensions to the runtime + // ====================================== + void SCARuntime::loadExtensions() + { + logentry(); + + string extensionsRoot = installRoot + "/extensions"; + +#if defined(WIN32) || defined (_WINDOWS) + string libraryExtension = ".dll"; +#else +#if defined(IS_DARWIN) + string libraryExtension = ".dylib"; +#else + string libraryExtension = ".so"; +#endif +#endif + string pattern = "*" + libraryExtension; + + // Get list of all directories named "module" + Files extensionModules(extensionsRoot, "module", true, true); + loginfo("Found %i extension modules", extensionModules.size() ); + for (unsigned int emI=0; emI < extensionModules.size(); emI++) + { + string extensionRoot = extensionModules[emI].getDirectory().c_str(); + extensionRoot += "/module"; + loginfo("Loading extension module: %s", extensionRoot.c_str() ); + + Files files(extensionRoot, pattern, true); + loginfo("Found %i extension libraries", files.size() ); + for (unsigned int i=0; i < files.size(); i++) + { + try + { + string filename = files[i].getFileName(); + loginfo("Loading extension library: %s", filename ); + Library lib = Library( files[i].getDirectory() + "/" + filename); + + // Determine the name of the initialize method + // 1) strip the .dll/.so/.dylib suffix + // 2) for non-Windows strip any lib prefix + string initializeMethod; + #if defined(WIN32) || defined (_WINDOWS) + #else + if (filename.substr(0,3) == "lib") + { + initializeMethod = filename.substr(3, filename.size()-libraryExtension.size() - 3); + } + else + #endif + { + initializeMethod = filename.substr(0, filename.size()-libraryExtension.size()); + } + initializeMethod += "_initialize"; + TUSCANY_IMPLEMENTATION_EXTENSION_INITIALIZE extension = + (TUSCANY_IMPLEMENTATION_EXTENSION_INITIALIZE)lib.getSymbol(initializeMethod); + if (extension) + { + extension(); + extensionsList.push_back(lib); + } + } + catch (TuscanyRuntimeException& ex) + { + logwarning("Failed to load extension library: %s: %s: %s", + files[i].getFileName().c_str(), ex.getEClassName(), ex.getMessageText()); + } + } + } + } + + + // ====================================== + // register an interfaceExtension + // ====================================== + void SCARuntime::registerInterfaceExtension(InterfaceExtension* extension) + { + logentry(); + if (extension) + { + loginfo("Registering interface: %s", extension->getExtensionTypeQName().c_str()); + interfaceExtensions[extension->getExtensionTypeQName()] = extension; + } + } + + // ====================================== + // find an InterfaceExtension + // ====================================== + InterfaceExtension* SCARuntime::getInterfaceExtension(const string& extensionTypeQName) + { + return interfaceExtensions[extensionTypeQName]; + } + + // ====================================== + // register an implementationExtension + // ====================================== + void SCARuntime::registerImplementationExtension(ImplementationExtension* extension) + { + logentry(); + if (extension) + { + loginfo("Registering implementation: %s", extension->getExtensionTypeQName().c_str()); + implementationExtensions[extension->getExtensionTypeQName()] = extension; + } + } + + // ====================================== + // find an implementationExtension + // ====================================== + ImplementationExtension* SCARuntime::getImplementationExtension(const string& extensionTypeQName) + { + return implementationExtensions[extensionTypeQName]; + } + + // ====================================== + // register a referenceBindingExtension + // ====================================== + void SCARuntime::registerReferenceBindingExtension(ReferenceBindingExtension* extension) + { + logentry(); + if (extension) + { + loginfo("Registering reference binding: %s", extension->getExtensionTypeQName().c_str()); + referenceBindingExtensions[extension->getExtensionTypeQName()] = extension; + } + } + + // ====================================== + // find a referenceBindingExtension + // ====================================== + ReferenceBindingExtension* SCARuntime::getReferenceBindingExtension(const string& extensionTypeQName) + { + return referenceBindingExtensions[extensionTypeQName]; + } + + // ====================================== + // register a serviceBindingExtension + // ====================================== + void SCARuntime::registerServiceBindingExtension(ServiceBindingExtension* extension) + { + logentry(); + if (extension) + { + loginfo("Registering service binding: %s", extension->getExtensionTypeQName().c_str()); + serviceBindingExtensions[extension->getExtensionTypeQName()] = extension; + } + } + + // ====================================== + // find a serviceBindingExtension + // ====================================== + ServiceBindingExtension* SCARuntime::getServiceBindingExtension(const string& extensionTypeQName) + { + return serviceBindingExtensions[extensionTypeQName]; + } + + + // =================================== + // Return the top of the runtime model + // =================================== + Composite* SCARuntime::getSystem() + { + logentry(); + + return system; + } + + + // =================================================== + // setCurrentComponent: push component for this thread + // =================================================== + void SCARuntime::setCurrentComponent(Component* component) + { + logentry(); + + COMPONENT_STACK* compStack = (COMPONENT_STACK*)componentStack.getValue(); + if (compStack == NULL) + { + compStack = new COMPONENT_STACK(); + componentStack.setValue(compStack); + } + compStack->push(component); + } + + // ==================================================== + // unsetCurrentComponent: pop component for this thread + // ==================================================== + Component* SCARuntime::unsetCurrentComponent() + { + logentry(); + + COMPONENT_STACK* compStack = (COMPONENT_STACK*)componentStack.getValue(); + if (compStack != NULL) + { + if (compStack->size() > 0) + { + Component* component = compStack->top(); + compStack->pop(); + return component; + } + } + + return NULL; + } + + // ============================================================= + // getCurrentComponent: return current component for this thread + // ============================================================= + Component* SCARuntime::getCurrentComponent() + { + logentry(); + + COMPONENT_STACK* compStack = (COMPONENT_STACK*)componentStack.getValue(); + if (compStack != NULL) + { + if (compStack->size() > 0) + { + return compStack->top(); + } + } + + return NULL; + } + + // =========================================== + // getDefaultComponent: return the default composite component + // =========================================== + Component* SCARuntime::getDefaultComponent() + { + logentry(); + + Component* comp = (Component*)defaultComponent.getValue(); + if (comp == NULL && defaultComponentName != "") + { + comp = system->findComponent(defaultComponentName); + if (!comp) + { + string message = "Component \'" + defaultComponentName + "\' not found"; + throwException(SystemConfigurationException, message.c_str()); + } + defaultComponent.setValue(comp); + } + return comp; + } + + // =========================================== + // Set the default composite component + // =========================================== + void SCARuntime::setDefaultComponent(Component* component) + { + logentry(); + + return defaultComponent.setValue(component); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/SCARuntime.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/SCARuntime.h new file mode 100644 index 0000000000..ff93bd5005 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/SCARuntime.h @@ -0,0 +1,295 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_core_scaruntime_h +#define tuscany_sca_core_scaruntime_h + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <pthread.h> +#endif + +#include <stack> +#include <string> +#include <map> +#include <list> + +#include "tuscany/sca/export.h" +#include "tuscany/sca/extension/InterfaceExtension.h" +#include "tuscany/sca/extension/ImplementationExtension.h" +#include "tuscany/sca/extension/ReferenceBindingExtension.h" +#include "tuscany/sca/extension/ServiceBindingExtension.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/util/ThreadLocal.h" +#include "tuscany/sca/util/Mutex.h" + + +namespace tuscany +{ + namespace sca + { + + /** + * Represents an executing SCA runtime. + */ + class SCARuntime { + public: + + /** + * Constructor + */ + SCA_API SCARuntime(const std::string& installRoot = "", + const std::string& systemRoot = "", const std::string& systemPath = "", + const std::string& baseURI = "", const std::string& defaultComponentName = ""); + + /** + * Destructor + */ + SCA_API virtual ~SCARuntime(); + + /** + * Get the runtime associated with the current thread. + * @return The runtime associated with the current thread. + */ + SCA_API static SCARuntime* getCurrentRuntime(); + + /** + * Get the runtime associated with the current thread. + * @return The runtime associated with the current thread. + */ + SCA_API static void setCurrentRuntime(SCARuntime* runtime); + + /** + * Get the runtime associated with the current process. + * @return The runtime associated with the current process. + */ + SCA_API static SCARuntime* getSharedRuntime(); + + /** + * Initialize the runtime associated with the current process. + * @return The runtime associated with the current process. + */ + SCA_API static SCARuntime* initializeSharedRuntime(const std::string& installRoot = "", + const std::string& systemRoot = "", const std::string& systemPath = "", + const std::string& baseURI = "", const std::string& defaultComponentName = ""); + + /** + * Returns the directory in which the Tuscany runtime has been installed. + */ + SCA_API const std::string& getInstallRoot(); + + /** + * Returns the system root + */ + SCA_API const std::string& getSystemRoot(); + + /** + * Returns the search path for composites. + */ + SCA_API const std::string& getSystemPath(); + + /** + * Returns the default component name. + */ + SCA_API const std::string& getDefaultComponentName(); + + /** + * Returns the default base URI for the system + */ + SCA_API const std::string& getDefaultBaseURI(); + + /** + * Set the current component for the current thread. + * @param component The current component. + */ + SCA_API void setCurrentComponent(tuscany::sca::model::Component* component); + + /** + * Remove the current component from this thread, and return + * to the previous component (if there was one). + * @return The previous component. + */ + SCA_API tuscany::sca::model::Component* unsetCurrentComponent(); + + /** + * Get a pointer to the configured SCA system which this + * SCA runtime represents. + * The rest of the SCA configuration can be navigated from + * the System. + * @return The configured SCA system. + */ + SCA_API tuscany::sca::model::Composite* getSystem(); + + /** + * Return the current component for this thread. + * @return The current component for this thread. + */ + SCA_API tuscany::sca::model::Component* getCurrentComponent(); + + /** + * Get the default component set for the current thread. + * @return The default composite. + */ + SCA_API tuscany::sca::model::Component* getDefaultComponent(); + + /** + * Set the default component for the current thread. + * @return The default component. + */ + SCA_API void setDefaultComponent(tuscany::sca::model::Component* component); + + /** + * Register an implementation extension + */ + SCA_API void registerImplementationExtension(ImplementationExtension* extension); + + /** + * Returns the implementation extension associated with + * the specified qname + */ + SCA_API ImplementationExtension* getImplementationExtension(const std::string& typeQname); + + /** + * Register a reference binding extension + */ + SCA_API void registerReferenceBindingExtension(ReferenceBindingExtension* extension); + + /** + * Returns the reference binding extension associated with + * the specified qname + */ + SCA_API ReferenceBindingExtension* getReferenceBindingExtension(const std::string& typeQname); + + /** + * Register a service binding extension + */ + SCA_API void registerServiceBindingExtension(ServiceBindingExtension* extension); + + /** + * Returns the service binding extension associated with + * the specified qname + */ + SCA_API ServiceBindingExtension* getServiceBindingExtension(const std::string& typeQname); + + /** + * Register an interface extension + */ + SCA_API void registerInterfaceExtension(InterfaceExtension* extension); + + /** + * Returns the interface extension associated with + * the specified qname + */ + SCA_API InterfaceExtension* getInterfaceExtension(const std::string& typeQname); + + private: + + /** + * The runtime associated with the current thread. + */ + static tuscany::sca::util::ThreadLocal current; + + /** + * The runtime shared by all threads of the current process. + */ + static tuscany::sca::util::Mutex sharedRuntimeLock; + static SCARuntime* sharedRuntime; + + /** + * Pointer to the top of the runtime model. + */ + tuscany::sca::model::Composite* system; + + /** + * The installed path of the Tuscany runtime. + */ + std::string installRoot; + + /** + * The path to the system configuration + */ + std::string systemRoot; + + /** + * The search path for composites. + */ + std::string systemPath; + + /** + * The default base URI. + */ + std::string defaultBaseURI; + + /** + * The default CompositeComponent name. + */ + std::string defaultComponentName; + + /** + * Load the SCA configuration from the scdl files (sca.composite, + * *.fragment, etc). + * This will create the runtime model from which the SCA runtime + * will operate. + */ + void loadSystem(); + + /** + * Component stack for the current thread. + */ + typedef std::stack<tuscany::sca::model::Component*> COMPONENT_STACK; + tuscany::sca::util::ThreadLocal componentStack; + + /** + * The default component for the current thread. + */ + tuscany::sca::util::ThreadLocal defaultComponent; + + /** + * Runtime Extensions + */ + typedef std::map<std::string, ImplementationExtension*> IMPLEMENTATION_EXTENSIONS_MAP; + IMPLEMENTATION_EXTENSIONS_MAP implementationExtensions; + + typedef std::map<std::string, ReferenceBindingExtension*> REFERENCE_BINDING_EXTENSIONS_MAP; + REFERENCE_BINDING_EXTENSIONS_MAP referenceBindingExtensions; + + typedef std::map<std::string, ServiceBindingExtension*> SERVICE_BINDING_EXTENSIONS_MAP; + SERVICE_BINDING_EXTENSIONS_MAP serviceBindingExtensions; + + typedef std::map<std::string, InterfaceExtension*> INTERFACE_EXTENSIONS_MAP; + INTERFACE_EXTENSIONS_MAP interfaceExtensions; + + void loadExtensions(); + + typedef std::list<tuscany::sca::util::Library> EXTENSIONS_LIST; + EXTENSIONS_LIST extensionsList; + + }; + + } // End namespace sca +} // End namespace tuscany + +typedef void (* TUSCANY_IMPLEMENTATION_EXTENSION_INITIALIZE) (); + +#endif // tuscany_sca_core_scaruntime_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceProxy.cpp new file mode 100644 index 0000000000..c54d7648e3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceProxy.cpp @@ -0,0 +1,50 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + // ============================ + // Constructor: Create a proxy + // ============================ + ServiceProxy::ServiceProxy(Reference* reference) + : reference(reference) + { + logentry(); + } + + // ========== + // Destructor + // ========== + ServiceProxy::~ServiceProxy() + { + logentry(); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceProxy.h new file mode 100644 index 0000000000..f1a0309be1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceProxy.h @@ -0,0 +1,75 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_core_serviceproxy_h +#define tuscany_sca_core_serviceproxy_h + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" + + +namespace tuscany +{ + namespace sca + { + + /** + * Holds a proxy for a given component and reference. + * The proxy which is held inside a ServiceProxy will be specific to the component + * and reference and will have been code generated and be contained in a dll + * created by a developer of an SCA application. + */ + class SCA_API ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + * @param target The wrapper of the service which is wired to this reference. + */ + ServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Destructor. + */ + virtual ~ServiceProxy(); + + /** + * Returns the reference represented by this proxy. + * @return The Reference represented by this proxy. + */ + tuscany::sca::model::Reference* getReference() const { return reference; }; + + private: + + /** + * The reference represented by this proxy. + */ + tuscany::sca::model::Reference* reference; + + }; + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_core_serviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceWrapper.cpp new file mode 100644 index 0000000000..17666a5bb7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceWrapper.cpp @@ -0,0 +1,50 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/util/Logging.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + + // =========== + // Constructor + // =========== + ServiceWrapper::ServiceWrapper(Service* service) + : service(service) + { + logentry(); + } + + // ========== + // Destructor + // ========== + ServiceWrapper::~ServiceWrapper() + { + logentry(); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceWrapper.h new file mode 100644 index 0000000000..6a44c57675 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/core/ServiceWrapper.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_core_servicewrapper_h +#define tuscany_sca_core_servicewrapper_h + +#include "tuscany/sca/export.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + + /** + * An abstract class that wraps a component implementation or an external + * service. + */ + class SCA_API ServiceWrapper + { + public: + /** + * Constructor. + * @param target The service wrapper wraps the target of a wire. + */ + ServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~ServiceWrapper(); + + /** + * Get the service represented by this wrapper. + * @return The service represented by this wrapper. + */ + tuscany::sca::model::Service* getService() const { return service; } + + /** + * All business method calls on the target service are performed through + * this invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target service. + */ + virtual void invoke(Operation& operation) = 0; + + private: + /** + * The target represented by this wrapper. + */ + tuscany::sca::model::Service* service; + + }; + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_core_servicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/export.h new file mode 100644 index 0000000000..79b02fe4cf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/export.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_export_h +#define tuscany_sca_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef SCA_EXPORTS +#define SCA_API __declspec(dllexport) +#else +#define SCA_API __declspec(dllimport) +#endif + +#else +#include <sys/time.h> +#include <inttypes.h> +#include <stdlib.h> +#define SCA_API +#endif + +#endif // tuscany_sca_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ImplementationExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ImplementationExtension.cpp new file mode 100644 index 0000000000..a20cf1f6da --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ImplementationExtension.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/extension/ImplementationExtension.h" +#include "tuscany/sca/util/Logging.h" + +namespace tuscany +{ + namespace sca + { + // =================================================================== + // Constructor for the ImplementationExtension class. + // =================================================================== + ImplementationExtension::ImplementationExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the ImplementationExtension class. + // =================================================================== + ImplementationExtension::~ImplementationExtension() + { + logentry(); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ImplementationExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ImplementationExtension.h new file mode 100644 index 0000000000..524af2df77 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ImplementationExtension.h @@ -0,0 +1,79 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_implementationextension_h +#define tuscany_sca_extension_implementationextension_h + +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" + +namespace tuscany +{ + namespace sca + { + class SCA_API ImplementationExtension + { + public: + /** + * Default constructor + */ + ImplementationExtension(); + + /** + * Destructor + */ + virtual ~ImplementationExtension(); + + /** + * return the name of the extension (e.g. "cpp" "php") + */ + virtual const std::string& getExtensionName() = 0; + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#implementation.cpp") + */ + virtual const std::string& getExtensionTypeQName() = 0; + + /** + * Get an implementation from a DataObject representing + * an SCDL implementation element + */ + virtual tuscany::sca::model::ComponentType* getImplementation( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlImplementation) = 0; + + }; + + + } // End namespace sca +} // End namespace tuscany + + +#endif // tuscany_sca_extension_implementationextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/InterfaceExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/InterfaceExtension.cpp new file mode 100644 index 0000000000..584945344b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/InterfaceExtension.cpp @@ -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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/extension/InterfaceExtension.h" +#include "tuscany/sca/util/Logging.h" + +namespace tuscany +{ + namespace sca + { + // =================================================================== + // Constructor for the InterfaceExtension class. + // =================================================================== + InterfaceExtension::InterfaceExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the InterfaceExtension class. + // =================================================================== + InterfaceExtension::~InterfaceExtension() + { + logentry(); + } + + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/InterfaceExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/InterfaceExtension.h new file mode 100644 index 0000000000..5329104c77 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/InterfaceExtension.h @@ -0,0 +1,78 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_interfaceextension_h +#define tuscany_sca_extension_interfaceextension_h + +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/model/Composite.h" + + +namespace tuscany +{ + namespace sca + { + class SCA_API InterfaceExtension + { + public: + /** + * Default constructor + */ + InterfaceExtension(); + + /** + * Destructor + */ + virtual ~InterfaceExtension(); + + /** + * return the name of the extension (e.g. "cpp" "php") + */ + virtual const std::string& getExtensionName() = 0; + + /** + * return the QName of schema elemant for this interface extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.cpp") + */ + virtual const std::string& getExtensionTypeQName() = 0; + + /** + * Get an interface from a DataObject representing an + * SCDL interface + */ + virtual tuscany::sca::model::Interface* getInterface( + tuscany::sca::model::Composite *composite, + commonj::sdo::DataObjectPtr scdlInterface) = 0; + + }; + + + } // End namespace sca +} // End namespace tuscany + + +#endif // tuscany_sca_extension_interfaceextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ReferenceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ReferenceBindingExtension.cpp new file mode 100644 index 0000000000..a7f60dcbec --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ReferenceBindingExtension.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/extension/ReferenceBindingExtension.h" +#include "tuscany/sca/util/Logging.h" + +namespace tuscany +{ + namespace sca + { + // =================================================================== + // Constructor for the ReferenceBindingExtension class. + // =================================================================== + ReferenceBindingExtension::ReferenceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the ReferenceBindingExtension class. + // =================================================================== + ReferenceBindingExtension::~ReferenceBindingExtension() + { + logentry(); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ReferenceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ReferenceBindingExtension.h new file mode 100644 index 0000000000..c3d1e97c9e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ReferenceBindingExtension.h @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_referencebindingextension_h +#define tuscany_sca_extension_referencebindingextension_h + +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + class SCA_API ReferenceBindingExtension + { + public: + /** + * Default constructor + */ + ReferenceBindingExtension(); + + /** + * Destructor + */ + virtual ~ReferenceBindingExtension(); + + /** + * return the name of the extension (e.g. "cpp" "php") + */ + virtual const std::string& getExtensionName() = 0; + + /** + * return the QName of schema elemant for this binding extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.ws") + */ + virtual const std::string& getExtensionTypeQName() = 0; + + /** + * Get a reference binding from a DataObject representing + * an SCDL binding element + */ + virtual tuscany::sca::model::ReferenceBinding* getReferenceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Reference* reference, + commonj::sdo::DataObjectPtr scdlBinding) = 0; + + }; + + + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_referencebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ServiceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ServiceBindingExtension.cpp new file mode 100644 index 0000000000..f5fe361d36 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ServiceBindingExtension.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/extension/ServiceBindingExtension.h" +#include "tuscany/sca/util/Logging.h" + +namespace tuscany +{ + namespace sca + { + // =================================================================== + // Constructor for the ServiceBindingExtension class. + // =================================================================== + ServiceBindingExtension::ServiceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the ServiceBindingExtension class. + // =================================================================== + ServiceBindingExtension::~ServiceBindingExtension() + { + logentry(); + } + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ServiceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ServiceBindingExtension.h new file mode 100644 index 0000000000..d2f7e72ed0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/extension/ServiceBindingExtension.h @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_servicebindingextension_h +#define tuscany_sca_extension_servicebindingextension_h + +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceBinding.h" + + +namespace tuscany +{ + namespace sca + { + class SCA_API ServiceBindingExtension + { + public: + /** + * Default constructor + */ + ServiceBindingExtension(); + + /** + * Destructor + */ + virtual ~ServiceBindingExtension(); + + /** + * return the name of the extension (e.g. "cpp" "php") + */ + virtual const std::string& getExtensionName() = 0; + + /** + * return the QName of schema elemant for this binding extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.ws") + */ + virtual const std::string& getExtensionTypeQName() = 0; + + /** + * Get a reference binding from a DataObject representing + * an SCDL binding element + */ + virtual tuscany::sca::model::ServiceBinding* getServiceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Service* service, + commonj::sdo::DataObjectPtr scdlBinding) = 0; + + }; + + + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_servicebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Binding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Binding.cpp new file mode 100644 index 0000000000..a654b9f0f7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Binding.cpp @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/Binding.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + Binding::Binding(const string& uri) : uri(uri) + { + logentry(); + } + + // Destructor + Binding::~Binding() + { + logentry(); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Binding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Binding.h new file mode 100644 index 0000000000..66dc66e853 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Binding.h @@ -0,0 +1,83 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_binding_h +#define tuscany_sca_model_binding_h + +#include <string> + +namespace tuscany +{ + namespace sca + { + namespace model + { + /** + * Represents a binding. + * Bindings are used by services and references. References use bindings + * to describe the access mechanism used to call an external service (which can + * be a service provided by another SCA composite). Services use bindings to describe + * the access mechanism that clients (which can be a client from another SCA composite) + * have to use to call the service. + * This interface will typically be extended by binding implementations to allow + * specification of binding/transport specific information. + */ + class Binding + { + + public: + + /** + * Constructor to create a new binding. + * @param uri The binding URI. + */ + SCA_API Binding(const std::string& uri); + + /** + * Destructor. + */ + SCA_API virtual ~Binding(); + + /** + * Returns the binding type + * @return The binding type. + */ + SCA_API virtual std::string getType() = 0; + + /** + * Returns the binding URI. + * @return The binding URI. + */ + SCA_API virtual const std::string& getURI() const { return uri; }; + + private: + + /** + * The binding URI. + */ + std::string uri; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_binding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Component.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Component.cpp new file mode 100644 index 0000000000..37bf381811 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Component.cpp @@ -0,0 +1,148 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/ComponentType.h" + +using namespace std; +using namespace commonj::sdo; + +namespace tuscany +{ + namespace sca + { + namespace model + { + // Constructor + Component::Component(Composite* composite, const std::string& componentName, ComponentType *componentType) + : name(componentName), composite(composite), type(componentType) + { + logentry(); + loginfo("Component name: %s", name.c_str()); + + // Initialize the component from its component type + componentType->initializeComponent(this); + + } + + Component::~Component() + { + logentry(); + } + + void Component::addService(Service* service) + { + logentry(); + services[service->getType()->getName()] = service; + } + + Service* Component::findService(const string& serviceName) + { + logentry(); + + // If serviceName is empty then return the ONLY service + if (serviceName == "" + && services.size() == 1) + { + return services.begin()->second; + } + else + { + Service* service = services[serviceName]; + if (service == NULL) + { + // A service with an empty name will match any service name + service = services[""]; + } + return service; + } + } + + void Component::addReference(Reference* reference) + { + logentry(); + references[reference->getType()->getName()] = reference; + } + + Reference* Component::findReference(const std::string& referenceName) + { + logentry(); + return references[referenceName]; + } + + DataObjectPtr Component::getProperties() + { + logentry(); + + if (!properties) + { + properties = type->getPropertyDataFactory()->create("org/osoa/sca", "Properties"); + } + return properties; + } + + void Component::setProperty(const string& name, DataObjectPtr value) + { + logentry(); + + DataObjectPtr props = getProperties(); + + // Get the property's type + PropertyPtr propProperty = props->getInstanceProperty(name); + if (!propProperty) { + std::string msg("Property not found: "); + msg += name; + throwException(SystemConfigurationException, msg.c_str()); + } + const Type& propType = propProperty->getType(); + if (propType.isDataType()) + { + if (propProperty->isMany()) + { + DataObjectList& dol = props->getList(*propProperty); + dol.append(value->getCString("")); + } + else + { + props->setCString(*propProperty, value->getCString("")); + } + } + else + { + // Create a new instance of the DO + // iterate over properties setting each one + // for now: + props->setDataObject(*propProperty, value); + } + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Component.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Component.h new file mode 100644 index 0000000000..882d79a94c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Component.h @@ -0,0 +1,183 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_component_h +#define tuscany_sca_model_component_h + +#include <string> +#include <map> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + namespace model + { + + class Composite; + class ComponentType; + class Reference; + class ReferenceType; + class Service; + class ServiceType; + + /** + * A component is a configured instance of an implementation. Components provide + * and consume services. More than one component can use and configure the same + * implementation, where each component configures the implementation differently. + * For example each component may configure a reference of the same implementation + * to consume a different service. + */ + class Component + { + public: + + /** + * Constructor + * @param composite The composite containing the component. + * @param name The name of the component. + */ + SCA_API Component(Composite *composite, const std::string& name, ComponentType *type); + + /** + * Destructor. + */ + SCA_API virtual ~Component(); + + /** + * Returns the name of this component. + * @return the name of this component + */ + SCA_API const std::string& getName() const { return name; } + + /** + * Returns the composite containing this component. + * @return The composite containing this component. + */ + SCA_API Composite* getComposite() const { return composite; } + + /** + * Returns the type of this component. + * @return The type of this component. + */ + SCA_API ComponentType* getType() const { return type; } + + /** + * Add a new service to this component. + * @param service The service to add. + */ + SCA_API void addService(Service* service); + + /** + * Find an existing service on this component. + * @param serviceName The name of the service to find. + * If the serviceName is the zero length string then if there is + * only one service it will be returned. + * @return The found service, or 0 if not found. + */ + SCA_API Service* findService(const std::string& serviceName); + + /** + * Add a new reference to this component. + * @param reference The reference to add. + */ + SCA_API void addReference(Reference* reference); + + /** + * Find an existing reference on this component. + * @param referenceName The name of the reference to find. + * @return The found reference, or 0 if not found. + */ + SCA_API Reference* findReference(const std::string& referenceName); + + /** + * Returns all the services defined on this component. + * @return All the services defined on this component. + */ + typedef std::map<std::string, Service*> SERVICE_MAP; + SCA_API const SERVICE_MAP& getServices() const { return services; }; + + /** + * Returns all the references defined on this component. + * @return All the references defined on this component. + */ + typedef std::map<std::string, Reference*> REFERENCE_MAP; + SCA_API const REFERENCE_MAP& getReferences() const { return references; }; + + /** + * Set the value of a property defined on this component. The values + * will usually come from a component declaration in a composite file. + * @param name The name of the property. + * @param value The value of the property. + */ + SCA_API void setProperty(const std::string& name, commonj::sdo::DataObjectPtr value); + + /** + * Returns a data object from which all the properties of the component + * and their values can be accessed. + * @return A data object holding the property values. + */ + SCA_API commonj::sdo::DataObjectPtr getProperties(); + + private: + + /** + * Name of the component. + */ + std::string name; + + /** + * Composite containing the component. + */ + Composite* composite; + + /** + * Type of the component. + */ + ComponentType* type; + + /** + * Map of all the services defined on this component. + */ + SERVICE_MAP services; + + /** + * Map of all the references defined on this component. + */ + REFERENCE_MAP references; + + /** + * The properties and their values for this component. + */ + commonj::sdo::DataObjectPtr properties; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_component_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ComponentType.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ComponentType.cpp new file mode 100644 index 0000000000..20e70ede20 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ComponentType.cpp @@ -0,0 +1,294 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Reference.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + // Constructor + ComponentType::ComponentType(Composite* composite, const string& name) + : composite(composite), name(name) + { + logentry(); + } + + // Destructor + ComponentType::~ComponentType() + { + logentry(); + } + + void ComponentType::addServiceType(ServiceType* serviceType) + { + logentry(); + serviceTypes[serviceType->getName()] = serviceType; + } + + ServiceType* ComponentType::findServiceType(const string& serviceName) + { + logentry(); + + // If serviceName is empty then return the ONLY service + if (serviceName == "" + && serviceTypes.size() == 1) + { + return serviceTypes.begin()->second; + } + else + { + return serviceTypes[serviceName]; + } + } + + void ComponentType::addReferenceType(ReferenceType* referenceType) + { + logentry(); + + referenceTypes[referenceType->getName()] = referenceType; + } + + ReferenceType* ComponentType::findReferenceType(const string& referenceName) + { + logentry(); + + return referenceTypes[referenceName]; + } + + void ComponentType::addPropertyType(const string& name, + const string& type, + bool many, + DataObjectPtr* defaultValue) + { + logentry(); + + // Create a Type in the Properties dataFactory + DataFactoryPtr factory = getPropertyDataFactory(); + + string typeUri, typeName; + Utils::tokeniseQName(type, typeUri, typeName); + + if (typeUri == "http://www.w3.org/2001/XMLSchema") + { + typeUri = "commonj.sdo"; + if (typeName == "string") + { + typeName = "String"; + } + else if (typeName == "anyType") + { + typeName = "DataObject"; + } + else if (typeName == "int") + { + typeName = "Int"; + } + else if (typeName == "integer") + { + typeName = "Integer"; + } + else if (typeName == "negativeInteger") + { + typeName = "Integer"; + } + else if (typeName == "nonNegativeInteger") + { + typeName = "Integer"; + } + else if (typeName == "positiveInteger") + { + typeName = "Integer"; + } + else if (typeName == "nonPositiveInteger") + { + typeName = "Integer"; + } + else if (typeName == "unsignedLong") + { + typeName = "Integer"; + } + else if (typeName == "unsignedShort") + { + typeName = "Integer"; + } + else if (typeName == "unsignedInt") + { + typeName = "Long"; + } + else if (typeName == "long") + { + typeName = "Long"; + } + else if (typeName == "double") + { + typeName = "Double"; + } + else if (typeName == "short") + { + typeName = "Short"; + } + else if (typeName == "unsignedByte") + { + typeName = "Short"; + } + else if (typeName == "float") + { + typeName = "Float"; + } + else if (typeName == "boolean") + { + typeName = "Boolean"; + } + else if (typeName == "byte") + { + typeName = "Byte"; + } + else if (typeName == "base64Binary") + { + typeName = "Bytes"; + } + else if (typeName == "hexBinary") + { + typeName = "Bytes"; + } + else if (typeName == "anyURI") + { + typeName = "URI"; + } + else if (typeName == "QName") + { + typeName = "URI"; + } + else + { + // Default unknown xs: types to string?? + typeName = "String"; + } + } + else + { + // It's not an XML type + } + + factory->addPropertyToType( + "org/osoa/sca", + "Properties", + name.c_str(), + typeUri.c_str(), + typeName.c_str(), + many, + false, + true); + + // Set the default for a dataType + if (defaultValue!=NULL) + { + try + { + const Type& propType = factory->getType(typeUri.c_str(), typeName.c_str()); + if (propType.isDataType()) + { + factory->setDefault("org/osoa/sca", "Properties", + name.c_str(), + (char*)(*defaultValue)->getCString("")); + } + } + catch (SDOTypeNotFoundException&) + { + } + } + } + + const Property* ComponentType::findPropertyType(const string& propertyName) + { + logentry(); + const Property* property = NULL; + + DataFactoryPtr dataFactory = getPropertyDataFactory(); + const Type& propertiesType = dataFactory->getType("org/osoa/sca", "Properties"); + + try + { + const Property& prop = propertiesType.getProperty(propertyName); + property = ∝ + } + catch(SDOPropertyNotFoundException) + { + loginfo("Property named %s not found, returning null", propertyName.c_str()); + } + return property; + } + + DataFactoryPtr ComponentType::getPropertyDataFactory() + { + logentry(); + + if (!propertyFactory) + { + propertyFactory = DataFactory::getDataFactory(); + // Add the root type + propertyFactory->addType("org/osoa/sca", "Properties", false, false, false, false); + } + return propertyFactory; + } + + void ComponentType::initializeComponent(Component* component) + { + logentry(); + + for (SERVICETYPE_MAP::iterator iter = serviceTypes.begin(); + iter != serviceTypes.end(); + iter++) + { + Service* service = new Service(component, iter->second); + component->addService(service); + } + for (REFERENCETYPE_MAP::iterator refiter = referenceTypes.begin(); + refiter != referenceTypes.end(); + refiter++) + { + Reference* reference = new Reference(component, refiter->second); + component->addReference(reference); + } + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ComponentType.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ComponentType.h new file mode 100644 index 0000000000..86f17890e9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ComponentType.h @@ -0,0 +1,186 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_componenttype_h +#define tuscany_sca_model_componenttype_h + +#include <string> +#include <map> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/model/ReferenceType.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + class ServiceType; + class ReferenceType; + class Interface; + class Component; + class Composite; + + /** + * Component type represents the configurable aspects of an implementation. + * A component type consists of services that are offered, references to other services + * that can be wired and properties that can be set. The settable properties and the settable + * references to services are configured by a component which uses the implementation. + * The component type can be thought of as the contract which is honoured by an implementation. + */ + class ComponentType + { + public: + + /** + * Constructor + */ + SCA_API ComponentType(Composite* composite, const std::string& name); + + /** + * Destructor. + */ + SCA_API virtual ~ComponentType(); + + /** + * Returns the name of the component type + */ + SCA_API const std::string& getName() const { return name; }; + + /** + * Returns the composite containing this component type + */ + SCA_API Composite* getComposite() const { return composite; }; + + /** + * Add a new service type to this component type. + * @param serviceType The service type to add. + */ + SCA_API virtual void addServiceType(ServiceType* serviceType); + + /** + * Find an existing service type on this component type. + * @param serviceName The name of the service type to find. + * If the serviceName is the zero length string then if there is + * only one service type it will be returned. + * @return The found service, or 0 if not found. + */ + SCA_API virtual ServiceType* findServiceType(const std::string& serviceName); + + /** + * Add a new reference type to this component type. + * @param referenceType The reference type to add. + */ + SCA_API virtual void addReferenceType(ReferenceType* referenceType); + + /** + * Find an existing reference type on this component type. + * @param referenceName The name of the reference type to find. + * @return The found reference type, or 0 if not found. + */ + SCA_API virtual ReferenceType* findReferenceType(const std::string& referenceName); + + /** + * Returns the service types defined on this component. + * @return The service types defined on this component. + */ + typedef std::map<std::string, ServiceType*> SERVICETYPE_MAP; + SERVICETYPE_MAP getServiceTypes() const { return serviceTypes; }; + + /** + * Returns the reference types defined on this component. + * @return The reference types defined on this component. + */ + typedef std::map<std::string, ReferenceType*> REFERENCETYPE_MAP; + REFERENCETYPE_MAP getReferenceTypes() const { return referenceTypes; }; + + /** + * Add a new property type to this component type. Property types are added + * one at a time. The property definitions usually come from a component type file. + * @param name The name of the property type. + * @param type The full name of the property data type (including uri and local name). + * @param many True if this is a many valued property. + * @param defaultValue The default value if the property does not have a + * value set. + */ + SCA_API virtual void addPropertyType(const std::string& name, + const std::string& type, + bool many, + commonj::sdo::DataObjectPtr* defaultValue); + + /** + * Find an existing property type on this component type. + * @param propertyName The name of the property type to find. + * @return The found property, or 0 if not found. + */ + SCA_API virtual const commonj::sdo::Property* findPropertyType(const std::string& propertyName); + + /** + * Return the SDO data factory which has the types of the properties defined + * in this component type. + * @return The data factory. + */ + SCA_API virtual commonj::sdo::DataFactoryPtr getPropertyDataFactory(); + + /** + * Initialize a component of this type. + * @param component The component to initialize. + */ + SCA_API virtual void initializeComponent(Component* component); + + private: + + /** + * The name of the component type + */ + std::string name; + + /** + * The composite containing this component type + */ + Composite* composite; + + /** + * Map of all the service types defined on this component. + */ + SERVICETYPE_MAP serviceTypes; + + /** + * Map of all the reference types defined on this component. + */ + REFERENCETYPE_MAP referenceTypes; + + /** + * SDO data factory which has all the types of the properties defined in + * this component type + */ + commonj::sdo::DataFactoryPtr propertyFactory; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_componenttype_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Composite.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Composite.cpp new file mode 100644 index 0000000000..6456b0cede --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Composite.cpp @@ -0,0 +1,427 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/CompositeReference.h" +#include "tuscany/sca/model/CompositeReferenceBinding.h" +#include "tuscany/sca/model/CompositeService.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Wire.h" +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/ReferenceBinding.h" + +using namespace std; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + Composite::Composite(const string& name, const string& root) + : ComponentType(0, name), root(root) + { + logentry(); + } + +#if defined(COPY_COMPOSITES_ON_INSTANCIATION) + // Constructor + Composite::Composite(Composite* templateComposite, Composite* containerComposite) + : ComponentType(containerComposite, templateComposite->getName()), root(templateComposite->root) + { + logentry(); + components = templateComposite->components; + includes = templateComposite->includes; + wires = templateComposite->wires; + wsdlDefinitions = templateComposite->wsdlDefinitions; + // Copy all services from the cloned template + SERVICETYPE_MAP serviceTypeMap = templateComposite->getServiceTypes(); + for (SERVICETYPE_MAP::iterator serviter = serviceTypeMap.begin(); + serviter != serviceTypeMap.end(); + ++serviter) + { + addServiceType(serviter->second); + } + // Copy all references from the cloned template + REFERENCETYPE_MAP referenceTypeMap = templateComposite->getReferenceTypes(); + for (REFERENCETYPE_MAP::iterator refiter = referenceTypeMap.begin(); + refiter != referenceTypeMap.end(); + refiter++) + { + addReferenceType(refiter->second); + } + // Copy the dataFactory from the cloned template + commonj::sdo::DataFactoryPtr propertyFactory = getPropertyDataFactory(); + commonj::sdo::DataFactoryPtr dataFactory = templateComposite->getPropertyDataFactory(); + commonj::sdo::TypeList typeList = dataFactory->getTypes(); + for (int typeiter1=0; + typeiter1 < typeList.size(); + ++typeiter1) + { + const commonj::sdo::Type& type = typeList[typeiter1]; + propertyFactory->addType( + type.getURI(), + type.getName(), + type.isSequencedType(), + type.isOpenType(), + type.isAbstractType(), + type.isDataType()); + } + for (int typeiter2=0; + typeiter2 < typeList.size(); + ++typeiter2) + { + const commonj::sdo::Type& type = typeList[typeiter2]; + commonj::sdo::PropertyList propertyList = type.getProperties(); + for (int propertyiter=0; + propertyiter < propertyList.size(); + ++propertyiter) + { + const commonj::sdo::Property& property = propertyList[propertyiter]; + propertyFactory->addPropertyToType( + type.getURI(), + type.getName(), + property.getName(), + property.getType().getURI(), + property.getType().getName(), + property.isMany(), + property.isReadOnly(), + property.isContainment()); + } + for (int propertyiter=0; + propertyiter < propertyList.size(); + ++propertyiter) + { + const commonj::sdo::Property& property = propertyList[propertyiter]; + for (int aliasiter = 0; + aliasiter < property.getAliasCount(); + ++aliasiter) + { + propertyFactory->setAlias( + type.getURI(), + type.getName(), + property.getName(), + property.getAlias(aliasiter)); + } + } + for (int aliasiter = 0; + aliasiter < type.getAliasCount(); + ++aliasiter) + { + propertyFactory->setAlias( + type.getURI(), + type.getName(), + type.getAlias(aliasiter)); + } + if ( type.getBaseType() ) + { + propertyFactory->setBaseType( + type.getURI(), + type.getName(), + type.getBaseType()->getURI(), + type.getBaseType()->getName(), + false); //TODO: Where do we know if the cloned Type is a restriction ??? + } + } + + } +#endif + + // Destructor + Composite::~Composite() + { + logentry(); + } + + void Composite::addComponent(Component* component) + { + logentry(); + components[component->getName()] = component; + } + + void Composite::addCompositeReference(CompositeReference* compositeReference) + { + logentry(); + components[compositeReference->getName()] = compositeReference; + + // Create a reference type describing the composite reference + ServiceType* serviceType = compositeReference->getType()->findServiceType(""); + ReferenceType* referenceType = new ReferenceType( + this, compositeReference->getName(), + serviceType->getInterface(), + serviceType->getCallbackInterface(), + compositeReference->getMultiplicity()); + addReferenceType(referenceType); + } + + void Composite::addCompositeService(CompositeService* compositeService) + { + logentry(); + components[compositeService->getName()] = compositeService; + + // Create a service type describing the composite service + ReferenceType* referenceType = compositeService->getType()->findReferenceType(""); + ServiceType* serviceType = new ServiceType( + this, compositeService->getName(), + referenceType->getInterface(), + referenceType->getCallbackInterface()); + addServiceType(serviceType); + } + + void Composite::initializeComponent(Component* component) + { + ComponentType::initializeComponent(component); + + // Create bindings for all the services + const Component::SERVICE_MAP& services = component->getServices(); + Component::SERVICE_MAP::const_iterator iter = services.begin(); + for (unsigned int i=0; i< services.size(); i++) + { + Service *service = iter->second; + //CompositeServiceBinding* binding = new CompositeServiceBinding(service); + //service->setBinding(binding); + iter++; + } + + // Create bindings for all the references + const Component::REFERENCE_MAP& references = component->getReferences(); + Component::REFERENCE_MAP::const_iterator refiter = references.begin(); + for (unsigned int ri=0; ri< references.size(); ri++) + { + Reference *reference = refiter->second; + CompositeReferenceBinding* binding = new CompositeReferenceBinding(reference); + reference->setBinding(binding); + refiter++; + } + } + + Component* Composite::findComponent(const std::string& name) + { + logentry(); + Component* component = components[name]; + return component; + } + + std::list<std::string> Composite::getComponents() const + { + logentry(); + + std::list<std::string> componentList; + COMPONENT_MAP::const_iterator iter = components.begin(); + COMPONENT_MAP::const_iterator iterEnd = components.end(); + + for( ; iter != iterEnd; ++iter ) + { + componentList.push_back( iter->first ); + } + + return componentList; + } + + Service* Composite::findComponentService(const std::string& name) + { + logentry(); + + Service* service = 0; + + string componentName; + string serviceName; + Utils::tokeniseUri(name, componentName, serviceName); + + // Locate the component + Component* component = findComponent(componentName); + if (component) + { + // Locate the service + service = component->findService(serviceName); + } + return service; + } + + void Composite::addWire(const std::string& source, const std::string& target) + { + logentry(); + Wire* wire=new Wire(source, target); + wires.push_back(wire); + } + + void Composite::addInclude(Composite* composite) + { + logentry(); + includes[composite->getName()] = composite; + + for (COMPONENT_MAP::iterator iter = composite->components.begin(); + iter != composite->components.end(); + iter++) + { + components[iter->first] = iter->second; + } + } + + void Composite::resolveWires() + { + logentry(); + + for (WIRES::iterator iter = wires.begin(); + iter != wires.end(); + iter++) + { + Wire* wire = *iter; + + // Find the source component and reference + Component* component = findComponent(wire->getSourceComponent()); + Reference* reference; + if (component) + { + reference = component->findReference(wire->getSourceReference()); + if (!reference) + { + logerror("Wire source reference %s not found", wire->getSourceReference().c_str()); + } + } + else + { + reference = NULL; + logerror("Wire source %s not found", wire->getSourceComponent().c_str()); + } + + // Configure the reference binding with the wire target URI + if (reference) + { + reference->getBinding()->configure(wire->getTarget()); + } + } + } + + void Composite::addWSDLDefinition(commonj::sdo::DataObjectPtr wsdlModel) + { + logentry(); + WSDLDefinition* wsdlDefinition = new WSDLDefinition(wsdlModel); + + WSDLDefinition* existingDefinition = wsdlDefinitions[wsdlDefinition->getNamespace()]; + if (existingDefinition == NULL) + { + wsdlDefinitions[wsdlDefinition->getNamespace()] = wsdlDefinition; + } + else{ + existingDefinition->addWSDLModel(wsdlModel); + } + } + + WSDLDefinition* Composite::findWSDLDefinition(const std::string& wsdlNamespace ) + { + logentry(); + // remember the map operator[] inserts a blank object if key not found + WSDL_MAP::iterator iter = wsdlDefinitions.find( wsdlNamespace ); + if( iter == wsdlDefinitions.end() ) + { + return NULL; + } + + return iter->second; + } + + std::list<std::string> Composite::getWSDLNamespaces() const + { + logentry(); + std::list<std::string> namespaceList; + WSDL_MAP::const_iterator iter = wsdlDefinitions.begin(); + WSDL_MAP::const_iterator iterEnd = wsdlDefinitions.end(); + + for( ; iter != iterEnd; ++iter ) + { + namespaceList.push_back( iter->first ); + } + + return namespaceList; + } + + Composite* Composite::findIncludedComposite(const std::string& compositeName) + { + logentry(); + + // remember the map operator[] inserts a blank object if key not found + INCLUDES::iterator iter = includes.find( compositeName ); + if( iter == includes.end() ) + { + return NULL; + } + + return iter->second; + } + + std::list<std::string> Composite::getIncludedComposites() const + { + logentry(); + std::list<std::string> compositeList; + INCLUDES::const_iterator iter = includes.begin(); + INCLUDES::const_iterator iterEnd = includes.end(); + + for( ; iter != iterEnd; ++iter ) + { + compositeList.push_back( iter->first ); + } + + return compositeList; + } + + commonj::sdo::XSDHelperPtr Composite::getXSDHelper() + { + logentry(); + if (xsdHelper == 0) + { + xsdHelper = commonj::sdo::HelperProvider::getXSDHelper(); + } + + return xsdHelper; + } + + commonj::sdo::XMLHelperPtr Composite::getXMLHelper() + { + logentry(); + if (xmlHelper == 0) + { + xmlHelper = commonj::sdo::HelperProvider::getXMLHelper(getXSDHelper()->getDataFactory()); + } + + return xmlHelper; + } + + commonj::sdo::DataFactoryPtr Composite::getDataFactory() + { + logentry(); + return getXSDHelper()->getDataFactory(); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Composite.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Composite.h new file mode 100644 index 0000000000..40626feb14 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Composite.h @@ -0,0 +1,250 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_composite_h +#define tuscany_sca_model_composite_h + +#include <string> +#include <map> +#include <vector> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/ComponentType.h" + +#define COPY_COMPOSITES_ON_INSTANCIATION + +namespace tuscany +{ + namespace sca + { + + namespace model + { + class Component; + class ComponentType; + class CompositeReference; + class CompositeService; + class Service; + class WSDLDefinition; + class Wire; + + /** + * Represents a composite. + * A composite is used to assemble SCA elements in logical groupings. + * It is the basic unit of composition within an SCA System. An SCA composite contains a + * set of components, services, references and the wires that interconnect them, plus a set + * of properties which can be used to configure components. + */ + class Composite : public ComponentType + { + public: + + /** + * Constructor. + * @param name the name of the composite. + * @param root the root of the composite in the file system. + */ + SCA_API Composite(const std::string& name, const std::string& root); + +#if defined(COPY_COMPOSITES_ON_INSTANCIATION) + /** + * Constructor to create a composite representing an instance by copying a template. + * @param templateComposite the template copmosite that will be copied. + * @param containerComposite the container of the instance. + */ + SCA_API Composite(Composite* templateComposite, Composite* containerComposite); +#endif + + /** + * Destructor. + */ + SCA_API virtual ~Composite(); + + /** + * Returns the root directory of the composite. + * @return The root of the composite in the file system. + */ + SCA_API const std::string& getRoot() const { return root; } + + /** + * Add a new component to the composite. + * @param component The component to add. + */ + SCA_API void addComponent(Component* component); + + /** + * Add a new composite reference to the composite. + * @param compositeReference The composite reference to add. + */ + SCA_API void addCompositeReference(CompositeReference* compositeReference); + + /** + * Add a new composite service to the composite. + * @param compositeService The composite service to add. + */ + SCA_API void addCompositeService(CompositeService* compositeService); + + /** + * Add/include a composite in this composite. + * @param composite The composite included in this composite. + */ + SCA_API void addInclude(Composite* composite); + + /** + * Add a wire to the model. + * @param source The source location. Either the source component and + * reference (optional), or an entry point. + * @param target The target location. Either the target component and + * service (optional), or an external service. + */ + SCA_API void addWire(const std::string& source, const std::string& target); + + /** + * Find a component by name. + * @param componentName The name of the component to be found. + * @return The component that was found, or 0 if not found. + */ + SCA_API Component* findComponent(const std::string& componentName); + + /** + * Get all included components + * @return A list of Component name strings + */ + SCA_API std::list<std::string> getComponents() const; + + /** + * Find a component and service by name. + * @param componentServiceName A string of the form + * "componentName"/"serviceName" where the service name is optional + * if there is only one service on the component. + * @return The Service that was found, or 0 if not found. + */ + SCA_API Service* findComponentService(const std::string& componentServiceName); + + /** + * Add a WSDL definition to the composite. + * @param wsdlModel A data object holding all the information about + * the WSDL definition from a WSDL file. + */ + SCA_API void addWSDLDefinition(commonj::sdo::DataObjectPtr wsdlModel); + + /** + * Find a WSDL definition by target namespace. + * @param wsdlNamespace The namespace of the WSDL definitions to find. + */ + SCA_API WSDLDefinition* findWSDLDefinition(const std::string& wsdlNamespace); + + /** + * Get all loaded WSDL namespaces + * @return A list of strings, each of which is a different project namespace + */ + SCA_API std::list<std::string> getWSDLNamespaces() const; + + /** + * Find an Included Composite by its name + * @param compositeName The name of the included composite to find. + */ + SCA_API Composite* findIncludedComposite(const std::string& compositeName); + + /** + * Get all included composites + * @return A list of Composite name strings + */ + SCA_API std::list<std::string> getIncludedComposites() const; + + /** + * Initialize a component of this type. + * @param component The component to initialize. + */ + virtual void initializeComponent(Component* component); + + /** + * Return a cached SDO XSDHelper. + */ + SCA_API commonj::sdo::XSDHelperPtr getXSDHelper(void); + + /** + * Return a cached SDO XMLHelper. + */ + SCA_API commonj::sdo::XMLHelperPtr getXMLHelper(void); + + /** + * Return a data factory which has all the types defined in XSDs and + * WSDL files configured for this composite. + * @return The data factory for this composite. + */ + SCA_API commonj::sdo::DataFactoryPtr getDataFactory(void); + + /** + * Work through the list of wires and connect the source and target uris. + */ + SCA_API void resolveWires(); + + private: + + /** + * Directory of the root of the composite. + */ + std::string root; + + /** + * Cached XSDHelper. + */ + commonj::sdo::XSDHelperPtr xsdHelper; + + /** + * Cached XMLHelper. + */ + commonj::sdo::XMLHelperPtr xmlHelper; + + /** + * Map (by name) of all the components in this composite. + */ + typedef std::map<std::string, Component*> COMPONENT_MAP; + COMPONENT_MAP components; + + /** + * Map of all the composites included by this composite. + * Map the Composite name to the Composite + */ + typedef std::map<std::string, Composite*> INCLUDES; + INCLUDES includes; + + /** + * Vector of all the wires in this composite. + */ + typedef std::vector<Wire*> WIRES; + WIRES wires; + + /** + * Map by namespace of all the wsdl definitions in this composite. + */ + typedef std::map<std::string, WSDLDefinition*> WSDL_MAP; + WSDL_MAP wsdlDefinitions; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_composite_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReference.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReference.cpp new file mode 100644 index 0000000000..be0bf71a17 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReference.cpp @@ -0,0 +1,68 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/CompositeReference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Service.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + CompositeReference::CompositeReference(Composite* composite, const string& name, + Interface* intface, Interface* callbackInterface, bool conversational, ReferenceType::Multiplicity multiplicity) : + Component(composite, name, new ComponentType(composite, name)) + { + logentry(); + loginfo("Composite reference name: %s", name.c_str()); + + // Initialize the component type, service type and service + ComponentType* componentType = getType(); + ServiceType* serviceType = new ServiceType( + componentType, "", intface, callbackInterface); + componentType->addServiceType(serviceType); + + service = new Service(this, serviceType); + addService(service); + } + + // Destructor + CompositeReference::~CompositeReference() + { + logentry(); + } + + } // End namespace model + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReference.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReference.h new file mode 100644 index 0000000000..f5e2166e06 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReference.h @@ -0,0 +1,93 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_compositereferencetype_h +#define tuscany_sca_model_compositereferencetype_h + +#include <string> + +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ReferenceType.h" + +namespace tuscany +{ + namespace sca + { + + namespace model + { + class ComponentType; + class Composite; + class Interface; + class Service; + + /** + * Represents a reference in a composite. + * Composite references represent dependencies that the composite has on services provided elsewhere, + * outside the composite. + */ + class CompositeReference : public Component + { + public: + + /** + * Constructor. + * @param name The name of the reference. + */ + SCA_API CompositeReference(Composite* composite, const std::string& name, + Interface* intface, Interface* callbackInterface, bool conversational, ReferenceType::Multiplicity multiplicity); + + /** + * Destructor. + */ + SCA_API virtual ~CompositeReference(); + + /** + * Returns the service exposed by this composite reference. + * @return The service exposed by this composite reference. + */ + SCA_API Service* getService() const { return service; }; + + /** + * Returns the multiplicity of this composite reference + * @return The multiplicity of the composite reference + */ + SCA_API ReferenceType::Multiplicity getMultiplicity() { return multiplicity; } + + private: + + /** + * The service exposed by this composite reference. + */ + Service* service; + + /** + * The multiplicity of this reference + */ + ReferenceType::Multiplicity multiplicity; + + }; + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_compositereferencetype_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReferenceBinding.cpp new file mode 100644 index 0000000000..24191285c5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReferenceBinding.cpp @@ -0,0 +1,62 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/CompositeReferenceBinding.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + // Constructor + CompositeReferenceBinding::CompositeReferenceBinding(Reference* reference) + : ReferenceBinding(reference, ""), uri("") + { + } + + // Destructor + CompositeReferenceBinding::~CompositeReferenceBinding() + { + } + + void CompositeReferenceBinding::configure(ServiceBinding *binding) + { + setTargetServiceBinding(binding); + } + + ServiceProxy* CompositeReferenceBinding::getServiceProxy() + { + return serviceProxy; + } + + void CompositeReferenceBinding::configure(const string& uri) + { + this->uri = uri; + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReferenceBinding.h new file mode 100644 index 0000000000..5c64c3b657 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeReferenceBinding.h @@ -0,0 +1,98 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_compositereferencebinding_h +#define tuscany_sca_model_compositereferencebinding_h + +#include <string> + +#include "tuscany/sca/model/ReferenceBinding.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + /** + * A default composite reference binding + */ + class CompositeReferenceBinding : public ReferenceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + */ + SCA_API CompositeReferenceBinding(Reference* reference); + + /** + * Destructor. + */ + SCA_API virtual ~CompositeReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#CompositeServiceBinding"; }; + + /** + * Configure this binding from a service binding. + */ + SCA_API virtual void configure(ServiceBinding* serviceBinding); + + /** + * Configure this binding from a URI. + */ + SCA_API virtual void configure(const std::string& uri); + + /** + * Create a proxy representing the reference to the + * client component. + */ + SCA_API virtual ServiceProxy* getServiceProxy(); + + /** + * Returns the binding URI. + * @return The binding URI. + */ + SCA_API virtual const std::string& getURI() const { return uri; }; + + private: + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + + /** + * The binding URI + */ + std::string uri; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_compositereferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeService.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeService.cpp new file mode 100644 index 0000000000..e06dc548c1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeService.cpp @@ -0,0 +1,70 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/CompositeService.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/ServiceType.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + CompositeService::CompositeService(Composite* composite, const string& name, + Interface* intface, Interface* callbackInterface, bool conversational, + ReferenceType::Multiplicity multiplicity) : + Component(composite, name, new ComponentType(composite, name)) + { + logentry(); + loginfo("Composite service name: %s", name.c_str()); + + // Initialize the component type, reference type and reference + ComponentType* componentType = getType(); + ReferenceType* referenceType = new ReferenceType( + componentType, "", intface, callbackInterface, multiplicity); + componentType->addReferenceType(referenceType); + + reference = new Reference(this, referenceType); + addReference(reference); + } + + // Destructor + CompositeService::~CompositeService() + { + logentry(); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeService.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeService.h new file mode 100644 index 0000000000..8c626ccac3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/CompositeService.h @@ -0,0 +1,83 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_compositeservicetype_h +#define tuscany_sca_model_compositeservicetype_h + +#include <string> + +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ReferenceType.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + class Composite; + class Component; + class Interface; + class Reference; + + /** + * Represents a service in a composite. + * Composite services define the public services provided by the composite, which can be + * accessed from outside the composite. + */ + class CompositeService : public Component + { + + public: + + /** + * Constructor. + * @param componentType The component type on which this service is defined. + * @param name The name of the service. + */ + SCA_API CompositeService(Composite* composite, const std::string& name, + Interface* intface, Interface* callbackInterface, bool conversational, ReferenceType::Multiplicity multiplicity); + + /** + * Destructor. + */ + SCA_API virtual ~CompositeService(); + + /** + * Returns the reference used by this composite service. + * @return The reference used by this composite service. + */ + SCA_API Reference* getReference() const { return reference; }; + + private: + + /** + * The reference used by this composite service. + */ + Reference* reference; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_compositeservicetype_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Contract.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Contract.cpp new file mode 100644 index 0000000000..99a1d04dc2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Contract.cpp @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/Contract.h" + + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + Contract::Contract(Interface *intface, Interface* callbackInterface) : + iface(intface), callbackInterface(callbackInterface) + { + logentry(); + } + + // Destructor + Contract::~Contract() + { + logentry(); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Contract.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Contract.h new file mode 100644 index 0000000000..e1d526f842 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Contract.h @@ -0,0 +1,85 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_contract_h +#define tuscany_sca_model_contract_h + +#include "tuscany/sca/model/Interface.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + /** + * Interface contracts define one or more business functions. These business functions are + * provided by services and are used by references. Services are defined by the interface which + * they implement. + * This interface will typically be extended to support concrete interface type systems, such as + * CPP classes, Java interfaces, WSDL 1.1 portTypes and WSDL 2.0 interfaces. + */ + class Contract + { + public: + + /** + * Constructor. + */ + SCA_API Contract(Interface* intface, Interface* callbackInterface); + + /** + * Destructor. + */ + SCA_API virtual ~Contract(); + + /** + * Returns the interface for invocations from the requestor to the provider. + * @return The interface for invocations from the requestor to the provider. + */ + SCA_API Interface* getInterface() const { return iface; } + + /** + * Returns the interface for invocations from the provider back to the requestor. + * @return The interface for invocations from the provider back to the requestor. + */ + SCA_API Interface* getCallbackInterface() const { return callbackInterface; } + + private: + + /** + * The interface for invocations from the requestor to the provider. + */ + Interface* iface; + + /** + * The interface for invocations from the provider back to the requestor. + */ + Interface* callbackInterface; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_contract_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Interface.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Interface.cpp new file mode 100644 index 0000000000..f8dd02a74a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Interface.cpp @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/Interface.h" + + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + Interface::Interface(bool remotable, bool conversational) + : remotable(remotable), conversational(conversational) + { + logentry(); + } + + Interface::~Interface() + { + logentry(); + } + + } // End namespace model + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Interface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Interface.h new file mode 100644 index 0000000000..5ac7736d43 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Interface.h @@ -0,0 +1,90 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_interface_h +#define tuscany_sca_model_interface_h + +#include <string> + +namespace tuscany +{ + namespace sca + { + namespace model + { + + /** + * Information about an interface. Subtypes will hold information + * specific to a type of interface. + */ + class Interface + { + + public: + + /** + * Constructor + */ + SCA_API Interface(bool remotable, bool conversational); + + /** + * Destructor + */ + SCA_API virtual ~Interface(); + + /** + * Returns true if the interface is remotable. + * @return True if the interface is remotable. + */ + SCA_API bool isRemotable() const { return remotable; }; + + /** + * Returns true if the interface is conversational. + * @return True if the interface is conversational. + */ + SCA_API bool isConversational() const { return conversational; }; + + /** + * return the QName of schema type for this interface type + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#WSDLInterface") + */ + SCA_API virtual const std::string& getInterfaceTypeQName() = 0; + + private: + + /** + * True if the interface is remotable + */ + bool remotable; + + /** + * True if the interface is conversational + */ + bool conversational; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_interface_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ModelLoader.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ModelLoader.cpp new file mode 100644 index 0000000000..549ffcfc7e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ModelLoader.cpp @@ -0,0 +1,939 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/export.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/ModelLoader.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/CompositeService.h" +#include "tuscany/sca/model/CompositeReference.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/WSDLInterface.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/util/File.h" + + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::util; + + +#if defined(WIN32) || defined (_WINDOWS) +#define PATH_SEPARATOR ";" +#else +#define PATH_SEPARATOR ":" +#endif + +namespace tuscany +{ + namespace sca + { + + namespace model + { + // =========== + // Constructor + // =========== + ModelLoader::ModelLoader(SCARuntime* runtime, Composite* system) + : system(system), runtime(runtime) + { + logentry(); + } + + // ========== + // Destructor + // ========== + ModelLoader::~ModelLoader() + { + logentry(); + } + + // ========================================================= + // load: Load the runtime model from the deployed xml files + // This class has the responsibility for translating from + // the SCDL files to the SCA runtime's in memory model. + // ========================================================= + void ModelLoader::load(const string& systemRoot, const string& systemPath) + { + logentry(); + loginfo("System root: %s", systemRoot.c_str()); + loginfo("System path: %s", systemPath.c_str()); + + // Load composite implementations + // Composite implementations can occur anywhere on the given search path + if (systemPath != "") + { + loadComposites(systemRoot + PATH_SEPARATOR + systemPath); + } + else + { + loadComposites(systemRoot); + } + + // Load system composites + // Composites on the the system root path get included + // in the System composite + loadSystem(systemRoot); + + // Resolve the wires in the system composite + system->resolveWires(); + } + + // ======================================================================== + // loadSystem: + // Load all the composite files on the system root path + // Translate the composite information to composite model objects + // ======================================================================== + void ModelLoader::loadSystem(const string& systemRoot) + { + logentry(); + + // Get all the composite files on the system root path + // These composites are included in the system composite + for (string path = systemRoot; path != ""; ) + { + string dir; + Utils::tokeniseString(PATH_SEPARATOR, path, dir, path); + if (dir != "") + { + loginfo("System root directory: %s", dir.c_str()); + Files files(dir, "*.composite", false); + for (unsigned int i=0; i < files.size(); i++) + { + string fileName = files[i].getDirectory() + "/" + files[i].getFileName(); + Composite* composite = compositeFiles[fileName]; + if (composite) + { + // Include the composite in the system composite + system->addInclude(composite); + } + else + { + // We already got an error or warning indicating why the file + // didn't turn into a composite + } + } + } + } + } + + // ===================================================================== + // loadComposites: + // Load all the composites from any directory under the composite search path + // Translate the composite information to composite model objects + // ===================================================================== + void ModelLoader::loadComposites(const string& searchPath) + { + logentry(); + + // Get all the composite files on the composite search path + for (string path = searchPath; path != ""; ) + { + string dir; + Utils::tokeniseString(PATH_SEPARATOR, path, dir, path); + if (dir != "") + { + loginfo("Composite path directory: %s", dir.c_str()); + Files files(dir, "*.composite", true); + for (unsigned int i=0; i < files.size(); i++) + { + loadCompositeFile(files[i]); + } + } + } + + // Complete the mapping of the composites + for (COMPOSITE_DATAOBJECTS::iterator iter = compositeDataObjects.begin(); + iter != compositeDataObjects.end(); + iter++) + { + mapCompositePass2(iter->first, iter->second); + } + } + + // ==================================================================== + // loadCompositeFile: + // This method is called for each .composite file found under the composite search + // path. The location of this composite file will indicate the root of a composite. + // ==================================================================== + Composite* ModelLoader::loadCompositeFile(const File& file) + { + logentry(); + + loginfo("Composite file name: %s", file.getFileName().c_str()); + + Composite* composite = NULL; + try + { + string fileName = file.getDirectory() + "/" + file.getFileName(); + if (compositeFiles[fileName] == NULL) + { + XMLDocumentPtr compositeFile = getXMLHelper()->loadFile(fileName.c_str()); + if (compositeFile->getRootDataObject() == NULL) + { + logerror("Unable to load file: %s", fileName.c_str()); + } + else + { + // Map the SCDL + composite = mapCompositePass1(file, compositeFile->getRootDataObject()); + + // Load the xsd types and wsdl files in the composite + loadTypeMetadata(file.getDirectory(), composite); + } + } + + } catch (SDORuntimeException& ex) + { + logerror("Unable to load composite: %s", ex.getMessageText()); + } + return composite; + } + + // =========== + // mapCompositePass1 + // =========== + Composite* ModelLoader::mapCompositePass1(const File& file, DataObjectPtr root) + { + logentry(); + + const string& compositeRootDir = file.getDirectory(); + const string compositeName = root->getCString("name"); + loginfo("Composite: %s, root directory: %s", compositeName.c_str(), compositeRootDir.c_str()); + + Composite* composite = new Composite(compositeName, compositeRootDir); + compositeModels[compositeName] = composite; + compositeDataObjects[compositeName] = root; + compositeFiles[file.getDirectory() + "/" + file.getFileName()] = composite; + + // ------------ + // Composite services + // ------------ + DataObjectList& compositeServiceList = root->getList("service"); + for (unsigned int i = 0; i < compositeServiceList.size(); i++) + { + addCompositeService(composite, compositeServiceList[i]); + } + + // ----------------- + // Composite references + // ----------------- + DataObjectList& compositeReferenceList = root->getList("reference"); + for (unsigned int cri = 0; cri < compositeReferenceList.size(); cri++) + { + addCompositeReference(composite, compositeReferenceList[cri]); + } + + // ----- + // Wires + // ----- + DataObjectList& wireList = root->getList("wire"); + for (unsigned int l = 0; l < wireList.size(); l++) + { + string source = wireList[l]->getCString("source"); + string target = wireList[l]->getCString("target"); + composite->addWire(source, target); + } + + return composite; + } + + // =========== + // mapCompositePass2 + // =========== + Composite* ModelLoader::mapCompositePass2(const string& compositeName, DataObjectPtr root) + { + logentry(); + loginfo("Composite: %s", compositeName.c_str()); + + Composite* composite = compositeModels[compositeName]; + + // ---------------------------- + // Add components to the composite + // ---------------------------- + DataObjectList& componentList = root->getList("component"); + unsigned int i; + for (i=0; i < componentList.size(); i++) + { + addComponent(composite, componentList[i]); + } + + // Resolve all the wires inside the composite + composite->resolveWires(); + + return composite; + } + + // ================================= + // addComponent: + // ================================= + void ModelLoader::addComponent(Composite* composite, DataObjectPtr componentDO) + { + logentry(); + + // ------------------- + // Get the component implementation + // ------------------- + DataObjectPtr impl = componentDO->getDataObject("implementation"); + if (!impl) + { + string message = "No implementation for component: "; + message = message + componentDO->getCString("name"); + throwException(SystemConfigurationException, message.c_str()); + } + + // Create the component type + ComponentType* componentType; + string componentTypeName; + string componentTypePath; + + string implTypeQname = impl->getType().getURI(); + implTypeQname += "#"; + implTypeQname += impl->getType().getName(); + + if (implTypeQname == "http://www.osoa.org/xmlns/sca/1.0#SCAImplementation") + { + // Handle a composite implementation + Composite* compositeComponentType = compositeModels[impl->getCString("name")]; + if (!compositeComponentType) + { + string message = "Composite not found: "; + message = message + impl->getCString("name"); + throwException(SystemConfigurationException, message.c_str()); + } +#if defined(COPY_COMPOSITES_ON_INSTANCIATION) + componentType = new Composite(compositeComponentType, composite); +#else + componentType = compositeComponentType; +#endif + } + else + { + + // Locate extension that handles this implementation type + ImplementationExtension* implExtension = runtime->getImplementationExtension(implTypeQname); + if (implExtension) + { + componentType = implExtension->getImplementation(composite, impl); + + // ----------------------- + // Load the .componentType + // ----------------------- + string typeFileName = composite->getRoot() + "/" + componentType->getName() + ".componentType"; + + // Check that the component type file exists + //TODO We need a better and portable way to do this + string dirName; + string fileName; + Utils::rTokeniseString("/", typeFileName, dirName, fileName); + Files files(dirName, fileName, false); + if (files.size() !=0) + { + try + { + XMLDocumentPtr componentTypeFile = getXMLHelper()->loadFile(typeFileName.c_str()); + if (!componentTypeFile || componentTypeFile->getRootDataObject() == 0) + { + // Component type files are optional + logerror("Unable to load file: %s", typeFileName.c_str()); + } + else + { + //Utils::printDO(componentTypeFile->getRootDataObject()); + //commonj::sdo::SDOUtils::printDataObject(componentTypeFile->getRootDataObject()); + addServiceTypes(composite, componentType, componentTypeFile->getRootDataObject()); + addReferenceTypes(composite, componentType, componentTypeFile->getRootDataObject()); + addPropertyTypes(componentType, componentTypeFile->getRootDataObject()); + } + } catch (SDORuntimeException& ex) + { + logerror("Unable to load file:%s", typeFileName.c_str()); + throwException(SystemConfigurationException, ex); + } + } + } + else + { + logerror("Unsupported implementation type: %s", implTypeQname.c_str()); + + string message = "Implementation type not supported: "; + message = message + implTypeQname; + throwException(SystemConfigurationException, message.c_str()); + } + } + + // First check that references and properties exist, some component types + // will create all used references & properties automatically + DataObjectList& refs = componentDO->getList("reference"); + for (unsigned int i=0; i<refs.size(); i++) + { + string refName = refs[i]->getCString("name"); + if (!componentType->findReferenceType(refName)) + { + // Configuration error: reference is not defined + string message = "Undefined reference: " + refName; + throwException(SystemConfigurationException, message.c_str()); + } + } + + DataObjectList& props = componentDO->getList("property"); + for (unsigned int pi=0; pi<props.size(); pi++) + { + string propName = props[pi]->getCString("name"); + if (!componentType->findPropertyType(propName)) + { + // Configuration error: property is not defined + string message = "Undefined property: " + propName; + throwException(SystemConfigurationException, message.c_str()); + } + } + + + // Create the component + Component* component = new Component(composite, componentDO->getCString("name"), componentType); + composite->addComponent(component); + + // ---------- + // Properties + // ---------- + for (unsigned int pi=0; pi<props.size(); pi++) + { + string propName = props[pi]->getCString("name"); + DataObjectPtr propValue = props[pi]->getDataObject("value"); + + component->setProperty(propName, propValue); + } + + // ---------- + // References + // ---------- + for (unsigned int ri=0; ri<refs.size(); ri++) + { + // ---------------------------------------------------------- + // Add the reference to the composite wires to be resolved later + // ---------------------------------------------------------- + string refName = refs[ri]->getCString("name"); + if (!component->findReference(refName)) + { + // Configuration error: reference is not defined + string message = "Undefined reference: " + refName; + throwException(SystemConfigurationException, message.c_str()); + } + + string src = component->getName() + "/" + refName; + + // Get the reference value + string refValue = refs[ri]->getCString("value"); + + composite->addWire(src, refValue); + } + } + + // ===================================================================== + // addServiceTypes: add the services to the component type + // ===================================================================== + void ModelLoader::addServiceTypes(Composite* composite, ComponentType* componentType, DataObjectPtr componentTypeDO) + { + logentry(); + + DataObjectList& serviceTypes = componentTypeDO->getList("service"); + for (unsigned int i=0; i<serviceTypes.size(); i++) + { + Interface* iface = getInterface(composite, serviceTypes[i]); + ServiceType* serviceType = new ServiceType( + componentType, serviceTypes[i]->getCString("name"), iface, NULL); + componentType->addServiceType(serviceType); + } + } + + // =================================================== + // addReferenceTypes: add the references to the component type + // =================================================== + void ModelLoader::addReferenceTypes(Composite* composite, ComponentType* componentType, DataObjectPtr componentTypeDO) + { + logentry(); + + DataObjectList& refs = componentTypeDO->getList("reference"); + for (unsigned int i=0; i<refs.size(); i++) + { + ReferenceType::Multiplicity multiplicity; + if (refs[i]->isSet("multiplicity")) + { + string s = refs[i]->getCString("multiplicity"); + multiplicity = ReferenceType::getMultiplicityFromString(s); + } + else + { + multiplicity = ReferenceType::ONE_ONE; + } + + Interface* iface = getInterface(composite, refs[i]); + + ReferenceType* referenceType = new ReferenceType( + componentType, refs[i]->getCString("name"), iface, NULL, multiplicity); + componentType->addReferenceType(referenceType); + + } + } + + + // ============== + // getInterface + // ============== + Interface* ModelLoader::getInterface(Composite* composite, DataObjectPtr obj) + { + logentry(); + + // ----------------- + // get the interface + // ----------------- + DataObjectPtr iface = obj->getDataObject("interface"); + if (!iface) + { + string message = "No interface for: "; + message = message + obj->getCString("name"); + throwException(SystemConfigurationException, message.c_str()); + } + + string typeQname = iface->getType().getURI(); + typeQname += "#"; + typeQname += iface->getType().getName(); + + if (typeQname == WSDLInterface::typeQName) + { + // Load a WSDL interface + string qname = iface->getCString("interface"); + + return new WSDLInterface(qname, true, false); + } + else + { + // Locate extension that handles this interface type + InterfaceExtension* ifaceExtension = runtime->getInterfaceExtension(typeQname); + if (ifaceExtension) + { + return ifaceExtension->getInterface(composite, iface); + } + else + { + // log this for now. + logerror("Unsupported interface type: %s", typeQname.c_str()); + return 0; + } + } + + } + + // ============================================== + // addProperties: add properties to the component type + // ============================================== + void ModelLoader::addPropertyTypes(ComponentType* componentType, DataObjectPtr componentTypeDO) + { + logentry(); + + DataObjectList& props = componentTypeDO->getList("property"); + for (unsigned int i=0; i<props.size(); i++) + { + //cout << "Property " << props[i]; + + string name = props[i]->getCString("name"); + string type = props[i]->getCString("type"); + bool many=false; + if (props[i]->isSet("many")) + { + many = props[i]->getBoolean("many"); + } + + //TODO need to add support for complex properties, need the SDO + // folks to help understand how to do this... + DataObjectPtr defaultValue = props[i]->getDataObject("value"); + + componentType->addPropertyType(name, type, many, &defaultValue); + } + } + + // =============================================== + // addCompositeService: add an CompositeService to the composite + // =============================================== + void ModelLoader::addCompositeService(Composite* composite, DataObjectPtr compositeServiceDO) + { + logentry(); + + string compositeServiceName = compositeServiceDO->getCString("name"); + + Interface* iface; + if (compositeServiceDO->getDataObject("interface")) + { + iface = getInterface(composite, compositeServiceDO); + } + else + { + iface = NULL; + } + + ReferenceType::Multiplicity multiplicity; + if (compositeServiceDO->isSet("multiplicity")) + { + string s = compositeServiceDO->getCString("multiplicity"); + multiplicity = ReferenceType::getMultiplicityFromString(s); + } + else + { + multiplicity = ReferenceType::ONE_ONE; + } + + CompositeService* compositeService = new CompositeService( + composite, compositeServiceName, iface, NULL, false, multiplicity); + + composite->addCompositeService(compositeService); + + DataObjectList& refs = compositeServiceDO->getList("reference"); + for (unsigned int i=0; i<refs.size(); i++) + { + // ---------------------------------------------------------- + // Add the reference to the composite wires to be resolved later + // ---------------------------------------------------------- + string targ = refs.getCString(i); + composite->addWire(compositeServiceName, targ); + } + + // Get binding, it will be the first and only binding + DataObjectList& bindings = compositeServiceDO->getList("binding"); + if (bindings.size()==0) + { + string message = "No binding for compositeService: "; + message = message + compositeServiceDO->getCString("name"); + throwException(SystemConfigurationException, message.c_str()); + } + DataObjectPtr binding = bindings[0]; + + // Determine the binding type + string bindingType = binding->getType().getName(); + string bindingTypeQname = binding->getType().getURI(); + bindingTypeQname += "#"; + bindingTypeQname += binding->getType().getName(); + + // Locate the extension that handles this binding type + ReferenceBindingExtension* bindingExtension = runtime->getReferenceBindingExtension(bindingTypeQname); + if (bindingExtension) + { + Reference* reference = compositeService->getReference(); + ReferenceBinding* referenceBinding = bindingExtension->getReferenceBinding(composite, reference, binding); + reference->setBinding(referenceBinding); + } + else + { + logerror("Unsupported binding type: %s", bindingTypeQname.c_str()); + + string message = "Binding type not supported: "; + message = message + bindingTypeQname; + throwException(SystemConfigurationException, message.c_str()); + } + } + + + // ========================================================= + // addCompositeReference: add a CompositeReference to the composite + // ========================================================= + void ModelLoader::addCompositeReference(Composite* composite, DataObjectPtr compositeReferenceDO) + { + logentry(); + + string compositeReferenceName = compositeReferenceDO->getCString("name"); + + Interface* iface; + if (compositeReferenceDO->getDataObject("interface")) + { + iface = getInterface(composite, compositeReferenceDO); + } + else + { + iface = NULL; + } + + CompositeReference* compositeReference = new CompositeReference( + composite, compositeReferenceName, iface, NULL, false, ReferenceType::ONE_ONE); + + composite->addCompositeReference(compositeReference); + + // Get binding, it will be the first and only binding + DataObjectList& bindings = compositeReferenceDO->getList("binding"); + if (bindings.size()==0) + { + string message = "No binding for compositeReference: "; + message = message + compositeReferenceDO->getCString("name"); + throwException(SystemConfigurationException, message.c_str()); + } + DataObjectPtr binding = bindings[0]; + + // Determine the binding type + string bindingType = binding->getType().getName(); + string bindingTypeQname = binding->getType().getURI(); + bindingTypeQname += "#"; + bindingTypeQname += binding->getType().getName(); + + // Locate the extension that handles this binding type + ServiceBindingExtension* bindingExtension = runtime->getServiceBindingExtension(bindingTypeQname); + if (bindingExtension) + { + Service *service = compositeReference->getService(); + ServiceBinding* serviceBinding = bindingExtension->getServiceBinding(composite, service, binding); + service->setBinding(serviceBinding); + } + else + { + logerror("Unsupported binding type: %s", bindingTypeQname.c_str()); + + string message = "Binding type not supported: "; + message = message + bindingTypeQname; + throwException(SystemConfigurationException, message.c_str()); + } + } + + + /// + /// Use the Tuscany.config file in the composite root directory to + /// determine which xsds and wsdls to load into a dataFactory. + /// + void ModelLoader::loadTypeMetadata(const string &compositeRootDir, Composite* composite) + { + logentry(); + + // Load the "Tuscany.config" file, if it exists + Files files(compositeRootDir, "Tuscany.config", false); + if (files.size() !=0) + { + for (unsigned int i=0; i < files.size(); i++) + { + string filename = compositeRootDir + "/" + files[i].getFileName(); + XMLDocumentPtr compositeConfigFile = getXMLHelper()->loadFile(filename.c_str()); + if (compositeConfigFile->getRootDataObject() == 0) + { + logerror("Unable to load file: %s", filename.c_str()); + } + else + { + loginfo("Composite config for: %s, root directory: %s", composite->getName().c_str(), compositeRootDir.c_str()); + + if(compositeConfigFile->getRootDataObject()->isSet("xsd")) + { + DataObjectList& xsds = compositeConfigFile->getRootDataObject()->getList("xsd/file"); + + for (unsigned int i=0; i<xsds.size(); i++) + { + if(xsds[i]->isSet("name")) + { + // Load a xsd file -> set the types in the compositeComponents data factory file + string xsdName = compositeRootDir + "/" +xsds[i]->getCString("name"); + loadXMLSchema(composite, xsdName.c_str()); + } + } + } + + + if( compositeConfigFile->getRootDataObject()->isSet("wsdl")) + { + DataObjectList& wsdls = compositeConfigFile->getRootDataObject()->getList("wsdl/file"); + for (unsigned int j=0; j<wsdls.size(); j++) + { + if(wsdls[i]->isSet("name")) + { + string wsdlName = compositeRootDir + "/" +wsdls[j]->getCString("name"); + // Load a wsdl file -> get the types, then the contents of the wsdl + loadXMLSchema(composite, wsdlName.c_str()); + + // Load the contents of the wsdl files + loadWSDLDefinition(composite, wsdlName.c_str()); + } + } + } + } + } + } + else + { + // The default scheme is to have no Tuscany.config file, then we simply load all + // WSDLs and XSDs that we find under the composite root + + Files xsdFiles(compositeRootDir, "*.xsd", true); + for (unsigned int i=0; i < xsdFiles.size(); i++) + { + // Load a xsd file -> set the types in the compositeComponents data factory file + string xsdName = xsdFiles[i].getDirectory() + "/" + xsdFiles[i].getFileName(); + loadXMLSchema(composite, xsdName.c_str()); + + } + + Files wsdlFiles(compositeRootDir, "*.wsdl", true); + for (unsigned int wi=0; wi < wsdlFiles.size(); wi++) + { + // Load a wsdl file -> get the types, then the contents of the wsdl + string wsdlName = wsdlFiles[wi].getDirectory() + "/" + wsdlFiles[wi].getFileName(); + loadXMLSchema(composite, wsdlName.c_str()); + + // Load the contents of the wsdl files + loadWSDLDefinition(composite, wsdlName.c_str()); + } + } + } + + + /// + /// Use the types from an xsd or wsdl file + /// + void ModelLoader::loadXMLSchema(Composite* composite, const char *fileName) + { + logentry(); + loginfo("Loading XML schema %s", fileName); + // Load a xsd file -> set the types in the data factory associated with + // the composite + try { + composite->getXSDHelper()->defineFile(fileName); + //Utils::printTypes(composite->getXSDHelper()->getDataFactory()); + + } catch (SDORuntimeException& ex) + { + logerror("Unable to load schema: %s", fileName); + throwException(SystemConfigurationException, ex); + } + } + + /// + /// Load the web services definition from a wsdl + /// + void ModelLoader::loadWSDLDefinition(Composite* composite, const char *fileName) + { + logentry(); + + try { + // Load the wsdl file + XMLDocumentPtr doc = getXMLHelper()->loadFile(fileName); + + if (doc!=0 && doc->getRootDataObject()!=0) + { + //Utils::printDO(doc->getRootDataObject()); + + // Add the root WSDL object to the composite + composite->addWSDLDefinition(doc->getRootDataObject()); + + } + else + { + logerror("Unable to load or parse WSDL: %s", fileName); + } + + } catch (SDORuntimeException& ex) + { + logerror("Unable to load or parse WSDL: %s", fileName); + throwException(SystemConfigurationException, ex); + } + } + + ////////////////////////////////////////////////////////////////////////////// + // Methods used to load the model into memory + ////////////////////////////////////////////////////////////////////////////// + + /// + /// Get an XSDHelper that has the appropriate XSDs already loaded + /// + const XSDHelperPtr ModelLoader::getXSDHelper() + { + logentry(); + + if (myXSDHelper == 0) + { + + // Create an xsd helper + myXSDHelper = HelperProvider::getXSDHelper(); + + try { + + // Load the Assembly model schema + string root = runtime->getInstallRoot(); + string filename = root + "/xsd/sca.xsd"; + + myXSDHelper->defineFile(filename.c_str()); + + // Tuscany specific xsd for config files + filename = root + "/xsd/tuscany.xsd"; + myXSDHelper->defineFile(filename.c_str()); + + filename = root + "/xsd/wsdl_11.xsd"; + myXSDHelper->defineFile(filename.c_str()); + + filename = root + "/xsd/wsdl_11_http.xsd"; + myXSDHelper->defineFile(filename.c_str()); + + filename = root + "/xsd/wsdl_11_mime.xsd"; + myXSDHelper->defineFile(filename.c_str()); + + filename = root + "/xsd/wsdl_11_soap.xsd"; + myXSDHelper->defineFile(filename.c_str()); + + filename = root + "/xsd/wsdl_11_soap12.xsd"; + myXSDHelper->defineFile(filename.c_str()); + + // Load any schema from the extensions directory + string extensionsRoot = root + "/extensions"; + + Files files(extensionsRoot, "*.xsd", true); + for (unsigned int i=0; i < files.size(); i++) + { + string extensionSchema = files[i].getDirectory() + "/" + files[i].getFileName(); + myXSDHelper->defineFile(extensionSchema.c_str()); + } + + + } catch (SDORuntimeException& ex) + { + throwException(SystemConfigurationException, ex); + } + } + + return myXSDHelper; + } + + /// + /// Get an XMLHelper to load files + /// + const XMLHelperPtr ModelLoader::getXMLHelper() + { + logentry(); + + if (myXMLHelper == 0) { + + // Create an xml helper + myXMLHelper = HelperProvider::getXMLHelper(getXSDHelper()->getDataFactory()); + + } + + return myXMLHelper; + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ModelLoader.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ModelLoader.h new file mode 100644 index 0000000000..b3b3ec2df6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ModelLoader.h @@ -0,0 +1,122 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_modelloader_h +#define tuscany_sca_model_modelloader_h + +#include <map> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/util/File.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + + /** + * Provides methods to load the runtime model from the SCDL file. + */ + class ModelLoader { + + public: + /** + * Constructor. + * @param system The SCA system to load. + */ + ModelLoader(tuscany::sca::SCARuntime* runtime, Composite* system); + + /** + * Destructor. + */ + virtual ~ModelLoader(); + + /** + * Load the model from the configuration information. + * @param systemRoot The location of the system configuration + * @param systemPath The search path for composites + */ + void load(const std::string& systemRoot, const std::string& systemPath); + + private: + void loadSystem(const std::string& systemRoot); + + void loadComposites(const std::string& searchPath); + Composite* loadCompositeFile(const tuscany::sca::util::File& file); + Composite* mapCompositePass1(const tuscany::sca::util::File& file, commonj::sdo::DataObjectPtr rootDO); + Composite* mapCompositePass2(const std::string& compositeName, commonj::sdo::DataObjectPtr rootDO); + + void addComponent(Composite* composite, commonj::sdo::DataObjectPtr componentDO); + void addCompositeService(Composite* composite, commonj::sdo::DataObjectPtr compositeServiceDO); + void addCompositeReference(Composite* composite, commonj::sdo::DataObjectPtr referenceServiceDO); + + void addServiceTypes(Composite* composite, ComponentType* componentType, commonj::sdo::DataObjectPtr componentTypeDO); + void addReferenceTypes(Composite* composite, ComponentType* componentType, commonj::sdo::DataObjectPtr componentTypeDO); + void addPropertyTypes(ComponentType* componentType, commonj::sdo::DataObjectPtr componentTypeDO); + + void loadTypeMetadata(const std::string &compositeRootDir, Composite* composite); + + void loadXMLSchema(Composite* composite, const char *fileName); + void loadWSDLDefinition(Composite* composite, const char *fileName); + + Interface* getInterface(Composite* composite, commonj::sdo::DataObjectPtr obj); + + SCARuntime* runtime; + + commonj::sdo::XMLHelperPtr myXMLHelper; // Used to load scdl files + commonj::sdo::XSDHelperPtr myXSDHelper; // Used to load xsds + + const commonj::sdo::XSDHelperPtr getXSDHelper(void); + const commonj::sdo::XMLHelperPtr getXMLHelper(void); + + /** + * The composite describing the composition of the system + */ + Composite* system; + + /** + * Maps of all the composites installed on the system. + */ + typedef std::map<std::string, Composite*> COMPOSITE_MODELS; + COMPOSITE_MODELS compositeModels; + + typedef std::map<std::string, commonj::sdo::DataObjectPtr> COMPOSITE_DATAOBJECTS; + COMPOSITE_DATAOBJECTS compositeDataObjects; + + typedef std::map<std::string, Composite*> COMPOSITE_FILES; + COMPOSITE_FILES compositeFiles; + + }; + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_modelloader_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Reference.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Reference.cpp new file mode 100644 index 0000000000..8820379c4e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Reference.cpp @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + // Constructor + Reference::Reference(Component* component, ReferenceType* referenceType) + : component(component), type(referenceType), binding(0) + { + logentry(); + } + + // Destructor + Reference::~Reference() + { + logentry(); + } + + void Reference::setBinding(ReferenceBinding* binding) + { + this->binding = binding; + } + + ReferenceBinding* Reference::getBinding() const + { + return binding; + } + + void Reference::addTarget(Service* target) + { + logentry(); + + if (type->getMultiplicity() == ReferenceType::ONE_ONE || type->getMultiplicity() == ReferenceType::ZERO_ONE) + { + if (targets.size() > 0) + { + string message = "Duplicate wire for reference: " + type->getName(); + throwException(SystemConfigurationException, message.c_str()); + } + } + + targets.push_back(target); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Reference.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Reference.h new file mode 100644 index 0000000000..33413b488f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Reference.h @@ -0,0 +1,126 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_reference_h +#define tuscany_sca_model_reference_h + +#include <vector> + +namespace tuscany +{ + namespace sca + { + namespace model + { + class Component; + class ReferenceType; + class ReferenceBinding; + class Service; + + /** + * An addressable instance of a reference type associated with a particular component. + * Each reference represents a configured version of a logical + * reference type defined in the component type. If the logical reference + * has a multiplicity greater than 1 (0..n or 1..n) then the configured + * reference many have multiple targets. + */ + class Reference + { + public: + /** + * Constructor. + * @param component The component on which the reference is defined. + * @param referenceType The reference type defining the characteristics of the reference. + */ + SCA_API Reference(Component* component, ReferenceType* referenceType); + + /** + * Destructor. + */ + SCA_API virtual ~Reference(); + + /** + * Returns the component on which this reference is defined. + * @return The component on which this reference is defined. + */ + SCA_API Component* getComponent() const { return component; } + + /** + * Returns the reference type defining the characteristics of the reference. + * @return The reference type defining the characteristics of the reference. + */ + SCA_API ReferenceType* getType() const { return type; } + + /** + * Returns the binding supported by the reference. + * @return The binding supported by the reference. + */ + SCA_API ReferenceBinding* getBinding() const; + + /** + * Sets the binding supported by the reference. + * @param binding The binding supported by the reference. + */ + SCA_API void setBinding(ReferenceBinding* binding); + + /** + * Add a target for this reference. There may be more than + * one if the multiplicity is 0..n or 1..n. + * @param target The target of the reference. + */ + SCA_API void addTarget(Service* target); + + typedef std::vector<Service*> TARGETS; + + /** + * Get a vector of all the targets from this reference. + * @return The targets of this reference. + */ + SCA_API const TARGETS& getTargets() const { return targets; } + + private: + + /** + * The component on which this reference is defined. + */ + Component* component; + + /** + * The reference type defining the characteristics of the reference. + */ + ReferenceType* type; + + /** + * The binding supported by this reference + */ + ReferenceBinding* binding; + + /** + * Vector of all the targets wired from this reference. + */ + TARGETS targets; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_reference_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceBinding.cpp new file mode 100644 index 0000000000..c4e9d875b6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceBinding.cpp @@ -0,0 +1,75 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/ReferenceBinding.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" + + +using namespace std; + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + ReferenceBinding::ReferenceBinding(Reference *reference, const string& uri) : + Binding(uri), reference(reference), targetServiceBinding(0) + { + logentry(); + } + + // Destructor + ReferenceBinding::~ReferenceBinding() + { + logentry(); + } + + void ReferenceBinding::configure(const string& uri) + { + logentry(); + + // Find the target service + Component* component = reference->getComponent(); + Composite* composite = component->getComposite(); + Service* service; + service = composite->findComponentService(uri); + if (!service) + { + logerror("Wire target %s not found", uri.c_str()); + } + else + { + // Configure this binding from the target service binding + configure(service->getBinding()); + } + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceBinding.h new file mode 100644 index 0000000000..197d40aabf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceBinding.h @@ -0,0 +1,116 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_referencebinding_h +#define tuscany_sca_model_referencebinding_h + +#include <string> + +#include "tuscany/sca/model/Binding.h" + +namespace tuscany +{ + namespace sca + { + class ServiceProxy; + + + namespace model + { + class Reference; + class ServiceBinding; + + /** + * Represents a reference binding. + * Bindings are used by services and references. References use bindings + * to describe the access mechanism used to call an external service (which can + * be a service provided by another SCA composite). Services use bindings to describe + * the access mechanism that clients (which can be a client from another SCA composite) + * have to use to call the service. + * This interface will typically be extended by binding implementations to allow + * specification of binding/transport specific information. + */ + class ReferenceBinding : public Binding + { + public: + + /** + * Constructor to create a new binding. + */ + SCA_API ReferenceBinding(Reference* reference, const std::string& uri); + + /** + * Destructor. + */ + SCA_API virtual ~ReferenceBinding(); + + /** + * Create a proxy representing the reference to the + * client component. + */ + SCA_API virtual ServiceProxy* getServiceProxy() = 0; + + /** + * Configure this binding from a service binding. + */ + SCA_API virtual void configure(ServiceBinding* serviceBinding) = 0; + + /** + * Configure this binding from a URI. + */ + SCA_API virtual void configure(const std::string& uri); + + /** + * Returns the reference. + * @return The reference. + */ + SCA_API Reference* getReference() const { return reference; }; + + /** + * Returns the target service binding. + */ + SCA_API ServiceBinding* getTargetServiceBinding() const { return targetServiceBinding; }; + + protected: + + /** + * Sets the target service binding. + */ + SCA_API void setTargetServiceBinding(ServiceBinding* binding) { targetServiceBinding = binding; }; + + private: + + /** + * The reference configured with the binding. + */ + Reference* reference; + + /** + * The service binding of the target + */ + ServiceBinding* targetServiceBinding; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_referencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceType.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceType.cpp new file mode 100644 index 0000000000..732a14cace --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceType.cpp @@ -0,0 +1,88 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/model/ReferenceType.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + + // Constructor + ReferenceType::ReferenceType(ComponentType* componentType, const string& name, + Interface* intface, Interface* callbackInterface, Multiplicity multiplicity) + : Contract(intface, callbackInterface), + componentType(componentType), name(name), multiplicity(multiplicity) + { + logentry(); + } + + ReferenceType::~ReferenceType() + { + logentry(); + } + + ReferenceType::Multiplicity ReferenceType::getMultiplicityFromString(const string& multip) + { + logentry(); + + if (multip == "0..1") + { + return ReferenceType::ZERO_ONE; + } + else if (multip == "1..1") + { + return ReferenceType::ONE_ONE; + } + else if (multip == "0..n") + { + return ReferenceType::ZERO_MANY; + } + else if (multip == "1..n") + { + return ReferenceType::ONE_MANY; + } + else + { + return ReferenceType::UNKNOWN; + } + } + + void ReferenceType::setBinding(Binding* binding) + { + this->binding = binding; + } + + Binding* ReferenceType::getBinding() const + { + return binding; + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceType.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceType.h new file mode 100644 index 0000000000..87d38ab330 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ReferenceType.h @@ -0,0 +1,138 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_referencetype_h +#define tuscany_sca_model_referencetype_h + +#include <string> + +#include "tuscany/sca/model/Contract.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + class ComponentType; + class Interface; + class Binding; + + /** + * Represents an SCA reference. SCA references within an implementation represent + * links to services that the implementation uses that must be provided by other components + * in the SCA system. + */ + class ReferenceType : public Contract + { + public: + + /** + * Multiplicity (how many wires can be connected to this + * reference) + */ + enum Multiplicity + { + ZERO_ONE = 1, + ONE_ONE = 2, + ZERO_MANY = 3, + ONE_MANY = 4, + UNKNOWN = 0, + }; + + /** + * Constructor. + * @param name The name of the reference. + */ + SCA_API ReferenceType(ComponentType* componentType, const std::string& name, + Interface* intface, Interface* callbackInterface, Multiplicity multiplicity); + + /** + * Destructor. + */; + SCA_API virtual ~ReferenceType(); + + /** + * Returns the component type on which this reference is defined. + * @return The component type on which this reference is defined. + */ + SCA_API ComponentType* getComponentType() const { return componentType; } + + /** + * Returns the name of the reference. + * @return The name of the reference. + */ + SCA_API const std::string& getName() const { return name; } + + /** + * Returns the multiplicity allowed for wires connected to this reference. + * @return The multiplicity allowed for wires connected to this reference + */ + SCA_API Multiplicity getMultiplicity() const { return multiplicity; } + + /** + * Returns the binding supported by the reference. + * @return The binding supported by the reference. + */ + SCA_API Binding* getBinding() const; + + /** + * Sets the binding supported by the reference. + * @param binding The binding supported by the reference. + */ + SCA_API void setBinding(Binding* binding); + + /** + * Get the multiplicity corresponding to the given + * string. + */ + static Multiplicity getMultiplicityFromString(const std::string& multip); + + private: + + /** + * The component type on which this reference is defined. + */ + ComponentType *componentType; + + /** + * The name of the reference type. + */ + std::string name; + + /** + * The multiplicity allowed for wires connected to this reference. + */ + Multiplicity multiplicity; + + /** + * The binding supported by this reference type. + */ + Binding* binding; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_referencetype_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Service.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Service.cpp new file mode 100644 index 0000000000..4df1d1efc6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Service.cpp @@ -0,0 +1,58 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/model/Service.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + + // Constructor + Service::Service(Component* component, ServiceType* serviceType) + : component(component), type(serviceType), binding(0) + { + logentry(); + } + + // Destructor + Service::~Service() + { + logentry(); + } + + void Service::setBinding(ServiceBinding* binding) + { + this->binding = binding; + } + + ServiceBinding* Service::getBinding() const + { + return binding; + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Service.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Service.h new file mode 100644 index 0000000000..a1f2c5d672 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Service.h @@ -0,0 +1,101 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_service_h +#define tuscany_sca_model_service_h + + +namespace tuscany +{ + namespace sca + { + namespace model + { + class Component; + class ServiceType; + class ServiceBinding; + + /** + * An addressable instance of a service type associated with a particular component. + */ + class Service + { + public: + /** + * Constructor. + * @param component The component on which the service is defined. + * @param serviceType The service type defining the characteristics of the service. + */ + SCA_API Service(Component* component, ServiceType* serviceType); + + /** + * Destructor. + */ + SCA_API virtual ~Service(); + + /** + * Returns the component on which this service is defined. + * @return The component on which this service is defined. + */ + SCA_API Component* getComponent() const { return component; } + + /** + * Returns the service type defining the characteristics of the service. + * @return The service type defining the characteristics of the service. + */ + SCA_API ServiceType* getType() const { return type; } + + /** + * Returns the binding supported by the service. + * @return The binding supported by the service. + */ + SCA_API ServiceBinding* getBinding() const; + + /** + * Sets the binding supported by the service. + * @param binding The binding supported by the service. + */ + SCA_API void setBinding(ServiceBinding* binding); + + private: + + /** + * The component on which this service is defined. + */ + Component* component; + + /** + * The service type defining the characteristics of the service. + */ + ServiceType* type; + + /** + * The binding supported by this service + */ + ServiceBinding* binding; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_service_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceBinding.cpp new file mode 100644 index 0000000000..ddc5e6a711 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceBinding.cpp @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/ServiceBinding.h" + +using namespace std; + + +namespace tuscany +{ + namespace sca + { + + namespace model + { + + // Constructor + ServiceBinding::ServiceBinding(Service* service, const string& uri) : + Binding(uri), service(service) + { + logentry(); + } + + // Destructor + ServiceBinding::~ServiceBinding() + { + logentry(); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceBinding.h new file mode 100644 index 0000000000..4e68f492a3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceBinding.h @@ -0,0 +1,89 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_servicebinding_h +#define tuscany_sca_model_servicebinding_h + +#include <string> + +#include "tuscany/sca/model/Binding.h" + + +namespace tuscany +{ + namespace sca + { + class ServiceWrapper; + + namespace model + { + class Service; + + /** + * Represents a service binding. + * Bindings are used by services and references. References use bindings + * to describe the access mechanism used to call an external service (which can + * be a service provided by another SCA composite). Services use bindings to describe + * the access mechanism that clients (which can be a client from another SCA composite) + * have to use to call the service. + * This interface will typically be extended by binding implementations to allow + * specification of binding/transport specific information. + */ + class ServiceBinding : public Binding + { + public: + + /** + * Constructor to create a new binding. + */ + SCA_API ServiceBinding(Service* service, const std::string& uri); + + /** + * Destructor. + */ + SCA_API virtual ~ServiceBinding(); + + /** + * Create a service wrapper handling the interaction + * with the service configured with this binding. + */ + SCA_API virtual ServiceWrapper* getServiceWrapper() = 0; + + /** + * Returns the service + * @return The service. + */ + SCA_API Service* getService() const { return service; }; + + private: + + /** + * The service configured with the binding. + */ + Service* service; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_servicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceType.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceType.cpp new file mode 100644 index 0000000000..819a832443 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceType.cpp @@ -0,0 +1,62 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/ServiceType.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + + // Constructor + ServiceType::ServiceType(ComponentType* componentType, const string& name, + Interface* intface, Interface* callbackInterface) + : Contract(intface, callbackInterface), + componentType(componentType), name(name) + { + logentry(); + } + + // Destructor + ServiceType::~ServiceType() + { + logentry(); + } + + void ServiceType::setBinding(Binding* binding) + { + this->binding = binding; + } + + Binding* ServiceType::getBinding() const + { + return binding; + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceType.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceType.h new file mode 100644 index 0000000000..08a76e3b3f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/ServiceType.h @@ -0,0 +1,108 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_servicetype_h +#define tuscany_sca_model_servicetype_h + +#include <string> + +#include "tuscany/sca/model/Contract.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + class ComponentType; + class Binding; + class Interface; + + /** + * Represents a service type. Services are used to publish services provided by + * implementations, so that they are addressable by other components. + */ + class ServiceType : public Contract + { + public: + + /** + * Constructor. + * @param componentType The component type on which this service is defined. + * @param name The name of the service. + */ + SCA_API ServiceType(ComponentType* componentType, const std::string& name, + Interface* intface, Interface* callbackInterface); + + /** + * Destructor. + */ + SCA_API virtual ~ServiceType(); + + /** + * Returns the component type on which this service is defined. + * @return The component type on which this service is defined. + */ + SCA_API ComponentType* getComponentType() const { return componentType; } + + /** + * Returns the name of the service type. + * @return The name of the service type + */ + SCA_API const std::string& getName() const { return name; } + + /** + * Returns the binding supported by this service type. + * @return The binding supported by this service type + */ + SCA_API Binding* getBinding() const; + + /** + * Sets the binding supported by this service type. + * @param binding the binding supported by this service type + */ + SCA_API void setBinding(Binding* binding); + + private: + + /** + * The component type on which this service is defined. + */ + ComponentType* componentType; + + /** + * The name of the service type. + */ + std::string name; + + /** + * The binding supported by this service + */ + Binding* binding; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_servicetype_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLDefinition.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLDefinition.cpp new file mode 100644 index 0000000000..53971b5a17 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLDefinition.cpp @@ -0,0 +1,633 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <sstream> +#include <set> + +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + // Constructor + WSDLDefinition::WSDLDefinition(DataObjectPtr wsdlModel) + { + logentry(); + + wsdlModels.insert(wsdlModels.end(), wsdlModel); + mapOperations( wsdlModel ); + } + + WSDLDefinition::~WSDLDefinition() + { + logentry(); + } + + /// + /// The namespace of the service and other definitions defined in this wsdl definition + string WSDLDefinition::getNamespace() + { + logentry(); + return wsdlModels[0]->getCString("targetNamespace"); + } + + void WSDLDefinition::addWSDLModel(DataObjectPtr wsdlModel) + { + logentry(); + wsdlModels.insert(wsdlModels.end(), wsdlModel); + mapOperations( wsdlModel ); + } + + /// + /// Find the operation defined in this wsdl + /// + const WSDLOperation& WSDLDefinition::findOperation(const string& serviceName, + const string& portName, + const string& operationName) + { + logentry(); + + string operationKey = serviceName+"#"+portName; + STR_OPERATION_MAP::const_iterator spIter = servicePortMap.find(operationKey); + if( spIter == servicePortMap.end() ) + { + stringstream errMessage; + errMessage + << "Unable to find Service and Port: \"" + << serviceName << "," << portName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + OPERATION_MAP::const_iterator opIter = spIter->second.find(operationName); + + if (opIter != spIter->second.end()) + { + return opIter->second; + } + else + { + stringstream errMessage; + errMessage + << "Unable to find operation \"" + << serviceName << ":" << portName << ":" << operationName + << "\" in the WSDL definition"; + + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + } + + /// + /// Find the operation defined in this wsdl + /// + const WSDLOperation& WSDLDefinition::findOperation(const string& portTypeName, + const string& operationName) + { + logentry(); + + STR_OPERATION_MAP::const_iterator ptIter = portTypeMap.find(portTypeName); + if( ptIter == portTypeMap.end() ) + { + stringstream errMessage; + errMessage + << "Unable to find PortType: \"" + << portTypeName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + OPERATION_MAP::const_iterator opIter = ptIter->second.find(operationName); + + if (opIter != ptIter->second.end()) + { + return opIter->second; + } + else + { + stringstream errMessage; + errMessage + << "Unable to find Operation \"" + << portTypeName << ":" << operationName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + } + + std::list<std::string> WSDLDefinition::getPortTypes() + { + logentry(); + + std::list<std::string> ptList; + STR_OPERATION_MAP::const_iterator ptIter = portTypeMap.begin(); + STR_OPERATION_MAP::const_iterator ptIterEnd = portTypeMap.end(); + + for( ; ptIter != ptIterEnd; ++ptIter ) + { + ptList.push_back( ptIter->first ); + } + + return ptList; + } + + std::list<std::string> WSDLDefinition::getOperations( const std::string &portTypeName ) + { + logentry(); + + std::list<std::string> ptOpList; + STR_OPERATION_MAP::const_iterator ptIter = portTypeMap.find( portTypeName ); + + if( ptIter == portTypeMap.end() ) + { + stringstream errMessage; + errMessage + << "Unable to find PortType: \"" + << portTypeName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + OPERATION_MAP::const_iterator opIter = ptIter->second.begin(); + OPERATION_MAP::const_iterator opIterEnd = ptIter->second.end(); + + for( ; opIter != opIterEnd; ++opIter ) + { + ptOpList.push_back( opIter->first ); + } + + return ptOpList; + } + + /// + /// Find a service + /// + DataObjectPtr WSDLDefinition::findService(const string& serviceName) + { + logentry(); + + DataObjectPtr service = 0; + + // Find the binding + for (unsigned int m = 0; m < wsdlModels.size(); m++) + { + DataObjectList& serviceList = wsdlModels[m]->getList("service"); + for (unsigned int i=0; i<serviceList.size(); i++) + { + string name(serviceList[i]->getCString("name")); + + if (name.compare(serviceName) == 0) + { + return serviceList[i]; + } + } + } + + return service; + } + + + /// + /// Find a named binding + /// + DataObjectPtr WSDLDefinition::findBinding(const string& bindingName) + { + logentry(); + + DataObjectPtr binding = 0; + string uri; + string name; + + Utils::rTokeniseString("#", bindingName, uri, name); + + // Find the binding + for (unsigned int m = 0; m < wsdlModels.size(); m++) + { + DataObjectList& bindingList = wsdlModels[m]->getList("binding"); + for (unsigned int i=0; i<bindingList.size(); i++) + { + string nameBinding(bindingList[i]->getCString("name")); + + if (nameBinding.compare(name) == 0) + { + return bindingList[i]; + } + } + } + + return binding; + } + + /// + /// Find a named portType + /// + DataObjectPtr WSDLDefinition::findPortType(const string& portTypeName) + { + logentry(); + + DataObjectPtr portType = 0; + string uri; + string name; + + Utils::rTokeniseString("#", portTypeName, uri, name); + + // Find the binding + for (unsigned int m = 0; m < wsdlModels.size(); m++) + { + DataObjectList& portTypeList = wsdlModels[m]->getList("portType"); + for (unsigned int i=0; i<portTypeList.size(); i++) + { + string namePortType(portTypeList[i]->getCString("name")); + + if (namePortType.compare(name) == 0) + { + return portTypeList[i]; + } + } + } + + return portType; + } + + /// + /// Find a named message + /// + DataObjectPtr WSDLDefinition::findMessage(const string& messageName) + { + logentry(); + + DataObjectPtr message = 0; + string uri; + string name; + + Utils::rTokeniseString("#", messageName, uri, name); + + // Find the binding + for (unsigned int m = 0; m < wsdlModels.size(); m++) + { + DataObjectList& messageList = wsdlModels[m]->getList("message"); + for (unsigned int i=0; i<messageList.size(); i++) + { + string nameMessage(messageList[i]->getCString("name")); + + if (nameMessage.compare(name) == 0) + { + return messageList[i]; + } + } + } + + return message; + } + + /// + /// Traverse the WSDL SDO and insert operations into the operationMap + /// + void WSDLDefinition::mapOperations( DataObjectPtr wsdlModel ) + { + logentry(); + + // check for duplicate message/binding/PortType/Service + // with equal name attributes. This cant be enforced by + // the schema, so it has to be enforced at the app level + checkForDuplicates( wsdlModel ); + + DataObjectList& serviceList = wsdlModel->getList("service"); + + // Iterate through the WSDL services + for (unsigned int i=0; i < serviceList.size(); i++) + { + string serviceName( serviceList[i]->getCString("name") ); + + // Iterate through the WSDL service ports + DataObjectList& portList = serviceList[i]->getList("port"); + for (unsigned int j=0; j < portList.size();j++) + { + string portName( portList[j]->getCString("name") ); + string wsBindingName(portList[j]->getCString("binding")); + + // There can only be one soap address and the check must be made + // at the application level since it cant be specified in the xsd +/* + DataObjectList& soapAddressList = portList[j]->getList("address"); + if( soapAddressList.size() != 1 ) + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "service/port/address: \"" + << portName + << "\" cannot be duplicated in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } +*/ + + string targetAddress(portList[j]->getCString("address/location")); + + // get the binding specified in the WSDL service port + DataObjectPtr wsBinding = findBinding(wsBindingName); + if (!wsBinding) + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "Unable to find binding \"" + << wsBindingName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + // Check if its a SOAP binding, if not go on to the next binding + // doing a find like this will work for SOAP11 and SOAP12 + DataObjectPtr wsBindingSubBinding = wsBinding->getDataObject("binding"); + string bindingURI(wsBindingSubBinding->getType().getURI()); + if (bindingURI.find("http://schemas.xmlsoap.org/wsdl/soap") == string::npos) + { + loginfo("Discarding non-SOAP Binding %s", wsBindingName.c_str() ); + continue; + } + + // Get the port type specified the WSDL binding + string wsBindingPortTypeName(wsBinding->getCString("type")); + DataObjectPtr portType = findPortType(wsBindingPortTypeName); + if (!portType) + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "Unable to find PortType \"" + << wsBindingPortTypeName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + string portTypeName( portType->getCString("name") ); + + // Fill in this map with operation names to WSDLOperations + // then after iterating through the operations, add the map + // to the portTypeMap, keyed off of the portTypeName + OPERATION_MAP operationMap; + + // For each binding and portType operation: + // - get the soap action, style, and use from the binding + // - get the input and/or output message types + // its ok if not all of the PortType operations are not defined in the binding + DataObjectList& bindingOperationList = wsBinding->getList("operation"); + DataObjectList& portTypeOperationList = portType->getList("operation"); + for (unsigned int k=0; k < bindingOperationList.size(); k++) + { + DataObjectPtr bindingOp = bindingOperationList[k]; + string operationName = bindingOp->getCString("name"); + + // Get the corresponding PortType operation + // I know this may not be very efficient, but its a necessary evil + bool foundPortType = false; + DataObjectPtr portTypeOp; + for (unsigned int l=0; + (!foundPortType && l < portTypeOperationList.size()); + l++) + { + //portTypeOp = portTypeOperationList[l]->getDataObject("operation"); + portTypeOp = portTypeOperationList[l]; + if (operationName == portTypeOp->getCString("name") ) + { + foundPortType = true; + } + } + + if( !foundPortType ) + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "Unable to find PortType operation for binding operation: \"" + << operationName + << "\" in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + string soapAction = ""; + bool documentStyle = true; + bool wrappedStyle = true; + bool useEncodedInput = false; + bool useEncodedOutput = false; + WSDLOperation::soapVersion soapVer = WSDLOperation::SOAP11; + + string opType = bindingOp->getType().getURI(); + if (opType == "http://schemas.xmlsoap.org/wsdl/soap12/") + { + soapVer = WSDLOperation::SOAP12; + } + + // Get the soapAction + soapAction = bindingOp->getCString("operation/soapAction"); + + // Get the style + string style = bindingOp->getCString("operation/style"); + if (style == "") + { + style = wsBinding->getCString("binding/style"); + } + if (style != "document") + { + documentStyle = false; + wrappedStyle = false; + } + + // get the use + string use = bindingOp->getCString("input/body/use"); + if (use == "encoded") + { + useEncodedInput = true; + } + + use = bindingOp->getCString("output/body/use"); + if (use == "encoded") + { + useEncodedOutput = true; + } + + // Get the request message type from the PortType + DataObjectPtr wsMessageIn = + findMessage(portTypeOp->getCString("input/message")); + if (!wsMessageIn) + { + stringstream errMessage; + errMessage + << "unable to find PortType input message \"" + << portTypeOp->getCString("input/message") + << "\" in the wsdl definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + string inputMessageType( wsMessageIn->getCString("name") ); + // If it doesnt have a namespace prefix, add the target namespace + if (inputMessageType.find("#") == string::npos) + { + inputMessageType.insert(0, (getNamespace() + "#") ); + } + + // Get the response message type from the PortType + DataObjectPtr wsMessageOut = + findMessage(portTypeOp->getCString("output/message")); + if (!wsMessageOut) + { + // TODO this is ok for one way operations, right? + stringstream errMessage; + errMessage + << "unable to find PortType output message \"" + << portTypeOp->getCString("output/message") + << "\" in the wsdl definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + string outputMessageType( wsMessageOut->getCString("name") ); + // If it doesnt have a namespace prefix, add the target namespace + if (outputMessageType.find("#") == string::npos) + { + outputMessageType.insert(0, (getNamespace() + "#") ); + } + + WSDLOperation wsdlOp; + wsdlOp.setOperationName(operationName); + wsdlOp.setSoapAction(soapAction); + wsdlOp.setEndpoint(targetAddress); + wsdlOp.setSoapVersion(soapVer); + wsdlOp.setDocumentStyle(documentStyle); + wsdlOp.setWrappedStyle(wrappedStyle); + wsdlOp.setInputEncoded(useEncodedInput); + wsdlOp.setOutputEncoded(useEncodedOutput); + wsdlOp.setInputMessageType(inputMessageType); + wsdlOp.setOutputMessageType(outputMessageType); + wsdlOp.setInputMessage(wsMessageIn); + wsdlOp.setOutputMessage(wsMessageOut); + + operationMap[ operationName ] = wsdlOp; + + } // end bindingOperationList + + portTypeMap[portTypeName] = operationMap; + servicePortMap[(serviceName+"#"+portName)] = operationMap; + + } // end portTypeList + } // end serviceList + } // end method mapOperations + + void WSDLDefinition::checkForDuplicates( DataObjectPtr wsdlModel ) + { + logentry(); + + // check for duplicate message/binding/PortType/service + // with equal name attributes. This cant be enforced by + // the schema, so it has to be enforced at the app level + + std::set<string> namesSet; + + DataObjectList &messageList = wsdlModel->getList("message"); + for( unsigned int i = 0; i < messageList.size(); i++ ) + { + if( namesSet.find( messageList[i]->getCString("name") ) == namesSet.end() ) + { + namesSet.insert( messageList[i]->getCString("name") ); + } + else + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "message/name: \"" + << messageList[i]->getCString("name") + << "\" cannot be duplicated in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + } + + namesSet.clear(); + DataObjectList &bindingList = wsdlModel->getList("binding"); + for( unsigned int i = 0; i < bindingList.size(); i++ ) + { + if( namesSet.find( bindingList[i]->getCString("name") ) == namesSet.end() ) + { + namesSet.insert( bindingList[i]->getCString("name") ); + } + else + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "binding/name: \"" + << bindingList[i]->getCString("name") + << "\" cannot be duplicated in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + } + + namesSet.clear(); + DataObjectList &portTypeList = wsdlModel->getList("portType"); + for( unsigned int i = 0; i < portTypeList.size(); i++ ) + { + if( namesSet.find( portTypeList[i]->getCString("name") ) == namesSet.end() ) + { + namesSet.insert( portTypeList[i]->getCString("name") ); + } + else + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "portType/name: \"" + << portTypeList[i]->getCString("name") + << "\" cannot be duplicated in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + } + + namesSet.clear(); + DataObjectList &serviceList = wsdlModel->getList("service"); + for( unsigned int i = 0; i < serviceList.size(); i++ ) + { + if( namesSet.find( serviceList[i]->getCString("name") ) == namesSet.end() ) + { + namesSet.insert( serviceList[i]->getCString("name") ); + } + else + { + // Invalid WSDL + stringstream errMessage; + errMessage + << "service/name: \"" + << serviceList[i]->getCString("name") + << "\" cannot be duplicated in the WSDL definition"; + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + } + } + + } // end namespace model + } // end namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLDefinition.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLDefinition.h new file mode 100644 index 0000000000..baf14fcd6d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLDefinition.h @@ -0,0 +1,180 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_wsdldefinition_h +#define tuscany_sca_model_wsdldefinition_h + +#include <string> +#include <map> +#include <vector> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/WSDLOperation.h" + + +namespace tuscany +{ + namespace sca + { + namespace model + { + + class WSDLOperation; + + /** + * Holds information about a WSDL definition loaded into the runtime. + */ + class WSDLDefinition + { + public: + /** + * Constructor. + * @param wsdlModel The data object representing the WSDL document + * defining a web service. + */ + SCA_API WSDLDefinition(commonj::sdo::DataObjectPtr wsdlModel); + + /** + * Destructor. + */ + SCA_API virtual ~WSDLDefinition(); + + /** + * Returns the target namespace of the WSDL definitions. + * @return The target namespace. + */ + SCA_API std::string getNamespace(void); + + /** + * Add a WSDL model. + */ + SCA_API void addWSDLModel(commonj::sdo::DataObjectPtr wsdlModel); + + /** + * Find an operation in the WSDL definitions. + * @param serviceName The name of the service on which this + * operation is defined. + * @param portName The name of the port in the service to + * use. + * @param operationName The name of the operation to find. + * @return The operation if found. Exception thrown if not found. + */ + SCA_API const WSDLOperation& findOperation(const std::string& serviceName, + const std::string& portName, + const std::string& operationName); + + /** + * Find an operation in the WSDL definitions. + * @param portTypeName The name of the portType on which this + * operation is defined. + * @param operationName The name of the operation to find. + * @return The operation if found. Exception thrown if not found. + */ + SCA_API const WSDLOperation& findOperation(const std::string& portTypeName, + const std::string& operationName); + + /** + * Get all of the PortTypes in this WSDL definition. + * @return A standard list of standard strings, each being a different PortType + */ + SCA_API std::list<std::string> getPortTypes(); + + /** + * Get all of the Operations for a particular PortType in this WSDL definition. + * @param portTypeName Get all of the operations for this portTypeName + * @return A standard list of standard strings, each of which is a different operation + */ + SCA_API std::list<std::string> getOperations( const std::string &portTypeName ); + + private: + + /** + * Find a service in the wsdl definition. + * @param serviceName The name of the service. + * @return A data object describing the service if found, otherwise + * a 0 if not found. + */ + commonj::sdo::DataObjectPtr findService(const std::string& serviceName); + + /** + * Find a binding in the wsdl definition. + * @param bindingName The name of the binding to find. + * @return A data object describing the binding if found, otherwise + * a 0 if not found. + */ + commonj::sdo::DataObjectPtr findBinding(const std::string& bindingName); + + /** + * Find a portType in the wsdl definition. + * @param portTypeName The name of the portType. + * @return A data object describing the portType if found, otherwise + * a 0 if not found. + */ + commonj::sdo::DataObjectPtr findPortType(const std::string& portTypeName); + + /** + * Find a message in the wsdl definition. + * @param messageName The name of the message. + * @return A data object describing the message if found, otherwise + * a 0 if not found. + */ + commonj::sdo::DataObjectPtr findMessage(const std::string& messageName); + + /** + * Given a wsdl represented by an SDO, traverse the SDO and + * extract all of the necessary information to populate the + * operationMap with WSDLOperation objects. + * This method is called each time a wsdl model is added: so + * that would be be in the constructor and in addWSDLModel(). + * @param wsdlModel A wsdl represented by an SDO + */ + void mapOperations( commonj::sdo::DataObjectPtr wsdlModel ); + + /** + * Given a wsdl represented by an SDO, check for duplicate + * message/binding/PortType/service with equal name attributes. + * This cant be enforced by the schema, so it has to be enforced + * at the app level. If a duplicate is found, a + * SystemConfigurationException exception is thrown. + * @param wsdlModel A wsdl represented by an SDO + */ + void checkForDuplicates( commonj::sdo::DataObjectPtr wsdlModel ); + + /** + * The data object representation of the WSDL document. + */ + typedef std::vector<commonj::sdo::DataObjectPtr> MODEL_VECTOR; + MODEL_VECTOR wsdlModels; + + typedef std::map<std::string, WSDLOperation> OPERATION_MAP; + typedef std::map<std::string, OPERATION_MAP> STR_OPERATION_MAP; + STR_OPERATION_MAP portTypeMap; + STR_OPERATION_MAP servicePortMap; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_wsdldefinition_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLInterface.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLInterface.cpp new file mode 100644 index 0000000000..5fa45a9967 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLInterface.cpp @@ -0,0 +1,107 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/WSDLInterface.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + const string WSDLInterface::typeQName("http://www.osoa.org/xmlns/sca/1.0#WSDLPortType"); + + // Constructor + WSDLInterface::WSDLInterface( + const string& qname, bool remotable, bool conversational) + : Interface(remotable, conversational) + { + logentry(); + parse(qname); + } + + void WSDLInterface::parse(const string& qname) + { + logentry(); + + // PortType is of the form: <wsdl-namepace-uri>#wsdl.interface(<portType-name>) + string::size_type hash = qname.find("#"); + if (hash != string::npos) + { + // Found a hash + + // Namepace is the part before the # + namespaceURI = qname.substr(0, hash); + + if ( (hash+1) < qname.length()) + { + // Check the next part is wsdl.interface( + int ending = hash+16; + string check = qname.substr(hash+1, 15); + if (check.compare("wsdl.interface(") == 0) + { + // Find the matching ) + int endBracket = qname.find(")",ending); + if (endBracket-1 > ending+1) + { + name = qname.substr(ending, endBracket-ending); + } + else + { + // Nothing between the () + name = ""; + } + } + else + { + // not the correct characters after the #, ignore the rest + name = ""; + } + + } + else + { + // Nothing after the hash + name = ""; + } + } + else + { + // No hash at all + namespaceURI = qname; + name = ""; + } + } + + + WSDLInterface::~WSDLInterface() + { + logentry(); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLInterface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLInterface.h new file mode 100644 index 0000000000..b071dd221e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLInterface.h @@ -0,0 +1,99 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_wsdlinterface_h +#define tuscany_sca_model_wsdlinterface_h + +#include <string> + +#include "tuscany/sca/model/Interface.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + /** + * Holds information about an interface described using a WSDL + * port type. + */ + class WSDLInterface : public Interface + { + + public: + /** + * Constuctor. + * @param interfaceName Name of the WSDL interface. + */ + WSDLInterface(const std::string& qname, bool remotable, bool conversational); + + /** + * Destructor. + */ + virtual ~WSDLInterface(); + + /** + * Returns the WSDL namespace + */ + std::string getNamespaceURI() const { return namespaceURI; } + + /** + * Returns the interface name + */ + std::string getName() const { return name; } + + /** + * return the QName of the schema type for this interface type + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.cpp") + */ + virtual const std::string& getInterfaceTypeQName() { return typeQName; }; + + /** + * The QName of the schema type for this interface type. + */ + SCA_API static const std::string typeQName; + + private: + + /** + * Parse the WSDL qname + */ + void parse(const std::string& qname); + + /** + * WSDL namespace. + */ + std::string namespaceURI; + + /** + * Name of the WSDL interface. + */ + std::string name; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_wsdlinterface_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLMessagePart.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLMessagePart.cpp new file mode 100644 index 0000000000..957d7ab3c1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLMessagePart.cpp @@ -0,0 +1,70 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <string> + +#include "tuscany/sca/model/WSDLMessagePart.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + + // Default Constructor + WSDLMessagePart::WSDLMessagePart() + { + logentry(); + } + + // Constructor + WSDLMessagePart::WSDLMessagePart(std::string partName, + std::string partType, + std::string partUri) : + partName_(partName), + partType_(partType), + partUri_(partUri) + { + logentry(); + } + + WSDLMessagePart::~WSDLMessagePart() + { + logentry(); + } + + + void WSDLMessagePart::setMessagePartType(const string& inputType) + { + logentry(); + Utils::tokeniseQName(inputType, partUri_, partName_); + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLMessagePart.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLMessagePart.h new file mode 100644 index 0000000000..2c381011ba --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLMessagePart.h @@ -0,0 +1,113 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_wsdlmessagepart_h +#define tuscany_sca_model_wsdlmessagepart_h + +#include <map> +#include <list> +#include <string> + +#include "tuscany/sca/export.h" + +namespace tuscany +{ + namespace sca + { + namespace model + { + + /** + * Represents a single WSDL defined message part. + */ + class WSDLMessagePart + { + public: + /** + * Default Constructor + */ + SCA_API WSDLMessagePart(); + + /** + * Constructor. + * @param partName The name of the message part. + * @param partType The type of this message part. + * @param partUri The namespace URI for the message part type. + */ + SCA_API WSDLMessagePart( std::string partName, + std::string partType, + std::string partUri ); + + /** + * Destructor. + */ + SCA_API ~WSDLMessagePart(); + + /** + * Return the name of the WSDL Message part + * @return The name of the WSDL Message part + */ + SCA_API const std::string& getPartName() const {return partName_;} + SCA_API void setPartName(const std::string& partName) {partName_ = partName;} + + /** + * The type of this WSDL Message part + * @return The type of this WSDL Message part + */ + SCA_API const std::string& getPartType() const {return partType_;} + SCA_API void setPartType(const std::string& partType) {partType_ = partType;} + + /** + * Set the WSDL message part type and namespace URI + * @return A prefixed namespace and type of the form prefix:type + */ + SCA_API void setMessagePartType(const std::string& partType); + + /** + * Return the namespace URI of the WSDL Message part + * @return The namespace URI of the WSDL Message part + */ + SCA_API const std::string& getPartUri() const {return partUri_;} + SCA_API void setPartUri(const std::string& partUri) {partUri_ = partUri;} + + private: + /** + * The name of this message part + */ + std::string partName_; + + /** + * The type of this message part + */ + std::string partType_; + + /** + * The namespace URI of the message part type + */ + std::string partUri_; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_wsdlmessagepart_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLOperation.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLOperation.cpp new file mode 100644 index 0000000000..a61d122a72 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLOperation.cpp @@ -0,0 +1,193 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <map> +#include <list> +#include <string> +#include <sstream> + +#include "tuscany/sca/model/WSDLOperation.h" +#include "tuscany/sca/model/WSDLMessagePart.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + + // Constructor + WSDLOperation::WSDLOperation() + { + logentry(); + } + + WSDLOperation::~WSDLOperation() + { + logentry(); + } + + + void WSDLOperation::setInputMessageType(const string& inputType) + { + logentry(); + Utils::tokeniseQName(inputType, inputMessageUri, inputMessageName); + } + + void WSDLOperation::setOutputMessageType(const string& outputType) + { + logentry(); + Utils::tokeniseQName(outputType, outputMessageUri, outputMessageName); + } + + void WSDLOperation::setInputMessage( commonj::sdo::DataObjectPtr inputMsg ) + { + logentry(); + + DataObjectList &partList = inputMsg->getList("part"); + for( unsigned int i=0; i < partList.size(); i++) + { + string partUri; + string partType; + string partName = partList[0]->getCString("name"); + + Utils::tokeniseQName(partList[0]->getCString("element"), partUri, partType); + WSDLMessagePart part(partName, partType, partUri); + + inputPartMap[partName] = part; + } + } + + void WSDLOperation::setOutputMessage( commonj::sdo::DataObjectPtr outputMsg ) + { + logentry(); + + DataObjectList &partList = outputMsg->getList("part"); + for( unsigned int i=0; i < partList.size(); i++) + { + string partUri; + string partType; + string partName = partList[0]->getCString("name"); + + Utils::tokeniseQName(partList[0]->getCString("element"), partUri, partType); + WSDLMessagePart part(partName, partType, partUri); + + outputPartMap[partName] = part; + } + } + + const std::list<std::string> WSDLOperation::getInputMessagePartNames() const + { + logentry(); + + std::list<std::string> inputPartNames; + + PART_MAP::const_iterator iter = inputPartMap.begin(); + PART_MAP::const_iterator iterEnd = inputPartMap.end(); + + for( ; iter != iterEnd; ++iter ) + { + inputPartNames.push_back( iter->first ); + } + + return inputPartNames; + } + + const std::list<std::string> WSDLOperation::getOutputMessagePartNames() const + { + logentry(); + + std::list<std::string> outputPartNames; + + PART_MAP::const_iterator iter = outputPartMap.begin(); + PART_MAP::const_iterator iterEnd = outputPartMap.end(); + + for( ; iter != iterEnd; ++iter ) + { + outputPartNames.push_back( iter->first ); + } + + return outputPartNames; + } + + const WSDLMessagePart& + WSDLOperation::getInputMessagePart( const std::string &name ) const + { + logentry(); + + PART_MAP::const_iterator iter = inputPartMap.find( name ); + if( iter == inputPartMap.end() ) + { + stringstream errMessage; + errMessage + << "Unable to find input WSDLMessagePart for partName: " << name; + + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + return iter->second; + } + + const WSDLMessagePart& + WSDLOperation::getOutputMessagePart( const std::string &name ) const + { + logentry(); + + PART_MAP::const_iterator iter = outputPartMap.find( name ); + if( iter == outputPartMap.end() ) + { + stringstream errMessage; + errMessage + << "Unable to find output WSDLMessagePart for partName: " << name; + + throwException(SystemConfigurationException, errMessage.str().c_str()); + } + + return iter->second; + } + + void WSDLOperation::setInputMessagePart( const std::string &partName, + WSDLMessagePart part ) + { + logentry(); + + inputPartMap[partName] = part; + } + + void WSDLOperation::setOutputMessagePart( const std::string &partName, + WSDLMessagePart part ) + { + logentry(); + + outputPartMap[partName] = part; + } + + } // End namespace model + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLOperation.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLOperation.h new file mode 100644 index 0000000000..48d848170a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/WSDLOperation.h @@ -0,0 +1,196 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_wsdloperation_h +#define tuscany_sca_model_wsdloperation_h + +#include <map> +#include <list> +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" +#include "tuscany/sca/model/WSDLMessagePart.h" + + +namespace tuscany +{ + namespace sca + { + namespace model + { + + /** + * Represents a single.,bound WSDL defined operation. + * This class includes information from the soapBinding + * in addition to the WSDL definition of the operation. + */ + class WSDLOperation + { + public: + /** + * Constructor. + */ + SCA_API WSDLOperation(); + + /** + * Destructor. + */ + SCA_API virtual ~WSDLOperation(); + + /** + * Return the name of the operation for use when serializing an + * outgoing message. + * @return The name of the element in the request message. + */ + SCA_API const std::string& getOperationName() const {return operationName;} + SCA_API void setOperationName(const std::string& opName) {operationName = opName;} + + /** + * The soap action string for this operation. + * @return The soap action. + */ + SCA_API const std::string& getSoapAction() const {return soapAction;} + SCA_API void setSoapAction(const std::string& soapAct) {soapAction = soapAct;} + + /** + * Return the endpoint address for the target web service. + * @return The endpoint address. + */ + SCA_API const std::string& getEndpoint() const {return endpoint;} + SCA_API void setEndpoint(const std::string& ep) {endpoint = ep;} + + enum soapVersion + { + SOAP11, + SOAP12 + }; + + SCA_API void setSoapVersion(soapVersion ver) {soapVer = ver;} + SCA_API soapVersion getSoapVersion() const {return soapVer;} + + SCA_API void setDocumentStyle(bool docStyle) {documentStyle = docStyle;} + SCA_API bool isDocumentStyle() const {return documentStyle;} + + SCA_API void setWrappedStyle(bool wrapStyle) {wrappedStyle = wrapStyle;} + SCA_API bool isWrappedStyle() const {return wrappedStyle;} + + SCA_API void setInputEncoded(bool enc) {inputEncoded = enc;} + SCA_API bool isInputEncoded() const {return inputEncoded;} + + SCA_API void setOutputEncoded(bool enc) {outputEncoded = enc;} + SCA_API bool isOutputEncoded() const {return outputEncoded;} + + /** + * Input Message URI and Name. To get the message part URI and name, you + * will have to get the WSDLMessagePart by calling getInputMessagePart() + */ + SCA_API void setInputMessageType(const std::string& inputMessageType); + SCA_API const std::string& getInputMessageUri() const {return inputMessageUri;} + SCA_API const std::string& getInputMessageName() const {return inputMessageName;} + + /** + * Output Message URI and Name. To get the message part URI and name, you + * will have to get the WSDLMessagePart by calling getOutputMessagePart() + */ + SCA_API void setOutputMessageType(const std::string& outputMessageType); + SCA_API const std::string& getOutputMessageUri() const {return outputMessageUri;} + SCA_API const std::string& getOutputMessageName() const {return outputMessageName;} + + // TODO We should add an enum for REQUEST_ONLY, RESPONSE_ONLY, REQUEST_RESPONSE + // and a setter/getter. The enum would be checked by getOutputXXX + + /** + * Parse a WSDL message represented by an SDO into the input/outputPartMap + * @param inputMsg a data object which contains the WSDL message + * ie. <wsdl:message name="getAccountReportResponse"> + * <wsdl:part element="tns:getAccountReportResponse" + * name="getAccountReportResponse" /> + * </wsdl:message> + */ + SCA_API void setInputMessage( commonj::sdo::DataObjectPtr inputMsg ); + SCA_API void setOutputMessage( commonj::sdo::DataObjectPtr outputMsg ); + + /** + * Manually set the input/outputPartMap, as opposed to passing in an SDO WSDL message. + * Populates the input/outputPartMap, setInput/OutputMessageType must still be called. + * @param partName the name of the message part + * @param part the message part + */ + SCA_API void setInputMessagePart( const std::string &partName, WSDLMessagePart part ); + SCA_API void setOutputMessagePart( const std::string &partName, WSDLMessagePart part ); + + /** + * Return a message part keyed off of the message part name + * @param name the message part name + * @return the message part in a WSDLMessagePart object + */ + SCA_API const WSDLMessagePart &getInputMessagePart( const std::string &name ) const; + SCA_API const WSDLMessagePart &getOutputMessagePart( const std::string &name ) const; + + /** + * Get all of the message part names + * @return a list of strings, each being a different message part name + */ + SCA_API const std::list<std::string> getInputMessagePartNames() const; + SCA_API const std::list<std::string> getOutputMessagePartNames() const; + + private: + /** + * The name of the operation for use when serializing an + * outgoing message. + */ + std::string operationName; + + /** + * The soap action string for this operation. + */ + std::string soapAction; + + /** + * The endpoint address of the target web service. + */ + std::string endpoint; + + bool documentStyle; + bool wrappedStyle; + bool inputEncoded; + bool outputEncoded; + soapVersion soapVer; + + std::string inputMessageUri; + std::string inputMessageName; + + std::string outputMessageUri; + std::string outputMessageName; + + typedef std::map<std::string, WSDLMessagePart> PART_MAP; + PART_MAP inputPartMap; + PART_MAP outputPartMap; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_wsdloperation_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Wire.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Wire.cpp new file mode 100644 index 0000000000..03f475af09 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Wire.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/Wire.h" + +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace model + { + + // Constructor + Wire::Wire(const std::string& source, const std::string& targ) + { + logentry(); + + Utils::tokeniseUri(source, sourceComponent, sourceReference); + target = targ; + } + + Wire::~Wire() + { + logentry(); + } + + } // End namespace model + + + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Wire.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Wire.h new file mode 100644 index 0000000000..ab136e9109 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/model/Wire.h @@ -0,0 +1,94 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_model_wire_h +#define tuscany_sca_model_wire_h + +#include <string> + +namespace tuscany +{ + namespace sca + { + namespace model + { + /** + * Information about a wire in the model. + */ + class Wire + { + public: + + /** + * Constructor. + * @param source The source of the wire. Either the component and + * reference name (optional) or an entry point. + * @param target The target of the wire. Either a component and service + * service name (optional) or an external sevice. + */ + SCA_API Wire(const std::string& source, const std::string& target); + + /** + * Destructor. + */ + SCA_API virtual ~Wire(); + + /** + * Get the component name defined by the source of the wire. + * @return The component name which is the source of the wire. + */ + SCA_API const std::string& getSourceComponent() const { return sourceComponent; } + + /** + * Get the reference name defined by the source of the wire. + * @return The reference name which is the source of the wire. + */ + SCA_API const std::string& getSourceReference() const { return sourceReference; } + + /** + * Get the target uri defined by the target of the wire. + * @return The target uri which is the source of the wire. + */ + SCA_API const std::string& getTarget() { return target; } + + private: + /** + * The source component of the wire. + */ + std::string sourceComponent; + + /** + * The source reference of the wire. + */ + std::string sourceReference; + + /** + * The target uri of the wire. + */ + std::string target; + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_model_wire_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/DefaultLogWriter.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/DefaultLogWriter.cpp new file mode 100644 index 0000000000..48cc0aa1e6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/DefaultLogWriter.cpp @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> + +#include "tuscany/sca/util/DefaultLogWriter.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace util + { + DefaultLogWriter::~DefaultLogWriter() + { + } + + void DefaultLogWriter::log(int level, const char* tid, const char* msg) + { + cout << tid << " "; + for (int i=0; i < level; i++) + { + cout << " "; + } + cout << msg <<endl; + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/DefaultLogWriter.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/DefaultLogWriter.h new file mode 100644 index 0000000000..80e07d696c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/DefaultLogWriter.h @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_defaultlogwriter_h +#define tuscany_sca_util_defaultlogwriter_h + +#include "tuscany/sca/util/LogWriter.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Log writer to write out to standard out. + */ + class DefaultLogWriter : public LogWriter + { + public: + virtual ~DefaultLogWriter(); + + /** + * Will write to the console. + * See LogWriter#log. + */ + virtual void log(int level, const char* tid, const char* msg); + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany +#endif // tuscany_sca_util_defaultlogwriter_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/File.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/File.cpp new file mode 100644 index 0000000000..507c1b38ea --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/File.cpp @@ -0,0 +1,243 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include <iostream> +#include <string> + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <unistd.h> +#include <sys/stat.h> +#include <dirent.h> +#endif + +#include "tuscany/sca/util/File.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Logging.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace util + { + File::File(const string& dir, const string& file, bool isDirectory) + : directory(dir), fileName(file), isDir(isDirectory) + { + } + File::~File() + { + } + + + Files::Files(const string& rootDir, const string& pattern, bool subdirectories, bool directories) + : rootDirectory(rootDir) + { + findFiles(rootDirectory, pattern, subdirectories, directories); + } + + Files::~Files() + { + } + + unsigned int Files::size() + { + return files.size(); + } + + const File& Files::operator[] (unsigned int index) + { + if (size() <= index) + { + throwException(SystemConfigurationException, "Index of of bounds"); + } + + FILES::iterator iter = files.begin(); + for (unsigned int i=0; i<index; i++) + { + iter++; + } + + return *iter; + } + + + void Files::findFiles(const string& rootDir, const string& pattern, bool subdirectories, bool directories) + { + +#if defined(WIN32) || defined (_WINDOWS) + char currentDir[ _MAX_FNAME]; + + GetCurrentDirectory(_MAX_FNAME, currentDir); + + // Set current directory, from which to search. + if (!SetCurrentDirectory(rootDir.c_str())) + { + loginfo("Unable to set current directory to: %s", rootDir.c_str()); + return; + } + char fullDirname[ _MAX_FNAME]; + GetCurrentDirectory(_MAX_FNAME, fullDirname); + + // First, look for all files in this directory that meet the pattern + char search[ _MAX_FNAME]; + strcpy(search, pattern.c_str()); + + // Find the first file in the directory + WIN32_FIND_DATA data; + HANDLE searchHandle = FindFirstFile(search, &data); + + int more = TRUE; + if (searchHandle != INVALID_HANDLE_VALUE) + { + // Found some matching files, so call the function with the details of each one + while (more) + { + // Skip over directories + if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) + { + if (!directories) + { + // Add the file to our list + files.push_back(File(fullDirname, data.cFileName)); + } + } + else if (directories) + { + files.push_back(File(fullDirname, data.cFileName, true)); + } + + more = FindNextFile(searchHandle, &data); + } + } + + + if (!subdirectories) + return; + + // Now recurse down all the directories + // Find the first file in the directory + searchHandle = FindFirstFile( "*.*", &data); + more = TRUE; + + if (searchHandle != INVALID_HANDLE_VALUE) + { + // Found some files in the directory. + while (more) + { + // If directory + if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + // Skip over '.' and '..' + if ((strcmp(data.cFileName, ".")) && (strcmp("..", data.cFileName))) + { + // Recurse + findFiles(data.cFileName, pattern, subdirectories, directories); + } + } + + more = FindNextFile(searchHandle, &data); + } + } + SetCurrentDirectory(currentDir); +#else + // Linux + //char fullDirname[MAX_PATH]; + //getcwd(fullDirname, MAX_PATH); + + DIR* root = opendir(rootDir.c_str()); + if (!root) + { + logwarning("Unable to open directory: %s", rootDir.c_str()); + return; + } + + bool exactMatch = true; + string token1, token2; + if (pattern.find('*') != string::npos) + { + exactMatch = false; + Utils::tokeniseString("*", pattern, token1, token2); + } + + struct dirent *entry=0; + while ((entry = readdir(root))) + { + string entryName = rootDir + "/" + entry->d_name; + struct stat statbuf; + if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) + continue; + if (stat(entryName.c_str(), &statbuf) != 0) + { + logwarning("Unable to stat entry: %s", entryName.c_str()); + } + else + { + string filename = entry->d_name; + + if ((exactMatch && filename == pattern) || + (!exactMatch && + ((filename.find(token1) == 0) + && (filename.length() >= token2.length()) + && (filename.rfind(token2) == (filename.length() - token2.length())) ))) + { + if (S_ISDIR(statbuf.st_mode)) + { + if (directories) + { + files.push_back(File(rootDir, filename, true)); + } + } + else if (S_ISREG(statbuf.st_mode)) + { + if (!directories) + { + // Add the file to our list + files.push_back(File(rootDir, filename)); + } + } + } // end - matching filename + + // recurse if necessary + if (subdirectories && S_ISDIR(statbuf.st_mode)) + { + findFiles(entryName, pattern, subdirectories, directories); + } + } + } + + closedir(root); +#endif + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/File.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/File.h new file mode 100644 index 0000000000..944a192cf6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/File.h @@ -0,0 +1,160 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_file_h +#define tuscany_sca_util_file_h + +#include <string> +#include <vector> + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * File access methods. Provides platform independent + * access to files. + */ + class File + { + public: + /** + * Constructor. + * @param directory Name of the directory in which this file is located. + * Either / or \ can be used interchangeably for separating directory elements. + * @param fileName Name of the file in the dirctory. + */ + File(const std::string& directory, const std::string& fileName, bool isDirectory = false); + + /** + * Destructor. + */ + virtual ~File(); + + /** + * Return the directory in which this file is located. + * @return Name of the parent directory. + */ + const std::string& getDirectory() const {return directory;} + + /** + * Return the name of the file. + * @return Name of the file/directory. + */ + const std::string& getFileName() const {return fileName;} + + /** + * Return if this is a directory + * @return true if a directory + */ + bool isDirectory() const {return isDir;} + + /** + * Return if this is a file + * @return true if a file + */ + bool isFile() const {return !isDir;} + + private: + /** + * Name of the parent directory. + */ + std::string directory; + + /** + * Name of the file/directory + */ + std::string fileName; + + /** + * Is this a directory + */ + bool isDir; + }; + + /** + * Collection of File to provide platform independent access + * to files and directories. + */ + class Files + { + public: + /** + * Constructor which will search a given directory with a pattern and return a + * new instance of this collection class. + * @param rootDirectory The directory in which to search. + * @param pattern A pattern for matching file names. Can include * and ?. + * @param subdirectories Whether subdirectories should be searched too. + * @param directories Whether to directories or files. + */ + Files(const std::string& rootDirectory, + const std::string& pattern, + bool subdirectories = false, + bool directories = false); + + /** + * Destructor. + */ + virtual ~Files(); + + /** + * Return the number of files found. + * @return The number of files found. + */ + unsigned int size(); + + /** + * Return a File at this position in the collection. + * @param index The index into the collection. + * @return The File at this index in the collection. + */ + const File& operator[] (unsigned int index); + + private: + /** + * Search the given directory and pattern for matching files. + * @param rootDirectory The directory in which to search. + * @param pattern A pattern for matching file names. Can include * and ?. + * @param subdirectories Whether subdirectories should be searched too. + * @param directories Whether to directories or files. + */ + void findFiles(const std::string& rootDirectory, const std::string& pattern, + bool subdirectories, bool directories); + + /** + * The top level directory to search. + */ + std::string rootDirectory; + + typedef std::vector<File> FILES; + + /** + * Vector of File. + */ + FILES files; + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany +#endif // tuscany_sca_util_file_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/FileLogWriter.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/FileLogWriter.cpp new file mode 100644 index 0000000000..56eb3146dd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/FileLogWriter.cpp @@ -0,0 +1,57 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> + +#include "tuscany/sca/util/FileLogWriter.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace util + { + FileLogWriter::FileLogWriter(const char* logfile) + { + logFile.open(logfile, ios_base::app); + } + + FileLogWriter::~FileLogWriter() + { + logFile.close(); + } + + void FileLogWriter::log(int level, const char*tid, const char* msg) + { + logFile << tid << " "; + for (int i=0; i < level; i++) + { + logFile << " "; + } + logFile << msg <<endl; + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/FileLogWriter.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/FileLogWriter.h new file mode 100644 index 0000000000..5925fdca85 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/FileLogWriter.h @@ -0,0 +1,58 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_filelogwriter_h +#define tuscany_sca_util_filelogwriter_h + +#include <iostream> +#include <fstream> + +#include "tuscany/sca/util/LogWriter.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Log writer to write out to standard out. + */ + class FileLogWriter : public LogWriter + { + public: + FileLogWriter(const char* logfile); + + virtual ~FileLogWriter(); + + /** + * Will write to the console. + * See LogWriter#log. + */ + virtual void log(int level, const char* tid, const char* msg); + private: + std::ofstream logFile; + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany +#endif // tuscany_sca_util_defaultlogwriter_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Library.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Library.cpp new file mode 100644 index 0000000000..619205ab7e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Library.cpp @@ -0,0 +1,175 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <sstream> + +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Logging.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace util + { + Library::Library() + : hDLL(NULL) + { + } + + Library::Library(const string& libraryName) + : name(libraryName), hDLL(NULL) + { + logentry(); + load(); + } + + Library::Library(const Library& lib) + : name(lib.name), hDLL(NULL) + { + logentry(); + if (lib.hDLL) + { + load(); + } + } + + Library& Library::operator=(const Library& lib) + { + logentry(); + if (&lib != this) + { + unload(); + name = lib.name; + load(); + } + return *this; + } + + Library::~Library() + { + logentry(); + unload(); + } + + + void Library::load() + { + logentry(); + loginfo("Library: %s", name.c_str()); + + string msg; +#if defined(WIN32) || defined (_WINDOWS) + int l = name.length(); + string dllName; + if (l>=4 && name.substr(l-4, 4)==".dll") + { + dllName = name; + } + else + { + dllName = name+".dll"; + } + SetErrorMode(SEM_FAILCRITICALERRORS); + hDLL = LoadLibrary(dllName.c_str()); + if (hDLL == NULL) + { + ostringstream msgs; + msgs << "Unable to load library: " + dllName << ", error: "; + Utils::printLastError(msgs); + msg = msgs.str(); + } +#else + int l = name.length(); + string libName; +#ifdef IS_DARWIN + string suffix = ".dylib"; +#else + string suffix = ".so"; +#endif + unsigned int suffixLength = suffix.length(); + if (l>=suffixLength && name.substr(l-suffixLength, suffixLength)==suffix) + { + libName = name; + } + else + { + int s = name.rfind("/"); + if (s == name.length()) + { + libName = name + suffix; + } + else + { + s++; + libName = name.substr(0, s) + "lib" + name.substr(s, name.length()-s) + suffix; + } + } + hDLL = dlopen(libName.c_str(), RTLD_NOW); + if (hDLL == NULL) + { + msg = "Unable to load library: " + libName + ": " + dlerror(); + } +#endif + if (hDLL == NULL) + { + throwException(SystemConfigurationException, msg.c_str()); + } + } + + void Library::unload() + { + logentry(); + loginfo("Library: %s", name.c_str()); + + if (hDLL != NULL) + { +#if defined(WIN32) || defined (_WINDOWS) + FreeLibrary(hDLL); +#else + dlclose(hDLL); +#endif + hDLL = NULL; + } + } + + void* Library::getSymbol(const string& symbol) + { + logentry(); + loginfo("Symbol: %s", symbol.c_str()); + if (!hDLL) + { + return 0; + } +#if defined(WIN32) || defined (_WINDOWS) + return GetProcAddress(hDLL, symbol.c_str()); +#else + return dlsym(hDLL, symbol.c_str()); +#endif + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Library.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Library.h new file mode 100644 index 0000000000..6b0a17d2b7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Library.h @@ -0,0 +1,103 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_library_h +#define tuscany_sca_util_library_h + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <unistd.h> +#include <dlfcn.h> +#endif + +#include <string> + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Information about shared libraries and methods to + * access these shared libraries. + */ + class SCA_API Library + { + public: + Library(); + + /** + * Constructor. Will load the library. + * @param libraryName Fully qualified name of the library. + */ + Library(const std::string& libraryName); + + /** + * Destructor. Will unload the library. + */ + virtual ~Library(); + + Library(const Library& lib); + Library& operator=(const Library& lib); + + /** + * Find an externalized symbol in the library. + * @param symbol The name of the symbol to be found. + * @return The pointer to the symbol if found, otherwise 0. + */ + void* getSymbol(const std::string& symbol); + private: + /** + * Name of the library. + */ + std::string name; + + /** + * Handle to the loaded library. + */ +#if defined(WIN32) || defined (_WINDOWS) + HINSTANCE hDLL; +#else + void* hDLL; +#endif + + /** + * Load the library. + */ + void load(); + + /** + * Unload the library, if successfully loaded. + */ + void unload(); + + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_util_library_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/LogWriter.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/LogWriter.cpp new file mode 100644 index 0000000000..e551d04eda --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/LogWriter.cpp @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/LogWriter.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + LogWriter::~LogWriter() + { + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/LogWriter.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/LogWriter.h new file mode 100644 index 0000000000..5a6a5c38f7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/LogWriter.h @@ -0,0 +1,53 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_logwriter_h +#define tuscany_sca_util_logwriter_h + +#include "tuscany/sca/export.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Abstract class for extending logging to other destinations. + */ + class SCA_API LogWriter + { + public: + virtual ~LogWriter(); + + /** + * Log a message. + * @param level The level of logging for this message. + * @param tid The current thread id. + * @param msg The message to log. + */ + virtual void log(int level, const char* tid, const char* msg) = 0; + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany +#endif // tuscany_sca_util_logwriter_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logger.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logger.cpp new file mode 100644 index 0000000000..5745982f42 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logger.cpp @@ -0,0 +1,276 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> +#include <stdarg.h> + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#include <process.h> +#else +#include <unistd.h> +#include <pthread.h> +#endif + +#include "tuscany/sca/util/Logger.h" +#include "tuscany/sca/util/DefaultLogWriter.h" +#include "tuscany/sca/util/FileLogWriter.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace util + { + LogWriter* Logger::logWriter = getLogWriter(); + + LogWriter* Logger::getLogWriter() + { + if (logWriter == 0) + { + setLogWriter(0); + + } + return logWriter; + } + + void Logger::setLogWriter(LogWriter* writer) + { + if (logWriter != writer + && logWriter != 0) + { + delete logWriter; + } + + if (writer == 0) + { + char* loggingVar = 0; + loggingVar = getenv("TUSCANY_SCACPP_LOG"); + if (loggingVar == 0) + logWriter = new DefaultLogWriter; + else + logWriter = new FileLogWriter(loggingVar); + } + else + { + logWriter = writer; + } + } + + int Logger::loggingLevel = setLogging(); + + int Logger::setLogging() + { + char* loggingVar = 0; + loggingVar = getenv("TUSCANY_SCACPP_LOGGING"); + if (loggingVar == 0) + return 0; + else + return atoi(loggingVar); + } + + void Logger::setLogging(int level) + { + loggingLevel = level; + } + + void Logger::log(int level, const char* msg) + { + if (level <= loggingLevel) + { + char tid[21]; + formatThreadID(tid); + logWriter->log(level, tid, msg); + } + } + + void Logger::formatThreadID(char* tid) + { +#if defined(WIN32) || defined (_WINDOWS) + sprintf(tid, "%lu:%lu", (unsigned long)_getpid(), (unsigned long)GetCurrentThreadId()); +#else + sprintf(tid, "%lu:%lu", (unsigned long)getpid(), (unsigned long)pthread_self()); +#endif + } + + void Logger::logArgs(int level, const char* msg, ...) + { + if (level <= loggingLevel) + { + va_list variableArguments; + va_start(variableArguments, msg); + char tid[21]; + formatThreadID(tid); + char messageBuffer[256]; +#if defined(WIN32) || defined (_WINDOWS) + int size = _vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size == -1) + { + size = _vscprintf(msg, variableArguments); + char* bigMessageBuffer = new char[size+1]; + _vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(level, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#else + int size = vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size > 255) + { + char* bigMessageBuffer = new char[size+1]; + vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(level, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#endif + else + { + messageBuffer[255] = '\0'; + logWriter->log(level, tid, messageBuffer); + } + va_end(variableArguments); + } + } + + void Logger::logArgs0(const char* msg, ...) + { + if (0 <= loggingLevel) + { + va_list variableArguments; + va_start(variableArguments, msg); + char tid[21]; + formatThreadID(tid); + char messageBuffer[256]; +#if defined(WIN32) || defined (_WINDOWS) + int size = _vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size == -1) + { + size = _vscprintf(msg, variableArguments); + char* bigMessageBuffer = new char[size+1]; + _vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(0, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#else + int size = vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size > 255) + { + char* bigMessageBuffer = new char[size+1]; + vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(0, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#endif + else + { + messageBuffer[255] = '\0'; + logWriter->log(0, tid, messageBuffer); + } + va_end(variableArguments); + } + } + void Logger::logArgs1(const char* msg, ...) + { + if (1 <= loggingLevel) + { + va_list variableArguments; + va_start(variableArguments, msg); + char tid[21]; + formatThreadID(tid); + char messageBuffer[256]; +#if defined(WIN32) || defined (_WINDOWS) + int size = _vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size == -1) + { + size = _vscprintf(msg, variableArguments); + char* bigMessageBuffer = new char[size+1]; + _vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(1, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#else + int size = vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size > 255) + { + char* bigMessageBuffer = new char[size+1]; + vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(1, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#endif + else + { + messageBuffer[255] = '\0'; + logWriter->log(1, tid, messageBuffer); + } + va_end(variableArguments); + } + } + void Logger::logArgs2(const char* msg, ...) + { + if (2 <= loggingLevel) + { + va_list variableArguments; + va_start(variableArguments, msg); + char tid[21]; + formatThreadID(tid); + char messageBuffer[256]; +#if defined(WIN32) || defined (_WINDOWS) + int size = _vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size == -1) + { + size = _vscprintf(msg, variableArguments); + char* bigMessageBuffer = new char[size+1]; + _vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(2, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#else + int size = vsnprintf(messageBuffer, 255, msg, variableArguments); + if (size > 255) + { + char* bigMessageBuffer = new char[size+1]; + vsnprintf(bigMessageBuffer, size, msg, variableArguments); + bigMessageBuffer[size] = '\0'; + logWriter->log(2, tid, bigMessageBuffer); + delete bigMessageBuffer; + } +#endif + else + { + messageBuffer[255] = '\0'; + logWriter->log(2, tid, messageBuffer); + } + va_end(variableArguments); + } + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logger.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logger.h new file mode 100644 index 0000000000..eccf3cf02f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logger.h @@ -0,0 +1,136 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_logger_h +#define tuscany_sca_util_logger_h + +#include "tuscany/sca/export.h" +#include "tuscany/sca/util/LogWriter.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Provide a logging interface. + */ + class Logger { + + public: + /** + * Set the log writer to use. + * @param writer The writer to use for all subsequent logging. + */ + SCA_API static void setLogWriter(LogWriter* writer); + + /** + * Set or reset the logging level. Any message with a higher logging + * level than this value will be filtered (i.e. not shown). + * @param level The level of logging to use for all subsequent logging. + */ + SCA_API static void setLogging(int level); + + /** + * Log a message. + * @param level The log level of this message. + * @param msg The message to be logged. + */ + SCA_API static void log(int level, const char* msg); + + /** + * Log a message with variable arguments. + * @param level The log level of this message. + * @param msg The message to be logged. Must include template + * characters as described in printf. + * @param ... Variable arguments. + */ + SCA_API static void logArgs(int level, const char* msg, ...); + SCA_API static void logArgs0(const char* msg, ...); + SCA_API static void logArgs1(const char* msg, ...); + SCA_API static void logArgs2(const char* msg, ...); + + /** + * The currently set logging level + */ + SCA_API static int loggingLevel; + + private: + /** + * The current log writer. + */ + static LogWriter* logWriter; + + /** + * Get the current log writer. + * @return The current log writer. + */ + static LogWriter* getLogWriter(); + + /** + * Retrieves the logging level set as an environment variable. + */ + static int setLogging(); + + /** + * Print the current thread id into the given char buffer. + */ + static void formatThreadID(char* tid); + + /** + * Message buffer + */ + static char messageBuffer[4096]; + + }; + + class LogEntry + { + public: + + LogEntry(const char* func) + : funcName(func) + { + if (Logger::loggingLevel >= 2) + { + Logger::logArgs(2, ">> %s", funcName); + } + } + + ~LogEntry() + { + if (Logger::loggingLevel >= 2) + { + Logger::logArgs(2, "<< %s", funcName); + } + } + + private: + const char *funcName; + + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_util_logger_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logging.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logging.h new file mode 100644 index 0000000000..bf1419faa8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Logging.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_logging_h +#define tuscany_sca_util_logging_h + +#include "tuscany/sca/util/Logger.h" + +#if defined(WIN32) || defined (_WINDOWS) +#define logentry() \ +const tuscany::sca::util::LogEntry __LOGENTRY__(__FUNCTION__) +#else +#define logentry() \ +const tuscany::sca::util::LogEntry __LOGENTRY__(__PRETTY_FUNCTION__) +#endif + +#define loginfo \ +if (tuscany::sca::util::Logger::loggingLevel >= 2) tuscany::sca::util::Logger::logArgs2 + +#define logwarning \ +if (tuscany::sca::util::Logger::loggingLevel >= 1) tuscany::sca::util::Logger::logArgs1 + +#define logerror \ +if (tuscany::sca::util::Logger::loggingLevel >= 0) tuscany::sca::util::Logger::logArgs0 + +#endif // tuscany_sca_util_logging_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Mutex.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Mutex.cpp new file mode 100644 index 0000000000..7b62000717 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Mutex.cpp @@ -0,0 +1,103 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <errno.h> + +#include <sstream> + +#include "tuscany/sca/util/Mutex.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; + + +namespace tuscany +{ + namespace sca + { + namespace util + { + Mutex::Mutex() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + InitializeCriticalSection(§ion); +#else + int rc = pthread_mutex_init(&mutex, NULL); + if (rc) + { + ostringstream msg; + msg << "Failed to create mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + Mutex::~Mutex() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + DeleteCriticalSection(§ion); +#else + int rc = pthread_mutex_destroy(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to destroy mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + void Mutex::lock() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + EnterCriticalSection(§ion); +#else + int rc = pthread_mutex_lock(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to lock mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + void Mutex::unlock() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + LeaveCriticalSection(§ion); +#else + int rc = pthread_mutex_unlock(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to unlock mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Mutex.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Mutex.h new file mode 100644 index 0000000000..d509ba6d73 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Mutex.h @@ -0,0 +1,84 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_mutex_h +#define tuscany_sca_util_mutex_h + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <pthread.h> +#endif + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Information about shared libraries and methods to + * access these shared libraries. + */ + class SCA_API Mutex + { + public: + /** + * Constructor. + */ + Mutex(); + + /** + * Destructor. + */ + virtual ~Mutex(); + + /** + * Lock the mutex. + */ + void lock(); + + /** + * Unlock the mutex. + */ + void unlock(); + + private: + + /** + * Handle to the mutex. + */ +#if defined(WIN32) || defined (_WINDOWS) + CRITICAL_SECTION section; +#else + pthread_mutex_t mutex; +#endif + + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_util_mutex_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Queue.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Queue.cpp new file mode 100644 index 0000000000..c124be572c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Queue.cpp @@ -0,0 +1,222 @@ +/* + * 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. + */ + +/* $Rev: 491752 $ $Date: 2007-01-01 22:22:23 -0800 (Mon, 01 Jan 2007) $ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#pragma warning(disable: 4251) +#endif + +#include <errno.h> + +#include <sstream> + +#include "tuscany/sca/util/Queue.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; + + +namespace tuscany +{ + namespace sca + { + namespace util + { + Queue::Queue() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + InitializeCriticalSection(§ion); + hevent = CreateEvent (NULL, TRUE, FALSE, NULL); +#else + int rc = pthread_mutex_init(&mutex, NULL); + if (rc) + { + ostringstream msg; + msg << "Failed to create mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + + rc = pthread_cond_init(&cond, NULL); + if (rc) + { + ostringstream msg; + msg << "Failed to create condition variable, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + Queue::~Queue() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + DeleteCriticalSection(§ion); + CloseHandle(hevent); +#else + int rc = pthread_mutex_destroy(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to destroy mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + + rc = pthread_cond_destroy(&cond); + if (rc) { + ostringstream msg; + msg << "Failed to destroy condition variable, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + void Queue::enqueue(void* element) + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + EnterCriticalSection(§ion); + + try + { + queue.push(element); + + if (queue.size() == 1) + { + SetEvent(hevent); + } + } + catch (...) + { + LeaveCriticalSection(§ion); + throw; + } + LeaveCriticalSection(§ion); +#else + int rc = pthread_mutex_lock(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to lock mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + try + { + queue.push(element); + + if (queue.size() == 1) + { + rc = pthread_cond_signal(&cond); + if (rc) { + ostringstream msg; + msg << "Failed to broadcast condition variable, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + } + + } + catch(...) + { + pthread_mutex_unlock(&mutex); + throw; + } + rc = pthread_mutex_unlock(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to unlock mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + void* Queue::dequeue() + { + logentry(); + + void* element = NULL; + +#if defined(WIN32) || defined (_WINDOWS) + + EnterCriticalSection(§ion); + try + { + while (queue.size() == 0) { + LeaveCriticalSection(§ion); + WaitForSingleObject(hevent, INFINITE); + EnterCriticalSection(§ion); + } + + element = queue.front(); + queue.pop(); + + if (queue.size() == 0) + { + ResetEvent(hevent); + } + } + catch(...) + { + LeaveCriticalSection(§ion); + throw; + } + LeaveCriticalSection(§ion); + +#else + int rc = pthread_mutex_lock(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to lock mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + try + { + while (queue.size() == 0) { + rc = pthread_cond_wait(&cond, &mutex); + if (rc) { + ostringstream msg; + msg << "Failed to wait for condition variable, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + } + + element = queue.front(); + queue.pop(); + } + catch(...) + { + pthread_mutex_unlock(&mutex); + throw; + } + rc = pthread_mutex_unlock(&mutex); + if (rc) { + ostringstream msg; + msg << "Failed to unlock mutex, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } + +#endif + + return element; + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Queue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Queue.h new file mode 100644 index 0000000000..e2ff104631 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Queue.h @@ -0,0 +1,93 @@ +/* + * 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. + */ + +/* $Rev: 492011 $ $Date: 2007-01-02 18:15:11 -0800 (Tue, 02 Jan 2007) $ */ + +#ifndef tuscany_sca_util_queue_h +#define tuscany_sca_util_queue_h + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <pthread.h> +#endif + +#include <queue> + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * A thread safe FIFO queue. + */ + class SCA_API Queue + { + public: + /** + * Constructor. + */ + Queue(); + + /** + * Destructor. + */ + virtual ~Queue(); + + /** + * Dequeue an element + */ + void* dequeue(); + + /** + * Enqueue an element + */ + void enqueue(void* element); + + private: + + /** + * The STL queue used to hold elements. + */ + std::queue<void*> queue; + + /** + * Handles to the mutex and condition variable + * used to synchronize access to the queue. + */ +#if defined(WIN32) || defined (_WINDOWS) + CRITICAL_SECTION section; + HANDLE hevent; +#else + pthread_mutex_t mutex; + pthread_cond_t cond; +#endif + + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_util_queue_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/SDOUtils.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/SDOUtils.cpp new file mode 100644 index 0000000000..513409db6a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/SDOUtils.cpp @@ -0,0 +1,438 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "tuscany/sca/util/SDOUtils.h" + +using namespace std; +using namespace commonj::sdo; + +namespace tuscany +{ + namespace sca + { + namespace util + { + + /** + * Constructor + */ + SDOVisitor::SDOVisitor() + { + } + + /** + * Destructor + */ + SDOVisitor::~SDOVisitor() + { + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, bool boolData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, char byteData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, const char* bytesData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, wchar_t charData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, const SDODate& dateData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, long double doubleData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, float floatData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, long intData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, short shortData) + { + return SDOVisitor::RESULT_NOT_SUPPORTED; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, const string& stringData) + { + return SDOVisitor::RESULT_CONTINUE; + } + + SDOVisitor::RESULT SDOVisitor::visit(DataObjectPtr parent, const Property& property, DataObjectPtr dataObjectData) + { + return SDOVisitor::RESULT_CONTINUE; + } + + const char* SDOUtils::sdoURI = "commonj.sdo"; + + SDOVisitor::RESULT SDOUtils::accept(DataObjectPtr dataObject, SDOVisitor& visitor, SDOVisitor::DEPTH depth) + { + SDOVisitor::RESULT result = SDOVisitor::RESULT_CONTINUE; + + const Type& type = dataObject->getType(); + if (type.isSequencedType()) + { + SequencePtr sequence = dataObject->getSequence(); + int size = sequence->size(); + for (int i = 0; i < size; i++) + { + if (sequence->isText(i)) + { + const string text(sequence->getCStringValue(i)); + result = visitor.visit(dataObject, *(Property*)NULL, (const string&)text); + } + else + { + const Property& seqProperty = sequence->getProperty(i); + const Type& seqType = seqProperty.getType(); + if (seqType.isDataObjectType()) + { + DataObjectPtr dob; + if (seqProperty.isMany()) + { + int index = sequence->getListIndex(i); + dob = dataObject->getList(seqProperty)[index]; + } + else + { + dob = dataObject->getDataObject(seqProperty); + } + + if (dob) + { + result = visitor.visit(dataObject, seqProperty, (DataObjectPtr)dob); + } + } + else + { + Type::Types t = seqProperty.getTypeEnum(); + switch (t) + { + case Type::BooleanType: + { + result = visitor.visit(dataObject, seqProperty, (bool)sequence->getBooleanValue(i)); + } + break; + case Type::ByteType: + { + result = visitor.visit(dataObject, seqProperty, (char)sequence->getByteValue(i)); + } + break; + case Type::CharacterType: + { + result = visitor.visit(dataObject, seqProperty, (wchar_t)sequence->getCharacterValue(i)); + } + break; + case Type::IntType: + { + result = visitor.visit(dataObject, seqProperty, (long)sequence->getIntValue(i)); + } + break; + case Type::ShortType: + { + result = visitor.visit(dataObject, seqProperty, (short)sequence->getShortValue(i)); + } + break; + case Type::DoubleType: + { + result = visitor.visit(dataObject, seqProperty, (long double)sequence->getDoubleValue(i)); + } + break; + case Type::FloatType: + { + result = visitor.visit(dataObject, seqProperty, (float)sequence->getFloatValue(i)); + } + break; + case Type::LongType: + { + result = visitor.visit(dataObject, seqProperty, (long)sequence->getLongValue(i)); + } + break; + case Type::DateType: + { + const SDODate date = sequence->getDateValue(i); + result = visitor.visit(dataObject, seqProperty, (long)(const time_t)date.getTime()); + } + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + ; + const string stringData(sequence->getCStringValue(i)); + result = visitor.visit(dataObject, seqProperty, (const string&)stringData); + } + break; + case Type::BytesType: + { + unsigned int len = sequence->getLength(i); + char* byteData = new char[len]; + sequence->getBytesValue(i, byteData, len); + result = visitor.visit(dataObject, seqProperty, byteData); + delete byteData; + } + break; + default: + result = SDOVisitor::RESULT_NOT_SUPPORTED; + break; + } + if (result == SDOVisitor::RESULT_NOT_SUPPORTED) + { + ; + const string stringData(sequence->getCStringValue(i)); + result = visitor.visit(dataObject, seqProperty, (const string&)stringData); + } + } + } + if (result == SDOVisitor::RESULT_STOP) + return result; + } + } + else + { + PropertyList pl = dataObject->getInstanceProperties(); + for (unsigned int i = 0; i < pl.size(); i++) + { + if (dataObject->isSet(pl[i])) + { + if (pl[i].getType().isDataObjectType()) + { + if (pl[i].isMany()) + { + DataObjectList& doList = dataObject->getList(pl[i]); + for (unsigned int li = 0; li < doList.size(); li++) + { + DataObjectPtr dob = doList[li]; + result = visitor.visit(dataObject, pl[i], (DataObjectPtr)dob); + if (result == SDOVisitor::RESULT_STOP) + return result; + } + } + else + { + DataObjectPtr dob = dataObject->getDataObject(pl[i]); + result = visitor.visit(dataObject, pl[i], (DataObjectPtr)dob); + } + } + else + { + if (pl[i].isMany()) + { + Type::Types t = pl[i].getTypeEnum(); + DataObjectList& doList = dataObject->getList(pl[i]); + for (unsigned int li = 0; li < doList.size(); li++) + { + switch (t) + { + case Type::BooleanType: + { + result = visitor.visit(dataObject, pl[i], (bool)doList.getBoolean(li)); + } + break; + case Type::ByteType: + { + result = visitor.visit(dataObject, pl[i], (char)doList.getByte(li)); + } + break; + case Type::CharacterType: + { + result = visitor.visit(dataObject, pl[i], (wchar_t)doList.getCharacter(li)); + } + break; + case Type::IntType: + { + result = visitor.visit(dataObject, pl[i], (long)doList.getInt(li)); + } + break; + case Type::ShortType: + { + result = visitor.visit(dataObject, pl[i], (short)doList.getShort(li)); + } + break; + case Type::DoubleType: + { + result = visitor.visit(dataObject, pl[i], (long double)doList.getDouble(li)); + } + break; + case Type::FloatType: + { + result = visitor.visit(dataObject, pl[i], (float)doList.getFloat(li)); + } + break; + case Type::LongType: + { + result = visitor.visit(dataObject, pl[i], (long)doList.getLong(li)); + } + break; + case Type::DateType: + { + const SDODate date = doList.getDate(li); + result = visitor.visit(dataObject, pl[i], (long)(const time_t)date.getTime()); + } + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + const string stringData(doList.getCString(li)); + result = visitor.visit(dataObject, pl[i], (const string&)stringData); + } + break; + case Type::BytesType: + { + unsigned int len = doList.getLength(li); + char* byteData = new char[len]; + doList.getBytes(li, byteData, len); + result = visitor.visit(dataObject, pl[i], byteData); + delete byteData; + } + break; + default: + result = SDOVisitor::RESULT_NOT_SUPPORTED; + break; + } + if (result == SDOVisitor::RESULT_NOT_SUPPORTED) + { + const string stringData(doList.getCString(li)); + result = visitor.visit(dataObject, pl[i], (const string&)stringData); + } + if (result == SDOVisitor::RESULT_STOP) + return result; + } + } + else + { + Type::Types t = pl[i].getTypeEnum(); + switch (t) + { + case Type::BooleanType: + { + result = visitor.visit(dataObject, pl[i], (bool)dataObject->getBoolean(pl[i])); + } + break; + case Type::ByteType: + { + result = visitor.visit(dataObject, pl[i], (char)dataObject->getByte(pl[i])); + } + break; + case Type::CharacterType: + { + result = visitor.visit(dataObject, pl[i], (wchar_t)dataObject->getCharacter(pl[i])); + } + break; + case Type::IntType: + { + result = visitor.visit(dataObject, pl[i], (long)dataObject->getInt(pl[i])); + } + break; + case Type::ShortType: + { + result = visitor.visit(dataObject, pl[i], (short)dataObject->getShort(pl[i])); + } + break; + case Type::DoubleType: + { + result = visitor.visit(dataObject, pl[i], (long double)dataObject->getDouble(pl[i])); + } + break; + case Type::FloatType: + { + result = visitor.visit(dataObject, pl[i], (float)dataObject->getFloat(pl[i])); + } + break; + case Type::LongType: + { + result = visitor.visit(dataObject, pl[i], (long)dataObject->getLong(pl[i])); + } + break; + case Type::DateType: + { + const SDODate date = dataObject->getDate(pl[i]); + result = visitor.visit(dataObject, pl[i], (long)(const time_t)date.getTime()); + } + break; + case Type::BigDecimalType: + case Type::BigIntegerType: + case Type::UriType: + case Type::StringType: + { + const string stringData(dataObject->getCString(pl[i])); + result = visitor.visit(dataObject, pl[i], (const string&)stringData); + } + break; + case Type::BytesType: + { + unsigned int len = dataObject->getLength(pl[i]); + char* byteData = new char[len]; + dataObject->getBytes(pl[i], byteData, len); + result = visitor.visit(dataObject, pl[i], byteData); + delete byteData; + } + break; + default: + result = SDOVisitor::RESULT_NOT_SUPPORTED; + break; + } + if (result == SDOVisitor::RESULT_NOT_SUPPORTED) + { + const string stringData(dataObject->getCString(pl[i])); + result = visitor.visit(dataObject, pl[i], (const string&)stringData); + } + } + } + } + if (result == SDOVisitor::RESULT_STOP) + return result; + } + } + + return SDOVisitor::RESULT_CONTINUE; + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/SDOUtils.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/SDOUtils.h new file mode 100644 index 0000000000..5be65c355a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/SDOUtils.h @@ -0,0 +1,106 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_sdovisitor_h +#define tuscany_sca_util_sdovisitor_h + +#include <string> +#include <vector> +#include <time.h> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * An SDO visitor interface + */ + class SCA_API SDOVisitor + { + public: + /** + * Constructor. + */ + SDOVisitor(); + + /** + * Destructor. + */ + virtual ~SDOVisitor(); + + /** + * Visit depth + */ + enum DEPTH + { + DEPTH_ZERO = 0, + DEPTH_ONE, + DEPTH_INFINITE + }; + + /** + * Visit status + */ + enum RESULT + { + RESULT_CONTINUE = 0, + RESULT_STOP, + RESULT_NOT_SUPPORTED + }; + + /** + * Visit an SDO. + */ + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, bool boolData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, char byteData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, const char* bytesData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, wchar_t charData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, const commonj::sdo::SDODate& dateData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, long double doubleData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, float floatData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, long intData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, short shortData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, const std::string& stringData); + virtual RESULT visit(commonj::sdo::DataObjectPtr parent, const commonj::sdo::Property& property, commonj::sdo::DataObjectPtr dataObjectData); + }; + + /** + * SDO utilities. + */ + class SCA_API SDOUtils + { + public: + + static SDOVisitor::RESULT accept(commonj::sdo::DataObjectPtr dataObject, SDOVisitor& visitor, SDOVisitor::DEPTH depth); + static const char* sdoURI; + + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany +#endif // tuscany_sca_sdovisitor_file_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Thread.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Thread.cpp new file mode 100644 index 0000000000..064a91409b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Thread.cpp @@ -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.
+ */
+
+/* $Rev: 491752 $ $Date: 2007-01-01 22:22:23 -0800 (Mon, 01 Jan 2007) $ */
+
+#if defined(WIN32) || defined (_WINDOWS)
+#pragma warning(disable: 4786)
+#include <process.h>
+#endif
+
+#include <errno.h>
+
+#include <sstream>
+
+#include "tuscany/sca/util/Thread.h"
+#include "tuscany/sca/util/Utils.h"
+#include "tuscany/sca/util/Logging.h"
+#include "tuscany/sca/core/Exceptions.h"
+
+using namespace std;
+
+
+namespace tuscany
+{
+ namespace sca
+ {
+ namespace util
+ {
+
+#if defined(WIN32) || defined (_WINDOWS)
+ unsigned int __stdcall runThread(void *args)
+ {
+ Thread* thread = (Thread*)args;
+ thread->run();
+ return 0;
+ }
+#else
+ void* runThread(void* args)
+ {
+ Thread* thread = (Thread*)args;
+ thread->run();
+ return NULL;
+ }
+#endif
+
+ Thread::Thread()
+#if defined(WIN32) || defined (_WINDOWS)
+ : hthread(0)
+#else
+#endif
+ {
+ logentry();
+ }
+
+ Thread::~Thread()
+ {
+ logentry();
+#if defined(WIN32) || defined (_WINDOWS)
+ if (hthread != 0)
+ {
+ CloseHandle(hthread);
+ }
+#else
+#endif
+ }
+
+ void Thread::start()
+ {
+ logentry();
+#if defined(WIN32) || defined (_WINDOWS)
+ hthread = (HANDLE)_beginthreadex(NULL, 0, runThread, this, 0, NULL);
+ if (hthread == 0)
+ {
+ ostringstream msg;
+ msg << "Failed to create thread, errno: " << __doserrno;
+ throwException(TuscanyRuntimeException, msg.str().c_str());
+ }
+#else
+ int rc =pthread_create(&thread, NULL, runThread, this);
+ if (rc)
+ {
+ ostringstream msg;
+ msg << "Failed to create thread, errno: " << errno;
+ throwException(TuscanyRuntimeException, msg.str().c_str());
+ }
+#endif
+ }
+
+ void Thread::join()
+ {
+ logentry();
+
+#if defined(WIN32) || defined (_WINDOWS)
+ WaitForSingleObject(hthread, INFINITE);
+#else
+ int rc =pthread_join(thread, NULL);
+ if (rc)
+ {
+ ostringstream msg;
+ msg << "Failed to join thread, errno: " << errno;
+ throwException(TuscanyRuntimeException, msg.str().c_str());
+ }
+#endif
+ }
+
+ } // End namespace util
+ } // End namespace sca
+} // End namespace tuscany
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Thread.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Thread.h new file mode 100644 index 0000000000..2ca9142994 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Thread.h @@ -0,0 +1,90 @@ +/*
+ * 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.
+ */
+
+/* $Rev: 492011 $ $Date: 2007-01-02 18:15:11 -0800 (Tue, 02 Jan 2007) $ */
+
+#ifndef tuscany_sca_util_thread_h
+#define tuscany_sca_util_thread_h
+
+#if defined(WIN32) || defined (_WINDOWS)
+#include <windows.h>
+#else
+#include <pthread.h>
+#endif
+
+#include <queue>
+
+#include "tuscany/sca/export.h"
+
+
+namespace tuscany
+{
+ namespace sca
+ {
+ namespace util
+ {
+ /**
+ * A portable wrapper for native threads.
+ */
+ class SCA_API Thread
+ {
+ public:
+ /**
+ * Constructor.
+ */
+ Thread();
+
+ /**
+ * Destructor.
+ */
+ virtual ~Thread();
+
+ /**
+ * The method that will be run in the thread.
+ */
+ virtual void run() = 0;
+
+ /**
+ * Start the thread.
+ */
+ void start();
+
+ /**
+ * Join the thread.
+ */
+ void join();
+
+ private:
+
+ /**
+ * Native thread handle.
+ */
+#if defined(WIN32) || defined (_WINDOWS)
+ HANDLE hthread;
+#else
+ pthread_t thread;
+#endif
+
+ };
+
+ } // End namespace util
+ } // End namespace sca
+} // End namespace tuscany
+
+#endif // tuscany_sca_util_thread_h
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/ThreadLocal.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/ThreadLocal.cpp new file mode 100644 index 0000000000..07c99b3cb1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/ThreadLocal.cpp @@ -0,0 +1,114 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <errno.h> + +#include <sstream> + +#include "tuscany/sca/util/ThreadLocal.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; + + +namespace tuscany +{ + namespace sca + { + namespace util + { + ThreadLocal::ThreadLocal() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + index = TlsAlloc(); + if (index == TLS_OUT_OF_INDEXES) + { + ostringstream msg; + msg << "Failed to create thread local index, error: " << GetLastError(); + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#else + int rc = pthread_key_create(&key, NULL); + if (rc) + { + ostringstream msg; + msg << "Failed to create thread local key, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + ThreadLocal::~ThreadLocal() + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + if (!TlsFree(index)) + { + ostringstream msg; + msg << "Failed to destroy thread local index, error: " << GetLastError(); + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#else + int rc = pthread_key_delete(key); + if (rc) { + ostringstream msg; + msg << "Failed to destroy thread local key, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + void ThreadLocal::setValue(void* value) + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + if (!TlsSetValue(index, value)) + { + ostringstream msg; + msg << "Failed to set thread local value, error: " << GetLastError(); + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#else + int rc = pthread_setspecific(key, value); + if (rc) { + ostringstream msg; + msg << "Failed to set thread local value, errno: " << errno; + throwException(TuscanyRuntimeException, msg.str().c_str()); + } +#endif + } + + void* ThreadLocal::getValue() const + { + logentry(); +#if defined(WIN32) || defined (_WINDOWS) + return TlsGetValue(index); +#else + return pthread_getspecific(key); +#endif + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/ThreadLocal.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/ThreadLocal.h new file mode 100644 index 0000000000..556055f183 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/ThreadLocal.h @@ -0,0 +1,84 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_threadlocal_h +#define tuscany_sca_util_threadlocal_h + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <pthread.h> +#endif + +#include "tuscany/sca/export.h" + + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Information about shared libraries and methods to + * access these shared libraries. + */ + class SCA_API ThreadLocal + { + public: + /** + * Constructor. + */ + ThreadLocal(); + + /** + * Destructor. + */ + virtual ~ThreadLocal(); + + /** + * Set the ThreadLocal value. + */ + void setValue(void *value); + + /** + * Get the ThreadLocal value. + */ + void* getValue() const; + + private: + + /** + * Handle to the thread local key. + */ +#if defined(WIN32) || defined (_WINDOWS) + DWORD index; +#else + pthread_key_t key; +#endif + + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_util_threadlocal_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Utils.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Utils.cpp new file mode 100644 index 0000000000..98a929392d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Utils.cpp @@ -0,0 +1,598 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#if defined(WIN32) || defined (_WINDOWS) +#include <windows.h> +#else +#include <errno.h> +#endif + +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace commonj::sdo; + +namespace tuscany +{ + namespace sca + { + namespace util + { + void Utils::tokeniseUri(const string& uri, string& token1, string& token2) + { + tokeniseString("/", uri, token1, token2); + } + + void Utils::tokeniseQName(const string& qname, string& uri, string& name) + { + tokeniseString("#", qname, uri, name); + if (name == "") + { + name = uri; + uri = ""; + } + } + + void Utils::tokeniseString( + const string& separator, + const string& str, + string& token1, + string& token2) + { + string::size_type sep = str.find(separator); + if (sep != string::npos) + { + int l = separator.length(); + token1 = str.substr(0, sep); + if ( (sep+l) < str.length()) + { + token2 = str.substr(sep+l); + } + else + { + token2 = ""; + } + } + else + { + token1 = str; + token2 = ""; + } + } + + void Utils::rTokeniseString( + const string& separator, + const string& str, + string& token1, + string& token2) + { + string::size_type sep = str.rfind(separator); + if (sep != string::npos) + { + int l = separator.length(); + token1 = str.substr(0, sep); + if ( (sep+l) < str.length()) + { + token2 = str.substr(sep+l); + } + else + { + token2 = ""; + } + } + else + { + token1 = ""; + token2 = str; + } + } + + void Utils::breakpoint() { + // dummy method used to set breakpoints + } + + ////////////////////////////////////////////////////////////////////////// + // Print a DatObject tree + ////////////////////////////////////////////////////////////////////////// + void Utils::tabs(int inc) + { + for (int ind=0; ind <inc; ind++) + { + cout << " "; + } + } + + const bool Utils::compareProperties(DataObjectPtr dataObject1, const Property& prop1, DataObjectPtr dataObject2, const Property& prop2, string& diff) + { + if(strcmp(prop1.getName(),prop2.getName()) != 0) + { + diff.append("Differing names for Properties:\n"); + diff.append(prop1.getName()); + diff.append("\n"); + diff.append(prop2.getName()); + return false; + } + + const Type& propertyType1 = prop1.getType(); + const Type& propertyType2 = prop2.getType(); + + if(strcmp(propertyType1.getName(), propertyType2.getName()) != 0 || + strcmp(propertyType1.getURI(),propertyType2.getURI()) != 0 ) + { + diff.append("Differing types for Properties:\n"); + diff.append(propertyType1.getName()); + diff.append("#"); + diff.append(propertyType1.getURI()); + diff.append("\n"); + diff.append(propertyType2.getName()); + diff.append("#"); + diff.append(propertyType2.getURI()); + return false; + } + if (dataObject1->isSet(prop1) != dataObject2->isSet(prop2)) + { + diff.append("Property "); + diff.append(prop1.getName()); + diff.append(" is set on one DataObject but not the other"); + return false; + } + + if (dataObject1->isSet(prop1)) + { + + if (prop1.isMany() != prop2.isMany()) + { + diff.append("Property "); + diff.append(prop1.getName()); + diff.append(" is many on one DataObject but not the other"); + return false; + } + if (propertyType1.isDataType() != propertyType2.isDataType()) + { + diff.append("Property "); + diff.append(prop1.getName()); + diff.append(" is dataType on one DataObject but not the other"); + return false; + } + + ////////////////////////////////////////////////////////////////////// + // For a many-valued property get the list of values + ////////////////////////////////////////////////////////////////////// + if (prop1.isMany()) + { + DataObjectList& dol1 = dataObject1->getList(prop1); + DataObjectList& dol2 = dataObject2->getList(prop2); + if (dol1.size() != dol2.size()) + { + diff.append("Property "); + diff.append(prop1.getName()); + diff.append(" is many but has differing number of elements"); + return false; + } + + for (unsigned int j = 0; j <dol1.size(); j++) + { + + if (propertyType1.isDataType()) + { + if( strcmp(dol1.getCString(j), dol2.getCString(j)) != 0) + { + diff.append("Differing value for Property "); + diff.append(prop1.getName()); + diff.append("["); + diff += ((int)j); + diff.append("]:\n"); + diff.append(dol1.getCString(j)); + diff.append("\n"); + diff.append(dol2.getCString(j)); + return false; + } + } + else + { + if(!compareDataObjects(dol1[j], dol2[j], diff)) + { + return false; + } + } + } + } // end IsMany + + + ////////////////////////////////////////////////////////////////////// + // For a primitive data type compare the values + ////////////////////////////////////////////////////////////////////// + else if (propertyType1.isDataType()) + { + if( strcmp(dataObject1->getCString(prop1), dataObject2->getCString(prop2)) != 0) + { + diff.append("Differing value for Property "); + diff.append(prop1.getName()); + diff.append(":\n"); + diff.append(dataObject1->getCString(prop1)); + diff.append("\n"); + diff.append(dataObject2->getCString(prop2)); + return false; + } + } + + ////////////////////////////////////////////////////////////////////// + // For a dataobject compare the DOs + ////////////////////////////////////////////////////////////////////// + else + { + if(!compareDataObjects(dataObject1->getDataObject(prop1), dataObject2->getDataObject(prop2), diff)) + { + return false; + } + } + } + return true; + } + + const bool Utils::compareDataObjects(DataObjectPtr dataObject1, DataObjectPtr dataObject2, string& diff) + { + if (!dataObject1 || !dataObject2) + { + diff.append("Cannot compare null DataObjects"); + return false; + } + + const Type& dataObject1Type = dataObject1->getType(); + const Type& dataObject2Type = dataObject2->getType(); + + if( strcmp(dataObject1Type.getURI(), dataObject2Type.getURI()) != 0 || + strcmp(dataObject1Type.getName(), dataObject2Type.getName()) != 0 ) + { + diff.append("DataObject Types differ:\n"); + diff.append(dataObject1Type.getURI()); + diff.append("#"); + diff.append(dataObject1Type.getName()); + diff.append("\n"); + diff.append(dataObject2Type.getURI()); + diff.append("#"); + diff.append(dataObject2Type.getName()); + return false; + } + + ////////////////////////////////////////////////////////////////////////// + // Iterate over all the properties + ////////////////////////////////////////////////////////////////////////// + PropertyList pl1 = dataObject1->getInstanceProperties(); + PropertyList pl2 = dataObject2->getInstanceProperties(); + if (pl1.size() != pl2.size()) + { + diff.append("Differing number of properties"); + return false; + } + + if (pl1.size() != 0) + { + for (unsigned int i = 0; i < pl1.size(); i++) + { + if(!compareProperties(dataObject1, pl1[i], dataObject2, pl2[i], diff)) + { + return false; + } + } + } + else + { + if(dataObject1->getType().isOpenType() != dataObject2->getType().isOpenType() && + dataObject1->getType().isDataObjectType() != dataObject2->getType().isDataObjectType()) + { + diff.append("DataObject is open & DO type on one but not the other"); + return false; + } + + // Compare elements under an open DataObject + if(dataObject1->getType().isOpenType() && dataObject1->getType().isDataObjectType()) + { + SequencePtr sequence1 = dataObject1->getSequence(); + SequencePtr sequence2 = dataObject2->getSequence(); + + if (sequence1 != NULL && sequence2 != NULL) + { + if (sequence1->size() != sequence1->size()) + { + diff.append("Open DataObjects have differing number of elements"); + return false; + } + + for (unsigned int i = 0; i < sequence1->size(); i++) + { + if (sequence1->isText(i) != sequence2->isText(i)) + { + diff.append("Open DataObjects have differing element types at position "); + diff += ((int) i); + return false; + } + if (sequence1->isText(i)) + { + if( strcmp(sequence1->getCStringValue(i), sequence2->getCStringValue(i)) != 0) + { + diff.append("Differing value for element at position "); + diff += ((int) i); + diff.append(":\n"); + diff.append(sequence1->getCStringValue(i)); + diff.append("\n"); + diff.append(sequence2->getCStringValue(i)); + return false; + } + } + else + { + const Property& p1 = sequence1->getProperty(i); + const Property& p2 = sequence2->getProperty(i); + + if(!compareProperties(dataObject1, p1, dataObject2, p2, diff)) + { + return false; + } + } + } + } + } + } + + return true; + } + + void Utils::printDO(DataObjectPtr dataObject, int increment) + { + int inc=increment; + if (!dataObject) + return; + const Type& dataObjectType = dataObject->getType(); + tabs(inc); + cout << "DataObject type: " << dataObjectType.getURI()<< "#" << dataObjectType.getName() << endl; + inc++; + + ////////////////////////////////////////////////////////////////////////// + // Iterate over all the properties + ////////////////////////////////////////////////////////////////////////// + PropertyList pl = dataObject->getInstanceProperties(); + if (pl.size() != 0) + { + for (unsigned int i = 0; i < pl.size(); i++) + { + tabs(inc); + cout << "Property: " << pl[i].getName() << endl; + + const Type& propertyType = pl[i].getType(); + + tabs(inc); + cout << "Property Type: " << propertyType.getURI()<< "#" << propertyType.getName() << endl; + + if (dataObject->isSet(pl[i])) + { + + ////////////////////////////////////////////////////////////////////// + // For a many-valued property get the list of values + ////////////////////////////////////////////////////////////////////// + if (pl[i].isMany()) + { + inc++; + DataObjectList& dol = dataObject->getList(pl[i]); + for (unsigned int j = 0; j <dol.size(); j++) + { + tabs(inc); + cout << "Value " << j <<endl; + inc++; + + if (propertyType.isDataType()) + { + tabs(inc); + cout<< "Property Value: " << dol.getCString(j) <<endl ; + } + else + printDO(dol[j], inc); + inc--; + } + inc--; + } // end IsMany + + + ////////////////////////////////////////////////////////////////////// + // For a primitive data type print the value + ////////////////////////////////////////////////////////////////////// + else if (propertyType.isDataType()) + { + tabs(inc); + cout<< "Property Value: " << dataObject->getCString(pl[i]) <<endl ; + } + + ////////////////////////////////////////////////////////////////////// + // For a dataobject print the do + ////////////////////////////////////////////////////////////////////// + else + { + inc++; + printDO(dataObject->getDataObject(pl[i]), inc); + inc--; + } + } + else + { + tabs(inc); + cout<< "Property Value: not set" <<endl ; + } + + } + } + else + { + // Print elements under an open DataObject + if(dataObject->getType().isOpenType() && dataObject->getType().isDataObjectType()) + { + SequencePtr sequence = dataObject->getSequence(); + if (sequence != NULL) + { + for (unsigned int i = 0; i < sequence->size(); i++) + { + if (sequence->isText(i)) + { + tabs(inc); + cout<< "Text Value: " << sequence->getCStringValue(i) <<endl ; + } + else { + const Property& p = sequence->getProperty(i); + + tabs(inc); + cout << "Property: " << p.getName() << endl; + + const Type& propertyType = p.getType(); + + tabs(inc); + cout << "Property Type: " << propertyType.getURI()<< "#" << propertyType.getName() << endl; + + if (dataObject->isSet(p)) + { + + ////////////////////////////////////////////////////////////////////// + // For a many-valued property get the list of values + ////////////////////////////////////////////////////////////////////// + if (p.isMany()) + { + inc++; + DataObjectList& dol = dataObject->getList(p); + for (unsigned int j = 0; j <dol.size(); j++) + { + tabs(inc); + cout << "Value " << j <<endl; + inc++; + + if (propertyType.isDataType()) + { + tabs(inc); + cout<< "Property Value: " << dol.getCString(j) <<endl ; + } + else + printDO(dol[j], inc); + inc--; + } + inc--; + } // end IsMany + + + ////////////////////////////////////////////////////////////////////// + // For a primitive data type print the value + ////////////////////////////////////////////////////////////////////// + else if (propertyType.isDataType()) + { + tabs(inc); + cout<< "Property Value: " << dataObject->getCString(p) <<endl ; + } + + ////////////////////////////////////////////////////////////////////// + // For a dataobject print the do + ////////////////////////////////////////////////////////////////////// + else + { + inc++; + printDO(dataObject->getDataObject(p), inc); + inc--; + } + } + else + { + tabs(inc); + cout<< "Property Value: not set" <<endl ; + } + } + } + } + } + } + inc--; + } + + void Utils::printTypes(DataFactoryPtr df) + { + ////////////////////////////////////////////////////////////////////////// + // Retrieve the DataFactory from the mediator + // get the list of Types in the DataFactory and list them + ////////////////////////////////////////////////////////////////////////// + TypeList tl = df->getTypes(); + for (unsigned int i = 0; i < tl.size(); i++) + { + cout << "Type: " << tl[i].getURI()<< "#" << tl[i].getName() << endl; + PropertyList pl = tl[i].getProperties(); + for (unsigned int j = 0; j < pl.size(); j++) + { + cout << "\tProperty: " << pl[j].getName() + << " type: " <<pl[j].getType().getURI()<<"#"<<pl[j].getType().getName()<< endl; + + } + } + + } + + void Utils::printType(const Type& type, int increment) + { + int inc = increment; + tabs(inc); + cout << "Type: " << type.getURI()<< "#" << type.getName() << endl; + inc++; + PropertyList pl = type.getProperties(); + for (unsigned int j = 0; j < pl.size(); j++) + { + tabs(inc); + cout << "\tProperty: " << pl[j].getName() + << " type: " <<pl[j].getType().getURI()<<"#"<<pl[j].getType().getName()<< endl; + inc++; + printType(pl[j].getType(), inc); + inc--; + } + } + + void Utils::printLastError(ostream& os) + { +#if defined(WIN32) || defined (_WINDOWS) + DWORD err = GetLastError(); + LPTSTR buf; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &buf, + 0, NULL ); + + os << (const char *)buf; + LocalFree(buf); +#else + char buf[256]; + strerror_r(errno, buf, 255); + os << buf; +#endif + } + + } // End namespace util + } // End namespace sca +} // End namespace tuscany + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Utils.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Utils.h new file mode 100644 index 0000000000..bbe1aa812a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/src/tuscany/sca/util/Utils.h @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_util_utils_h +#define tuscany_sca_util_utils_h + +#include <string> +#include <ostream> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/export.h" + +namespace tuscany +{ + namespace sca + { + namespace util + { + /** + * Utility methods to parse strings and provide debugging information. + */ + class SCA_API Utils { + + public: + static void tokeniseUri(const std::string& uri, std::string& token1, std::string& token2); + static void tokeniseQName(const std::string& sdoname, std::string& uri, std::string& name); + static void tokeniseString( + const std::string& separator, + const std::string& str, + std::string& token1, + std::string& token2); + + static void rTokeniseString( + const std::string& separator, + const std::string& str, + std::string& token1, + std::string& token2); + + static void breakpoint(); + + static void printLastError(std::ostream& os); + + static void printDO(commonj::sdo::DataObjectPtr dataObject, int increment=0); + static void printTypes(commonj::sdo::DataFactoryPtr df); + static void printType(const commonj::sdo::Type& type, int increment=0); + + static const bool compareDataObjects(commonj::sdo::DataObjectPtr dataObject1, commonj::sdo::DataObjectPtr dataObject2, std::string& diff); + static const bool compareProperties(commonj::sdo::DataObjectPtr dataObject1, const commonj::sdo::Property& prop1, commonj::sdo::DataObjectPtr dataObject2, const commonj::sdo::Property& prop2, std::string& diff); + + private: + static void tabs(int increment=0); + }; + + } // End namespace util + } // End namespace sca +} // End namespace tuscany +#endif // tuscany_sca_util_utils_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/Makefile.am new file mode 100644 index 0000000000..de5c2d1b1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/Makefile.am @@ -0,0 +1,17 @@ +# 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. + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/SCATestMacros.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/SCATestMacros.h new file mode 100644 index 0000000000..58c640f8a6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/SCATestMacros.h @@ -0,0 +1,84 @@ +/* + * 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. + */ + +/* $Rev: $ $Date: $ */ + +#ifndef sca_tests_macros_h_ +#define sca_tests_macros_h_ + +#include <iostream> + +#define TEST_TRACE( message ) \ + std::cout << "\tTRACE: " << message << std::endl; + +#define TEST_ASSERT( val ) \ + if( ! val ) { \ + std::cout << "Test failed in: " << __FILE__ << ": " << __LINE__ << std::endl; \ + return false; \ + } + +#define TEST_ASSERT_EQUALS( val1, val2 ) \ + if( val1 != val2 ) { \ + std::cout << "Test failed in: " << __FILE__ << ": " << __LINE__ << std::endl; \ + return false; \ + } + +#define TEST_ASSERT_NOT_EQUALS( val1, val2 ) \ + if( val1 == val2 ) { \ + std::cout << "Test failed in: " << __FILE__ << ": " << __LINE__ << std::endl; \ + return false; \ + } + +#define TEST_FAIL( message ) \ + std::cout << "Test failed in: " << __FILE__ << ":" << __LINE__ << ": " << message << std::endl; \ + return false; + +// For this macro, you must have the following variables defined: +// int testsPassed = 0; +// int testsTotal = 0; +// bool retval = false; +// The macro calls the test and increments the total and passed +// tests and logs accordingly +// +#define TEST(testName) \ + ++testsTotal; \ + try { \ + std::cout << "\nTest " << testsTotal << ": " << #testName << " ..... " << std::endl; \ + retval = testName; \ + if (retval) { \ + std::cout << "PASSED" << std::endl; \ + ++testsPassed; \ + } \ + else { \ + std::cout << "FAILED" << std::endl; \ + } \ + } \ + catch(const tuscany::sca::TuscanyRuntimeException &scaE) { \ + std::cout << "FAILED (unexpected SCA exception): " << scaE.getMessageText() \ + << std::endl; \ + } \ + catch(const commonj::sdo::SDORuntimeException &sdoE) { \ + std::cout << "FAILED (unexpected SDO exception): " << sdoE.getMessageText() \ + << std::endl; \ + } \ + catch(...) { \ + std::cout << "FAILED (unexpected unknown exception)" << std::endl; \ + } + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/main.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/main.cpp new file mode 100644 index 0000000000..9f9f733b49 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/main.cpp @@ -0,0 +1,95 @@ +/* + * 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. + */ + +/* $Rev: 583039 $ $Date: 2007-10-08 20:49:57 -0700 (Mon, 08 Oct 2007) $ */ + +#pragma warning(disable:4786) + +#include <iostream> + +#include "tuscany/sca/core/Exceptions.h" + +#include "SCATestMacros.h" +#include "wsdlTests/wsdlTests.h" +//#include "compositeTests/compositeTests.h" + +using namespace std; + +extern "C"{ + +int main (int argc, char** argv) +{ + // These variables are used and set by the TEST macro + int testsPassed = 0; + int testsTotal = 0; + bool retval = false; + + try + { + WSDLDefinitionTest wsdlTest; + TEST( wsdlTest.testSimple() ); + + WSDLErrorsTest wsdlErrorsTest; +// TEST( wsdlErrorsTest.testDuplicateWSDLInputOutputBinding() ); // fails, JIRA 1900 +// TEST( wsdlErrorsTest.testDuplicateWSDLMessagePartNames() ); // fails, JIRA 1900 + + TEST( wsdlErrorsTest.testDuplicateWSDLBindings() ); + TEST( wsdlErrorsTest.testDuplicateWSDLMessages() ); + TEST( wsdlErrorsTest.testDuplicateWSDLServices() ); + TEST( wsdlErrorsTest.testDuplicateWSDLPortTypes() ); + + // The following 4 tests fail due to an SDO SPEC limitation: + // According to XSD rules, if a global element xsd:any has + // maxOccurs > 1 you can only have a single valued property + // The multiple SOAP addresses/bindings/bodies/operations should load + // and I should be able to get the list and throw if list.size() > 1 + // but I cant because SDO says its a single value element +// TEST( wsdlErrorsTest.testDuplicateSOAPAddress() ); +// TEST( wsdlErrorsTest.testDuplicateSOAPBinding() ); +// TEST( wsdlErrorsTest.testDuplicateSOAPBody() ); +// TEST( wsdlErrorsTest.testDuplicateSOAPOperation() ); + + TEST( wsdlErrorsTest.testMissingPortBinding() ); + TEST( wsdlErrorsTest.testMissingOperation() ); + TEST( wsdlErrorsTest.testMissingPortType() ); + TEST( wsdlErrorsTest.testMissingMessage() ); + +// TEST( wsdlErrorsTest.testMissingMessagePartName() ); // fails, JIRA 1901 +// TEST( wsdlErrorsTest.testMissingPortName() ); // fails, JIRA 1901 +// TEST( wsdlErrorsTest.testMissingMessagePartType() ); // fails, JIRA 1901 + } + catch(...) + { + // All exceptions should be caught by the TEST macro + + cout << "Unexpected exception caught" << endl; + } + + cout + << "---------------------" + << "\nTest Results" + << "\n\tTotal tests: " << testsTotal + << "\n\tTests passed: " << testsPassed + << "\n\tTests failed: " << testsTotal - testsPassed + << endl; + + return testsTotal - testsPassed; +} + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/sca_test.bat b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/sca_test.bat new file mode 100755 index 0000000000..b082dd19ee --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/sca_test.bat @@ -0,0 +1,43 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) + +rem Run the client +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +.\sca_test.exe + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/sca_test.sh b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/sca_test.sh new file mode 100755 index 0000000000..99d268af8e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/sca_test.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +./sca_test + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/BaseWsdlTest.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/BaseWsdlTest.cpp new file mode 100755 index 0000000000..88563e5dfa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/BaseWsdlTest.cpp @@ -0,0 +1,127 @@ +/* + * 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. + */ + +/* $Rev: 583039 $ $Date: 2007-10-08 20:49:57 -0700 (Mon, 08 Oct 2007) $ */ + +#include "BaseWsdlTest.h" + +#include <tuscany/sca/model/WSDLDefinition.h> +#include <commonj/sdo/SDO.h> + +BaseWsdlTest::BaseWsdlTest() +{ + // TODO: Should we possibly make this an arg to this class instead? + char *installRootVar = getenv( "TUSCANY_SCACPP" ); + installRoot_ = installRootVar; +} + +BaseWsdlTest::~BaseWsdlTest() +{ +} + +void BaseWsdlTest::loadXsdHelper() +{ + if( ! (xsdHelper_ == 0) ) + { + return; + } + + try + { + xsdHelper_ = commonj::sdo::HelperProvider::getXSDHelper(); + + std::string filename = installRoot_ + "/xsd/wsdl_11.xsd"; + xsdHelper_->defineFile(filename.c_str()); + + filename = installRoot_ + "/xsd/wsdl_11_http.xsd"; + xsdHelper_->defineFile(filename.c_str()); + + filename = installRoot_ + "/xsd/wsdl_11_mime.xsd"; + xsdHelper_->defineFile(filename.c_str()); + + filename = installRoot_ + "/xsd/wsdl_11_soap.xsd"; + xsdHelper_->defineFile(filename.c_str()); + + filename = installRoot_ + "/xsd/wsdl_11_soap12.xsd"; + xsdHelper_->defineFile(filename.c_str()); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + std::cerr + << "BaseWsdlTest::loadXsdHelper() SDO runtime Exception: " + << sdoE.getMessageText() + << std::endl; + + throw; + } +} + +void BaseWsdlTest::loadXmlHelper() +{ + if( ! (xmlHelper_ == 0) ) + { + return; + } + + if( xsdHelper_ == 0 ) + { + loadXsdHelper(); + } + + try + { + xmlHelper_ = commonj::sdo::HelperProvider::getXMLHelper( xsdHelper_->getDataFactory() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + std::cerr + << "BaseWsdlTest::loadXmlHelper() SDO runtime Exception: " + << sdoE.getMessageText() + << std::endl; + + throw; + } +} + +tuscany::sca::model::WSDLDefinition * +BaseWsdlTest::loadWsdl( const std::string &wsdlPath ) +{ + loadXmlHelper(); + + tuscany::sca::model::WSDLDefinition *wsdl = 0; + + try + { + commonj::sdo::XMLDocumentPtr doc = xmlHelper_->loadFile( wsdlPath ); + wsdl = new tuscany::sca::model::WSDLDefinition( doc->getRootDataObject() ); +//tuscany::sca::util::Utils::printDO(doc->getRootDataObject()); // TODO remove this + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + std::cerr + << "BaseWsdlTest::loadWsdl() SDO runtime Exception: " + << sdoE.getMessageText() + << std::endl; + + throw; + } + + return wsdl; +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/BaseWsdlTest.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/BaseWsdlTest.h new file mode 100755 index 0000000000..7a2be5db5f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/BaseWsdlTest.h @@ -0,0 +1,50 @@ +#ifndef sca_tests_wsdl_BaseWsdlTest_h_ +#define sca_tests_wsdl_BaseWsdlTest_h_ + +/* + * 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. + */ + +/* $Rev: 583039 $ $Date: 2007-10-08 20:49:57 -0700 (Mon, 08 Oct 2007) $ */ + +#include <string> + +#include <tuscany/sca/model/WSDLDefinition.h> +#include <commonj/sdo/SDO.h> + +class BaseWsdlTest +{ + public: + + BaseWsdlTest(); + ~BaseWsdlTest(); + + tuscany::sca::model::WSDLDefinition *loadWsdl( const std::string &wsdlPath ); + + private: + void loadXmlHelper(); + void loadXsdHelper(); + + std::string installRoot_; + commonj::sdo::XMLHelperPtr xmlHelper_; + commonj::sdo::XSDHelperPtr xsdHelper_; + +}; + +#endif + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLDefinitionTest.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLDefinitionTest.cpp new file mode 100755 index 0000000000..df5e22bd68 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLDefinitionTest.cpp @@ -0,0 +1,67 @@ +/* + * 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. + */ + +/* $Rev: 583039 $ $Date: 2007-10-08 20:49:57 -0700 (Mon, 08 Oct 2007) $ */ + +#include <iostream> + +#include "SCATestMacros.h" +#include "WSDLDefinitionTest.h" + +WSDLDefinitionTest::WSDLDefinitionTest() +{ +} + +WSDLDefinitionTest::~WSDLDefinitionTest() +{ +} + +bool WSDLDefinitionTest::testSimple() +{ + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_correct/simple.wsdl" ); + + TEST_ASSERT_EQUALS( + "http://www.tuscany.com/tests/simple.wsdl", + wsdl->getNamespace() ); + + // Get the operation based on portType, operName + tuscany::sca::model::WSDLOperation wsdlOp1 = + wsdl->findOperation( "simplePortType", "simpleOperation" ); + TEST_ASSERT_EQUALS( "simpleOperation", wsdlOp1.getOperationName() ); + + // Get the operation based on service, portName, operName + tuscany::sca::model::WSDLOperation wsdlOp2 = + wsdl->findOperation( "simpleService", "simplePort", "simpleOperation" ); + TEST_ASSERT_EQUALS( "simpleOperation", wsdlOp2.getOperationName() ); + + // Check the operation names + std::list<std::string> operNames = wsdl->getOperations( "simplePortType" ); + TEST_ASSERT_EQUALS( 1, operNames.size() ); + TEST_ASSERT_EQUALS( "simpleOperation", operNames.front() ); + + // Check the port type names + std::list<std::string> portTypeNames = wsdl->getPortTypes(); + TEST_ASSERT_EQUALS( 1, portTypeNames.size() ); + TEST_ASSERT_EQUALS( "simplePortType", portTypeNames.front() ); + + // Everything passed + return true; +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLDefinitionTest.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLDefinitionTest.h new file mode 100755 index 0000000000..fb536b2153 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLDefinitionTest.h @@ -0,0 +1,40 @@ +#ifndef sca_tests_wsdl_WSDLDefinitionTest_h_ +#define sca_tests_wsdl_WSDLDefinitionTest_h_ + +/* + * 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. + */ + +/* $Rev: 583039 $ $Date: 2007-10-08 20:49:57 -0700 (Mon, 08 Oct 2007) $ */ + +#include "BaseWsdlTest.h" + +class WSDLDefinitionTest : public BaseWsdlTest +{ + + public: + + WSDLDefinitionTest(); + ~WSDLDefinitionTest(); + + bool testSimple(); + +}; + +#endif + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLErrorsTest.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLErrorsTest.cpp new file mode 100755 index 0000000000..573c88d7ad --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLErrorsTest.cpp @@ -0,0 +1,545 @@ + +#include <iostream> +#include <string> + +#include "SCATestMacros.h" +#include "WSDLErrorsTest.h" + +#include <commonj/sdo/SDO.h> +#include <tuscany/sca/core/Exceptions.h> +#include <tuscany/sca/util/File.h> + +WSDLErrorsTest::WSDLErrorsTest() +{ +} + +WSDLErrorsTest::~WSDLErrorsTest() +{ +} + + + // Each wsdl in the wsdls_erroneous directory will throw a different + // exception, so we need to check for each individual exception + +bool WSDLErrorsTest::testDuplicateWSDLInputOutputBinding() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_binding_input.wsdl" ); + + // This test fails because of JIRA 1900 + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_binding_input.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + TEST_TRACE( "Testing erroneous wsdl: duplicate_binding_output.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_binding_output.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + + +bool WSDLErrorsTest::testDuplicateWSDLMessagePartNames() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_partNames.wsdl" ); + + // This test fails because of JIRA 1900 + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_partNames.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateWSDLMessages() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_messages.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_messages.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "message/name" ), std::string::npos ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "cannot be duplicated" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateWSDLPortTypes() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_portTypes.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_portTypes.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "portType/name" ), std::string::npos ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "cannot be duplicated" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateWSDLBindings() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_bindings.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_bindings.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "binding/name" ), std::string::npos ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "cannot be duplicated" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateWSDLServices() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_services.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_services.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "service/name" ), std::string::npos ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "cannot be duplicated" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateSOAPAddress() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_soap_address.wsdl" ); + + // This test fails due to an SDO SPEC limitation: + // According to XSD rules, if a global element xsd:any has + // maxOccurs > 1 you can only have a single valued property + // The multiple SOAP addresses/bindings/bodies/operations should load + // and I should be able to get the list and throw if list.size() > 1 + // but I cant because SDO says its a single value element + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_soap_address.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateSOAPBinding() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_soap_binding.wsdl" ); + + // This test fails due to an SDO SPEC limitation: + // According to XSD rules, if a global element xsd:any has + // maxOccurs > 1 you can only have a single valued property + // The multiple SOAP addresses/bindings/bodies/operations should load + // and I should be able to get the list and throw if list.size() > 1 + // but I cant because SDO says its a single value element + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_soap_binding.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateSOAPBody() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_soap_body.wsdl" ); + + // This test fails due to an SDO SPEC limitation: + // According to XSD rules, if a global element xsd:any has + // maxOccurs > 1 you can only have a single valued property + // The multiple SOAP addresses/bindings/bodies/operations should load + // and I should be able to get the list and throw if list.size() > 1 + // but I cant because SDO says its a single value element + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_soap_body.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testDuplicateSOAPOperation() +{ + TEST_TRACE( "Testing erroneous wsdl: duplicate_soap_operation.wsdl" ); + + // This test fails due to an SDO SPEC limitation: + // According to XSD rules, if a global element xsd:any has + // maxOccurs > 1 you can only have a single valued property + // The multiple SOAP addresses/bindings/bodies/operations should load + // and I should be able to get the list and throw if list.size() > 1 + // but I cant because SDO says its a single value element + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/duplicate_soap_operation.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingPortBinding() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_binding_for_port.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_binding_for_port.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "Unable to find binding" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception" ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingOperation() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_operation.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_operation.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "Unable to find PortType operation" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception" ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingPortType() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_portType.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_portType.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "Unable to find PortType" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception" ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingMessage() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_message.wsdl" ); + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_message.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_TRACE( std::string( "Caught expected SCA Exception: " ) + scaE.getMessageText() ); + std::string errorText( scaE.getMessageText() ); + TEST_ASSERT_NOT_EQUALS( errorText.find( "unable to find PortType input message" ), std::string::npos ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception" ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingMessagePartName() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_name_for_part.wsdl" ); + + // This test fails because of JIRA 1901 + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_name_for_part.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingPortName() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_name_for_port.wsdl" ); + + // This test fails because of JIRA 1901 + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_name_for_port.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + +bool WSDLErrorsTest::testMissingMessagePartType() +{ + TEST_TRACE( "Testing erroneous wsdl: missing_type_for_part.wsdl" ); + + // This test fails because of JIRA 1901 + + try + { + tuscany::sca::model::WSDLDefinition *wsdl = + loadWsdl( "wsdlTests/wsdls_erroneous/missing_type_for_part.wsdl" ); + TEST_FAIL( "Wsdl should have thrown an exception" ); + } + catch( const tuscany::sca::TuscanyRuntimeException &scaE ) + { + TEST_FAIL( std::string( "Caught unexpected SCA Exception: " ) + scaE.getMessageText() ); + } + catch( const commonj::sdo::SDORuntimeException &sdoE ) + { + TEST_FAIL( std::string( "Caught unexpected SDO Exception: " ) + sdoE.getMessageText() ); + } + catch( ... ) + { + TEST_FAIL( "Caught unexpected unknown Exception: " ); + } + + return true; +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLErrorsTest.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLErrorsTest.h new file mode 100755 index 0000000000..e17d0edd28 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/WSDLErrorsTest.h @@ -0,0 +1,34 @@ +#ifndef sca_tests_wsdl_WSDLErrorsTest_h_ +#define sca_tests_wsdl_WSDLErrorsTest_h_ + +#include "BaseWsdlTest.h" + +class WSDLErrorsTest : public BaseWsdlTest +{ + public: + + WSDLErrorsTest(); + ~WSDLErrorsTest(); + + bool testDuplicateWSDLInputOutputBinding(); + bool testDuplicateWSDLMessagePartNames(); + bool testDuplicateWSDLMessages(); + bool testDuplicateWSDLPortTypes(); + bool testDuplicateWSDLBindings(); + bool testDuplicateWSDLServices(); + bool testDuplicateSOAPAddress(); + bool testDuplicateSOAPBinding(); + bool testDuplicateSOAPBody(); + bool testDuplicateSOAPOperation(); + + bool testMissingPortBinding(); + bool testMissingOperation(); + bool testMissingPortName(); + bool testMissingPortType(); + bool testMissingMessage(); + bool testMissingMessagePartName(); + bool testMissingMessagePartType(); +}; + +#endif + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdlTests.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdlTests.h new file mode 100755 index 0000000000..f8d86133c1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdlTests.h @@ -0,0 +1,34 @@ +#ifndef sca_tests_wsdl_wsdlTests_h_ +#define sca_tests_wsdl_wsdlTests_h_ + +/* + * 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. + */ + +/* $Rev: 583039 $ $Date: 2007-10-08 20:49:57 -0700 (Mon, 08 Oct 2007) $ */ + +// This file is included by the main test program +// it just includes all the necessary wsdl headers, +// so the main doesnt have to know about all of them + +#include "wsdlTests/BaseWsdlTest.h" +#include "wsdlTests/WSDLErrorsTest.h" +#include "wsdlTests/WSDLDefinitionTest.h" + +#endif + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_correct/simple.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_correct/simple.wsdl new file mode 100644 index 0000000000..c9fe542dbd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_correct/simple.wsdl @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://www.tuscany.com/tests/simple.wsdl" + targetNamespace="http://www.tuscany.com/tests/simple.wsdl" + name="simple"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="simplePortType"> + <operation name="simpleOperation"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="simpleBinding" type="tns:simplePortType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <!--soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/--> + <operation name="simpleOperation"> + <soap:operation soapAction="http://www.tuscany.com/test/simpleOperation"/> + + <input> + <soap:body use="literal"/> + <!-- this is a bug in SDO or the wsdl schemas: it parses incorrectly + <soap:body use="encoded" + encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" + namespace="http://www.tuscany.com/tests"/> + --> + </input> + + <output> + <soap:body use="literal"/> + </output> + + </operation> + </binding> + + <service name="simpleService"> + <port name="simplePort" binding="tns:simpleBinding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_binding_input.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_binding_input.wsdl new file mode 100755 index 0000000000..07423d3556 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_binding_input.wsdl @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_binding_output.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_binding_output.wsdl new file mode 100755 index 0000000000..4c295bf0f5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_binding_output.wsdl @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_bindings.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_bindings.wsdl new file mode 100755 index 0000000000..39932da219 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_bindings.wsdl @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_messages.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_messages.wsdl new file mode 100755 index 0000000000..e0388f19d6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_messages.wsdl @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_partnames.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_partnames.wsdl new file mode 100755 index 0000000000..6b5b1630e0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_partnames.wsdl @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_portTypes.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_portTypes.wsdl new file mode 100755 index 0000000000..1bbe57bbad --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_portTypes.wsdl @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_services.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_services.wsdl new file mode 100755 index 0000000000..e16d04a5ec --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_services.wsdl @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_address.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_address.wsdl new file mode 100755 index 0000000000..01af450396 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_address.wsdl @@ -0,0 +1,46 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost:8090/tests"/> + <soap:address location="http://localhost:8090/tests"/> + </port> + </service> + +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_binding.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_binding.wsdl new file mode 100755 index 0000000000..a2dac5e15e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_binding.wsdl @@ -0,0 +1,41 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_body.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_body.wsdl new file mode 100755 index 0000000000..3918b9e6f1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_body.wsdl @@ -0,0 +1,41 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_operation.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_operation.wsdl new file mode 100755 index 0000000000..542d60b7cb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/duplicate_soap_operation.wsdl @@ -0,0 +1,41 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_binding_for_port.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_binding_for_port.wsdl new file mode 100755 index 0000000000..cfcb65f149 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_binding_for_port.wsdl @@ -0,0 +1,43 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> +<!-- This is the correct form + <port name="port" binding="tns:binding"> +--> + <port name="port"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_message.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_message.wsdl new file mode 100755 index 0000000000..ec2d17204d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_message.wsdl @@ -0,0 +1,40 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:bogusMessageName"/> <!-- The error is here --> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_name_for_part.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_name_for_part.wsdl new file mode 100755 index 0000000000..4e927e222f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_name_for_part.wsdl @@ -0,0 +1,43 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> +<!-- this is the correct form + <part name="zipcode" type="xsd:string"/> +--> + <part type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_name_for_port.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_name_for_port.wsdl new file mode 100755 index 0000000000..f182c01cb6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_name_for_port.wsdl @@ -0,0 +1,43 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> +<!-- This is the correct form + <port name="port" binding="tns:binding"> +--> + <port binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_operation.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_operation.wsdl new file mode 100755 index 0000000000..f1fd4eba9c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_operation.wsdl @@ -0,0 +1,40 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="bogusOperationName"> <!-- The error is here --> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_portType.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_portType.wsdl new file mode 100755 index 0000000000..bdfac4d13d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_portType.wsdl @@ -0,0 +1,40 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> + <part name="zipcode" type="xsd:string"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:bogusPortType"> <!-- The error is here --> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_type_for_part.wsdl b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_type_for_part.wsdl new file mode 100755 index 0000000000..1706ac2f13 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/test/wsdlTests/wsdls_erroneous/missing_type_for_part.wsdl @@ -0,0 +1,43 @@ +<definitions + xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:tns="http://www.tuscany.com/tests/duplicate_services.wsdl" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.tuscany.com/tests/duplicate_services.wsdl" + name="duplicate_services"> + + <message name="request"> +<!-- this is the correct form + <part name="zipcode" type="xsd:string"/> +--> + <part name="zipcode"/> + </message> + <message name="response"> + <part name="host" type="xsd:string"/> + <part name="port" type="xsd:string"/> + </message> + <portType name="portType"> + <!-- Request/response --> + <operation name="test"> + <input message="tns:request"/> + <output message="tns:response"/> + </operation> + </portType> + <binding name="binding" type="tns:portType"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> + <operation name="test"> + <soap:operation soapAction="http://www.tuscany.com/test/duplicate_services"/> + <input> + <soap:body use="literal"/> + </input> + <output> + <soap:body use="literal"/> + </output> + </operation> + </binding> + <service name="service"> + <port name="port" binding="tns:binding"> + <soap:address location="http://localhost/sca/tests"/> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-core.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-core.xsd new file mode 100644 index 0000000000..d7661e3994 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-core.xsd @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <element name="componentType" type="sca:ComponentType" /> + <complexType name="ComponentType"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="service" type="sca:ServiceType" /> + <element minOccurs="0" maxOccurs="unbounded" name="reference" type="sca:ReferenceType" /> + <element minOccurs="0" maxOccurs="unbounded" name="property" type="sca:PropertyType" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <element name="composite" type="sca:Composite" /> + <complexType name="Composite"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="include" type="anyURI" /> + <element minOccurs="0" maxOccurs="unbounded" name="service" type="sca:CompositeServiceType" /> + <element minOccurs="0" maxOccurs="unbounded" name="property" type="sca:PropertyType" /> + <element minOccurs="0" maxOccurs="unbounded" name="component" type="sca:Component" /> + <element minOccurs="0" maxOccurs="unbounded" name="reference" type="sca:CompositeReferenceType" /> + <element minOccurs="0" maxOccurs="unbounded" name="wire" type="sca:Wire" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <complexType name="CompositeServiceType"> + <sequence> + <element ref="sca:interface" minOccurs="1" maxOccurs="1" /> + <element ref="sca:binding" minOccurs="0" maxOccurs="unbounded" /> + <element name="reference" minOccurs="0" maxOccurs="unbounded" type="anyURI" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + <!-- a multiplicity 1..1 or 0..n sample + <reference>StockQuoteComponent</reference> - type must be URI + a multiplicity 1..n or 0..n sample + <reference>StockQuoteComponent1</reference> - type must be URI + <reference>StockQuoteComponent2</reference> + --> + + + <element name="interface" type="sca:Interface" abstract="true"/> + <complexType name="Interface" abstract="true"/> + + <complexType name="CompositeReferenceType"> + <sequence> + <element ref="sca:interface" minOccurs="1" maxOccurs="1" /> + <element ref="sca:binding" minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1" /> + <attribute name="override" type="sca:OverrideOptions" default="may" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <complexType name="ServiceType"> + <sequence> + <element ref="sca:interface" minOccurs="1" maxOccurs="1" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <complexType name="ReferenceType"> + <sequence> + <element ref="sca:interface" minOccurs="1" maxOccurs="1" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <attribute name="multiplicity" type="sca:Multiplicity" use="optional" default="1..1" /> + <attribute name="override" type="sca:OverrideOptions" default="may" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <complexType name="PropertyType"> + <complexContent> + <extension base="anyType"> + <attribute name="name" type="NCName" use="required" /> + <attribute name="type" type="QName" use="required" /> + <attribute name="many" type="boolean" default="false" use="optional" /> + <attribute name="override" type="sca:OverrideOptions" default="may" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <element name="binding" type="sca:Binding" abstract="true" /> + <complexType name="Binding" abstract="true"> + <attribute name="uri" type="anyURI" use="optional" /> + </complexType> + + <complexType name="Component"> + <sequence> + <element ref="sca:implementation" minOccurs="1" maxOccurs="1" /> + <element name="reference" type="sca:Reference" minOccurs="0" maxOccurs="unbounded" /> + <element name="property" type="sca:Property" minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <complexType name="Property"> + <complexContent> + <extension base="anyType"> + <attribute name="name" type="NCName" use="required" /> + <attribute name="source" type="string" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <complexType name="Reference"> + <simpleContent> + <extension base="anyURI"> + <attribute name="name" type="NCName" use="required" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </simpleContent> + </complexType> + + <element name="implementation" type="sca:Implementation" abstract="true" /> + <complexType name="Implementation" abstract="true"/> + + <complexType name="Wire"> + <sequence> + <element name="source" type="anyURI" minOccurs="1" maxOccurs="1" /> + <element name="target" type="anyURI" minOccurs="1" maxOccurs="1" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <simpleType name="Multiplicity"> + <restriction base="string"> + <enumeration value="0..1" /> + <enumeration value="1..1" /> + <enumeration value="0..n" /> + <enumeration value="1..n" /> + </restriction> + </simpleType> + + <simpleType name="OverrideOptions"> + <restriction base="string"> + <enumeration value="no" /> + <enumeration value="may" /> + <enumeration value="must" /> + </restriction> + </simpleType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-implementation-composite.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-implementation-composite.xsd new file mode 100644 index 0000000000..4bcc6747ba --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-implementation-composite.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <element name="implementation.composite" type="sca:SCAImplementation" substitutionGroup="sca:implementation"/> + <complexType name="SCAImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-implementation-java.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-implementation-java.xsd new file mode 100644 index 0000000000..e20f0a9b50 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-implementation-java.xsd @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <element name="implementation.java" type="sca:JavaImplementation" substitutionGroup="sca:implementation"/> + <complexType name="JavaImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="class" type="NCName" use="required" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-interface-java.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-interface-java.xsd new file mode 100644 index 0000000000..a6028c1434 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-interface-java.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <element name="interface.java" type="sca:JavaInterface" substitutionGroup="sca:interface"/> + <complexType name="JavaInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="interface" type="NCName" use="required" /> + <attribute name="callbackInterface" type="NCName" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-interface-wsdl.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-interface-wsdl.xsd new file mode 100644 index 0000000000..a3de838b7e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca-interface-wsdl.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <element name="interface.wsdl" type="sca:WSDLPortType" substitutionGroup="sca:interface"/> + <complexType name="WSDLPortType"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="interface" type="anyURI" use="required" /> + <attribute name="callbackInterface" type="anyURI" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca.xsd new file mode 100644 index 0000000000..8853f25c11 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/sca.xsd @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0"> + + <include schemaLocation="sca-core.xsd" /> + <include schemaLocation="sca-interface-java.xsd" /> + <include schemaLocation="sca-interface-wsdl.xsd" /> + <include schemaLocation="sca-implementation-java.xsd" /> + <include schemaLocation="sca-implementation-composite.xsd" /> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/tuscany.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/tuscany.xsd new file mode 100644 index 0000000000..8bad940782 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/tuscany.xsd @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://org.apache.tuscany/xmlns/cpp/1.0" + xmlns:tuscany="http://org.apache.tuscany/xmlns/cpp/1.0" + elementFormDefault="qualified"> + + <element name="tuscany-model" type="tuscany:ModelType"/> + <complexType name="ModelType"> + <sequence> + <element minOccurs="0" maxOccurs="1" name="wsdl" type="tuscany:WSDLType"/> + <element minOccurs="0" maxOccurs="1" name="xsd" type="tuscany:XSDType"/> + </sequence> + </complexType> + + <complexType name="WSDLType"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="file" type="tuscany:FileType"/> + </sequence> + </complexType> + + <complexType name="XSDType"> + <sequence> + <element minOccurs="0" maxOccurs="unbounded" name="file" type="tuscany:FileType"/> + </sequence> + </complexType> + + <complexType name="FileType"> + <attribute name="name" type="NCName" use="required"/> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11.xsd new file mode 100644 index 0000000000..7cfdc5b58b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11.xsd @@ -0,0 +1,307 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +Copyright 2001 - 2005, International Business Machines Corporation and Microsoft Corporation +All Rights Reserved + +License for WSDL Schema Files + +The Authors grant permission to copy and distribute the WSDL Schema +Files in any medium without fee or royalty as long as this notice and +license are distributed with them. The originals of these files can +be located at: + +http://schemas.xmlsoap.org/wsdl/2003-02-11.xsd + +THESE SCHEMA FILES ARE PROVIDED "AS IS," AND THE AUTHORS MAKE NO REPRESENTATIONS +OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THESE FILES, INCLUDING, BUT NOT +LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +NON-INFRINGEMENT OR TITLE. THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, +INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR +RELATING TO ANY USE OR DISTRIBUTION OF THESE FILES. + +The name and trademarks of the Authors may NOT be used in any manner, +including advertising or publicity pertaining to these files or any program +or service that uses these files, written prior permission. Title to copyright +in these files will at all times remain with the Authors. + +No other rights are granted by implication, estoppel or otherwise. + + +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://schemas.xmlsoap.org/wsdl/" elementFormDefault="qualified"> + + <xs:complexType mixed="true" name="tDocumentation"> + <xs:sequence> + <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tDocumented"> + <xs:annotation> + <xs:documentation> + This type is extended by component types to allow them to be documented + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:element name="documentation" type="wsdl:tDocumentation" minOccurs="0"/> + </xs:sequence> + </xs:complexType> + + <xs:complexType name="tExtensibleAttributesDocumented" abstract="true"> + <xs:complexContent> + <xs:extension base="wsdl:tDocumented"> + <xs:annotation> + <xs:documentation> + This type is extended by component types to allow attributes from other namespaces to be added. + </xs:documentation> + </xs:annotation> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tExtensibleDocumented" abstract="true"> + <xs:complexContent> + <xs:extension base="wsdl:tDocumented"> + <xs:annotation> + <xs:documentation> + This type is extended by component types to allow elements from other namespaces to be added. + </xs:documentation> + </xs:annotation> + <xs:sequence> + <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="definitions" type="wsdl:tDefinitions"> + <xs:key name="message"> + <xs:selector xpath="wsdl:message"/> + <xs:field xpath="@name"/> + </xs:key> + <xs:key name="portType"> + <xs:selector xpath="wsdl:portType"/> + <xs:field xpath="@name"/> + </xs:key> + <xs:key name="binding"> + <xs:selector xpath="wsdl:binding"/> + <xs:field xpath="@name"/> + </xs:key> + <xs:key name="service"> + <xs:selector xpath="wsdl:service"/> + <xs:field xpath="@name"/> + </xs:key> + <xs:key name="import"> + <xs:selector xpath="wsdl:import"/> + <xs:field xpath="@namespace"/> + </xs:key> + </xs:element> + + <xs:group name="anyTopLevelOptionalElement"> + <xs:annotation> + <xs:documentation> + Any top level optional element allowed to appear more then once - any child of definitions element except wsdl:types. Any extensibility element is allowed in any place. + </xs:documentation> + </xs:annotation> + <xs:choice> + <xs:element name="import" type="wsdl:tImport"/> + <xs:element name="types" type="wsdl:tTypes"/> + <xs:element name="message" type="wsdl:tMessage"> + <xs:unique name="part"> + <xs:selector xpath="wsdl:part"/> + <xs:field xpath="@name"/> + </xs:unique> + </xs:element> + <xs:element name="portType" type="wsdl:tPortType"/> + <xs:element name="binding" type="wsdl:tBinding"/> + <xs:element name="service" type="wsdl:tService"> + <xs:unique name="port"> + <xs:selector xpath="wsdl:port"/> + <xs:field xpath="@name"/> + </xs:unique> + </xs:element> + </xs:choice> + </xs:group> + + <xs:complexType name="tDefinitions"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:sequence> + <xs:group ref="wsdl:anyTopLevelOptionalElement" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="targetNamespace" type="xs:anyURI" use="optional"/> + <xs:attribute name="name" type="xs:NCName" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tImport"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleAttributesDocumented"> + <xs:attribute name="namespace" type="xs:anyURI" use="required"/> + <xs:attribute name="location" type="xs:anyURI" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tTypes"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"/> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tMessage"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:sequence> + <xs:element name="part" type="wsdl:tPart" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tPart"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleAttributesDocumented"> + <xs:attribute name="name" type="xs:NCName" use="required"/> + <xs:attribute name="element" type="xs:QName" use="optional"/> + <xs:attribute name="type" type="xs:QName" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tPortType"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleAttributesDocumented"> + <xs:sequence> + <xs:element name="operation" type="wsdl:tOperation" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tOperation"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:sequence> + <xs:choice> + <xs:group ref="wsdl:request-response-or-one-way-operation"/> + <xs:group ref="wsdl:solicit-response-or-notification-operation"/> + </xs:choice> + </xs:sequence> + <xs:attribute name="name" type="xs:NCName" use="required"/> + <xs:attribute name="parameterOrder" type="xs:NMTOKENS" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:group name="request-response-or-one-way-operation"> + <xs:sequence> + <xs:element name="input" type="wsdl:tParam"/> + <xs:sequence minOccurs="0"> + <xs:element name="output" type="wsdl:tParam"/> + <xs:element name="fault" type="wsdl:tFault" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:sequence> + </xs:group> + + <xs:group name="solicit-response-or-notification-operation"> + <xs:sequence> + <xs:element name="output" type="wsdl:tParam"/> + <xs:sequence minOccurs="0"> + <xs:element name="input" type="wsdl:tParam"/> + <xs:element name="fault" type="wsdl:tFault" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:sequence> + </xs:group> + + <xs:complexType name="tParam"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleAttributesDocumented"> + <xs:attribute name="name" type="xs:NCName" use="optional"/> + <xs:attribute name="message" type="xs:QName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tFault"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleAttributesDocumented"> + <xs:attribute name="name" type="xs:NCName" use="required"/> + <xs:attribute name="message" type="xs:QName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tBinding"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:sequence> + <xs:element name="operation" type="wsdl:tBindingOperation" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="name" type="xs:NCName" use="required"/> + <xs:attribute name="type" type="xs:QName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tBindingOperationMessage"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:attribute name="name" type="xs:NCName" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tBindingOperationFault"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tBindingOperation"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:sequence> + <xs:element name="input" type="wsdl:tBindingOperationMessage" minOccurs="0"/> + <xs:element name="output" type="wsdl:tBindingOperationMessage" minOccurs="0"/> + <xs:element name="fault" type="wsdl:tBindingOperationFault" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tService"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:sequence> + <xs:element name="port" type="wsdl:tPort" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="tPort"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibleDocumented"> + <xs:attribute name="name" type="xs:NCName" use="required"/> + <xs:attribute name="binding" type="xs:QName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:attribute name="arrayType" type="xs:string"/> + <xs:attribute name="required" type="xs:boolean"/> + <xs:complexType name="tExtensibilityElement" abstract="true"> + <xs:attribute ref="wsdl:required" use="optional"/> + </xs:complexType> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_http.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_http.xsd new file mode 100644 index 0000000000..7003bf29d8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_http.xsd @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +Copyright 2001 - 2005, International Business Machines Corporation and Microsoft Corporation +All Rights Reserved + +License for WSDL Schema Files + +The Authors grant permission to copy and distribute the WSDL Schema +Files in any medium without fee or royalty as long as this notice and +license are distributed with them. The originals of these files can +be located at: + +http://schemas.xmlsoap.org/wsdl/http/wsdl-http.xsd + +THESE SCHEMA FILES ARE PROVIDED "AS IS," AND THE AUTHORS MAKE NO REPRESENTATIONS +OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THESE FILES, INCLUDING, BUT NOT +LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +NON-INFRINGEMENT OR TITLE. THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, +INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR +RELATING TO ANY USE OR DISTRIBUTION OF THESE FILES. + +The name and trademarks of the Authors may NOT be used in any manner, +including advertising or publicity pertaining to these files or any program +or service that uses these files, written prior permission. Title to copyright +in these files will at all times remain with the Authors. + +No other rights are granted by implication, estoppel or otherwise. + + + + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://schemas.xmlsoap.org/wsdl/http/"> + + <import schemaLocation="wsdl_11.xsd" namespace="http://schemas.xmlsoap.org/wsdl/"/> + + <element name="address" type="http:addressType"/> + + <complexType name="addressType"> + <complexContent> + <extension base="wsdl:tExtensibilityElement"> + <sequence/> + <attribute name="location" type="anyURI" use="required"/> + </extension> + </complexContent> + </complexType> + + <element name="binding" type="http:bindingType"/> + <complexType name="bindingType"> + <complexContent> + <extension base="wsdl:tExtensibilityElement"> + <sequence/> + <attribute name="verb" type="NMTOKEN" use="required"/> + </extension> + </complexContent> + </complexType> + + <element name="operation" type="http:operationType"/> + <complexType name="operationType"> + <complexContent> + <extension base="wsdl:tExtensibilityElement"> + <sequence/> + <attribute name="location" type="anyURI" use="required"/> + </extension> + </complexContent> + </complexType> + + <element name="urlEncoded"> + <complexType/> + </element> + <element name="urlReplacement"> + <complexType/> + </element> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_mime.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_mime.xsd new file mode 100644 index 0000000000..46c62c822c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_mime.xsd @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +Copyright 2001-2005, International Business Machines Corporation and Microsoft Corporation +All Rights Reserved + +License for WSDL Schema Files + +The Authors grant permission to copy and distribute the WSDL Schema +Files in any medium without fee or royalty as long as this notice and +license are distributed with them. The originals of these files can +be located at: + +http://schemas.xmlsoap.org/wsdl/mime/2002-01-29.xsd + +THESE SCHEMA FILES ARE PROVIDED "AS IS," AND THE AUTHORS MAKE NO REPRESENTATIONS +OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THESE FILES, INCLUDING, BUT NOT +LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +NON-INFRINGEMENT OR TITLE. THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, +INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR +RELATING TO ANY USE OR DISTRIBUTION OF THESE FILES. + +The name and trademarks of the Authors may NOT be used in any manner, +including advertising or publicity pertaining to these files or any program +or service that uses these files, written prior permission. Title to copyright +in these files will at all times remain with the Authors. + +No other rights are granted by implication, estoppel or otherwise. + + + --> +<schema targetNamespace="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://www.w3.org/2001/XMLSchema"> + + <import schemaLocation="wsdl_11.xsd" namespace="http://schemas.xmlsoap.org/wsdl/"/> + + <element name="content" type="mime:contentType"/> + <complexType name="contentType"> + <complexContent> + <extension base="wsdl:tExtensibilityElement"> + <sequence/> + <attribute name="type" type="string" use="optional"/> + <attribute name="part" type="NMTOKEN" use="optional"/> + </extension> + </complexContent> + </complexType> + <element name="multipartRelated" type="mime:multipartRelatedType"/> + <complexType name="multipartRelatedType"> + <complexContent> + <extension base="wsdl:tExtensibilityElement"> + <sequence> + <element name="part" type="mime:tPart" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + </extension> + </complexContent> + </complexType> + <complexType name="tPart"> + <sequence> + <any namespace="##targetNamespace" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NMTOKEN" use="required"/> + </complexType> + <element name="mimeXml" type="mime:tMimeXml"/> + <complexType name="tMimeXml"> + <complexContent> + <extension base="wsdl:tExtensibilityElement"> + <sequence/> + <attribute name="part" type="NMTOKEN" use="optional"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_soap.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_soap.xsd new file mode 100644 index 0000000000..800059d6b0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_soap.xsd @@ -0,0 +1,146 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +Copyright 2001 - 2005, International Business Machines Corporation and Microsoft Corporation +All Rights Reserved + +License for WSDL Schema Files + +The Authors grant permission to copy and distribute the WSDL Schema +Files in any medium without fee or royalty as long as this notice and +license are distributed with them. The originals of these files can +be located at: + +http://schemas.xmlsoap.org/wsdl/soap/2003-02-11.xsd + +THESE SCHEMA FILES ARE PROVIDED "AS IS," AND THE AUTHORS MAKE NO REPRESENTATIONS +OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THESE FILES, INCLUDING, BUT NOT +LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +NON-INFRINGEMENT OR TITLE. THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, +INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR +RELATING TO ANY USE OR DISTRIBUTION OF THESE FILES. + +The name and trademarks of the Authors may NOT be used in any manner, +including advertising or publicity pertaining to these files or any program +or service that uses these files, written prior permission. Title to copyright +in these files will at all times remain with the Authors. + +No other rights are granted by implication, estoppel or otherwise. + + +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="http://schemas.xmlsoap.org/wsdl/soap/"> + + <xs:import schemaLocation="wsdl_11.xsd" namespace="http://schemas.xmlsoap.org/wsdl/"/> + + <xs:simpleType name="encodingStyle"> + <xs:annotation> + <xs:documentation> + "encodingStyle" indicates any canonicalization conventions followed in the contents of the containing element. For example, the value "http://schemas.xmlsoap.org/soap/encoding/" indicates the pattern described in SOAP specification + </xs:documentation> + </xs:annotation> + <xs:list itemType="xs:anyURI"/> + </xs:simpleType> + + <xs:element name="binding" type="soap:tBinding"/> + <xs:complexType name="tBinding"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibilityElement"> + <xs:attribute name="transport" type="xs:anyURI" use="required"/> + <xs:attribute name="style" type="soap:tStyleChoice" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:simpleType name="tStyleChoice"> + <xs:restriction base="xs:string"> + <xs:enumeration value="rpc"/> + <xs:enumeration value="document"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="operation" type="soap:tOperation"/> + <xs:complexType name="tOperation"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibilityElement"> + <xs:attribute name="soapAction" type="xs:anyURI" use="optional"/> + <xs:attribute name="style" type="soap:tStyleChoice" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="body" type="soap:tBody"/> + <xs:attributeGroup name="tBodyAttributes"> + <xs:attribute name="encodingStyle" type="soap:encodingStyle" use="optional"/> + <xs:attribute name="use" type="soap:useChoice" use="optional"/> + <xs:attribute name="namespace" type="xs:anyURI" use="optional"/> + </xs:attributeGroup> + <xs:complexType name="tBody"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibilityElement"> + <xs:attribute name="parts" type="xs:NMTOKENS" use="optional"/> + <xs:attributeGroup ref="soap:tBodyAttributes"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:simpleType name="useChoice"> + <xs:restriction base="xs:string"> + <xs:enumeration value="literal"/> + <xs:enumeration value="encoded"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="fault" type="soap:tFault"/> + <xs:complexType name="tFaultRes" abstract="true"> + <xs:complexContent> + <xs:restriction base="soap:tBody"> + <xs:attribute ref="wsdl:required" use="optional"/> + <xs:attribute name="parts" type="xs:NMTOKENS" use="prohibited"/> + <xs:attributeGroup ref="soap:tBodyAttributes"/> + </xs:restriction> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="tFault"> + <xs:complexContent> + <xs:extension base="soap:tFaultRes"> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + + <xs:element name="header" type="soap:tHeader"/> + <xs:attributeGroup name="tHeaderAttributes"> + <xs:attribute name="message" type="xs:QName" use="required"/> + <xs:attribute name="part" type="xs:NMTOKEN" use="required"/> + <xs:attribute name="use" type="soap:useChoice" use="required"/> + <xs:attribute name="encodingStyle" type="soap:encodingStyle" use="optional"/> + <xs:attribute name="namespace" type="xs:anyURI" use="optional"/> + </xs:attributeGroup> + <xs:complexType name="tHeader"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibilityElement"> + <xs:sequence> + <xs:element ref="soap:headerfault" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attributeGroup ref="soap:tHeaderAttributes"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="headerfault" type="soap:tHeaderFault"/> + <xs:complexType name="tHeaderFault"> + <xs:attributeGroup ref="soap:tHeaderAttributes"/> + </xs:complexType> + + <xs:element name="address" type="soap:tAddress"/> + <xs:complexType name="tAddress"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibilityElement"> + <xs:attribute name="location" type="xs:anyURI" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_soap12.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_soap12.xsd new file mode 100644 index 0000000000..281f2c0deb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/core/xsd/wsdl_11_soap12.xsd @@ -0,0 +1,140 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + +Copyright 2001 - 2006, International Business Machines Corporation and Microsoft Corporation +All Rights Reserved + +License for WSDL 1.1 Binding Extension for SOAP 1.2 Schema Files + +The Authors grant permission to copy and distribute the WSDL 1.1 Binding Extension for SOAP 1.2 Schema Files in any medium without fee or royalty as long as this notice and license are distributed with them. The originals of these files can be located at: + +http://schemas.xmlsoap.org/wsdl/soap12/wsdl11soap12.xsd + +THESE SCHEMA FILES ARE PROVIDED "AS IS," AND THE AUTHORS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THESE FILES, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT OR TITLE. THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO ANY USE OR DISTRIBUTION OF THESE FILES. + +The name and trademarks of the Authors may NOT be used in any manner, including advertising or publicity pertaining to these files or any program or service that uses these files, written prior permission. Title to copyright in these files will at all times remain with the Authors. + +No other rights are granted by implication, estoppel or otherwise. + + +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://schemas.xmlsoap.org/wsdl/soap12/"> + + <xs:import schemaLocation="wsdl_11.xsd" namespace="http://schemas.xmlsoap.org/wsdl/"/> + + <xs:complexType name="tExtensibilityElementOpenAttrs"> + <xs:complexContent> + <xs:extension base="wsdl:tExtensibilityElement"> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="binding" type="wsoap12:tBinding"/> + <xs:complexType name="tBinding"> + <xs:complexContent> + <xs:extension base="wsoap12:tExtensibilityElementOpenAttrs"> + <xs:attribute name="transport" type="xs:anyURI" use="required"/> + <xs:attribute name="style" type="wsoap12:tStyleChoice" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:simpleType name="tStyleChoice"> + <xs:restriction base="xs:string"> + <xs:enumeration value="rpc"/> + <xs:enumeration value="document"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="operation" type="wsoap12:tOperation"/> + <xs:complexType name="tOperation"> + <xs:complexContent> + <xs:extension base="wsoap12:tExtensibilityElementOpenAttrs"> + <xs:attribute name="soapAction" type="xs:anyURI" use="optional"/> + <xs:attribute name="soapActionRequired" type="xs:boolean" use="optional"/> + <xs:attribute name="style" type="wsoap12:tStyleChoice" use="optional"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="body" type="wsoap12:tBody"/> + <xs:attributeGroup name="tBodyAttributes"> + <!-- The encodingStyle attribute is now a single URI, instead of a list of URIs --> + <xs:attribute name="encodingStyle" type="xs:anyURI" use="optional"/> + <xs:attribute name="use" type="wsoap12:useChoice" use="optional"/> + <xs:attribute name="namespace" type="xs:anyURI" use="optional"/> + </xs:attributeGroup> + <xs:simpleType name="tParts"> + <xs:list itemType="xs:NMTOKEN"/> + </xs:simpleType> + <xs:complexType name="tBody"> + <xs:complexContent> + <xs:extension base="wsoap12:tExtensibilityElementOpenAttrs"> + <xs:attribute name="parts" type="wsoap12:tParts" use="optional"/> + <xs:attributeGroup ref="wsoap12:tBodyAttributes"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:simpleType name="useChoice"> + <xs:restriction base="xs:string"> + <xs:enumeration value="literal"/> + <xs:enumeration value="encoded"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="fault" type="wsoap12:tFault"/> + <xs:complexType name="tFaultRes" abstract="true"> + <xs:complexContent> + <xs:restriction base="wsoap12:tBody"> + <xs:attribute ref="wsdl:required" use="optional"/> + <xs:attribute name="parts" type="wsoap12:tParts" use="prohibited"/> + <xs:attributeGroup ref="wsoap12:tBodyAttributes"/> + </xs:restriction> + </xs:complexContent> + </xs:complexType> + <xs:complexType name="tFault"> + <xs:complexContent> + <xs:extension base="wsoap12:tFaultRes"> + <xs:attribute name="name" type="xs:NCName" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + + <xs:element name="header" type="wsoap12:tHeader"/> + <xs:attributeGroup name="tHeaderAttributes"> + <xs:attribute name="message" type="xs:QName" use="required"/> + <xs:attribute name="part" type="xs:NMTOKEN" use="required"/> + <xs:attribute name="use" type="wsoap12:useChoice" use="required"/> + <xs:attribute name="encodingStyle" type="xs:anyURI" use="optional"/> + <xs:attribute name="namespace" type="xs:anyURI" use="optional"/> + </xs:attributeGroup> + <xs:complexType name="tHeader"> + <xs:complexContent> + <xs:extension base="wsoap12:tExtensibilityElementOpenAttrs"> + <xs:sequence> + <xs:element ref="wsoap12:headerfault" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attributeGroup ref="wsoap12:tHeaderAttributes"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:element name="headerfault" type="wsoap12:tHeaderFault"/> + <xs:complexType name="tHeaderFault"> + <xs:attributeGroup ref="wsoap12:tHeaderAttributes"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + + <xs:element name="address" type="wsoap12:tAddress"/> + <xs:complexType name="tAddress"> + <xs:complexContent> + <xs:extension base="wsoap12:tExtensibilityElementOpenAttrs"> + <xs:attribute name="location" type="xs:anyURI" use="required"/> + </xs:extension> + </xs:complexContent> + </xs:complexType> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/Makefile.am new file mode 100644 index 0000000000..1cc28fe80e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/Makefile.am @@ -0,0 +1,45 @@ +# 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. + +if WANT_ALL + CPP_EXTENSION = cpp + PYTHON_EXTENSION = python + RUBY_EXTENSION = ruby + WSBINDING_EXTENSION = ws + SCABINDING_EXTENSION = sca + RESTBINDING_EXTENSION = rest +endif +if WANT_CPP + CPP_EXTENSION = cpp +endif +if WANT_PYTHON + PYTHON_EXTENSION = python +endif +if WANT_RUBY + RUBY_EXTENSION = ruby +endif + +if WANT_WSBINDING + WSBINDING_EXTENSION = ws +endif +if WANT_SCABINDING + SCABINDING_EXTENSION = sca +endif +if WANT_RESTBINDING + RESTBINDING_EXTENSION = rest +endif +SUBDIRS = ${CPP_EXTENSION} ${WSBINDING_EXTENSION} ${SCABINDING_EXTENSION} ${RESTBINDING_EXTENSION} ${PYTHON_EXTENSION} ${RUBY_EXTENSION} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/Makefile.am new file mode 100644 index 0000000000..3ef2b728b3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +SUBDIRS = src tools + +datadir=$(prefix)/extensions/cpp + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/Makefile.am new file mode 100644 index 0000000000..f234261f5b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/Makefile.am @@ -0,0 +1,55 @@ +# 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. + +libdir=$(prefix)/extensions/cpp/lib + +lib_LTLIBRARIES = libtuscany_sca_cpp.la +includedir=$(prefix)/extensions/cpp/include +nobase_include_HEADERS = \ +osoa/sca/*.h \ +tuscany/sca/cpp/*.h \ +tuscany/sca/cpp/model/*.h + +libtuscany_sca_cpp_la_SOURCES = \ +osoa/sca/ComponentContext.cpp \ +osoa/sca/CompositeContext.cpp \ +tuscany/sca/cpp/ComponentContextImpl.cpp \ +tuscany/sca/cpp/CompositeContextImpl.cpp \ +tuscany/sca/cpp/CPPExtension.cpp \ +tuscany/sca/cpp/CPPImplementationExtension.cpp \ +tuscany/sca/cpp/CPPInterfaceExtension.cpp \ +tuscany/sca/cpp/CPPServiceProxy.cpp \ +tuscany/sca/cpp/CPPServiceWrapper.cpp \ +tuscany/sca/cpp/TuscanyRuntime.cpp \ +tuscany/sca/cpp/model/CPPImplementation.cpp \ +tuscany/sca/cpp/model/CPPInterface.cpp \ +tuscany/sca/cpp/model/CPPReferenceBinding.cpp \ +tuscany/sca/cpp/model/CPPServiceBinding.cpp + +libtuscany_sca_cpp_la_LIBADD = -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca + +INCLUDES = -Imodel -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include + +moduledir=$(prefix)/extensions/cpp/module +extension = libtuscany_sca_cpp$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ComponentContext.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ComponentContext.cpp new file mode 100644 index 0000000000..d686c4c09f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ComponentContext.cpp @@ -0,0 +1,150 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "commonj/sdo/SDO.h" + +#include "osoa/sca/ComponentContext.h" +#include "osoa/sca/ServiceRuntimeException.h" + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/ComponentContextImpl.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace commonj::sdo; +using namespace tuscany::sca; +using namespace tuscany::sca::cpp; +using namespace tuscany::sca::model; + +namespace osoa +{ + namespace sca + { + + // ======================================================= + // getCurrent: create a context from the current component + // ======================================================= + ComponentContext ComponentContext::getCurrent() + { + logentry(); + try + { + Component* component = tuscany::sca::SCARuntime::getCurrentRuntime()->getCurrentComponent(); + if (!component) + { + throwException(ComponentContextException, "No current component"); + } + ComponentContext* cci = new ComponentContextImpl(component); + return ComponentContext(cci); + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + } + + // =========== + // Constructor + // =========== + ComponentContext::ComponentContext(ComponentContext* implementation) + : impl(implementation) + { + logentry(); + } + + // ========== + // Destructor + // ========== + ComponentContext::~ComponentContext() + { + logentry(); + delete impl; + } + + // =================================== + // Copy constructor: create a new impl + // =================================== + ComponentContext::ComponentContext(const ComponentContext& ctx) + { + logentry(); + Component* component = ((ComponentContextImpl*)impl)->getComponent(); + impl = new ComponentContextImpl(component); + } + + // ============================= + // operator= : create a new impl + // ============================= + ComponentContext& ComponentContext::operator=(const ComponentContext& ctx) + { + logentry(); + if (this != &ctx) + { + Component* component = ((ComponentContextImpl*)impl)->getComponent(); + impl = new ComponentContextImpl(component); + } + return *this; + } + + // ========== + // getService + // ========== + void* ComponentContext::getService(const std::string& referenceName) + { + logentry(); + void* service = impl->getService(referenceName); + return service; + } + + // =========== + // getServices + // =========== + std::list<void*> ComponentContext::getServices(const std::string& referenceName) + { + logentry(); + return impl->getServices(referenceName); + } + + // ============ + // getProperties + // ============= + DataObjectPtr ComponentContext::getProperties() + { + logentry(); + DataObjectPtr properties = impl->getProperties(); + return properties; + } + + // ============ + // getDataFactory + // ============= + DataFactoryPtr ComponentContext::getDataFactory() + { + logentry(); + DataFactoryPtr dataFactory = impl->getDataFactory(); + return dataFactory; + } + + + } // End namespace sca +} // End namespace osoa diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ComponentContext.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ComponentContext.h new file mode 100644 index 0000000000..2c305c5161 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ComponentContext.h @@ -0,0 +1,117 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef osoa_sca_componentcontext_h +#define osoa_sca_componentcontext_h + +#include <string> +#include <list> + +#include "commonj/sdo/SDO.h" + +#include "osoa/sca/export.h" + +namespace osoa +{ + namespace sca + { + + /** + * An SCA component implementation uses the ComponentContext class to + * retrieve information about the configured SCA component. + */ + class SCA_CPP_API ComponentContext + { + + public: + /** + * Return a new ComponentContext for the current Component. + */ + static ComponentContext getCurrent(); + + /** + * Resolve a reference name into a single configured service. + * If the component's reference is wired to more than one service + * then theis method will return an exception. + * @param referenceName The reference to be resolved. This must match + * the name of a reference configured in the component type file for + * this component. + */ + virtual void* getService(const std::string& referenceName); + + /** + * Resolve a reference name into a list of configured services. + * @param referenceName The reference to be resolved. This must match + * the name of a reference configured in the component type file for + * this component. + */ + virtual std::list<void*> getServices(const std::string& referenceName); + + /** + * Get the configured properties for the component. + * @return A data object representing all the properties that + * are configured for this component. + */ + virtual commonj::sdo::DataObjectPtr getProperties(); + + /** + * Get an SDO data factory which will allow the component to + * create data objects for all the types configured for this + * component. + * @return A data factory to be used by the component to create + * new data objects. + */ + virtual commonj::sdo::DataFactoryPtr getDataFactory(); + + /** + * Destructor + */ + virtual ~ComponentContext(); + + /** + * Constructor + */ + ComponentContext(const ComponentContext&); + + /** + * Copy operator + */ + ComponentContext& operator=(const ComponentContext&); + + /** + * Constructor to create an interface class from the contained + * implementation. + * @param implementation the actual implementation class + */ + ComponentContext(ComponentContext* implementation); + + private: + + /** + * Pointer to the class which provides the actual implementation. + */ + ComponentContext* impl; + + }; + } // End namespace sca +} // End namespace osoa + +#endif // osoa_sca_componentcontext_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/CompositeContext.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/CompositeContext.cpp new file mode 100644 index 0000000000..d3f06e1b12 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/CompositeContext.cpp @@ -0,0 +1,127 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "commonj/sdo/SDO.h" + +#include "osoa/sca/CompositeContext.h" +#include "osoa/sca/ServiceRuntimeException.h" + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/CompositeContextImpl.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace commonj::sdo; +using namespace tuscany::sca; +using namespace tuscany::sca::cpp; + + +namespace osoa +{ + namespace sca + { + // =========== + // Constructor + // =========== + CompositeContext::CompositeContext(CompositeContext* implementation) + : impl(implementation) + { + logentry(); + } + + // =================================== + // Copy constructor: create a new impl + // =================================== + CompositeContext::CompositeContext(const CompositeContext& ctx) + { + logentry(); + impl = new CompositeContextImpl( + tuscany::sca::SCARuntime::getCurrentRuntime()->getDefaultComponent()); + } + + // ============================= + // operator= : create a new impl + // ============================= + CompositeContext& CompositeContext::operator=(const CompositeContext& ctx) + { + logentry(); + if (this != &ctx) + { + impl = new CompositeContextImpl( + tuscany::sca::SCARuntime::getCurrentRuntime()->getDefaultComponent()); + } + return *this; + } + + // ========== + // Destructor + // ========== + CompositeContext::~CompositeContext() + { + logentry(); + delete impl; + } + + // ==================================================== + // getCurrent: create a context from the current composite + // ==================================================== + CompositeContext CompositeContext::getCurrent() + { + logentry(); + try + { + CompositeContext* cci = new CompositeContextImpl( + tuscany::sca::SCARuntime::getCurrentRuntime()->getDefaultComponent()); + + return CompositeContext(cci); + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + } + + // ============= + // locateService + // ============= + void* CompositeContext::locateService(const std::string& serviceName) + { + logentry(); + void* sp = impl->locateService(serviceName); + return sp; + } + + // ============= + // getDataFactory + // ============= + DataFactoryPtr CompositeContext::getDataFactory() + { + logentry(); + DataFactoryPtr df = impl->getDataFactory(); + return df; + } + + + } // End namespace sca +} // End namespace osoa diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/CompositeContext.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/CompositeContext.h new file mode 100644 index 0000000000..a047f82e46 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/CompositeContext.h @@ -0,0 +1,99 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef osoa_sca_compositecontext_h +#define osoa_sca_compositecontext_h + +#include "commonj/sdo/SDO.h" + +#include "osoa/sca/export.h" + +namespace osoa +{ + namespace sca + { + /** + * An SCA component implementation, or a non-SCA client, uses the + * CompositeContext class to retrieve information about the configured + * SCA composite. + */ + class SCA_CPP_API CompositeContext + { + + public: + /** + * Return a new CompositeContext for the current Component. + */ + static CompositeContext getCurrent(); + + /** + * Resolve a service name into a single component service. + * @param serviceName The name of the service in the form + * "component name"/"service name". The service name is + * optional in the component has one service. + * @return A pointer to an object which can be cast to the + * business interface of the target service. + */ + virtual void* locateService(const std::string& serviceName); + + /** + * Get an SDO data factory which will allow the component to + * create data objects for all the types configured for this + * component. + * @return A data factory to be used by the component to create + * new data objects. + */ + virtual commonj::sdo::DataFactoryPtr getDataFactory(); + + /** + * Destructor. + */ + virtual ~CompositeContext(); + + /** + * Constructor + */ + CompositeContext(const CompositeContext&); + + /** + * Copy operator + */ + CompositeContext& operator=(const CompositeContext&); + + /** + * Constructor to create an interface class from the contained + * implementation. + * @param implementation The actual implementation class. + */ + CompositeContext(CompositeContext* implementation); + + private: + + /** + * Pointer to the class which provides the actual implementation. + */ + CompositeContext* impl; + + }; + } // End namespace sca +} // End namespace osoa + +#endif // osoa_sca_compositecontext_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ServiceRuntimeException.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ServiceRuntimeException.h new file mode 100644 index 0000000000..6d64a32dd6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/ServiceRuntimeException.h @@ -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. + */ + +/* $Rev$ $Date$ */ + +#ifndef osoa_sca_serviceruntimeexception_h +#define osoa_sca_serviceruntimeexception_h + +#include "osoa/sca/export.h" + +#include "tuscany/sca/core/Exceptions.h" + +namespace osoa +{ + namespace sca + { + /** + * Top level exception to represent all the exceptions that may be + * thrown by an SCA runtime implementation. + */ + class SCA_CPP_API ServiceRuntimeException : public tuscany::sca::TuscanyRuntimeException + { + public: + ServiceRuntimeException( + const char *name="ServiceRuntimeException", + severity_level sev=Severe, + const char* msg_text="") + : tuscany::sca::TuscanyRuntimeException(name, sev, msg_text) + { + } + + ServiceRuntimeException(const tuscany::sca::TuscanyRuntimeException& e) + : tuscany::sca::TuscanyRuntimeException(e) + { + } + }; // End ServiceRuntimeException class definition + + /** + * A remotable service is currently unavailable. It is possible that a retry + * may resolve this exception. + */ + class SCA_CPP_API ServiceUnavailableException: public ServiceRuntimeException + { + public: + ServiceUnavailableException(const char* serviceName) + : ServiceRuntimeException("ServiceUnavailableException", Warning, + serviceName) + { + } + private: + }; // End ServiceUnavailableException class definition + + + /** + * The target of a wire cannot be found, or the reference has not been + * configured. + */ + class SCA_CPP_API ServiceNotFoundException: public ServiceRuntimeException + { + public: + ServiceNotFoundException(const char* msg) + : ServiceRuntimeException("ServiceNotFoundException", Error, + msg) + { + } + private: + }; // End ServiceNotFoundException class definition + + + /** + * There is no current component (for example, if a non-SCA component + * tries to get the current ComponentContext). + */ + class SCA_CPP_API ComponentContextException: public ServiceRuntimeException + { + public: + ComponentContextException(const char* msg) + : ServiceRuntimeException("ComponentContextException", Error, + msg) + { + } + private: + }; // End ComponentContextException class definition + + + } // End namespace sca +} // End namespace osoa + +#endif // osoa_sca_serviceruntimeexception_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/export.h new file mode 100644 index 0000000000..8a69913be4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/export.h @@ -0,0 +1,42 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef osoa_sca_export_h +#define osoa_sca_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_CPP_EXPORTS +#define SCA_CPP_API __declspec(dllexport) +#else +#define SCA_CPP_API __declspec(dllimport) +#endif + +#else +#include <sys/time.h> +#include <inttypes.h> +#include <stdlib.h> +#define SCA_CPP_API +#endif + +#endif // osoa_sca_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/sca.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/sca.h new file mode 100644 index 0000000000..6cce9453d7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/osoa/sca/sca.h @@ -0,0 +1,31 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef osoa_sca_sca_h +#define osoa_sca_sca_h + +#include "osoa/sca/export.h" +#include "osoa/sca/CompositeContext.h" +#include "osoa/sca/ComponentContext.h" +#include "osoa/sca/ServiceRuntimeException.h" + +#endif // osoa_sca_sca_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPExtension.cpp new file mode 100644 index 0000000000..74a30fb772 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPExtension.cpp @@ -0,0 +1,72 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/cpp/CPPExtension.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/cpp/CPPImplementationExtension.h" +#include "tuscany/sca/cpp/CPPInterfaceExtension.h" + + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_cpp_initialize() + { + tuscany::sca::cpp::CPPExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + // =================================================================== + // Constructor for the CPPExtension class. + // =================================================================== + CPPExtension::CPPExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the CPPExtension class. + // =================================================================== + CPPExtension::~CPPExtension() + { + logentry(); + } + + void CPPExtension::initialize() + { + logentry(); + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + runtime->registerImplementationExtension(new CPPImplementationExtension()); + runtime->registerInterfaceExtension(new CPPInterfaceExtension()); + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPExtension.h new file mode 100644 index 0000000000..d6c872629d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPExtension.h @@ -0,0 +1,57 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_cppextension_h +#define tuscany_sca_cpp_cppextension_h + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + class CPPExtension + { + public: + /** + * Default constructor + */ + CPPExtension(); + + /** + * Destructor + */ + virtual ~CPPExtension(); + + static void initialize(); + + private: + + }; + + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_cppextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPImplementationExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPImplementationExtension.cpp new file mode 100644 index 0000000000..b5312ab243 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPImplementationExtension.cpp @@ -0,0 +1,101 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/cpp/CPPImplementationExtension.h" +#include "tuscany/sca/cpp/model/CPPImplementation.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::util; +using namespace tuscany::sca::model; + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + // =================================================================== + // Constructor for the CPPImplementationExtension class. + // =================================================================== + CPPImplementationExtension::CPPImplementationExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the CPPImplementationExtension class. + // =================================================================== + CPPImplementationExtension::~CPPImplementationExtension() + { + logentry(); + } + + const string CPPImplementationExtension::extensionName("cpp"); + const string CPPImplementationExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#CPPImplementation"); + + // =================================================================== + // loadModelElement - load the info from implementation.cpp + // =================================================================== + ComponentType* CPPImplementationExtension::getImplementation(Composite *composite, DataObjectPtr scdlImplementation) + { + logentry(); + string library = scdlImplementation->getCString("library"); + string header = scdlImplementation->getCString("header"); + string className = scdlImplementation->getCString("class"); + string scopeName = scdlImplementation->getCString("scope"); + + CPPImplementation::Scope scope; + if (scopeName == "composite") + { + scope = CPPImplementation::COMPOSITE; + } + else + { + scope = CPPImplementation::STATELESS; + } + + string headerPath; + string headerStub; + + // Separate any path element + Utils::rTokeniseString("/", header, headerPath, headerStub); + if (headerPath != "") + { + headerPath += "/"; + } + + // Determine the header stub name + string tmp; + Utils::rTokeniseString(".h", headerStub, headerStub, tmp); + + CPPImplementation* cppImpl = new CPPImplementation( + composite, library, header, headerPath, headerStub, className, scope); + + return cppImpl; + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPImplementationExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPImplementationExtension.h new file mode 100644 index 0000000000..8eb7b88691 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPImplementationExtension.h @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_cppimplementationextension_h +#define tuscany_sca_cpp_cppimplementationextension_h + +#include "tuscany/sca/extension/ImplementationExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + class CPPImplementationExtension : public ImplementationExtension + { + public: + /** + * Default constructor + */ + CPPImplementationExtension(); + + /** + * Destructor + */ + virtual ~CPPImplementationExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema type for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#implementation.cpp") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ComponentType* getImplementation( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlImplementation); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_cppimplementationextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPInterfaceExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPInterfaceExtension.cpp new file mode 100644 index 0000000000..7bb84a7673 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPInterfaceExtension.cpp @@ -0,0 +1,71 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/cpp/CPPInterfaceExtension.h" +#include "tuscany/sca/cpp/model/CPPInterface.h" +#include "tuscany/sca/util/Logging.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + // =================================================================== + // Constructor for the CPPInterfaceExtension class. + // =================================================================== + CPPInterfaceExtension::CPPInterfaceExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the CPPInterfaceExtension class. + // =================================================================== + CPPInterfaceExtension::~CPPInterfaceExtension() + { + logentry(); + } + + const string CPPInterfaceExtension::extensionName("cpp"); + const string CPPInterfaceExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#CPPInterface"); + + // =================================================================== + // loadModelElement - load the info from interface.cpp + // =================================================================== + tuscany::sca::model::Interface* CPPInterfaceExtension::getInterface(Composite* composite, DataObjectPtr scdlInterface) + { + logentry(); + + string header = scdlInterface->getCString("header"); + string className = scdlInterface->getCString("class"); + bool remotable = scdlInterface->getBoolean("remotable"); + + return new CPPInterface(header, className, remotable, false); + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPInterfaceExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPInterfaceExtension.h new file mode 100644 index 0000000000..04ac9f6970 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPInterfaceExtension.h @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_cppinterfaceextension_h +#define tuscany_sca_cpp_cppinterfaceextension_h + +#include "tuscany/sca/extension/InterfaceExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + class CPPInterfaceExtension : public InterfaceExtension + { + public: + /** + * Default constructor + */ + CPPInterfaceExtension(); + + /** + * Destructor + */ + virtual ~CPPInterfaceExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema type for this interface extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.cpp") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::Interface* getInterface( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlInterface); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_cppinterfaceextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceProxy.cpp new file mode 100644 index 0000000000..cc45ea9fb8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceProxy.cpp @@ -0,0 +1,192 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "osoa/sca/ServiceRuntimeException.h" + +#include "tuscany/sca/cpp/CPPServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/cpp/model/CPPImplementation.h" +#include "tuscany/sca/cpp/model/CPPReferenceBinding.h" + +using namespace std; +using namespace osoa::sca; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // ============================ + // Constructor: Create a proxy + // ============================ + CPPServiceProxy::CPPServiceProxy(Reference* reference) + : ServiceProxy(reference) + { + logentry(); + + // ---------------------- + // Get the component + // ---------------------- + Component* component = reference->getComponent(); + string name = reference->getType()->getName(); + + // Get the service wrapper + CPPReferenceBinding* referenceBinding = (CPPReferenceBinding*)reference->getBinding(); + + ServiceWrapper* serviceWrapper = referenceBinding->getTargetServiceBinding()->getServiceWrapper(); + + createProxy(component, name, serviceWrapper); + } + + // ============================ + // Constructor: Create a proxy + // ============================ + CPPServiceProxy::CPPServiceProxy(Service* service) + : ServiceProxy(0) + { + logentry(); + + // ---------------------- + // Get the component + // ---------------------- + Component* component = service->getComponent(); + string name = service->getType()->getName(); + + // Get the service wrapper + ServiceWrapper* serviceWrapper = service->getBinding()->getServiceWrapper(); + + createProxy(component, name, serviceWrapper); + } + + void CPPServiceProxy::createProxy(Component* component, const string& name, ServiceWrapper* serviceWrapper) + { + logentry(); + + ComponentType* componentType = component->getType(); + if (!componentType) + { + string msg = "Component " + component->getName() + " has no implementation defined"; + throwException(ServiceNotFoundException, msg.c_str()); + } + + // If we got here we have a CPP implementation + CPPImplementation* impl = (CPPImplementation *)componentType; + + // ---------------------------------------------------- + // Get implementation dll name and service factory name + // ---------------------------------------------------- + string library = impl->getLibrary(); + string headerStub = impl->getHeaderStub(); + + string fullLibraryName = component->getComposite()->getRoot() + "/" + library; + string proxyFactoryName = headerStub + "_" + name + "_Proxy_Factory"; + string proxyDestructorName = headerStub + "_" + name + "_Proxy_Destructor"; + typedef void* (* PROXYFACTORY) (ServiceWrapper*); + + // ------------ + // Load the dll + // ------------ + proxyLibrary = Library(fullLibraryName); + + // ------------------------- + // Locate the factory method + // ------------------------- + PROXYFACTORY proxyFactory = (PROXYFACTORY)proxyLibrary.getSymbol(proxyFactoryName); + if (!proxyFactory) + { + logerror("Unable to locate %s in library %s", + proxyFactoryName.c_str(), fullLibraryName.c_str()); + string msg = "Unable to locate " + proxyFactoryName + " in library " + fullLibraryName; + throwException(ServiceNotFoundException, msg.c_str()); + } + + // ----------------------------------- + // Now create an instance of the proxy + // ----------------------------------- + void* proxy = proxyFactory(serviceWrapper); + if (!proxy) + { + logerror("Factory method %s in library %s returned null", + proxyFactoryName.c_str(), fullLibraryName.c_str()); + string msg = "Factory method " + proxyFactoryName + " in library " + fullLibraryName + " returned null"; + throwException(ServiceNotFoundException, msg.c_str()); + } + else + { + proxies.push_back(proxy); + } + + // ------------------------- + // Get the destructor method + // ------------------------- + destructor = (PROXYDESTRUCTOR)proxyLibrary.getSymbol(proxyDestructorName); + } + + // ========== + // Destructor + // ========== + CPPServiceProxy::~CPPServiceProxy() + { + logentry(); + + // Delete the proxies + if (destructor != NULL && proxies.size() != 0) + { + destructor(*proxies.begin()); + } + } + + CPPServiceProxy::PROXIES CPPServiceProxy::getProxies() + { + return proxies; + } + + void* CPPServiceProxy::getProxy() + { + logentry(); + + if (proxies.size() != 0) + { + return *proxies.begin(); + } + else + { + return NULL; + } + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceProxy.h new file mode 100644 index 0000000000..8406e9bc44 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceProxy.h @@ -0,0 +1,117 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_cpp_cppserviceproxy_h +#define tuscany_sca_cpp_cppserviceproxy_h + +#include "osoa/sca/export.h" + +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + /** + * Holds a proxy for a given component and reference. + * The proxy which is held inside a ServiceProxy will be specific to the component + * and reference and will have been code generated and be contained in a dll + * created by a developer of an SCA application. + */ + class CPPServiceProxy : public ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + * @param target The wrapper of the service which is wired to this reference. + */ + CPPServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Create a new service proxy for a service. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The service on the target component. + * @param target The wrapper of the target service. + */ + CPPServiceProxy(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~CPPServiceProxy(); + + /** + * Return an instance of the proxy created for this particular component and reference. + * @return The proxy. + */ + virtual void* getProxy(); + + /** + * Return the proxies created for this particular component and reference. + * @return The proxies. + */ + typedef std::list<void*> PROXIES; + virtual PROXIES getProxies(); + + private: + + /** + * Create the proxy + */ + void createProxy(tuscany::sca::model::Component* component, + const std::string& name, + ServiceWrapper* serviceWrapper); + + /** + * Holds the instances of the code generated proxies. + */ + PROXIES proxies; + + /** + * A function pointer to the destructor of the proxy. + */ + typedef void (* PROXYDESTRUCTOR) (void*); + PROXYDESTRUCTOR destructor; + + /** + * The library which contains the code for the proxy. + */ + tuscany::sca::util::Library proxyLibrary; + + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_cppserviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceWrapper.cpp new file mode 100644 index 0000000000..1304ab92a0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceWrapper.cpp @@ -0,0 +1,194 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "osoa/sca/ServiceRuntimeException.h" + +#include "tuscany/sca/cpp/CPPServiceWrapper.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/cpp/model/CPPImplementation.h" +#include "tuscany/sca/model/Interface.h" + +using namespace std; +using namespace osoa::sca; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // =========== + // Constructor + // =========== + CPPServiceWrapper::CPPServiceWrapper(Service* service) + : ServiceWrapper(service) + { + logentry(); + + component = service->getComponent(); + interf = service->getType()->getInterface(); + implementation = (CPPImplementation*)component->getType(); + } + + // ========== + // Destructor + // ========== + CPPServiceWrapper::~CPPServiceWrapper() + { + logentry(); + } + + + // ====================================================================== + // getImplementation: get an implementation for this scope + // ====================================================================== + void* CPPServiceWrapper::getImplementation() + { + logentry(); + if (implementation->getScope() == CPPImplementation::COMPOSITE) + { + // fill the cache if needed + if ( !implementation->getStaticImplementation() ) + { + implementation->setStaticImplementation(newImplementation()); + } + return implementation->getStaticImplementation(); + } + else // (scope == CPPInterface::STATELESS) + { + return newImplementation(); + } + } + + // ====================================================================== + // releaseImplementation: release the implementation for this scope + // ====================================================================== + void CPPServiceWrapper::releaseImplementation() + { + logentry(); + if (implementation->getScope() == CPPImplementation::STATELESS) + { + deleteImplementation(); + } + } + + // ====================================================================== + // invoke: wrapper call to service with setting the component context + // ====================================================================== + void CPPServiceWrapper::invoke(Operation& operation) + { + logentry(); + + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + runtime->setCurrentComponent(component); + + try + { + invokeService(operation); + } + catch (...) + { + runtime->unsetCurrentComponent(); + throw; + } + runtime->unsetCurrentComponent(); + } + + void CPPServiceWrapper::setLibrary(Library* lib) + { + wrapperLibrary = lib; + } + + // ====================================================================== + // getServiceWrapper: create a wrapper for the target ComponentService + // ====================================================================== + CPPServiceWrapper* CPPServiceWrapper::getServiceWrapper(Service* service) + { + logentry(); + + CPPServiceWrapper* serviceWrapper = 0; + + // ----------------------------------------------- + // Get the implementation for the target component + // ----------------------------------------------- + Component* component = service->getComponent(); + CPPImplementation* impl = (CPPImplementation*)component->getType(); + if (!impl) + { + string msg = "Component " + component->getName() + " has no implementation defined"; + throwException(ServiceNotFoundException, msg.c_str()); + } + + // ---------------------------------------------------- + // Get implementation dll name and wrapper factory name + // ---------------------------------------------------- + string libraryName = impl->getLibrary(); + string wrapperFactoryName = impl->getHeaderStub() + + "_" + service->getType()->getName() + "_Wrapper_Factory"; + + // ------------ + // Load the dll + // ------------ + string fullLibraryName = component->getComposite()->getRoot() + "/" + libraryName; + typedef CPPServiceWrapper* (* WRAPPERFACTORY) (Service*); + Library* wrapperLib = new Library(fullLibraryName); + + // ------------------------- + // Locate the factory method + // ------------------------- + WRAPPERFACTORY wrapperFactory = (WRAPPERFACTORY)wrapperLib->getSymbol(wrapperFactoryName); + if (!wrapperFactory) + { + logerror("Unable to locate %s in library %s", + wrapperFactoryName.c_str(), fullLibraryName.c_str()); + string msg = "Unable to locate " + wrapperFactoryName + " in library " + fullLibraryName; + throwException(ServiceNotFoundException, msg.c_str()); + } + + // ------------------------------------- + // Now create an instance of the wrapper + // ------------------------------------- + serviceWrapper = wrapperFactory(service); + if (!serviceWrapper) + { + logerror("Factory method %s in library %s returned null", + wrapperFactoryName.c_str(), fullLibraryName.c_str()); + string msg = "Factory method " + wrapperFactoryName + " in library " + fullLibraryName + " returned null"; + throwException(ServiceNotFoundException, msg.c_str()); + } + serviceWrapper->setLibrary(wrapperLib); + + return serviceWrapper; + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceWrapper.h new file mode 100644 index 0000000000..899deca07a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CPPServiceWrapper.h @@ -0,0 +1,155 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_cppservicewrapper_h +#define tuscany_sca_cpp_cppservicewrapper_h + +#include "osoa/sca/export.h" + +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/cpp/model/CPPImplementation.h" +#include "tuscany/sca/util/Library.h" + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + /** + * Wraps the service on a component implementation. + * This abstract class is extended by generated code which provides + * the implementation of some of the methods. + * An instance of this class wraps the actual component implementation which + * has been written by a developer of an SCA application. + */ + class SCA_CPP_API CPPServiceWrapper : public ServiceWrapper + { + public: + /** + * Factory method to create a new CPPServiceWrapper for a given target + * service. This method will provide all the loading of dlls required to + * create the target component. + * @param target The service on the component for which this wrapper is to be + * created. + * @return A wrapper that references the given target. + */ + static CPPServiceWrapper* getServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Constructor. + * @param target The component service to which this wrapper refers. + */ + CPPServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~CPPServiceWrapper(); + + /** + * All business method calls to the target component go through the invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target component. + */ + virtual void invoke(Operation& operation); + + /** + * Return the loaded shared library for the target component. + */ + tuscany::sca::util::Library* getLibrary() const { return wrapperLibrary; } + + protected: + + /** + * Delegated method to invoke the correct method on the target component. + * Implemented by the subtype. + */ + virtual void invokeService(Operation& operation) = 0; + + /** + * Delegated method to create a new component implementation. + * Implemented by the subtype. + * @return A pointer to an instance of the component implementation class. + */ + virtual void* newImplementation() = 0; + + /** + * Delegated method to delete the current instance of the component + * implementation. + * Implemented by the subtype. + */ + virtual void deleteImplementation() = 0; + + /** + * Return the current instance of the component implementation. + * @return A pointer to an instance of the component implementation class. + */ + virtual void* getImplementation(); + + /** + * Indicates that the current instance of the component implementation + * has been finished with. + * Will call CPPServiceWrapper#deleteImplementation if the + * implementation is stateless (so that a new instance is returned + * for each call). + */ + virtual void releaseImplementation(); + + private: + /** + * The component to which this wrapper refers. + */ + tuscany::sca::model::Component* component; + + /** + * A pointer to the interface which the service exposes. + */ + tuscany::sca::model::Interface* interf; + + /** + * The component implementation + */ + CPPImplementation* implementation; + + /** + * Pointer to the loaded library which contains the component + * implementation. + */ + tuscany::sca::util::Library* wrapperLibrary; + + /** + * Set the loaded library which contains the component + * implementation. + * @param lib The library. + */ + void setLibrary(tuscany::sca::util::Library* lib); + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_cppservicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/ComponentContextImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/ComponentContextImpl.cpp new file mode 100644 index 0000000000..3de0cb968c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/ComponentContextImpl.cpp @@ -0,0 +1,208 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "osoa/sca/ServiceRuntimeException.h" + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/ComponentContextImpl.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ReferenceBinding.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/ServiceBinding.h" + +using namespace std; +using namespace osoa::sca; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // =========== + // Constructor + // =========== + ComponentContextImpl::ComponentContextImpl(Component* comp) + : ComponentContext(0), component(comp) + { + logentry(); + } + + // ========== + // Destructor + // ========== + ComponentContextImpl::~ComponentContextImpl() + { + logentry(); + } + + + // ========================================================================== + // getServices: return a list of Proxies for services wired to this reference + // ========================================================================== + std::list<void*> ComponentContextImpl::getServices(const std::string& referenceName) + { + logentry(); + try + { + // -------------------------------------------------------------- + // locate reference in the current component and determine target + // -------------------------------------------------------------- + Reference* reference = component->findReference(referenceName); + if (!reference) + { + string message = "Reference not defined: "; + message = message + referenceName; + throwException(ServiceNotFoundException, message.c_str()); + } + + // Get a service proxy from the binding configured on the reference + CPPServiceProxy* serviceProxy = (CPPServiceProxy*)reference->getBinding()->getServiceProxy(); + if (serviceProxy == NULL) + { + string message = "Reference "; + message = message + referenceName + " not wired"; + throwException(ServiceNotFoundException, message.c_str()); + } + + return serviceProxy->getProxies(); + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + + } // End getServices() + + + // =================================================================== + // getService: return a Proxy for the services wired to this reference + // =================================================================== + void* ComponentContextImpl::getService(const std::string& referenceName) + { + logentry(); + try + { + // -------------------------------------------------------------- + // locate reference in the current component and determine target + // -------------------------------------------------------------- + Reference* reference = component->findReference(referenceName); + if (!reference) + { + string message = "Reference not defined: "; + message = message + referenceName; + throwException(ServiceNotFoundException, message.c_str()); + } + + // -------------------- + // Validate the request + // -------------------- + switch (reference->getType()->getMultiplicity()) + { + case ReferenceType::ZERO_MANY: + case ReferenceType::ONE_MANY: + { + string message = "getService() called for reference with multiplicity >1 :"; + message = message + referenceName; + throwException(ServiceNotFoundException, message.c_str()); + } + default: + { + } + } // end switch + + // Get a service proxy from the binding configured on the reference + CPPServiceProxy* serviceProxy = (CPPServiceProxy*)reference->getBinding()->getServiceProxy(); + if (serviceProxy == NULL) + { + string message = "Reference "; + message = message + referenceName + " not wired"; + throwException(ServiceNotFoundException, message.c_str()); + } + + void* service = serviceProxy->getProxy(); + + return service; + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + + } // End getService() + + // ============================================== + // getProperties: return the component properties + // ============================================== + DataObjectPtr ComponentContextImpl::getProperties() + { + logentry(); + try + { + DataObjectPtr properties = component->getProperties(); + return properties; + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + } + + // ============================================== + // getDataFactory: return the data factory for the composite in which + // this component resides + // ============================================== + commonj::sdo::DataFactoryPtr ComponentContextImpl::getDataFactory() + { + logentry(); + try + { + commonj::sdo::DataFactoryPtr dataFactory = component->getComposite()->getDataFactory(); + return dataFactory; + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/ComponentContextImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/ComponentContextImpl.h new file mode 100644 index 0000000000..412c276d8c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/ComponentContextImpl.h @@ -0,0 +1,119 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_componentcontextimpl_h +#define tuscany_sca_cpp_componentcontextimpl_h + +#include "osoa/sca/ComponentContext.h" + +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/cpp/CPPServiceProxy.h" + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + /** + * Contains the actual implementation of a ComponentContext interface. + */ + class ComponentContextImpl : public osoa::sca::ComponentContext + { + + public: + /** + * Constructor that takes a Component which represents the runtime + * model for this context. + */ + ComponentContextImpl(tuscany::sca::model::Component* component); + + /** + * Default constructor. + */ + virtual ~ComponentContextImpl(); + + /** + * See ComponentContext. + */ + virtual void* getService(const std::string& referenceName); + + /** + * See ComponentContext. + */ + virtual std::list<void*> getServices(const std::string& referenceName); + + /** + * See ComponentContext. + */ + virtual commonj::sdo::DataObjectPtr getProperties(); + + /** + * See ComponentContext. + */ + virtual commonj::sdo::DataFactoryPtr getDataFactory(); + + /** + * Returns the contained Component. + * @return The Component to which this context refers. + */ + virtual tuscany::sca::model::Component* getComponent() {return component;} + + private: + ComponentContextImpl(const ComponentContextImpl&); + ComponentContextImpl& operator=(const ComponentContextImpl&); + + /** + * Pointer to the runtime model Component to which this + * context refers. + */ + tuscany::sca::model::Component* component; + + /** + * Helper method to return a proxy to a service. + * @param serviceReference The source reference. + * @param target The target to which this source reference is wired. + * @return A pointer to an object which can be cast to the business + * class representing the target. + */ + void* getServiceProxy( + tuscany::sca::model::Reference* serviceReference, + tuscany::sca::model::Service* target); + + /** + * Helper method to return a wrapper for a target service. + * @param target The target for which this wrapper is to be created. + * @return The service wrapper. + */ + ServiceWrapper* getServiceWrapper(tuscany::sca::model::Service* target); + + }; + + } // End namespaca cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_componentcontextimpl_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CompositeContextImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CompositeContextImpl.cpp new file mode 100644 index 0000000000..ae8183231e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CompositeContextImpl.cpp @@ -0,0 +1,128 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "commonj/sdo/SDO.h" + +#include "osoa/sca/ServiceRuntimeException.h" + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/CompositeContextImpl.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/cpp/CPPServiceProxy.h" + +using namespace std; +using namespace commonj::sdo; +using namespace osoa::sca; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // =========== + // Constructor + // =========== + CompositeContextImpl::CompositeContextImpl(Component* component) + : CompositeContext(0), component(component), composite((Composite*)component->getType()) + { + logentry(); + } + + // ========== + // Destructor + // ========== + CompositeContextImpl::~CompositeContextImpl() + { + logentry(); + } + + // =========================================================================== + // locateService: return a proxy connected to a wrapper for the target service + // =========================================================================== + void* CompositeContextImpl::locateService(const std::string& serviceName) + { + logentry(); + try + { + // ---------------------------- + // Locate the component service + // ---------------------------- + Service* service = composite->findComponentService(serviceName); + string msg; + if (!service) + { + msg = "Service not found: "; + msg = msg + serviceName; + throwException(ServiceNotFoundException, msg.c_str()); + } + + // ---------------------------- + // Get a Proxy for this service + // ---------------------------- + + // The locate service API is used from CPP clients so we are using + // our default service proxy here + CPPServiceProxy* serviceProxy = new CPPServiceProxy(service); + return serviceProxy->getProxy(); + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + } + + // ============================================== + // getDataFactory: return the data factory for the current composite + // ============================================== + DataFactoryPtr CompositeContextImpl::getDataFactory() + { + logentry(); + try + { + DataFactoryPtr dataFactory = composite->getDataFactory(); + return dataFactory; + } + catch (ServiceRuntimeException&) + { + throw; + } + catch (TuscanyRuntimeException& e) + { + throwException(ServiceRuntimeException, e); + } + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CompositeContextImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CompositeContextImpl.h new file mode 100644 index 0000000000..ed0bb8b51c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/CompositeContextImpl.h @@ -0,0 +1,89 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_compositecontextimpl_h +#define tuscany_sca_cpp_compositecontextimpl_h + +#include "osoa/sca/CompositeContext.h" + +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/cpp/CPPServiceProxy.h" + +namespace tuscany +{ + namespace sca + { + + namespace cpp + { + + /** + * Contains the actual implementation of a CompositeContext interface. + */ + class CompositeContextImpl : public osoa::sca::CompositeContext + { + + public: + /** + * Constructor that takes a Composite which represents the runtime + * model for this context. + */ + CompositeContextImpl(tuscany::sca::model::Component* component); + + /** + * See CompositeContext#locateService. + */ + virtual void* locateService(const std::string& serviceName); + + /** + * See CompositeContext. + */ + virtual commonj::sdo::DataFactoryPtr getDataFactory(); + + /** + * Destructor. + */ + virtual ~CompositeContextImpl(); + + private: + CompositeContextImpl(const CompositeContextImpl&); + CompositeContextImpl& operator=(const CompositeContextImpl&); + + /** + * Pointer to the runtime model Composite object to which this + * context refers. + */ + tuscany::sca::model::Composite* composite; + + /** + * Pointer to the runtime model Component object to which this + * context refers. + */ + tuscany::sca::model::Component* component; + + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_compositecontextimpl_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/TuscanyRuntime.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/TuscanyRuntime.cpp new file mode 100644 index 0000000000..f8aad90f7a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/TuscanyRuntime.cpp @@ -0,0 +1,83 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/cpp/TuscanyRuntime.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // =================================================================== + // Constructor for the TuscanyRuntime class. + // =================================================================== + TuscanyRuntime::TuscanyRuntime(const string& componentName, const string& root, const string& path) + { + logentry(); + loginfo("System root: %s", root.c_str()); + systemRoot = root; + loginfo("System path: %s", path.c_str()); + systemPath = path; + loginfo("Default component name: %s", componentName.c_str()); + defaultComponentName = componentName; + + runtime = new SCARuntime("", systemRoot, systemPath, "", defaultComponentName); + } + + // =================================================================== + // Destructor for the TuscanyRuntime class. + // =================================================================== + TuscanyRuntime::~TuscanyRuntime() + { + logentry(); + + delete (SCARuntime*)runtime; + } + + // =================================================================== + // Start the runtime. + // =================================================================== + void TuscanyRuntime::start() + { + logentry(); + SCARuntime::setCurrentRuntime((SCARuntime*)runtime); + } + + // =================================================================== + // Stop the runtime. + // =================================================================== + void TuscanyRuntime::stop() + { + logentry(); + SCARuntime::setCurrentRuntime(NULL); + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/TuscanyRuntime.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/TuscanyRuntime.h new file mode 100644 index 0000000000..b4cf31220a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/TuscanyRuntime.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_tuscanyruntime_h +#define tuscany_sca_cpp_tuscanyruntime_h + +#include <string> + +#include "osoa/sca/export.h" + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + /** + * A singleton which represents the executing SCA runtime. + */ + class SCA_CPP_API TuscanyRuntime + { + public: + /** + * Default constructor + */ + TuscanyRuntime(const std::string& defaultComponentName = "", + const std::string& root = "", const std::string& path = ""); + + /** + * Destructor + */ + virtual ~TuscanyRuntime(); + + /** + * start the runtime + */ + void start(); + + /** + * stop the runtime + */ + void stop(); + + + private: + std::string systemRoot; + std::string systemPath; + std::string defaultComponentName; + + void* defaultComponent; + void* runtime; + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_tuscanyruntime_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPImplementation.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPImplementation.cpp new file mode 100644 index 0000000000..56098ced93 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPImplementation.cpp @@ -0,0 +1,90 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/model/CPPImplementation.h" +#include "tuscany/sca/cpp/model/CPPServiceBinding.h" +#include "tuscany/sca/cpp/model/CPPReferenceBinding.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + + namespace cpp + { + + // Constructor + CPPImplementation::CPPImplementation(Composite* composite, const string& library, const string& header, + const string&headerPath, const string& headerStub, const string& className, Scope scope) + : ComponentType(composite, headerPath + headerStub), + library(library), header(header), headerPath(headerPath), + headerStub(headerStub), className(className), scope(scope), staticImpl(0) + { + } + + CPPImplementation::~CPPImplementation() + { + } + + void CPPImplementation::initializeComponent(Component* component) + { + ComponentType::initializeComponent(component); + + // Create CPP bindings for all the services + const Component::SERVICE_MAP& services = component->getServices(); + Component::SERVICE_MAP::const_iterator iter = services.begin(); + for (unsigned int i=0; i< services.size(); i++) + { + Service *service = iter->second; + CPPServiceBinding* binding = new CPPServiceBinding(service); + service->setBinding(binding); + iter++; + } + + // Create CPP bindings for all the references + const Component::REFERENCE_MAP& references = component->getReferences(); + Component::REFERENCE_MAP::const_iterator refiter = references.begin(); + for (unsigned int ri=0; ri< references.size(); ri++) + { + Reference *reference = refiter->second; + CPPReferenceBinding* binding = new CPPReferenceBinding(reference); + reference->setBinding(binding); + refiter++; + } + } + + void CPPImplementation::setStaticImplementation(void* staticImpl) + { + this->staticImpl = staticImpl; + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPImplementation.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPImplementation.h new file mode 100644 index 0000000000..2dfdac616e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPImplementation.h @@ -0,0 +1,163 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_model_cppimplementation_h +#define tuscany_sca_cpp_model_cppimplementation_h + +#include <map> +#include <string> + +#include "tuscany/sca/model/ComponentType.h" + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + /** + * Holds information about an SCA implementation written in C++ + */ + class CPPImplementation : public tuscany::sca::model::ComponentType + { + + public: + /** + * Scope of the component implementation. + */ + enum Scope + { + COMPOSITE, + STATELESS + }; + + /** + * Constructor. + * @param dllName Name of the shared library. + * @param header Name of the header file that contains the class declaring the + * implementation class. + * @param className Name of the class in the header file (could be a blank string + * if this is not specified). + */ + CPPImplementation(tuscany::sca::model::Composite* composite, + const std::string& library, const std::string& header, const std::string&headerPath, + const std::string& headerStub, const std::string& className, Scope scope); + + /** + * Destructor + */ + virtual ~CPPImplementation(); + + /** + * Initialize a component of this type. + * @param component The component to initialize. + */ + virtual void initializeComponent(tuscany::sca::model::Component* component); + + /** + * Returns the name of the shared library. + * @return The name of the shared library. + */ + const std::string& getLibrary() const { return library; } + + /** + * Get the name of the header file. + * @return Name of the header file. + */ + const std::string& getHeader() const { return header; } + + /** + * Get the header file name without the extension. + * @return The name of the header file without any extension. + */ + const std::string& getHeaderStub() const { return headerStub; } + + /** + * Get the header path. + * @return The pathe element of the header. + */ + const std::string& getHeaderPath() const { return headerPath; } + + /** + * Get the name of the class. + * @return The class name if specified. + */ + const std::string& getClass() const { return className; } + + /** + * Returns the implementation scope + */ + Scope getScope() { return scope; } + + /** + * Returns the implementation instance (to be used if the scope is set to composite) + */ + void* getStaticImplementation() { return staticImpl; } + + /** + * Sets the implementation instance (to be used if the scope is set to composite) + */ + void setStaticImplementation(void* staticImpl); + + private: + + /** + * Name of the shared library. + */ + std::string library; + + /** + * Name of the header file describing the interface. + */ + std::string header; + + /** + * Name of the header file without the extension. + */ + std::string headerStub; + + /** + * Path element of the header. + */ + std::string headerPath; + + /** + * Name of the class in the header file declaring the implementation. + * May be an empty string if not set in the SCDL file. + */ + std::string className; + + /** + * Scope of the implementation + */ + Scope scope; + + /** + * Holds the implementation instance if the scope is set to composite. + */ + void* staticImpl; + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_model_cppimplementation_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPInterface.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPInterface.cpp new file mode 100644 index 0000000000..2322d1bdf5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPInterface.cpp @@ -0,0 +1,63 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/cpp/model/CPPInterface.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + const string CPPInterface::typeQName("http://www.osoa.org/xmlns/sca/1.0#CPPInterface"); + + // Constructor + CPPInterface::CPPInterface( + const string& header, + const string& className, + bool remotable, + bool conversational) + : Interface(remotable, conversational), header(header), className(className) + { + string::size_type dot = header.rfind(".h"); // this will also find .hpp + if (dot != string::npos) + { + headerStub = header.substr(0, dot); + } + else + { + headerStub = header; + } + + } + + CPPInterface::~CPPInterface() + { + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPInterface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPInterface.h new file mode 100644 index 0000000000..fdbf314d3d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPInterface.h @@ -0,0 +1,117 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_model_cppinterface_h +#define tuscany_sca_cpp_model_cppinterface_h + +#include <string> + +#include "tuscany/sca/model/Interface.h" + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + /** + * Holds information about an interface described using a C++ + * header file. + */ + class CPPInterface : public tuscany::sca::model::Interface + { + + public: + /** + * Constuctor. + * @param header Name of the header file containing the class that + * describes the interface. + * @param className Name of the class in the header file that + * describes the interface. + * @param scope The scope of the interface (stateless or composite). + * @param remotable True if the interface is remotable. + */ + CPPInterface( + const std::string& header, + const std::string& className, + bool remotable, + bool conversational); + + /** + * Destructor. + */ + virtual ~CPPInterface(); + + /** + * Get the name of the header file. + * @return The name of the header file containing the definition of the + * interface. + */ + const std::string& getHeader() { return header; } + + /** + * Return the name of the header file without the extension. + * @return Header file name without any extension. + */ + const std::string& getHeaderStub() { return headerStub; } + + /** + * Get the name of the class. + * @return The name of the class defining the interface. + */ + const std::string& getClass() { return className; } + + /** + * return the QName of the schema type for this interface type + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.cpp") + */ + virtual const std::string& getInterfaceTypeQName() { return typeQName; }; + + private: + + /** + * Name of the header file containing the definition of the interface. + */ + std::string header; + + /** + * Name of the header file without the extension. + */ + std::string headerStub; + + /** + * Name of the class in the header file. + */ + std::string className; + + /** + * The QName of the schema type for this interface type. + */ + static const std::string typeQName; + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_model_cppinterface_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPReferenceBinding.cpp new file mode 100644 index 0000000000..0c12b7af43 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPReferenceBinding.cpp @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/model/CPPReferenceBinding.h" +#include "tuscany/sca/cpp/CPPServiceProxy.h" + +using namespace tuscany::sca::model; + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // Constructor + CPPReferenceBinding::CPPReferenceBinding(Reference* reference) + : ReferenceBinding(reference, ""), serviceProxy(NULL) + { + } + + // Destructor + CPPReferenceBinding::~CPPReferenceBinding() + { + } + + ServiceProxy* CPPReferenceBinding::getServiceProxy() + { + return serviceProxy; + } + + void CPPReferenceBinding::configure(ServiceBinding* binding) + { + setTargetServiceBinding(binding); + + serviceProxy = new CPPServiceProxy(getReference()); + } + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPReferenceBinding.h new file mode 100644 index 0000000000..9860f14765 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPReferenceBinding.h @@ -0,0 +1,87 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_model_cppreferencebinding_h +#define tuscany_sca_cpp_model_cppreferencebinding_h + +#include <string> + +#include "tuscany/sca/model/ReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + /** + * Information about a CPP service binding for service or a reference. + */ + class CPPReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + * @param port The definition of the port to which the entrypoint + * or external service is to be bound. This is of the form + * "namespace"#endpoint("service"/"port") + */ + CPPReferenceBinding(tuscany::sca::model::Reference* reference); + + /** + * Destructor. + */ + virtual ~CPPReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#CPPImplementationBinding"; }; + + /** + * Create a proxy representing the reference to the + * client component. + */ + virtual ServiceProxy* getServiceProxy(); + + /** + * Configure this binding from a service binding. + */ + virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + private: + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_model_cppreferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPServiceBinding.cpp new file mode 100644 index 0000000000..45afea8375 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPServiceBinding.cpp @@ -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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/cpp/model/CPPServiceBinding.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + + // Constructor + CPPServiceBinding::CPPServiceBinding(Service* service) + : ServiceBinding(service, "") + { + serviceWrapper = CPPServiceWrapper::getServiceWrapper(service); + } + + // Destructor + CPPServiceBinding::~CPPServiceBinding() + { + } + + ServiceWrapper* CPPServiceBinding::getServiceWrapper() + { + return (ServiceWrapper*)serviceWrapper; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPServiceBinding.h new file mode 100644 index 0000000000..13b88a84dd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/src/tuscany/sca/cpp/model/CPPServiceBinding.h @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_cpp_model_cppservicebinding_h +#define tuscany_sca_cpp_model_cppservicebinding_h + +#include <string> + +#include "tuscany/sca/model/ServiceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace cpp + { + /** + * Information about a CPP service binding for service or a reference. + */ + class CPPServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + * @param port The definition of the port to which the entrypoint + * or external service is to be bound. This is of the form + * "namespace"#endpoint("service"/"port") + */ + CPPServiceBinding(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~CPPServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#CPPImplementationBinding"; }; + + /** + * Create a wrapper for the service configured by this + * binding. + */ + virtual ServiceWrapper* getServiceWrapper(); + + private: + + /** + * The wrapper for the service configured by this binding. + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace cpp + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_cpp_model_cppservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/Makefile.am new file mode 100644 index 0000000000..3a97f02513 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/Makefile.am @@ -0,0 +1,25 @@ +# 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. + +if WANT_ALL + CPP_TOOLS = scagen +endif +if WANT_CPP + CPP_TOOLS = scagen +endif + +SUBDIRS = ${CPP_TOOLS}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/LICENSE b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/LICENSE new file mode 100644 index 0000000000..f433b1a53f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/NOTICE b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/NOTICE new file mode 100644 index 0000000000..44befbee63 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/NOTICE @@ -0,0 +1,5 @@ +Apache Tuscany SCA Native +Copyright 2005, 2007 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/)
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/README b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/README new file mode 100644 index 0000000000..2831dadd94 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/META-INF/README @@ -0,0 +1,19 @@ +Apache Tuscany C++ M1 build (July, 2006) +=================================== + +http://incubator.apache.org/tuscany + +Tuscany is an effort undergoing incubation at the Apache Software Foundation +(ASF), sponsored by the Web Services PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness or +stability of the code, it does indicate that the project has yet to be fully +endorsed by the ASF. + +Thank you for using Tuscany! + +The Tuscany Team. diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/Makefile.am new file mode 100644 index 0000000000..59b4d2095f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/Makefile.am @@ -0,0 +1,35 @@ +# 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. + +SUBDIRS = + +BUILT_SOURCES = scagen_build +EXTRA_DIST = build.xml scagen.sh src META-INF +bin_SCRIPTS = scagen.sh + +scagen_build: + ant + touch scagen_build + +clean: + rm -rf build + rm -rf docs + rm -f scagen_build + +install-exec-hook: + cp build/scagen.jar $(bindir) + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/build.xml b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/build.xml new file mode 100644 index 0000000000..23e825a1b4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/build.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + + +<project name="org.apache.tuscany.sca.cpp.tools" default="all" basedir="."> + + <target name="init"> + <property name="build.result.folder" value="${basedir}/build" /> + <property name="temp.folder" value="${basedir}/tmp" /> + <property name="junit.jar.folder" value="${basedir}/lib" /> + <property name="tool.name" value="scagen" /> + <property name="bin.dir" value="${basedir}/../../deploy/bin" /> + </target> + + <!-- Add "test" to the depends list below to add auto-testing to the build --> + <!-- a junit.jar is needed at ${junit.jar.folder}/junit.jar though --> + <target name="all" depends="init,jars,scripts,zip.all"> + </target> + + <target name="test" depends="init,jars,test.jar"> + <java classname="org.apache.tuscany.sca.cpp.tools.junit.TestAllCompositesTest"> + <classpath> + <pathelement location="${build.result.folder}/test.jar" /> + <pathelement location="${junit.jar.folder}/junit.jar" /> + <pathelement location="${build.result.folder}/scagen.jar" /> + <pathelement path="${java.class.path}" /> + </classpath> + </java> + </target> + + + + <target name="doc"> + <javadoc packagenames="org.apache.tuscany.sca.cpp.tools.*" sourcepath="src" defaultexcludes="yes" destdir="docs/api" author="true" version="true" use="true" windowtitle="SCA for C++ Tools"> + <doctitle> + <![CDATA[<h1>SCA for C++ Tools</h1>]]> + </doctitle> + <bottom> + <![CDATA[<i>Copyright 2005 The Apache Software Foundation or its licensors, as applicable.</i>]]></bottom> + <group title="C++ Parser" packages="org.apache.tuscany.sca.cpp.tools.common" /> + <group title="SCA Services Generator" packages="org.apache.tuscany.sca.cpp.tools.services" /> + <link offline="true" href="http://java.sun.com/products/jdk/1.2/docs/api/" packagelistLoc="C:\tmp" /> +</javadoc> +</target> + +<target name="jars" depends="init, scagen.jar, src.jar"> +</target> + +<target name="scripts" depends="init"> +<mkdir dir="${build.result.folder}" /> +</target> + + + +<target name="src.jar" depends="init"> +<delete dir="${temp.folder}/src.jar.bin" /> +<mkdir dir="${temp.folder}/src.jar.bin" /> +<!-- Copy necessary resources i.e XSL stylesheets, test input etc + for the src jar too + --> +<copy todir="${temp.folder}/src.jar.bin" failonerror="true"> + <fileset dir="src/" /> +</copy> +<mkdir dir="${build.result.folder}" /> +<jar jarfile="${build.result.folder}/src.jar" basedir="${temp.folder}/src.jar.bin" /> +<delete dir="${temp.folder}/test.jar.bin" /> +</target> + +<target name="test.jar" depends="init, scagen.jar" unless="test.jar" description="Create jar for unit tests: test.jar."> +<delete dir="${temp.folder}/test.jar.bin" /> +<mkdir dir="${temp.folder}/test.jar.bin" /> +<!-- compile the source code --> +<javac srcdir="junit" destdir="${temp.folder}/test.jar.bin" failonerror="true" includeAntRuntime="no"> + <src path="junit/" /> + <classpath> + <pathelement path="${junit.jar.folder}/junit.jar" /> + <pathelement path="${build.result.folder}/scagen.jar" /> + </classpath> +</javac> +<!-- Copy necessary resources i.e XSL stylesheets, test input etc --> +<copy todir="${temp.folder}/test.jar.bin" failonerror="true"> + <fileset dir="junit/" excludes="testoutput/**" /> +</copy> +<mkdir dir="${build.result.folder}" /> +<jar jarfile="${build.result.folder}/test.jar" basedir="${temp.folder}/test.jar.bin" /> +<delete dir="${temp.folder}/test.jar.bin" /> +</target> + +<target name="scagen.jar" depends="init" unless="scagen.jar" description="Create main jar: scagen.jar"> +<delete dir="${temp.folder}/scagen.jar.bin" /> +<mkdir dir="${temp.folder}/scagen.jar.bin" /> +<!-- compile the source code --> +<javac srcdir="src" destdir="${temp.folder}/scagen.jar.bin" failonerror="true" includeAntRuntime="no"> + <src path="src/" /> +</javac> +<!-- Copy necessary resources i.e XSL stylesheets, test input etc --> +<copy todir="${temp.folder}/scagen.jar.bin" failonerror="true"> + <fileset dir="src/" excludes="**/*.java" /> +</copy> + +<copy todir="${temp.folder}/scagen.jar.bin/META-INF" failonerror="true"> + <fileset dir="META-INF/"/> +</copy> + +<mkdir dir="${build.result.folder}" /> +<jar jarfile="${build.result.folder}/scagen.jar" basedir="${temp.folder}/scagen.jar.bin"> + <manifest> + <attribute name="Main-Class" value="org.apache.tuscany.sca.cpp.tools.services.Scagen" /> + </manifest> +</jar> +<delete dir="${temp.folder}/scagen.jar.bin" /> +</target> + +<target name="tobin" depends="jars, scripts" description="move the desired stuff to bin"> + <move file="${build.result.folder}/scagen.jar" todir="${bin.dir}" /> +</target> + + + +<target name="clean" depends="init" description="Clean of all the files created."> +<delete file="${build.result.folder}/test.jar" /> +<delete file="${build.result.folder}/src.jar" /> +<delete file="${build.result.folder}/scagen.jar" /> +<delete file="${build.result.folder}/org.apache.tuscany.sca.cpp.tools.zip" /> +<delete dir="${temp.folder}" /> +</target> + +<target name="zip.all" depends="jars" description="Create a zip containing everything"> +<delete file="${build.result.folder}/org.apache.tuscany.sca.cpp.tools.zip" /> +<zip zipfile="${build.result.folder}/org.apache.tuscany.sca.cpp.tools.zip" excludes="bin/**,tmp/**,lib/**,junit/testoutput/**" basedir="." filesonly="true" whenempty="skip" update="false" /> +<delete dir="${temp.folder}" /> +</target> + +</project> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/CalculatorTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/CalculatorTest.java new file mode 100644 index 0000000000..13c1273983 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/CalculatorTest.java @@ -0,0 +1,33 @@ +/** + * + * 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.cpp.tools.junit; + +import org.apache.tuscany.sca.cpp.tools.junit.TuscanyTestCase; + +/** + * This test case tests a simple Calculator service tools generation + */ +public class CalculatorTest extends TuscanyTestCase { + + public void testCalculatorCompositeAndComponent() { + testComposite("CalculatorCompositeAndComponent", check_results); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/EnvHandlerTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/EnvHandlerTest.java new file mode 100644 index 0000000000..48d415dd8e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/EnvHandlerTest.java @@ -0,0 +1,48 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite SCA composite as + * input data. + */ +public class EnvHandlerTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public EnvHandlerTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite + * proxy and wrapper generation. + */ + public void testEnvHandler() { + testComposite("MyValueServiceComposite", check_results); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/ImplClassWithNameSpaceButNotInClassAttrTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/ImplClassWithNameSpaceButNotInClassAttrTest.java new file mode 100644 index 0000000000..ca7d50ae48 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/ImplClassWithNameSpaceButNotInClassAttrTest.java @@ -0,0 +1,48 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr SCA composite as + * input data. + */ +public class ImplClassWithNameSpaceButNotInClassAttrTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public ImplClassWithNameSpaceButNotInClassAttrTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr + * proxy and wrapper generation. + */ + public void testEnvHandler() { + testComposite("MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr", check_results); + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/ImplClassWithNameSpaceTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/ImplClassWithNameSpaceTest.java new file mode 100644 index 0000000000..e019873489 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/ImplClassWithNameSpaceTest.java @@ -0,0 +1,48 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite SCA composite as + * input data. + */ +public class ImplClassWithNameSpaceTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public ImplClassWithNameSpaceTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite + * proxy and wrapper generation. + */ + public void testEnvHandler() { + testComposite("MyValueServiceCompositeImplClassWithNamespace", check_results); + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/IntfClassWithNameSpaceButNotInClassAttrTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/IntfClassWithNameSpaceButNotInClassAttrTest.java new file mode 100644 index 0000000000..11cab070b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/IntfClassWithNameSpaceButNotInClassAttrTest.java @@ -0,0 +1,48 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite SCA composite as + * input data. + */ +public class IntfClassWithNameSpaceButNotInClassAttrTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public IntfClassWithNameSpaceButNotInClassAttrTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite + * proxy and wrapper generation. + */ + public void testEnvHandler() { + testComposite("MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr", check_results); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/IntfClassWithNameSpaceTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/IntfClassWithNameSpaceTest.java new file mode 100644 index 0000000000..a26321d2a3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/IntfClassWithNameSpaceTest.java @@ -0,0 +1,48 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite SCA composite as + * input data. + */ +public class IntfClassWithNameSpaceTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public IntfClassWithNameSpaceTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite + * proxy and wrapper generation. + */ + public void testEnvHandler() { + testComposite("MyValueServiceCompositeIntfClassWithNamespace", check_results); + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/MissingCompositeAndFragmentTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/MissingCompositeAndFragmentTest.java new file mode 100644 index 0000000000..e529af0dd0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/MissingCompositeAndFragmentTest.java @@ -0,0 +1,48 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite SCA composite as + * input data. + */ +public class MissingCompositeAndFragmentTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public MissingCompositeAndFragmentTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite + * proxy and wrapper generation. + */ + public void testEnvHandler() { + testComposite("MyValueServiceCompositeMissingScaComposite",false); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/SimplePublicPrivateProtectedTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/SimplePublicPrivateProtectedTest.java new file mode 100644 index 0000000000..3743a1f1f9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/SimplePublicPrivateProtectedTest.java @@ -0,0 +1,49 @@ +/** + * + * 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.cpp.tools.junit; + +/** + * This is a "run this first" testcase that just tests some simple operations of + * the scagen tools it uses the + * Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite SCA composite as + * input data. + */ +public class SimplePublicPrivateProtectedTest extends TuscanyTestCase { + + /** + * Constructor for CustomerInfoTestOLD. + * + * @param arg0 + */ + public SimplePublicPrivateProtectedTest(String arg0) { + super(arg0); + } + + /** + * Test the Hydra.sca.core\test\testSCASystem\composites\MyValueServiceComposite + * proxy and wrapper generation. + */ + public void testEnvHandler() { + + testComposite("SimplePublicPrivateProtectedTest", check_results); + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TestAllCompositesTest.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TestAllCompositesTest.java new file mode 100644 index 0000000000..1f1d2108e5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TestAllCompositesTest.java @@ -0,0 +1,89 @@ +/** + * + * 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.cpp.tools.junit; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +import org.apache.tuscany.sca.cpp.tools.junit.TuscanyTestCase; + +/** + * This test case will test all the composites placed in the "composites" directory + * against the results in their repectice "expected_results" folders. + */ +public class TestAllCompositesTest extends TuscanyTestCase { + + String testsDir = TuscanyTestCase.junit_composites; + + Set excludes = new HashSet(); + + public TestAllCompositesTest(String arg0) { + super(arg0); + excludes.add("MyValueServiceCompositeMissingScaComposite"); + excludes.add("CVS"); + excludes.add(".svn"); + } + + + /* main exists to allow running from the java ant task */ + public static void main(String[] args) { + TestAllCompositesTest test = new TestAllCompositesTest(""); + test.testAllCompositesRegression(); + } + + public void testAllCompositesRegression() { + File dir = new File(testsDir); + + if (dir.isDirectory()) { + System.out.println("Testing all composites under " + + dir.getAbsolutePath()); + String[] test_composites = dir.list(); + + for (int i = 0; i < test_composites.length; i++) { + File test_composite = new File(testsDir, test_composites[i]); + + String composite_name = null; + if (test_composite.isDirectory()) { + composite_name = test_composite.getName(); + if (!excludes.contains(composite_name.intern())) { + testComposite(composite_name, check_results); + System.out.println("Test of composite \"" + composite_name + + "\" passed."); + continue; + } else { + System.out + .println("Ignoring excluded composite subdirectory \"" + + composite_name + "\""); + } + } + } + + } else { + + fail("Test directory is not a directory! \r The variable org.apache.tuscany.sca.cpp.tools.junit.TuscanyTestCase.root sets the location of the junit input data,\r it is currently set as " + + TuscanyTestCase.root + "\rand we expect to find a testinput\\composites directory under there."); + } + + System.out.println("testAllComposites test passed."); + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TestDeployAssistTool.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TestDeployAssistTool.java new file mode 100644 index 0000000000..0d845e1b1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TestDeployAssistTool.java @@ -0,0 +1,97 @@ +/** + * + * 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.cpp.tools.junit; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +/** + * This test case will test all the composites placed in the "composites" directory + * against the results in their repectice "expected_results" folders. + */ +public class TestDeployAssistTool extends TuscanyTestCase { + + String testsDir = TuscanyTestCase.junit_composites; + + Set excludes = new HashSet(); + + public TestDeployAssistTool(String arg0) { + super(arg0); + excludes.add("MyValueServiceCompositeMissingScaComposite"); + excludes.add("CVS"); + } + + /* main exists to allow running from the test script which will + * wrap this test case and pipe the satandard output to somewhere + * for checking. + */ + + public static void main(String[] args) { + TestDeployAssistTool test = new TestDeployAssistTool(""); + test.testDeployToolNullParms(); + } + + public void testDeployTool() { + //Utils.setReportArtefacts(true); + TestAllCompositesTest t = new TestAllCompositesTest(""); + File dir = new File(testsDir); + + if (dir.isDirectory()) { + String[] test_composites = dir.list(); + + for (int i = 0; i < test_composites.length; i++) { + File test_composite = new File(testsDir, test_composites[i]); + String composite_name = null; + if (test_composite.isDirectory()) { + composite_name = test_composite.getName(); + if (!excludes.contains(composite_name.intern())) { + t.testCompositeDeploy(composite_name, create_results, "c:\\colin", "cp"); + } + } + System.out.println(""); + } + } + } + + public void testDeployToolNullParms() { + //Utils.setReportArtefacts(true); + TestAllCompositesTest t = new TestAllCompositesTest(""); + File dir = new File(testsDir); + + if (dir.isDirectory()) { + String[] test_composites = dir.list(); + + for (int i = 0; i < test_composites.length; i++) { + File test_composite = new File(testsDir, test_composites[i]); + String composite_name = null; + if (test_composite.isDirectory()) { + composite_name = test_composite.getName(); + if (!excludes.contains(composite_name.intern())) { + t.testCompositeDeploy(composite_name, create_results, null, null); + } + } + System.out.println(""); + } + } + } +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TuscanyTestCase.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TuscanyTestCase.java new file mode 100644 index 0000000000..5d1fa568d1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/org/apache/tuscany/sca/cpp/tools/junit/TuscanyTestCase.java @@ -0,0 +1,341 @@ +/** + * + * 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.cpp.tools.junit; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.cpp.tools.common.Options; +import org.apache.tuscany.sca.cpp.tools.services.Scagen; + +/** + * A superclass for testcases that can be used to store common functions. + */ +public abstract class TuscanyTestCase extends TestCase { + + public static String root = "d:\\tuscany\\cpp\\sca\\tools\\scagen\\junit\\"; + + public static String junit_composites = root + "testinput\\composites\\"; + + public static String junit_output = root + "testoutput\\"; + + private String testcase = "TESTCASE NOT SET BY SUBCLASS"; + + String input = null; + + String output = null; + + /** + * Check the resulting files with the contents of the expected_results + * folder in the testComposite method + */ + public final static boolean check_results = true; + + /** + * Create test output but do not check it (useful for setting up new + * expected test output + */ + public final static boolean create_results = false; + + /** + * + */ + public TuscanyTestCase() { + super(); + } + + /** + * @param arg0 + */ + public TuscanyTestCase(String arg0) { + super(arg0); + } + + protected void setUp() throws Exception { + super.setUp(); + } + + protected void tearDown() throws Exception { + super.tearDown(); + } + + /** + * Tests to see if two files are the same - this is just a scratch method at + * the moment that flags up testcase output files not matching expected + * results rather than needing to be a fully robust implementation and needs + * a little further work. + * + * @param file1 + * the first file to compare + * @param file2 + * the second file to compare + * + */ + protected boolean areFilesEqual(String file1, String file2) { + + try { + FileInputStream fis1 = new java.io.FileInputStream(file1); + FileInputStream fis2 = new java.io.FileInputStream(file2); + + BufferedReader br1 = new BufferedReader(new InputStreamReader(fis1)); + BufferedReader br2 = new BufferedReader(new InputStreamReader(fis2)); + + String line1 = br1.readLine(); + String line2 = br2.readLine(); + boolean moretodo = (line1 != null) && (line2 != null); + + for (int line = 1; moretodo; line++) { + + if (line1.equals(line2)) { + + line1 = br1.readLine(); + line2 = br2.readLine(); + + } else { + + int l1i, l2i; + + if ((l1i = line1.lastIndexOf("$Id")) > 0) { + //allow CVS strings + line1 = br1.readLine(); + } + + if ((l2i = line2.lastIndexOf("$Id")) > 0) { + //allow CVS strings + line2 = br2.readLine(); + } + + if (l1i == -1 && l2i == -1) { + + // they don't match + System.out.println("file " + file1 + " and file " + + file2); + System.out.println(" don't match at line " + line); + System.out.println("1 is :" + line1); + System.out.println("2 is :" + line2); + + return false; + } + } + + moretodo = (line1 != null) && (line2 != null); + } + + System.out.println("MATCH FOR: file " + file1 + " and file " + + file2); + return true; + + } catch (Throwable t) { + t.printStackTrace(); + return true; + } + + } + + /** + * @param outputDir + */ + protected void clearDirButNotExpectedOutputSubDir(String outputDir) { + File dir = new File(outputDir); + if (dir.isDirectory()) { + String[] files = dir.list(); + for (int i = 0; i < files.length; i++) { + File child = new File(dir, files[i]); + if (child.isDirectory()) { + if (!(child.getName().equals("expected_output") || child.getName().equals(".svn"))) { + clearDirButNotExpectedOutputSubDir(dir + .getAbsolutePath() + + File.separator + files[i]); + } + } + else + { + if( !child.delete() ) + { + System.out.println("File "+outputDir+"/"+child.getName()+" could not be deleted"); + } + } + } + } + + } + + public void testComposite(String composite, boolean check) { + + Options.reset(); + setTestcase(composite); + clearDirButNotExpectedOutputSubDir(output); + + String[] commandLine = new String[] { "-dir", input, "-output", output }; + try { + Scagen.main(commandLine); + } catch (Exception e) { + fail(e.getMessage()); + } + + if (check) { + checkDirWithExpected(output); + } + } + + public void testCompositeDeploy(String composite, boolean check, + String deployDir, String command) { + + Options.reset(); + setTestcase(composite); + clearDirButNotExpectedOutputSubDir(output); + + String[] commandLine; + if (null == deployDir) { + commandLine = new String[] { "-dir", input, "-output", + output, "-deploy"}; + } else { + commandLine = new String[] { "-dir", input, "-output", + output, "-deploy", deployDir, "-command", command }; + } + try { + Scagen.main(commandLine); + } catch (Exception e) { + fail(e.getMessage()); + } + + if (check) { + checkDirWithExpected(output); + } + } + + /** + * @param outputDirName + */ + private void checkDirWithExpected(String outputDirName) { + + File actualDir = new File(outputDirName); + if (actualDir == null || !actualDir.isDirectory()) { + fail("result directory does not exist"); + } + + File expectedDir = new File(outputDirName + File.separator + + "expected_output"); + if (expectedDir == null || !actualDir.isDirectory()) { + fail("can't check results as expected directory does not exist"); + } + + //Check every file in the expected output directory is present + //in the actual directory + + String[] expectedFiles = expectedDir.list(); + + if (expectedFiles == null) { + fail("no expected results for " + expectedDir.getPath()); + } + for (int i = 0; expectedFiles != null && i < expectedFiles.length; i++) { + File expectedFile = new File(expectedDir, expectedFiles[i]); + if (expectedFile.isDirectory()) { + // we can't check subdirectories yet + // and it conveniently skips over "CVS" + } else { + File actualFile = checkFileExistsFailIfNot(actualDir, + expectedFile.getName()); + checkFileHasNoTabsAndEndsInNewline(actualDir, expectedFile + .getName()); + if (!areFilesEqual(expectedFile.getAbsolutePath(), actualFile + .getAbsolutePath())) { + fail("odd output for " + expectedFile.getPath()); + } + + } + + } + + } + + /** + * @param actualDir + * @param name + */ + private File checkFileExistsFailIfNot(File dir, String name) { + + File f = new File(dir, name); + if (f == null || !f.exists() || !f.isFile()) { + fail("Expected result file " + f + " does not exist"); + } + return f; + + } + + /** + * @param actualDir + * @param name + */ + private void checkFileHasNoTabsAndEndsInNewline(File dir, String name) { + + try { + File f = new File(dir, name); + FileInputStream fis = new FileInputStream(f); + InputStreamReader isr = new InputStreamReader(fis); + Reader br = new BufferedReader(isr); + int ch, charBeforeMinusOne = -1; + while ((ch = br.read()) > -1) { + if (ch == '\t') { + fail("found tab in output " + f.getPath()); + } + charBeforeMinusOne = ch; + } + //The last char must be newline; + if (charBeforeMinusOne != '\n') { + fail("last char in file is not a newline in " + "(char is:" + + ch + " " + dir.getName() + File.separator + name); + } + + br.close(); + } catch (IOException e) { + e.printStackTrace(); + fail("io exception in tab/newline checker for " + dir.getName() + + File.separator + name); + return; + } + + } + + /** + * @param testcase + * The testcase to set. + */ + void setTestcase(String testcase) { + this.testcase = testcase; + input = TuscanyTestCase.junit_composites + testcase; + output = TuscanyTestCase.junit_output + testcase; + } + + /** + * @return Returns the testcase. + */ + String getTestcase() { + return testcase; + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/Calculator.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/Calculator.h new file mode 100644 index 0000000000..99c4158d1a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/Calculator.h @@ -0,0 +1,36 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CALCULATOR_H +#define CALCULATOR_H + + +class Calculator { + +private: + virtual long add(long a, long b) = 0; +public: + + virtual long subtract(long a, long b) = 0; +}; + + +#endif // CALCULATOR_H diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/CalculatorImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/CalculatorImpl.componentType new file mode 100644 index 0000000000..a1accb0fda --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/CalculatorImpl.componentType @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+ <service name="CalculatorService">
+ <interface.cpp header="Calculator.h"/> <!-- Header is relative to the composite root -->
+ </service>
+</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/CalculatorImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/CalculatorImpl.h new file mode 100644 index 0000000000..3f97eacef2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/CalculatorImpl.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CALCULATORIMPL_H +#define CALCULATORIMPL_H + +#include "Calculator.h" + +class CalculatorImpl : public Calculator +{ +public: + CalculatorImpl(); + virtual ~CalculatorImpl(); + virtual long add(long a, long b); + virtual long subtract(long a, long b); + +}; + +#endif // diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/sca.composite new file mode 100644 index 0000000000..f2a8e56c58 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorCompositeAndComponent/sca.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9" name="Calculator">
+
+ <component name="Calculator">
+ <implementation.cpp dll="debug/Calculator.dll" header="CalculatorImpl.h"/>
+ </component>
+
+</composite>
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/otherSubFolder/CalculatorBack.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/otherSubFolder/CalculatorBack.h new file mode 100644 index 0000000000..bc14167841 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/otherSubFolder/CalculatorBack.h @@ -0,0 +1,36 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CALCULATOR_H +#define CALCULATOR_H + + +class CalculatorBack { + + + +public: + virtual long subtractBack(long a, long b) = 0; + virtual long addBack(long a, long b) = 0; +}; + + +#endif // CALCULATOR_H diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/otherSubFolder/CalculatorForward.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/otherSubFolder/CalculatorForward.h new file mode 100644 index 0000000000..af140f9575 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/otherSubFolder/CalculatorForward.h @@ -0,0 +1,35 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CALCULATOR_H +#define CALCULATOR_H + + +class CalculatorForward { + +public: + + virtual long subtractForward(long a, long b) = 0; + virtual long addForward(long a, long b) = 0; +}; + + +#endif // CALCULATOR_H diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/sca.composite new file mode 100644 index 0000000000..b3c5778b36 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/sca.composite @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9" name="Calculator">
+
+ <component name="CalculatorForward">
+ <implementation.cpp header="subFolder/CalculatorForwardImpl.h"/>
+ </component>
+
+ <component name="CalculatorBack">
+ <implementation.cpp header="subFolder\CalculatorBackImpl.h"/>
+ </component>
+
+</composite>
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorBackImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorBackImpl.componentType new file mode 100644 index 0000000000..715a4dfc6c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorBackImpl.componentType @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+ <service name="CalculatorService">
+ <interface.cpp header="otherSubFolder\CalculatorBack.h"/> <!-- Header is relative to the composite root -->
+ </service>
+</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorBackImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorBackImpl.h new file mode 100644 index 0000000000..d10bfb4b1a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorBackImpl.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CALCULATORIMPL_H +#define CALCULATORIMPL_H + +#include "Calculator.h" + +class CalculatorBackImpl : public Calculator +{ +public: + CalculatorImpl(); + virtual ~CalculatorImpl(); + virtual long addBack(long a, long b); + virtual long subtractBack(long a, long b); + +}; + +#endif // diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorForwardImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorForwardImpl.componentType new file mode 100644 index 0000000000..0000086167 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorForwardImpl.componentType @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+ <service name="CalculatorService">
+ <interface.cpp header="otherSubFolder/CalculatorForward.h"/> <!-- Header is relative to the composite root -->
+ </service>
+</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorForwardImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorForwardImpl.h new file mode 100644 index 0000000000..182d9d89f2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CalculatorSlashDirectionTest/subFolder/CalculatorForwardImpl.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CALCULATORIMPL_H +#define CALCULATORIMPL_H + +#include "Calculator.h" + +class CalculatorForwardImpl : public Calculator +{ +public: + CalculatorImpl(); + virtual ~CalculatorImpl(); + virtual long addForward(long a, long b); + virtual long subtractForward(long a, long b); + +}; + +#endif // diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfo.fragment b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfo.fragment new file mode 100644 index 0000000000..733b4700e7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfo.fragment @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo.dll" class="CustomerInfoImpl" header="CustomerInfoImpl.h"></implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfo.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfo.h new file mode 100644 index 0000000000..d1a634999c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfo.h @@ -0,0 +1,98 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfo_h +#define CustomerInfo_h + +class CustomerInfo +{ +public: +//char (simple extra type) + virtual const char* getCustomerInformationChar(char * p1, const char* customerID ) = 0; + virtual const char* getCustomerInfoAChar(char * p1,const char*) = 0; + virtual const char* getCustomerInfoBChar(char * p1, char* customerID ) = 0; + virtual const char* getCustomerInfoCChar(char * p1, char customerID ) = 0; + virtual const char* getCustomerInfoDChar(char * p1,char) = 0; + virtual const char* getCustomerInfoEChar(char * p1 , char *) = 0; + virtual const char* getCustomerInfoFChar(char * p1, char * p1, char *customerID ) = 0; + virtual const char* getCustomerInfoGChar(char * p1, char *, char * p1,signed char *customerID ) = 0; + virtual const char* getCustomerInfoHChar(unsigned char *customerID, const char, ) = 0; + virtual const char* getCustomerInfoHChar(unsigned char *customerID, const char*) = 0; + +//long (duplicate the types) + virtual const long* getCustomerInformationLong(const long* customerID, const long* customerID ) = 0; + virtual const long* getCustomerInfoALong(const long*,const long*) = 0; + virtual const long* getCustomerInfoBLong(long* customerID, long* customerID2 ) = 0; + virtual const long* getCustomerInfoCLong(long customerID , long customerID2 ) = 0; + virtual const long* getCustomerInfoDLong(long,long) = 0; + virtual const long* getCustomerInfoELong(long *, long*) = 0; + virtual const long* getCustomerInfoFLong(long *customerID, long* customerID2 ) = 0; + virtual const long* getCustomerInfoGLong(signed long *customerID, signed long *customerID2 ) = 0; + virtual const long* getCustomerInfoHLong(signed long *customerID, signed long *customerID2 ) = 0; + +//int + virtual const int* getCustomerInformationInt(char*, const int* customerID ) = 0; + virtual const int* getCustomerInfoAInt(char*,const int*) = 0; + virtual const int* getCustomerInfoBInt(char*,int* customerID ) = 0; + virtual const int* getCustomerInfoCInt(char*,int customerID ) = 0; + virtual const int* getCustomerInfoDInt(char*,int) = 0; + virtual const int* getCustomerInfoEInt(char*,int *) = 0; + virtual const int* getCustomerInfoFInt(char*,int *customerID ) = 0; + virtual const int* getCustomerInfoGInt(char*,signed int *customerID ) = 0; + virtual const int* getCustomerInfoHInt(char*,unsigned int *customerID ) = 0; + + +//__int64 + virtual const __int64* getCustomerInformationint64(Diamond&,const __int64* customerID ) = 0; + virtual const __int64* getCustomerInfoAint64(Diamond&, const __int64*) = 0; + virtual const __int64* getCustomerInfoBint64( Diamond&, __int64* customerID ) = 0; + virtual const __int64* getCustomerInfoCint64(Diamond&,__int64 customerID ) = 0; + virtual const __int64* getCustomerInfoDint64(Diamond& myDiamond,__int64) = 0; + virtual const __int64* getCustomerInfoEint64(Diamond& myDiamond, __int64 *) = 0; + virtual const __int64* getCustomerInfoFint64(Diamond& myDiamond, __int64 *customerID ) = 0; + virtual const __int64* getCustomerInfoGint64(Diamond& myDiamond, signed __int64 *customerID ) = 0; + virtual const __int64* getCustomerInfoHint64(const Diamond& myDiamond, unsigned int64 *customerID ) = 0; + +//void + virtual const void* getCustomerInformationVoid(float& f, const __int64* customerID ) = 0; + virtual void getCustomerInfoAVoid(const float& f, const __int64*) = 0; + virtual void getCustomerInfoBVoid( ) = 0; + virtual void getCustomerInfoCVoid() = 0; + virtual void getCustomerInfoDVoid(void) = 0; + virtual char getCustomerInfoEVoid(void) = 0; + virtual char getCustomerInfoFVoid() = 0; + virtual char getCustomerInfoGVoid( void ) = 0; + +//inline + virtual inline const char * getCustomerInfoAInline(int,int,int,int, char* customer id) = 0; + inline int getCustomerInfoBInline(int*,int* f, int* g, char* customer id) = 0; + virtual inline friend const unsigned int * getCustomerInfoCInline(char* customer id) = 0; + +//tricky examples + int getCustomerInfoTrickyA(const char, const char) = 0; + int getCustomerInfoTrickyB(int myInt, int myInt) = 0; + + + + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfoImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfoImpl.componentType new file mode 100644 index 0000000000..c2cfd3b399 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfoImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CustomerInfoService">
+ <interface.cpp header="/CustomerInfo.h">
+ </interface.cpp>
+ </service>
+
+ <property name="Fred" type="xs:string"/>
+ <property name="Joe" type="xs:integer" many="true"/>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfoImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfoImpl.h new file mode 100644 index 0000000000..c325a90b1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplMultiParamDiffTypesTest/CustomerInfoImpl.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfoImpl_h +#define CustomerInfoImpl_h + +#include "CustomerInfo.h" + + + +class CustomerInfoImpl : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfo.fragment b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfo.fragment new file mode 100644 index 0000000000..cb63dd1f06 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfo.fragment @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo" class="CustomerInfoImpl" header="CustomerInfoImpl.h"></implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfo.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfo.h new file mode 100644 index 0000000000..85fac59da8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfo.h @@ -0,0 +1,94 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfo_h +#define CustomerInfo_h + +class CustomerInfo +{ +public: +//char + virtual const char* getCustomerInformationChar(const char* customerID ) = 0; + virtual const char* getCustomerInfoAChar(const char*) = 0; + virtual const char* getCustomerInfoBChar(char* customerID ) = 0; + virtual const char* getCustomerInfoCChar(char customerID ) = 0; + virtual const char* getCustomerInfoDChar(char) = 0; + virtual const char* getCustomerInfoEChar(char *) = 0; + virtual const char* getCustomerInfoFChar(char *customerID ) = 0; + virtual const char* getCustomerInfoGChar(signed char *customerID ) = 0; + virtual const char* getCustomerInfoHChar(unsigned char *customerID ) = 0; + +//long + virtual const long* getCustomerInformationLong(const long* customerID ) = 0; + virtual const long* getCustomerInfoALong(const long*) = 0; + virtual const long* getCustomerInfoBLong(long* customerID ) = 0; + virtual const long* getCustomerInfoCLong(long customerID ) = 0; + virtual const long* getCustomerInfoDLong(long) = 0; + virtual const long* getCustomerInfoELong(long *) = 0; + virtual const long* getCustomerInfoFLong(long *customerID ) = 0; + virtual const long* getCustomerInfoGLong(signed long *customerID ) = 0; + virtual const long* getCustomerInfoHLong(unsigned long *customerID ) = 0; + +//int + virtual const int* getCustomerInformationInt(const int* customerID ) = 0; + virtual const int* getCustomerInfoAInt(const int*) = 0; + virtual const int* getCustomerInfoBInt(int* customerID ) = 0; + virtual const int* getCustomerInfoCInt(int customerID ) = 0; + virtual const int* getCustomerInfoDInt(int) = 0; + virtual const int* getCustomerInfoEInt(int *) = 0; + virtual const int* getCustomerInfoFInt(int *customerID ) = 0; + virtual const int* getCustomerInfoGInt(signed int *customerID ) = 0; + virtual const int* getCustomerInfoHInt(unsigned int *customerID ) = 0; + + +//__int64 + virtual const __int64* getCustomerInformationint64(const __int64* customerID ) = 0; + virtual const __int64* getCustomerInfoAint64(const __int64*) = 0; + virtual const __int64* getCustomerInfoBint64(__int64* customerID ) = 0; + virtual const __int64* getCustomerInfoCint64(__int64 customerID ) = 0; + virtual const __int64* getCustomerInfoDint64(__int64) = 0; + virtual const __int64* getCustomerInfoEint64(__int64 *) = 0; + virtual const __int64* getCustomerInfoFint64(__int64 *customerID ) = 0; + virtual const __int64* getCustomerInfoGint64(signed __int64 *customerID ) = 0; + virtual const __int64* getCustomerInfoHint64(unsigned int64 *customerID ) = 0; + +//void + virtual const void* getCustomerInformationVoid(const __int64* customerID ) = 0; + virtual void getCustomerInfoAVoid(const __int64*) = 0; + virtual void getCustomerInfoBVoid( ) = 0; + virtual void getCustomerInfoCVoid() = 0; + virtual void getCustomerInfoDVoid(void) = 0; + +//inline + virtual inline const char * getCustomerInfoAInline(char* customer id) = 0; + inline int getCustomerInfoBInline(char* customer id) = 0; + virtual inline friend const unsigned int * getCustomerInfoCInline(char* customer id) = 0; + +//tricky examples + int getCustomerInfoTrickyA(const char) = 0; + int getCustomerInfoTrickyB(int myInt) = 0; + + + + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfoImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfoImpl.componentType new file mode 100644 index 0000000000..c2cfd3b399 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfoImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CustomerInfoService">
+ <interface.cpp header="/CustomerInfo.h">
+ </interface.cpp>
+ </service>
+
+ <property name="Fred" type="xs:string"/>
+ <property name="Joe" type="xs:integer" many="true"/>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfoImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfoImpl.h new file mode 100644 index 0000000000..95b70c3017 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/CustomerInfoImplSingleParamDiffTypesTest/CustomerInfoImpl.h @@ -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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfoImpl_h +#define CustomerInfoImpl_h + +#include "CustomerInfo.h" + + + +class CustomerInfoImpl : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; + +class CustomerInfoImpl2 : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation2(const char* customerID); + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfo.fragment b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfo.fragment new file mode 100644 index 0000000000..5c5cb78b87 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfo.fragment @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo" class="CustomerInfoImpl2" header="CustomerInfoImpl.h"></implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfo.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfo.h new file mode 100644 index 0000000000..7bd355b3ab --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfo.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ +#ifndef CustomerInfo_h +#define CustomerInfo_h + +class CustomerInfo +{ +public: + virtual const char* getCustomerInformation(const char* customerID) = 0; + +}; + + +class CustomerInfoSecond +{ +public: + virtual const char* getCustomerInformationSecond(const char* customerID) = 0; + +}; + + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfoImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfoImpl.componentType new file mode 100644 index 0000000000..c2cfd3b399 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfoImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CustomerInfoService">
+ <interface.cpp header="/CustomerInfo.h">
+ </interface.cpp>
+ </service>
+
+ <property name="Fred" type="xs:string"/>
+ <property name="Joe" type="xs:integer" many="true"/>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfoImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfoImpl.h new file mode 100644 index 0000000000..540873174b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/CustomerInfoImpl.h @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// Class definition for the implementation + +#ifndef CustomerInfoImpl_h +#define CustomerInfoImpl_h + +#include "CustomerInfo.h" + + + +class CustomerInfoImpl : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; + +class CustomerInfoImpl2 : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation2(const char* customerID); + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValue.h new file mode 100644 index 0000000000..4334c82eca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValue.h @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// MyValue.h: interface for the MyValueImpl class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef MyValue_h +#define MyValue_h +#include <string> +using std::string; +class MyValue +{ +public: + virtual float getMyValue(const char* customerID) = 0; + virtual float getMyValueS(const string& customerID) = 0; + virtual string getCustname(string& customerID) = 0; + virtual const string& getCustnamecs(string customerID) = 0; + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl.componentType new file mode 100644 index 0000000000..c4e3b35675 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl.componentType @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="MyValueService">
+ <interface.cpp class="MyValue" header="MyValue.h">
+ </interface.cpp>
+ </service>
+
+ <reference name="customerInfo">
+ <interface.cpp header="CustomerInfo.h">
+ </interface.cpp>
+ </reference>
+
+ <reference name="stockQuote">
+ <interface.cpp header="StockQuoteService.h">
+ </interface.cpp>
+ </reference>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl.hpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl.hpp new file mode 100644 index 0000000000..98a342fcb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl.hpp @@ -0,0 +1,43 @@ +/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+// Class definition for the implementation
+
+#ifndef MyValueImpl_h
+#define MyValueImpl_h
+
+#include "MyValue.h"
+
+
+
+class MyValueImpl : public MyValue
+{
+public:
+ MyValueImpl();
+ virtual ~MyValueImpl();
+ virtual float getMyValue(const char* customerID);
+ virtual float getMyValueS(const string& customerID);
+ virtual string getCustname(string& customerID);
+ virtual const string& getCustnamecs(string customerID);
+
+};
+
+#endif
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl_stockQuote_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl_stockQuote_Proxy.h new file mode 100644 index 0000000000..3f9feeed30 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/MyValueImpl_stockQuote_Proxy.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef MyValueImpl_stockQuote_Proxy_h +#define MyValueImpl_stockQuote_Proxy_h + +#include "StockQuoteService.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_stockQuote_Proxy : public StockQuoteService +{ +public: + MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_stockQuote_Proxy(); + virtual commonj::sdo::DataObjectPtr GetStockQuotes(commonj::sdo::DataObjectPtr); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_stockQuote_Proxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/StockQuoteService.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/StockQuoteService.h new file mode 100644 index 0000000000..6a8fd51534 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/StockQuoteService.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// +////////////////////////////////////////////////////////////////////// + +#ifndef StockQuoteService_h +#define StockQuoteService_h +#include <string> +#include "commonj/sdo/sdo.h" +using std::string; +class StockQuoteService +{ +public: + virtual commonj::sdo::DataObjectPtr GetStockQuotes(commonj::sdo::DataObjectPtr request) = 0; + +}; + +#endif // StockQuoteService_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/sca.composite new file mode 100644 index 0000000000..9a5cfd8da5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceComposite/sca.composite @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--
+ <component name="Calculator">
+ <implementation.cpp dll="debug/Calculator.dll" header="CalculatorImpl.h"/>
+ </component>
+ -->
+
+ <externalService name="StockQuoteService">
+ <interface.cpp header="StockQuoteService.h"/>
+ <binding.ws port="http://swanandmokashi.com#wsdl.endpoint(StockQuotes/StockQuotesSoap)"/>
+ </externalService>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfo.fragment b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfo.fragment new file mode 100644 index 0000000000..48d34f7957 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfo.fragment @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo" class="Other::CustomerInfoImpl" header="CustomerInfoImpl.h"></implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfo.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfo.h new file mode 100644 index 0000000000..928480df1f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfo.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfo_h +#define CustomerInfo_h + +class CustomerInfo +{ +public: + virtual const char* getCustomerInformation(const char* customerID) = 0; + +}; + + +class CustomerInfoSecond +{ +public: + virtual const char* getCustomerInformationSecond(const char* customerID) = 0; + +}; + + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfoImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfoImpl.componentType new file mode 100644 index 0000000000..c2cfd3b399 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfoImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CustomerInfoService">
+ <interface.cpp header="/CustomerInfo.h">
+ </interface.cpp>
+ </service>
+
+ <property name="Fred" type="xs:string"/>
+ <property name="Joe" type="xs:integer" many="true"/>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfoImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfoImpl.h new file mode 100644 index 0000000000..8d2f810db0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/CustomerInfoImpl.h @@ -0,0 +1,52 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// Class definition for the implementation + +#ifndef CustomerInfoImpl_h +#define CustomerInfoImpl_h + +#include "CustomerInfo.h" + + +/* +class CustomerInfoImpl : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; + +*/ +namespace Other { + class CustomerInfoImpl : public CustomerInfo + { + public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformationOther(const char* customerID); + + }; +} + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValue.h new file mode 100644 index 0000000000..4334c82eca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValue.h @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// MyValue.h: interface for the MyValueImpl class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef MyValue_h +#define MyValue_h +#include <string> +using std::string; +class MyValue +{ +public: + virtual float getMyValue(const char* customerID) = 0; + virtual float getMyValueS(const string& customerID) = 0; + virtual string getCustname(string& customerID) = 0; + virtual const string& getCustnamecs(string customerID) = 0; + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl.componentType new file mode 100644 index 0000000000..c4e3b35675 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl.componentType @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="MyValueService">
+ <interface.cpp class="MyValue" header="MyValue.h">
+ </interface.cpp>
+ </service>
+
+ <reference name="customerInfo">
+ <interface.cpp header="CustomerInfo.h">
+ </interface.cpp>
+ </reference>
+
+ <reference name="stockQuote">
+ <interface.cpp header="StockQuoteService.h">
+ </interface.cpp>
+ </reference>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl.hpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl.hpp new file mode 100644 index 0000000000..98a342fcb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl.hpp @@ -0,0 +1,43 @@ +/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+// Class definition for the implementation
+
+#ifndef MyValueImpl_h
+#define MyValueImpl_h
+
+#include "MyValue.h"
+
+
+
+class MyValueImpl : public MyValue
+{
+public:
+ MyValueImpl();
+ virtual ~MyValueImpl();
+ virtual float getMyValue(const char* customerID);
+ virtual float getMyValueS(const string& customerID);
+ virtual string getCustname(string& customerID);
+ virtual const string& getCustnamecs(string customerID);
+
+};
+
+#endif
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl_stockQuote_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl_stockQuote_Proxy.h new file mode 100644 index 0000000000..3f9feeed30 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/MyValueImpl_stockQuote_Proxy.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef MyValueImpl_stockQuote_Proxy_h +#define MyValueImpl_stockQuote_Proxy_h + +#include "StockQuoteService.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_stockQuote_Proxy : public StockQuoteService +{ +public: + MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_stockQuote_Proxy(); + virtual commonj::sdo::DataObjectPtr GetStockQuotes(commonj::sdo::DataObjectPtr); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_stockQuote_Proxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/StockQuoteService.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/StockQuoteService.h new file mode 100644 index 0000000000..6a8fd51534 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/StockQuoteService.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// +////////////////////////////////////////////////////////////////////// + +#ifndef StockQuoteService_h +#define StockQuoteService_h +#include <string> +#include "commonj/sdo/sdo.h" +using std::string; +class StockQuoteService +{ +public: + virtual commonj::sdo::DataObjectPtr GetStockQuotes(commonj::sdo::DataObjectPtr request) = 0; + +}; + +#endif // StockQuoteService_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/sca.composite new file mode 100644 index 0000000000..9a5cfd8da5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespace/sca.composite @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--
+ <component name="Calculator">
+ <implementation.cpp dll="debug/Calculator.dll" header="CalculatorImpl.h"/>
+ </component>
+ -->
+
+ <externalService name="StockQuoteService">
+ <interface.cpp header="StockQuoteService.h"/>
+ <binding.ws port="http://swanandmokashi.com#wsdl.endpoint(StockQuotes/StockQuotesSoap)"/>
+ </externalService>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValue.h new file mode 100644 index 0000000000..90835ca4af --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValue.h @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// MyValue.h: interface for the MyValueImpl class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef MyValue_h +#define MyValue_h +#include <string> +using std::string; + +class MyValue +{ + public: + virtual float getMyValueOther(const char* customerID) = 0; + virtual float getMyValueSOther(const string& customerID) = 0; + virtual string getCustnameOther(string& customerID) = 0; + virtual const string& getCustnamecsOther(string customerID) = 0; +} + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValueImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValueImpl.componentType new file mode 100644 index 0000000000..785be08b72 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValueImpl.componentType @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="MyValueService">
+ <interface.cpp header="MyValue.h">
+ </interface.cpp>
+ </service>
+
+</componentType>
+
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValueImpl.hpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValueImpl.hpp new file mode 100644 index 0000000000..04a785cd26 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/MyValueImpl.hpp @@ -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. + */ + +/* $Rev$ $Date$ */ +// Class definition for the implementation + +#ifndef MyValueImpl_h +#define MyValueImpl_h + +#include "MyValue.h" + + +namespace myvaluecorp +{ + namespace implns + { + + class MyValueImpl : public MyValue + { + public: + MyValueImpl(); + virtual ~MyValueImpl(); + virtual float getMyValue(const char* customerID); + virtual float getMyValueS(const string& customerID); + virtual string getCustname(string& customerID); + virtual const string& getCustnamecs(string customerID); + + }; + } +} +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/sca.composite new file mode 100644 index 0000000000..3e3c22a07b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/sca.composite @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValue.h new file mode 100644 index 0000000000..bbfcf15ed1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValue.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// MyValue.h: interface for the MyValueImpl class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef MyValue_h +#define MyValue_h +#include <string> +using std::string; + +namespace Other { + class MyValue + { + public: + virtual float getMyValueOther(const char* customerID) = 0; + virtual float getMyValueSOther(const string& customerID) = 0; + virtual string getCustnameOther(string& customerID) = 0; + virtual const string& getCustnamecsOther(string customerID) = 0; + } +} + + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValueImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValueImpl.componentType new file mode 100644 index 0000000000..42cc4e9827 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValueImpl.componentType @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="MyValueService">
+ <interface.cpp class="Other::MyValue" header="MyValue.h">
+ </interface.cpp>
+ </service>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValueImpl.hpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValueImpl.hpp new file mode 100644 index 0000000000..98a342fcb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/MyValueImpl.hpp @@ -0,0 +1,43 @@ +/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+// Class definition for the implementation
+
+#ifndef MyValueImpl_h
+#define MyValueImpl_h
+
+#include "MyValue.h"
+
+
+
+class MyValueImpl : public MyValue
+{
+public:
+ MyValueImpl();
+ virtual ~MyValueImpl();
+ virtual float getMyValue(const char* customerID);
+ virtual float getMyValueS(const string& customerID);
+ virtual string getCustname(string& customerID);
+ virtual const string& getCustnamecs(string customerID);
+
+};
+
+#endif
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/sca.composite new file mode 100644 index 0000000000..510bf36337 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespace/sca.composite @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValue.h new file mode 100644 index 0000000000..10c59480a8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValue.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// MyValue.h: interface for the MyValueImpl class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef MyValue_h +#define MyValue_h +#include <string> +using std::string; + +namespace Other { + class MyValue + { + public: + virtual float getMyValueOther(const char* customerID) = 0; + virtual float getMyValueSOther(const string& customerID) = 0; + virtual string getCustnameOther(string& customerID) = 0; + virtual const string& getCustnamecsOther(string customerID) = 0; + } +} +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValueImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValueImpl.componentType new file mode 100644 index 0000000000..ddb463e3d7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValueImpl.componentType @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="MyValueService">
+ <interface.cpp header="MyValue.h">
+ </interface.cpp>
+ </service>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValueImpl.hpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValueImpl.hpp new file mode 100644 index 0000000000..98a342fcb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/MyValueImpl.hpp @@ -0,0 +1,43 @@ +/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+// Class definition for the implementation
+
+#ifndef MyValueImpl_h
+#define MyValueImpl_h
+
+#include "MyValue.h"
+
+
+
+class MyValueImpl : public MyValue
+{
+public:
+ MyValueImpl();
+ virtual ~MyValueImpl();
+ virtual float getMyValue(const char* customerID);
+ virtual float getMyValueS(const string& customerID);
+ virtual string getCustname(string& customerID);
+ virtual const string& getCustnamecs(string customerID);
+
+};
+
+#endif
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/sca.composite new file mode 100644 index 0000000000..510bf36337 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/sca.composite @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeMissingScaComposite/CustomerInfo.fragmentX b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeMissingScaComposite/CustomerInfo.fragmentX new file mode 100644 index 0000000000..717ce02ede --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeMissingScaComposite/CustomerInfo.fragmentX @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo" class="CustomerInfoImpl2" header="CustomerInfoImpl.h"></implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeMissingScaComposite/sca.compositeX b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeMissingScaComposite/sca.compositeX new file mode 100644 index 0000000000..bbda577c28 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeMissingScaComposite/sca.compositeX @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--
+ <component name="Calculator">
+ <implementation.cpp dll="debug/Calculator.dll" header="CalculatorImpl.h"/>
+ </component>
+ -->
+
+ <externalService name="StockQuoteService">
+ <interface.cpp header="StockQuoteService.h"/>
+ <binding.ws port="http://swanandmokashi.com#wsdl.endpoint(StockQuotes/StockQuotesSoap)"/>
+ </externalService>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfo.fragment b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfo.fragment new file mode 100644 index 0000000000..5c5cb78b87 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfo.fragment @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo" class="CustomerInfoImpl2" header="CustomerInfoImpl.h"></implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfo.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfo.h new file mode 100644 index 0000000000..928480df1f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfo.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfo_h +#define CustomerInfo_h + +class CustomerInfo +{ +public: + virtual const char* getCustomerInformation(const char* customerID) = 0; + +}; + + +class CustomerInfoSecond +{ +public: + virtual const char* getCustomerInformationSecond(const char* customerID) = 0; + +}; + + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfoImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfoImpl.componentType new file mode 100644 index 0000000000..c2cfd3b399 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfoImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CustomerInfoService">
+ <interface.cpp header="/CustomerInfo.h">
+ </interface.cpp>
+ </service>
+
+ <property name="Fred" type="xs:string"/>
+ <property name="Joe" type="xs:integer" many="true"/>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfoImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfoImpl.h new file mode 100644 index 0000000000..c275383ab4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/CustomerInfoImpl.h @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// Class definition for the implementation + +#ifndef CustomerInfoImpl_h +#define CustomerInfoImpl_h + +#include "CustomerInfo.h" + + + +class CustomerInfoImpl : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; + +class CustomerInfoImpl2 : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValue.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValue.h new file mode 100644 index 0000000000..4334c82eca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValue.h @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// MyValue.h: interface for the MyValueImpl class. +// +////////////////////////////////////////////////////////////////////// + +#ifndef MyValue_h +#define MyValue_h +#include <string> +using std::string; +class MyValue +{ +public: + virtual float getMyValue(const char* customerID) = 0; + virtual float getMyValueS(const string& customerID) = 0; + virtual string getCustname(string& customerID) = 0; + virtual const string& getCustnamecs(string customerID) = 0; + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl.componentType new file mode 100644 index 0000000000..c4e3b35675 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl.componentType @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9">
+
+ <service name="MyValueService">
+ <interface.cpp class="MyValue" header="MyValue.h">
+ </interface.cpp>
+ </service>
+
+ <reference name="customerInfo">
+ <interface.cpp header="CustomerInfo.h">
+ </interface.cpp>
+ </reference>
+
+ <reference name="stockQuote">
+ <interface.cpp header="StockQuoteService.h">
+ </interface.cpp>
+ </reference>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl.hpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl.hpp new file mode 100644 index 0000000000..98a342fcb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl.hpp @@ -0,0 +1,43 @@ +/*
+ * 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.
+ */
+
+/* $Rev$ $Date$ */
+
+// Class definition for the implementation
+
+#ifndef MyValueImpl_h
+#define MyValueImpl_h
+
+#include "MyValue.h"
+
+
+
+class MyValueImpl : public MyValue
+{
+public:
+ MyValueImpl();
+ virtual ~MyValueImpl();
+ virtual float getMyValue(const char* customerID);
+ virtual float getMyValueS(const string& customerID);
+ virtual string getCustname(string& customerID);
+ virtual const string& getCustnamecs(string customerID);
+
+};
+
+#endif
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl_stockQuote_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl_stockQuote_Proxy.h new file mode 100644 index 0000000000..3f9feeed30 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/MyValueImpl_stockQuote_Proxy.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef MyValueImpl_stockQuote_Proxy_h +#define MyValueImpl_stockQuote_Proxy_h + +#include "StockQuoteService.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_stockQuote_Proxy : public StockQuoteService +{ +public: + MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_stockQuote_Proxy(); + virtual commonj::sdo::DataObjectPtr GetStockQuotes(commonj::sdo::DataObjectPtr); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_stockQuote_Proxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/StockQuoteService.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/StockQuoteService.h new file mode 100644 index 0000000000..6a8fd51534 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/StockQuoteService.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// +////////////////////////////////////////////////////////////////////// + +#ifndef StockQuoteService_h +#define StockQuoteService_h +#include <string> +#include "commonj/sdo/sdo.h" +using std::string; +class StockQuoteService +{ +public: + virtual commonj::sdo::DataObjectPtr GetStockQuotes(commonj::sdo::DataObjectPtr request) = 0; + +}; + +#endif // StockQuoteService_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/sca.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/sca.composite new file mode 100644 index 0000000000..9a5cfd8da5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/MyValueServiceCompositeTwoClasses/sca.composite @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<composite xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="MyValueServiceComposite">
+
+ <!-- Expose as a web service -->
+ <entryPoint name="MyValueServiceExport" multiplicity="1..1">
+ <interface.wsdl interface="" callbackInterface=""></interface.wsdl>
+ <binding.ws port="mvs:MyValueServiceSOAP"></binding.ws>
+ <reference>MyValueServiceComponent</reference>
+ </entryPoint>
+
+ <component name="MyValueServiceComponent">
+ <implementation.cpp dll="MyValue" header="MyValueImpl.hpp"></implementation.cpp>
+ <properties>
+ </properties>
+ <references>
+ <customerInfo>CustomerInfoComponent</customerInfo>
+ <stockQuote>StockQuoteService</stockQuote>
+ </references>
+ </component>
+
+ <!--
+ <component name="Calculator">
+ <implementation.cpp dll="debug/Calculator.dll" header="CalculatorImpl.h"/>
+ </component>
+ -->
+
+ <externalService name="StockQuoteService">
+ <interface.cpp header="StockQuoteService.h"/>
+ <binding.ws port="http://swanandmokashi.com#wsdl.endpoint(StockQuotes/StockQuotesSoap)"/>
+ </externalService>
+
+ <!--wire>
+ <source.uri>MyValueServiceComponent/customerInfo</source.uri>
+ <target.uri>CustomerInfoComponent</target.uri>
+ </wire-->
+
+</composite>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfo.fragment b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfo.fragment new file mode 100644 index 0000000000..27d28368f5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfo.fragment @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<compositeFragment xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:v="http://www.osoa.org/xmlns/sca/values/0.9"
+ xmlns:mvs="http://www.myvalue.org/MyValueService/"
+ name="CustomerInfoComponent">
+
+
+ <component name="CustomerInfoComponent">
+ <implementation.cpp dll="CustomerInfo" header="CustomerInfoImpl.h">
+ </implementation.cpp>
+ <properties>
+ <v:Fred>x</v:Fred>
+ <v:Joe>23</v:Joe>
+ <Joe>42</Joe>
+ </properties>
+ <references>
+ </references>
+ </component>
+
+</compositeFragment>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfo.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfo.h new file mode 100644 index 0000000000..32bf7572dc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfo.h @@ -0,0 +1,45 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef CustomerInfo_h +#define CustomerInfo_h + +class CustomerInfo +{ +public: + virtual const char* getCustomerInformationCharPublic(char * p1, const char* customerID ) = 0; + virtual const char* getCustomerInfoACharPublic(char * p1,const char*) = 0; + virtual const char* getCustomerInfoBCharPublic(char * p1, char* customerID ) = 0; + +private: + virtual const char* getCustomerInformationCharPrivate(char * p1, const char* customerID ) = 0; + virtual const char* getCustomerInfoACharPrivate(char * p1,const char*) = 0; + virtual const char* getCustomerInfoBCharPrivate(char * p1, char* customerID ) = 0; + +protected: + virtual const char* getCustomerInformationCharProtected(char * p1, const char* customerID ) = 0; + virtual const char* getCustomerInfoACharProtected(char * p1,const char*) = 0; + virtual const char* getCustomerInfoBCharProtected(char * p1, char* customerID ) = 0; + + +}; + +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfoImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfoImpl.componentType new file mode 100644 index 0000000000..c2cfd3b399 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfoImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="ASCII"?>
+<!--
+ 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.
+-->
+
+<componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <service name="CustomerInfoService">
+ <interface.cpp header="/CustomerInfo.h">
+ </interface.cpp>
+ </service>
+
+ <property name="Fred" type="xs:string"/>
+ <property name="Joe" type="xs:integer" many="true"/>
+
+</componentType>
+
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfoImpl.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfoImpl.h new file mode 100644 index 0000000000..55f5813303 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testinput/composites/SimplePublicPrivateProtectedTest/CustomerInfoImpl.h @@ -0,0 +1,39 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// Class definition for the implementation + +#ifndef CustomerInfoImpl_h +#define CustomerInfoImpl_h + +#include "CustomerInfo.h" + + + +class CustomerInfoImpl : public CustomerInfo +{ +public: + CustomerInfoImpl(); + virtual ~CustomerInfoImpl(); + virtual const char* getCustomerInformation(const char* customerID); + +}; +#endif diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Proxy.cpp new file mode 100644 index 0000000000..14bafd9ce7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Proxy.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#include "CalculatorImpl_CalculatorService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorImpl_CalculatorService_Proxy* CalculatorImpl_CalculatorService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CalculatorImpl_CalculatorService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CalculatorImpl_CalculatorService_Proxy_Destructor(void* proxy) + { + delete (CalculatorImpl_CalculatorService_Proxy*)proxy; + } +} + +CalculatorImpl_CalculatorService_Proxy::CalculatorImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CalculatorImpl_CalculatorService_Proxy::~CalculatorImpl_CalculatorService_Proxy() +{ + if (target) + delete target; +} + +long CalculatorImpl_CalculatorService_Proxy::subtract( long arg0, long arg1) +{ + tuscany::sca::Operation operation("subtract"); + operation.addParameter("a", &arg0); + operation.addParameter("b", &arg1); + long ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(long*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Proxy.h new file mode 100644 index 0000000000..00b163ba76 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef CalculatorImpl_CalculatorService_Proxy_h +#define CalculatorImpl_CalculatorService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "Calculator.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CalculatorImpl_CalculatorService_Proxy : public Calculator +{ +public: + CalculatorImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CalculatorImpl_CalculatorService_Proxy(); + virtual long subtract( long a, long b); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CalculatorImpl_CalculatorService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Wrapper.cpp new file mode 100644 index 0000000000..b6e5c8a9f0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Wrapper.cpp @@ -0,0 +1,84 @@ +/* + * 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. + */ + +#include "CalculatorImpl_CalculatorService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorImpl_CalculatorService_Wrapper* CalculatorImpl_CalculatorService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CalculatorImpl_CalculatorService_Wrapper(target); + } +} + +CalculatorImpl_CalculatorService_Wrapper::CalculatorImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CalculatorImpl*)getImplementation(); +} + +CalculatorImpl_CalculatorService_Wrapper::~CalculatorImpl_CalculatorService_Wrapper() +{ + releaseImplementation(); +} + +void* CalculatorImpl_CalculatorService_Wrapper::newImplementation() +{ + return new CalculatorImpl; +} + +void CalculatorImpl_CalculatorService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CalculatorImpl_CalculatorService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "subtract") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(long*)operation.getReturnValue() = impl->subtract(p0, p1); + } + else + { + long* ret = new long; + *ret = impl->subtract(p0, p1); + operation.setReturnValue((const long*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Wrapper.h new file mode 100644 index 0000000000..63bae2f75c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorCompositeAndComponent/expected_output/CalculatorImpl_CalculatorService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CalculatorImpl_CalculatorService_Wrapper_h +#define CalculatorImpl_CalculatorService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CalculatorImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CalculatorImpl_CalculatorService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CalculatorImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CalculatorImpl_CalculatorService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CalculatorImpl* impl; +}; + +#endif // CalculatorImpl_CalculatorService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Proxy.cpp new file mode 100644 index 0000000000..79bfdbedbb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Proxy.cpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +#include "CalculatorBackImpl_CalculatorService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorBackImpl_CalculatorService_Proxy* CalculatorBackImpl_CalculatorService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CalculatorBackImpl_CalculatorService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CalculatorBackImpl_CalculatorService_Proxy_Destructor(void* proxy) + { + delete (CalculatorBackImpl_CalculatorService_Proxy*)proxy; + } +} + +CalculatorBackImpl_CalculatorService_Proxy::CalculatorBackImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CalculatorBackImpl_CalculatorService_Proxy::~CalculatorBackImpl_CalculatorService_Proxy() +{ + if (target) + delete target; +} + +long CalculatorBackImpl_CalculatorService_Proxy::subtractBack( long arg0, long arg1) +{ + tuscany::sca::Operation operation("subtractBack"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + long ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(long*)operation.getReturnValue(); +} + +long CalculatorBackImpl_CalculatorService_Proxy::addBack( long arg0, long arg1) +{ + tuscany::sca::Operation operation("addBack"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + long ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(long*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Proxy.h new file mode 100644 index 0000000000..277a3afb06 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Proxy.h @@ -0,0 +1,42 @@ +/* + * 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. + */ + +#ifndef CalculatorBackImpl_CalculatorService_Proxy_h +#define CalculatorBackImpl_CalculatorService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "otherSubFolder/CalculatorBack.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CalculatorBackImpl_CalculatorService_Proxy : public CalculatorBack +{ +public: + CalculatorBackImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CalculatorBackImpl_CalculatorService_Proxy(); + virtual long subtractBack( long a, long b); + virtual long addBack( long a, long b); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CalculatorBackImpl_CalculatorService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Wrapper.cpp new file mode 100644 index 0000000000..09dd09c01c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Wrapper.cpp @@ -0,0 +1,101 @@ +/* + * 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. + */ + +#include "CalculatorBackImpl_CalculatorService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorBackImpl_CalculatorService_Wrapper* CalculatorBackImpl_CalculatorService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CalculatorBackImpl_CalculatorService_Wrapper(target); + } +} + +CalculatorBackImpl_CalculatorService_Wrapper::CalculatorBackImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CalculatorBackImpl*)getImplementation(); +} + +CalculatorBackImpl_CalculatorService_Wrapper::~CalculatorBackImpl_CalculatorService_Wrapper() +{ + releaseImplementation(); +} + +void* CalculatorBackImpl_CalculatorService_Wrapper::newImplementation() +{ + return new CalculatorBackImpl; +} + +void CalculatorBackImpl_CalculatorService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CalculatorBackImpl_CalculatorService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "subtractBack") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(long*)operation.getReturnValue() = impl->subtractBack(p0, p1); + } + else + { + long* ret = new long; + *ret = impl->subtractBack(p0, p1); + operation.setReturnValue((const long*)ret); + } + return; + } + if (operationName == "addBack") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(long*)operation.getReturnValue() = impl->addBack(p0, p1); + } + else + { + long* ret = new long; + *ret = impl->addBack(p0, p1); + operation.setReturnValue((const long*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Wrapper.h new file mode 100644 index 0000000000..bfa203598c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorBackImpl_CalculatorService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CalculatorBackImpl_CalculatorService_Wrapper_h +#define CalculatorBackImpl_CalculatorService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "subFolder/CalculatorBackImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CalculatorBackImpl_CalculatorService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CalculatorBackImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CalculatorBackImpl_CalculatorService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CalculatorBackImpl* impl; +}; + +#endif // CalculatorBackImpl_CalculatorService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Proxy.cpp new file mode 100644 index 0000000000..19056e836d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Proxy.cpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +#include "CalculatorForwardImpl_CalculatorService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorForwardImpl_CalculatorService_Proxy* CalculatorForwardImpl_CalculatorService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CalculatorForwardImpl_CalculatorService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CalculatorForwardImpl_CalculatorService_Proxy_Destructor(void* proxy) + { + delete (CalculatorForwardImpl_CalculatorService_Proxy*)proxy; + } +} + +CalculatorForwardImpl_CalculatorService_Proxy::CalculatorForwardImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CalculatorForwardImpl_CalculatorService_Proxy::~CalculatorForwardImpl_CalculatorService_Proxy() +{ + if (target) + delete target; +} + +long CalculatorForwardImpl_CalculatorService_Proxy::subtractForward( long arg0, long arg1) +{ + tuscany::sca::Operation operation("subtractForward"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + long ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(long*)operation.getReturnValue(); +} + +long CalculatorForwardImpl_CalculatorService_Proxy::addForward( long arg0, long arg1) +{ + tuscany::sca::Operation operation("addForward"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + long ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(long*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Proxy.h new file mode 100644 index 0000000000..9213ec625b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Proxy.h @@ -0,0 +1,42 @@ +/* + * 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. + */ + +#ifndef CalculatorForwardImpl_CalculatorService_Proxy_h +#define CalculatorForwardImpl_CalculatorService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "otherSubFolder/CalculatorForward.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CalculatorForwardImpl_CalculatorService_Proxy : public CalculatorForward +{ +public: + CalculatorForwardImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CalculatorForwardImpl_CalculatorService_Proxy(); + virtual long subtractForward( long a, long b); + virtual long addForward( long a, long b); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CalculatorForwardImpl_CalculatorService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Wrapper.cpp new file mode 100644 index 0000000000..7b1cad7770 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Wrapper.cpp @@ -0,0 +1,101 @@ +/* + * 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. + */ + +#include "CalculatorForwardImpl_CalculatorService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorForwardImpl_CalculatorService_Wrapper* CalculatorForwardImpl_CalculatorService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CalculatorForwardImpl_CalculatorService_Wrapper(target); + } +} + +CalculatorForwardImpl_CalculatorService_Wrapper::CalculatorForwardImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CalculatorForwardImpl*)getImplementation(); +} + +CalculatorForwardImpl_CalculatorService_Wrapper::~CalculatorForwardImpl_CalculatorService_Wrapper() +{ + releaseImplementation(); +} + +void* CalculatorForwardImpl_CalculatorService_Wrapper::newImplementation() +{ + return new CalculatorForwardImpl; +} + +void CalculatorForwardImpl_CalculatorService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CalculatorForwardImpl_CalculatorService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "subtractForward") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(long*)operation.getReturnValue() = impl->subtractForward(p0, p1); + } + else + { + long* ret = new long; + *ret = impl->subtractForward(p0, p1); + operation.setReturnValue((const long*)ret); + } + return; + } + if (operationName == "addForward") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(long*)operation.getReturnValue() = impl->addForward(p0, p1); + } + else + { + long* ret = new long; + *ret = impl->addForward(p0, p1); + operation.setReturnValue((const long*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Wrapper.h new file mode 100644 index 0000000000..0cb8404ca3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CalculatorSlashDirectionTest/expected_output/CalculatorForwardImpl_CalculatorService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CalculatorForwardImpl_CalculatorService_Wrapper_h +#define CalculatorForwardImpl_CalculatorService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "subFolder/CalculatorForwardImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CalculatorForwardImpl_CalculatorService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CalculatorForwardImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CalculatorForwardImpl_CalculatorService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CalculatorForwardImpl* impl; +}; + +#endif // CalculatorForwardImpl_CalculatorService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp new file mode 100644 index 0000000000..85291cd069 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp @@ -0,0 +1,594 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Proxy* CustomerInfoImpl_CustomerInfoService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CustomerInfoImpl_CustomerInfoService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CustomerInfoImpl_CustomerInfoService_Proxy_Destructor(void* proxy) + { + delete (CustomerInfoImpl_CustomerInfoService_Proxy*)proxy; + } +} + +CustomerInfoImpl_CustomerInfoService_Proxy::CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CustomerInfoImpl_CustomerInfoService_Proxy::~CustomerInfoImpl_CustomerInfoService_Proxy() +{ + if (target) + delete target; +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationChar( char* arg0, const char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInformationChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAChar( char* arg0, const char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoAChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBChar( char* arg0, char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoBChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCChar( char* arg0, char arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoCChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDChar( char* arg0, char arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoDChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEChar( char* arg0, char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoEChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFChar( char* arg0, char* arg1, char* arg2) +{ + tuscany::sca::Operation operation("getCustomerInfoFChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + operation.addParameter(&arg2); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGChar( char* arg0, char* arg1, char* arg2, signed char* arg3) +{ + tuscany::sca::Operation operation("getCustomerInfoGChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + operation.addParameter(&arg2); + operation.addParameter(&arg3); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHChar( unsigned char* arg0, const char arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoHChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHChar( unsigned char* arg0, const char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoHChar"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationLong(const long* arg0, const long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInformationLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoALong(const long* arg0, const long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoALong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBLong( long* arg0, long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoBLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCLong( long arg0, long arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoCLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDLong( long arg0, long arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoDLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoELong( long* arg0, long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoELong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFLong( long* arg0, long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoFLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGLong( signed long* arg0, signed long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoGLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHLong( signed long* arg0, signed long* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoHLong"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationInt( char* arg0, const int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInformationInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAInt( char* arg0, const int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoAInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBInt( char* arg0, int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoBInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCInt( char* arg0, int arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoCInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDInt( char* arg0, int arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoDInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEInt( char* arg0, int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoEInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFInt( char* arg0, int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoFInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGInt( char* arg0, signed int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoGInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHInt( char* arg0, unsigned int* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoHInt"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationint64( Diamond& arg0, const __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInformationint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAint64( Diamond& arg0, const __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoAint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBint64( Diamond& arg0, __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoBint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCint64( Diamond& arg0, __int64 arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoCint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDint64( Diamond& arg0, __int64 arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoDint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEint64( Diamond& arg0, __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoEint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFint64( Diamond& arg0, __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoFint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGint64( Diamond& arg0, signed __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoGint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHint64(const Diamond& arg0, unsigned int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoHint64"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const void* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationVoid( float& arg0, const __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInformationVoid"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + const void* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const void**)operation.getReturnValue(); +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAVoid(const float& arg0, const __int64* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoAVoid"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + target->invoke(operation); + return; +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoBVoid"); + target->invoke(operation); + return; +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoCVoid"); + target->invoke(operation); + return; +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoDVoid"); + operation.addParameter(&arg0); + target->invoke(operation); + return; +} + +char CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoEVoid"); + operation.addParameter(&arg0); + char ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(char*)operation.getReturnValue(); +} + +char CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoFVoid"); + char ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(char*)operation.getReturnValue(); +} + +char CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoGVoid"); + operation.addParameter(&arg0); + char ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(char*)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAInline( int arg0, int arg1, int arg2, int arg3, char* customer arg4) +{ + tuscany::sca::Operation operation("getCustomerInfoAInline"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + operation.addParameter(&arg2); + operation.addParameter(&arg3); + operation.addParameter(&arg4); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +int CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBInline( int* arg0, int* arg1, int* arg2, char* customer arg3) +{ + tuscany::sca::Operation operation("getCustomerInfoBInline"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + operation.addParameter(&arg2); + operation.addParameter(&arg3); + int ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(int*)operation.getReturnValue(); +} + +friend const unsigned int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCInline( char* customer arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoCInline"); + operation.addParameter(&arg0); + friend const unsigned int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(friend const unsigned int**)operation.getReturnValue(); +} + +int CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoTrickyA(const char arg0, const char arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoTrickyA"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + int ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(int*)operation.getReturnValue(); +} + +int CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoTrickyB( int arg0, int arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoTrickyB"); + operation.addParameter(&arg0); + operation.addParameter(&arg1); + int ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(int*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h new file mode 100644 index 0000000000..cb9e4e6e2a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h @@ -0,0 +1,90 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Proxy_h +#define CustomerInfoImpl_CustomerInfoService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "/CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Proxy : public CustomerInfo +{ +public: + CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformationChar( char* p1, const char* customerID); + virtual const char* getCustomerInfoAChar( char* p1, const char* ); + virtual const char* getCustomerInfoBChar( char* p1, char* customerID); + virtual const char* getCustomerInfoCChar( char* p1, char customerID); + virtual const char* getCustomerInfoDChar( char* p1, char ); + virtual const char* getCustomerInfoEChar( char* p1, char* ); + virtual const char* getCustomerInfoFChar( char* p1, char* p1, char* customerID); + virtual const char* getCustomerInfoGChar( char* p1, char* , char* p1, signed char* customerID); + virtual const char* getCustomerInfoHChar( unsigned char* customerID, const char ); + virtual const char* getCustomerInfoHChar( unsigned char* customerID, const char* ); + virtual const long* getCustomerInformationLong(const long* customerID, const long* customerID); + virtual const long* getCustomerInfoALong(const long* , const long* ); + virtual const long* getCustomerInfoBLong( long* customerID, long* customerID2); + virtual const long* getCustomerInfoCLong( long customerID, long customerID2); + virtual const long* getCustomerInfoDLong( long , long ); + virtual const long* getCustomerInfoELong( long* , long* ); + virtual const long* getCustomerInfoFLong( long* customerID, long* customerID2); + virtual const long* getCustomerInfoGLong( signed long* customerID, signed long* customerID2); + virtual const long* getCustomerInfoHLong( signed long* customerID, signed long* customerID2); + virtual const int* getCustomerInformationInt( char* , const int* customerID); + virtual const int* getCustomerInfoAInt( char* , const int* ); + virtual const int* getCustomerInfoBInt( char* , int* customerID); + virtual const int* getCustomerInfoCInt( char* , int customerID); + virtual const int* getCustomerInfoDInt( char* , int ); + virtual const int* getCustomerInfoEInt( char* , int* ); + virtual const int* getCustomerInfoFInt( char* , int* customerID); + virtual const int* getCustomerInfoGInt( char* , signed int* customerID); + virtual const int* getCustomerInfoHInt( char* , unsigned int* customerID); + virtual const __int64* getCustomerInformationint64( Diamond& , const __int64* customerID); + virtual const __int64* getCustomerInfoAint64( Diamond& , const __int64* ); + virtual const __int64* getCustomerInfoBint64( Diamond& , __int64* customerID); + virtual const __int64* getCustomerInfoCint64( Diamond& , __int64 customerID); + virtual const __int64* getCustomerInfoDint64( Diamond& myDiamond, __int64 ); + virtual const __int64* getCustomerInfoEint64( Diamond& myDiamond, __int64* ); + virtual const __int64* getCustomerInfoFint64( Diamond& myDiamond, __int64* customerID); + virtual const __int64* getCustomerInfoGint64( Diamond& myDiamond, signed __int64* customerID); + virtual const __int64* getCustomerInfoHint64(const Diamond& myDiamond, unsigned int64* customerID); + virtual const void* getCustomerInformationVoid( float& f, const __int64* customerID); + virtual void getCustomerInfoAVoid(const float& f, const __int64* ); + virtual void getCustomerInfoBVoid(); + virtual void getCustomerInfoCVoid(); + virtual void getCustomerInfoDVoid( void ); + virtual char getCustomerInfoEVoid( void ); + virtual char getCustomerInfoFVoid(); + virtual char getCustomerInfoGVoid( void ); + virtual const char* getCustomerInfoAInline( int , int , int , int , char* customer id); + virtual int getCustomerInfoBInline( int* , int* f, int* g, char* customer id); + virtual friend const unsigned int* getCustomerInfoCInline( char* customer id); + virtual int getCustomerInfoTrickyA(const char , const char ); + virtual int getCustomerInfoTrickyB( int myInt, int myInt); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp new file mode 100644 index 0000000000..be09a57919 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp @@ -0,0 +1,872 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Wrapper* CustomerInfoImpl_CustomerInfoService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CustomerInfoImpl_CustomerInfoService_Wrapper(target); + } +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CustomerInfoImpl*)getImplementation(); +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::~CustomerInfoImpl_CustomerInfoService_Wrapper() +{ + releaseImplementation(); +} + +void* CustomerInfoImpl_CustomerInfoService_Wrapper::newImplementation() +{ + return new CustomerInfoImpl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getCustomerInformationChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + const char* p1 = *(const char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInformationChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInformationChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoAChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + const char* p1 = *(const char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoAChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoAChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoBChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + char* p1 = *( char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoBChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoBChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoCChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + char& p1 = *( char*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoCChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoCChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoDChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + char& p1 = *( char*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoDChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoDChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoEChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + char* p1 = *( char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoEChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoEChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoFChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + char* p1 = *( char**)operation.getParameterValue(1); + char* p2 = *( char**)operation.getParameterValue(2); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoFChar(p0, p1, p2); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoFChar(p0, p1, p2); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoGChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + char* p1 = *( char**)operation.getParameterValue(1); + char* p2 = *( char**)operation.getParameterValue(2); + signed char* p3 = *( signed char**)operation.getParameterValue(3); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoGChar(p0, p1, p2, p3); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoGChar(p0, p1, p2, p3); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoHChar") + { + unsigned char* p0 = *( unsigned char**)operation.getParameterValue(0); + const char& p1 = *(const char*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoHChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoHChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoHChar") + { + unsigned char* p0 = *( unsigned char**)operation.getParameterValue(0); + const char* p1 = *(const char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoHChar(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoHChar(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInformationLong") + { + const long* p0 = *(const long**)operation.getParameterValue(0); + const long* p1 = *(const long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInformationLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInformationLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoALong") + { + const long* p0 = *(const long**)operation.getParameterValue(0); + const long* p1 = *(const long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoALong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoALong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoBLong") + { + long* p0 = *( long**)operation.getParameterValue(0); + long* p1 = *( long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoBLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoBLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoCLong") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoCLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoCLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoDLong") + { + long& p0 = *( long*)operation.getParameterValue(0); + long& p1 = *( long*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoDLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoDLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoELong") + { + long* p0 = *( long**)operation.getParameterValue(0); + long* p1 = *( long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoELong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoELong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoFLong") + { + long* p0 = *( long**)operation.getParameterValue(0); + long* p1 = *( long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoFLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoFLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoGLong") + { + signed long* p0 = *( signed long**)operation.getParameterValue(0); + signed long* p1 = *( signed long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoGLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoGLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoHLong") + { + signed long* p0 = *( signed long**)operation.getParameterValue(0); + signed long* p1 = *( signed long**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoHLong(p0, p1); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoHLong(p0, p1); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInformationInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + const int* p1 = *(const int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInformationInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInformationInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoAInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + const int* p1 = *(const int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoAInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoAInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoBInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + int* p1 = *( int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoBInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoBInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoCInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + int& p1 = *( int*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoCInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoCInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoDInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + int& p1 = *( int*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoDInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoDInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoEInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + int* p1 = *( int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoEInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoEInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoFInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + int* p1 = *( int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoFInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoFInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoGInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + signed int* p1 = *( signed int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoGInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoGInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoHInt") + { + char* p0 = *( char**)operation.getParameterValue(0); + unsigned int* p1 = *( unsigned int**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoHInt(p0, p1); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoHInt(p0, p1); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInformationint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + const __int64* p1 = *(const __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInformationint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInformationint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoAint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + const __int64* p1 = *(const __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoAint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoAint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoBint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + __int64* p1 = *( __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoBint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoBint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoCint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + __int64& p1 = *( __int64*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoCint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoCint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoDint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + __int64& p1 = *( __int64*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoDint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoDint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoEint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + __int64* p1 = *( __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoEint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoEint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoFint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + __int64* p1 = *( __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoFint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoFint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoGint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + signed __int64* p1 = *( signed __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoGint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoGint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoHint64") + { + Diamond& p0 = *(Diamond*)operation.getParameterValue(0); + unsigned int64* p1 = *( unsigned int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoHint64(p0, p1); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoHint64(p0, p1); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInformationVoid") + { + float& p0 = *(float*)operation.getParameterValue(0); + const __int64* p1 = *(const __int64**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const void**)operation.getReturnValue() = impl->getCustomerInformationVoid(p0, p1); + } + else + { + const void** ret = new const void*; + *ret = impl->getCustomerInformationVoid(p0, p1); + operation.setReturnValue((const const void**)ret); + } + return; + } + if (operationName == "getCustomerInfoAVoid") + { + float& p0 = *(float*)operation.getParameterValue(0); + const __int64* p1 = *(const __int64**)operation.getParameterValue(1); + impl->getCustomerInfoAVoid(p0, p1); + return; + } + if (operationName == "getCustomerInfoBVoid") + { + impl->getCustomerInfoBVoid(); + return; + } + if (operationName == "getCustomerInfoCVoid") + { + impl->getCustomerInfoCVoid(); + return; + } + if (operationName == "getCustomerInfoDVoid") + { + impl->getCustomerInfoDVoid(); + return; + } + if (operationName == "getCustomerInfoEVoid") + { + + if(operation.getReturnValue() != NULL) + { + *(char*)operation.getReturnValue() = impl->getCustomerInfoEVoid(); + } + else + { + char* ret = new char; + *ret = impl->getCustomerInfoEVoid(); + operation.setReturnValue((const char*)ret); + } + return; + } + if (operationName == "getCustomerInfoFVoid") + { + + if(operation.getReturnValue() != NULL) + { + *(char*)operation.getReturnValue() = impl->getCustomerInfoFVoid(); + } + else + { + char* ret = new char; + *ret = impl->getCustomerInfoFVoid(); + operation.setReturnValue((const char*)ret); + } + return; + } + if (operationName == "getCustomerInfoGVoid") + { + + if(operation.getReturnValue() != NULL) + { + *(char*)operation.getReturnValue() = impl->getCustomerInfoGVoid(); + } + else + { + char* ret = new char; + *ret = impl->getCustomerInfoGVoid(); + operation.setReturnValue((const char*)ret); + } + return; + } + if (operationName == "getCustomerInfoAInline") + { + int& p0 = *( int*)operation.getParameterValue(0); + int& p1 = *( int*)operation.getParameterValue(1); + int& p2 = *( int*)operation.getParameterValue(2); + int& p3 = *( int*)operation.getParameterValue(3); + char* customer p4 = *( char* customer*)operation.getParameterValue(4); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoAInline(p0, p1, p2, p3, p4); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoAInline(p0, p1, p2, p3, p4); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoBInline") + { + int* p0 = *( int**)operation.getParameterValue(0); + int* p1 = *( int**)operation.getParameterValue(1); + int* p2 = *( int**)operation.getParameterValue(2); + char* customer p3 = *( char* customer*)operation.getParameterValue(3); + + if(operation.getReturnValue() != NULL) + { + *(int*)operation.getReturnValue() = impl->getCustomerInfoBInline(p0, p1, p2, p3); + } + else + { + int* ret = new int; + *ret = impl->getCustomerInfoBInline(p0, p1, p2, p3); + operation.setReturnValue((const int*)ret); + } + return; + } + if (operationName == "getCustomerInfoCInline") + { + char* customer p0 = *( char* customer*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(friend const unsigned int**)operation.getReturnValue() = impl->getCustomerInfoCInline(p0); + } + else + { + friend const unsigned int** ret = new friend const unsigned int*; + *ret = impl->getCustomerInfoCInline(p0); + operation.setReturnValue((const friend const unsigned int**)ret); + } + return; + } + if (operationName == "getCustomerInfoTrickyA") + { + const char& p0 = *(const char*)operation.getParameterValue(0); + const char& p1 = *(const char*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(int*)operation.getReturnValue() = impl->getCustomerInfoTrickyA(p0, p1); + } + else + { + int* ret = new int; + *ret = impl->getCustomerInfoTrickyA(p0, p1); + operation.setReturnValue((const int*)ret); + } + return; + } + if (operationName == "getCustomerInfoTrickyB") + { + int& p0 = *( int*)operation.getParameterValue(0); + int& p1 = *( int*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(int*)operation.getReturnValue() = impl->getCustomerInfoTrickyB(p0, p1); + } + else + { + int* ret = new int; + *ret = impl->getCustomerInfoTrickyB(p0, p1); + operation.setReturnValue((const int*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h new file mode 100644 index 0000000000..94b1d5cb4d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplMultiParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Wrapper_h +#define CustomerInfoImpl_CustomerInfoService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfoImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CustomerInfoImpl_CustomerInfoService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CustomerInfoImpl* impl; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp new file mode 100644 index 0000000000..f3b2540ba8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp @@ -0,0 +1,504 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Proxy* CustomerInfoImpl_CustomerInfoService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CustomerInfoImpl_CustomerInfoService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CustomerInfoImpl_CustomerInfoService_Proxy_Destructor(void* proxy) + { + delete (CustomerInfoImpl_CustomerInfoService_Proxy*)proxy; + } +} + +CustomerInfoImpl_CustomerInfoService_Proxy::CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CustomerInfoImpl_CustomerInfoService_Proxy::~CustomerInfoImpl_CustomerInfoService_Proxy() +{ + if (target) + delete target; +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationChar(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformationChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAChar(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoAChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBChar( char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoBChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCChar( char arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoCChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDChar( char arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoDChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEChar( char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoEChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFChar( char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoFChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGChar( signed char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoGChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHChar( unsigned char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoHChar"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationLong(const long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformationLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoALong(const long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoALong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBLong( long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoBLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCLong( long arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoCLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDLong( long arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoDLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoELong( long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoELong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFLong( long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoFLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGLong( signed long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoGLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const long* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHLong( unsigned long* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoHLong"); + operation.addParameter(&arg0); + const long* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const long**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationInt(const int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformationInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAInt(const int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoAInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBInt( int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoBInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCInt( int arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoCInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDInt( int arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoDInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEInt( int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoEInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFInt( int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoFInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGInt( signed int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoGInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHInt( unsigned int* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoHInt"); + operation.addParameter(&arg0); + const int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const int**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationint64(const __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformationint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAint64(const __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoAint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBint64( __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoBint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCint64( __int64 arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoCint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDint64( __int64 arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoDint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoEint64( __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoEint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoFint64( __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoFint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoGint64( signed __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoGint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const __int64* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoHint64( unsigned int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoHint64"); + operation.addParameter(&arg0); + const __int64* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const __int64**)operation.getReturnValue(); +} + +const void* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationVoid(const __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformationVoid"); + operation.addParameter(&arg0); + const void* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const void**)operation.getReturnValue(); +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAVoid(const __int64* arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoAVoid"); + operation.addParameter(&arg0); + target->invoke(operation); + return; +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoBVoid"); + target->invoke(operation); + return; +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoCVoid"); + target->invoke(operation); + return; +} + +void CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoDVoid() +{ + tuscany::sca::Operation operation("getCustomerInfoDVoid"); + operation.addParameter(&arg0); + target->invoke(operation); + return; +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoAInline( char* customer arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoAInline"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +int CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBInline( char* customer arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoBInline"); + operation.addParameter(&arg0); + int ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(int*)operation.getReturnValue(); +} + +friend const unsigned int* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoCInline( char* customer arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoCInline"); + operation.addParameter(&arg0); + friend const unsigned int* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(friend const unsigned int**)operation.getReturnValue(); +} + +int CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoTrickyA(const char arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoTrickyA"); + operation.addParameter(&arg0); + int ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(int*)operation.getReturnValue(); +} + +int CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoTrickyB( int arg0) +{ + tuscany::sca::Operation operation("getCustomerInfoTrickyB"); + operation.addParameter(&arg0); + int ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(int*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h new file mode 100644 index 0000000000..75f912d3ae --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h @@ -0,0 +1,86 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Proxy_h +#define CustomerInfoImpl_CustomerInfoService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "/CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Proxy : public CustomerInfo +{ +public: + CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformationChar(const char* customerID); + virtual const char* getCustomerInfoAChar(const char* ); + virtual const char* getCustomerInfoBChar( char* customerID); + virtual const char* getCustomerInfoCChar( char customerID); + virtual const char* getCustomerInfoDChar( char ); + virtual const char* getCustomerInfoEChar( char* ); + virtual const char* getCustomerInfoFChar( char* customerID); + virtual const char* getCustomerInfoGChar( signed char* customerID); + virtual const char* getCustomerInfoHChar( unsigned char* customerID); + virtual const long* getCustomerInformationLong(const long* customerID); + virtual const long* getCustomerInfoALong(const long* ); + virtual const long* getCustomerInfoBLong( long* customerID); + virtual const long* getCustomerInfoCLong( long customerID); + virtual const long* getCustomerInfoDLong( long ); + virtual const long* getCustomerInfoELong( long* ); + virtual const long* getCustomerInfoFLong( long* customerID); + virtual const long* getCustomerInfoGLong( signed long* customerID); + virtual const long* getCustomerInfoHLong( unsigned long* customerID); + virtual const int* getCustomerInformationInt(const int* customerID); + virtual const int* getCustomerInfoAInt(const int* ); + virtual const int* getCustomerInfoBInt( int* customerID); + virtual const int* getCustomerInfoCInt( int customerID); + virtual const int* getCustomerInfoDInt( int ); + virtual const int* getCustomerInfoEInt( int* ); + virtual const int* getCustomerInfoFInt( int* customerID); + virtual const int* getCustomerInfoGInt( signed int* customerID); + virtual const int* getCustomerInfoHInt( unsigned int* customerID); + virtual const __int64* getCustomerInformationint64(const __int64* customerID); + virtual const __int64* getCustomerInfoAint64(const __int64* ); + virtual const __int64* getCustomerInfoBint64( __int64* customerID); + virtual const __int64* getCustomerInfoCint64( __int64 customerID); + virtual const __int64* getCustomerInfoDint64( __int64 ); + virtual const __int64* getCustomerInfoEint64( __int64* ); + virtual const __int64* getCustomerInfoFint64( __int64* customerID); + virtual const __int64* getCustomerInfoGint64( signed __int64* customerID); + virtual const __int64* getCustomerInfoHint64( unsigned int64* customerID); + virtual const void* getCustomerInformationVoid(const __int64* customerID); + virtual void getCustomerInfoAVoid(const __int64* ); + virtual void getCustomerInfoBVoid(); + virtual void getCustomerInfoCVoid(); + virtual void getCustomerInfoDVoid( void ); + virtual const char* getCustomerInfoAInline( char* customer id); + virtual int getCustomerInfoBInline( char* customer id); + virtual friend const unsigned int* getCustomerInfoCInline( char* customer id); + virtual int getCustomerInfoTrickyA(const char ); + virtual int getCustomerInfoTrickyB( int myInt); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp new file mode 100644 index 0000000000..896a129145 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp @@ -0,0 +1,760 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Wrapper* CustomerInfoImpl_CustomerInfoService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CustomerInfoImpl_CustomerInfoService_Wrapper(target); + } +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CustomerInfoImpl*)getImplementation(); +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::~CustomerInfoImpl_CustomerInfoService_Wrapper() +{ + releaseImplementation(); +} + +void* CustomerInfoImpl_CustomerInfoService_Wrapper::newImplementation() +{ + return new CustomerInfoImpl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getCustomerInformationChar") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInformationChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInformationChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoAChar") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoAChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoAChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoBChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoBChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoBChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoCChar") + { + char& p0 = *( char*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoCChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoCChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoDChar") + { + char& p0 = *( char*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoDChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoDChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoEChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoEChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoEChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoFChar") + { + char* p0 = *( char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoFChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoFChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoGChar") + { + signed char* p0 = *( signed char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoGChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoGChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoHChar") + { + unsigned char* p0 = *( unsigned char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoHChar(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoHChar(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInformationLong") + { + const long* p0 = *(const long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInformationLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInformationLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoALong") + { + const long* p0 = *(const long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoALong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoALong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoBLong") + { + long* p0 = *( long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoBLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoBLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoCLong") + { + long& p0 = *( long*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoCLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoCLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoDLong") + { + long& p0 = *( long*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoDLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoDLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoELong") + { + long* p0 = *( long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoELong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoELong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoFLong") + { + long* p0 = *( long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoFLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoFLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoGLong") + { + signed long* p0 = *( signed long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoGLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoGLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInfoHLong") + { + unsigned long* p0 = *( unsigned long**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const long**)operation.getReturnValue() = impl->getCustomerInfoHLong(p0); + } + else + { + const long** ret = new const long*; + *ret = impl->getCustomerInfoHLong(p0); + operation.setReturnValue((const const long**)ret); + } + return; + } + if (operationName == "getCustomerInformationInt") + { + const int* p0 = *(const int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInformationInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInformationInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoAInt") + { + const int* p0 = *(const int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoAInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoAInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoBInt") + { + int* p0 = *( int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoBInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoBInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoCInt") + { + int& p0 = *( int*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoCInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoCInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoDInt") + { + int& p0 = *( int*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoDInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoDInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoEInt") + { + int* p0 = *( int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoEInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoEInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoFInt") + { + int* p0 = *( int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoFInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoFInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoGInt") + { + signed int* p0 = *( signed int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoGInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoGInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInfoHInt") + { + unsigned int* p0 = *( unsigned int**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const int**)operation.getReturnValue() = impl->getCustomerInfoHInt(p0); + } + else + { + const int** ret = new const int*; + *ret = impl->getCustomerInfoHInt(p0); + operation.setReturnValue((const const int**)ret); + } + return; + } + if (operationName == "getCustomerInformationint64") + { + const __int64* p0 = *(const __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInformationint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInformationint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoAint64") + { + const __int64* p0 = *(const __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoAint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoAint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoBint64") + { + __int64* p0 = *( __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoBint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoBint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoCint64") + { + __int64& p0 = *( __int64*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoCint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoCint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoDint64") + { + __int64& p0 = *( __int64*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoDint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoDint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoEint64") + { + __int64* p0 = *( __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoEint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoEint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoFint64") + { + __int64* p0 = *( __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoFint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoFint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoGint64") + { + signed __int64* p0 = *( signed __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoGint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoGint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInfoHint64") + { + unsigned int64* p0 = *( unsigned int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const __int64**)operation.getReturnValue() = impl->getCustomerInfoHint64(p0); + } + else + { + const __int64** ret = new const __int64*; + *ret = impl->getCustomerInfoHint64(p0); + operation.setReturnValue((const const __int64**)ret); + } + return; + } + if (operationName == "getCustomerInformationVoid") + { + const __int64* p0 = *(const __int64**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const void**)operation.getReturnValue() = impl->getCustomerInformationVoid(p0); + } + else + { + const void** ret = new const void*; + *ret = impl->getCustomerInformationVoid(p0); + operation.setReturnValue((const const void**)ret); + } + return; + } + if (operationName == "getCustomerInfoAVoid") + { + const __int64* p0 = *(const __int64**)operation.getParameterValue(0); + impl->getCustomerInfoAVoid(p0); + return; + } + if (operationName == "getCustomerInfoBVoid") + { + impl->getCustomerInfoBVoid(); + return; + } + if (operationName == "getCustomerInfoCVoid") + { + impl->getCustomerInfoCVoid(); + return; + } + if (operationName == "getCustomerInfoDVoid") + { + impl->getCustomerInfoDVoid(); + return; + } + if (operationName == "getCustomerInfoAInline") + { + char* customer p0 = *( char* customer*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoAInline(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoAInline(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoBInline") + { + char* customer p0 = *( char* customer*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(int*)operation.getReturnValue() = impl->getCustomerInfoBInline(p0); + } + else + { + int* ret = new int; + *ret = impl->getCustomerInfoBInline(p0); + operation.setReturnValue((const int*)ret); + } + return; + } + if (operationName == "getCustomerInfoCInline") + { + char* customer p0 = *( char* customer*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(friend const unsigned int**)operation.getReturnValue() = impl->getCustomerInfoCInline(p0); + } + else + { + friend const unsigned int** ret = new friend const unsigned int*; + *ret = impl->getCustomerInfoCInline(p0); + operation.setReturnValue((const friend const unsigned int**)ret); + } + return; + } + if (operationName == "getCustomerInfoTrickyA") + { + const char& p0 = *(const char*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(int*)operation.getReturnValue() = impl->getCustomerInfoTrickyA(p0); + } + else + { + int* ret = new int; + *ret = impl->getCustomerInfoTrickyA(p0); + operation.setReturnValue((const int*)ret); + } + return; + } + if (operationName == "getCustomerInfoTrickyB") + { + int& p0 = *( int*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(int*)operation.getReturnValue() = impl->getCustomerInfoTrickyB(p0); + } + else + { + int* ret = new int; + *ret = impl->getCustomerInfoTrickyB(p0); + operation.setReturnValue((const int*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h new file mode 100644 index 0000000000..94b1d5cb4d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/CustomerInfoImplSingleParamDiffTypesTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Wrapper_h +#define CustomerInfoImpl_CustomerInfoService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfoImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CustomerInfoImpl_CustomerInfoService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CustomerInfoImpl* impl; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.cpp new file mode 100644 index 0000000000..6f2c95f45b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl2_CustomerInfoService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl2_CustomerInfoService_Proxy* CustomerInfoImpl2_CustomerInfoService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CustomerInfoImpl2_CustomerInfoService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CustomerInfoImpl2_CustomerInfoService_Proxy_Destructor(void* proxy) + { + delete (CustomerInfoImpl2_CustomerInfoService_Proxy*)proxy; + } +} + +CustomerInfoImpl2_CustomerInfoService_Proxy::CustomerInfoImpl2_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CustomerInfoImpl2_CustomerInfoService_Proxy::~CustomerInfoImpl2_CustomerInfoService_Proxy() +{ + if (target) + delete target; +} + +const char* CustomerInfoImpl2_CustomerInfoService_Proxy::getCustomerInformation(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformation"); + operation.addParameter("customerID", &arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.h new file mode 100644 index 0000000000..594f404d13 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl2_CustomerInfoService_Proxy_h +#define CustomerInfoImpl2_CustomerInfoService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "/CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CustomerInfoImpl2_CustomerInfoService_Proxy : public CustomerInfo +{ +public: + CustomerInfoImpl2_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl2_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CustomerInfoImpl2_CustomerInfoService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.cpp new file mode 100644 index 0000000000..57add811a2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.cpp @@ -0,0 +1,83 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl2_CustomerInfoService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl2_CustomerInfoService_Wrapper* CustomerInfoImpl2_CustomerInfoService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CustomerInfoImpl2_CustomerInfoService_Wrapper(target); + } +} + +CustomerInfoImpl2_CustomerInfoService_Wrapper::CustomerInfoImpl2_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CustomerInfoImpl2*)getImplementation(); +} + +CustomerInfoImpl2_CustomerInfoService_Wrapper::~CustomerInfoImpl2_CustomerInfoService_Wrapper() +{ + releaseImplementation(); +} + +void* CustomerInfoImpl2_CustomerInfoService_Wrapper::newImplementation() +{ + return new CustomerInfoImpl2; +} + +void CustomerInfoImpl2_CustomerInfoService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CustomerInfoImpl2_CustomerInfoService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getCustomerInformation") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInformation(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInformation(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.h new file mode 100644 index 0000000000..b85533cfd4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl2_CustomerInfoService_Wrapper_h +#define CustomerInfoImpl2_CustomerInfoService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfoImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CustomerInfoImpl2_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CustomerInfoImpl2_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CustomerInfoImpl2_CustomerInfoService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CustomerInfoImpl2* impl; +}; + +#endif // CustomerInfoImpl2_CustomerInfoService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Proxy.cpp new file mode 100644 index 0000000000..b0d9424ad4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Proxy.cpp @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Proxy* MyValueImpl_MyValueService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_MyValueService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_MyValueService_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_MyValueService_Proxy*)proxy; + } +} + +MyValueImpl_MyValueService_Proxy::MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_MyValueService_Proxy::~MyValueImpl_MyValueService_Proxy() +{ + if (target) + delete target; +} + +float MyValueImpl_MyValueService_Proxy::getMyValue(const char* arg0) +{ + tuscany::sca::Operation operation("getMyValue"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float MyValueImpl_MyValueService_Proxy::getMyValueS(const string& arg0) +{ + tuscany::sca::Operation operation("getMyValueS"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +string MyValueImpl_MyValueService_Proxy::getCustname( string& arg0) +{ + tuscany::sca::Operation operation("getCustname"); + operation.addParameter("customerID", &arg0); + string ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(string*)operation.getReturnValue(); +} + +const string& MyValueImpl_MyValueService_Proxy::getCustnamecs( string arg0) +{ + tuscany::sca::Operation operation("getCustnamecs"); + operation.addParameter("customerID", &arg0); + target->invoke(operation); + return *(const string*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Proxy.h new file mode 100644 index 0000000000..d61c806e44 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Proxy_h +#define MyValueImpl_MyValueService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValue.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_MyValueService_Proxy : public MyValue +{ +public: + MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_MyValueService_Proxy(); + virtual float getMyValue(const char* customerID); + virtual float getMyValueS(const string& customerID); + virtual string getCustname( string& customerID); + virtual const string& getCustnamecs( string customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_MyValueService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Wrapper.cpp new file mode 100644 index 0000000000..7f38178f9c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Wrapper.cpp @@ -0,0 +1,122 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Wrapper* MyValueImpl_MyValueService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new MyValueImpl_MyValueService_Wrapper(target); + } +} + +MyValueImpl_MyValueService_Wrapper::MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (MyValueImpl*)getImplementation(); +} + +MyValueImpl_MyValueService_Wrapper::~MyValueImpl_MyValueService_Wrapper() +{ + releaseImplementation(); +} + +void* MyValueImpl_MyValueService_Wrapper::newImplementation() +{ + return new MyValueImpl; +} + +void MyValueImpl_MyValueService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void MyValueImpl_MyValueService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getMyValue") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValue(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValue(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getMyValueS") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueS(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueS(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getCustname") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(string*)operation.getReturnValue() = impl->getCustname(p0); + } + else + { + string* ret = new string; + *ret = impl->getCustname(p0); + operation.setReturnValue((const string*)ret); + } + return; + } + if (operationName == "getCustnamecs") + { + string& p0 = *( string*)operation.getParameterValue(0); + const string& ret = impl->getCustnamecs(p0); + operation.setReturnValue(&ret); + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Wrapper.h new file mode 100644 index 0000000000..d3eef80e8f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_MyValueService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Wrapper_h +#define MyValueImpl_MyValueService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValueImpl.hpp" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class MyValueImpl_MyValueService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target); + virtual ~MyValueImpl_MyValueService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + MyValueImpl* impl; +}; + +#endif // MyValueImpl_MyValueService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_customerInfo_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_customerInfo_Proxy.cpp new file mode 100644 index 0000000000..e6800aa311 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_customerInfo_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "MyValueImpl_customerInfo_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_customerInfo_Proxy* MyValueImpl_customerInfo_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_customerInfo_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_customerInfo_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_customerInfo_Proxy*)proxy; + } +} + +MyValueImpl_customerInfo_Proxy::MyValueImpl_customerInfo_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_customerInfo_Proxy::~MyValueImpl_customerInfo_Proxy() +{ + if (target) + delete target; +} + +const char* MyValueImpl_customerInfo_Proxy::getCustomerInformation(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformation"); + operation.addParameter("customerID", &arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_customerInfo_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_customerInfo_Proxy.h new file mode 100644 index 0000000000..3d1d279b7c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_customerInfo_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_customerInfo_Proxy_h +#define MyValueImpl_customerInfo_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_customerInfo_Proxy : public CustomerInfo +{ +public: + MyValueImpl_customerInfo_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_customerInfo_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_customerInfo_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_stockQuote_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_stockQuote_Proxy.cpp new file mode 100644 index 0000000000..d3fd4fbaf0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_stockQuote_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "MyValueImpl_stockQuote_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_stockQuote_Proxy* MyValueImpl_stockQuote_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_stockQuote_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_stockQuote_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_stockQuote_Proxy*)proxy; + } +} + +MyValueImpl_stockQuote_Proxy::MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_stockQuote_Proxy::~MyValueImpl_stockQuote_Proxy() +{ + if (target) + delete target; +} + +commonj::sdo::DataObjectPtr MyValueImpl_stockQuote_Proxy::GetStockQuotes( commonj::sdo::DataObjectPtr arg0) +{ + tuscany::sca::Operation operation("GetStockQuotes"); + operation.addParameter("request", &arg0); + commonj::sdo::DataObjectPtr ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(commonj::sdo::DataObjectPtr*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_stockQuote_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_stockQuote_Proxy.h new file mode 100644 index 0000000000..ad5cee3ca7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceComposite/expected_output/MyValueImpl_stockQuote_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_stockQuote_Proxy_h +#define MyValueImpl_stockQuote_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "StockQuoteService.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_stockQuote_Proxy : public StockQuoteService +{ +public: + MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_stockQuote_Proxy(); + virtual commonj::sdo::DataObjectPtr GetStockQuotes( commonj::sdo::DataObjectPtr request); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_stockQuote_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp new file mode 100644 index 0000000000..95c63da613 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Proxy* CustomerInfoImpl_CustomerInfoService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CustomerInfoImpl_CustomerInfoService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CustomerInfoImpl_CustomerInfoService_Proxy_Destructor(void* proxy) + { + delete (CustomerInfoImpl_CustomerInfoService_Proxy*)proxy; + } +} + +CustomerInfoImpl_CustomerInfoService_Proxy::CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CustomerInfoImpl_CustomerInfoService_Proxy::~CustomerInfoImpl_CustomerInfoService_Proxy() +{ + if (target) + delete target; +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformation(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformation"); + operation.addParameter("customerID", &arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h new file mode 100644 index 0000000000..2bf1b90e87 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Proxy_h +#define CustomerInfoImpl_CustomerInfoService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "/CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Proxy : public CustomerInfo +{ +public: + CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp new file mode 100644 index 0000000000..b32cf3863a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp @@ -0,0 +1,83 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Wrapper.h" + +#include "osoa/sca/sca.h" + +using Other::CustomerInfoImpl; + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Wrapper* CustomerInfoImpl_CustomerInfoService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CustomerInfoImpl_CustomerInfoService_Wrapper(target); + } +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CustomerInfoImpl*)getImplementation(); +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::~CustomerInfoImpl_CustomerInfoService_Wrapper() +{ + releaseImplementation(); +} + +void* CustomerInfoImpl_CustomerInfoService_Wrapper::newImplementation() +{ + return new CustomerInfoImpl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getCustomerInformation") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInformation(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInformation(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h new file mode 100644 index 0000000000..82995c96b0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Wrapper_h +#define CustomerInfoImpl_CustomerInfoService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfoImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CustomerInfoImpl_CustomerInfoService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + Other::CustomerInfoImpl* impl; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.cpp new file mode 100644 index 0000000000..b0d9424ad4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.cpp @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Proxy* MyValueImpl_MyValueService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_MyValueService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_MyValueService_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_MyValueService_Proxy*)proxy; + } +} + +MyValueImpl_MyValueService_Proxy::MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_MyValueService_Proxy::~MyValueImpl_MyValueService_Proxy() +{ + if (target) + delete target; +} + +float MyValueImpl_MyValueService_Proxy::getMyValue(const char* arg0) +{ + tuscany::sca::Operation operation("getMyValue"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float MyValueImpl_MyValueService_Proxy::getMyValueS(const string& arg0) +{ + tuscany::sca::Operation operation("getMyValueS"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +string MyValueImpl_MyValueService_Proxy::getCustname( string& arg0) +{ + tuscany::sca::Operation operation("getCustname"); + operation.addParameter("customerID", &arg0); + string ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(string*)operation.getReturnValue(); +} + +const string& MyValueImpl_MyValueService_Proxy::getCustnamecs( string arg0) +{ + tuscany::sca::Operation operation("getCustnamecs"); + operation.addParameter("customerID", &arg0); + target->invoke(operation); + return *(const string*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.h new file mode 100644 index 0000000000..d61c806e44 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Proxy_h +#define MyValueImpl_MyValueService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValue.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_MyValueService_Proxy : public MyValue +{ +public: + MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_MyValueService_Proxy(); + virtual float getMyValue(const char* customerID); + virtual float getMyValueS(const string& customerID); + virtual string getCustname( string& customerID); + virtual const string& getCustnamecs( string customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_MyValueService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.cpp new file mode 100644 index 0000000000..ac104f9aaf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.cpp @@ -0,0 +1,122 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Wrapper.h" + +#include "osoa/sca/sca.h" + +using Other::MyValueImpl; + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Wrapper* MyValueImpl_MyValueService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new MyValueImpl_MyValueService_Wrapper(target); + } +} + +MyValueImpl_MyValueService_Wrapper::MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (MyValueImpl*)getImplementation(); +} + +MyValueImpl_MyValueService_Wrapper::~MyValueImpl_MyValueService_Wrapper() +{ + releaseImplementation(); +} + +void* MyValueImpl_MyValueService_Wrapper::newImplementation() +{ + return new MyValueImpl; +} + +void MyValueImpl_MyValueService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void MyValueImpl_MyValueService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getMyValue") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValue(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValue(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getMyValueS") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueS(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueS(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getCustname") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(string*)operation.getReturnValue() = impl->getCustname(p0); + } + else + { + string* ret = new string; + *ret = impl->getCustname(p0); + operation.setReturnValue((const string*)ret); + } + return; + } + if (operationName == "getCustnamecs") + { + string& p0 = *( string*)operation.getParameterValue(0); + const string& ret = impl->getCustnamecs(p0); + operation.setReturnValue(&ret); + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.h new file mode 100644 index 0000000000..df388bf43d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Wrapper_h +#define MyValueImpl_MyValueService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValueImpl.hpp" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class MyValueImpl_MyValueService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target); + virtual ~MyValueImpl_MyValueService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + Other::MyValueImpl* impl; +}; + +#endif // MyValueImpl_MyValueService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_customerInfo_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_customerInfo_Proxy.cpp new file mode 100644 index 0000000000..e6800aa311 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_customerInfo_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "MyValueImpl_customerInfo_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_customerInfo_Proxy* MyValueImpl_customerInfo_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_customerInfo_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_customerInfo_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_customerInfo_Proxy*)proxy; + } +} + +MyValueImpl_customerInfo_Proxy::MyValueImpl_customerInfo_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_customerInfo_Proxy::~MyValueImpl_customerInfo_Proxy() +{ + if (target) + delete target; +} + +const char* MyValueImpl_customerInfo_Proxy::getCustomerInformation(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformation"); + operation.addParameter("customerID", &arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_customerInfo_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_customerInfo_Proxy.h new file mode 100644 index 0000000000..3d1d279b7c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_customerInfo_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_customerInfo_Proxy_h +#define MyValueImpl_customerInfo_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_customerInfo_Proxy : public CustomerInfo +{ +public: + MyValueImpl_customerInfo_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_customerInfo_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_customerInfo_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_stockQuote_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_stockQuote_Proxy.cpp new file mode 100644 index 0000000000..d3fd4fbaf0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_stockQuote_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "MyValueImpl_stockQuote_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_stockQuote_Proxy* MyValueImpl_stockQuote_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_stockQuote_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_stockQuote_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_stockQuote_Proxy*)proxy; + } +} + +MyValueImpl_stockQuote_Proxy::MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_stockQuote_Proxy::~MyValueImpl_stockQuote_Proxy() +{ + if (target) + delete target; +} + +commonj::sdo::DataObjectPtr MyValueImpl_stockQuote_Proxy::GetStockQuotes( commonj::sdo::DataObjectPtr arg0) +{ + tuscany::sca::Operation operation("GetStockQuotes"); + operation.addParameter("request", &arg0); + commonj::sdo::DataObjectPtr ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(commonj::sdo::DataObjectPtr*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_stockQuote_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_stockQuote_Proxy.h new file mode 100644 index 0000000000..ad5cee3ca7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespace/expected_output/MyValueImpl_stockQuote_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_stockQuote_Proxy_h +#define MyValueImpl_stockQuote_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "StockQuoteService.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_stockQuote_Proxy : public StockQuoteService +{ +public: + MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_stockQuote_Proxy(); + virtual commonj::sdo::DataObjectPtr GetStockQuotes( commonj::sdo::DataObjectPtr request); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_stockQuote_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.cpp new file mode 100644 index 0000000000..21d956f547 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.cpp @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Proxy* MyValueImpl_MyValueService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_MyValueService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_MyValueService_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_MyValueService_Proxy*)proxy; + } +} + +MyValueImpl_MyValueService_Proxy::MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_MyValueService_Proxy::~MyValueImpl_MyValueService_Proxy() +{ + if (target) + delete target; +} + +float MyValueImpl_MyValueService_Proxy::getMyValueOther(const char* arg0) +{ + tuscany::sca::Operation operation("getMyValueOther"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float MyValueImpl_MyValueService_Proxy::getMyValueSOther(const string& arg0) +{ + tuscany::sca::Operation operation("getMyValueSOther"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +string MyValueImpl_MyValueService_Proxy::getCustnameOther( string& arg0) +{ + tuscany::sca::Operation operation("getCustnameOther"); + operation.addParameter("customerID", &arg0); + string ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(string*)operation.getReturnValue(); +} + +const string& MyValueImpl_MyValueService_Proxy::getCustnamecsOther( string arg0) +{ + tuscany::sca::Operation operation("getCustnamecsOther"); + operation.addParameter("customerID", &arg0); + target->invoke(operation); + return *(const string*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.h new file mode 100644 index 0000000000..bb92aa0556 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Proxy_h +#define MyValueImpl_MyValueService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValue.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_MyValueService_Proxy : public MyValue +{ +public: + MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_MyValueService_Proxy(); + virtual float getMyValueOther(const char* customerID); + virtual float getMyValueSOther(const string& customerID); + virtual string getCustnameOther( string& customerID); + virtual const string& getCustnamecsOther( string customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_MyValueService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.cpp new file mode 100644 index 0000000000..de0f0a0563 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.cpp @@ -0,0 +1,122 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Wrapper.h" + +#include "osoa/sca/sca.h" + +using myvaluecorp::implns::MyValueImpl; + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Wrapper* MyValueImpl_MyValueService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new MyValueImpl_MyValueService_Wrapper(target); + } +} + +MyValueImpl_MyValueService_Wrapper::MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (MyValueImpl*)getImplementation(); +} + +MyValueImpl_MyValueService_Wrapper::~MyValueImpl_MyValueService_Wrapper() +{ + releaseImplementation(); +} + +void* MyValueImpl_MyValueService_Wrapper::newImplementation() +{ + return new MyValueImpl; +} + +void MyValueImpl_MyValueService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void MyValueImpl_MyValueService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getMyValueOther") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueOther(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueOther(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getMyValueSOther") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueSOther(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueSOther(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getCustnameOther") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(string*)operation.getReturnValue() = impl->getCustnameOther(p0); + } + else + { + string* ret = new string; + *ret = impl->getCustnameOther(p0); + operation.setReturnValue((const string*)ret); + } + return; + } + if (operationName == "getCustnamecsOther") + { + string& p0 = *( string*)operation.getParameterValue(0); + const string& ret = impl->getCustnamecsOther(p0); + operation.setReturnValue(&ret); + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.h new file mode 100644 index 0000000000..cfc7c4c07a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeImplClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Wrapper_h +#define MyValueImpl_MyValueService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValueImpl.hpp" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class MyValueImpl_MyValueService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target); + virtual ~MyValueImpl_MyValueService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + myvaluecorp::implns::MyValueImpl* impl; +}; + +#endif // MyValueImpl_MyValueService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.cpp new file mode 100644 index 0000000000..21d956f547 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.cpp @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Proxy* MyValueImpl_MyValueService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_MyValueService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_MyValueService_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_MyValueService_Proxy*)proxy; + } +} + +MyValueImpl_MyValueService_Proxy::MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_MyValueService_Proxy::~MyValueImpl_MyValueService_Proxy() +{ + if (target) + delete target; +} + +float MyValueImpl_MyValueService_Proxy::getMyValueOther(const char* arg0) +{ + tuscany::sca::Operation operation("getMyValueOther"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float MyValueImpl_MyValueService_Proxy::getMyValueSOther(const string& arg0) +{ + tuscany::sca::Operation operation("getMyValueSOther"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +string MyValueImpl_MyValueService_Proxy::getCustnameOther( string& arg0) +{ + tuscany::sca::Operation operation("getCustnameOther"); + operation.addParameter("customerID", &arg0); + string ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(string*)operation.getReturnValue(); +} + +const string& MyValueImpl_MyValueService_Proxy::getCustnamecsOther( string arg0) +{ + tuscany::sca::Operation operation("getCustnamecsOther"); + operation.addParameter("customerID", &arg0); + target->invoke(operation); + return *(const string*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.h new file mode 100644 index 0000000000..210da9a64c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Proxy_h +#define MyValueImpl_MyValueService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValue.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_MyValueService_Proxy : public Other::MyValue +{ +public: + MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_MyValueService_Proxy(); + virtual float getMyValueOther(const char* customerID); + virtual float getMyValueSOther(const string& customerID); + virtual string getCustnameOther( string& customerID); + virtual const string& getCustnamecsOther( string customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_MyValueService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.cpp new file mode 100644 index 0000000000..f84fcf496b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.cpp @@ -0,0 +1,122 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Wrapper* MyValueImpl_MyValueService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new MyValueImpl_MyValueService_Wrapper(target); + } +} + +MyValueImpl_MyValueService_Wrapper::MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (MyValueImpl*)getImplementation(); +} + +MyValueImpl_MyValueService_Wrapper::~MyValueImpl_MyValueService_Wrapper() +{ + releaseImplementation(); +} + +void* MyValueImpl_MyValueService_Wrapper::newImplementation() +{ + return new MyValueImpl; +} + +void MyValueImpl_MyValueService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void MyValueImpl_MyValueService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getMyValueOther") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueOther(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueOther(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getMyValueSOther") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueSOther(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueSOther(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getCustnameOther") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(string*)operation.getReturnValue() = impl->getCustnameOther(p0); + } + else + { + string* ret = new string; + *ret = impl->getCustnameOther(p0); + operation.setReturnValue((const string*)ret); + } + return; + } + if (operationName == "getCustnamecsOther") + { + string& p0 = *( string*)operation.getParameterValue(0); + const string& ret = impl->getCustnamecsOther(p0); + operation.setReturnValue(&ret); + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.h new file mode 100644 index 0000000000..d3eef80e8f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespace/expected_output/MyValueImpl_MyValueService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Wrapper_h +#define MyValueImpl_MyValueService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValueImpl.hpp" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class MyValueImpl_MyValueService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target); + virtual ~MyValueImpl_MyValueService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + MyValueImpl* impl; +}; + +#endif // MyValueImpl_MyValueService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.cpp new file mode 100644 index 0000000000..21d956f547 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.cpp @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Proxy* MyValueImpl_MyValueService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_MyValueService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_MyValueService_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_MyValueService_Proxy*)proxy; + } +} + +MyValueImpl_MyValueService_Proxy::MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_MyValueService_Proxy::~MyValueImpl_MyValueService_Proxy() +{ + if (target) + delete target; +} + +float MyValueImpl_MyValueService_Proxy::getMyValueOther(const char* arg0) +{ + tuscany::sca::Operation operation("getMyValueOther"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float MyValueImpl_MyValueService_Proxy::getMyValueSOther(const string& arg0) +{ + tuscany::sca::Operation operation("getMyValueSOther"); + operation.addParameter("customerID", &arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +string MyValueImpl_MyValueService_Proxy::getCustnameOther( string& arg0) +{ + tuscany::sca::Operation operation("getCustnameOther"); + operation.addParameter("customerID", &arg0); + string ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(string*)operation.getReturnValue(); +} + +const string& MyValueImpl_MyValueService_Proxy::getCustnamecsOther( string arg0) +{ + tuscany::sca::Operation operation("getCustnamecsOther"); + operation.addParameter("customerID", &arg0); + target->invoke(operation); + return *(const string*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.h new file mode 100644 index 0000000000..210da9a64c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Proxy_h +#define MyValueImpl_MyValueService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValue.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_MyValueService_Proxy : public Other::MyValue +{ +public: + MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_MyValueService_Proxy(); + virtual float getMyValueOther(const char* customerID); + virtual float getMyValueSOther(const string& customerID); + virtual string getCustnameOther( string& customerID); + virtual const string& getCustnamecsOther( string customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_MyValueService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.cpp new file mode 100644 index 0000000000..f84fcf496b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.cpp @@ -0,0 +1,122 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Wrapper* MyValueImpl_MyValueService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new MyValueImpl_MyValueService_Wrapper(target); + } +} + +MyValueImpl_MyValueService_Wrapper::MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (MyValueImpl*)getImplementation(); +} + +MyValueImpl_MyValueService_Wrapper::~MyValueImpl_MyValueService_Wrapper() +{ + releaseImplementation(); +} + +void* MyValueImpl_MyValueService_Wrapper::newImplementation() +{ + return new MyValueImpl; +} + +void MyValueImpl_MyValueService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void MyValueImpl_MyValueService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getMyValueOther") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueOther(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueOther(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getMyValueSOther") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueSOther(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueSOther(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getCustnameOther") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(string*)operation.getReturnValue() = impl->getCustnameOther(p0); + } + else + { + string* ret = new string; + *ret = impl->getCustnameOther(p0); + operation.setReturnValue((const string*)ret); + } + return; + } + if (operationName == "getCustnamecsOther") + { + string& p0 = *( string*)operation.getParameterValue(0); + const string& ret = impl->getCustnamecsOther(p0); + operation.setReturnValue(&ret); + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.h new file mode 100644 index 0000000000..d3eef80e8f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeIntfClassWithNamespaceButNotInClassAttr/expected_output/MyValueImpl_MyValueService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Wrapper_h +#define MyValueImpl_MyValueService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValueImpl.hpp" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class MyValueImpl_MyValueService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target); + virtual ~MyValueImpl_MyValueService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + MyValueImpl* impl; +}; + +#endif // MyValueImpl_MyValueService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.cpp new file mode 100644 index 0000000000..543b370282 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl2_CustomerInfoService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl2_CustomerInfoService_Proxy* CustomerInfoImpl2_CustomerInfoService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CustomerInfoImpl2_CustomerInfoService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CustomerInfoImpl2_CustomerInfoService_Proxy_Destructor(void* proxy) + { + delete (CustomerInfoImpl2_CustomerInfoService_Proxy*)proxy; + } +} + +CustomerInfoImpl2_CustomerInfoService_Proxy::CustomerInfoImpl2_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CustomerInfoImpl2_CustomerInfoService_Proxy::~CustomerInfoImpl2_CustomerInfoService_Proxy() +{ + if (target) + delete target; +} + +const char* CustomerInfoImpl2_CustomerInfoService_Proxy::getCustomerInformation(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformation"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.h new file mode 100644 index 0000000000..594f404d13 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl2_CustomerInfoService_Proxy_h +#define CustomerInfoImpl2_CustomerInfoService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "/CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CustomerInfoImpl2_CustomerInfoService_Proxy : public CustomerInfo +{ +public: + CustomerInfoImpl2_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl2_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CustomerInfoImpl2_CustomerInfoService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.cpp new file mode 100644 index 0000000000..191dd3eed2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.cpp @@ -0,0 +1,83 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl2_CustomerInfoService_Wrapper.h" + +#include "osoa/sca/sca.h" + +using myvaluecorp::implns::CustomerInfoImpl2; + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl2_CustomerInfoService_Wrapper* CustomerInfoImpl2_CustomerInfoService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CustomerInfoImpl2_CustomerInfoService_Wrapper(target); + } +} + +CustomerInfoImpl2_CustomerInfoService_Wrapper::CustomerInfoImpl2_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CustomerInfoImpl2*)getImplementation(); +} + +CustomerInfoImpl2_CustomerInfoService_Wrapper::~CustomerInfoImpl2_CustomerInfoService_Wrapper() +{ + releaseImplementation(); +} + +void* CustomerInfoImpl2_CustomerInfoService_Wrapper::newImplementation() +{ + return new CustomerInfoImpl2; +} + +void CustomerInfoImpl2_CustomerInfoService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CustomerInfoImpl2_CustomerInfoService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getCustomerInformation") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInformation(p0); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInformation(p0); + operation.setReturnValue((const const char**)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.h new file mode 100644 index 0000000000..a57f5c4613 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/CustomerInfoImpl2_CustomerInfoService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl2_CustomerInfoService_Wrapper_h +#define CustomerInfoImpl2_CustomerInfoService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfoImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CustomerInfoImpl2_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CustomerInfoImpl2_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CustomerInfoImpl2_CustomerInfoService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + myvaluecorp::implns::CustomerInfoImpl2* impl; +}; + +#endif // CustomerInfoImpl2_CustomerInfoService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Proxy.cpp new file mode 100644 index 0000000000..fe996eabdb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Proxy.cpp @@ -0,0 +1,92 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Proxy* MyValueImpl_MyValueService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_MyValueService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_MyValueService_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_MyValueService_Proxy*)proxy; + } +} + +MyValueImpl_MyValueService_Proxy::MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_MyValueService_Proxy::~MyValueImpl_MyValueService_Proxy() +{ + if (target) + delete target; +} + +float MyValueImpl_MyValueService_Proxy::getMyValue(const char* arg0) +{ + tuscany::sca::Operation operation("getMyValue"); + operation.addParameter(&arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float MyValueImpl_MyValueService_Proxy::getMyValueS(const string& arg0) +{ + tuscany::sca::Operation operation("getMyValueS"); + operation.addParameter(&arg0); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +string MyValueImpl_MyValueService_Proxy::getCustname( string& arg0) +{ + tuscany::sca::Operation operation("getCustname"); + operation.addParameter(&arg0); + string ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(string*)operation.getReturnValue(); +} + +const string& MyValueImpl_MyValueService_Proxy::getCustnamecs( string arg0) +{ + tuscany::sca::Operation operation("getCustnamecs"); + operation.addParameter(&arg0); + target->invoke(operation); + return *(const string*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Proxy.h new file mode 100644 index 0000000000..d61c806e44 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Proxy_h +#define MyValueImpl_MyValueService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValue.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_MyValueService_Proxy : public MyValue +{ +public: + MyValueImpl_MyValueService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_MyValueService_Proxy(); + virtual float getMyValue(const char* customerID); + virtual float getMyValueS(const string& customerID); + virtual string getCustname( string& customerID); + virtual const string& getCustnamecs( string customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_MyValueService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Wrapper.cpp new file mode 100644 index 0000000000..5bbd07a72a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Wrapper.cpp @@ -0,0 +1,122 @@ +/* + * 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. + */ + +#include "MyValueImpl_MyValueService_Wrapper.h" + +#include "osoa/sca/sca.h" + +using myvaluecorp::implns::MyValueImpl; + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_MyValueService_Wrapper* MyValueImpl_MyValueService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new MyValueImpl_MyValueService_Wrapper(target); + } +} + +MyValueImpl_MyValueService_Wrapper::MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (MyValueImpl*)getImplementation(); +} + +MyValueImpl_MyValueService_Wrapper::~MyValueImpl_MyValueService_Wrapper() +{ + releaseImplementation(); +} + +void* MyValueImpl_MyValueService_Wrapper::newImplementation() +{ + return new MyValueImpl; +} + +void MyValueImpl_MyValueService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void MyValueImpl_MyValueService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getMyValue") + { + const char* p0 = *(const char**)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValue(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValue(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getMyValueS") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->getMyValueS(p0); + } + else + { + float* ret = new float; + *ret = impl->getMyValueS(p0); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "getCustname") + { + string& p0 = *(string*)operation.getParameterValue(0); + + if(operation.getReturnValue() != NULL) + { + *(string*)operation.getReturnValue() = impl->getCustname(p0); + } + else + { + string* ret = new string; + *ret = impl->getCustname(p0); + operation.setReturnValue((const string*)ret); + } + return; + } + if (operationName == "getCustnamecs") + { + string& p0 = *( string*)operation.getParameterValue(0); + const string& ret = impl->getCustnamecs(p0); + operation.setReturnValue(&ret); + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Wrapper.h new file mode 100644 index 0000000000..cfc7c4c07a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_MyValueService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_MyValueService_Wrapper_h +#define MyValueImpl_MyValueService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "MyValueImpl.hpp" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class MyValueImpl_MyValueService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + MyValueImpl_MyValueService_Wrapper(tuscany::sca::model::Service* target); + virtual ~MyValueImpl_MyValueService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + myvaluecorp::implns::MyValueImpl* impl; +}; + +#endif // MyValueImpl_MyValueService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_customerInfo_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_customerInfo_Proxy.cpp new file mode 100644 index 0000000000..ffcc1d0003 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_customerInfo_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "MyValueImpl_customerInfo_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_customerInfo_Proxy* MyValueImpl_customerInfo_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_customerInfo_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_customerInfo_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_customerInfo_Proxy*)proxy; + } +} + +MyValueImpl_customerInfo_Proxy::MyValueImpl_customerInfo_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_customerInfo_Proxy::~MyValueImpl_customerInfo_Proxy() +{ + if (target) + delete target; +} + +const char* MyValueImpl_customerInfo_Proxy::getCustomerInformation(const char* arg0) +{ + tuscany::sca::Operation operation("getCustomerInformation"); + operation.addParameter(&arg0); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_customerInfo_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_customerInfo_Proxy.h new file mode 100644 index 0000000000..3d1d279b7c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_customerInfo_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_customerInfo_Proxy_h +#define MyValueImpl_customerInfo_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_customerInfo_Proxy : public CustomerInfo +{ +public: + MyValueImpl_customerInfo_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_customerInfo_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_customerInfo_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_stockQuote_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_stockQuote_Proxy.cpp new file mode 100644 index 0000000000..6e4d0600bd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_stockQuote_Proxy.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ + +#include "MyValueImpl_stockQuote_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + MyValueImpl_stockQuote_Proxy* MyValueImpl_stockQuote_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new MyValueImpl_stockQuote_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void MyValueImpl_stockQuote_Proxy_Destructor(void* proxy) + { + delete (MyValueImpl_stockQuote_Proxy*)proxy; + } +} + +MyValueImpl_stockQuote_Proxy::MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +MyValueImpl_stockQuote_Proxy::~MyValueImpl_stockQuote_Proxy() +{ + if (target) + delete target; +} + +commonj::sdo::DataObjectPtr MyValueImpl_stockQuote_Proxy::GetStockQuotes( commonj::sdo::DataObjectPtr arg0) +{ + tuscany::sca::Operation operation("GetStockQuotes"); + operation.addParameter(&arg0); + commonj::sdo::DataObjectPtr ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(commonj::sdo::DataObjectPtr*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_stockQuote_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_stockQuote_Proxy.h new file mode 100644 index 0000000000..ad5cee3ca7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/MyValueServiceCompositeTwoClasses/expected_output/MyValueImpl_stockQuote_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef MyValueImpl_stockQuote_Proxy_h +#define MyValueImpl_stockQuote_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "StockQuoteService.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class MyValueImpl_stockQuote_Proxy : public StockQuoteService +{ +public: + MyValueImpl_stockQuote_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~MyValueImpl_stockQuote_Proxy(); + virtual commonj::sdo::DataObjectPtr GetStockQuotes( commonj::sdo::DataObjectPtr request); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // MyValueImpl_stockQuote_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp new file mode 100644 index 0000000000..4c3d626bfb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.cpp @@ -0,0 +1,87 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Proxy* CustomerInfoImpl_CustomerInfoService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CustomerInfoImpl_CustomerInfoService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CustomerInfoImpl_CustomerInfoService_Proxy_Destructor(void* proxy) + { + delete (CustomerInfoImpl_CustomerInfoService_Proxy*)proxy; + } +} + +CustomerInfoImpl_CustomerInfoService_Proxy::CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CustomerInfoImpl_CustomerInfoService_Proxy::~CustomerInfoImpl_CustomerInfoService_Proxy() +{ + if (target) + delete target; +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInformationCharPublic( char* arg0, const char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInformationCharPublic"); + operation.addParameter("p1", &arg0); + operation.addParameter("customerID", &arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoACharPublic( char* arg0, const char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoACharPublic"); + operation.addParameter("p1", &arg0); + operation.addParameter("", &arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + +const char* CustomerInfoImpl_CustomerInfoService_Proxy::getCustomerInfoBCharPublic( char* arg0, char* arg1) +{ + tuscany::sca::Operation operation("getCustomerInfoBCharPublic"); + operation.addParameter("p1", &arg0); + operation.addParameter("customerID", &arg1); + const char* ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(const char**)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h new file mode 100644 index 0000000000..a9b56bdb5c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Proxy.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Proxy_h +#define CustomerInfoImpl_CustomerInfoService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "/CustomerInfo.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Proxy : public CustomerInfo +{ +public: + CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformationCharPublic( char* p1, const char* customerID); + virtual const char* getCustomerInfoACharPublic( char* p1, const char* ); + virtual const char* getCustomerInfoBCharPublic( char* p1, char* customerID); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp new file mode 100644 index 0000000000..2aa9fcbdf2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.cpp @@ -0,0 +1,118 @@ +/* + * 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. + */ + +#include "CustomerInfoImpl_CustomerInfoService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CustomerInfoImpl_CustomerInfoService_Wrapper* CustomerInfoImpl_CustomerInfoService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CustomerInfoImpl_CustomerInfoService_Wrapper(target); + } +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CustomerInfoImpl*)getImplementation(); +} + +CustomerInfoImpl_CustomerInfoService_Wrapper::~CustomerInfoImpl_CustomerInfoService_Wrapper() +{ + releaseImplementation(); +} + +void* CustomerInfoImpl_CustomerInfoService_Wrapper::newImplementation() +{ + return new CustomerInfoImpl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CustomerInfoImpl_CustomerInfoService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "getCustomerInformationCharPublic") + { + char* p0 = *( char**)operation.getParameterValue(0); + const char* p1 = *(const char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInformationCharPublic(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInformationCharPublic(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoACharPublic") + { + char* p0 = *( char**)operation.getParameterValue(0); + const char* p1 = *(const char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoACharPublic(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoACharPublic(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + if (operationName == "getCustomerInfoBCharPublic") + { + char* p0 = *( char**)operation.getParameterValue(0); + char* p1 = *( char**)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(const char**)operation.getReturnValue() = impl->getCustomerInfoBCharPublic(p0, p1); + } + else + { + const char** ret = new const char*; + *ret = impl->getCustomerInfoBCharPublic(p0, p1); + operation.setReturnValue((const const char**)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h new file mode 100644 index 0000000000..94b1d5cb4d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/junit/testoutput/SimplePublicPrivateProtectedTest/expected_output/CustomerInfoImpl_CustomerInfoService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CustomerInfoImpl_CustomerInfoService_Wrapper_h +#define CustomerInfoImpl_CustomerInfoService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CustomerInfoImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CustomerInfoImpl_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CustomerInfoImpl_CustomerInfoService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CustomerInfoImpl* impl; +}; + +#endif // CustomerInfoImpl_CustomerInfoService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/lib/readme.txt b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/lib/readme.txt new file mode 100644 index 0000000000..d99c666c6a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/lib/readme.txt @@ -0,0 +1,4 @@ +Place a junit.jar file (not shipped as part of Tuscany) +in this directory to get the scagen build.xml Ant build +file to find it and Junit classes (without setting the +property "junit.jar.folder". diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/scagen.bat b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/scagen.bat new file mode 100644 index 0000000000..8ab5e4abdf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/scagen.bat @@ -0,0 +1,19 @@ +@echo off +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +@java -jar %~d0%~p0scagen.jar %* diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/scagen.sh b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/scagen.sh new file mode 100755 index 0000000000..c50f28b98f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/scagen.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# 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. + + +java -jar scagen.jar -dir $2 -output $4
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/BodyPart.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/BodyPart.java new file mode 100644 index 0000000000..4ccbe0c750 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/BodyPart.java @@ -0,0 +1,96 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ + +package org.apache.tuscany.sca.cpp.tools.common; + +/** + * A snippet of C or C++ source code. If this snippet ends with a return + * statement, this body part also contains the return value. + */ +public class BodyPart { + public final static int TRAILING = 0; + + public final static int RETURN = 1; + + public final static int CATCH = 2; + + private String codeFragment; + + private String returnValue = null; + + private Parameter caughtValue = null; + + private int type; + + BodyPart(String cf) { + codeFragment = cf; + type = TRAILING; + } + + BodyPart(String cf, String rv) { + codeFragment = cf; + if (null != rv && !Utils.isSpace(rv)) { + type = RETURN; + returnValue = rv; + } else + type = TRAILING; + } + + BodyPart(String cf, Parameter cv) { + codeFragment = cf; + caughtValue = cv; + type = CATCH; + } + + public String getCodeFragment() { + return codeFragment; + } + + public boolean isTrailing() { + return TRAILING == type; + } + + public boolean isReturn() { + return RETURN == type; + } + + public boolean isCatch() { + return CATCH == type; + } + + public String getReturnValue() { + if (returnValue != null) + return returnValue.trim(); + else + return null; + } + + public Parameter getCaughtValue() { + return caughtValue; + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/CParsingTool.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/CParsingTool.java new file mode 100644 index 0000000000..669901b4b5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/CParsingTool.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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; + +/** + * The superclass of tools that parse C/C++ code. This CParsingTool provides + * some useful common methods. + */ +public class CParsingTool { + protected boolean failed = false; + + protected Headers headers = new Headers(); + + protected CParsingTool(String[] args) throws Exception { + String text = new String(); + for (int i = 0; i < args.length; i++) + text += args[i] + " "; + Utils.outputDebugString(text); + + Options.set(args); + String config = (String) Options.getOption("-config"); + if (null != config) + Configuration.initialise(config); + } + + /** + * Read in any include files before the main processing of the tool is done. + * This constructs the Headers. + */ + protected Headers preparseHeaders(String option) throws Exception { + Headers headers = new Headers(); + Object o = Options.getOption(option); + if (null != o) { + Utils.outputDebugString("Pre-parsing headers..."); + List includeList; + if (o instanceof List) + includeList = (List) o; + else { + includeList = new ArrayList(); + includeList.add(o); + } + Iterator it = includeList.iterator(); + while (it.hasNext()) { + File include = new File((String) it.next()); + if (!include.isDirectory()) + Utils.rude("Bad include directory " + include); + + DirectoryTree tree = new DirectoryTree(headers, new HashSet( + Arrays.asList(new Object[] { "hpp", "h" }))); + tree.walkTree(include, null, 0); + } + Utils.outputDebugString("Parsing files..."); + } + + return headers; + } + + /** + * Checks the source directory looks good. + */ + protected File checkFile(String option) throws Exception { + String name = (String) Options.getOption(option); + if (null == name) { + printUsage(); + System.exit(-1); + } + + File file = new File(name); + if (!file.isFile() && !file.isDirectory()) + Utils.rude("Bad file or directory " + file); + return file; + } + + /** + * Checks the target directory and creates it if it doesn't already exist. + */ + protected File maybeCreateDirectory(String option) throws Exception { + String name = (String) Options.getOption(option); + if (null == name) { + printUsage(); + System.exit(-1); + } + + File file = new File(name); + if (!file.exists() && !file.mkdir()) + Utils.screenMessage("Failed to create directory " + file); + return file; + } + + protected void printUsage() { + System.out.println("usage: ??"); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Configuration.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Configuration.java new file mode 100644 index 0000000000..246a489c9c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Configuration.java @@ -0,0 +1,132 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Encapsulates the tool's configuration file + */ +public class Configuration { + private static Set files = new HashSet(); + + private static Set classes = new HashSet(); + + private static Set methods = new HashSet(); + + private static Set macros = new HashSet(); + + private static Set defines = new HashSet(); + + private static Set attributes = new HashSet(); + + private static Map others = new HashMap(); + + /** + * No one creates an instance of this class. + */ + private Configuration() { + } + + /** + * Reads in the configuration file + */ + public static void initialise(String filename) throws Exception { + File file = new File(filename); + FileReader fr = new FileReader(file); + BufferedReader br = new BufferedReader(fr); + String line = br.readLine(); + for (int lineno = 1; null != line; lineno++, line = br.readLine()) { + // Ignore lines starting with a # (comments) and blank lines + if (line.startsWith("#")) + continue; + boolean blank = true; + for (int i = 0; i < line.length() && blank; i++) + if (!Character.isWhitespace(line.charAt(i))) + blank = false; + if (blank) + continue; + + int equals = line.indexOf("="); + if (-1 == equals) + Utils.rude("Bad line in configuration file " + filename + + " lineno " + lineno); + String key = line.substring(0, equals).trim(); + String value = line.substring(equals + 1).trim(); + if ("excludefile".equals(key)) { + files.add(value); + } else if ("excludeclass".equals(key)) { + classes.add(value); + } else if ("excludemethod".equals(key)) { + methods.add(value); + } else if ("macro".equals(key)) { + macros.add(value); + } else if ("define".equals(key)) { + defines.add(value); + } else if ("attribute".equals(key)) { + attributes.add(value); + } else { + others.put(key, value); + } + } + } + + public static boolean fileExcluded(String s) { + return files.contains(s); + } + + public static boolean classExcluded(String s) { + return classes.contains(s); + } + + public static boolean methodExcluded(String className, String method) { + return methods.contains(className + "::" + method); + } + + public static boolean isMacro(String s) { + return macros.contains(s); + } + + public static boolean isDefine(String s) { + return defines.contains(s); + } + + public static boolean isAttribute(String s) { + return attributes.contains(s); + } + + public static String getConfigured(String key) { + return (String) others.get(key); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/DirectoryTree.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/DirectoryTree.java new file mode 100644 index 0000000000..36d0af18b3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/DirectoryTree.java @@ -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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.File; +import java.util.Set; +import java.util.StringTokenizer; + +public class DirectoryTree { + private FileActor actor; + + private Set extensions; + + public DirectoryTree(FileActor actor, Set extensions) { + this.actor = actor; + this.extensions = extensions; + } + + /** + * Starts adding trace into the given file. If the given file is a directory + * then this the starting directory and all code beneath and in this + * directory will be given trace. + * + * @param source - + * either the starting directory or one file to add trace to. + */ + public void walkTree(File source, File target, int depth) throws Exception { + depth++; + boolean noTarget = (null == target); + + if (!source.canRead()) + Utils.rude("Cannot read from source directory " + source); + if (!noTarget && !target.canWrite()) + Utils.rude("Cannot write to target directory " + target); + + if (source.isDirectory()) { + File[] filesInDirectory = source.listFiles(); + for (int i = 0; i < filesInDirectory.length; i++) { + File file = filesInDirectory[i]; + String name = file.getName(); + int dot = name.lastIndexOf('.'); + String ext = null; + if (-1 != dot) + ext = name.substring(dot + 1); + + if (file.isDirectory()) { + File newTarget = null; + if (!noTarget) { + StringTokenizer st = new StringTokenizer( + file.getPath(), "\\/"); + String newdir = null; + while (st.hasMoreTokens()) + newdir = st.nextToken(); + String targetName = maybeAppendSeparator(target + .toString()); + newTarget = new File(targetName + newdir); + if (!newTarget.mkdir()) + Utils.rude("Failed to create target directory " + + newTarget); + } + + // recurse + walkTree(file, newTarget, depth); + } else if (file.isFile() + && (extensions == null || (!file.isHidden() && extensions + .contains(ext)))) { + // this is a file and we need to add trace into it ! + actor.actOnFile(file, target, depth); + } + } + } else { + actor.actOnFile(source, target, depth); + } + } + + public static String maybeAppendSeparator(String name) { + if (!name.endsWith("/") && !name.endsWith("\\")) + name += "/"; + return name; + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/FileActor.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/FileActor.java new file mode 100644 index 0000000000..a2bb4ba858 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/FileActor.java @@ -0,0 +1,37 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.File; + +/** + * DirectoryTree calls this interface to allow implementations of this interface + * to act on a file in the directory tree. + */ +public interface FileActor { + public void actOnFile(File source, File target, int depth) throws Exception; +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/FilePart.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/FilePart.java new file mode 100644 index 0000000000..b6bdf92878 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/FilePart.java @@ -0,0 +1,80 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ + +package org.apache.tuscany.sca.cpp.tools.common; + +/** + * A piece of C++ source code + */ +public class FilePart { + public final static int UNKNOWN = 0; + + public final static int COMMENT = 1; + + public final static int METHOD = 2; + + public final static int FIELD = 3; + + public final static int BEGINSCOPE = 4; + + public final static int ENDSCOPE = 5; + + public final static int DIRECTIVE = 6; + + public final static int WHITESPACE = 7; + + public final static int MACRO = 8; + + public final static int CLASSATTRIBUTE = 9; + + public final static int ENUM = 10; + + public final static int PROTOTYPE = 11; + + public final static int TYPEDEF = 12; + + protected String cppsource; + + protected int type; + + FilePart(String s, int type) { + cppsource = s; + this.type = type; + } + + public int getType() { + return type; + } + + int length() { + return cppsource.length(); + } + + public String toString() { + return cppsource; + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Headers.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Headers.java new file mode 100644 index 0000000000..533e1fd14a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Headers.java @@ -0,0 +1,167 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class Headers implements FileActor { + private ArrayList instanceMethods = new ArrayList(); + + private ArrayList staticMethods = new ArrayList(); + + private ArrayList allMethods = new ArrayList(); + + private ArrayList classNames = new ArrayList(); + + private boolean failed = false; + + public void actOnFile(File header, File ignored, int depth) + throws Exception { + if (Configuration.fileExcluded(header.getName())) { + Utils.outputDebugString("excluding " + header + "..."); + return; + } + + Utils.outputDebugString("pre-parsing " + header + "..."); + FileReader fr = null; + try { + fr = new FileReader(header); + } catch (FileNotFoundException fnfe) { + throw fnfe; + } + BufferedReader inputFile = new BufferedReader(fr); + + try { + InputCppSourceCode code = new InputCppSourceCode(inputFile, header + .getName()); + Iterator it = code.getPartIterator(); + while (it.hasNext()) { + FilePart fp = (FilePart) (it.next()); + if (fp.getType() != FilePart.PROTOTYPE) + continue; + PrototypePart pp = (PrototypePart) fp; + String className = pp.className(); + if (null == className) + continue; + String trimClassName = className; + if (className.endsWith("::")) + trimClassName = className.substring(0, + className.length() - 2); + if (!classNames.contains(trimClassName)) + classNames.add(trimClassName); + + Signature sign = new Signature(fp.toString()); + sign.setClassName(className); + //Tuscany + sign.setScope(pp.getSignature().getScope()); + sign.setNamespace(pp.getSignature().getNamespace()); + + // "Clean" the signature by stripping off attributes, + // semicolons, etc + Signature cleaned = new Signature(sign.toStringWithoutAttrs()); + //Tuscany - problem + cleaned.setClassName(className); + cleaned.setScope(pp.getSignature().getScope()); + cleaned.setNamespace(pp.getSignature().getNamespace()); + //Tuscany - end of problem + + + if (-1 == sign.getAttributes().indexOf("static")) + instanceMethods.add(cleaned); + else + staticMethods.add(cleaned); + } + } catch (ParsingException pe) { + failed = true; + } + + inputFile.close(); + allMethods.addAll(staticMethods); + allMethods.addAll(instanceMethods); + } + + public boolean failed() { + return failed; + } + + public boolean isInstanceMethod(Signature sign) { + Iterator it = instanceMethods.iterator(); + while (it.hasNext()) { + Signature s = (Signature) it.next(); + if (s.equals(sign)) + return true; + } + return false; + } + + public boolean isStaticMethod(Signature sign) { + Iterator it = staticMethods.iterator(); + while (it.hasNext()) { + Signature s = (Signature) it.next(); + if (s.equals(sign)) + return true; + } + return false; + } + + public List getMethods(String method) { + ArrayList list = new ArrayList(); + if (null == method) + return list; + + Iterator it = allMethods.iterator(); + while (it.hasNext()) { + Signature s = (Signature) it.next(); + if (method.equals(s.getMethodName())) + list.add(s); + } + return list; + } + + /** + * Tuscany change - a method to get all the method signatures at once + */ + public List getAllMethods() { + ArrayList list = new ArrayList(); + Iterator it = allMethods.iterator(); + while (it.hasNext()) { + Signature s = (Signature) it.next(); + list.add(s); + } + return list; + } + + public boolean isClassName(String text) { + return classNames.contains(text); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/InputCppSourceCode.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/InputCppSourceCode.java new file mode 100644 index 0000000000..225909e1d1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/InputCppSourceCode.java @@ -0,0 +1,425 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.BufferedReader; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.StringTokenizer; + +public class InputCppSourceCode { + + private ArrayList parts = new ArrayList(); + + private String name; + + public InputCppSourceCode(BufferedReader br, String name) throws Exception { + this.name = name; + + String s = null; + StringBuffer buff = new StringBuffer(); + for (int i = 1;; i++) { + try { + s = br.readLine(); + } catch (Exception e) { + System.err.println("Ignoring exception thrown parsing file " + + name + " line number " + i); + e.printStackTrace(); + break; + } + if (s == null) + break; + buff.append(s + "\n"); + } + String str = buff.toString(); + + // TODO: When checking for rest.startsWith("struct") should + // check the next letter after struct is not alphanumeric otherwise + // we'll get false matches on a function called structify() for + // instance. Also applies to enum, union, public, typedef, etc + + String rest, text = ""; + int scopedepth = 0; + String scope = "public"; + String currentClass = null; + String currentNamespace = null; + for (int idx = 0; idx < str.length(); /* No idx++ */ + ) { + rest = str.substring(idx); + if (Character.isWhitespace(rest.charAt(0))) { + int ridx = 0; + while (ridx < rest.length() + && Character.isWhitespace(rest.charAt(ridx))) + ridx++; + text = rest.substring(0, ridx); + FilePart fp = new FilePart(text, FilePart.WHITESPACE); + parts.add(fp); + idx += ridx; + + } else if (rest.startsWith("/*")) { + int ridx = rest.indexOf("*/"); // Don't use Utils here + text = str.substring(idx, idx + ridx + 2); + FilePart fp = new FilePart(text, FilePart.COMMENT); + parts.add(fp); + idx += text.length(); + + } else if (rest.startsWith("//")) { + text = str.substring(idx, idx + rest.indexOf("\n")); + FilePart fp = new FilePart(text, FilePart.COMMENT); + parts.add(fp); + idx += text.length(); + + } else if (rest.startsWith("#")) { + int ridx = rest.indexOf("\n"); + char c = rest.charAt(ridx - 1); + while (-1 != ridx && '\\' == c) { + String rest2 = rest.substring(ridx + 1); + ridx += rest2.indexOf("\n") + 1; + c = rest.charAt(ridx - 1); + } + text = str.substring(idx, idx + ridx); + FilePart fp = new FilePart(text, FilePart.DIRECTIVE); + parts.add(fp); + idx += text.length(); + + } else if (rest.startsWith("}")) { + if (scopedepth <= 0) //Tuscany need to increase scopedepth for + // namespaces? + Utils.rude("Braces do not match", name, lineNo(str, idx), + rest.substring(0, rest.indexOf("\n"))); + else + scopedepth--; + // TODO: better checking that this brace really ends the class + if (0 == scopedepth) + currentClass = null; + scope = "public"; + parts.add(new FilePart("}", FilePart.ENDSCOPE)); + idx++; + + } else if (rest.startsWith(";")) { + parts.add(new FilePart(";", FilePart.FIELD)); + idx++; + + } else if (!Character.isLetter(rest.charAt(0)) + && '~' != rest.charAt(0) && '_' != rest.charAt(0)) { + Utils.rude("Lines must start with a letter ", name, lineNo(str, + idx), rest.substring(0, rest.indexOf("\n"))); + + } else if (MacroPart.isAMacro(rest)) { + MacroPart mp = MacroPart.create(rest); + parts.add(mp); + idx += mp.length(); + + } else if (beginsScope(rest)) { + + //Tuscany a namespace comes in here + scopedepth++; + text = rest.substring(0, Utils.indexOf(rest, "{") + 1); + FilePart fp = new FilePart(text, FilePart.BEGINSCOPE); + parts.add(fp); + idx += text.length(); + if (Utils.startsWith(text, "class")) { + // TODO: cope with comments here + // TODO: split out classes into a ClassPart + StringTokenizer st = new StringTokenizer(text, + Utils.whitespace + ":{"); + st.nextToken(); // step over "class" + while (st.hasMoreTokens()) { + String word = st.nextToken(); + if (Configuration.isAttribute(word)) + continue; + currentClass = word; + break; + } + } + + //Tuscany + if (Utils.startsWith(text, "namespace")) { + // TODO: cope with comments here + StringTokenizer st = new StringTokenizer(text, + Utils.whitespace + "{"); + st.nextToken(); // step over "namespace" + String word = ""; + while (st.hasMoreTokens()) { + word = st.nextToken(); + if (word.equals("{")) { + break; + } + + } + + if(currentNamespace == null) + { + currentNamespace = word; + } + else + { + currentNamespace += "::" + word; + } + //We have not got to the class yet + //so will need ot deal with the namespace + //when we do + } + // Tuscany end + + } else if (isEnumOrUnion(rest)) { + int ridx = Utils.findMatching(rest, '{', '}') + 1; + String rest2 = rest.substring(ridx); + ridx = idx + ridx + Utils.indexOf(rest2, ';') + 1; + text = str.substring(idx, ridx); + FilePart fp = new FilePart(text, FilePart.ENUM); + parts.add(fp); + idx += text.length(); + + } else if (scopedepth > 0 + && (rest.startsWith("public") + || rest.startsWith("protected") || rest + .startsWith("private"))) { + int colon = rest.indexOf(":"); + if (-1 == colon) + Utils.rude("No colon found after public or private ", name, + lineNo(str, idx), rest.substring(0, rest + .indexOf("\n"))); + scope = str.substring(idx, idx + colon); + text = str.substring(idx, idx + colon + 1); + FilePart fp = new FilePart(text, FilePart.CLASSATTRIBUTE); + parts.add(fp); + idx += text.length(); + + } else if (Utils.startsWith(rest, "typedef")) { + int semicolon = Utils.indexOf(rest, ';'); + int brace = Utils.indexOf(rest, '{'); + + if (-1 == semicolon) + Utils.rude("No semicolon found after typedef", name, + lineNo(str, idx), rest.substring(0, rest + .indexOf("\n"))); + + if (-1 == brace || semicolon < brace) { + // Simple typedef + text = str.substring(idx, idx + semicolon + 1); + } else { + // Typedef of a struct, etc + int endbrace = Utils.findMatching(rest, '{', '}'); + String rest2 = rest.substring(endbrace); + semicolon = Utils.indexOf(rest2, ';'); + text = str.substring(idx, idx + endbrace + semicolon + 1); + } + FilePart fp = new FilePart(text, FilePart.TYPEDEF); + parts.add(fp); + idx += text.length(); + + } else { + if (isMethod(rest)) { + + int brace = Utils.indexOf(rest, '{'); + Signature signature = new Signature(str.substring(idx, idx + + brace)); + if (signature.failed()) + Utils.rude("Signature parsing failed", name, lineNo( + str, idx), signature.getOriginal()); + if (null != currentClass + && null == signature.getClassName()) + signature.setClassName(currentClass); + signature.setScope(scope); + signature.setNamespace(currentNamespace); + + String body = rest.substring(brace); + int endBrace = Utils.findMatching(body, '{', '}'); + body = body.substring(0, endBrace + 1); + int endIdx = idx + signature.originalLength() + + body.length(); + text = str.substring(idx, endIdx); + MethodPart mp = new MethodPart(text, signature, body); + parts.add(mp); + idx += text.length(); + + } else if (isField(rest)) { + int semicolon = Utils.indexOf(rest, ';'); + text = str.substring(idx, idx + semicolon + 1); + FilePart fp = new FilePart(text, FilePart.FIELD); + parts.add(fp); + idx += text.length(); + + } else if (isPrototype(rest)) { + int semicolon = Utils.indexOf(rest, ';'); + text = str.substring(idx, idx + semicolon + 1); + PrototypePart pp = new PrototypePart(text, currentClass, currentNamespace); + pp.setScope(scope); + parts.add(pp); + idx += text.length(); + + } else { + //TODO other file parts here - not sure if there are any + // others? + Utils.rude("Unrecognised file part", name, + lineNo(str, idx), rest.substring(0, rest + .indexOf("\n"))); + } // end if + } // end if + } // end for + } + + public Iterator getPartIterator() { + return parts.iterator(); + } + + private int lineNo(String s, int idx) { + int n = 0; + for (int i = 0; i < idx && i < s.length(); i++) + if ('\n' == s.charAt(i)) + n++; + return n; + } + + /** + * Find out whether we are defining a class, struct or extern "C" which may + * contain function implementations. These will have braces which begin a + * new scope. Ignore function prototypes that return a struct. struct mystr { + * int f1; }; struct mystr func(); struct mystr func() { struct mystr a; + * return a; } + */ + private static boolean beginsScope(String s) throws ParsingException { + if (isMethod(s)) + return false; + + int brace = Utils.indexOf(s, '{'); + int semicolon = Utils.indexOf(s, ';'); + + // Return false for class prototypes, but true for class definitions. + if (Utils.startsWith(s, "class")) { + if (-1 == brace) + return false; + if (-1 == semicolon) + return true; + return brace < semicolon; + } + + if (Utils.startsWith(s, "struct")) { + if (-1 == brace || -1 == semicolon) + return false; + return brace < semicolon; + } + + //Tuscany handle namespace for prototypes + //in a similar way to "class" + if (Utils.startsWith(s, "namespace")) { + if (-1 == brace || -1 == semicolon) + return false; + return brace < semicolon; + } + + return startsWithExternScope(s); + } + + /** + * There are 4 types of extern ... extern int field; extern int func(); + * extern "C" int func() { return 2; } extern "C" { int func() { return 2; } } + * This method should return true only for the last of these three examples + * since only the last one creates a new scope using braces. + */ + private static boolean startsWithExternScope(String s) + throws ParsingException { + if (!s.startsWith("extern")) + return false; + + int brace = Utils.indexOf(s, '{'); + int semicolon = Utils.indexOf(s, ';'); + int bracket = Utils.indexOf(s, '('); + + if (-1 == brace) + return false; + return (-1 == semicolon || brace < semicolon) + && (-1 == bracket || brace < bracket); + } + + /** + * Find out whether we are defining an enum or union which will contain + * braces. Ignore function prototypes that return an enum or union. enum + * colour { red, blue }; enum colour func(); enum colour func() { return + * colour.red; } + */ + private static boolean isEnumOrUnion(String s) throws ParsingException { + if ((!Utils.startsWith(s, "enum") && !Utils.startsWith(s, "union")) + || isMethod(s)) + return false; + + int brace = Utils.indexOf(s, '{'); + int semicolon = Utils.indexOf(s, ';'); + return -1 != brace && (-1 == semicolon || brace < semicolon); + } + + /** + * Rules to recognise fields and methods... + * + * Fields must contain a semicolon Methods may or may not contain a + * semicolon Prototypes must contain a semicolon Fields may or may not + * contain a brace (array initialisers do) Methods must contain a brace + * Prototypes must not contain a brace Fields may or may not contain a + * bracket (casts do) Methods must contain a bracket Prototypes must contain + * a bracket + * + * It's a method if it contains a bracket and then a brace before the first + * semicolon (if there is a semicolon). It's a prototype if it's not a + * method and it contains brackets before a semicolon. It's a field if it's + * not a method or a prototype and it contains a semicolon. If it's not a + * field, a method or a prototype and we haven't recognised it previously + * then it's an error. + */ + private static boolean isMethod(String s) throws ParsingException { + int semicolon = Utils.indexOf(s, ';'); + int brace = Utils.indexOf(s, '{'); + int bracket = Utils.indexOf(s, '('); + + return (-1 != bracket && -1 != brace && bracket < brace && (-1 == semicolon || brace < semicolon)); + } + + private static boolean isPrototype(String s) throws ParsingException { + int semicolon = Utils.indexOf(s, ';'); + int bracket = Utils.indexOf(s, '('); + return !isMethod(s) && -1 != semicolon && -1 != bracket + && bracket < semicolon; + } + + private static boolean isField(String s) throws ParsingException { + int semicolon = Utils.indexOf(s, ';'); + return !isMethod(s) && !isPrototype(s) && -1 != semicolon; + } + + public String getName() { + return name; + } + + public String toString() { + StringBuffer text = new StringBuffer(); + for (int i = 0; i < parts.size(); i++) { + text.append(((FilePart) (parts.get(i))).toString()); + } + return text.toString(); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/MacroPart.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/MacroPart.java new file mode 100644 index 0000000000..317ad2fc44 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/MacroPart.java @@ -0,0 +1,87 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ + +/* + * A C or C++ macro as it is used in the source code + */ +package org.apache.tuscany.sca.cpp.tools.common; + +class MacroPart extends FilePart { + /** + * Factory method to create a MacroPart. + * + * @param s + * unparsed source code which may start with a define or macro. + */ + static MacroPart create(String s) { + String orig = getOriginalText(s); + if (null == orig) + return null; + return new MacroPart(orig); + } + + MacroPart(String s) { + super(s, FilePart.MACRO); + } + + /** + * @param s + * unparsed source code which may start with a define or macro. + * @return all of s up to the end of the define or macro. + */ + private static String getOriginalText(String s) { + String name = getName(s); + int len = name.length(); + if (null == name) + return null; + else if (Configuration.isDefine(name)) { + return s.substring(0, len); + } else if (Configuration.isMacro(name)) { + String rest = s.substring(len); + len += Utils.findMatching(rest, '(', ')'); + return s.substring(0, len + 1); + } else + return null; + } + + static boolean isAMacro(String s) { + if (s == null || 0 == s.length()) + return false; + String name = getName(s); + return Configuration.isMacro(name) || Configuration.isDefine(name); + } + + private static String getName(String s) { + int i; + for (i = 0; i < s.length(); i++) + if (!Character.isLetterOrDigit(s.charAt(i)) && '_' != s.charAt(i)) + break; + if (s.length() == i) + return null; + return s.substring(0, i); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/MethodPart.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/MethodPart.java new file mode 100644 index 0000000000..a25610c1f9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/MethodPart.java @@ -0,0 +1,133 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.util.ArrayList; + +/** + * A C or C++ method from a piece of source code. The method has a signature and + * a body (the bit between the braces). + */ +public class MethodPart extends FilePart { + private Signature signature; + + private String body; + + MethodPart(String s, Signature signature, String body) { + super(s, METHOD); + this.signature = signature; + this.body = body; + } + + public Signature getSignature() { + return signature; + } + + public String getOriginalSignature() { + return signature.getOriginal(); + } + + /** + * Returns the method body as code snippets, each ending with a place where + * a trace statement belongs. The end of the first code snippet is where the + * entry trace should go. The end of every other snippet is a return from + * the method. + */ + public BodyPart[] getBodyParts() throws ParsingException { + String b = body; // Don't alter field member + if (b.startsWith("{")) + b = b.substring(1); + + // Add in trace exit at all the return statements in the method. + ArrayList al = new ArrayList(); + int idxR = Utils.indexOf(b, "return"); + int idxC = Utils.indexOf(b, "catch"); + while (-1 != idxR || -1 != idxC) { + if (-1 == idxC || (-1 != idxR && idxR < idxC)) { + String frag = b.substring(0, idxR); + String rest = b.substring(idxR + "return".length()); + + int semicolon = Utils.indexOf(rest, ';'); + if (-1 == semicolon) + Utils.rude("Missing semicolon in " + signature); + String retVal = rest.substring(0, semicolon); + BodyPart bp = new BodyPart(frag, retVal); + al.add(bp); + b = b.substring(idxR + "return".length() + retVal.length() + 1); + } else { + String frag = b.substring(0, idxC); + String rest = b.substring(idxC); + + int brace = Utils.indexOf(rest, "{"); + if (-1 == brace) + Utils.rude("Missing open brace in " + signature); + Signature signature = new Signature(rest.substring(0, brace)); + frag = frag + rest.substring(0, brace + 1); + BodyPart bp = new BodyPart(frag, signature.getParameters()[0]); + al.add(bp); + b = rest.substring(brace + 1); + } + idxR = Utils.indexOf(b, "return"); + idxC = Utils.indexOf(b, "catch"); + } + + // Add in trace exit before the last } if there are no returns in + // the method or there is code after the last return and the method + // returns void. + // int f1(){try{return f2();}catch(Exception& e){throw;}} + // has code after the last return but having a traceexit before the + // last brace wouldn't compile since the method returns an int. We + // cope with this by only adding in a traceexit before the last brace + // if the method returns void. That may mean we add in an unreachable + // traceexit which may give a compiler warning, but that should be + // benign. + // + // TODO: Not quite good enough for + // void f(int a){if(a){printf("a");}else{printf("!a");return;}} + // as a trace exit is needed before the last } in case a>0 but + // void f(int a){if(a){printf("a");return;}else{printf("!a");return;}} + // would give compiler warnings about unreachable code if a trace + // exit is added before the last brace. This could be tricky to fix. + if ((0 == al.size() || -1 != Utils.indexOf(b, ';')) + && null == signature.getReturnType().getType()) { + + int last = b.lastIndexOf('}'); + if (-1 == last) + Utils.rude("Missing end brace in " + signature); + String b2 = b.substring(0, last); + al.add(new BodyPart(b2)); + b = b.substring(last); + } + + // The final body part is the last } + al.add(new BodyPart(b)); + + BodyPart[] bps = new BodyPart[al.size()]; + System.arraycopy(al.toArray(), 0, bps, 0, al.size()); + return bps; + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Options.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Options.java new file mode 100644 index 0000000000..6e951f03de --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Options.java @@ -0,0 +1,164 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + * + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Command line options passed to a tool's main program. All command line + * options should begin with a dash "-". Some command line options take a value + * which is the next parameter after the option. Others do not. + */ +public class Options { + static HashMap pairs = new HashMap(); + + static List values = new ArrayList(); + + /** + * No one constructs this class. + */ + private Options() { + } + + public static void reset() { + pairs = new HashMap(); + values = new ArrayList(); + } + + /** + * Initialises the options based on the args passed to main + */ + public static void set(String args[]) { + for (int i = 0; i < args.length; i++) { + if (args[i].startsWith("-")) { + if ((i + 1 <= args.length - 1) && // next one is testable + !args[i + 1].startsWith("-") // and it starts with a "-" + ) { + String key = args[i]; + Object pairValue = pairs.get(key); + if (null == pairValue) { + pairs.put(args[i], args[i + 1]); + } else if (pairValue instanceof String) { + List l = new ArrayList(); + l.add(pairValue); + l.add(args[i + 1]); + pairs.put(key, l); + } else if (pairValue instanceof List) { + ((List) pairValue).add(args[i + 1]); + } + i++; // Step over value for this key + } else + values.add(args[i]); + } + } + } + + public static Object getOption(String key) { + return pairs.get(key); + } + + static boolean isOptionSet(String key) { + return values.contains(key) || null!=pairs.get(key); + } + + /** + * This option will cause scagen to print out messages + * about the artefacts it is processing + * @return + */ + public static boolean verbose() { + return isOptionSet("-verbose"); + } + + /** + * This option will cause scagen to print out some + * basic internal log type messages + * @return + */ + public static boolean debug() { + return isOptionSet("-debug"); + } + + /** + * This option will cause scagen to print out some + * text that can be used or pasted into a command + * file to copy all the relevant artefacts from + * where they are found or generated to a specific + * deployment location + * + * @return + */ + public static boolean deploy() { + return isOptionSet("-deploy"); + } + + /** + * This option will prevent scagen from actually writing out + * the generated files. It is useful if used in conjunction + * with the "-deploy" option. + * @return + */ + public static boolean noGenerate() { + return isOptionSet("-nogenerate"); + } + + /** + * This option is useful only when used in conjunction with + * the "-deploy" option. It changes the output to be more like the + * source code of a command script to copy the files to a + * specific place. + * @return + */ + public static boolean outputCommand() { + return isOptionSet("-outputCommand"); + } + + /** + * This option is useful only when used in conjunction with + * the "-deploy" option. It changes the output to be a simple + * list of artefacts. It has no effect if the "-outputCommand" + * option is set. + * + * @return + */ + public static boolean list() { + return isOptionSet("-list"); + } + + /** + * This option is maintained for compatibility with the + * original package source. It is not used by new scagen code. + * + * @return + */ + public static boolean quiet() { + return isOptionSet("-quiet"); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java new file mode 100644 index 0000000000..2d98e0a836 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Parameter.java @@ -0,0 +1,216 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + * + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * A parameter from a method signature. The parameter is the datatype plus its + * name but not its value. + */ +public class Parameter { + private ArrayList type = new ArrayList(); + + private String name = null; + + private boolean failed = false; + + /** + * Defaults to a parameter in a parameter list so it HAS a parameter name in + * it + */ + Parameter(List parts) { + this(parts, false); + } + + /** + * A parameter which is a return type does not have a parameter name. + * Parameters in a parameter list do have parameter names embedded in them + */ + Parameter(List parts, boolean isRetType) { + if (parts == null || parts.size() == 0) + return; + + // Tuscany: The original code below from apache axis blocks int + // getCustomer(long) + // i.e. no spaces in parameter list. + // We do not need to deal with "..." as parameters to SCS methods. + // + // if (!isRetType && parts.size() == 1) { + // if ("...".equals(parts.get(0))) { + // type.add("..."); + // name = ""; + // } else if (!"void".equals(parts.get(0))) + // failed = true; // Seems like bad C++ code here + // return; + // } + + if (isRetType) { + Iterator it = parts.iterator(); + while (it.hasNext()) + type.add(it.next()); + + // Some methods return have void on their signature and others + // have nothing. So to make them both the same, if a method + // doesn't return anything make type null. + // TODO: This assumption is wrong - methods that return nothing + // default to returning an int! + if (1 == type.size() && "void".equals(type.get(0))) + type = new ArrayList(); + + } else { + // Cope with array subscripts [] after the name + int arrIdx = -1; + for (int i = 0; i < parts.size(); i++) { + String tok = (String) parts.get(i); + if ("[".equals(tok)) { + arrIdx = i; + break; + } + } + + // Find the name + int nameIdx = parts.size() - 1; + if (-1 != arrIdx) + nameIdx = arrIdx - 1; + + // Even in real method declarations, parameters may not have a name + boolean noName = false; + name = (String) parts.get(nameIdx); + // Tuscany: The original code below from apache axis + // was updated to work with signatures of + // the form fn(int) a non-named, no-space, parameter list. + // if (Utils.cPrimitives.contains(name) || + // Utils.cTypeQualifiers.contains(name) ) + // + if (Utils.cPrimitives.contains(name) + || Utils.cTypeQualifiers.contains(name) + || parts.size() == 1) + noName = true; + + if (noName) { + name = null; + for (int i = 0; i < parts.size(); i++) + type.add(parts.get(i)); + } else { + // Construct the type + for (int i = 0; i < nameIdx; i++) + type.add(parts.get(i)); + + if (-1 != arrIdx) + for (int i = arrIdx; i < parts.size(); i++) + type.add(parts.get(i)); + } + } + } + + public boolean failed() { + return failed; + } + + public String getType() { + String s = null; + Iterator it = type.iterator(); + while (it.hasNext()) { + String next = (String) it.next(); + if (null == s) + s = next; + else if ("*".equals(next) || "&".equals(next)) + s += next; + else + s += " " + next; + } + return s; + } + + public String getTypeWithoutConst() { + String s = null; + Iterator it = type.iterator(); + while (it.hasNext()) { + String next = (String) it.next(); + if ("const".equals(next)) + continue; + else if (null == s) + s = next; + else if ("*".equals(next) || "&".equals(next)) + s += next; + else + s += " " + next; + } + return s; + } + + public String getName() { + return name; + } + + public boolean isVoid() { + return 0 == type.size(); + } + + public boolean isDotDotDot() { + return 1 == type.size() && "...".equals(type.get(0)); + } + + /** + * For two parameters to match their types must match or both be null, but + * the parameters names don't have to match. Just because a parameter is + * called something different in a header file as in the the source file + * doesn't mean it's a different parameter. + */ + public boolean equals(Object o) { + if (null == o || !(o instanceof Parameter)) + return false; + Parameter that = (Parameter) o; + if (type.size() != that.type.size()) + return false; + for (int i = 0; i < type.size(); i++) { + String s1 = (String) type.get(i); + String s2 = (String) that.type.get(i); + if (!Utils.safeEquals(s1, s2)) + return false; + } + return true; + } + + public String toString() { + if (0 == type.size()) + return "void"; + if (null == name) + return getType(); + return getType() + " " + name; + } + + public Iterator iterator() { + if (null == type) + return null; + return type.iterator(); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java new file mode 100644 index 0000000000..876d2dc3e0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/ParsingException.java @@ -0,0 +1,48 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + * + */ +package org.apache.tuscany.sca.cpp.tools.common; + +public class ParsingException extends Exception { + + public ParsingException() { + super(); + } + + public ParsingException(String message) { + super(message); + } + + public ParsingException(String message, Throwable cause) { + super(message, cause); + } + + public ParsingException(Throwable cause) { + super(cause); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java new file mode 100644 index 0000000000..e51b2d781c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/PrototypePart.java @@ -0,0 +1,56 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + * + */ +package org.apache.tuscany.sca.cpp.tools.common; + +/** + * A function prototype in an include file and possibly in a class definition. + */ +public class PrototypePart extends FilePart { + private Signature signature; + + public PrototypePart(String s, String className, String namespace) { + super(s, PROTOTYPE); + signature = new Signature(s); + if (null != className) + signature.setClassName(className); + if (null != namespace && namespace.length()>0) + signature.setNamespace(namespace); + } + + String className() { + return signature.getClassName(); + } + + public Signature getSignature() { + return signature; + } + + public void setScope(String scope) { + signature.setScope(scope); + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java new file mode 100644 index 0000000000..d7052b7843 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Signature.java @@ -0,0 +1,506 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* + * Branched from the original class that was also contributed to the + * org.apache.axis.tools.common package. + * + */ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +/** + * A C or C++ method signature with the ability to parse it. TODO: properly + * support variable length argument lists using "..." TODO: passing or returning + * function pointers (hopefully not needed) TODO: Cope with ~ <space>Classname() + */ +public class Signature { + private String originalText; + + private String attributes; + + private String className = null; + + private String namespace = null; + + private String methodName = null; + + private Parameter returnType = null; + + private Parameter[] params = null; + + private String trailingAttributes; + + private String scope = "public"; + + private boolean failed = false; + + private boolean traceable = true; + + private final static Set knownAttrs = new HashSet(Arrays + .asList(new Object[] { "public", "private", "extern", "\"C\"", + "virtual", "static", "inline" })); + + private final static Set specialOperators = new HashSet( + Arrays.asList(new Object[] { "(", ")", "*", ",", "&", "]", "[", + "=", "~" })); + + /** + * Takes an unparsed signature string and parses it. + * + * TODO: Should optionally pass in the className here in case it's an inline + * method implementation inside the class{}. Just so the className comes out + * in the trace. + */ + Signature(String s) { + originalText = s; + + try { + List tokens = tokenise(s); + + ArrayList alAttrs = new ArrayList(); + ArrayList alName = new ArrayList(); + ArrayList alParms = new ArrayList(); + ArrayList alTrailAttrs = new ArrayList(); + ArrayList alInits = new ArrayList(); + if (!splitUp(tokens, alAttrs, alName, alParms, alTrailAttrs, + alInits)) { + failed = true; + return; + } + + parseAttributes(alAttrs); + parseNameAndRetType(alName); + parseParameters(alParms); + parseTrailingAttributes(alTrailAttrs); + + // Ignore any tokens after the ) since these are (hopefully) + // constructor initialisers + + traceable = !Configuration.methodExcluded(className, methodName); + } catch (NullPointerException npe) { + failed = true; + traceable = false; + } + } + + /** + * Parse the signature into tokens. This removes whitespace and comments and + * separates out "*", ",", "(", ")", "&", "[" and "]". + */ + private static List tokenise(String s) { + ArrayList tokens = new ArrayList(); + String tok = null; + boolean space = true; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (Character.isWhitespace(c)) { + space = true; + continue; + } + if (space) { + if (tok != null) + tokens.add(tok); + tok = "" + c; + } else + tok += c; + space = false; + + if (tok.endsWith("/*")) { + String sub = s.substring(i); + int endcomm = sub.indexOf("*/"); + if (endcomm == -1) + break; + i += endcomm + 1; + if (tok.equals("/*")) + tok = ""; + else + tok = tok.substring(0, tok.length() - 2); + continue; + } + + if (tok.endsWith("//")) { + String sub = s.substring(i); + int endcomm = sub.indexOf("\n"); + if (endcomm == -1) + break; + i += endcomm; + if (tok.equals("//")) + tok = ""; + else + tok = tok.substring(0, tok.length() - 1); + continue; + } + + if (tok.endsWith("::")) + space = true; + + String sc = "" + c; + if (specialOperators.contains(sc)) { + if (!tok.equals(sc)) { + tokens.add(tok.substring(0, tok.length() - 1)); + tok = sc; + } + space = true; + } + } + tokens.add(tok); + return tokens; + } + + /** + * Split up a tokenised method signature into a list of attributes, a list + * of name and return type tokens, a list of parameter tokens and a list of + * initialiser tokens. + */ + private static boolean splitUp(List tokens, List attrs, List nameAndRet, + List parms, List trailAttrs, List inits) { + + // nameStart points to the start of the return type if there is one + // else the start of the method name + int nameStart; + for (nameStart = 0; nameStart < tokens.size(); nameStart++) { + String tok = (String) (tokens.get(nameStart)); + if (!knownAttrs.contains(tok) && !Configuration.isAttribute(tok)) + break; + } + if (nameStart == tokens.size()) + return false; + + // initStart points to the initialisers, or thrown exceptions after + // the parameter list. throw is a keyword so we can safely search for + // it. + int initStart = tokens.size(); + for (int i = nameStart; i < tokens.size(); i++) { + String tok = (String) tokens.get(i); + if ((tok.startsWith(":") && !tok.startsWith("::")) + || "throw".equals(tok)) + initStart = i; + } + + int parmEnd; + for (parmEnd = initStart - 1; parmEnd > nameStart; parmEnd--) + if (")".equals(tokens.get(parmEnd))) + break; + if (parmEnd == nameStart) + return false; + + int parmStart = parmEnd; + for (parmStart = parmEnd; parmStart > nameStart; parmStart--) + if ("(".equals(tokens.get(parmStart))) + break; + + for (int i = 0; i < tokens.size(); i++) { + Object tok = tokens.get(i); + if (i < nameStart || Configuration.isAttribute((String) tok)) + attrs.add(tok); + else if (i < parmStart) + nameAndRet.add(tok); + else if (i <= parmEnd) + parms.add(tok); + else if (i < initStart) + trailAttrs.add(tok); + else + inits.add(tok); + } + return true; + } + + private void parseAttributes(List list) { + attributes = new String(); + Iterator it = list.iterator(); + while (it.hasNext()) { + if (attributes.length() > 0) + attributes += " "; + String next = (String) it.next(); + + //Tuscancy + //the scope is not present in the attributes + //but is set later in the InputCppSource contructor + if ("public".equals(next) || "protected".equals(next) + || "private".equals(next)) + scope = next; + attributes += next; + } + } + + private void parseNameAndRetType(List list) { + int size = list.size(); + int idx; + // "operator" is a key word so if it's present we know we're + // dealing with operator overloading. The operator that's been + // overloaded might have been split up into multiple tokens. + for (idx = 0; idx < size; idx++) + if ("operator".equals(list.get(idx))) + break; + + if (idx < size) { + methodName = ""; + for (int i = idx; i < size; i++) + methodName += (String) list.get(i); + } else { // No operator overloading + methodName = "" + list.get(size - 1); + idx = size - 1; + } + + // If it's a destructor, the "~" will be split out into a separate + // token, so add it onto the methodName here. + if (idx > 0 && "~".equals(list.get(idx - 1))) { + methodName = "~" + methodName; + idx--; + } + + // The class name comes before the method name + while (idx > 0 && ((String) list.get(idx - 1)).endsWith("::")) { + if (null == className) + className = (String) list.get(idx - 1); + else + className = (String) list.get(idx - 1) + className; + idx--; + } + + // Whatever's left before the classname/methodname must be the + // return type + ArrayList retParm = new ArrayList(); + for (int i = 0; i < idx; i++) + retParm.add(list.get(i)); + + returnType = new Parameter(retParm, true); + } + + /** + * Constructs the parameter list + */ + private void parseParameters(List list) { + ArrayList alParams = new ArrayList(); + Iterator it = list.iterator(); + String token = (String) it.next(); // step over the ( + while (it.hasNext() && !")".equals(token)) { + token = (String) it.next(); + + int template = 0; // Depth of template scope + boolean foundEquals = false; + // Ignore default value for an optional parameter + ArrayList parm = new ArrayList(); + while (!token.equals(")") && (!token.equals(",") || template > 0)) { + if (token.equals("=")) + foundEquals = true; + if (!foundEquals) + parm.add(token); + if (contains(token, "<")) + template++; + if (contains(token, ">")) + template--; + token = (String) it.next(); + } + + // No parameters so break out + if (token.equals(")") && 0 == parm.size()) + break; + + Parameter p = new Parameter(parm); + if (p.failed()) { + failed = true; + return; + } + + // Copes with void func(void) + if (!p.isVoid()) + alParams.add(p); + } + + int size = alParams.size(); + if (size > 0) { + params = new Parameter[size]; + System.arraycopy(alParams.toArray(), 0, params, 0, size); + } + } + + private void parseTrailingAttributes(List list) { + trailingAttributes = new String(); + Iterator it = list.iterator(); + while (it.hasNext()) { + if (trailingAttributes.length() > 0) + trailingAttributes += " "; + trailingAttributes += (String) it.next(); + } + } + + public String getOriginal() { + return originalText; + } + + public int originalLength() { + return originalText.length(); + } + + public boolean failed() { + return failed; + } + + public String getAttributes() { + return attributes; + } + + public String getClassName() { + return className; + } + + /** + * @param namespace The namespace to set. + */ + public void setNamespace(String namespace) { + this.namespace = namespace; + } + + /** + * @return Returns the namespace. + */ + public String getNamespace() { + return namespace; + } + + public String getTrimClassName() { + return trimClassName(className); + } + + public String getMethodName() { + return methodName; + } + + public Parameter getReturnType() { + return returnType; + } + + public Parameter[] getParameters() { + return params; + } + + public boolean isConstructor() { + return className != null && methodName != null + && trimClassName(className).equals(methodName); + } + + public boolean isDestructor() { + return className != null && methodName != null + && methodName.startsWith("~") + && methodName.endsWith(trimClassName(className)); + } + + private static String trimClassName(String name) { + if (name.endsWith("::")) + return name.substring(0, name.length() - 2); + return name; + } + + void setClassName(String className) { + if (null == className) + return; + if (!className.endsWith("::")) + className += "::"; + this.className = className; + } + + public String getScope() { + return scope; + } + + /** + * Sets the scope, but only if the scope is not set by an explicit attribute + * in the signature. + */ + public void setScope(String scope) { + if (-1 == attributes.indexOf(this.scope)) + this.scope = scope; + } + + /** + * Should this method be traced? + */ + public boolean traceable() { + return traceable; + } + + private static boolean contains(String src, String tgt) { + if (src == null || tgt == null) + return false; + if (-1 == src.indexOf(tgt)) + return false; + return true; + } + + public boolean equals(Object obj) { + if (null == obj || !(obj instanceof Signature)) + return false; + Signature that = (Signature) obj; + if (!Utils.safeEquals(className, that.className)) + return false; + if (!Utils.safeEquals(methodName, that.methodName)) + return false; + if (!Utils.safeEquals(returnType, that.returnType)) + return false; + if (null == params && null == that.params) + return true; + if (null != params && null == that.params) + return false; + if (null == params && null != that.params) + return false; + if (params.length != that.params.length) + return false; + for (int i = 0; i < params.length; i++) + if (!Utils.safeEquals(params[i], that.params[i])) + return false; + return true; + } + + public String toStringWithoutAttrs() { + String s = new String(); + if (returnType != null) + s += returnType + " "; + if (className != null) + s += className; + s += methodName + "("; + for (int i = 0; params != null && i < params.length; i++) { + if (i > 0) + s += ", "; + s += params[i].toString(); + } + s += ")"; + return s; + } + + public String toString() { + String s = attributes; + if (attributes.length() > 0) + s += " "; + s += toStringWithoutAttrs(); + if (trailingAttributes.length() > 0) + s += " " + trailingAttributes; + return s; + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java new file mode 100644 index 0000000000..d26c5ec5ae --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/Utils.java @@ -0,0 +1,556 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +/* +* Branched from the original class that was also contributed to the +* org.apache.axis.tools.common package. +* +*/ +package org.apache.tuscany.sca.cpp.tools.common; + +import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +//Apache Common Logging +//import org.apache.commons.logging.Log; +//import org.apache.commons.logging.LogFactory; + +/** +* Static utility methods. Some of these methods are similar to the methods on +* java.lang.String except they are aware of C/C++ comments and string literals. +* +* TODO: Many of these methods would perform better using StringBuffer not +* String +*/ +public final class Utils { + // All the C primitive data types + public final static Set cPrimitives = new HashSet(Arrays + .asList(new Object[] { "void", "byte", "char", "unsigned", + "signed", "int", "short", "long", "double", "float", + "struct", "class", "enum", "union" })); + + // All the qualifiers that can affect C types + public final static Set cTypeQualifiers = new HashSet( + Arrays.asList(new Object[] { "(", ")", "*", ",", "&", "]", "[", + "const" })); + + public final static String whitespace = " \t\r\n"; + + //private static Log log = LogFactory.getLog(CLASS.class); + + /** + * Never instantiate this class + */ + private Utils() { + } + + /** + * Is this string all whitespace? + */ + static boolean isSpace(String s) { + for (int i = 0; i < s.length(); i++) + if (!Character.isWhitespace(s.charAt(i))) + return false; + return true; + } + + // TODO look for other trailing chars like { (because of class{) + static boolean startsWith(String source, String target) { + if (source == null || target == null) + return false; + if (!source.startsWith(target)) + return false; + if (source.length() == target.length()) + return true; + if (Character.isWhitespace(source.charAt(target.length()))) + return true; + return false; + } + + /** + * Performs a C-aware version of String.indexOf(char) in that it skips + * characters in string literals and comments. + */ + static int indexOf(String s, char c) throws ParsingException { + if ('"' == c) + rude("Utils.indexOf cannot be passed quotes"); + + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == c) + return i; + + i = skip(s.substring(i), i); + if (-1 == i) + return -1; + } + return -1; + } + + /** + * Performs a C-aware version of String.indexOf(String) in that it skips + * characters in string literals and comments and makes sure that the target + * string is not embedded in a longer word. + */ + static int indexOf(String s, String t) { + char t0 = t.charAt(0); + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == t0 + && s.substring(i).startsWith(t)) { + + + // When finding a single non-alphanumeric character + if(t.length() == 1 && !Character.isLetterOrDigit(t0)) + return i; + + // When finding an alphanumeric string + if((0 == i || !Character.isLetterOrDigit(s.charAt(i - 1))) // Check we're matching at the start of a word + && (s.length() == (i + t.length()) || !Character + .isLetterOrDigit(s.charAt(i + t.length())))) // Check we're still matching by the end of the word + return i; + } + + i = skip(s.substring(i), i); + if (-1 == i) + return -1; + } + return -1; + } + + /** + * Matches braces or quotes and is C-aware. It skips characters in string + * literals and comments. + */ + static int findMatching(String s, char c1, char c2) { + int depth = 0; + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) == c1) + depth++; + else if (s.charAt(i) == c2) { + depth--; + if (depth == 0) + return i; + } else { + i = skip(s.substring(i), i); + if (-1 == i) + return -1; + } + } + return -1; + } + + /** + * Failed to parse the source code for some reason. This method prints out a + * suitably rude message, and then what? I haven't quite decided yet. + * + * TODO: Do something sensible here like throw an Exception which will give + * up on this file completely and tidy up the output file. It may be just + * too dangerous to try to carry on. But we need to fail in such a way that + * the build system knows that we've failed for this file and can build this + * file without trace. + */ + public static void rude(String reason, String filename, int lineno, + String codefragment) throws ParsingException { + + String text = "Bad C++ code!! "; + if (reason != null) + text += reason; + if (filename != null) + text += " " + filename + " lineno=" + lineno; + if (codefragment != null) + text += " <" + codefragment + ">"; + System.err.println(text); + throw new ParsingException(); + } + + /** + * This method reports an error level problem + * + * @param reason + * why we have an error level problem + */ + public static void rude(String reason) throws ParsingException { + // Apache commons logging + // log.error(Object line, null); + // or for now.... + rude(reason, null, 0, null); + } + + /** + * This method reports an error level problem + * + * @param reason + * why we have an error level problem + */ + public static void screenMessage(String msg) { + // Apache commons logging + // log.error(Object line, null); + // or for now.... + System.out.println(msg); + } + + /** + * Escapes special characters like " so that they can be output in a C + * string literal. Also removes newlines, since C string literals can't be + * split over lines. + */ + String pretty(String s) { + StringBuffer sb = new StringBuffer(s); + for (int i = 0; i < sb.length(); i++) + switch (sb.charAt(i)) { + case '"': + sb = sb.insert(i, '\\'); + i++; + break; + case '\n': + sb = sb.deleteCharAt(i); + i--; + break; + } + return sb.toString(); + } + + private static boolean startsWithComment(String s) { + if (null == s || s.length() < 2) + return false; + if (s.startsWith("//")) + return true; + if (s.startsWith("/*")) + return true; + return false; + } + + private static int endOfComment(String s) { + int idx; + if (s.startsWith("//")) + idx = s.indexOf("\n"); + else { + idx = s.indexOf("*/"); + if (-1 != idx) + idx++; // Step over */ + } + return idx; + } + + private static boolean startsWithStringLiteral(String s) { + if (null == s || s.length() < 1) + return false; + if (s.startsWith("\"") || s.startsWith("'")) + return true; + return false; + } + + private static int endOfStringLiteral(String s) { + boolean escape = false; + char c0 = s.charAt(0); + for (int i = 1; i < s.length(); i++) { + if (!escape && s.charAt(i) == c0) + return i; + + // \" or \' does not end the literal + if ('\\' == s.charAt(i)) + // Escaping a \ should switch escape off so \\' does end + // the literal + escape = !escape; + else + escape = false; + } + return -1; + } + + /** + * If the String s starts with a string literal or a comment, return i plus + * the index of the end of the literal or comment. String literals are + * enclosed in " or ' and comments start with /* or //. + */ + private static int skip(String s, int i) { + int j = 0; + if (startsWithStringLiteral(s)) { + j = endOfStringLiteral(s); + if (-1 == j) + return -1; + } else if (startsWithComment(s)) { + j = endOfComment(s); + if (-1 == j) + return -1; + } + return i + j; + } + + /** + * A better method than .equals() because it doesn't NullPointerException + * when one of the parameters is null. + */ + public static boolean safeEquals(Object o1, Object o2) { + if (null == o1 && null == o2) + return true; + if (null == o1 && null != o2) + return false; + if (null != o1 && null == o2) + return false; + return o1.equals(o2); + } + + public static void outputDebugString(String line) { + if (!Options.quiet()) { + if (Options.debug()) + // Apache commons logging + // log.debug(Object line, null); + // or for now + System.out.println(line); + } + } + + /** + * This static method allows different parts of the code to inform about + * significant events. Code interested in specific types of event can + * register a listener against that type (not written yet) + * + * @param eventType + * An int type enum indicating the type of event. + * @param message + * A message that can be output to the user. + */ + public static final int EVENT_TYPE_XML_ITEM_PARSED = 1; + + public static final int EVENT_TYPE_FILE_PARSED = 2; + + public static final int EVENT_TYPE_FILE_CREATE = 3; + + public static final int VERBOSE_LIMIT = 1024; + + public static final int DEPLOYMENT_ARTEFACT = VERBOSE_LIMIT; + + public static final int DEPLOYMENT_ARTEFACT_ENCOUNTERED = DEPLOYMENT_ARTEFACT + 1; + + public static final int DEPLOYMENT_ARTEFACT_GENERATED = DEPLOYMENT_ARTEFACT + 2; + + public static final int DEPLOYMENT_INPUT_DIRECTORY = DEPLOYMENT_ARTEFACT + 3; + + public static final int DEPLOYMENT_OUTPUT_DIRECTORY = DEPLOYMENT_ARTEFACT + 4; + + private static boolean reportArtefacts = false; + + /** + * An easily callable method to allow tracking/reposting of events in scagen + * and other tools. + * + * @param eventType + * used for classifying event + * @param message + * a user readable message + */ + public static void postEvent(int eventType, String message) { + if (Options.verbose() && eventType < VERBOSE_LIMIT) { + screenMessage(message); + } + + if ((eventType & DEPLOYMENT_ARTEFACT) > 0) { + reportArtefact(message, eventType); + } + + } + + /** + * @param message + * The user message + * @param eventType + * The type of event (input or output). This is used to determine + * if the path name of the file starts with the COMPOSITE_ROOT + * directory or the given output directory as the one of these + * prefixes is removed from the path name in order to give the + * new (destination) path relative to the new composite root + * + * + */ + + static String scagenInputDir = "COMPOSITE_ROOT"; + + static String scagenOutputDir = "SCAGEN_OUTPUT"; + + static String newCompositeRoot = "NEW_COMPOSITE_ROOT"; + + static String generatedDirName = "$sourceDir1"; + + private static void reportArtefact(String message, int eventType) { + + if (Utils.isReportArtefacts()) { + + // Changing the value of the variable below will alter the output of + // the + // deploy assist strings: + // true will result in a "copy source NEW_COMPOSITE_ROOT\dest" output + // and + // false will result in a "inputDir c:\fred" + // "outputDir c:\bob" + // "input c:\fred\sca.composite" + // "output c:\bob\proxy.h" type output + String command = null; + + try { + newCompositeRoot = (String) Options.getOption("-deploy"); + command = (String) Options.getOption("-command"); + } catch (Exception e) { + // let it default + } + + if (null == newCompositeRoot) { + newCompositeRoot = "DEPLOY_COMPOSITE_ROOT"; + } + + if (null == command) { + command = "copy"; + } + + if (Options.outputCommand()) { + + String tail = message; + switch (eventType) { + case DEPLOYMENT_ARTEFACT_ENCOUNTERED: + if (message.startsWith(scagenInputDir)) { + tail = message.substring(scagenInputDir.length()); + } + + String dest = joinPathElements(newCompositeRoot, tail); + + System.out.println(command + " " + platformSlashes(message) + + " " + platformSlashes(dest)); + break; + + case DEPLOYMENT_ARTEFACT_GENERATED: + if (message.startsWith(scagenOutputDir)) { + tail = message.substring(scagenOutputDir.length()); + } + + dest = joinPathElements(newCompositeRoot, tail); + System.out.println(command + " " + platformSlashes(message) + + " " + platformSlashes(dest)); + break; + case DEPLOYMENT_INPUT_DIRECTORY: + scagenInputDir = message; + //System.out.println("inputDir " + message); + break; + case DEPLOYMENT_OUTPUT_DIRECTORY: + scagenOutputDir = message; + //System.out.println("outputDir " + message); + break; + default: + break; + } + + } else { + + if (Options.list()) { + switch (eventType) { + case DEPLOYMENT_ARTEFACT_ENCOUNTERED: + case DEPLOYMENT_ARTEFACT_GENERATED: + System.out.println(platformSlashes(message)); + break; + case DEPLOYMENT_INPUT_DIRECTORY: + case DEPLOYMENT_OUTPUT_DIRECTORY: + default: + break; + } + } else { + switch (eventType) { + case DEPLOYMENT_ARTEFACT_ENCOUNTERED: + //TODO make efficient + System.out.println("$sourceDir1" + + platformSlashes(message.substring(scagenInputDir.length()))); + break; + case DEPLOYMENT_ARTEFACT_GENERATED: + //TODO make efficient + System.out.println(generatedDirName + + platformSlashes(message.substring(scagenOutputDir.length()))); + break; + case DEPLOYMENT_INPUT_DIRECTORY: + scagenInputDir = platformSlashes(message); + System.out.println("sourceDir1=" + scagenInputDir); + break; + case DEPLOYMENT_OUTPUT_DIRECTORY: + scagenOutputDir = platformSlashes(message); + if (!scagenInputDir.equals(scagenOutputDir)) { + generatedDirName = "$sourceDir2"; + System.out.println("sourceDir2=" + scagenOutputDir); + } else { + //generatedDirName = "sourceDir1"; + } + break; + default: + break; + } + } + } + } + } + + /** + * @param tail + * @param tail + * @return + */ + public static String joinPathElements(String root, String tail) { + String separator; + // Stick in a "/" (File.separator) if required. + if ((tail.substring(0, 1).equals("/") || newCompositeRoot.substring( + root.length() - 1, root.length()).equals("/")) + || (tail.substring(0, 1).equals("\\") || root.substring( + root.length() - 1, root.length()).equals("\\")) + + ) { + separator = ""; + } else { + separator = File.separator; + } + String dest = newCompositeRoot + separator + tail; + return dest; + } + + /** + * @param reportArtefacts + * The reportArtefacts to set. + */ + public static void setReportArtefacts(boolean reportArtefacts) { + Utils.reportArtefacts = reportArtefacts; + } + + /** + * @return Returns the reportArtefacts. + */ + private static boolean isReportArtefacts() { + return reportArtefacts; + } + + private static String platformSlashes(String path) { + if (null == path) { + return path; + } + // We need a double level of \\ escapes if the slashes are + // this way round. + String separatorForRegex = File.separator + .replaceAll("\\\\", "\\\\\\\\"); + return path.replaceAll("[/\\\\]+", separatorForRegex); + + } + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html new file mode 100644 index 0000000000..c423477193 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/common/package.html @@ -0,0 +1,58 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html> + +<head> +<title>Design documentation for org\apache\tuscany\sca\cpp\tools\common</title> +</head> + +<body lang=EN-GB> + +<div class=Section1> + +<h1>Overview</h1> + +This package can be used to reflect across C++ source code. It can produce +a network of descriptive objects describing C++ Headers, Signatures, Parameters and so +on that it finds in a given location of the file system. +Each of the descriptive objects has a set of getters that return either +the descriptive child objects, or for primitives, the string that represents the actual +value such as "int" or "myFunction". +<p> +There are also various utility methods that help with navigating the information, for example the Signature +class has an isConstructor method. The API Javadoc contains further details of these. +<p> +The package can scan a directory using a file mask to identify what types +of files are to be scanned. In this application we are interested only +in the function prototypes in the C++ header files. +<p> +The implementation was originated using some java code that was also +contributed to the Apache org.apache.axis.tools.common package. Care +has been taken that the original code was not sourced via Apache. If +this project is adopted by Apache then it is very possible that this +package could be merged with or made obsolete by org.apache.axis.tools.common +and because of this the design and interfaces have been preserved from +the original code as much as possible. + +<p> +</div> +</body> + +</html> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java new file mode 100644 index 0000000000..28974b41a6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentDomNodeHandler.java @@ -0,0 +1,366 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sca.cpp.tools.common.Headers; +import org.apache.tuscany.sca.cpp.tools.common.Signature; +import org.apache.tuscany.sca.cpp.tools.common.Utils; +import org.w3c.dom.Node; + +/** + * This class will do the required processing for the <component>element of a + * sca composite file. + */ +public class ComponentDomNodeHandler extends GenericDomNodeHandler { + + /** + * This method will do the "normal" processing and then trigger a call to + * processComponentNode. + * + * @param node + * the node being processed + * @param contextXPath + * the XPath to the node + * @param handlers + * the map pf element names to DomNodeHandlers + * @param parameters + * a map of XPaths to parameters values found so far + */ + + public void handleNode(Node node, String contextXPath, Map handlers, + Map parameters) { + + // Pick up attrs and the interface.cpp child elements + super.handleNode(node, contextXPath, handlers, parameters); + + try { + //OK now go and create the wrapper and proxy for the service + processComponentNode(contextXPath, parameters); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + /** + * This method basically moved from the text names of things to operating on + * the actual Files. It will also verify or work out the correct class name + * for the implmentation and complain if this does match at least one + * potential service method in the class. + * + * @param contextXPath + * used to pull the correct values from the parameters map (as + * there can be multiple implementation.cpp elelements in there). + * @param parameters + * a map of XPath keys to attribute values + * @throws Exception + */ + private void processComponentNode(String contextXPath, Map parameters) + throws Exception { + + String implHeader = (String) parameters.get(contextXPath + + "/implementation.cpp/@header"); + String implClass = (String) parameters.get(contextXPath + + "/implementation.cpp/@class"); + + File compositeOrFragmentFile = (File) parameters + .get("compositeOrFragmentFile"); + File implHeaderFile = null; + if (null != compositeOrFragmentFile) { + File dir = compositeOrFragmentFile.getParentFile(); + implHeaderFile = new File(dir, implHeader); + } else { + throw new InternalError( + "Internal error: composite or fragment file not present in internal parameters"); + } + + try { + String resolvedImplClassName = getClassName(implHeaderFile, + implClass); + + // Check or retrieve the impl Class name. + if (null == resolvedImplClassName) { + try { + //A class attribute was set but there were no methods of + // the + // class in the header + System.out + .println("Classname given (" + + implClass + + ") does not match any header file method's classes in file: " + + implHeaderFile.getCanonicalPath()); + } catch (IOException e) { + System.out + .println("Classname given (" + + implClass + + ") does not match any header file method's classes in file: " + + implHeaderFile.getAbsolutePath()); + } + return; + } else { + File target = (File) parameters.get("targetFile"); + // go into the .componentType file and generate the cpp + processComponentTypeFile(implHeaderFile, target, + resolvedImplClassName); + + } + } catch (Exception e) { + String compName = (String) parameters + .get("/compositeFragment/component/@name"); + Utils + .screenMessage("Problem interpreting header or class attributes in " + + compName + + " component, in " + + compositeOrFragmentFile.getPath() + " file"); + System.exit(-2); + } + + } + + /** + * The purpose of this method is to move from the DOM parameters to dealing + * with the actual Files involved. It is from this method that we kick off + * the processing of the componentType file. + * + * @param header + * the implementation header + * @param target + * the directory for the output + * @param implClass + * @throws Exception + */ + private void processComponentTypeFile(File header, File target, + String implClass) throws Exception { + + // The componentType files should be in the same dir as the Impl + // header... + if (header == null || target == null) { + return; + } + + File componentTypeDirectory = header.getParentFile(); + String headerFileName = header.getName(); + String componentTypeName = headerFileName.substring(0, headerFileName + .lastIndexOf(".")); + + File componentTypeFile = new File(componentTypeDirectory, + componentTypeName + ".componentType"); + + ComponentTypeFileHandler ctParser = new ComponentTypeFileHandler(); + + // The implClass is used in the generated wrapper code so we need to + // store + // it so we can tunnel through the standard actOnFile signature. + + int namespaceEnd = -1; + if (null != implClass) { + namespaceEnd = implClass.lastIndexOf("::"); + } + + String namespace = null; + + if (-1 != namespaceEnd) { + namespace = implClass.substring(0, namespaceEnd); + ctParser.setParameter("implNamespace", namespace); + implClass = implClass.substring(namespaceEnd + 2); + } + + if (implClass != null) { + ctParser.setParameter("implClass", implClass); + } + + try { + ctParser.handleComponentTypeFile(componentTypeFile, target); + } catch (Exception e) { + Utils + .screenMessage("There has been a problem parsing the componentType file: " + + componentTypeFile.getCanonicalPath()); + Utils.screenMessage(" the reported errors is " + + e.getLocalizedMessage()); + Utils.screenMessage(" and the java exception stack is below."); + e.printStackTrace(); + throw e; + } + } + + /** + * The resolve and check the classname of the service. If we have an + * implementation class name we have to check that there is: at least one + * (non-private, non constructor or finalizer) method of that class in the + * header If there is no implementation class then we will return the class + * of the first non-private/constructor/finalizer method we find. + * + * @param header + * @param implementationCppClass + * @return + * @throws Exception + */ + private String getClassName(File header, String implementationCppClass) + throws Exception { + String methodClassName = null; + List methods = null; + + if (null == header) { + return null; + } + + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, header + .getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED, + "Scagen processing C++ implementation header " + + header.getAbsolutePath()); + + try { + Headers headers = new Headers(); + + headers.actOnFile(header, null, 1); + + methods = headers.getAllMethods(); + + } catch (FileNotFoundException fnfe) { + String path; + try { + path = header.getCanonicalPath(); + } catch (IOException e1) { + path = header.getPath(); + } + Utils.screenMessage("The header file: " + path + + " referenced cannot be found."); + throw fnfe; + } catch (Exception e) { + String path = header.getPath(); + Utils.screenMessage("The header file: " + path + + " referenced is not valid. Reason given is " + + e.getLocalizedMessage()); + throw e; + } + + // We need at least some methods + if (null == methods) { + return null; + } + + // We need at least one service method of to do anything + methods = trimMethodsOfPrivatesConstructorsAndDestrutors(methods); + if (null == methods || methods.size() == 0) { + return null; + } + + // If the user specifies an implementation class then we need at + // least one service method of that class + if (implementationCppClass != null) { + methods = filterMethodsToOneClass(methods, implementationCppClass); + + if (null == methods || methods.size() == 0) { + return null; + } else { + // There was at least one method of the correct type + return implementationCppClass; + } + } else { + // Implementation class is null so we return the fully qualified classname of the + // first service method + Signature s = (Signature) methods.get(0); + String className = s.getTrimClassName(); + String namespace = s.getNamespace(); + if( namespace != null && namespace.length() > 0) + { + className = namespace + "::" + className; + } + + return className; + } + } + + /** + * Filter the mthods supplied to only ones fo the supplied class. + * + * @param methods + * the list of methods + * @param implementationCppClass + * the class we wish + * @return a list of methods of the correct class + */ + private List filterMethodsToOneClass(List methods, + String implementationCppClass) { + + if (null == methods) { + return null; + } + + if (null == implementationCppClass + || implementationCppClass.length() == 0) { + return null; + } + + for (Iterator iter = methods.listIterator(); iter.hasNext();) { + Signature method = (Signature) iter.next(); + + String className = method.getTrimClassName(); + String namespace = method.getNamespace(); + + if (namespace != null && namespace.length() > 0) { + className = namespace + "::" + className; + } + + if (!implementationCppClass.equals(className)) { + iter.remove(); + } + } + + return methods; + + } + + /** + * This method removes contructor and destructor methods from the list. + * + * @param methods + * the list of methods + * @return + */ + private List trimMethodsOfPrivatesConstructorsAndDestrutors(List methods) { + + if (null == methods) { + return null; + } + + for (Iterator iter = methods.listIterator(); iter.hasNext();) { + Signature method = (Signature) iter.next(); + + if (method.isConstructor() || method.isDestructor()) { + iter.remove(); + } + } + + return methods; + } + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java new file mode 100644 index 0000000000..6c86fa25b5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ComponentTypeFileHandler.java @@ -0,0 +1,130 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; + +import org.apache.tuscany.sca.cpp.tools.common.FileActor; +import org.apache.tuscany.sca.cpp.tools.common.Utils; + +/** + * The purpose of this class is to specialise the map of XML element handlers + * for a XXX.componentType file that is used by the XMLFileActor + */ +public class ComponentTypeFileHandler extends XMLFileActor { + + static { + // We set up a map for each element type we wish to handle + // this alows the XML handling code to be generic and type free + // while the handlers don't have to do mcuh XML handling. + + GenericDomNodeHandler gdnh = new GenericDomNodeHandler(); + handlers.put("componentType", gdnh); + handlers.put("interface.cpp", gdnh); + + ServiceDomNodeHandler sdnh = new ServiceDomNodeHandler(); + handlers.put("service", sdnh); + + ReferenceDomNodeHandler rdnh = new ReferenceDomNodeHandler(); + handlers.put("reference", rdnh); + } + + /** + * This method just exists to add the default starting depth of 1 to the + * underlying actOnFile interface + * + * @param componentTypeXML + * @param target + * @throws Exception + */ + public void handleComponentTypeFile(File componentTypeXML, File target) + throws Exception { + // We have already set up the XML element handlers. + actOnFile(componentTypeXML, target, 1); + // We need do no more, the service and reference handlers + // ServiceDomNodeHandler and ReferenceDomNodeHandler + // will take appropriate action. + } + + /** + * This method is the main FileActor method + * + * @see FileActor#actOnFile(File, File, int) Here we create an initial DOM + * and kick off the processing (using the handler map that has been set + * up by the concrete subclass). + * + * @param compositeXML + * the composite or fragment file + * @param target + * the target directory + * @param depth + * not uesed here but in the + * @see FileActor#actOnFile(File, File, int) interface to allow for + * recursive diving into a directory structure. + */ + public void actOnFile(File fileXML, File target, int depth) + throws Exception { + + if (null == fileXML || null == target) { + return; + } + + parameters.put("componentTypeFile", fileXML); + + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, fileXML.getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED, "Scagen processing SCA componentType file " + fileXML.getAbsolutePath()); + + super.actOnFile(fileXML, target, depth); + + } + + /** + * @return an error message - usually over-ridden. + */ + protected String getContextMessage() { + + String composite = ((File) parameters.get("compositeOrFragmentFile")).getPath(); + if (null == composite) { + composite = "unknown"; + } + + String component = (String) parameters.get("/composite/component/@name"); + if (null == component) { + component = (String) parameters + .get("/compositeFragment/component/@name"); + } + if (null == component) { + composite = "unknown"; + } + + String msg = "when processing composite " + composite; + + msg = msg + + "\nin this composite file, the component \"" + + component + + "\" has an implementation.cpp element with a header attribute \nwhere the C++ header can be found but it has no matching .componentType file present in\nthe same directory as the header."; + + return msg; + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java new file mode 100644 index 0000000000..3eb8dc7d98 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/CompositeOrFragmentFileHandler.java @@ -0,0 +1,91 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; + +import org.apache.tuscany.sca.cpp.tools.common.FileActor; +import org.apache.tuscany.sca.cpp.tools.common.Utils; + +/** + * The purpose of this class is purely to specialise the handler map to one with + * a specific ComponentDomNodeHandler. + */ +public class CompositeOrFragmentFileHandler extends XMLFileActor { + + static { + + GenericDomNodeHandler gdnh = new GenericDomNodeHandler(); + + /* + * We use a specific Component node handler in order to be able to + * process multiple components in the same XML file + */ + ComponentDomNodeHandler componentdnh = new ComponentDomNodeHandler(); + handlers.put("component", componentdnh); + + /* + * We are interested inthe elements below but they only need standard + * processing + */ + handlers.put("composite", gdnh); + handlers.put("compositeFragment", gdnh); + handlers.put("implementation.cpp", gdnh); + } + + /** + * This method is the main FileActor method + * + * @see FileActor#actOnFile(File, File, int) Here we create an initial DOM + * and kick off the processing (using the handler map that has been set + * up by the concrete subclass). + * + * @param compositeXML + * the composite or fragment file + * @param target + * the target directory + * @param depth + * not uesed here but in the + * @see FileActor#actOnFile(File, File, int) interface to allow for + * recursive diving into a directory structure. + */ + public void actOnFile(File compositeXML, File target, int depth) + throws Exception { + + if (null == compositeXML || null == target) { + return; + } + + parameters.put("compositeOrFragmentFile", compositeXML); + + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, compositeXML + .getAbsolutePath()); + + Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED, + "Scagen processing SCA composite file " + + compositeXML.getAbsolutePath()); + + super.actOnFile(compositeXML, target, depth); + + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java new file mode 100644 index 0000000000..9cf7952afa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DirectoryScanner.java @@ -0,0 +1,93 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; +import java.util.Set; + +import org.apache.tuscany.sca.cpp.tools.common.FileActor; +import org.apache.tuscany.sca.cpp.tools.common.Utils; + +public class DirectoryScanner { + private FileActor actor; + + private Set actOnTheseFileExtensions; + + public DirectoryScanner(FileActor actor, Set extensions) { + this.actor = actor; + this.actOnTheseFileExtensions = extensions; + } + + /** + * + * @param source + * The composite root directory + * @param target + * The directory that will hold the generated output + * @param depth + * The depth from the initial starting point, not significant for + * the Scagen tool as we are only interested in the composite root + * directory but present due to the FileActor actOnFile interface + * method. This code is pulled from the code in the CParsingTool + * class and further work is needed to remove the duplication. + * Tnterface has been left unchanged as we hope to reconverge the + * parser here with the original one once the changes are fed + * back into the original code. + * @throws Exception + */ + public void walkTree(File source, File target, int depth) throws Exception { + depth++; + boolean noTarget = (null == target); + + if (!source.canRead()) + Utils.rude("Cannot read from source directory " + source); + if (!noTarget && !target.canWrite()) + Utils.rude("Cannot write to target directory " + target); + + if (source.isDirectory()) { + File[] filesInDirectory = source.listFiles(); + for (int i = 0; i < filesInDirectory.length; i++) { + File file = filesInDirectory[i]; + String name = file.getName(); + int dot = name.lastIndexOf('.'); + String ext = null; + if (-1 != dot) { + ext = name.substring(dot + 1); + } + + if (file.isFile() + && (actOnTheseFileExtensions == null || (!file + .isHidden() && actOnTheseFileExtensions + .contains(ext)))) { + // this is a file we need to act on! + actor.actOnFile(file, target, depth); + } + } + } else { + return; // Do not act on single files for now we expect a composite + // root directory + // and the "main" class checks its parameters to ensure this is so. + } + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java new file mode 100644 index 0000000000..0756b5fc3b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomHandler.java @@ -0,0 +1,83 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.util.Map; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * The purpose of this class it to provide a generic class that can handle both + * a DOM and a DOM node. + * + */ +public class DomHandler extends GenericDomNodeHandler { + /** + * This method will run through the initial level of the DOM using the + * handlers map + * + * @param dom + * the document being consumed + * @param handlers + * the map from element name to node handler + * @param parameters + * a map of parameters - this is often used by a handler to place + * a name-value pair, the name is often an Xpath representation + * of the location of the data in the DOM but handlers are free + * to use whatever they like - the contextXpath is generated as + * an Xpath prefix for those handlers that wish to use it. + */ + public static void handleDom(Document dom, Map handlers, Map parameters) { + if (dom != null) { + NodeList childNodes = dom.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node childNode = childNodes.item(i); + mapNodeToHandlerAndHandle(childNode, "/" + + childNode.getNodeName(), handlers, parameters); + } + } + } + + /** + * + * @param node + * The DOM node being consumed + * @param contextXPath + * The XPath to this node + * @param handlers + * The map from element name to node handler + * @param parameters + * A map of parameters - this is often used by a handler to place + * a name-value pair, the name is often an Xpath representation + * of the location of the data in the DOM but handlers are free + * to use whatever they like - the contextXpath is generated as + * an Xpath prefix for those handlers that wish to use it. + */ + public void handleNode(Node node, String contextXPath, Map handlers, + Map parameters) { + mapNodeToHandlerAndHandle(node, contextXPath, handlers, parameters); + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomNodeHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomNodeHandler.java new file mode 100644 index 0000000000..37c2a1a81c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/DomNodeHandler.java @@ -0,0 +1,46 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.util.Map; + +import org.w3c.dom.Node; + +public interface DomNodeHandler { + + public static int ELEMENT = 1; + /** + * An interface for classes that can process DOM nodes. + * + * @param node the DOM node being consumed + * @param contextXPath the XPath to this node + * @param handlers The map from element name to node handler + * @param parameters A map of parameters - this is often used by a handler to place + * a name-value pair, the name is often an Xpath like representation of the + * location of the data in the DOM but handlers are free to use whatever + * they like - the contextXpath is generated as an Xpath prefix for those + * handlers that wish to use it. + */ + void handleNode( Node node, String contextXPath, Map handlers, Map parameters ); + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/GenericDomNodeHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/GenericDomNodeHandler.java new file mode 100644 index 0000000000..1ec393959d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/GenericDomNodeHandler.java @@ -0,0 +1,220 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; + +import org.apache.tuscany.sca.cpp.tools.common.Utils; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +/** + * + * + * + * + */ +public class GenericDomNodeHandler implements DomNodeHandler { + /** + * This method parses the DOM attributes into name value pairs in the + * parameter map each valued keyed by its XPath. + * + * @param node + * the DOM node being processed + * @param contextPath + * the XPath to the DOM node being processed + * @param parameters + * a scratchpad map of name value pairs + */ + public void transferAttrsToParameters(Node node, String contextPath, + Map parameters) { + + if (node == null || contextPath == null || parameters == null) + return; + + NamedNodeMap attrs = node.getAttributes(); + if (attrs != null) { + for (int i = 0; i < attrs.getLength(); i++) { + Node attr = attrs.item(i); + parameters.put(contextPath + "/" + "@" + attr.getNodeName(), + attr.getNodeValue()); + + // Report the library name to the deployment tool if required. + if ("library".equals(attr.getNodeName())) { + //This is a path relative to the composite root. + //so we need to add it in. + File mod = (File) parameters.get("compositeOrFragmentFile"); + if (null != mod) { + String separatorForRegex = File.separator.replaceAll( + "\\\\", "\\\\\\\\"); + + String end = attr.getNodeValue().replaceAll("[/\\\\]+", + separatorForRegex); + + if (!end.startsWith(File.separator)) { + end = File.separator + end; + } + + String fullPath = mod.getParentFile().getAbsolutePath() + + end; + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, + fullPath); + } + + } + + } + } + return; + } + + /** + * This method will iterate through the DOM node's children and call the + * appropriate handler for each one. + * + * @param node + * the DOM node being processed + * @param contextPath + * the XPath to the DOM node being processed + * @param handlers + * a map of element name to handler objects + * @param parameters + * a scratchpad map of name value pairs + */ + public void handleChildElements(Node node, String contextPath, + Map handlers, Map parameters) { + + if (node == null || contextPath == null) + return; + + NodeList children = node.getChildNodes(); + if (children != null) { + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + mapNodeToHandlerAndHandle(child, contextPath + "/" + + child.getNodeName(), handlers, parameters); + } + } + return; + } + + /** + * This method will resolve any registered handler for a particular DOM + * element and call the handleNode method on it. If the handlers map has a + * mapping from "entity" to an instance of EntityHandler which implements + * the DomNodeHandler interface then any node that looks like <entity> + * <any_other/><stuff/></entity> + * + * Will be passed to the EntityHandler to process. + * + * @param node + * the DOM node being processed + * @param contextPath + * the XPath to the DOM node being processed + * @param handlers + * a map of element name to handler objects + * @param parameters + * a scratchpad map of name value pairs + */ + public static void mapNodeToHandlerAndHandle(Node node, String contextPath, + Map handlers, Map parameters) { + if (node != null && node.getNodeType() == DomNodeHandler.ELEMENT) { + String nodeName = node.getNodeName(); + if (nodeName != null && nodeName.length() > 0) { + DomNodeHandler handler = (DomNodeHandler) handlers + .get(nodeName); + if (handler != null) { + handler.handleNode(node, contextPath, handlers, parameters); + } + } + } + } + + /** + * This method will place the attributes in this node into the parameter map + * keyed by the XPath and recursively continue processing for any + * sub-elements of the node. + * + * @param node + * The DOM node being consumed + * @param contextXPath + * The XPath to this node + * @param handlers + * The map from element name to node handler + * @param parameters + * A map of parameters - this is often used by a handler to place + * a name-value pair, the name is often an Xpath representation + * of the location of the data in the DOM but handlers are free + * to use whatever they like - the contextXpath is generated as + * an Xpath prefix for those handlers that wish to use it. + */ + public void handleNode(Node node, String contextXPath, Map handlers, + Map parameters) { + + clearParametersAtThisXPath(contextXPath, parameters); + transferAttrsToParameters(node, contextXPath, parameters); + handleChildElements(node, contextXPath, handlers, parameters); + } + + /** + * @param contextXPath + * @param parameters + */ + private void clearParametersAtThisXPath(String contextXPath, Map parameters) { + + // TODO: Slow but works, improve parameters mechanism overall + // to make this unecessary + if (contextXPath == null || parameters == null) { + return; + } + + // We want to clear both /compositeFragment and /composite + // subtrees when we come across the root of either.. + if (contextXPath.equals("/compositeFragment")) { + //clear both this and "composite" + contextXPath = "/composite"; + } + + Set parms = parameters.entrySet(); + if (null != parms) { + Iterator iter = parms.iterator(); + Map.Entry item = null; + String thisKey; + + while (iter.hasNext()) { + item = (Entry) iter.next(); + thisKey = (String) item.getKey(); + if (thisKey.startsWith(contextXPath)) { + //System.out.println(" removing " + thisKey + " for " + + // item.getValue().toString() + " against " + contextXPath); + iter.remove(); + } + } + } + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/LittleClass.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/LittleClass.java new file mode 100644 index 0000000000..e7036037c6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/LittleClass.java @@ -0,0 +1,33 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +/** + * This class is just a convenient application class that is loaded in order to + * get the application class loader. We are interested in the application class + * loader as we use its getResource method to resolve XML files independantly of + * where they are. + */ +public class LittleClass { + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ReferenceDomNodeHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ReferenceDomNodeHandler.java new file mode 100644 index 0000000000..5631249769 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ReferenceDomNodeHandler.java @@ -0,0 +1,75 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.util.Map; + +import org.apache.tuscany.sca.cpp.tools.common.Options; +import org.w3c.dom.Node; + +/** + * The purpose of this class is to process a <reference>element in a + * componentType file and then trigger a call to the method in ServicesGenerator + * to process the interface header file + */ +public class ReferenceDomNodeHandler extends GenericDomNodeHandler { + + /* + * (non-Javadoc) + * + * @see org.apache.tuscany.sca.cpp.services.DomNodeHandler#handleNode(org.w3c.dom.Node, + * java.lang.String, java.util.Map, java.util.Map) + */ + public void handleNode(Node node, String contextXPath, Map handlers, + Map parameters) { + + // Pick up attrs and children + super.handleNode(node, contextXPath, handlers, parameters); + + //OK we know we are handling a reference + //now go and create the wrapper and proxy for it if it is a C++ reference + if(parameters.containsKey("/componentType/reference/interface.cpp/@header")) { + createProxyForReference(parameters); + } + + } + + /** + * This method is really just an adapter that adapts the -dir Option to a + * value int he parameters map for "composite_root" + * + * @param parameters + * the map of name-value parameters. + */ + private void createProxyForReference(Map parameters) { + try { + String mr = (String) Options.getOption("-dir"); + parameters.put("composite_root", mr); + ServicesGenerator.handleInterfaceHeader(parameters, true); + + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/Scagen.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/Scagen.java new file mode 100644 index 0000000000..19e983c6b1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/Scagen.java @@ -0,0 +1,176 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import org.apache.tuscany.sca.cpp.tools.common.CParsingTool; +import org.apache.tuscany.sca.cpp.tools.common.Options; +import org.apache.tuscany.sca.cpp.tools.common.Utils; + +/** + * This is the main top level class. Its purpose is to create a + * Composite/FragmentFile handler visitor and pass it to a DirectoryScanner for + * processing. + */ +public class Scagen extends CParsingTool { + + public static Set COMPOSITE_EXTENSIONS = new HashSet(Arrays + .asList(new Object[] { "composite", "fragment" })); + + /** + * @throws Exception + * + */ + public Scagen(String[] args) throws Exception { + super(args); + } + + /** + * Take a directory scanning class and create a vistor that knows how to + * handle any .composite or .fragment that the scanner comes across. + * + * @param args + * standard main args. THe values we expect in this class are + * scagen -dir input_dir -output output_dir + * + */ + public static void main(String[] args) { + boolean failed = false; + try { + Scagen env = new Scagen(args); + CompositeOrFragmentFileHandler composite_handler = new CompositeOrFragmentFileHandler(); + + // Check and access the input SCA composite directory + String name = (String) Options.getOption("-dir"); + if (null == name) { + Utils + .screenMessage("Please provide a SCA composite directory name as a \"-dir\" option."); + env.printUsage(); + System.exit(-1); + } + File source = new File(name); + if (!source.isFile() && !source.isDirectory()) { + Utils + .screenMessage("The SCA composite directory provided as the \"-dir\" option cannot be accessed,"); + Utils.screenMessage("the option given was: " + source); + env.printUsage(); + System.exit(-1); + } + + String deployDir = null; + try { + deployDir = (String) Options.getOption("-deploy"); + if (null != deployDir || Options.deploy()) { + Utils.setReportArtefacts(true); + } + } catch (Exception e) { + // let it default to null + } + + Utils.postEvent(Utils.DEPLOYMENT_INPUT_DIRECTORY, source + .getAbsolutePath()); + + // We check the -output option here as we wish to + // reuse the env.maybeCreateDirectory method + // unchanged from the original that went into axis and it will do a + // System.exit if there is no matching Option + String outputDirName = (String) Options.getOption("-output"); + if (null == outputDirName) { + Utils + .screenMessage("Please provide an output directory name for the generated files as a \"-output\" option."); + env.printUsage(); + System.exit(-1); + } + + File outputDir = new File(outputDirName); + + // Check we can create the output directory + if (outputDir == null || !outputDir.exists() && !outputDir.mkdir()) { + Utils.screenMessage("Failed to create output directory: " + + outputDirName); + env.printUsage(); + System.exit(-1); + } + + Utils.postEvent(Utils.DEPLOYMENT_OUTPUT_DIRECTORY, outputDir + .getAbsolutePath()); + + DirectoryScanner scanner = new DirectoryScanner(composite_handler, + COMPOSITE_EXTENSIONS); + scanner.walkTree(source, outputDir, 1); + + if (0 == composite_handler.getFilesActedOn()) { + Utils + .screenMessage("No SCA composite or fragment files were found in: " + + source); + } + + failed = composite_handler.failed; + + } catch (Exception exception) { + Utils + .screenMessage("Unexpected error occurred while runnning the Scagen tool. The Java exception is below."); + exception.printStackTrace(); + failed = true; + } + + if (failed) { + Utils + .outputDebugString("Finished! (but encountered problems parsing composites)"); + System.exit(-2); + } + + Utils.outputDebugString("Finished!"); + } + + /** + * Provide a hint to the user on how to call this class + */ + protected void printUsage() { + System.out + .println("usage: Java Scagen -dir <input_directory> -output <output_directory> [-verbose] [-deploy <deploy_dir>] [-nogenerate] [-outputCommand] [-command <copy_cmd>]"); + System.out + .println(" -dir <input_directory>: the SCA composite root directory"); + System.out + .println(" -output <output_directory>: a directory to put the generated output into"); + System.out.println(" [-verbose]: report on what scagen is doing"); + System.out + .println(" [-deploy <deploy_dir>]: output text to help in deploying the composite's artefacts"); + System.out + .println(" [-command <copy_cmd>]: a string that is injected into the deploy text"); + System.out + .println(" [-list]: change the deploy output text to a simple list of artefacts"); + System.out + .println(" [-outputCommand]: change the deploy output text to command text format"); + System.out + .println(" output is of form \"copy_cmd <dir>file1 <deploy_dir>file1\""); + System.out + .println(" [-nogenerate]: do not generate proxies and wrappers"); + + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ServiceDomNodeHandler.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ServiceDomNodeHandler.java new file mode 100644 index 0000000000..cedb4bdb54 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ServiceDomNodeHandler.java @@ -0,0 +1,71 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.util.Map; + +import org.apache.tuscany.sca.cpp.tools.common.Options; +import org.w3c.dom.Node; + +public class ServiceDomNodeHandler extends GenericDomNodeHandler { + + /* + * (non-Javadoc) + * + * @see org.apache.tuscany.sca.cpp.services.DomNodeHandler#handleNode(org.w3c.dom.Node, + * java.lang.String, java.util.Map, java.util.Map) + */ + public void handleNode(Node node, String contextXPath, Map handlers, + Map parameters) { + + // Pick up attrs and the interface.cpp child elements + super.handleNode(node, contextXPath, handlers, parameters); + + // Only generate if this is a C++ service + if(parameters.containsKey("/componentType/service/interface.cpp/@header")) { + //OK now go and create the wrapper and proxy for the service + createWrapperAndProxyForService(parameters); + } + + } + + /** + * This method will generate the wrapper and proxy C++ and header files for + * the service. + * + * @param parameters + * a map of name-value parameters + */ + private void createWrapperAndProxyForService(Map parameters) { + + try { + String mr = (String) Options.getOption("-dir"); + parameters.put("composite_root", mr); + ServicesGenerator.handleInterfaceHeader(parameters, false); + + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ServicesGenerator.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ServicesGenerator.java new file mode 100644 index 0000000000..956db364a1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/ServicesGenerator.java @@ -0,0 +1,831 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.tuscany.sca.cpp.tools.common.CParsingTool; +import org.apache.tuscany.sca.cpp.tools.common.Headers; +import org.apache.tuscany.sca.cpp.tools.common.Options; +import org.apache.tuscany.sca.cpp.tools.common.Parameter; +import org.apache.tuscany.sca.cpp.tools.common.Signature; +import org.apache.tuscany.sca.cpp.tools.common.Utils; +import org.w3c.dom.Attr; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Text; + +/** + * This class is the main class that handles the function that parses a C++ + * interface header file into a DOM that holds all the semantic information + * about the interface - method names, parameters and return values. It then + * uses XSLT to generate different "views" of this data plus the parameter map + * from other sources that are the C++ programs for the proxy and wrapper + * implementations and headers. + */ +public class ServicesGenerator extends CParsingTool { + + private static final String OPERATION_NAME_ATTR = "operationNameAttr"; + + private static final String HEADER_NAME_ATTR = "headerNameAttr"; + + private static final String SCA_OPERATION = "scaOperation"; + + private static final String SCA_SERVICE = "scaService"; + + private static final String SCA_OPERATION_RETURN_TYPE = "scaOperationReturnType"; + + private static final String SCA_OPERATION_PARAMETER = "scaOperationParameter"; + + private static final String SCA_OPERATION_PARAMETER_NAME_ATTR = "scaOperationParameterNameAttr"; + + private static final String SCA_OPERATION_PARAMETER_CONST_ATTR = "scaOperationParameterConstAttr"; + + private static final String SCA_INTERFACE_NAME_ATTR = "scaInterfaceNameAttr"; + + private static final String CPP_HEADER = "cppHeader"; + + private static boolean TESTING = true; + + private static TransformerFactory txmf = null; + + private static ServicesGenerator instance = null; + + public ServicesGenerator(String[] args) throws Exception { + super(args); + txmf = TransformerFactory.newInstance(); + } + + /** + * + * @param parameters + * @param forReference + * true if we are creating a proxy for a reference (rather than + * for a service) + * @throws Exception + * + * The design is + * <ul> + * <li>handleInterfaceHeader + * <li>createDOMofMethods + * <li>createProxyCPPFromDom(outputDir, dom); + * <li>createProxyHeaderFromDom(outputDir, dom); + * </ul> + * + * plus if we are not generating for a reference element + * <ul> + * <li>createWrapperCPPFromDom(outputDir, dom); + * <li>createWrapperHeaderFromDom(outputDir, dom); + * <ul> + * Each of the create.... methods calls createOutputFromDom with a different + * style sheet. + * + */ + public static void handleInterfaceHeader(Map parameters, + boolean forReference) throws Exception { + boolean failed = false; + + String type = null; + if (forReference) { + type = "reference"; + } else { + type = "service"; + } + String interfaceHeaderFilename = (String) parameters + .get("/componentType/" + type + "/interface.cpp/@header"); + + String componentTypeFileHeaderName = interfaceHeaderFilename; + + String sca_composite_root = (String) Options.getOption("-dir"); + parameters.put("composite_root", sca_composite_root); + + if (sca_composite_root != null && interfaceHeaderFilename != null + && interfaceHeaderFilename.length() > 0) { + String separator; + // Stick in a "/" (File.separator) if required. + if ((interfaceHeaderFilename.substring(0, 1).equals("/") || sca_composite_root + .substring(sca_composite_root.length() - 1, + sca_composite_root.length()).equals("/")) + || (interfaceHeaderFilename.substring(0, 1).equals("\\") || sca_composite_root + .substring(sca_composite_root.length() - 1, + sca_composite_root.length()).equals("\\")) + + ) { + separator = ""; + } else { + separator = File.separator; + } + interfaceHeaderFilename = sca_composite_root + separator + + interfaceHeaderFilename; + } + + File outputDir = (File) parameters.get("targetDirectoryFile"); + + String[] args = new String[] { "-source", interfaceHeaderFilename, + "-target", outputDir.getPath() }; + ServicesGenerator gen = new ServicesGenerator(args); + File file; + try { + if (null == interfaceHeaderFilename) { + gen.printUsage(); + System.exit(-1); + } + + file = new File(interfaceHeaderFilename); + if (!file.isFile()) { + if (file.isDirectory()) { + Utils + .rude("This tool works at the header file level and not for directories like " + + file); + } + Utils.rude("Bad file or directory " + file); + } + File source = file; + if (!outputDir.exists() && !outputDir.mkdir()) + Utils.rude("Failed to create directory " + outputDir); + + // The class below is the one that will go through the header + // file(s) + Headers headers = new Headers(); + + if (null != interfaceHeaderFilename) { + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_ENCOUNTERED, file + .getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_PARSED, + "Scagen processing C++ interface header " + + file.getAbsolutePath()); + headers.actOnFile(file, outputDir, 1); + Utils.outputDebugString("Parsing files..."); + } + + String nameOfSorR = null; + String referenceName = null; + String serviceName = null; + + if (forReference) { + + Object rn = parameters.get("/componentType/reference/@name"); + + if (rn instanceof String) { + referenceName = (String) rn; + nameOfSorR = referenceName; + } + } else { + + Object sn = parameters.get("/componentType/service/@name"); + + if (sn instanceof String) { + serviceName = (String) sn; + nameOfSorR = serviceName; + } + } + + String compositeXmlFileHeader = null; + String compositeXmlFileHeaderNoExt = null; + Object compositeh = parameters + .get("/composite/component/implementation.cpp/@header"); + + if (compositeh == null) { + compositeh = parameters + .get("/compositeFragment/component/implementation.cpp/@header"); + } + + if (compositeh instanceof String) { + File f = new File((String) compositeh); + compositeXmlFileHeader = (String) compositeh; + + String fname = f.getName(); + compositeXmlFileHeaderNoExt = fname.substring(0, fname + .lastIndexOf('.')); + + } + + String implClassNameAttrFromCompositeFile = (String) parameters + .get("implClass"); + String implClassNamespaceAttrFromCompositeFile = (String) parameters + .get("implNamespace"); + + if(implClassNamespaceAttrFromCompositeFile == null || implClassNamespaceAttrFromCompositeFile.length() == 0) + { + implClassNamespaceAttrFromCompositeFile = ""; + } + else + { + implClassNamespaceAttrFromCompositeFile += "::"; + } + + String interfaceClassNameAttrFromComponentTypeFile; + if (forReference) { + interfaceClassNameAttrFromComponentTypeFile = (String) parameters + .get("/componentType/reference/interface.cpp/@class"); + } else { + interfaceClassNameAttrFromComponentTypeFile = (String) parameters + .get("/componentType/service/interface.cpp/@class"); + } + + List methods = headers.getAllMethods(); + + // Pull out one of the methods' namespace attributes. + String intfNamespace = null; + if (methods.size() > 0) { + Signature method = (Signature) methods.get(0); + intfNamespace = method.getNamespace(); + } + + if (interfaceClassNameAttrFromComponentTypeFile != null) { + methods = filterToPublicMethodsOfGivenClass(methods, + interfaceClassNameAttrFromComponentTypeFile, true); + } else { + //We want to filter to methods of the class whose + //name matches the header file name. + // String intfClassName = (String) parameters.get("intfClass"); + // + String headerFileBase = file.getName().replaceAll( + "\\.h|\\.hpp|\\.h++", ""); + + methods = filterToPublicMethodsOfGivenClass(methods, + headerFileBase, false); + } + + Document dom = createDOMofMethods(methods, source, serviceName, + referenceName, nameOfSorR, null, + componentTypeFileHeaderName, compositeXmlFileHeader, + compositeXmlFileHeaderNoExt, intfNamespace, + interfaceClassNameAttrFromComponentTypeFile, + implClassNameAttrFromCompositeFile, implClassNamespaceAttrFromCompositeFile); + +// // Print out the generated DOM +// StringWriter sw = new StringWriter(); +// OutputFormat outputFormat = new OutputFormat("xml", "UTF-8", true); +// XMLSerializer serializer = new XMLSerializer(sw, outputFormat); +// serializer.serialize(dom); +// System.out.println("DOM:\n"+sw.toString()); + + + createProxyCPPFromDom(outputDir, dom); + createProxyHeaderFromDom(outputDir, dom); + + if (!forReference) { + createWrapperCPPFromDom(outputDir, dom); + createWrapperHeaderFromDom(outputDir, dom); + } + + } catch (Exception exception) { + exception.printStackTrace(); + failed = true; + } + + if (failed) { + Utils.outputDebugString("Finished! (but encountered problems)"); + System.exit(-2); + } + } + + /** + * This methods takes a list of methods and filters them to only contain the + * public methods of the given class + * + * @param methods + * a list of methods + * @param className + * we will return a list of only this classes methods from the + * methods parameter + * @param attrSpecified + * if the user does not specify one we ignore namespaces + * @return + */ + private static List filterToPublicMethodsOfGivenClass(List methods, + String className, boolean useNamespace) { + if (methods != null && className != null && className.length() > 0) { + for (Iterator iter = methods.listIterator(); iter.hasNext();) { + Signature method = (Signature) iter.next(); + String scope = method.getScope(); + String sig = method.getOriginal(); + String namespace = method.getNamespace(); + + String qualifiedClassName; + if (useNamespace && null != namespace && 0 < namespace.length()) { + qualifiedClassName = namespace + "::" + + method.getTrimClassName(); + } else { + qualifiedClassName = method.getTrimClassName(); + } + + // If we are not public or the classname does not match + // remove... + if (!qualifiedClassName.equals(className) + || -1 == scope.indexOf("public")) { + iter.remove(); + } + } + } + return methods; + } + + /** + * Use an XSLT transformation to create a Proxy "view" of the DOM + * information + * + * @param outputDir + * where to put the C++ + * @param dom + * the DOM of semantic method information + * @throws TransformerException + */ + private static void createProxyCPPFromDom(File outputDir, Document dom) + throws TransformerException { + + //Create the Filename from the Service Name in the DOM + if (dom == null) { + return; + } + + String serviceOrReferenceName = "noSorRNameDefined"; + + String implClass = "nocompositeXmlFileHeaderDefined"; + + Element topNode = dom.getDocumentElement(); + if (null != topNode) { + Attr attr = topNode.getAttributeNode("nameOfSorR"); + if (attr != null) { + serviceOrReferenceName = attr.getNodeValue(); + } + + attr = topNode.getAttributeNode("implClass"); + if (attr != null) { + implClass = attr.getNodeValue(); + } + } + + File proxyCPP = new File(outputDir, implClass + "_" + + serviceOrReferenceName + "_Proxy.cpp"); + if (null != proxyCPP) { + + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_GENERATED, proxyCPP + .getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_CREATE, + "Scagen creating SCA for C++ proxy implementation " + + proxyCPP.getAbsolutePath()); + } + + createOutputFromDom(dom, proxyCPP, + "org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyCPP.xsl"); + + } + + /** + * Use an XSLT transformation to create a Wrapper "view" of the DOM + * information + * + * @param outputDir + * where to put the C++ + * @param dom + * the DOM of semantic method information + * @throws TransformerException + */ + private static void createWrapperCPPFromDom(File outputDir, Document dom) + throws TransformerException { + + //Create the Filename from the Service Name in the DOM + if (dom == null) { + return; + } + + String serviceName = "noServiceDefined"; + + String implClass = "nocompositeXmlFileHeaderDefined"; + + Element topNode = dom.getDocumentElement(); + if (null != topNode) { + Attr attr = topNode.getAttributeNode("serviceName"); + if (attr != null) { + serviceName = attr.getNodeValue(); + } + + attr = topNode.getAttributeNode("implClass"); + if (attr != null) { + implClass = attr.getNodeValue(); + } + } + + File wrapperCPP = new File(outputDir, implClass + "_" + serviceName + + "_Wrapper.cpp"); + if (null != wrapperCPP) { + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_GENERATED, wrapperCPP + .getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_CREATE, + "Scagen creating SCA for C++ wrapper implementation " + + wrapperCPP.getAbsolutePath()); + } + createOutputFromDom(dom, wrapperCPP, + "org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperCPP.xsl"); + + } + + /** + * Use an XSLT transformation to create a Proxy header "view" of the DOM + * information + * + * @param outputDir + * where to put the C++ + * @param dom + * the DOM of sematic method information + * @throws TransformerException + */ + private static void createProxyHeaderFromDom(File outputDir, Document dom) + throws TransformerException { + + //Create the Filename from the Service Name in the DOM + if (dom == null) { + return; + } + + String serviceOrReferenceName = "noServiceDefined"; + String intfClass = "noInterfaceClassNameOrDefaultDefined"; + String implClass = "noImplementationClassOrDefaultDefined"; + + Element topNode = dom.getDocumentElement(); + if (null != topNode) { + Attr attr = topNode.getAttributeNode("nameOfSorR"); + if (attr != null) { + serviceOrReferenceName = attr.getNodeValue(); + } + attr = topNode.getAttributeNode("intfClass"); + if (attr != null) { + intfClass = attr.getNodeValue(); + } + attr = topNode.getAttributeNode("implClass"); + if (attr != null) { + implClass = attr.getNodeValue(); + } + } + + File proxyHeader = new File(outputDir, implClass + "_" + + serviceOrReferenceName + "_Proxy.h"); + if (null != proxyHeader) { + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_GENERATED, proxyHeader + .getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_CREATE, + "Scagen creating SCA for C++ proxy header " + + proxyHeader.getAbsolutePath()); + } + + createOutputFromDom(dom, proxyHeader, + "org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyHeader.xsl"); + + } + + /** + * Use an XSLT transformation to create a Wrapper header "view" of the DOM + * information + * + * @param outputDir + * where to put the C++ + * @param dom + * the DOM of sematic method information + * @throws TransformerException + */ + private static void createWrapperHeaderFromDom(File outputDir, Document dom) + throws TransformerException { + + //Create the Filename from the Service Name in the DOM + if (dom == null) { + return; + } + + String serviceName = "noServiceDefined"; + + String implClass = "nocompositeXmlFileHeaderDefined"; + + Element topNode = dom.getDocumentElement(); + if (null != topNode) { + Attr attr = topNode.getAttributeNode("serviceName"); + if (attr != null) { + serviceName = attr.getNodeValue(); + } + + attr = topNode.getAttributeNode("implClass"); + if (attr != null) { + implClass = attr.getNodeValue(); + } + } + + File wrapperHeader = new File(outputDir, implClass + "_" + serviceName + + "_Wrapper.h"); + + if (null != wrapperHeader) { + Utils.postEvent(Utils.DEPLOYMENT_ARTEFACT_GENERATED, wrapperHeader + .getAbsolutePath()); + Utils.postEvent(Utils.EVENT_TYPE_FILE_CREATE, + "Scagen creating SCA for C++ wrapper header " + + wrapperHeader.getAbsolutePath()); + } + createOutputFromDom(dom, wrapperHeader, + "org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperHeader.xsl"); + + } + + /** + * This method will return a class loader that can see the resources that + * are parts of "this" package. + */ + private static ClassLoader getALoader() { + + LittleClass lc; + try { + lc = new LittleClass(); + return lc.getClass().getClassLoader(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * This method will generically process the DOM using a stylesheet passed + * in. + * + * @param dom + * the source of data (the model) + * @param outputFile + * where to put the result + * @param xslTransformationFileName + * the xsl file containing the "view" + * @throws TransformerException + */ + private static void createOutputFromDom(Document dom, File outputFile, + String xslTransformationFileName) throws TransformerException { + + if(Options.noGenerate()){ + return; + } + + InputStream stream = getALoader().getResourceAsStream( + xslTransformationFileName); + StreamSource ss = new StreamSource(stream); + StreamResult out = new StreamResult(outputFile); + try { + Transformer xslt = txmf.newTransformer(ss); + + // Unless a width is set, there will be only line breaks but no + // indentation. + // The IBM JDK and the Sun JDK don't agree on the property name, + // so we set them both. + // + try { + xslt.setOutputProperty( + "{http://xml.apache.org/xalan}indent-amount", "2"); + } catch (Throwable t) { + //OK to ignore this, depends on XSLT engine and one will fail + } + try { + xslt.setOutputProperty( + "{http://xml.apache.org/xslt}indent-amount", "2"); + } catch (Throwable t) { + //OK to ignore this, depends on XSLT engine and one will fail + } + + DOMSource from = new DOMSource(dom); + + xslt.transform(from, out); + + } catch (TransformerConfigurationException e) { + e.printStackTrace(); + throw (e); + } catch (TransformerException e) { + e.printStackTrace(); + throw (e); + } finally { + try { + stream.close(); + } catch (IOException e1) { + // unlikely but if + // we can't close it, we can't close it + } + } + + } + + //TODO clear up the parameter list below to make it smaller if + // possible + /** + * This method will create A DOM containing all the semantic information + * that it can extract from a C++ header file. + * + * @param methods + * a list of methods that are going into the DOM + * @param source + * the header file the methods came from + * @param serviceName + * the name of the service + * @referenceName the name of the reference + * @nameOfSorR the non null one of the two parameters above + * @headerClassName the name of the header class + * @param compositeXmlFileImplHeaderNameWithPathAndExt + * the source filename + * @param compositeXmlFileHeaderNoExtorPath + * the shortname of the source file + * @param implClass + * the implementation class + * @param intfClass + * the interface we are turning into a service + * @return + */ + private static Document createDOMofMethods(List methods, File source, + String serviceName, String referenceName, String nameOfSorR, + String headerClassName, + String componentTypeXmlFileIntfHeaderNameWithPathAndExt, + String compositeXmlFileImplHeaderNameWithPathAndExt, + String compositeXmlFileHeaderNoExtorPath, String intfNamespace, + String intfClass, String implClass, String implNamespace) { + + if (methods == null) { + return null; + } + + // Create a DOM of the methods + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + Document document = null; + try { + DocumentBuilder builder = factory.newDocumentBuilder(); + document = builder.newDocument(); + + Element root = (Element) document.createElement(CPP_HEADER); + + root.setAttribute(HEADER_NAME_ATTR, source.getPath()); + + document.appendChild(root); + + Element intf = (Element) document.createElement(SCA_SERVICE); + root.appendChild(intf); + + // Go through all the signatures we have collected... + Signature s = null; + for (Iterator iter = methods.iterator(); iter.hasNext();) { + s = (Signature) iter.next(); + + // Each signature is an operation + Element op = document.createElement(SCA_OPERATION); + op.setAttribute(OPERATION_NAME_ATTR, s.getMethodName()); + intf.appendChild(op); + + Parameter[] parms = s.getParameters(); + if (parms != null) { + + for (int i = 0; i < parms.length; i++) { + Element parm = (Element) document + .createElement(SCA_OPERATION_PARAMETER); + String type_string = parms[i].getTypeWithoutConst() + .toString(); + + type_string = type_string.replaceAll(":: ", "::"); + + Text text = document.createTextNode(type_string); + parm.appendChild(text); + parm.setAttribute(SCA_OPERATION_PARAMETER_NAME_ATTR, + parms[i].getName()); + + if (parms[i].getTypeWithoutConst().intern() != parms[i] + .getType().intern()) { + parm.setAttribute( + SCA_OPERATION_PARAMETER_CONST_ATTR, "true"); + } + + op.appendChild(parm); + // TO DO only really stores the value + // unsafely/temporarily + // which is fine while we handle everything at the + // end of parsing the "leaf" that represents that actual + // interface/service but the below will cause the second + // service + // processed to overwite the first one in the DOM. I we + // wish + // to do some overall processing at the end we will have + // to + // use a better more XPath like key that varies by + // instance + // of the service. + intf.setAttribute(SCA_INTERFACE_NAME_ATTR, s + .getTrimClassName()); + } + } + + Element rc = document.createElement(SCA_OPERATION_RETURN_TYPE); + rc.appendChild(document.createTextNode(s.getReturnType() + .toString().replaceAll(":: ", "::"))); + op.appendChild(rc); + + root.appendChild(intf); + } + + // Set the name of the Service + // here, if we are not passed one we use + // the classname from the last header function signature... + if (serviceName == null && s != null) { + serviceName = s.getTrimClassName(); + } + + // this is used for the proxy file name but we need to + // use the reference name if this is pulled in due to it + // being a reference!!! + if (serviceName != null) + root.setAttribute("serviceName", serviceName); + if (referenceName != null) + root.setAttribute("referenceName", referenceName); + if (nameOfSorR != null) + root.setAttribute("nameOfSorR", nameOfSorR); + + if (implClass != null) { + root.setAttribute("implClass", implClass); + } else { + root.setAttribute("implClass", compositeXmlFileHeaderNoExtorPath); + } + + if (implClass != null) { + root.setAttribute("implNamespace", implNamespace); + } + + // default class name to the name of the header... + if (headerClassName == null && source != null) { + headerClassName = source.getName().replaceAll( + "\\.h|\\.hpp|\\.h++", ""); + } + root.setAttribute("headerClassName", headerClassName); + + if (null == intfClass) { + intfClass = headerClassName; + } + + if (null != intfNamespace) { + root.setAttribute("namespace", intfNamespace); + if (null != intfClass && !intfClass.startsWith(intfNamespace)) { + intfClass = intfNamespace + "::" + intfClass; + } + } + + root.setAttribute("intfClass", intfClass); + + if (componentTypeXmlFileIntfHeaderNameWithPathAndExt == null) { + componentTypeXmlFileIntfHeaderNameWithPathAndExt = "componentTypeHeader"; + } + root.setAttribute("componentTypeHeader", + componentTypeXmlFileIntfHeaderNameWithPathAndExt); + + if (compositeXmlFileImplHeaderNameWithPathAndExt == null) { + compositeXmlFileImplHeaderNameWithPathAndExt = "compositeXmlFileImplHeader"; + } + root.setAttribute("compositeXmlFileHeader", + compositeXmlFileImplHeaderNameWithPathAndExt); + + if (compositeXmlFileHeaderNoExtorPath == null) { + compositeXmlFileHeaderNoExtorPath = "compositeXmlFileHeaderNoExt"; + } + root.setAttribute("compositeXmlFileHeaderNoExt", + compositeXmlFileHeaderNoExtorPath); + + } catch (ParserConfigurationException pce) { + // Parser with specified options can't be built + pce.printStackTrace(); + } + + return document; + + } + +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/XMLFileActor.java b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/XMLFileActor.java new file mode 100644 index 0000000000..dd260c9787 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/XMLFileActor.java @@ -0,0 +1,208 @@ +/** + * + * 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. + */ + +/* @version $Rev$ $Date$ */ + +package org.apache.tuscany.sca.cpp.tools.services; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; + +import org.apache.tuscany.sca.cpp.tools.common.FileActor; +import org.apache.tuscany.sca.cpp.tools.common.Utils; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * The purpose of this abstract class is to provide a home for the standard + * processing that is involved in turning a XML file into an internal DOM. + */ +public abstract class XMLFileActor implements FileActor { + + protected static Map handlers = new HashMap(); + + protected static Map parameters = new HashMap(); + + public boolean failed; + + private int filesActedOn=0; + + protected static TransformerFactory transformerFactory = TransformerFactory + .newInstance(); + + /** + * This method is the main FileActor method + * + * @see FileActor#actOnFile(File, File, int) Here we create an initial DOM + * and kick off the processing (using the handler map that has been set + * up by the concrete subclass). + * + * @param compositeXML + * the composite or fragment file + * @param target + * the target directory + * @param depth + * not uesed here but in the + * @see FileActor#actOnFile(File, File, int) interface to allow for + * recursive diving into a directory structure. + */ + public void actOnFile(File compositeXML, File target, int depth) + throws Exception { + + if (null == compositeXML || null == target) { + return; + } + + filesActedOn++; + + parameters.put("sourceFile", compositeXML); + parameters.put("targetFile", target); + + if (transformerFactory.getFeature(DOMSource.FEATURE) + && transformerFactory.getFeature(DOMResult.FEATURE)) { + Document dom = createDomFromXMLFile(compositeXML); + if (dom != null) { + parameters.put("targetDirectoryFile", target); + DomHandler.handleDom(dom, handlers, parameters); + } + } + } + + /** + * This method builds an in memory DOM from an XML file + * + * @param xmlSourceFile + * the XML file we are handling + * @return the resulting document + */ + protected Document createDomFromXMLFile(File xmlSourceFile) { + Document dom = null; + DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); + //We do not validate via f.setValidating(true); + f.setNamespaceAware(true); + + try { + DocumentBuilder parser = f.newDocumentBuilder(); + dom = parser.parse(xmlSourceFile); + } catch (SAXException sxe) { + String path; + try { + path = xmlSourceFile.getCanonicalPath(); + } catch (IOException e) { + path = xmlSourceFile.getPath(); + } + Utils.screenMessage("There has been a SAXException of type " + + sxe.getLocalizedMessage()); + if (null != xmlSourceFile) { + Utils.screenMessage(" when processing file " + path); + } else { + Utils.screenMessage(" as the input file is null."); + } + +// Leave for possible future debug option +// Utils.screenMessage(" The returned Java exception is below."); +// if (sxe.getException() != null) +// sxe.getException().printStackTrace(); +// else +// sxe.printStackTrace(); + } catch (ParserConfigurationException pce) { + String path; + try { + path = xmlSourceFile.getCanonicalPath(); + } catch (IOException e) { + path = xmlSourceFile.getPath(); + } + Utils + .screenMessage("There has been a ParserConfigurationException of type " + + pce.getLocalizedMessage()); + if (null != xmlSourceFile) { + Utils.screenMessage(" when processing file " + path); + } else { + Utils.screenMessage(" as the input file is null."); + } + +// Leave for possible future debug option +// Utils.screenMessage(" The returned Java exception is below."); +// pce.printStackTrace(); + + } catch (IOException ioe) { + String path; + try { + path = xmlSourceFile.getCanonicalPath(); + } catch (IOException e) { + path = xmlSourceFile.getPath(); + } + + Utils.screenMessage("Unable to open file " + path); + Utils.screenMessage(this.getContextMessage()); + + + + } + + return dom; + } + + /** + * @return an error message - usually over-ridden. + */ + private String getContextMessage() { + return "Check the file exists and can be read."; + } + + /** + * Set a parameter + * + * @param name + * @param value + */ + public void setParameter(String name, Object value) { + parameters.put(name, value); + } + + /** + * Get a parameter + * + * @param name + * @param value + * @return the value of the parameter + */ + public Object getParameter(String name, Object value) { + return parameters.get(name); + } + + + + /** + * @return Returns the filesActedOn. + */ + public int getFilesActedOn() { + return filesActedOn; + } +}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/package.html b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/package.html new file mode 100644 index 0000000000..ea15ca587b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/package.html @@ -0,0 +1,159 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html> + +<head> +<title>Design documentation for org\apache\tuscany\sca\cpp\tools\services</title> +</head> + +<body lang=EN-GB> + +<div class=Section1> + +<h1>Overview</h1> + + + +<p>This package contains classes that generate C++ wrappers and +proxies for C++ implementations of SCA services. </p> + +<h2>What the package does</h2> + +<p>The Scagen class main method will take in an input and +output directory name. The input directory is taken to be the SCA composite root +directory. The tool will generate the wrapper and proxy headers and methods +bodies in the output directory. </p> + +<p>These proxies and wrappers enable the SCA for C++ runtime to +act as a conduit for SCA C++ calls in a type free manner. Client code can call +the type specific functions that are in the generated proxy classes. The call +is marshalled into a generic format and a SCA for C++ runtime function with a +standard signature is invoked. The details of the call are passed as data. </p> + +<p>On the other end of the runtime, a generated function with a +standard signature is called, this function will inspect the data that +represents the call’s method name and call the appropriate type specific +function in the C++ implementation. </p> + +<h2>The Input Data Used</h2> + +<p>The input directory passed to the Scagen method is taken to +be the SCA composite root directory. All the sca.composite and .fragment files in +that directory are inspected to resolve all the <component/> elements +within them. </p> + +<p>Each <component/> element found is inspected to see if +it has a <implementation.cpp/> element within it. </p> + +<p>Each <implementation.cpp/> element should have a +header attribute that represents a C++ header file that contains function +prototypes for the C++ implementation of the service. An optional class +attribute can be used to select one class if more than one that is present in +the header file. The default class is the one with the same name as the header +file. The tool will verify that the implementation header contains an +appropriate class prototype. </p> + + + +<p>The directory that contains the implementation header should +also contain a matching .componentType file for the equivalent SCA component. So +for example, a MyServiceImpl.h file would have a corresponding MyServiceImpl.componentType +file in the same directory. </p> + + + +<p>Each componentType file is inspected for <service/> +and <reference/> elements. For each <service/> element that is +found that contains a <interface.cpp/> element within it,</p> + +<p>the header attribute of the <interface.cpp/> is taken +as the filename of the C++ interface header for the SCA service. This C++ +header file is opened and used as a means for specifying the SCA service +resulting in an appropriate wrapper and proxy being generated for this service +interface. Both method bodies and headers are generated in the given output +directory. The processing of a <reference/> element is the same except +that only a proxy header and implementation are generated. </p> + + + + + +<h2>Outline Design: How it Works</h2> + + + +<p>The basic approach is to scan in the XML files by first +creating a DOM document tree of them and then recursively rifling through the DOM +with some generic code in the XMLFileActorClass by default this processing will +build up a map which maps the XPath location of attributes to their values. +Additionally subclasses can add to a “handlers map” which maps from the name of +a particular element to an object that implements the DomNodeHandler interface. +If the XMLFileActor code comes across any element that has an equivalent handler +in the handler map the objects handleNode method will be called. </p> + +<p>Typically the DomNodeHandler’s handle node interface will +use XPath to pull out the parameters that it is interested in from the +parameters map that is being built up by the generic code. </p> + +<p>This design was chosen as the Java level specified for the +original implementation did not have direct XPath query of XML data but it was +known that this would be available in Java 1.5 onwards. The design allows the +DOM and parameters map handling to be replaced in the future with JRE 1.5 code +with less impact on the rest of the code.</p> + + + +<p>The processing leads to the parsing of the C++ interface +files using the org\apache\tuscany\sca\cpp\tools\common package. This results +in a Headers object</p> + +<p>that contains a List of Signature objects, each one +representing a function prototype found in the header. </p> + + + +<p>We are aiming to get all the semantic data we want to use +into a DOM document (this represents the model of our input data) and then use +XSLT to create the 4 different views of this data:</p> + +<p>Proxy C++ header</p> + +<p>Proxy C++ body</p> + +<p>Wrapper C++ header</p> + +<p>Wrapper C++ body</p> + + + +<p>So we prepopulate the DOM with parameter data that comes +from the XML files and then iterate through the Signatures that are returned +from the C++ header parser transferring the useful data into the DOM. </p> + + + +<p>We than use 4 XSLT stylesheets to generate the C++ output +files as required. </p> + +</div> + +</body> + +</html> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyCPP.xsl b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyCPP.xsl new file mode 100644 index 0000000000..3d9dafa103 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyCPP.xsl @@ -0,0 +1,278 @@ +<!-- + 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. +--> +<!-- + + TODO There is duplication in the "..no_parms" templates with + the equivalent templates they are based on - that it would be + fairly easy to factor out. +--> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<!-- Part of the org.apache.tuscany.sca.cpp.tools.services packages + + This stylesheet creates the CPP implementation of the + proxy body for a given SCA service + --> +<xsl:output method="text"/> + +<!-- We do not generate output sourced from cppScopes --> +<xsl:template match="cppScope"></xsl:template> + +<!-- We do not generate output sourced from private scaOperations --> +<xsl:template match="scaOperation[@cppScope='private']"> +</xsl:template> + +<!-- We do not generate output sourced from the operation return types --> +<xsl:template match="scaOperationReturnType"> +</xsl:template> + + +<!-- + CPP Header/Root +--> +<xsl:template match="cppHeader">/* + * 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. + */ + +<xsl:apply-templates select="scaService" mode="include_header"/> + +#include "osoa/sca/sca.h" +<xsl:apply-templates/> <!-- should go on to generic scaService below --> +</xsl:template> + +<!-- --> +<!-- Service --> +<!-- --> +<xsl:template match="scaService"> +<xsl:variable name="clazz"> + <xsl:value-of select="../@implClass"/> + <xsl:text>_</xsl:text> + <xsl:value-of select="../@nameOfSorR"/> + <xsl:text>_Proxy</xsl:text> +</xsl:variable> +<xsl:text> +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + </xsl:text><xsl:value-of select="$clazz"/> +<xsl:text>* </xsl:text> +<xsl:value-of select="$clazz"/> +<xsl:text>_Factory(tuscany::sca::ServiceWrapper* target) + { + return new </xsl:text><xsl:value-of select="$clazz"/><xsl:text>(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void </xsl:text> +<xsl:value-of select="$clazz"/> +<xsl:text>_Destructor(void* proxy) + { + delete (</xsl:text><xsl:value-of select="$clazz"/><xsl:text>*)proxy; + } +} + +</xsl:text> +<xsl:value-of select="$clazz"/><xsl:text>::</xsl:text><xsl:value-of select="$clazz"/>(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +<xsl:value-of select="$clazz"/><xsl:text>::~</xsl:text><xsl:value-of select="$clazz"/>() +{ + if (target) + delete target; +}<!-- +OK we have done the stuff that is not specific to any function in the service +now we can do another apply-templates to pick up on the 0, 1 or more scaOperation +DOM nodes that each relate to a function in the service + --> +<xsl:apply-templates/> +<!-- Always make sure we have a (visible) final newline --> +<xsl:text> + +</xsl:text> +</xsl:template> + +<!-- This template is just a small function that will generate the + #include that pulls in the correct C++ header + --> +<xsl:template match="scaService" mode="include_header"> +<xsl:variable name="clazz"> + <xsl:value-of select="../@implClass"/> + <xsl:text>_</xsl:text> + <xsl:value-of select="../@nameOfSorR"/> + <xsl:text>_Proxy</xsl:text> +</xsl:variable> +<xsl:text>#include "</xsl:text> +<xsl:value-of select="$clazz"/> +<xsl:text>.h"</xsl:text> +</xsl:template> + + + +<!-- --> +<!-- Operation --> +<!-- --> +<xsl:template match="scaOperation"> +<xsl:variable name="clazz"> + <xsl:value-of select="../../@implClass"/> + <xsl:text>_</xsl:text> + <xsl:value-of select="../../@nameOfSorR"/> + <xsl:text>_Proxy</xsl:text> +</xsl:variable> + +<!-- ignore the constructor and destructor --> +<xsl:if test="@operationNameAttr != $clazz + and @operationNameAttr != concat('~', $clazz)" > +<xsl:text> +</xsl:text> +<xsl:value-of select="scaOperationReturnType"/> +<xsl:text> </xsl:text> +<xsl:value-of select="$clazz"/><xsl:text>::</xsl:text> +<xsl:value-of select="@operationNameAttr"/><xsl:text>(</xsl:text> +<xsl:for-each select="scaOperationParameter"> +<xsl:if test=".!='void'"> + <xsl:variable name="scaOperationParameterNameAttr"> + <xsl:value-of select="concat('arg', position()-1 )"/> + </xsl:variable> + <xsl:variable name="isConst"> + <xsl:value-of select="@scaOperationParameterConstAttr"/> + </xsl:variable> + <xsl:if test="contains($isConst,'true')">const</xsl:if><xsl:text> </xsl:text> + <xsl:value-of select="."/> <!-- get the actual type --> + <xsl:text> </xsl:text> + <xsl:value-of select="$scaOperationParameterNameAttr"/> + <xsl:choose> + <xsl:when test="position()=last()"> + </xsl:when> + <xsl:otherwise> + <xsl:text>, </xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:if> <!-- test=".!='void'" --> + +</xsl:for-each> +<xsl:text>) +{</xsl:text> +<xsl:call-template name="proxy_method_body"/> +<xsl:text> +} +</xsl:text> +</xsl:if> +</xsl:template> + + +<xsl:template name="proxy_method_body"> + <xsl:variable name="noOfParms"> + <xsl:choose> + <xsl:when test=".='void'"> +<xsl:text>0</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="last()"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> +<xsl:text> + tuscany::sca::Operation operation("</xsl:text> + <xsl:value-of select="@operationNameAttr"/> + <xsl:text>");</xsl:text> + <xsl:if test="$noOfParms!=0"> + <xsl:for-each select="scaOperationParameter"> + <xsl:call-template name="proxy_method_body_set_parameter"/> + </xsl:for-each> + </xsl:if> + <xsl:call-template name="proxy_method_body_prepare_return_var"/> + <xsl:text> + target->invoke(operation);</xsl:text> + <xsl:call-template name="proxy_method_body_return"/> +</xsl:template> + + +<xsl:template name="proxy_method_body_return"> + <xsl:variable name="type"> + <xsl:value-of select="scaOperationReturnType/text()"/> + </xsl:variable> + <xsl:choose> + <xsl:when test="$type='void'"><!-- nothing --> + <xsl:text> + return;</xsl:text> + </xsl:when> + <xsl:when test="contains($type, '&')"><!-- reference --> + <xsl:variable name="type_no_amp"> + <xsl:value-of select="substring-before($type, '&')"/> + </xsl:variable> + <xsl:text> + return *(</xsl:text><xsl:value-of select="$type_no_amp"/><xsl:text>*)operation.getReturnValue();</xsl:text> + </xsl:when> + <xsl:otherwise><!-- simple type --> + <xsl:text> + return *(</xsl:text><xsl:value-of select="$type"/><xsl:text>*)operation.getReturnValue();</xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="proxy_method_body_prepare_return_var"> + <xsl:variable name="type"> + <xsl:value-of select="scaOperationReturnType/text()"/> + </xsl:variable> + <xsl:choose> + <xsl:when test="$type='void'"><!-- nothing --> + <!-- nothing --> + </xsl:when> + <xsl:when test="contains($type, '&')"><!-- reference --> + </xsl:when> + <xsl:otherwise> +<xsl:text> + </xsl:text> <xsl:value-of select="$type"/><xsl:text> ret; + operation.setReturnValue(&ret);</xsl:text> + </xsl:otherwise> + </xsl:choose> + +</xsl:template> + + +<xsl:template name="proxy_method_body_set_parameter"> + <xsl:variable name="scaOperationParameterNameAttrInner"> + <xsl:value-of select="concat('arg', position()-1 )"/> + </xsl:variable> + <xsl:variable name="type"> + <xsl:value-of select="."/> + </xsl:variable> + operation.addParameter("<xsl:value-of select="@scaOperationParameterNameAttr"/>", &<xsl:value-of select="$scaOperationParameterNameAttrInner"/><xsl:text>);</xsl:text> +</xsl:template> +</xsl:stylesheet> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyHeader.xsl b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyHeader.xsl new file mode 100644 index 0000000000..2f5edb3a93 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfProxyHeader.xsl @@ -0,0 +1,228 @@ +<!-- + 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. +--> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<!-- Part of the org.apache.tuscany.sca.cpp.tools.services packages + - + - This stylesheet creates the CPP implementation of the + - proxy header for a given SCA service + --> + + <xsl:output method="text" /> + + <!-- Delete cppScopes --> + <xsl:template match="cppScope"></xsl:template> + + <!-- Delete private methods cppScopes --> + <xsl:template match="scaOperation[@cppScope='private']"> + </xsl:template> + + <!-- Delete private methods cppScopes --> + <xsl:template match="scaOperationReturnType"></xsl:template> + + + <!-- --> + <!-- CPP Header/Root --> + <!-- --> + <xsl:template match="cppHeader"> + <xsl:variable name="class"> + <xsl:value-of select="concat(@implClass, '_', @nameOfSorR, '_Proxy')"/> + </xsl:variable> +<xsl:text>/* + * 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. + */ + +</xsl:text> + <xsl:call-template name="ifndef_start"> + <xsl:with-param name="class" + select="$class"/> + </xsl:call-template> + + + <xsl:call-template name="include_headers"> + <xsl:with-param name="componentTypeHeader" + select="@componentTypeHeader"/> + </xsl:call-template> + + <xsl:apply-templates select="scaService" mode="class_body"/> + + <xsl:call-template name="ifndef_end"> + <xsl:with-param name="class" + select="$class"/> + </xsl:call-template> +<!-- Always make sure we have a (visible) final newline --> +<xsl:text> + +</xsl:text> +</xsl:template> + + +<!-- Here are the subroutine templates in order --> + + <xsl:template name="ifndef_start"> + <!--For example, + #ifndef CustomerInfoImpl_CustomerInfoService_Proxy_h + #define CustomerInfoImpl_CustomerInfoService_Proxy_h + --> + <xsl:param name="class"/> + <xsl:text>#ifndef </xsl:text><xsl:value-of select="$class"/><xsl:text>_h</xsl:text> +<!-- newline --> +<xsl:text> +</xsl:text> + <xsl:text>#define </xsl:text><xsl:value-of select="$class"/><xsl:text>_h</xsl:text> +<!-- newline --> +<xsl:text> + +</xsl:text> + <xsl:text>#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif </xsl:text> +<!-- newline --> +<xsl:text> + +</xsl:text> + </xsl:template> + + <xsl:template name="include_headers"> + <!--For example, + #include "CustomerInfo.h" + #include "tuscany/sca/core/ServiceWrapper.h" + --> + <xsl:param name="componentTypeHeader"/> + <xsl:text>#include "</xsl:text><xsl:value-of select="translate($componentTypeHeader,'\','/')"/><xsl:text>"</xsl:text> +<!-- newline --> +<xsl:text> +</xsl:text> + <xsl:text>#include "tuscany/sca/core/ServiceWrapper.h"</xsl:text> + </xsl:template> + + <xsl:template match="scaService" mode="class_body"> + <!--For example + class proxyclassname : public interface_class + { + constructor + destructor + then apply operation templates for operations + }; + + E.g. Specifically + + class CustomerInfoImpl_CustomerInfoService_Proxy : public CustomerInfo + { + public: + CustomerInfoImpl_CustomerInfoService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CustomerInfoImpl_CustomerInfoService_Proxy(); + virtual const char* getCustomerInformation(const char* customerID); + private: + tuscany::sca::ServiceWrapper* target; + }; + --> + <!-- TODO second definition, remove? --> + <xsl:variable name="class"> + <xsl:value-of select="concat(../@implClass, '_', ../@nameOfSorR, '_Proxy')"/> + </xsl:variable> +<xsl:text> + +class </xsl:text> +<xsl:value-of select="$class"/> +<xsl:text> : public </xsl:text><xsl:value-of select="../@intfClass"/> +<xsl:text> +{ +public: + </xsl:text><xsl:value-of select="$class"/><xsl:text>(tuscany::sca::ServiceWrapper*);</xsl:text> + <xsl:text> + virtual ~</xsl:text><xsl:value-of select="$class"/><xsl:text>(); +</xsl:text> + <!-- operations --> + <xsl:apply-templates/> +<xsl:text>private: + tuscany::sca::ServiceWrapper* target; +}; +</xsl:text> + </xsl:template> + + <xsl:template name="ifndef_end"> + <!--For example, + #endif // CustomerInfoImpl_CustomerInfoService_Proxy_h + --> + <xsl:param name="class"/> + <xsl:text> +#endif // </xsl:text><xsl:value-of select="$class"/><xsl:text>_h</xsl:text> + </xsl:template> + + + + + + +<!-- Operation --> +<!--For example + virtual const char* getCustomerInformation(const char* customerID); +--> +<xsl:template match="scaOperation"> +<xsl:variable name="class"> + <xsl:value-of select="concat(../../@implClass, '_', ../../@nameOfSorR, '_Proxy')"/> +</xsl:variable> +<xsl:if test="@operationNameAttr != $class + and @operationNameAttr != concat('~', $class)" > +<xsl:text> virtual </xsl:text> +<xsl:value-of select="scaOperationReturnType"/> +<xsl:text> </xsl:text> +<xsl:value-of select="@operationNameAttr"/><xsl:text>(</xsl:text> +<xsl:for-each select="scaOperationParameter"> + <xsl:variable name="isConst"> + <xsl:value-of select="@scaOperationParameterConstAttr"/> + </xsl:variable> + <xsl:variable name="noOfParms"> + <xsl:value-of select="last()"/> + </xsl:variable> + <xsl:if test="contains($isConst,'true')">const</xsl:if><xsl:text> </xsl:text> + <xsl:value-of select="."/> <!-- get the actual type --> + <xsl:text> </xsl:text> + <xsl:value-of select="@scaOperationParameterNameAttr"/> + <xsl:choose> + <xsl:when test="position()=last()"></xsl:when> + <xsl:otherwise> + <xsl:text>, </xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> +<xsl:text>); +</xsl:text> +</xsl:if> +</xsl:template> +</xsl:stylesheet> + + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperCPP.xsl b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperCPP.xsl new file mode 100644 index 0000000000..f983917e36 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperCPP.xsl @@ -0,0 +1,290 @@ +<!-- + 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. +--> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<!-- Part of the org.apache.tuscany.sca.cpp.tools.services packages + - + - This stylesheet creates the CPP implementation of the + - wrapper body for a given SCA service + --> +<xsl:output method="text"/> + +<!-- Delete cppScopes --> +<xsl:template match="cppScope"></xsl:template> + +<!-- Delete private methods cppScopes --> +<xsl:template match="scaOperation[@cppScope='private']"> +</xsl:template> + +<!-- Don't act on return types --> +<xsl:template match="scaOperationReturnType"> +</xsl:template> + + +<!-- --> +<!-- CPP Header/Root --> +<!-- --> +<xsl:template match="cppHeader">/* + * 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. + */ + +<xsl:apply-templates select="scaService" mode="include_header"/> + +#include "osoa/sca/sca.h" + +<xsl:if test="not(@implNamespace = '')">using <xsl:value-of select="@implNamespace"/><xsl:value-of select="@implClass"/>;</xsl:if> +<xsl:text><!-- newline --> + +</xsl:text> +<!-- thats the prologue over and done with + now continue with the scaServiceElement --> +<xsl:apply-templates/> <!-- will be applied to scaService --> +<!-- Always make sure we have a final newline --> +<xsl:text> + +</xsl:text> +</xsl:template> + +<!-- --> +<!-- Service --> +<!-- --> +<xsl:template match="scaService"> +<xsl:variable name="class"> + <xsl:value-of select="../@implClass"/> + <xsl:text>_</xsl:text> + <xsl:value-of select="../@serviceName"/> + <xsl:text>_Wrapper</xsl:text> +</xsl:variable> +<xsl:text>extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + </xsl:text><xsl:value-of select="$class"/> +<xsl:text>* </xsl:text> +<xsl:value-of select="$class"/> +<xsl:text>_Factory(tuscany::sca::model::Service* target) + { + return new </xsl:text><xsl:value-of select="$class"/><xsl:text>(target); + } +} + +</xsl:text> +<xsl:value-of select="$class"/><xsl:text>::</xsl:text><xsl:value-of select="$class"/><xsl:text>(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (</xsl:text><xsl:value-of select="../@implClass"/><xsl:text>*)getImplementation(); +} + +</xsl:text> +<xsl:value-of select="$class"/><xsl:text>::~</xsl:text><xsl:value-of select="$class"/><xsl:text>() +{ + releaseImplementation(); +} + +void* </xsl:text> +<xsl:value-of select="$class"/><xsl:text>::newImplementation() +{ + return new </xsl:text><xsl:value-of select="../@implClass"/><xsl:text>; +} + +void </xsl:text> +<xsl:value-of select="$class"/><xsl:text>::deleteImplementation() +{ + delete impl; +} + +void </xsl:text><xsl:value-of select="$class"/><xsl:text>::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + +</xsl:text> +<xsl:apply-templates/><!-- an if statment for each operation --> +<xsl:text> + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +}</xsl:text> +</xsl:template> + +<xsl:template match="scaService" mode="include_header"> +<xsl:variable name="class"> + <xsl:value-of select="../@implClass"/> + <xsl:text>_</xsl:text> + <xsl:value-of select="../@serviceName"/> + <xsl:text>_Wrapper</xsl:text> +</xsl:variable> +<xsl:text>#include "</xsl:text> +<xsl:value-of select="$class"/> +<xsl:text>.h"</xsl:text> +</xsl:template> + +<!-- --> +<!-- Operation --> +<!-- --> +<xsl:template match="scaOperation"> +<!--For example + if (operationName == "getCustomerInformation") + { + operation.setReturnValue(impl->getCustomerInformation((const char*)parms[0])); + return; + } +--> +<xsl:if test="@operationNameAttr != ../../@intfClass + and @operationNameAttr != concat('~', ../../@intfClass)" > +<xsl:text> if (operationName == "</xsl:text> +<xsl:value-of select="@operationNameAttr"/> +<xsl:text>") + { +</xsl:text> + <xsl:call-template name="this_operation_body"/> +<xsl:text> + } +</xsl:text> + +</xsl:if> +</xsl:template> + +<xsl:template name="this_operation_body"> +<xsl:if test="./scaOperationParameter/text() != 'void' "> + <xsl:if test="normalize-space(./scaOperationParameter/text()) != ' ' "> + <xsl:if test="./scaOperationParameter/text() != '' "> + <xsl:for-each select="scaOperationParameter"> + <xsl:call-template name="prepare_parameter_n"/> + </xsl:for-each> + </xsl:if> + </xsl:if> +</xsl:if> +<xsl:call-template name="invoke_for_return_type"/> +<xsl:text> + return;</xsl:text> +</xsl:template> + +<xsl:template name="prepare_parameter_n"> + <xsl:variable name="isConst"> + <xsl:value-of select="@scaOperationParameterConstAttr"/> + </xsl:variable> + <xsl:variable name="type"> + <xsl:value-of select="."/> + </xsl:variable> +<xsl:text> </xsl:text> + <xsl:choose> + <xsl:when test="contains($type, '&')"><!-- reference --> + <xsl:variable name="type_no_amp"> + <xsl:value-of select="substring-before($type, '&')"/> + </xsl:variable> + <xsl:value-of select="$type"/><xsl:text> p</xsl:text><xsl:value-of select="position()-1"/><xsl:text> = *(</xsl:text><xsl:value-of select="$type_no_amp"/> + <xsl:text>*)operation.getParameterValue(</xsl:text><xsl:value-of select="position()-1"/><xsl:text>); +</xsl:text> + </xsl:when> + <xsl:when test="contains($type, '*')"><!-- pointer --> + <xsl:if test="contains($isConst,'true')">const </xsl:if> + <xsl:value-of select="."/><xsl:text> p</xsl:text><xsl:value-of select="position()-1"/><xsl:text> = *(</xsl:text> + <xsl:if test="contains($isConst,'true')">const</xsl:if><xsl:text> </xsl:text> + <xsl:value-of select="$type"/> + <xsl:text>*)operation.getParameterValue(</xsl:text><xsl:value-of select="position()-1"/><xsl:text>); +</xsl:text> + </xsl:when> + <xsl:when test="contains($type, 'DataObjectPtr')"><!-- DataObjectPtr --> + <xsl:text>commonj::sdo::DataObjectPtr& p</xsl:text><xsl:value-of select="position()-1"/><xsl:text> = *(commonj::sdo::DataObjectPtr*)operation.getParameterValue(</xsl:text><xsl:value-of select="position()-1"/><xsl:text>);</xsl:text> + </xsl:when> + <xsl:otherwise><!-- simple type --> + <xsl:if test="contains($isConst,'true')">const </xsl:if><xsl:value-of select="$type"/><xsl:text>& p</xsl:text><xsl:value-of select="position()-1"/><xsl:text> = *(</xsl:text> + <xsl:if test="contains($isConst,'true')">const</xsl:if><xsl:text> </xsl:text> + <xsl:value-of select="$type"/> + <xsl:text>*)operation.getParameterValue(</xsl:text><xsl:value-of select="position()-1"/><xsl:text>); +</xsl:text> + + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="invoke_for_return_type"> + <xsl:variable name="type"> + <xsl:value-of select="./scaOperationReturnType/text()"/> + </xsl:variable> + <xsl:choose> + <!-- VOID --> + <xsl:when test="$type='void'"> +<xsl:text> </xsl:text> + <xsl:call-template name="impl_arrow_op_brackets_and_parms"/><xsl:text>;</xsl:text> + </xsl:when> + <xsl:when test="contains($type, '&')"><!-- reference --> + <xsl:text> </xsl:text><xsl:value-of select="$type"/><xsl:text> ret = </xsl:text><xsl:call-template name="impl_arrow_op_brackets_and_parms"/><xsl:text>;</xsl:text> + <xsl:text> + operation.setReturnValue(&ret);</xsl:text> + </xsl:when> + <xsl:otherwise><!-- simple type --> + <xsl:text> + if(operation.getReturnValue() != NULL) + { + *(</xsl:text><xsl:value-of select="$type"/><xsl:text>*)operation.getReturnValue() = </xsl:text><xsl:call-template name="impl_arrow_op_brackets_and_parms"/><xsl:text>; + } + else + { + </xsl:text><xsl:value-of select="$type"/><xsl:text>* ret = new </xsl:text><xsl:value-of select="$type"/><xsl:text>; + *ret = </xsl:text><xsl:call-template name="impl_arrow_op_brackets_and_parms"/><xsl:text>; + operation.setReturnValue((const </xsl:text><xsl:value-of select="$type"/><xsl:text>*)ret); + }</xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="impl_arrow_op_brackets_and_parms"><!-- context is "scaOperation" --> + <xsl:text>impl-></xsl:text><xsl:value-of select="./@operationNameAttr"/><xsl:text>(</xsl:text> +<xsl:if test="./scaOperationParameter/text() != 'void' "> + <xsl:if test="./scaOperationParameter/text() != '' "> + <xsl:if test="normalize-space(./scaOperationParameter/text()) != ' ' "> + <xsl:for-each select="scaOperationParameter"> + <xsl:call-template name="parameter_for_parameter_list"/> + </xsl:for-each> +</xsl:if> +</xsl:if> +</xsl:if> +<xsl:text>)</xsl:text> +</xsl:template> + +<xsl:template name="parameter_for_parameter_list"> +<xsl:text>p</xsl:text><xsl:value-of select="position()-1"/> + <xsl:choose> + <xsl:when test="position()=last()"></xsl:when> + <xsl:otherwise> + <xsl:text>, </xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + + + +</xsl:stylesheet> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperHeader.xsl b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperHeader.xsl new file mode 100644 index 0000000000..c8157fe2f6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/tools/scagen/src/org/apache/tuscany/sca/cpp/tools/services/xsl/SCA4CPPIntfWrapperHeader.xsl @@ -0,0 +1,191 @@ +<!-- + 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. +--> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +<!-- Part of the org.apache.tuscany.sca.cpp.tools.services packages + - + - This stylesheet creates the CPP implementation of the + - wrapper header for a given SCA service + --> + <xsl:output method="text" /> + + <!-- Delete cppScopes --> + <xsl:template match="cppScope"></xsl:template> + + <!-- Delete private methods cppScopes --> + <xsl:template match="scaOperation[@cppScope='private']"> + </xsl:template> + + <!-- Delete private methods cppScopes --> + <xsl:template match="scaOperationReturnType"></xsl:template> + + + <!-- --> + <!-- CPP Header/Root --> + <!-- --> + <xsl:template match="cppHeader"> + <xsl:variable name="class"> + <xsl:value-of select="concat(@implClass, '_', @serviceName, '_Wrapper')"/> + </xsl:variable> +<xsl:text>/* + * 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. + */ + +</xsl:text> + <xsl:call-template name="ifndef_start"> + <xsl:with-param name="class" + select="$class"/> + </xsl:call-template> + + + <xsl:call-template name="include_headers"> + <xsl:with-param name="header" + select="@compositeXmlFileHeader"/> + </xsl:call-template> + + <xsl:apply-templates select="scaService" mode="class_body"/> + + <xsl:call-template name="ifndef_end"> + <xsl:with-param name="class" + select="$class"/> + </xsl:call-template> +<!-- Always make sure we have a (visible) final return --> +<xsl:text> + +</xsl:text> +</xsl:template> + + +<!-- Here are the subroutine templates in order --> + + <xsl:template name="ifndef_start"> + <!--For example, + #ifndef CustomerInfoImpl_CustomerInfoService_Wrapper_h + #define CustomerInfoImpl_CustomerInfoService_Wrapper_h + --> + <xsl:param name="class"/> + <xsl:text>#ifndef </xsl:text><xsl:value-of select="$class"/><xsl:text>_h</xsl:text> +<!-- newline --> +<xsl:text> +</xsl:text> + <xsl:text>#define </xsl:text><xsl:value-of select="$class"/><xsl:text>_h</xsl:text> +<!-- newline --> +<xsl:text> + +</xsl:text> + <xsl:text>#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif </xsl:text> +<!-- newline --> +<xsl:text> + +</xsl:text> + </xsl:template> + + <xsl:template name="include_headers"> + <!--For example, + #include "CustomerInfoImpl.h" + #include "tuscany/sca/cpp/CPPServiceWrapper.h" + --> + <xsl:param name="header"/> + <xsl:text>#include "</xsl:text><xsl:value-of select="translate($header,'\','/')"/><xsl:text>"</xsl:text> +<!-- newline --> +<xsl:text> +</xsl:text> + <xsl:text>#include "tuscany/sca/cpp/CPPServiceWrapper.h"</xsl:text> + </xsl:template> + + <xsl:template match="scaService" mode="class_body"> + <!--For example + class wrapperclassname : public tuscany::sca::cpp::CPPServiceWrapper + { + constructor + destructor + then apply operation templates for operations + }; + + E.g. Specifically + + class CustomerInfoImpl_CustomerInfoService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper + { + public: + CustomerInfoImpl_CustomerInfoService_Wrapper(tuscany::sca::model::Component*); + virtual ~CustomerInfoImpl_CustomerInfoService_Wrapper(); + virtual void invoke(tuscany::sca::Operation& operation); + + private: + CustomerInfoImpl* impl; + }; + --> + <!-- TODO second definition, remove? --> + <xsl:variable name="class"> + <xsl:value-of select="concat(../@implClass, '_', ../@serviceName, '_Wrapper')"/> + </xsl:variable> +<xsl:text> + +class </xsl:text> +<xsl:value-of select="$class"/> +<xsl:text> : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + </xsl:text><xsl:value-of select="$class"/><xsl:text>(tuscany::sca::model::Service* target);</xsl:text> + <xsl:text> + virtual ~</xsl:text><xsl:value-of select="$class"/><xsl:text>(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +</xsl:text> +<xsl:text>private: + </xsl:text> + <xsl:value-of select="../@implNamespace"/><xsl:value-of select="../@implClass"/><xsl:text>* impl; +}; +</xsl:text> + </xsl:template> + + <xsl:template name="ifndef_end"> + <!--For example, + #endif // CustomerInfoImpl_CustomerInfoService_Wrapper_h + --> + <xsl:param name="class"/> + <xsl:text> +#endif // </xsl:text><xsl:value-of select="$class"/><xsl:text>_h</xsl:text> + </xsl:template> + +<xsl:template match="scaOperation"> +</xsl:template> + +</xsl:stylesheet> + + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/xsd/sca-implementation-cpp.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/xsd/sca-implementation-cpp.xsd new file mode 100644 index 0000000000..ac2004bd73 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/xsd/sca-implementation-cpp.xsd @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"></include> + + <element name="implementation.cpp" type="sca:CPPImplementation" substitutionGroup="sca:implementation"/> + <complexType name="CPPImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="library" type="NCName" use="required"/> + <attribute name="path" type="NCName" use="optional"/> + <attribute name="header" type="NCName" use="required"/> + <attribute name="class" type="Name" use="optional"/> + <attribute name="scope" type="sca:CPPImplementationScope" use="optional" /> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + + <simpleType name="CPPImplementationScope"> + <restriction base="string"> + <enumeration value="stateless" /> + <enumeration value="composite" /> + </restriction> + </simpleType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/xsd/sca-interface-cpp.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/xsd/sca-interface-cpp.xsd new file mode 100644 index 0000000000..a8493fe726 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/cpp/xsd/sca-interface-cpp.xsd @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="interface.cpp" type="sca:CPPInterface" substitutionGroup="sca:interface"/> + <complexType name="CPPInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="header" type="NCName" use="required" /> + <attribute name="class" type="Name" use="optional" /> + <attribute name="callbackHeader" type="NCName" use="optional" /> + <attribute name="callbackClass" type="Name" use="optional" /> + <attribute name="remotable" type="boolean" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/AUTHORS b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/AUTHORS new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/AUTHORS diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/COPYING b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/COPYING new file mode 100755 index 0000000000..6b0b1270ff --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/COPYING @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/ChangeLog b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/ChangeLog new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/ChangeLog diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/INSTALL b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/INSTALL new file mode 100644 index 0000000000..059a43057b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/INSTALL @@ -0,0 +1,2 @@ +Please read the GettingStarted.html document for information on +building and installing Tuscany SCA Native PHP extemstion diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/LICENSE b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/LICENSE new file mode 100755 index 0000000000..f433b1a53f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/Makefile.am new file mode 100644 index 0000000000..fb661fec63 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +SUBDIRS = src samples + +datadir=$(prefix) + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/NEWS b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/NEWS new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/NEWS diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/NOTICE b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/NOTICE new file mode 100644 index 0000000000..b240b0a121 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/NOTICE @@ -0,0 +1,5 @@ +Apache Tuscany SCA Native +Copyright 2005, 2007 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/)
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/README b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/README new file mode 100644 index 0000000000..ad96622516 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/README @@ -0,0 +1,276 @@ +PHP Extension for C++ SCA README +================================ + +Overview +-------- + +The PHP extension for C++ SCA allows PHP scripts to be used to implement SCA components. +This is achieved by using the C++ SCA extension API to drive script execution through the +PHP embedding SAPI. In its current incarnation the PHP Extension requires that a full SCDL +description is provided for each PHP component, i.e. we are not yet making use of the meta data +provided by the annotations that can appear in PHP SCA components. + +There are various styles of PHP script that are supported. The examples here are taken from +the PHPCalculator sample and if you look at the SCDL files provided with the sample you can +see the component type and composite files that tie these components into the working system + +SCA Service +----------- + +/** + * @service + * @binding.ws + */ +class Divide { + + /** + * @reference + * @binding.tuscany cppDivideService + */ + public $another_divide; + + /** + * Division + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function div($num1, $num2) { + return $this->another_divide->div($num1, $num2); + } + +} + +PHP Class +--------- + +class Multiply { + function mul($num1, $num2) { + $result = $num1 * $num2; + + $log_proxy = SCA::getService("log_service"); + $log_proxy->log_message($result); + + return $result; + } +} + +PHP Function +------------ + +function sub($num1, $num2){ + $result = $num1 - $num2; + + $log_proxy = SCA::getService("log_service"); + $log_proxy->log_message($result); + + return $result; +} + +PHP Script +---------- + +$num1 = $_REQUEST[0]; +$num2 = $_REQUEST[1]; + +$result = $num1 + $num2; + +$log_proxy = SCA::getService("log_service"); +$log_proxy->log_message($result); + +echo $result; + +TODO +---- +* I struggled for a long time with a missing symbol problem loading sdo.so at runtime on linux. + I got round this by creating a standalone Makefile for the CalculatorClient exe. All the + shared objects that are loaded are compiled with the normal automake toolchain still but this + solves the problem. I need to investigate in detail what's going on here. Having someone + else try building with the full automake configuration would be insteresting +* The problem from above does appear when running SCA behind axis hence I am unable to test with + remote clients +* The SCA_SDO build generates sdo.so and the Tuscany PHP Extension tries to load libsdo.so. + One side needs fixing. For now I just copy the library +* SDO passing in and out of components is coded but not tested +* Returning values from plain PHP scripts (scripts without classes and functions) is not + operating correctly +* Error handling needs looking at. Many situations are not trapped and those + that are may not be reported correctly +* Reorganize the extension code so that Tuscany SCA can be loaded by PHP running in Apache + and accessed through SCA references. This will play the same role as SCA running hosted + in Axis2C and will open up the service bindings implemented in PHP SCA_SDO. +* Implement meta data exchange between the PHP SCA implementation and the Tuscany C++ SCA + implementations so that selected parts of the SCDL definition can be omitted. +* There is a threading issue with the way that we are firing up the PHP embedding SAPI + TSRM should solve it fails on the embedding initialization for some reason. + +Dependencies +------------ +PHP5.2.0 source code - - (http://php.net/) + The binary release of PHP doesn't ship with the header files required to build + against the PHP embedding SAPI and runtime libraries. So go get the PHP source + code and build PHP. PHP will need to be configured correctly in order to + work properly when embedded in C++ SCA. Here are some sample configuration + statements but they will need to be tailored for you specific environment: + + Winodws + ------- + cscript configure.js --with-extra-includes=win32build\include; + libxml2-2.6.26.threads\include; + iconv-1.9.1.win32\include; + libcurl-7.15.4-nossl\include + --with-extra-libs=win32build\lib; + libxml2-2.6.26.threads\lib; + iconv-1.9.1.win32\lib; + libcurl-7.15.4-nossl\lib + --enable-debug + --enable-soap + --enable-apache2handler=shared + --enable-embed + --with-curl=C:\simon\apps\libcurl-7.15.4-nossl + + Note. This configure line is artificially broken across sever lines to aid + readability here. You will need to join it all back together on one line to + run it. + + Linux + ----- + ./configure --enable-debug \ + --enable-soap \ + --enable-fastcgi \ + --with-zlib \ + --enable-embed \ + --with-tsrm-pthreads \ + --enable-maintainer-zts + Note. debug, pthreads, maintainer-zts, fastcgi are not absolute requirements but just + represent the environment I was testing with when I wrote this. + +SCA_SDO PECL extension AVOCET branch source code - (http://pecl.php.net/package/SCA_SDO) + Provides the SCA framework for PHP and the necessary mediation code to translate + between Tuscany SCA and PHP SCA. Go get the AVOCET branch from PECL cvs + + export CVSROOT=:pserver:cvsread@cvs.php.net/repository + cvs export -r AVOCET pecl/sdo + + The process to build this code varies quite considerably between windows and Linux. + Take a look at the instructions in the SCA_SDO manual, follow the documentation link + from the projects PECL page (http://uk2.php.net/sdo/). + + Once built you will need to copy the library sdo.so to + libsdo.so so that the Tuscany PHPExtension can load it given the makefile + configuration as it stands. For example, on linux + + ln -s sdo.so libsdo.so + + +Building on windows +------------------- + +The Visual C++ Express solution provided with C++ SCA includes a project +to build the PHP extension. This project relies on being able to access the +PHP include files from the source code directory and the PHP lib files from the +binary install. Make sure your environment is set as follows before you start +Visual C++ Express (if you do this after you start Visual C++ Express it will +not pick up the changes) + +PHP_HOME = the root directory of the PHP 5.2.0 source code install +PATH = ensure that the root directory of the PHP 5.2.0 binary install appears + +PHP_SCA_SDO_HOME = the directory in which the SCA_SDO pecl extension source is installed + +These changes come over and above the environment changes you need to make +to build the core C++ SCA software. I have the following set in my environment but +of course the details depend on where you have the various bits of software installed. + +AXIS2C_HOME=c:\axis2c-bin-0.96-win32 +LIBXML2_HOME=c:\libxml2-2.6.26.ein32 +ICONV_HOME=c:\iconv-1.9.2.win32 +ZLIB_HOME=c:\zlib-1.2.3.win32 +TUSCANY_SCACPP=c:\sca\deploy +TUSCANY_SDOCPP=c:\sdo\deploy + +Now compile the PHP extension. Compiling with VC++ Express requires some care + +1/ Ensure that the PHP include files are configured correctly for + compiling against C++ SCA in Visual C++ express + + See - http://bugs.php.net/bug.php?id=39130 + + Comment out two lines in $(PHP_HOME)/main/config.w32.h: + #define _USE_32BIT_TIME_T 1 + #define HAVE_STDLIB_H 1 + + +Building on Linux +----------------- + +The PHP extension comes with a set of automake files so that the PHP extension is built +at the same time as all of the other extensions assuming that appropriate environment +variables are set. The build.sh script that can be found under the top level sca directory +checks whether the PHP_LIB and PHP_INCLUDE variables are set and if so enables compilation +of the PHP extension automatically by adding --enable-php to the configure line. + +There are a number of environment variables that the build depends on. I find setting the +following variables useful. + +# the location of libxm2 +export LIBXML2_LIB=/usr/lib +export LIBXML2_INCLUDE=/usr/include/libxml2 + +# the location of PHP +export PHP_LIB=/usr/local/lib +export PHP_INCLUDE=/usr/local/include/php + +# the location of the PHP SCA_SDO extension source +# the lib location depends oh the configuration options used +# when building PHP so beware +export PHP_SCA_SDO_INCLUDE=where ever you install the SCA_SDO package source +export PHP_SCA_SDO_LIB=$PHP_LIB/php/extensions/no-debug-zts-20060613/ + +# the location of axis2 +export AXIS2C_HOME=/usr/local/axis2c-bin-0.96-linux + +# the install directories for the tuscany sca and sdo projects +export TUSCANY_SDOCPP=/usr/local/tuscany/cpp/sdo/deploy +export TUSCANY_SCACPP=/usr/local/tuscany/cpp/sca/deploy + +Once these are set running sca/build.sh should compile and install the PHP extension. + +Testing the PHP Extension +------------------------- + +In order to run the PHP extension successfully as an embedded component of the +C++ SCA runtime the PHP environment must be configured correctly. This configuration +is provided by the php.ini file. The location of this file depends on your installation +of PHP but by default is as follows. + +/usr/local/bin - PHP executables +/usr/local/lib/php.ini - the ini file that tell PHP where to look for scripts and + extension libraries +/usr/local/lib/php - PHP runtime installation, extension files and tests + +As is usually the case your milage may vary but wherever PHP is installed you will find +a similar set of directories. To force PHP to look in the correct place use the following +setting + +# tell PHP specifically where to find php.ini rather than relying on the default +set PHPRC=/usr/local/lib + +The php.ini file must be configured to load the SCA_SDO extension so you would expect to +see the following modifications to the file. + +; around line 528 you need to set the variable that tells PHP where to +; load extension libraries from. This varies depending on how PHP has been +; compiled and installed, for example, +extension_dir = "/usr/local/lib/php/extensions/no-debug-zts-20060613/" + +; around line 512 you need to set the variable that tells PHP where to +; load included scripts from. There are windows and unix versions. Here +; is a Unix example +include_path=".:/usr/local/lib/php:/usr/local/lib/php/PEAR:/usr/local/tuscany/cppsca/samples/PHPCalculator/deploy/sample.calculator" + +; around line 673 you will find the end of the list of enabled extensions. We need to turn +; on SDO so add the following line. sdo.so should be found in "extension_dir". +extension=sdo.so + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/autogen.sh b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/autogen.sh new file mode 100755 index 0000000000..af38864985 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/autogen.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# 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. + +for i in "libtoolize --force" aclocal autoconf autoheader +do + echo -n "Running $i..." + $i || exit 1 + echo 'done.' +done + +echo -n 'Running automake...' +automake --add-missing +echo 'done.' +exit 0 + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/build.sh b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/build.sh new file mode 100755 index 0000000000..41e96d0565 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/build.sh @@ -0,0 +1,55 @@ +#!/bin/sh + +# 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. + +SCA_PHP_EXTENSION_HOME=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi + +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$PHP_LIB = x ]; then +echo "PHP_LIB not set." +exit; +elif [ x$PHP_INCLUDE = x ]; then +echo "PHP_INCLUDE not set." +exit; +elif [ x$PHP_SCA_SDO_INCLUDE = x ]; then +echo "PHP_SCA_SDO_INCLUDE not set." +exit; +elif [ x$PHP_SCA_SDO_LIB = x ]; then +echo "PHP_SCA_SDO_LIB not set." +exit; +fi +echo "Building PHP extension with PHP installed at $PHP_LIB, $PHP_INCLUDE" +echo "and PHP SCA and SDO installed at $PHP_SCA_SDO_LIB, $PHP_SCA_SDO_INCLUDE" + +#cd ${TUSCANY_SCACPP_HOME}/samples +#./autogen.sh + +cd ${SCA_PHP_EXTENSION_HOME} +./autogen.sh + + +./configure --prefix=${TUSCANY_SCACPP}/extensions/php +make +make install + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/configure.ac b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/configure.ac new file mode 100644 index 0000000000..d68d262b78 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/configure.ac @@ -0,0 +1,79 @@ +# 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. + +dnl run autogen.sh to generate the configure script. + +AC_PREREQ(2.59) +AC_INIT(tuscany_sca_php, 1.0-incubator-M3) +AC_CANONICAL_SYSTEM +AM_CONFIG_HEADER(tuscany_sca_php_config.h) +AM_INIT_AUTOMAKE([tar-ustar]) +AC_PREFIX_DEFAULT(/usr/local/tuscany/sca/extensions/php) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL + +# Check for running on Darwin +AC_MSG_CHECKING([Checking if running on Darwin]) +UNAME=`uname -s` +if test "x$UNAME" = "xDarwin"; then + AC_DEFINE([IS_DARWIN], [1], [Set to 1 when running on Darwin - Mac OSX]) + AC_MSG_RESULT(yes) + AC_SUBST([libsuffix],[".dylib"]) + is_darwin=true +else + AC_MSG_RESULT(no) + AC_SUBST([libsuffix],[".so"]) + is_darwin=false +fi +AM_CONDITIONAL([DARWIN], [test x$is_darmin = xtrue]) + +# Checks for libraries. + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([inttypes.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_C_INLINE + +# Checks for library functions. +AC_FUNC_CLOSEDIR_VOID +AC_FUNC_STAT +AC_FUNC_VPRINTF +AC_CHECK_FUNCS([getcwd putenv strdup]) +# AC_CONFIG_SUBDIRS([samples]) + + +AC_CONFIG_FILES([Makefile + src/Makefile + samples/Makefile + samples/PHPCalculator/Makefile + samples/PHPCalculator/sample.calculator/Makefile + samples/PHPCalculator/sample.calculator.client/Makefile + ]) +AC_OUTPUT + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/Makefile.am new file mode 100644 index 0000000000..920828ef4f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = PHPCalculator
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/Makefile.am new file mode 100644 index 0000000000..fd34c6442a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/samples/PHPCalculator/deploy +SUBDIRS = sample.calculator sample.calculator.client +EXTRA_DIST = *.composite +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/README b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/README new file mode 100644 index 0000000000..dbee1f5f85 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/README @@ -0,0 +1,32 @@ +Tuscany SCA for C++ Samples - PHP Calculator Sample +=================================================== + +This is a simple sample to show how an SCA composite can wire together +a number of components to implement a Calculator service and expose that service as +to a number of different tpyes of client. The sample components are implemented in various +ways to demonstrate the different features of the PHP SCA extension. + +There are two sub projects in this workspace: + - sample.calculator + This contains the source code and SCDL artifacts for the SCA Calculator + composite implementing the sample Calculator + + - sample.calculator.client + A sample client which does a local call to the Calculator service + +A Python client is used because the work to enable PHP to host SCA is not done yet + +Windows +======= +tba + +Linux +===== + +The make install will deploy this under $TUSCANY_SCACPP/extensions/php/samples + +To run the sample + +cd $TUSCANY_SCACPP/extensions/php/samples/PHPCalculator/deploy/sample.calculator.client +./runclient.sh + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.app.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.app.composite new file mode 100644 index 0000000000..ada4d89a1c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.app.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.app"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/Makefile.am new file mode 100644 index 0000000000..548f9bdcb8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +deploydir=$(prefix)/samples/PHPCalculator/deploy +clientdir=$(deploydir)/sample.calculator.client + +client_DATA = *.py +client_SCRIPTS = runclient.sh +EXTRA_DIST = *.py *.php runclient.sh + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/calculator_client.py b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/calculator_client.py new file mode 100644 index 0000000000..d4b37ee2b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/calculator_client.py @@ -0,0 +1,50 @@ +# 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. +# +# +# +# +# This Python code is a simple sample that provides a Python +# client for the Calculator sample + + +import sys +import sca + +op = sys.argv[1] +val1 = sys.argv[2] +val2 = sys.argv[3] + +# Locate the calculator service +calc = sca.locateservice("CalculatorComponent/CalculatorService") + +# Invoke the calculator operations +if op == 'add': + result = calc.add(val1, val2) + +elif op == 'sub': + result = calc.sub(val1, val2) + +elif op == 'mul': + result = calc.mul(val1, val2) + +elif op == 'div': + result = calc.div(val1, val2) + + +print "calculator_client: ",op,"(",val1,",",val2,") = ",result + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/runclient.sh new file mode 100755 index 0000000000..54ebfdbde4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator.client/runclient.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$PYTHON_LIB != x ]; then +echo "Using Python library installed at $PYTHON_LIB" +export LD_LIBRARY_PATH=$PYTHON_LIB:$LD_LIBRARY_PATH +export PATH=$PYTHON_LIB/../bin:$PATH +fi + +export LD_LIBRARY_PATH=$PHP_SCA_SDO_LIB:$TUSCANY_SCACPP/lib:$TUSCANY_SCACPP/extensions/python/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/sample.calculator.client +python calculator_client.py mul 7 6 diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Calculator.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Calculator.componentType new file mode 100644 index 0000000000..5a6c3a199e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Calculator.componentType @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="CalculatorService"> + <interface.php/> + </service> + + <reference name="div_service"> + <interface.php/> + </reference> + +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Calculator.php b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Calculator.php new file mode 100644 index 0000000000..f0f35bab56 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Calculator.php @@ -0,0 +1,89 @@ +<?php +# 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. +# +# +include 'SCA/SCA.php'; + +/** + * @service + * @binding.ws + */ +class Calculator { + + + /** + * @reference + * @binding.php Multiply.php + */ + public $mul_service; + + /** + * @reference + * @binding.tuscany div_service + */ + public $div_service; + + /** + * Addition + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function add($num1, $num2) { + printf("in Calculator::add"); + return $num1 + $num2; +// return $this->add_service->add($num1, $num2); + } + + /** + * Subtraction + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function sub($num1, $num2) { + return $num1 - $num2; +// return $this->sub_service->sub($num1, $num2); + } + + /** + * Multiplication + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function mul($num1, $num2) { + return $this->mul_service->mul($num1, $num2); + } + + /** + * Division + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function div($num1, $num2) { + return $this->div_service->div($num1, $num2); + } +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Divide.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Divide.componentType new file mode 100644 index 0000000000..b50b20d9c6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Divide.componentType @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="DivideService"> + <interface.php/> + </service> + + <reference name="log_service"> + <interface.php/> + </reference> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Divide.php b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Divide.php new file mode 100644 index 0000000000..5a08e5b063 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Divide.php @@ -0,0 +1,47 @@ +<?php +# 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. +# +# + +/** + * @service + * @binding.php + */ +class Divide { + + /** + * Division + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function div($num1, $num2) { + + $result = $num1 / $num2; + + $log_proxy = SCA::getService("log_service"); + $log_proxy->log_message($result); + + return $result; + + } + +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Log.componentType b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Log.componentType new file mode 100644 index 0000000000..f945c6af8c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Log.componentType @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="LogService"> + <interface.php/> + </service> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Log.php b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Log.php new file mode 100644 index 0000000000..0a955f36d3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Log.php @@ -0,0 +1,36 @@ +<?php +# 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. +# +# + +/** + * @service + */ +class Log { + + /** + * Log + * + * @param string $message (the message to be logged) + */ + function log_message($message) { + SCA::$logger->toLog('>>> ' . $message); + } +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Makefile.am new file mode 100644 index 0000000000..10020c4f03 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/samples/PHPCalculator/deploy +compositedir=$(deploydir)/sample.calculator + +composite_DATA = *.composite *.componentType *.php +EXTRA_DIST = *.composite *.componentType *.php + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Multiply.php b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Multiply.php new file mode 100644 index 0000000000..ed2e75edc8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/Multiply.php @@ -0,0 +1,39 @@ +<?php +# 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. +# +# +require 'SCA/SCA.php'; + +class Multiply { + + /** + * @reference + * @binding.php Log.php + */ + public $log_service; + + function mul($num1, $num2) { + $result = $num1 * $num2; + +// $this->log_service->log_message($result); + + return $result; + } +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/sample.calculator.composite b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/sample.calculator.composite new file mode 100644 index 0000000000..f1a82a70db --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/samples/PHPCalculator/sample.calculator/sample.calculator.composite @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> + + <component name="CalculatorComponent"> + <implementation.php module="Calculator" class="Calculator" scope="composite"/> + <reference name="div_service">DivideComponent</reference> + </component> + + + <component name="DivideComponent"> + <implementation.php module="Divide" class="Divide" scope="composite"/> + <reference name="log_service">LogComponent</reference> + </component> + + <component name="LogComponent"> + <implementation.php module="Log" class="Log" scope="composite"/> + </component> + + + + + +</composite> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/Makefile.am new file mode 100644 index 0000000000..d0b04262f5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/Makefile.am @@ -0,0 +1,57 @@ +# 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. + +libdir=$(prefix)/lib +lib_LTLIBRARIES = libtuscany_sca_php.la + +noinst_HEADERS = \ +tuscany/sca/php/*.h \ +tuscany/sca/php/model/*.h + +libtuscany_sca_php_la_SOURCES = \ +tuscany/sca/php/PHPExtension.cpp \ +tuscany/sca/php/PHPImplementationExtension.cpp \ +tuscany/sca/php/PHPInterfaceExtension.cpp \ +tuscany/sca/php/PHPServiceWrapper.cpp \ +tuscany/sca/php/PHPServiceProxy.cpp \ +tuscany/sca/php/sca.cpp \ +tuscany/sca/php/model/PHPImplementation.cpp \ +tuscany/sca/php/model/PHPInterface.cpp \ +tuscany/sca/php/model/PHPReferenceBinding.cpp \ +tuscany/sca/php/model/PHPServiceBinding.cpp + +libtuscany_sca_php_la_LIBADD = -L${TUSCANY_SCACPP}/lib -ltuscany_sca \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L${PHP_LIB} -lphp5 \ + -L${PHP_SCA_SDO_LIB} -lsdo + +INCLUDES = -I${TUSCANY_SCACPP}/include \ + -I${TUSCANY_SDOCPP}/include \ + -I${PHP_INCLUDE} \ + -I${PHP_INCLUDE}/main \ + -I${PHP_INCLUDE}/Zend \ + -I${PHP_INCLUDE}/TSRM \ + -I${PHP_INCLUDE}/sapi/embed \ + -I${PHP_SCA_SDO_INCLUDE} + +moduledir=$(prefix)/module +extension = libtuscany_sca_php$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPExtension.cpp new file mode 100644 index 0000000000..0ffb660139 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPExtension.cpp @@ -0,0 +1,71 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/php/PHPExtension.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/php/PHPImplementationExtension.h" +#include "tuscany/sca/php/PHPInterfaceExtension.h" + + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_php_initialize() + { + tuscany::sca::php::PHPExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace php + { + // =================================================================== + // Constructor for the PHPExtension class. + // =================================================================== + PHPExtension::PHPExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the PHPExtension class. + // =================================================================== + PHPExtension::~PHPExtension() + { + logentry(); + } + + void PHPExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerImplementationExtension(new PHPImplementationExtension()); + SCARuntime::getCurrentRuntime()->registerInterfaceExtension(new PHPInterfaceExtension()); + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPExtension.h new file mode 100644 index 0000000000..971ed93c86 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPExtension.h @@ -0,0 +1,57 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_phpextension_h +#define tuscany_sca_php_phpextension_h + +namespace tuscany +{ + namespace sca + { + namespace php + { + + class PHPExtension + { + public: + /** + * Default constructor + */ + PHPExtension(); + + /** + * Destructor + */ + virtual ~PHPExtension(); + + static void initialize(); + + private: + + }; + + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_phpextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPImplementationExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPImplementationExtension.cpp new file mode 100644 index 0000000000..101667302f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPImplementationExtension.cpp @@ -0,0 +1,73 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/php/PHPImplementationExtension.h" +#include "tuscany/sca/php/model/PHPImplementation.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace php + { + // =================================================================== + // Constructor for the PHPImplementationExtension class. + // =================================================================== + PHPImplementationExtension::PHPImplementationExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the PHPImplementationExtension class. + // =================================================================== + PHPImplementationExtension::~PHPImplementationExtension() + { + logentry(); + } + + const string PHPImplementationExtension::extensionName("php"); + const string PHPImplementationExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#PHPImplementation"); + + // =================================================================== + // loadModelElement - load the info from implementation.php + // =================================================================== + ComponentType* PHPImplementationExtension::getImplementation(Composite *composite, DataObjectPtr scdlImplementation) + { + logentry(); + + string module = scdlImplementation->getCString("module"); + string className = scdlImplementation->getCString("class"); + + PHPImplementation* phpImpl = new PHPImplementation(composite, module, className); + + return phpImpl; + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPImplementationExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPImplementationExtension.h new file mode 100644 index 0000000000..604c4ea102 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPImplementationExtension.h @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_phpimplementationextension_h +#define tuscany_sca_php_phpimplementationextension_h + +#include "tuscany/sca/extension/ImplementationExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace php + { + + class PHPImplementationExtension : public ImplementationExtension + { + public: + /** + * Default constructor + */ + PHPImplementationExtension(); + + /** + * Destructor + */ + virtual ~PHPImplementationExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema element for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#implementation.phpn") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ComponentType* getImplementation( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlImplementation); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_phpimplementationextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPInterfaceExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPInterfaceExtension.cpp new file mode 100644 index 0000000000..a07c499dec --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPInterfaceExtension.cpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/php/PHPInterfaceExtension.h" +#include "tuscany/sca/php/model/PHPInterface.h" +#include "tuscany/sca/util/Logging.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace php + { + // =================================================================== + // Constructor for the PHPInterfaceExtension class. + // =================================================================== + PHPInterfaceExtension::PHPInterfaceExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the PHPInterfaceExtension class. + // =================================================================== + PHPInterfaceExtension::~PHPInterfaceExtension() + { + logentry(); + } + + const string PHPInterfaceExtension::extensionName("php"); + const string PHPInterfaceExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#PHPInterface"); + + // =================================================================== + // loadModelElement - load the info from interface.php + // =================================================================== + tuscany::sca::model::Interface* PHPInterfaceExtension::getInterface(Composite* composite, DataObjectPtr scdlInterface) + { + logentry(); + + // Determine the type + string ifType = scdlInterface->getType().getName(); + if (ifType == "PHPInterface") + { + bool remotable = scdlInterface->getBoolean("remotable"); + bool conversational = scdlInterface->getBoolean("conversational"); + + return new PHPInterface(remotable, conversational); + } + return 0; + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPInterfaceExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPInterfaceExtension.h new file mode 100644 index 0000000000..4279376300 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPInterfaceExtension.h @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_phpinterfaceextension_h +#define tuscany_sca_php_phpinterfaceextension_h + +#include "tuscany/sca/extension/InterfaceExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace php + { + + class PHPInterfaceExtension : public InterfaceExtension + { + public: + /** + * Default constructor + */ + PHPInterfaceExtension(); + + /** + * Destructor + */ + virtual ~PHPInterfaceExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#PHPInterface") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::Interface* getInterface( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlInterface); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_phpinterfaceextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceProxy.cpp new file mode 100644 index 0000000000..4b66c42a5b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceProxy.cpp @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/php/PHPServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/php/model/PHPReferenceBinding.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace php + { + + // ============================================ + // Constructor: Create a proxy from a reference + // ============================================ + PHPServiceProxy::PHPServiceProxy(Reference* reference) + : ServiceProxy(reference) + { + logentry(); + + // Get the service wrapper + PHPReferenceBinding* referenceBinding = (PHPReferenceBinding*)reference->getBinding(); + serviceWrapper = referenceBinding->getTargetServiceBinding()->getServiceWrapper(); + } + + // ========================================== + // Constructor: Create a proxy from a service + // ========================================== + PHPServiceProxy::PHPServiceProxy(Service* service) + : ServiceProxy(NULL) + { + logentry(); + + // Get the service wrapper + serviceWrapper = service->getBinding()->getServiceWrapper(); + } + + // ========== + // Destructor + // ========== + PHPServiceProxy::~PHPServiceProxy() + { + logentry(); + } + + // ===================================================== + // invokeService: invoke the service wired to this proxy + // ===================================================== + void PHPServiceProxy::invokeService(Operation& operation) + { + logentry(); + + // Invoke the service + serviceWrapper->invoke(operation); + } + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceProxy.h new file mode 100644 index 0000000000..bddb262617 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceProxy.h @@ -0,0 +1,83 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_phpserviceproxy_h +#define tuscany_sca_php_phpserviceproxy_h + +#include "tuscany/sca/php/export.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + namespace php + { + + /** + * Holds a proxy for a given reference from a component implemented in PHP. + */ + class PHPServiceProxy : public ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + */ + PHPServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Create a new service proxy for a service. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param service The service on the target component. + */ + PHPServiceProxy(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~PHPServiceProxy(); + + /** + * Invoke the wired service. + */ + virtual void invokeService(Operation& operation); + + private: + + /** + * The target service wrapper + */ + ServiceWrapper* serviceWrapper; + }; + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_phpserviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceWrapper.cpp new file mode 100644 index 0000000000..8c92be0d83 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceWrapper.cpp @@ -0,0 +1,505 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifdef WIN32 + +// some strangeness in the build that causes +// WinSock.h and WinSock2.h to be included leading to redefinitions +#define _WINSOCKAPI_ + +// sdo.cpp also includes the math libraries and causes redeclarations +// of all the math functions +#define _INC_MATH + +#endif //WIN32 + +#include <iostream> +#include <sstream> + +#include <sapi/embed/php_embed.h> + + +#include "tuscany/sca/php/PHPServiceWrapper.h" +#include "tuscany/sca/php/PHPServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/php/model/PHPImplementation.h" + + +#include "sca.h" +#include "php_sdo_int.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace php + { + + int embedSAPIInitializeCount = 0; + + // Global callbacks used by the PHP engine + + // Callback for SAPI error + void php_sapi_error(int type, const char *error_msg, ...) + { + logwarning("PHP sapi error: %s", error_msg); + //TODO - do something sensible with this output + zend_bailout(); + } + + // Callback for log messages + void php_log_message(char *message) + { + loginfo("PHP log: %s", message); + //TODO - do something sensible with this output + } + + // Callback for unbuffered writes (echo, print etc.) + int php_ub_write(const char *str, unsigned int str_length TSRMLS_DC) + { + logentry(); + loginfo("PHP Output: %s", str); + //TODO - do something sensible with this output + return str_length; + } + + // Callback for errors + void php_error_cb(int type, + const char *error_filename, + const uint error_lineno, + const char *format, va_list args) + { + logentry(); + + char buffer[2048]; + int len; + + len = snprintf(buffer, 2048, "Error in file %s on line %d: ", error_filename, error_lineno); + vsnprintf(buffer + len, (2048 - len), format, args); + logwarning("PHP error: %s", buffer); + //TODO - do something sensible with this output + zend_bailout(); + } + + + // =========== + // Constructor + // =========== + PHPServiceWrapper::PHPServiceWrapper(Service* service) + : ServiceWrapper(service) + { + logentry(); + + component = service->getComponent(); + interf = service->getType()->getInterface(); + remotable = interf->isRemotable(); + + // ----------------------------------------------- + // Get the implementation for the target component + // ----------------------------------------------- + PHPImplementation* impl = (PHPImplementation*)component->getType(); + if (!impl) + { + string msg = "Component " + component->getName() + " has no implementation defined"; + throwException(SystemConfigurationException, msg.c_str()); + } + + loginfo("Module: %s", impl->getModule().c_str()); + loginfo("Class: %s", impl->getClass().c_str()); + } + + // ========== + // Destructor + // ========== + PHPServiceWrapper::~PHPServiceWrapper() + { + logentry(); + } + + + // ====================================================================== + // invoke: wrapper call to service with setting the component context + // ====================================================================== + void PHPServiceWrapper::invoke(Operation& operation) + { + zval z_func_name, retval, z_component_name, z_class_name, z_operation_name, z_arg_array; + zval *params[5]; + + logentry(); + + // set the current component in the SCA runtime + // so that other things can get at it thorugh this + // static class + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + runtime->setCurrentComponent(component); + + try + { + // get the component type information + PHPImplementation* impl = (PHPImplementation*)component->getType(); + + // get the directory containing the component type + const string &compositeDir = impl->getComposite()->getRoot(); + + // get some useful information that will be used later + // when we construct the wrapper script + string componentName = component->getName(); + string className = impl->getClass(); + string operationName = operation.getName(); + loginfo("Component %s class %s operation: %s", + componentName.c_str(), + className.c_str(), + operationName.c_str()); + + // load the PHP logging and error callback methods + php_embed_module.log_message = php_log_message; + php_embed_module.ub_write = php_ub_write; + php_embed_module.sapi_error = php_sapi_error; + + // would normally use the following macro before the embeded call + // but we need to take account of multiple nested calls + // and ZTS threading safety is not behaving itself + // PHP_EMBED_START_BLOCK(/* argc */ 0, /* argv */ NULL) + // ===================================================================== + { +#ifdef ZTS + static void ***tsrm_ls; + loginfo("ZTS enabled"); + + printf("tsrm_ls = %x, embedSAPIInitializeCount = %d\n", + tsrm_ls, embedSAPIInitializeCount); +#endif + + if ( embedSAPIInitializeCount == 0 ) + { + embedSAPIInitializeCount = 1; + + php_embed_init(0, NULL PTSRMLS_CC); + + // load up the sca module that provides the interface between + // C++ and user space PHP + zend_first_try { + zend_startup_module(&sca_module_entry); + } zend_end_try(); + } else { + embedSAPIInitializeCount++; + } + + zend_try { + // set error handler + zend_error_cb = php_error_cb; + + /* + * Open the include files + */ + // includeFile("SCA/SCA.php" TSRMLS_CC); + // includeFile("SCA/Bindings/tuscany/SCA_TuscanyWrapper.php" TSRMLS_CC); + + /* Instantiate a SCA_Tuscany (mediator) object, and + * set its operation property + */ + zval z_tuscany_mediator; + zval *pz_mediator = &z_tuscany_mediator; + INIT_ZVAL(z_tuscany_mediator); + zend_class_entry *ce_mediator = + zend_fetch_class("SCA_Tuscany", sizeof("SCA_Tuscany") - 1, 0 TSRMLS_CC); + object_init_ex(pz_mediator, ce_mediator); + z_tuscany_mediator.value.obj.handlers->add_ref(pz_mediator TSRMLS_CC); + + zend_update_property_long(ce_mediator, pz_mediator, + "operation", sizeof("operation") - 1, (long)&operation TSRMLS_CC); + + /* get the class info loaded up */ + zend_eval_string("include 'SCA/SCA.php';", + NULL, "Include SCA" TSRMLS_CC); + zend_eval_string("include 'SCA/Bindings/tuscany/SCA_TuscanyWrapper.php';", + NULL, "Include SCA_TuscanyWrapper" TSRMLS_CC); + + /* Now instantiate an SCA_TuscanyWrapper object and call its constructor */ + zval z_tuscany_wrapper; + zval *pz_tuscany_wrapper = &z_tuscany_wrapper; + INIT_ZVAL(z_tuscany_wrapper); + object_init_ex(pz_tuscany_wrapper, + zend_fetch_class("SCA_TuscanyWrapper", sizeof("SCA_TuscanyWrapper") - 1, 0 TSRMLS_CC)); + z_tuscany_wrapper.value.obj.handlers->add_ref(pz_tuscany_wrapper TSRMLS_CC); + + ZVAL_STRING(&z_func_name, "__construct", 1); + ZVAL_STRING(&z_component_name, (char *)componentName.c_str(), 1); + if( &className != NULL && className.size() > 0) { + ZVAL_STRING(&z_class_name, (char *)className.c_str(), 1); + } else { + ZVAL_NULL(&z_class_name); + } + ZVAL_STRING(&z_operation_name, (char *)operationName.c_str(), 1); + + array_init(&z_arg_array); + + // get the parameters from the operation structure + for(unsigned int i = 0; i < operation.getNParms(); i++) + { + const Operation::Parameter& parm = operation.getParameter(i); + //printf("Arg %d type %d\n", i, parm.getType()); + switch(parm.getType()) + { + case Operation::BOOL: + { + add_next_index_bool(&z_arg_array, (int)*(bool*)parm.getValue() ); + break; + } + case Operation::SHORT: + case Operation::USHORT: + case Operation::LONG: + case Operation::ULONG: + { + add_next_index_long(&z_arg_array, *(long*)parm.getValue() ); + break; + } + case Operation::FLOAT: + { + add_next_index_double(&z_arg_array,( double)*(float*)parm.getValue() ); + break; + } + case Operation::DOUBLE: + case Operation::LONGDOUBLE: + { + add_next_index_double(&z_arg_array, *(double*)parm.getValue() ); + break; + } + case Operation::CHARS: + { + add_next_index_string(&z_arg_array, *(char**)parm.getValue(), 1 ); + break; + } + case Operation::STRING: + { + add_next_index_string(&z_arg_array, (char*)(*(string*)parm.getValue()).c_str(), 1 ); + break; + } + case Operation::DATAOBJECT: + { + // convert the tuscany SDO into a PHP SDO + + // create the object + zval *sdo; + ALLOC_INIT_ZVAL(sdo); + sdo_do_new(sdo, *(DataObjectPtr*)parm.getValue() TSRMLS_CC); + + // add it to the arg array + add_next_index_zval(&z_arg_array, sdo); + break; + } + default: + { + char *class_name; + char *space; + class_name = get_active_class_name(&space TSRMLS_CC); + php_error(E_ERROR, + "%s%s%s(): Argument type %d not supported", + class_name, + space, + get_active_function_name(TSRMLS_C), + parm.getType()); + } + } + } + + params[0] = &z_tuscany_mediator; + params[1] = &z_component_name; + params[2] = &z_class_name; + params[3] = &z_operation_name; + params[4] = &z_arg_array; + + call_user_function(EG(function_table), + &pz_tuscany_wrapper, + &z_func_name, + &retval, + 5, + params TSRMLS_CC); + + zval_dtor(&z_func_name); + zval_dtor(&z_component_name); + zval_dtor(&z_class_name); + zval_dtor(&z_operation_name); + zval_dtor(&z_arg_array); + + string script; + script = "include '" + compositeDir + "/" + impl->getModule() + ".php';"; + loginfo("Script: %s", script.c_str()); + + // call the dynamically created script + // I'm not trapping the return value here + // as it seems to prevent any kind of output + // being produced. Needs investigation. + //zval retval; + zend_eval_string((char *) script.c_str(), + NULL, //&retval, + "Include module" TSRMLS_CC); + + loginfo(">>>> About to call SCA_TuscanyWrapper->invoke()"); + + /* Now call SCA_TuscanyWrapper->invoke() ... */ + ZVAL_STRING(&z_func_name, "invoke", 1); + call_user_function(EG(function_table), + &pz_tuscany_wrapper, &z_func_name, + &retval, 0, NULL TSRMLS_CC); + + loginfo("<<<< Return from SCA_TuscanyWrapper->invoke()"); + + zval_dtor(&z_func_name); + + /* ... and copy the return value into the operation */ + switch(Z_TYPE(retval)) + { + case IS_NULL: + { + //printf("NULL response"); + break; + } + case IS_BOOL: + { + bool *newBool = new bool; + *newBool = ZEND_TRUTH(Z_BVAL(retval)); + operation.setReturnValue(newBool); + break; + } + case IS_LONG: + { + long *newLong = new long; + *newLong = Z_LVAL(retval); + operation.setReturnValue(newLong); + break; + } + case IS_DOUBLE: + { + //double *newDouble = new double; + float *newDouble = new float; + *newDouble = (float)Z_DVAL(retval); + operation.setReturnValue(newDouble); + break; + } + case IS_STRING: + { + string newString (Z_STRVAL(retval)); + operation.setReturnValue(&newString); + break; + } + case IS_OBJECT: + { + // convert the PHP SDO into a Tuscany SDO + DataObjectPtr sdo = sdo_do_get(&retval TSRMLS_CC); + operation.setReturnValue(&sdo); + break; + } + default: + { + char *class_name; + char *space; + class_name = get_active_class_name(&space TSRMLS_CC); + php_error(E_ERROR, + "%s%s%s(): Input argument type %d not supported on invoke", + class_name, + space, + get_active_function_name(TSRMLS_C), + Z_TYPE(retval)); + } + } + } zend_catch { + /* int exit_status = EG(exit_status); */ + } + zend_end_try(); + + if ( embedSAPIInitializeCount == 1 ) + { + php_embed_shutdown(TSRMLS_C); + loginfo("Engine shutdown"); + } + else + { + embedSAPIInitializeCount--; + } + } + // ===================================================================== + } + catch (...) + { + runtime->unsetCurrentComponent(); + throw; + } + runtime->unsetCurrentComponent(); + + } + + // ====================================================================== + // getServiceWrapper: create a wrapper for the target ComponentService + // ====================================================================== + PHPServiceWrapper* PHPServiceWrapper::getServiceWrapper(Service* service) + { + logentry(); + PHPServiceWrapper* serviceWrapper = 0; + + // --------------------------------- + // Create an instance of the wrapper + // --------------------------------- + serviceWrapper = new PHPServiceWrapper(service); + if (!serviceWrapper) + { + string msg = "Could not create new PHPServiceWrapper"; + throwException(SystemConfigurationException, msg.c_str()); + } + + return serviceWrapper; + } + + /* Not used at the moment + * Can find the include file and execute it, + * but doesn't make the contents available + */ + void PHPServiceWrapper::includeFile(char *includeFileName TSRMLS_DC) + { + zend_file_handle include_file_handle; + + include_file_handle.type = ZEND_HANDLE_FP; + include_file_handle.filename = includeFileName; + include_file_handle.opened_path = NULL; + include_file_handle.free_filename = 0; + if (!(include_file_handle.handle.fp = php_fopen_with_path( + include_file_handle.filename, "rb", PG(include_path), + &include_file_handle.opened_path TSRMLS_CC))) { + php_error(E_ERROR, + "Could not open %s", include_file_handle.filename); + return; + } + php_execute_script(&include_file_handle TSRMLS_CC); + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceWrapper.h new file mode 100644 index 0000000000..be20f34217 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/PHPServiceWrapper.h @@ -0,0 +1,112 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_php_phpservicewrapper_h +#define tuscany_sca_php_phpservicewrapper_h + +#include "tuscany/sca/php/export.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Interface.h" + +#include <TSRM/TSRM.h> + +namespace tuscany +{ + namespace sca + { + namespace php + { + class PHPInterface; + + /** + * Wraps the service on a component implementation. + * This abstract class is extended by generated code which provides + * the implementation of some of the methods. + * An instance of this class wraps the actual component implementation which + * has been written by a developer of an SCA application. + */ + class SCA_PHP_API PHPServiceWrapper : public ServiceWrapper + { + public: + /** + * Factory method to create a new PHPServiceWrapper for a given target + * service. This method will provide all the loading of dlls required to + * create the target component. + * @param target The service on the component for which this wrapper is to be + * created. + * @return A wrapper that references the given target. + */ + static PHPServiceWrapper* getServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Constructor. + * @param target The component service to which this wrapper refers. + */ + PHPServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~PHPServiceWrapper(); + + /** + * All business method calls to the target component go through the invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target component. + */ + virtual void invoke(Operation& operation); + + + protected: + + + private: + + /** + * Utility method to execute a script on the include_path. + */ + static void includeFile(char *includeFileName TSRMLS_DC); + + /** + * The component to which this wrapper refers. + */ + tuscany::sca::model::Component* component; + + /** + * Set to true if the service is remotable. + */ + bool remotable; + + /** + * A pointer to the interface which the service exposes. + */ + tuscany::sca::model::Interface* interf; + + }; + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_phpservicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/export.h new file mode 100644 index 0000000000..11a9519361 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/export.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_export_h +#define tuscany_sca_php_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_PHP_EXPORTS +#define SCA_PHP_API __declspec(dllexport) +#else +#define SCA_PHP_API __declspec(dllimport) +#endif + +#else +#include <sys/time.h> +#include <inttypes.h> +#include <stdlib.h> +#define SCA_PHP_API +#endif + +#endif // tuscany_sca_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPImplementation.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPImplementation.cpp new file mode 100644 index 0000000000..63f1672ec5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPImplementation.cpp @@ -0,0 +1,85 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/php/model/PHPImplementation.h" +#include "tuscany/sca/php/model/PHPServiceBinding.h" +#include "tuscany/sca/php/model/PHPReferenceBinding.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + + namespace php + { + + // Constructor + PHPImplementation::PHPImplementation(Composite* composite, const string& module, const string& className) + : ComponentType(composite, module), + module(module), className(className) + { + logentry(); + } + + PHPImplementation::~PHPImplementation() + { + logentry(); + } + + void PHPImplementation::initializeComponent(Component* component) + { + logentry(); + ComponentType::initializeComponent(component); + + // Create PHP bindings for all the services + const Component::SERVICE_MAP& services = component->getServices(); + Component::SERVICE_MAP::const_iterator iter = services.begin(); + for (unsigned int i=0; i< services.size(); i++) + { + Service *service = iter->second; + PHPServiceBinding* binding = new PHPServiceBinding(service); + service->setBinding(binding); + iter++; + } + + // Create PHP bindings for all the references + const Component::REFERENCE_MAP& references = component->getReferences(); + Component::REFERENCE_MAP::const_iterator refiter = references.begin(); + for (int ri=0; ri< references.size(); ri++) + { + Reference *reference = refiter->second; + PHPReferenceBinding* binding = new PHPReferenceBinding(reference); + reference->setBinding(binding); + refiter++; + } + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPImplementation.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPImplementation.h new file mode 100644 index 0000000000..78e678dff5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPImplementation.h @@ -0,0 +1,95 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_model_phpimplementation_h +#define tuscany_sca_php_model_phpimplementation_h + +#include <string> + +#include "tuscany/sca/model/ComponentType.h" + + +namespace tuscany +{ + namespace sca + { + namespace php + { + /** + * Holds information about an SCA implementation written in PHP + */ + class PHPImplementation : public tuscany::sca::model::ComponentType + { + + public: + /** + * Constructor. + * @param composite Composite containing this implementation. + * @param module Name of the module. + * @param modulePath Path to the module (could be a blank string + * if this is not specified). + * @param className Name of the class in the module (could be a blank string + * if this is not specified). + */ + PHPImplementation(tuscany::sca::model::Composite* composite, const std::string& module, const std::string& className); + + /** + * Destructor + */ + virtual ~PHPImplementation(); + + /** + * Initialize a component of this type. + * @param component The component to initialize. + */ + virtual void initializeComponent(tuscany::sca::model::Component* component); + + /** + * Returns the name of the module. + * @return The name of the module. + */ + const std::string& getModule() const { return module; } + + /** + * Get the name of the class. + * @return The class name if specified. + */ + const std::string& getClass() const { return className; } + + private: + + /** + * Name of the module. + */ + std::string module; + + /** + * Name of the class in the header file declaring the implementation. + * May be an empty string if not set in the SCDL file. + */ + std::string className; + }; + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_model_phpimplementation_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPInterface.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPInterface.cpp new file mode 100644 index 0000000000..cbea3f2b71 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPInterface.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/php/export.h" +#include "tuscany/sca/php/model/PHPInterface.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace php + { + const string PHPInterface::typeQName("http://www.osoa.org/xmlns/sca/1.0#PHPInterface"); + + // Constructor + PHPInterface::PHPInterface( + bool remotable, + bool conversational) + : Interface(remotable, conversational) + { + logentry(); + } + + PHPInterface::~PHPInterface() + { + logentry(); + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPInterface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPInterface.h new file mode 100644 index 0000000000..9a4f658eb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPInterface.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_php_model_phpinterface_h +#define tuscany_sca_php_model_phpinterface_h + +#include <string> + +#include "tuscany/sca/php/export.h" +#include "tuscany/sca/model/Interface.h" + +namespace tuscany +{ + namespace sca + { + namespace php + { + /** + * Holds information about an interface described using a PHP + * header file. + */ + class PHPInterface : public tuscany::sca::model::Interface + { + + public: + /** + * Constuctor. + * @param scope The scope of the interface (stateless or composite). + * @param remotable True if the interface is remotable. + */ + PHPInterface( + bool remotable, + bool conversational); + + /** + * Destructor. + */ + virtual ~PHPInterface(); + + /** + * return the QName of the schema type for this interface type + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.cpp") + */ + const std::string& getInterfaceTypeQName() { return typeQName; }; + + /** + * The QName of the schema type for this interface type. + */ + SCA_PHP_API static const std::string typeQName; + + }; + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_model_phpinterface_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPReferenceBinding.cpp new file mode 100644 index 0000000000..919d4c8646 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPReferenceBinding.cpp @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/php/model/PHPReferenceBinding.h" +#include "tuscany/sca/php/PHPServiceProxy.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace php + { + + // Constructor + PHPReferenceBinding::PHPReferenceBinding(Reference* reference) + : ReferenceBinding(reference, ""), serviceProxy(NULL) + { + } + + // Destructor + PHPReferenceBinding::~PHPReferenceBinding() + { + } + + ServiceProxy* PHPReferenceBinding::getServiceProxy() + { + return serviceProxy; + } + + void PHPReferenceBinding::configure(ServiceBinding* binding) + { + setTargetServiceBinding(binding); + + serviceProxy = new PHPServiceProxy(getReference()); + } + + } // End namespace + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPReferenceBinding.h new file mode 100644 index 0000000000..45b422da2c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPReferenceBinding.h @@ -0,0 +1,82 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_model_phpreferencebinding_h +#define tuscany_sca_php_model_phpreferencebinding_h + +#include <string> + +#include "tuscany/sca/model/ReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace php + { + /** + * Information about a PHP service binding for service or a reference. + */ + class PHPReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + */ + PHPReferenceBinding(tuscany::sca::model::Reference* reference); + + /** + * Destructor. + */ + virtual ~PHPReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#PHPImplementationBinding"; }; + + /** + * Create a proxy representing the reference to the + * client component. + */ + virtual ServiceProxy* getServiceProxy(); + + /** + * Configure this binding from a service binding. + */ + virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + private: + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + }; + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_model_phpreferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPServiceBinding.cpp new file mode 100644 index 0000000000..4d18424ae2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPServiceBinding.cpp @@ -0,0 +1,58 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/php/model/PHPServiceBinding.h" +#include "tuscany/sca/php/PHPServiceWrapper.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace php + { + + // Constructor + PHPServiceBinding::PHPServiceBinding(Service* service) + : ServiceBinding(service, "") + { + logentry(); + serviceWrapper = PHPServiceWrapper::getServiceWrapper(service); + } + + // Destructor + PHPServiceBinding::~PHPServiceBinding() + { + logentry(); + } + + ServiceWrapper* PHPServiceBinding::getServiceWrapper() + { + logentry(); + return (ServiceWrapper*)serviceWrapper; + } + + } // End namespace php + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPServiceBinding.h new file mode 100644 index 0000000000..ef3d6b1604 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/model/PHPServiceBinding.h @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_php_model_phpservicebinding_h +#define tuscany_sca_php_model_phpservicebinding_h + +#include <string> + +#include "tuscany/sca/model/ServiceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace php + { + /** + * Information about a PHP service binding for service or a reference. + */ + class PHPServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + * @param port The definition of the port to which the entrypoint + * or external service is to be bound. This is of the form + * "namespace"#endpoint("service"/"port") + */ + PHPServiceBinding(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~PHPServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#PHPImplementationBinding"; }; + + /** + * Create a wrapper for the service configured by this + * binding. + */ + virtual ServiceWrapper* getServiceWrapper(); + + private: + + /** + * The wrapper for the service configured by this binding. + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace php + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_php_model_phpservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/php_sca.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/php_sca.h new file mode 100644 index 0000000000..8aea8dadb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/php_sca.h @@ -0,0 +1,132 @@ +/* + * 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. + */ + +/* $ Id: $ */ + +#ifndef PHP_SCA_H +#define PHP_SCA_H + +#include "tuscany/sca/core/Operation.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <main/php.h> + +#ifdef HAVE_SCA + +#include <main/php_ini.h> +#include <main/SAPI.h> +#include <ext/standard/info.h> +#include <Zend/zend_extensions.h> +#ifdef __cplusplus +} // extern "C" +#endif +#ifdef __cplusplus +extern "C" { +#endif + + +//extern zend_module_entry sca_module_entry; +#define phpext_sca_ptr &sca_module_entry + +#ifdef PHP_WIN32 +#define PHP_SCA_API __declspec(dllexport) +#else +#define PHP_SCA_API +#endif + +PHP_MINIT_FUNCTION(sca); +PHP_MSHUTDOWN_FUNCTION(sca); +PHP_MINFO_FUNCTION(sca); + +#ifdef ZTS +#include "TSRM/TSRM.h" +#endif + +#define FREE_RESOURCE(resource) zend_list_delete(Z_LVAL_P(resource)) + +#define PROP_GET_LONG(name) Z_LVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_LONG(name, l) zend_update_property_long(_this_ce, _this_zval, #name, strlen(#name), l TSRMLS_CC) + +#define PROP_GET_DOUBLE(name) Z_DVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_DOUBLE(name, d) zend_update_property_double(_this_ce, _this_zval, #name, strlen(#name), d TSRMLS_CC) + +#define PROP_GET_STRING(name) Z_STRVAL_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_GET_STRLEN(name) Z_STRLEN_P(zend_read_property(_this_ce, _this_zval, #name, strlen(#name), 1 TSRMLS_CC)) +#define PROP_SET_STRING(name, s) zend_update_property_string(_this_ce, _this_zval, #name, strlen(#name), s TSRMLS_CC) +#define PROP_SET_STRINGL(name, s, l) zend_update_property_string(_this_ce, _this_zval, #name, strlen(#name), s, l TSRMLS_CC) + + +PHP_METHOD(SCA_Tuscany, __construct); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SCA_Tuscany____construct_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SCA_Tuscany____construct_args NULL +#endif + +PHP_METHOD(SCA_Tuscany, invoke); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SCA_Tuscany__invoke_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 4) + ZEND_ARG_INFO(0, component_name) + ZEND_ARG_INFO(0, reference_name) + ZEND_ARG_INFO(0, method_name) +#if (PHP_MINOR_VERSION > 0) + ZEND_ARG_ARRAY_INFO(0, arguments, 1) +#else + ZEND_ARG_INFO(0, arguments) +#endif +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SCA_Tuscany__invoke_args NULL +#endif + +PHP_METHOD(SCA_Tuscany, getArgArray); +#if (PHP_MAJOR_VERSION >= 5) +ZEND_BEGIN_ARG_INFO_EX(SCA_Tuscany__getArgArray_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) +ZEND_END_ARG_INFO() +#else /* PHP 4.x */ +#define SCA_Tuscany__getArgArray_args NULL +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + + + +#endif /* PHP_HAVE_SCA */ + +#endif /* PHP_SCA_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/sca.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/sca.cpp new file mode 100644 index 0000000000..4078226f63 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/sca.cpp @@ -0,0 +1,517 @@ +/* + * 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. + */ + +/* $ Id: $ */ + +#ifdef WIN32 + +// some strangeness in the build that causes +// WinSock.h and WinSock2.h to be included leading to redefinitions +#define _WINSOCKAPI_ + +#endif //WIN32 + +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/php/PHPServiceProxy.h" +#include "commonj/sdo/RefCountingPointer.h" + +using namespace std; +using namespace tuscany::sca; +using namespace tuscany::sca::model; +using namespace tuscany::sca::php; +using namespace commonj::sdo; + +#define HAVE_SCA 1 + + +#include "php_sca.h" +#include "sca.h" + +#if HAVE_SCA + +#include "php_sdo.h" +#include "php_sdo_int.h" +/* {{{ Class definitions */ + +/* {{{ Class SCA_Tuscany */ + +static zend_class_entry * SCA_Tuscany_ce_ptr = NULL; + +/* {{{ Methods */ + +/* {{{ proto void __construct(int operation_handle) + */ +PHP_METHOD(SCA_Tuscany, __construct) +{ + zval *_this_zval = getThis(); + zend_class_entry *_this_ce = Z_OBJCE_P(_this_zval); + + long operation_handle = 0; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &operation_handle) == FAILURE) { + return; + } + + if (!operation_handle) { + php_error(E_ERROR, "SCA_Tuscany ctor called with NULL operation"); + } + + PROP_SET_LONG(operation, operation_handle); +} +/* }}} __construct */ + +/* {{{ proto int invoke(string component_name, string reference_name, string method_name, array arguments) + Invoke a Tuscany component */ +PHP_METHOD(SCA_Tuscany, invoke) +{ + //zval * _this_zval = NULL; + const char * component_name = NULL; + int component_name_len = 0; + const char * reference_name = NULL; + int reference_name_len = 0; + const char * method_name = NULL; + int method_name_len = 0; + zval * arguments = NULL; + HashTable * arguments_hash = NULL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sssa/", + &component_name, &component_name_len, + &reference_name, &reference_name_len, + &method_name, &method_name_len, + &arguments) == FAILURE) { + return; + } + + arguments_hash = HASH_OF(arguments); + + // find the correct service proxy + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + Component* component = runtime->getCurrentComponent(); + Reference* ref = component->findReference(reference_name); + if(!ref) { + char *class_name; + char *space; + class_name = get_active_class_name(&space TSRMLS_CC); + php_error(E_ERROR, + "%s%s%s(): Can't find reference %s", + class_name, + space, + get_active_function_name(TSRMLS_C), + reference_name); + return; + } + + ReferenceBinding* refBinding = ref->getBinding(); + PHPServiceProxy *serviceProxy = (PHPServiceProxy*) refBinding->getServiceProxy(); + + // construct an operation structure + Operation operation(method_name); + + // add the parameters to the operation + for ( zend_hash_internal_pointer_reset(arguments_hash); + zend_hash_has_more_elements(arguments_hash) == SUCCESS; + zend_hash_move_forward(arguments_hash) ) + { + zval **data; + + if ( zend_hash_get_current_data(arguments_hash, + (void**)&data ) == FAILURE ) + { + continue; + } + + char *hashKey; + uint hashKeyLength; + ulong hashIndex; + int type; + + type = zend_hash_get_current_key_ex(arguments_hash, + &hashKey, + &hashKeyLength, + &hashIndex, + 0, + NULL); + + switch(Z_TYPE_PP(data)) + { + case IS_NULL: + { + //printf("NULL argument"); + break; + } + case IS_BOOL: + { + convert_to_boolean(*data); + bool *newBool = new bool; + *newBool = ZEND_TRUTH(Z_BVAL_PP(data)); + operation.addParameter(newBool); + break; + } + case IS_LONG: + { + convert_to_long(*data); + long *newLong = new long; + *newLong = Z_LVAL_PP(data); + operation.addParameter(newLong); + break; + } + case IS_DOUBLE: + { + //convert_to_double(*data); + //double *newDouble = new double; + convert_to_double(*data); + float *newDouble = new float; + *newDouble = (float)Z_DVAL_PP(data); + operation.addParameter(newDouble); + break; + } + case IS_STRING: + { + convert_to_string(*data); + string newString (Z_STRVAL_PP(data)); + operation.addParameter(&newString); + break; + } + case IS_OBJECT: + { + // convert the PHP SDO into a Tuscany SDO + DataObjectPtr sdo = sdo_do_get(*data TSRMLS_CC); + operation.addParameter(&sdo); + break; + } + default: + { + char *class_name; + char *space; + class_name = get_active_class_name(&space TSRMLS_CC); + php_error(E_ERROR, + "%s%s%s(): Input argument type %d not supported on invoke", + class_name, + space, + get_active_function_name(TSRMLS_C), + Z_TYPE_PP(data)); + } + } + } + + // call the proxy + serviceProxy->invokeService(operation); + + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + ZVAL_BOOL(return_value, *(bool*)operation.getReturnValue()); + break; + } + case Operation::SHORT: + case Operation::USHORT: + case Operation::LONG: + case Operation::ULONG: + { + ZVAL_LONG(return_value, *(long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + case Operation::DOUBLE: + case Operation::LONGDOUBLE: + { + ZVAL_DOUBLE(return_value, (double)*(float*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + ZVAL_STRING(return_value, (char*)operation.getReturnValue(), 1); + break; + } + case Operation::STRING: + { + ZVAL_STRING(return_value, (char*)((string*)operation.getReturnValue())->c_str(), 1); + break; + } + case Operation::VOID_TYPE: + { + // do nothing + break; + } + case Operation::DATAOBJECT: + { + // convert the tuscany SDO into a PHP SDO + sdo_do_new(return_value, *(DataObjectPtr*)operation.getReturnValue() TSRMLS_CC); + break; + } + default: + { + char *class_name; + char *space; + class_name = get_active_class_name(&space TSRMLS_CC); + php_error(E_ERROR, + "%s%s%s(): Response type %d not supported on invoke", + class_name, + space, + get_active_function_name(TSRMLS_C), + operation.getReturnType()); + } + } + +} +/* }}} invoke */ + +/* {{{ proto array getArgArray() + return the arguments for the operation as an array */ +PHP_METHOD(SCA_Tuscany, getArgArray) +{ + zval * _this_zval = getThis(); + zend_class_entry *_this_ce = Z_OBJCE_P(_this_zval); + + if (ZEND_NUM_ARGS() > 0) { + WRONG_PARAM_COUNT; + } + + array_init(return_value); + + // get the operation object from the object properties + Operation *operation = (Operation *)PROP_GET_LONG(operation); + + // get the parameters from the operation structure + for(unsigned int i = 0; i < operation->getNParms(); i++) + { + const Operation::Parameter& parm = operation->getParameter(i); + //printf("Arg %d type %d\n", i, parm.getType()); + switch(parm.getType()) + { + case Operation::BOOL: + { + add_next_index_bool(return_value,(int)*(bool*)parm.getValue() ); + break; + } + case Operation::SHORT: + case Operation::USHORT: + case Operation::LONG: + case Operation::ULONG: + { + add_next_index_long(return_value,*(long*)parm.getValue() ); + break; + } + case Operation::FLOAT: + { + add_next_index_double(return_value,(double)*(float*)parm.getValue() ); + break; + } + case Operation::DOUBLE: + case Operation::LONGDOUBLE: + { + add_next_index_double(return_value,*(double*)parm.getValue() ); + break; + } + case Operation::CHARS: + { + add_next_index_string(return_value,*(char**)parm.getValue(), 1 ); + break; + } + case Operation::STRING: + { + add_next_index_string(return_value,(char*)(*(string*)parm.getValue()).c_str(), 1 ); + break; + } + case Operation::DATAOBJECT: + { + // convert the tuscany SDO into a PHP SDO + + // create the object + zval *sdo; + ALLOC_INIT_ZVAL(sdo); + sdo_do_new(sdo, *(DataObjectPtr*)parm.getValue() TSRMLS_CC); + + // add it to the arg array + add_next_index_zval(return_value, sdo); + break; + } + default: + { + char *class_name; + char *space; + class_name = get_active_class_name(&space TSRMLS_CC); + php_error(E_ERROR, + "%s%s%s(): Argument type %d not supported", + class_name, + space, + get_active_function_name(TSRMLS_C), + parm.getType()); + } + } + } +} +/* }}} getArgArray */ + +static zend_function_entry SCA_Tuscany_methods[] = { + PHP_ME(SCA_Tuscany, __construct, SCA_Tuscany____construct_args, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) + PHP_ME(SCA_Tuscany, invoke, SCA_Tuscany__invoke_args, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) + PHP_ME(SCA_Tuscany, getArgArray, SCA_Tuscany__getArgArray_args, ZEND_ACC_PUBLIC) + { NULL, NULL, NULL } +}; + +/* }}} Methods */ + +static void class_init_SCA_Tuscany(TSRMLS_D) +{ + zend_class_entry ce; + + INIT_CLASS_ENTRY(ce, "SCA_Tuscany", SCA_Tuscany_methods); + SCA_Tuscany_ce_ptr = zend_register_internal_class(&ce TSRMLS_CC); + + /* {{{ Property registration */ + + zend_declare_property_null(SCA_Tuscany_ce_ptr, + "operation", sizeof("operation") -1, + ZEND_ACC_PUBLIC TSRMLS_CC); + + /* }}} Property registration */ + +} + +/* }}} Class SCA_Tuscany */ + +/* }}} Class definitions*/ + +/* {{{ sca_functions[] */ +function_entry sca_functions[] = { + { NULL, NULL, NULL } +}; +/* }}} */ + +/* {{{ cross-extension dependencies */ + +#if ZEND_EXTENSION_API_NO >= 220050617 +static zend_module_dep sca_deps[] = { + ZEND_MOD_REQUIRED("sdo") + {NULL, NULL, NULL, 0} +}; +#endif +/* }}} */ + +/* {{{ sca_module_entry */ +zend_module_entry sca_module_entry = { +#if ZEND_EXTENSION_API_NO >= 220050617 + STANDARD_MODULE_HEADER_EX, NULL, + sca_deps, +#else + STANDARD_MODULE_HEADER, +#endif + + "sca", + sca_functions, + PHP_MINIT(sca), /* Replace with NULL if there is nothing to do at php startup */ + PHP_MSHUTDOWN(sca), /* Replace with NULL if there is nothing to do at php shutdown */ + NULL, /* Replace with NULL if there is nothing to do at request start */ + NULL, /* Replace with NULL if there is nothing to do at request end */ + PHP_MINFO(sca), + "0.0.1", + STANDARD_MODULE_PROPERTIES +}; +/* }}} */ + +#ifdef COMPILE_DL_SCA +extern "C" { +ZEND_GET_MODULE(sca) +} // extern "C" +#endif + + +/* {{{ PHP_MINIT_FUNCTION */ +PHP_MINIT_FUNCTION(sca) +{ + /* We use the SDO extension for reference because it is a prereq */ + zend_module_entry *req_module_entry; + char *req_module_name = "libxml"; + if (zend_hash_find(&module_registry, req_module_name, strlen(req_module_name)+1, (void**)&req_module_entry) == SUCCESS) { + if (req_module_entry->zend_debug != ZEND_DEBUG || + req_module_entry->zts != USING_ZTS || + req_module_entry->zend_api != ZEND_MODULE_API_NO) { + php_error(E_ERROR, + "Cannot initialize module sca.\nModule sca compiled with module API=%d, debug=%d, thread-safety=%d\nModule %n compiled with module API=%d, debug=%d, thread-safety=%d\nThese options need to match", + req_module_name, + ZEND_MODULE_API_NO, ZEND_DEBUG, USING_ZTS, + req_module_entry->zend_api, req_module_entry->zend_debug, req_module_entry->zts); + return FAILURE; + } + } else { + /* The dependency checker should already have found this, but to be on the safe side ... */ + php_error (E_ERROR, + "Cannot load module sca because required module %n is not loaded", + req_module_name); + return FAILURE; + } + + class_init_SCA_Tuscany(TSRMLS_C); + + return SUCCESS; +} +/* }}} */ + + +/* {{{ PHP_MSHUTDOWN_FUNCTION */ +PHP_MSHUTDOWN_FUNCTION(sca) +{ + /* + * There is some corruption going on at shutdown. + * The following hack eliminates the symptom, but there's probably still + * an underlying problem. + */ + free(SCA_Tuscany_ce_ptr->name); + SCA_Tuscany_ce_ptr->name = NULL; + destroy_zend_class(&SCA_Tuscany_ce_ptr); + SCA_Tuscany_ce_ptr = NULL; + + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_MINFO_FUNCTION */ +PHP_MINFO_FUNCTION(sca) +{ + php_info_print_box_start(0); + php_printf("<p>SCA Extension</p>\n"); + php_printf("<p>Version 0.0.1alpha (2007-01-15)</p>\n"); + php_printf("<p><b>Authors:</b></p>\n"); + php_printf("<p>Simon Laws <slaws@php.net> (lead)</p>\n"); + php_printf("<p>Caroline Maynard <cem@php.net> (lead)</p>\n"); + php_info_print_box_end(); + php_info_print_table_start(); + php_info_print_table_header(2, "SCA", "enabled"); + php_info_print_table_row(2, "SCA Version", "0.0.1"); + php_info_print_table_end(); + +} +/* }}} */ + +/* Other functions not directly related to implementing the + SCA_Tuscany extension */ + +#endif /* HAVE_SCA */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/sca.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/sca.h new file mode 100644 index 0000000000..5bbc9001dc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/src/tuscany/sca/php/sca.h @@ -0,0 +1,49 @@ +/* + * 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. + */ + +/* $ Id: $ */ + +#ifndef SCA_H +#define SCA_H + +#include "tuscany/sca/core/Operation.h" + +#include <main/php.h> + +#ifdef __cplusplus +extern "C" { +#endif + +extern zend_module_entry sca_module_entry; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif /* SCA_H */ + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/xsd/sca-implementation-php.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/xsd/sca-implementation-php.xsd new file mode 100644 index 0000000000..c40d63799a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/php/xsd/sca-implementation-php.xsd @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="implementation.php" type="sca:PHPImplementation" substitutionGroup="sca:implementation"/> + <complexType name="PHPImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="module" type="NCName" use="required"/> + <attribute name="class" type="Name" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/Makefile.am new file mode 100644 index 0000000000..83e70b4b94 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +SUBDIRS = src + +datadir=$(prefix)/extensions/python + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/Makefile.am new file mode 100644 index 0000000000..15d75f8c42 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/Makefile.am @@ -0,0 +1,63 @@ +# 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. + +libdir=$(prefix)/extensions/python/lib +lib_LTLIBRARIES = libtuscany_sca_python.la + +pydir=$(prefix)/extensions/python/lib +py_DATA = tuscany/sca/python/sca_proxy.py +EXTRA_DIST = tuscany/sca/python/sca_proxy.py + +rootdir=$(prefix)/extensions/python + +noinst_HEADERS = \ +tuscany/sca/python/*.h \ +tuscany/sca/python/model/*.h + +libtuscany_sca_python_la_SOURCES = \ +tuscany/sca/python/PythonExtension.cpp \ +tuscany/sca/python/PythonImplementationExtension.cpp \ +tuscany/sca/python/PythonInterfaceExtension.cpp \ +tuscany/sca/python/PythonServiceWrapper.cpp \ +tuscany/sca/python/PythonServiceProxy.cpp \ +tuscany/sca/python/sca_module.cpp \ +tuscany/sca/python/model/PythonImplementation.cpp \ +tuscany/sca/python/model/PythonInterface.cpp \ +tuscany/sca/python/model/PythonReferenceBinding.cpp \ +tuscany/sca/python/model/PythonServiceBinding.cpp + +# Need python env varibles set. e.g: +# PYTHON_LIB=/usr/lib +# PYTHON_INCLUDE=/usr/include/python2.4 +# PYTHON_VERSION=python2.4 +libtuscany_sca_python_la_LIBADD = -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L${PYTHON_LIB} -l${PYTHON_VERSION} + +INCLUDES = -Imodel -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include \ + -I${PYTHON_INCLUDE} + +moduledir=$(prefix)/extensions/python/module +extension = libtuscany_sca_python$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) + -rm -f $(libdir)/sca.so + $(LN_S) $(libdir)/libtuscany_sca_python$(libsuffix) $(libdir)/sca.so diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonExtension.cpp new file mode 100644 index 0000000000..0274ffc774 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonExtension.cpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "tuscany/sca/python/PythonExtension.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/python/PythonImplementationExtension.h" +#include "tuscany/sca/python/PythonInterfaceExtension.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_python_initialize() + { + tuscany::sca::python::PythonExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace python + { + // =================================================================== + // Constructor for the PythonExtension class. + // =================================================================== + PythonExtension::PythonExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the PythonExtension class. + // =================================================================== + PythonExtension::~PythonExtension() + { + logentry(); + } + + void PythonExtension::initialize() + { + logentry(); + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + runtime->registerImplementationExtension(new PythonImplementationExtension()); + runtime->registerInterfaceExtension(new PythonInterfaceExtension()); + } + + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonExtension.h new file mode 100644 index 0000000000..783f37a228 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonExtension.h @@ -0,0 +1,57 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_python_pythonextension_h +#define tuscany_sca_python_pythonextension_h + +namespace tuscany +{ + namespace sca + { + namespace python + { + + class PythonExtension + { + public: + /** + * Default constructor + */ + PythonExtension(); + + /** + * Destructor + */ + virtual ~PythonExtension(); + + static void initialize(); + + private: + + }; + + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_pythonextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonImplementationExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonImplementationExtension.cpp new file mode 100644 index 0000000000..84cc34c6a4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonImplementationExtension.cpp @@ -0,0 +1,86 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "tuscany/sca/python/PythonImplementationExtension.h" +#include "tuscany/sca/python/model/PythonImplementation.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace python + { + // =================================================================== + // Constructor for the PythonImplementationExtension class. + // =================================================================== + PythonImplementationExtension::PythonImplementationExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the PythonImplementationExtension class. + // =================================================================== + PythonImplementationExtension::~PythonImplementationExtension() + { + logentry(); + } + + const string PythonImplementationExtension::extensionName("python"); + const string PythonImplementationExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#PythonImplementation"); + + // =================================================================== + // loadModelElement - load the info from implementation.python + // =================================================================== + ComponentType* PythonImplementationExtension::getImplementation(Composite *composite, DataObjectPtr scdlImplementation) + { + logentry(); + + string module = scdlImplementation->getCString("module"); + string path = scdlImplementation->getCString("path"); + string className = scdlImplementation->getCString("class"); + string scopeName = scdlImplementation->getCString("scope"); + + PythonImplementation::Scope scope; + if (scopeName == "composite") + { + scope = PythonImplementation::COMPOSITE; + } + else + { + scope = PythonImplementation::STATELESS; + } + + PythonImplementation* pythonImpl = new PythonImplementation(composite, module, path, className, scope); + + return pythonImpl; + } + + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonImplementationExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonImplementationExtension.h new file mode 100644 index 0000000000..c94925c3fc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonImplementationExtension.h @@ -0,0 +1,75 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_python_pythonimplementationextension_h +#define tuscany_sca_python_pythonimplementationextension_h + +#include "tuscany/sca/extension/ImplementationExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace python + { + + class PythonImplementationExtension : public ImplementationExtension + { + public: + /** + * Default constructor + */ + PythonImplementationExtension(); + + /** + * Destructor + */ + virtual ~PythonImplementationExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#implementation.python") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ComponentType* getImplementation( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlImplementation); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_pythonimplementationextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonInterfaceExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonInterfaceExtension.cpp new file mode 100644 index 0000000000..1d5e3b6361 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonInterfaceExtension.cpp @@ -0,0 +1,123 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/python/PythonInterfaceExtension.h" +#include "tuscany/sca/python/model/PythonInterface.h" +#include "tuscany/sca/util/Logging.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace python + { + // =================================================================== + // Constructor for the PythonInterfaceExtension class. + // =================================================================== + PythonInterfaceExtension::PythonInterfaceExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the PythonInterfaceExtension class. + // =================================================================== + PythonInterfaceExtension::~PythonInterfaceExtension() + { + logentry(); + } + + const string PythonInterfaceExtension::extensionName("python"); + const string PythonInterfaceExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#PythonInterface"); + + // =================================================================== + // loadModelElement - load the info from interface.python + // =================================================================== + tuscany::sca::model::Interface* PythonInterfaceExtension::getInterface(Composite* composite, DataObjectPtr scdlInterface) + { + logentry(); + + // Determine the type + string ifType = scdlInterface->getType().getName(); + if (ifType == "PythonInterface") + { + bool remotable = scdlInterface->getBoolean("remotable"); + bool conversational = scdlInterface->getBoolean("conversational"); + + return new PythonInterface(remotable, conversational); + //DataObjectList& operationList = scdlInterface->getList("operation"); + + //for(int i=0; i<operationList.size(); i++) + //{ + // string opName = operationList[i]->getCString("name"); + + // if(operationList[i]->hasProperty("returnType")) + // { + // string returnType = operationList[i]->getCString("returnType"); + + // if(returnType == "string") + // { + // pythonInterface->addOperation(opName, PythonInterface::STRING); + // } + // else if(returnType == "int") + // { + // pythonInterface->addOperation(opName, PythonInterface::INT); + // } + // else if(returnType == "long") + // { + // pythonInterface->addOperation(opName, PythonInterface::LONG); + // } + // else if(returnType == "boolean") + // { + // pythonInterface->addOperation(opName, PythonInterface::BOOLEAN); + // } + // else if(returnType == "float") + // { + // pythonInterface->addOperation(opName, PythonInterface::FLOAT); + // } + // else if(returnType == "other") + // { + // pythonInterface->addOperation(opName, PythonInterface::OTHER); + // } + // else + // { + // pythonInterface->addOperation(opName, PythonInterface::NONE); + // } + // } + // else + // { + // // No return Type provided - set as NONE + // pythonInterface->addOperation(opName, PythonInterface::NONE); + // } + //} + // + //return pythonInterface; + } + return 0; + } + + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonInterfaceExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonInterfaceExtension.h new file mode 100644 index 0000000000..803d94743d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonInterfaceExtension.h @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_python_pythoninterfaceextension_h +#define tuscany_sca_python_pythoninterfaceextension_h + +#include "tuscany/sca/extension/InterfaceExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace python + { + + class PythonInterfaceExtension : public InterfaceExtension + { + public: + /** + * Default constructor + */ + PythonInterfaceExtension(); + + /** + * Destructor + */ + virtual ~PythonInterfaceExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#PythonInterface") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::Interface* getInterface( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlInterface); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_pythoninterfaceextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceProxy.cpp new file mode 100644 index 0000000000..9282bb953c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceProxy.cpp @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/python/PythonServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/python/model/PythonReferenceBinding.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace python + { + + // ============================================ + // Constructor: Create a proxy from a reference + // ============================================ + PythonServiceProxy::PythonServiceProxy(Reference* reference) + : ServiceProxy(reference) + { + logentry(); + + // Get the service wrapper + PythonReferenceBinding* referenceBinding = (PythonReferenceBinding*)reference->getBinding(); + serviceWrapper = referenceBinding->getTargetServiceBinding()->getServiceWrapper(); + } + + // ========================================== + // Constructor: Create a proxy from a service + // ========================================== + PythonServiceProxy::PythonServiceProxy(Service* service) + : ServiceProxy(NULL) + { + logentry(); + + // Get the service wrapper + serviceWrapper = service->getBinding()->getServiceWrapper(); + } + + // ========== + // Destructor + // ========== + PythonServiceProxy::~PythonServiceProxy() + { + logentry(); + } + + // ===================================================== + // invokeService: invoke the service wired to this proxy + // ===================================================== + void PythonServiceProxy::invokeService(Operation& operation) + { + logentry(); + + // Invoke the service + serviceWrapper->invoke(operation); + } + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceProxy.h new file mode 100644 index 0000000000..64f856f51d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceProxy.h @@ -0,0 +1,83 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_python_pythonserviceproxy_h +#define tuscany_sca_python_pythonserviceproxy_h + +#include "export.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + namespace python + { + + /** + * Holds a proxy for a given reference from a component implemented in Python. + */ + class PythonServiceProxy : public ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + */ + PythonServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Create a new service proxy for a service. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param service The service on the target component. + */ + SCA_PYTHON_API PythonServiceProxy(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~PythonServiceProxy(); + + /** + * Invoke the wired service. + */ + virtual void invokeService(Operation& operation); + + private: + + /** + * The target service wrapper + */ + ServiceWrapper* serviceWrapper; + }; + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_pythonserviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceWrapper.cpp new file mode 100644 index 0000000000..cb876827bd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceWrapper.cpp @@ -0,0 +1,1095 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/python/PythonServiceWrapper.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/python/model/PythonImplementation.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace python + { + + /** + * Prints out PyObject and dir(PyObject) + * for debugging purposes + */ + void printPyObject(char * name, PyObject *pObj) + { + PyObject* pObjRepr = PyObject_Repr(pObj); + loginfo("PyObject %s: %s", name, PyString_AsString(pObjRepr)); + Py_DECREF(pObjRepr); + + PyObject* pObjDir = PyObject_Dir(pObj); + PyObject* pObjDirRepr = PyObject_Repr(pObjDir); + loginfo("PyObject dir(%s): %s", name, PyString_AsString(pObjDirRepr)); + Py_DECREF(pObjDirRepr); + Py_DECREF(pObjDir); + } + + // =========== + // Constructor + // =========== + PythonServiceWrapper::PythonServiceWrapper(Service* service) + : ServiceWrapper(service) + { + logentry(); + + component = service->getComponent(); + implementation = (PythonImplementation*)component->getType(); + + pythonModule = NULL; + pythonClassInstance = NULL; + + // ----------------------------------------------- + // Get the implementation for the target component + // ----------------------------------------------- + PythonImplementation* impl = (PythonImplementation*)component->getType(); + if (!impl) + { + string msg = "Component " + component->getName() + " has no implementation defined"; + throwException(SystemConfigurationException, msg.c_str()); + } + + // Initialize the Python environment + Py_Initialize(); + + // Add the path to the composite (+ any further path specified) to the Python sys.path + string path = component->getComposite()->getRoot(); + if(impl->getModulePath().size() > 0) + { + path += "/" + impl->getModulePath(); + } + + loginfo("Module: %s", impl->getModule().c_str()); + loginfo("Path: %s", path.c_str()); + loginfo("Class: %s", impl->getClass().c_str()); + + PyObject* pSysName = PyString_FromString("sys"); + PyObject* pSys = PyImport_Import(pSysName); + Py_DECREF(pSysName); + + if(pSys != NULL) + { + PyObject* pSysPath = PyObject_GetAttrString(pSys, "path"); + + if(pSysPath != NULL && PyList_Check(pSysPath)) + { + PyObject* pPath = PyString_FromString(path.c_str()); + PyList_Append(pSysPath, pPath); + + Py_DECREF(pPath); + Py_DECREF(pSysPath); + } + Py_DECREF(pSys); + } + + if(&(impl->getModule()) != NULL && impl->getModule().size() > 0) + { + // Now import the module + PyObject* pModuleName = PyString_FromString(impl->getModule().c_str()); + + pythonModule = PyImport_Import(pModuleName); + Py_DECREF(pModuleName); + } + + if (!pythonModule) + { + if(PyErr_Occurred()) + { + PyErr_Print(); + } + string msg = "Failed to load module named " + impl->getModule() + " on path " + path; + throwException(SystemConfigurationException, msg.c_str()); + } + printPyObject("pythonModule",pythonModule); + } + + // ========== + // Destructor + // ========== + PythonServiceWrapper::~PythonServiceWrapper() + { + logentry(); + + Py_XDECREF(pythonClassInstance); + Py_XDECREF(pythonModule); + Py_Finalize(); + } + + // ====================================================================== + // newInstance: create a new class instance + // ====================================================================== + PyObject* PythonServiceWrapper::newInstance() + { + logentry(); + + PythonImplementation* impl = (PythonImplementation*)component->getType(); + string className = impl->getClass(); + + PyObject* pClassInstance = NULL; + if (pythonModule != NULL) + { + if(&className != NULL && className.size() > 0) + { + // We have a class name, so create an instance and use this to invoke the correct function + PyObject* pClass = PyObject_GetAttrString(pythonModule, (char*) className.c_str()); + + if(pClass == NULL) + { + if(PyErr_Occurred()) + { + PyErr_Print(); + } + string msg = "Cannot find class named " + className + " in Python module"; + throwException(SystemConfigurationException, msg.c_str()); + } + + pClassInstance = PyInstance_New(pClass, NULL, NULL); + + if(pClassInstance == NULL || !PyInstance_Check(pClassInstance)) + { + if(PyErr_Occurred()) + { + PyErr_Print(); + } + string msg = "Could not create new instance of class named " + className + " in Python module"; + throwException(ServiceInvocationException, msg.c_str()); + } + Py_XDECREF(pClass); + } + } + return pClassInstance; + } + + // ====================================================================== + // getInstance: get a class instance for this scope + // ====================================================================== + PyObject* PythonServiceWrapper::getInstance() + { + logentry(); + + PythonImplementation::Scope scope = implementation->getScope(); + if (scope == PythonImplementation::COMPOSITE) + { + if (!pythonClassInstance) + { + pythonClassInstance = newInstance(); + } + return pythonClassInstance; + } + else // (scope == PythonImplementation::STATELESS) + { + return newInstance(); + } + } + + // ====================================================================== + // releaseImplementation: release the implementation for this scope + // ====================================================================== + void PythonServiceWrapper::releaseInstance() + { + logentry(); + + PythonImplementation::Scope scope = implementation->getScope(); + if(scope == PythonImplementation::STATELESS) + { + // Delete the class instance if there is one + if(pythonClassInstance != NULL && PyInstance_Check(pythonClassInstance)) + { + Py_DECREF(pythonClassInstance); + pythonClassInstance = NULL; + } + + // Need to reload the module + PyObject* reloadedPythonModule = PyImport_ReloadModule(pythonModule); + + if(reloadedPythonModule != NULL) + { + // Get rid of old pythonModule and replace with the reloaded one + Py_DECREF(pythonModule); + pythonModule = reloadedPythonModule; + } + } + } + + // ====================================================================== + // invoke: wrapper call to service with setting the component context + // ====================================================================== + void PythonServiceWrapper::invoke(Operation& operation) + { + logentry(); + + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + runtime->setCurrentComponent(component); + + + // Load the references & properties into the module + addReferences(pythonModule); + addProperties(pythonModule); + + try + { + loginfo("Operation: %s", operation.getName().c_str()); + + PyObject* pFunc = NULL; + pythonClassInstance = getInstance(); + + if(pythonClassInstance != NULL && PyInstance_Check(pythonClassInstance)) + { + // Get the function from the instance + pFunc = PyObject_GetAttrString(pythonClassInstance, (char*) operation.getName().c_str()); + } + if(pFunc == NULL && pythonModule != NULL) + { + // Get the function directly from the module if it could not be got from an instance + pFunc = PyObject_GetAttrString(pythonModule, (char*) operation.getName().c_str()); + } + if(pFunc == NULL) + { + // Can't get the function from the class or module + string msg = "Python module or class instance has not been created"; + throwException(ServiceInvocationException, msg.c_str()); + } + + if (pFunc && PyCallable_Check(pFunc)) + { + PyObject* pArgs = PyTuple_New(operation.getNParms()); + PyObject* pKeywordsDict = PyDict_New(); + PyObject* pValue = NULL; + + // Load up the xml.etree.ElementTree module for dealing with SDO params and return values + PyObject* elementTreeModuleName = PyString_FromString("xml.etree.ElementTree"); + PyObject* elementTreeModule = PyImport_Import(elementTreeModuleName); + + if(elementTreeModule == NULL) + { + // pre-Python2.5? - try to get an installed elementtree package + elementTreeModuleName = PyString_FromString("elementtree.ElementTree"); + elementTreeModule = PyImport_Import(elementTreeModuleName); + } + if(elementTreeModule == NULL) + { + // Still null - throw a warning but carry on - user may not need XML + logwarning("Could not load Python ElementTree module - is it installed? SDO and XML will not be supported"); + } + + for(unsigned int i = 0; i < operation.getNParms(); i++) + { + const Operation::Parameter& parm = operation.getParameter(i); + switch(parm.getType()) + { + case Operation::BOOL: + { + if( *(bool*)parm.getValue()) + { + //boolean true + pValue = Py_True; + } + else + { + pValue = Py_False; + } + break; + } + case Operation::SHORT: + { + pValue = PyInt_FromLong(*(short*)parm.getValue()); + break; + } + case Operation::USHORT: + { + pValue = PyInt_FromLong(*(unsigned short*)parm.getValue()); + break; + } + case Operation::INT: + { + pValue = PyInt_FromLong(*(int*)parm.getValue()); + break; + } + case Operation::UINT: + { + pValue = PyInt_FromLong(*(unsigned int*)parm.getValue()); + break; + } + case Operation::LONG: + { + pValue = PyLong_FromLong(*(long*)parm.getValue()); + break; + } + case Operation::ULONG: + { + pValue = PyLong_FromUnsignedLong(*(unsigned long*)parm.getValue()); + break; + } + case Operation::FLOAT: + { + pValue = PyFloat_FromDouble(*(float*)parm.getValue()); + break; + } + case Operation::DOUBLE: + { + pValue = PyFloat_FromDouble(*(double*)parm.getValue()); + break; + } + case Operation::LONGDOUBLE: + { + pValue = PyFloat_FromDouble(*(long double*)parm.getValue()); + break; + } + case Operation::CHARS: + { + pValue = PyString_FromString(*(char**)parm.getValue()); + break; + } + case Operation::STRING: + { + pValue = PyString_FromString((*(string*)parm.getValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + if(elementTreeModule != NULL) + { + DataObjectPtr dob = *(DataObjectPtr*)parm.getValue(); + + // Convert a DataObject to a xml.etree.ElementTree Element object + Composite* composite = component->getComposite(); + XMLHelperPtr xmlHelper = composite->getXMLHelper(); + char* str = xmlHelper->save( + dob, + dob->getType().getURI(), + dob->getType().getName()); + + loginfo("Converting SDO DataObject to Python ElementTree: %s", str); + + // Get the xml.etree.ElementTree.XML function + PyObject* elementTreeXMLFunc = PyObject_GetAttrString(elementTreeModule, "XML"); + + // Call the XML() function with the XML string + pValue = PyObject_CallFunction(elementTreeXMLFunc, "s", str); + + Py_DECREF(elementTreeXMLFunc); + } + else + { + throwException(ServiceDataException, "Could not convert SDO DataObject to Python ElementTree as ElementTree module could not be loaded"); + } + break; + } + default: + throwException(ServiceDataException, "Operation parameter type not supported"); + } + + if (!pValue) + { + Py_DECREF(pArgs); + + if(PyErr_Occurred()) + { + PyErr_Print(); + } + + string msg = "Error converting parameter into Python type"; + throwException(ServiceDataException, msg.c_str()); + + } + //printPyObject("Param value", pValue); + + // If we have a param name, put it in the keyword args + if(parm.hasName()) + { + PyDict_SetItemString(pKeywordsDict, parm.getName().c_str(), pValue); + Py_DECREF(pValue); + } + else + { + /* pValue reference stolen here: */ + PyTuple_SetItem(pArgs, i, pValue); + } + } + + // Resize the args to the correct length + _PyTuple_Resize(&pArgs, operation.getNParms() - PyDict_Size(pKeywordsDict)); + + loginfo("Calling python func with %d args and %d keyword args", PyTuple_Size(pArgs), PyDict_Size(pKeywordsDict)); + + pValue = PyObject_Call(pFunc, pArgs, pKeywordsDict); + //printPyObject("Return value", pValue); + + Py_DECREF(pArgs); + if (pValue != NULL) + { + char buf[20]; + if(PyInt_Check(pValue) || PyLong_Check(pValue)) + { + long* data = new long; + if(PyInt_Check(pValue)) + { + loginfo("Int return value: %d", PyInt_AsLong(pValue)); + *data = PyInt_AsLong(pValue); + } + else + { + loginfo("Long return value: %l", PyLong_AsLong(pValue)); + *data = PyLong_AsLong(pValue); + } + + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = (*data != 0); + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + sprintf(buf, "%d", *data); + *(char**)operation.getReturnValue() = buf; + break; + } + case Operation::STRING: + { + sprintf(buf, "%d", *data); + *(string*)operation.getReturnValue() = buf; + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + } + else if(PyBool_Check(pValue)) + { + loginfo("Bool return value: %d", (pValue == Py_True)); + bool* data = new bool; + *data = (pValue == Py_True); + + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = *data; + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + if(*data) + { + *(char**)operation.getReturnValue() = "true"; + } + else + { + *(char**)operation.getReturnValue() = "false"; + } + break; + } + case Operation::STRING: + { + if(*data) + { + *(string*)operation.getReturnValue() = "true"; + } + else + { + *(string*)operation.getReturnValue() = "false"; + } + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + } + else if(PyFloat_Check(pValue)) + { + loginfo("Float return value: %f", PyFloat_AsDouble(pValue)); + + double* data = new double; + *data = PyFloat_AsDouble(pValue); + + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = (*data != 0.0); + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + sprintf(buf, "%f", *data); + *(char**)operation.getReturnValue() = buf; + break; + } + case Operation::STRING: + { + sprintf(buf, "%f", *data); + *(string*)operation.getReturnValue() = buf; + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + } + else if(PyString_Check(pValue)) + { + loginfo("String return value: %s", PyString_AsString(pValue)); + const char** data = new const char*; + *data = PyString_AsString(pValue); + + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + // If the string is empty or "0" or "false" set to false, otherwise true + if(strlen(*data) == 0 || strcmp(*data, "0") == 0 || strcmp(*data, "false") == 0) + { + *(bool*)operation.getReturnValue() = false; + } + else + { + *(bool*)operation.getReturnValue() = true; + } + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)atoi(*data); + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)atoi(*data); + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)atoi(*data); + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)atoi(*data); + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)atol(*data); + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)atol(*data); + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)atof(*data); + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)atof(*data); + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)atof(*data); + break; + } + case Operation::CHARS: + { + *(const char**)operation.getReturnValue() = *data; + break; + } + case Operation::STRING: + { + *(string*)operation.getReturnValue() = *data; + break; + } + default: + { + // The type is set as something else or has not been set + string* stringData = new string; + *stringData = *data; + operation.setReturnValue(stringData); + } + } + } + else + { + PyObject* pIsElement = Py_False; + + if(elementTreeModule != NULL) + { + // Get the xml.etree.ElementTree.iselement function + PyObject* elementTreeIsElementFunc = PyObject_GetAttrString(elementTreeModule, "iselement"); + + // Call the iselement() function with pValue to check it + pIsElement = PyObject_CallFunction(elementTreeIsElementFunc, "O", pValue); + Py_DECREF(elementTreeIsElementFunc); + } + + if(PyObject_IsTrue(pIsElement) == 1) + { + // pValue is an xml.etree.ElementTree.Element - convert to SDO + PyObject* elementTreeToStringFunc = PyObject_GetAttrString(elementTreeModule, "tostring"); + PyObject* pElemString = PyObject_CallFunction(elementTreeToStringFunc, "O", pValue); + char* data = PyString_AsString(pElemString); + + loginfo("Converting Python ElementTree to SDO DataObject: %s", data); + + Composite* composite = component->getComposite(); + XMLHelperPtr xmlHelper = composite->getXMLHelper(); + XMLDocumentPtr xmlDoc = xmlHelper->load(data); + DataObjectPtr* dataObjectData = new DataObjectPtr; + if (xmlDoc != NULL) + { + *dataObjectData = xmlDoc->getRootDataObject(); + } + else + { + *dataObjectData = NULL; + } + + if (*dataObjectData != NULL) + { + operation.setReturnValue(dataObjectData); + } + else + { + string msg = "xml.etree.ElementTree.Element could not be converted to a DataObject"; + throwException(ServiceDataException, msg.c_str()); + } + + Py_DECREF(elementTreeToStringFunc); + Py_DECREF(pElemString); + } + else + { + PyObject* valueRepr = PyObject_Repr(pValue); + PyObject* valueType = PyObject_Type(pValue); + PyObject* valueTypeRepr = PyObject_Repr(valueType); + loginfo("Return value of unknown type (%s) has repr: %s", PyString_AsString(valueTypeRepr), PyString_AsString(valueRepr)); + Py_DECREF(valueTypeRepr); + Py_DECREF(valueType); + Py_DECREF(valueRepr); + } + + Py_DECREF(pIsElement); + } + + Py_DECREF(elementTreeModule); + Py_DECREF(elementTreeModuleName); + Py_DECREF(pValue); + } + else + { + Py_DECREF(pFunc); + Py_XDECREF(elementTreeModule); + Py_XDECREF(elementTreeModuleName); + + string msg = "Error whilst calling Python function "+operation.getName()+": "; + if(PyErr_Occurred()) + { + PyObject *pErrorType, *pErrorValue, *pErrorTraceback; + PyErr_Fetch(&pErrorType, &pErrorValue, &pErrorTraceback); + + if (pErrorType != NULL && pErrorValue != NULL) + { + PyObject* pErrorTypeStr = PyObject_Str(pErrorType); + PyObject* pErrorValueStr = PyObject_Str(pErrorValue); + msg += PyString_AsString(pErrorTypeStr); + msg += " : "; + msg += PyString_AsString(pErrorValueStr); + Py_DECREF(pErrorTypeStr); + Py_DECREF(pErrorValueStr); + } + else + { + msg += "No Python Error information provided"; + } + Py_XDECREF(pErrorType); + Py_XDECREF(pErrorValue); + Py_XDECREF(pErrorTraceback); + + PyErr_Print(); + } + + throwException(ServiceInvocationException, msg.c_str()); + } + } + else + { + if (PyErr_Occurred()) + { + PyErr_Print(); + } + string msg = "Cannot find the operation named " + operation.getName() + " in the Python module"; + throwException(ServiceInvocationException, msg.c_str()); + } + Py_XDECREF(pFunc); + + } + catch (...) + { + releaseInstance(); + runtime->unsetCurrentComponent(); + throw; + } + releaseInstance(); + runtime->unsetCurrentComponent(); + } + + + // ========================================================================== + // Add any properties into the loaded implementation module as Python objects + // ========================================================================== + void PythonServiceWrapper::addProperties(PyObject* module) + { + logentry(); + + // Set all the configured properties + DataObjectPtr properties = component->getProperties(); + PropertyList pl = properties->getInstanceProperties(); + + for (unsigned int i = 0; i < pl.size(); i++) + { + if (properties->isSet(pl[i])) + { + string propName = pl[i].getName(); + string propValue = properties->getCString(pl[i]); + PyObject* property; + + if(pl[i].isMany()) + { + //TODO - deal with properties that are many + } + + switch(pl[i].getTypeEnum()) + { + case Type::BooleanType: + { + if(properties->getBoolean(pl[i])) + { + property = Py_True; + } + else + { + property = Py_False; + } + Py_INCREF(property); + break; + } + case Type::BigIntegerType: + case Type::BigDecimalType: + case Type::LongType: + { + property = PyLong_FromLongLong(properties->getLong(pl[i])); + break; + } + case Type::ShortType: + case Type::IntType: + { + property = PyInt_FromLong(properties->getInt(pl[i])); + break; + } + case Type::DoubleType: + case Type::FloatType: + { + property = PyFloat_FromDouble(properties->getDouble(pl[i])); + break; + } + case Type::DataObjectType: + { + // Serialize a DataObject and create a python string object from the XML + DataObjectPtr data = properties->getDataObject(pl[i]); + XMLHelperPtr helper = HelperProvider::getXMLHelper(properties->getDataFactory()); + string serializedData = helper->save(data, + data->getType().getURI(), + data->getType().getName()); + + loginfo("Converting SDO DataObject to Python ElementTree: %s", serializedData.c_str()); + + // Get the xml.etree.ElementTree.XML function + PyObject* elementTreeModuleName = PyString_FromString("xml.etree.ElementTree"); + PyObject* elementTreeModule = PyImport_Import(elementTreeModuleName); + PyObject* elementTreeXMLFunc = PyObject_GetAttrString(elementTreeModule, "XML"); + + // Call the XML() function with the XML string + property = PyObject_CallFunction(elementTreeXMLFunc, "s", serializedData.c_str()); + + Py_DECREF(elementTreeXMLFunc); + Py_DECREF(elementTreeModule); + Py_DECREF(elementTreeModuleName); + break; + } + case Type::CharacterType: + case Type::StringType: + case Type::TextType: + case Type::UriType: + default: + { + // For strings and by default create a python string object + property = PyString_FromString(propValue.c_str()); + break; + } + } + + int success = PyModule_AddObject(module, (char*)propName.c_str(), property); + + if(success == 0) + { + loginfo("Added property named %s with type %s and value %s to python module", propName.c_str(), pl[i].getType().getName(), propValue.c_str()); + } + else + { + logwarning("Failed to add property named %s to python module", propName.c_str()); + } + } + } + } + + + // ====================================================================== + // Add any references into the loaded implementation module as class instances that look like + // the classes defined in the interface.python xml + // ====================================================================== + void PythonServiceWrapper::addReferences(PyObject* module) + { + logentry(); + + // Import the TuscanySCA python-extension module + PyObject* pModuleName = PyString_FromString("sca_proxy"); + PyObject* sca_proxy_module = PyImport_Import(pModuleName); + Py_DECREF(pModuleName); + + if(!sca_proxy_module) + { + if(PyErr_Occurred()) + { + PyErr_Print(); + } + string msg = "Failed to load the sca_proxy Python module - has it been successfully installed?\nReferences from Python components will not be supported"; + logwarning(msg.c_str()); + } + else + { + // Get the sca_proxy class + PyObject* sca_proxy_class = PyObject_GetAttrString(sca_proxy_module, "sca_proxy_class"); + + // Iterate through the references of the current component, adding + // each reference to the module + Component::REFERENCE_MAP references = component->getReferences(); + Component::REFERENCE_MAP::iterator pos; + for( pos = references.begin(); pos != references.end(); ++pos) + { + ReferenceType* referenceType = ((Reference*) pos->second)->getType(); + string referenceName = referenceType->getName(); + + PyObject* tuscanySCAArgs = PyTuple_New(2); + PyObject* refName = PyString_FromString(referenceType->getName().c_str()); + PyTuple_SetItem(tuscanySCAArgs, 0, refName); + Py_INCREF(Py_True); + PyTuple_SetItem(tuscanySCAArgs, 1, Py_True); + + // Create the instance of the TuscanySCAReference class + PyObject* sca_proxy_classInstance = PyInstance_New(sca_proxy_class, tuscanySCAArgs, NULL); + Py_DECREF(tuscanySCAArgs); + + int success = PyModule_AddObject(module, (char*)referenceName.c_str(), sca_proxy_classInstance); + + if(success == 0) + { + loginfo("Successfully added sca_proxy_class instance as %s to pythonModule", referenceName.c_str()); + } + else + { + logwarning("Failed to add sca_proxy_class instance as %s to pythonModule", referenceName.c_str()); + } + } + Py_DECREF(sca_proxy_module); + } + } + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceWrapper.h new file mode 100644 index 0000000000..fbf75b3223 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/PythonServiceWrapper.h @@ -0,0 +1,142 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_python_pythonservicewrapper_h +#define tuscany_sca_python_pythonservicewrapper_h + + +// undefine _DEBUG so Python does not need it's deebug dll +#ifdef _DEBUG +#undef _DEBUG +#define _SCA_PYTHON_DEBUG +#endif +#include <Python.h> +#ifdef _SCA_PYTHON_DEBUG +#define _DEBUG +#endif + +#include "tuscany/sca/python/export.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/python/model/PythonImplementation.h" + + +namespace tuscany +{ + namespace sca + { + namespace python + { + class PythonInterface; + + /** + * Wraps the service on a component implementation. + * This abstract class is extended by generated code which provides + * the implementation of some of the methods. + * An instance of this class wraps the actual component implementation which + * has been written by a developer of an SCA application. + */ + class PythonServiceWrapper : public ServiceWrapper + { + public: + + /** + * Constructor. + * @param target The component service to which this wrapper refers. + */ + PythonServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~PythonServiceWrapper(); + + /** + * All business method calls to the target component go through the invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target component. + */ + virtual void invoke(Operation& operation); + + + protected: + + /** + * Return the current instance of the python class. + * @return A pointer to an instance of the python class. + */ + virtual PyObject* getInstance(); + + /** + * Creates a new instance of the python class. + * @return A pointer to a new instance of the python class. + */ + virtual PyObject* newInstance(); + + /** + * Indicates that the current instance of the python module or class + * has been finished with. + */ + virtual void releaseInstance(); + + + private: + /** + * Holds a class instance if a classname is provided. + * Will be constructed each time if scope is set to STATELESS + */ + PyObject* pythonClassInstance; + + /** + * Holds the module + */ + PyObject* pythonModule; + + /** + * Adds references to the provided implementation module or class instance + */ + void addReferences(PyObject* module); + + /** + * Adds properties to the provided implementation module or class instance + */ + void addProperties(PyObject* module); + + /** + * The component to which this wrapper refers. + */ + tuscany::sca::model::Component* component; + + /** + * The component implementation + */ + PythonImplementation* implementation; + + }; + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_pythonservicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/export.h new file mode 100644 index 0000000000..b608a50711 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/export.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_python_export_h +#define tuscany_sca_python_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_PYTHON_EXPORTS +#define SCA_PYTHON_API __declspec(dllexport) +#else +#define SCA_PYTHON_API __declspec(dllimport) +#endif + +#else +#include <sys/time.h> +#include <inttypes.h> +#include <stdlib.h> +#define SCA_PYTHON_API +#endif + +#endif // tuscany_sca_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonImplementation.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonImplementation.cpp new file mode 100644 index 0000000000..235468eca9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonImplementation.cpp @@ -0,0 +1,131 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/python/model/PythonImplementation.h" +#include "tuscany/sca/python/model/PythonServiceBinding.h" +#include "tuscany/sca/python/model/PythonReferenceBinding.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + + namespace python + { + + // Constructor + PythonImplementation::PythonImplementation( + Composite* composite, const string& module, const string& modulePath, const string& className, Scope scope) + : ComponentType(composite, modulePath + "/" + module), + module(module), modulePath(modulePath), className(className), scope(scope) + { + logentry(); + + // Create a default service for this componentType + ServiceType* defaultServiceType = new ServiceType(this, "", NULL, NULL); + addServiceType(defaultServiceType); + } + + PythonImplementation::~PythonImplementation() + { + logentry(); + } + + /** + * Overrides the findReferenceType method in ComponentType. + * This allows us to create references without needing a componentType file. + */ + ReferenceType* PythonImplementation::findReferenceType(const string& referenceName) + { + logentry(); + + ReferenceType* refType = ComponentType::findReferenceType(referenceName); + if(!refType) + { + // The reference has not yet been created - try creating it + refType = new ReferenceType(this, referenceName, NULL, NULL, ReferenceType::ONE_ONE); + addReferenceType(refType); + } + + return refType; + } + + /** + * Overrides the findPropertyType method in ComponentType. + * This allows us to create properties without needing a componentType file. + */ + const commonj::sdo::Property* PythonImplementation::findPropertyType(const string& propertyName) + { + logentry(); + + const commonj::sdo::Property* prop = ComponentType::findPropertyType(propertyName); + if(!prop) + { + ComponentType::addPropertyType(propertyName, "http://www.w3.org/2001/XMLSchema#string", false, NULL); + // Just added it so it should now be available + prop = ComponentType::findPropertyType(propertyName); + loginfo("Added string property named %s to Python component", propertyName.c_str()); + } + + return prop; + } + + void PythonImplementation::initializeComponent(Component* component) + { + logentry(); + ComponentType::initializeComponent(component); + + // Create Python bindings for all the services + const Component::SERVICE_MAP& services = component->getServices(); + Component::SERVICE_MAP::const_iterator iter = services.begin(); + for (unsigned int i=0; i< services.size(); i++) + { + Service *service = iter->second; + PythonServiceBinding* binding = new PythonServiceBinding(service); + service->setBinding(binding); + iter++; + } + + // Create Python bindings for all the references + const Component::REFERENCE_MAP& references = component->getReferences(); + Component::REFERENCE_MAP::const_iterator refiter = references.begin(); + for (int ri=0; ri< references.size(); ri++) + { + Reference *reference = refiter->second; + PythonReferenceBinding* binding = new PythonReferenceBinding(reference); + reference->setBinding(binding); + refiter++; + } + } + + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonImplementation.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonImplementation.h new file mode 100644 index 0000000000..75b14529bf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonImplementation.h @@ -0,0 +1,145 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_python_model_pythonimplementation_h +#define tuscany_sca_python_model_pythonimplementation_h + +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/model/ComponentType.h" + + +namespace tuscany +{ + namespace sca + { + namespace python + { + /** + * Holds information about an SCA implementation written in Python + */ + class PythonImplementation : public tuscany::sca::model::ComponentType + { + + public: + /** + * Scope of the component implementation. + */ + enum Scope + { + COMPOSITE, + STATELESS + }; + + /** + * Constructor. + * @param composite The composite containing this implementation. + * @param module Name of the module. + * @param modulePath Path to the module (could be a blank string + * if this is not specified). + * @param className Name of the class in the module (could be a blank string + * if this is not specified). + */ + PythonImplementation(tuscany::sca::model::Composite* composite, + const std::string& module, const std::string& modulePath, const std::string& className, + Scope scope); + + /** + * Destructor + */ + virtual ~PythonImplementation(); + + /** + * Initialize a component of this type. + * @param component The component to initialize. + */ + virtual void initializeComponent(tuscany::sca::model::Component* component); + + /** + * Override the ComponentType::findReferenceType method + * to allow Python components to be defined without requiring + * a componentType side-file + */ + virtual tuscany::sca::model::ReferenceType* findReferenceType(const std::string& referenceName); + + /** + * Override the ComponentType::findPropertyType method + * to allow Python components to be defined without requiring + * a componentType side-file + */ + virtual const commonj::sdo::Property* findPropertyType(const std::string& propertyName); + + + /** + * Returns the name of the module. + * @return The name of the module. + */ + const std::string& getModule() const { return module; } + + /** + * Get the header path. + * @return The pathe element of the header. + */ + const std::string& getModulePath() const { return modulePath; } + + /** + * Get the name of the class. + * @return The class name if specified. + */ + const std::string& getClass() const { return className; } + + /** + * Returns the implementation scope + */ + Scope getScope() const { return scope; } + + private: + + /** + * Name of the module. + */ + std::string module; + + /** + * Path to the module. + */ + std::string modulePath; + + /** + * Name of the class in the header file declaring the implementation. + * May be an empty string if not set in the SCDL file. + */ + std::string className; + + /** + * The implementation scope + */ + Scope scope; + }; + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_model_pythonimplementation_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonInterface.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonInterface.cpp new file mode 100644 index 0000000000..3c30f363b8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonInterface.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/python/export.h" +#include "tuscany/sca/python/model/PythonInterface.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace python + { + const string PythonInterface::typeQName("http://www.osoa.org/xmlns/sca/1.0#PythonInterface"); + + // Constructor + PythonInterface::PythonInterface( + bool remotable, + bool conversational) + : Interface(remotable, conversational) + { + logentry(); + } + + PythonInterface::~PythonInterface() + { + logentry(); + } + + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonInterface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonInterface.h new file mode 100644 index 0000000000..cfc2ca8914 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonInterface.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_python_model_pythoninterface_h +#define tuscany_sca_python_model_pythoninterface_h + +#include <string> + +#include "tuscany/sca/python/export.h" +#include "tuscany/sca/model/Interface.h" + +namespace tuscany +{ + namespace sca + { + namespace python + { + /** + * Holds information about an interface described using a Python + * header file. + */ + class PythonInterface : public tuscany::sca::model::Interface + { + + public: + /** + * Constuctor. + * @param scope The scope of the interface (stateless or composite). + * @param remotable True if the interface is remotable. + */ + PythonInterface( + bool remotable, + bool conversational); + + /** + * Destructor. + */ + virtual ~PythonInterface(); + + /** + * return the QName of the schema type for this interface type + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.cpp") + */ + const std::string& getInterfaceTypeQName() { return typeQName; }; + + /** + * The QName of the schema type for this interface type. + */ + SCA_PYTHON_API static const std::string typeQName; + + }; + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_model_pythoninterface_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonReferenceBinding.cpp new file mode 100644 index 0000000000..958a3a86ac --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonReferenceBinding.cpp @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/python/model/PythonReferenceBinding.h" +#include "tuscany/sca/python/PythonServiceProxy.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace python + { + + // Constructor + PythonReferenceBinding::PythonReferenceBinding(Reference* reference) + : ReferenceBinding(reference, ""), serviceProxy(NULL) + { + } + + // Destructor + PythonReferenceBinding::~PythonReferenceBinding() + { + } + + ServiceProxy* PythonReferenceBinding::getServiceProxy() + { + return serviceProxy; + } + + void PythonReferenceBinding::configure(ServiceBinding* binding) + { + setTargetServiceBinding(binding); + + serviceProxy = new PythonServiceProxy(getReference()); + } + + } // End namespace python + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonReferenceBinding.h new file mode 100644 index 0000000000..65028f4613 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonReferenceBinding.h @@ -0,0 +1,82 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_python_model_pythonreferencebinding_h +#define tuscany_sca_python_model_pythonreferencebinding_h + +#include <string> + +#include "tuscany/sca/model/ReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace python + { + /** + * Information about a Python service binding for service or a reference. + */ + class PythonReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + */ + PythonReferenceBinding(tuscany::sca::model::Reference* reference); + + /** + * Destructor. + */ + virtual ~PythonReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#PythonImplementationBinding"; }; + + /** + * Create a proxy representing the reference to the + * client component. + */ + virtual ServiceProxy* getServiceProxy(); + + /** + * Configure this binding from a service binding. + */ + virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + private: + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + }; + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_model_pythonreferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonServiceBinding.cpp new file mode 100644 index 0000000000..061aeb7515 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonServiceBinding.cpp @@ -0,0 +1,58 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/python/model/PythonServiceBinding.h" +#include "tuscany/sca/python/PythonServiceWrapper.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace python + { + + // Constructor + PythonServiceBinding::PythonServiceBinding(Service* service) + : ServiceBinding(service, "") + { + logentry(); + serviceWrapper = new PythonServiceWrapper(service); + } + + // Destructor + PythonServiceBinding::~PythonServiceBinding() + { + logentry(); + } + + ServiceWrapper* PythonServiceBinding::getServiceWrapper() + { + logentry(); + return (ServiceWrapper*)serviceWrapper; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonServiceBinding.h new file mode 100644 index 0000000000..9a803cdced --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/model/PythonServiceBinding.h @@ -0,0 +1,81 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_python_model_pythonservicebinding_h +#define tuscany_sca_python_model_pythonservicebinding_h + +#include <string> + +#include "tuscany/sca/model/ServiceBinding.h" + +namespace tuscany +{ + namespace sca + { + namespace python + { + /** + * Information about a Python service binding for service or a reference. + */ + class PythonServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + * @param port The definition of the port to which the entrypoint + * or external service is to be bound. This is of the form + * "namespace"#endpoint("service"/"port") + */ + PythonServiceBinding(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~PythonServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#PythonImplementationBinding"; }; + + /** + * Create a wrapper for the service configured by this + * binding. + */ + virtual ServiceWrapper* getServiceWrapper(); + + private: + + /** + * The wrapper for the service configured by this binding. + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace python + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_python_model_pythonservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/sca_module.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/sca_module.cpp new file mode 100644 index 0000000000..dc2c7bfe22 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/sca_module.cpp @@ -0,0 +1,540 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <string> +#include <iostream> +#include <sstream> + +// undefine _DEBUG so Python does not need it's debug dll +#ifdef _DEBUG +#undef _DEBUG +#define _SCA_PYTHON_DEBUG +#endif +#include <Python.h> +#ifdef _SCA_PYTHON_DEBUG +#define _DEBUG +#endif + +#include "commonj/sdo/SDO.h" + +#include "PythonServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/core/Operation.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca; +using namespace tuscany::sca::model; + +static PyObject* scaError; + +/** +* Prints out PyObject and dir(PyObject) +* for debugging purposes +*/ +static void printPyObject(char* prefix, char* name, PyObject* pObj) +{ + PyObject* pObjRepr = PyObject_Repr(pObj); + PyTypeObject* type = pObj->ob_type; + loginfo("%s printPyObject (%s) %s = %s", prefix, type->tp_name, name, PyString_AsString(pObjRepr)); + Py_XDECREF(pObjRepr); + + if(pObj != NULL) + { + PyObject* pObjDir = PyObject_Dir(pObj); + PyObject* pObjDirRepr = PyObject_Repr(pObjDir); + loginfo("%s printPyObject dir(%s): %s", prefix, name, PyString_AsString(pObjDirRepr)); + Py_DECREF(pObjDirRepr); + Py_DECREF(pObjDir); + } +} + +static PyObject* sca_locateservice(PyObject *self, PyObject *args) +{ + logentry(); + + // Get the service name + PyObject* pServiceName = PyTuple_GetItem(args, 0); + + // Import the SCA python-extension module + PyObject* pModuleName = PyString_FromString("sca_proxy"); + PyObject* sca_proxy_module = PyImport_Import(pModuleName); + Py_DECREF(pModuleName); + + if(!sca_proxy_module) + { + if(PyErr_Occurred()) + { + PyErr_Print(); + } + string msg = "Failed to load the sca_proxy Python module - has it been successfully installed?\nReferences from Python components will not be supported"; + logerror(msg.c_str()); + } + else + { + // Get the sca_proxy class + PyObject* sca_proxy_class = PyObject_GetAttrString(sca_proxy_module, "sca_proxy_class"); + + PyObject* scaArgs = PyTuple_New(2); + PyTuple_SetItem(scaArgs, 0, pServiceName); + Py_INCREF(Py_True); + PyTuple_SetItem(scaArgs, 1, Py_False); + + // Create the instance of the scaReference class + PyObject* sca_proxy_classInstance = PyInstance_New(sca_proxy_class, scaArgs, NULL); + Py_DECREF(scaArgs); + + return sca_proxy_classInstance; + } + + Py_INCREF(Py_None); + return Py_None; +} + + +static tuscany::sca::python::PythonServiceProxy* getServiceProxy(PyObject *args) +{ + logentry(); + + tuscany::sca::python::PythonServiceProxy* serviceProxy = NULL; + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + + // The first argument holds the name + string name; + PyObject* pName = PyTuple_GetItem(args, 0); + if(pName && PyString_Check(pName)) + { + name = PyString_AsString(pName); + } + if(name.size() > 0) + { + loginfo("Service/Reference name is %s", name.c_str()); + } + else + { + string msg = "Service/Reference name has not been set"; + logwarning(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + return NULL; + } + + // The second argument is a boolean + PyObject* isReference = PyTuple_GetItem(args, 1); + + // Get the serviceProxy from the reference or service name provided + if(PyObject_IsTrue(isReference)) + { + Component* component = runtime->getCurrentComponent(); + Reference* ref = component->findReference(name); + if(!ref) + { + string msg = "Could not find the reference: "+name; + logwarning(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + + return NULL; + } + + ReferenceBinding* refBinding = ref->getBinding(); + serviceProxy = (tuscany::sca::python::PythonServiceProxy*) refBinding->getServiceProxy(); + } + else + { + Component* component = runtime->getDefaultComponent(); + Composite* composite = (Composite*)component->getType(); + Service* service = composite->findComponentService(name); + + if(!service) + { + string msg = "Could not find service: "+name; + logwarning(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + return NULL; + } + + serviceProxy = new tuscany::sca::python::PythonServiceProxy(service); + } + + return serviceProxy; +} + + +static PyObject* sca_invoke(PyObject *self, PyObject *args) +{ + logentry(); + + tuscany::sca::python::PythonServiceProxy* pythonServiceProxy = getServiceProxy(args); + if(!pythonServiceProxy) + { + return NULL; + } + + // Get the component from the reference or service provided + Component* component = NULL; + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + + PyObject* isReference = PyTuple_GetItem(args, 1); + if(PyObject_IsTrue(isReference)) + { + component = runtime->getCurrentComponent(); + } + else + { + component = runtime->getDefaultComponent(); + } + + // Get the name of the operation to invoke + string operationName; + PyObject* opName = PyTuple_GetItem(args, 2); + if(opName && PyString_Check(opName)) + { + operationName = PyString_AsString(opName); + } + + if(operationName.size() > 0) + { + loginfo("sca_invoke Operation name: %s", operationName.c_str()); + } + else + { + string msg = "Operation name has not been set"; + logwarning(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + return NULL; + } + + // Create the Operation object + Operation operation(operationName.c_str()); + + // Load up the xml.etree.ElementTree module for dealing with SDO params and return values + PyObject* elementTreeModuleName = PyString_FromString("xml.etree.ElementTree"); + PyObject* elementTreeModule = PyImport_Import(elementTreeModuleName); + + if(elementTreeModule == NULL) + { + // pre-Python2.5? - try to get an installed elementtree package + elementTreeModuleName = PyString_FromString("elementtree.ElementTree"); + elementTreeModule = PyImport_Import(elementTreeModuleName); + } + if(elementTreeModule == NULL) + { + // Still null - throw a warning but carry on - user may not need XML + logwarning("Could not load Python ElementTree module - is it installed? SDO and XML will not be supported"); + } + + // Parameters are the fourth argument + PyObject* paramTuple = PyTuple_GetItem(args, 3); + unsigned int numberOfArgs = (unsigned int) PyTuple_Size(paramTuple); + loginfo("sca_invoke %d arg parameters supplied", numberOfArgs); + + // Keyword parameters (AKA named arguments) are the fifth argument + PyObject* keywordParamDict = PyTuple_GetItem(args, 4); + loginfo("sca_invoke %d keyword parameters supplied", PyDict_Size(keywordParamDict)); + + PyObject* paramKeys = PyDict_Keys(keywordParamDict); + + // Go through all the supplied parameters (args and keyword args) + for(unsigned int i=0; i < (numberOfArgs + PyList_Size(paramKeys)); i++) + { + string* paramName; + PyObject* param; + + if(i < PyTuple_Size(paramTuple)) + { + param = PyTuple_GetItem(paramTuple, i); + paramName = new string(); + } + else + { + PyObject* key = PyList_GetItem(paramKeys, i-numberOfArgs); + param = PyDict_GetItem(keywordParamDict, key); + paramName = new string(PyString_AsString(key)); + } + + if(PyInt_Check(param)) + { + loginfo("Int param %d %s: %d", i, (*paramName).c_str(), PyInt_AsLong(param)); + long* intData = new long; + *intData = PyInt_AsLong(param); + operation.addParameter(*paramName, intData); + } + else if(PyBool_Check(param)) + { + loginfo("Bool param %d %s: %d", i, (*paramName).c_str(), (param == Py_True)); + bool* boolData = new bool; + *boolData = (param == Py_True); + operation.addParameter(*paramName, boolData); + } + else if(PyLong_Check(param)) + { + loginfo("Long param %d %s: %l", i, (*paramName).c_str(), PyLong_AsLong(param)); + long* longData = new long; + *longData = PyLong_AsLong(param); + operation.addParameter(*paramName, longData); + } + else if(PyFloat_Check(param)) + { + loginfo("Float param %d %s: %f", i, (*paramName).c_str(), PyFloat_AsDouble(param)); + double* doubleData = new double; + *doubleData = PyFloat_AsDouble(param); + operation.addParameter(*paramName, doubleData); + } + else if(PyString_Check(param)) + { + loginfo("String param %d %s: %s", i, (*paramName).c_str(), PyString_AsString(param)); + const char** stringData = new const char*; + *stringData = PyString_AsString(param); + operation.addParameter(*paramName, stringData); + } + else + { + PyObject* pIsElement = Py_False; + if(elementTreeModule != NULL) + { + // Get the xml.etree.ElementTree.iselement function + PyObject* elementTreeIsElementFunc = PyObject_GetAttrString(elementTreeModule, "iselement"); + + // Call the iselement() function with pValue to check it + pIsElement = PyObject_CallFunction(elementTreeIsElementFunc, "O", param); + } + + if(PyObject_IsTrue(pIsElement) == 1) + { + // pValue is an xml.etree.ElementTree.Element - convert to SDO + PyObject* elementTreeToStringFunc = PyObject_GetAttrString(elementTreeModule, "tostring"); + PyObject* pElemString = PyObject_CallFunction(elementTreeToStringFunc, "O", param); + char* data = PyString_AsString(pElemString); + loginfo("SDO param %d %s: %s", i, (*paramName).c_str(), data); + + loginfo("Converting Python ElementTree to SDO DataObject: %s", data); + + Composite* composite = component->getComposite(); + XMLHelperPtr xmlHelper = composite->getXMLHelper(); + XMLDocumentPtr xmlDoc = xmlHelper->load(data); + + DataObjectPtr* dataObjectData = new DataObjectPtr; + if (xmlDoc != NULL) + { + *dataObjectData = xmlDoc->getRootDataObject(); + } + else + { + *dataObjectData = NULL; + } + if (*dataObjectData != NULL) + { + operation.addParameter(*paramName, dataObjectData); + } + else + { + string msg = "xml.etree.ElementTree.Element could not be converted to a DataObject"; + logerror(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + return NULL; + } + Py_DECREF(elementTreeToStringFunc); + Py_DECREF(pElemString); + } + else + { + + PyObject* paramRepr = PyObject_Repr(param); + PyObject* paramType = PyObject_Type(param); + PyObject* paramTypeRepr = PyObject_Repr(paramType); + + string msg = "sca_invoke Param "; + msg += i; + msg += "is of unknown type ("; + msg += PyString_AsString(paramTypeRepr); + msg += ") and has repr: "; + msg += PyString_AsString(paramRepr); + + logerror(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + + Py_DECREF(paramTypeRepr); + Py_DECREF(paramType); + Py_DECREF(paramRepr); + + return NULL; + } + } + } + + PyObject* returnValue = NULL; + + try + { + // Invoke the wired service + pythonServiceProxy->invokeService(operation); + } + catch(TuscanyRuntimeException& ex) + { + string msg = "Exception whilst invoking the "; + msg += operationName.c_str(); + msg += " operation on an SCA service/reference: "; + msg += ex.getEClassName(); + msg += ": "; + msg += ex.getMessageText(); + logwarning(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + return NULL; + } + catch(...) + { + string msg = "Exception whilst invoking the "; + msg += operationName.c_str(); + msg += " operation on an SCA service/reference"; + + logwarning(msg.c_str()); + PyErr_SetString(scaError, msg.c_str()); + return NULL; + } + + + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + if(*(bool*)operation.getReturnValue()) + { + returnValue = Py_True; + } + else + { + returnValue = Py_False; + } + break; + } + case Operation::SHORT: + { + returnValue = PyInt_FromLong(*(short*)operation.getReturnValue()); + break; + } + case Operation::LONG: + { + returnValue = PyLong_FromLong(*(long*)operation.getReturnValue()); + break; + } + case Operation::USHORT: + { + returnValue = PyInt_FromLong(*(unsigned short*)operation.getReturnValue()); + break; + } + case Operation::ULONG: + { + returnValue = PyLong_FromLong(*(unsigned long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + { + returnValue = PyFloat_FromDouble(*(float*)operation.getReturnValue()); + break; + } + case Operation::DOUBLE: + { + returnValue = PyFloat_FromDouble(*(double*)operation.getReturnValue()); + break; + } + case Operation::LONGDOUBLE: + { + returnValue = PyFloat_FromDouble(*(long double*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + returnValue = PyString_FromString(*(char**)operation.getReturnValue()); + break; + } + case Operation::STRING: + { + returnValue = PyString_FromString((*(string*)operation.getReturnValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + if(elementTreeModule != NULL) + { + DataObjectPtr dob = *(DataObjectPtr*)operation.getReturnValue(); + + // Convert a DataObject to a xml.etree.ElementTree Element object + Composite* composite = component->getComposite(); + XMLHelperPtr xmlHelper = composite->getXMLHelper(); + char* str = xmlHelper->save( + dob, + dob->getType().getURI(), + dob->getType().getName()); + + loginfo("Converting SDO DataObject to Python ElementTree: %s", str); + + // Get the xml.etree.ElementTree.XML function + PyObject* elementTreeXMLFunc = PyObject_GetAttrString(elementTreeModule, "XML"); + + // Call the XML() function with the XML string + returnValue = PyObject_CallFunction(elementTreeXMLFunc, "s", str); + + Py_DECREF(elementTreeXMLFunc); + } + else + { + logwarning("Could not convert SDO DataObject to Python ElementTree as ElementTree module could not be loaded. Returning NONE"); + Py_INCREF(Py_None); + returnValue = Py_None; + } + break; + } + default: + { + Py_INCREF(Py_None); + returnValue = Py_None; + } + + } + + Py_XDECREF(elementTreeModuleName); + Py_XDECREF(elementTreeModule); + + return returnValue; +} +static PyMethodDef ModuleMethods[] = +{ + {"locateservice", (PyCFunction) sca_locateservice, METH_VARARGS, "Locates an SCA service & returns an sca_proxy_class instance"}, + {"invoke", (PyCFunction) sca_invoke, METH_VARARGS, "Invoke an operation on an SCA service or reference"}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC initsca(void) +{ + logentry(); + + // Create a new module + PyObject* module = Py_InitModule("sca", ModuleMethods); + + scaError = PyErr_NewException("sca.error", NULL, NULL); + Py_INCREF(scaError); + PyModule_AddObject(module, "error", scaError); +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/sca_proxy.py b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/sca_proxy.py new file mode 100644 index 0000000000..92a224275e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/src/tuscany/sca/python/sca_proxy.py @@ -0,0 +1,57 @@ +# 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.
+#
+#
+#
+#
+# This Python code is used in the SCA package and
+# provides the proxy objects to a Python SCA component or SCA
+# client.
+#
+# This is done by overloading the __getattr__ method which makes
+# calls to myProxy.anyMethod go to __getattr__ which will return
+# the invokeFunction defined inside the invoke method
+
+import sca
+
+class sca_proxy_class:
+
+ sca_proxy_name = ''
+ sca_proxy_is_reference = 1
+
+ def __init__(self, name, isReference):
+ self.sca_proxy_name = name
+ self.sca_proxy_is_reference = isReference
+ return
+
+ def invoke(self, operationName):
+
+ def invokeFunction(*args, **kwargs):
+ # Pass the args and keywords in to the invoke method as arguments
+ return sca.invoke(self.sca_proxy_name, self.sca_proxy_is_reference, operationName, args, kwargs)
+
+ return invokeFunction
+
+ def __getattr__(self, operationName):
+ return self.invoke(operationName)
+
+ def __str__(self):
+ return '<sca_proxy.sca_proxy_class instance for ' + self.sca_proxy_name + '>'
+
+ def __repr__(self):
+ return '<sca_proxy.sca_proxy_class instance for ' + self.sca_proxy_name + '>'
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/xsd/sca-implementation-python.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/xsd/sca-implementation-python.xsd new file mode 100644 index 0000000000..5730e66116 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/xsd/sca-implementation-python.xsd @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="implementation.python" type="sca:PythonImplementation" substitutionGroup="sca:implementation"/> + <complexType name="PythonImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="module" type="NCName" use="required"/> + <attribute name="path" type="NCName" use="optional"/> + <attribute name="class" type="Name" use="optional"/> + <attribute name="scope" type="sca:PythonImplementationScope" use="optional" /> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + + <simpleType name="PythonImplementationScope"> + <restriction base="string"> + <enumeration value="stateless" /> + <enumeration value="composite" /> + </restriction> + </simpleType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/xsd/sca-interface-python.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/xsd/sca-interface-python.xsd new file mode 100644 index 0000000000..1ce24b7249 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/python/xsd/sca-interface-python.xsd @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="interface.python" type="sca:PythonInterface" substitutionGroup="sca:interface"/> + <complexType name="PythonInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <element name="operation" type="sca:PythonOperation" minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="remotable" type="boolean" use="optional" /> + <attribute name="conversational" type="boolean" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <complexType name="PythonOperation"> + <complexContent> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="string" use="required" /> + <attribute name="returnType" type="sca:PythonReturnTypes" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexContent> + </complexType> + + <simpleType name="PythonReturnTypes"> + <restriction base="string"> + <enumeration value="string" /> + <enumeration value="int" /> + <enumeration value="long" /> + <enumeration value="boolean" /> + <enumeration value="float" /> + <enumeration value="other" /> + </restriction> + </simpleType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/Makefile.am new file mode 100644 index 0000000000..742a8152ad --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/Makefile.am @@ -0,0 +1,6 @@ +SUBDIRS = interface reference service +datadir=$(prefix)/extensions/rest + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/Makefile.am new file mode 100644 index 0000000000..f963effea2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/Makefile.am new file mode 100644 index 0000000000..a2b7ac74e4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/Makefile.am @@ -0,0 +1,23 @@ +libdir=$(prefix)/extensions/rest/interface/lib +lib_LTLIBRARIES = libtuscany_sca_rest_interface.la + +noinst_HEADERS = tuscany/sca/rest/*.h tuscany/sca/rest/model/*.h + +libtuscany_sca_rest_interface_la_SOURCES = \ +tuscany/sca/rest/RESTInterfaceExtension.cpp \ +tuscany/sca/rest/model/RESTInterface.cpp + +libtuscany_sca_rest_interface_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include + +moduledir=$(prefix)/extensions/rest/interface/module +extension = libtuscany_sca_rest_interface$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/RESTInterfaceExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/RESTInterfaceExtension.cpp new file mode 100644 index 0000000000..c69febf39a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/RESTInterfaceExtension.cpp @@ -0,0 +1,85 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/rest/RESTInterfaceExtension.h" +#include "tuscany/sca/rest/model/RESTInterface.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_rest_interface_initialize() + { + tuscany::sca::rest::RESTInterfaceExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace rest + { + // =================================================================== + // Constructor for the RESTInterfaceExtension class. + // =================================================================== + RESTInterfaceExtension::RESTInterfaceExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the RESTInterfaceExtension class. + // =================================================================== + RESTInterfaceExtension::~RESTInterfaceExtension() + { + logentry(); + } + + const string RESTInterfaceExtension::extensionName("rest"); + const string RESTInterfaceExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#RESTInterface"); + + // =================================================================== + // loadModelElement - load the info from interface.rest + // =================================================================== + tuscany::sca::model::Interface* RESTInterfaceExtension::getInterface(Composite* composite, DataObjectPtr scdlInterface) + { + logentry(); + + return new RESTInterface(); + } + + void RESTInterfaceExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerInterfaceExtension(new RESTInterfaceExtension()); + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/RESTInterfaceExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/RESTInterfaceExtension.h new file mode 100644 index 0000000000..de61ee5751 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/RESTInterfaceExtension.h @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_rest_restinterfaceextension_h +#define tuscany_sca_rest_restinterfaceextension_h + +#include "tuscany/sca/extension/InterfaceExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + class RESTInterfaceExtension : public InterfaceExtension + { + public: + /** + * Default constructor + */ + RESTInterfaceExtension(); + + /** + * Destructor + */ + virtual ~RESTInterfaceExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema type for this interface extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.rest") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::Interface* getInterface( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlInterface); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_rest_restinterfaceextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/exportinterface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/exportinterface.h new file mode 100644 index 0000000000..f3636f0d39 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/exportinterface.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_rest_exportinterface_h +#define tuscany_sca_rest_exportinterface_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_REST_INTERFACE_EXPORTS +#define SCA_REST_INTERFACE_API __declspec(dllexport) +#else +#define SCA_REST_INTERFACE_API __declspec(dllimport) +#endif + +#else +#define SCA_REST_INTERFACE_API +#endif + +#endif // tuscany_sca_rest_exportinterface_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/model/RESTInterface.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/model/RESTInterface.cpp new file mode 100644 index 0000000000..34feda2049 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/model/RESTInterface.cpp @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/rest/model/RESTInterface.h" + +using namespace std; + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + const string RESTInterface::typeQName("http://www.osoa.org/xmlns/sca/1.0#RESTInterface"); + + // Constructor + RESTInterface::RESTInterface() + : Interface(true, false) + { + logentry(); + } + + RESTInterface::~RESTInterface() + { + logentry(); + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/model/RESTInterface.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/model/RESTInterface.h new file mode 100644 index 0000000000..88aacecc16 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/interface/src/tuscany/sca/rest/model/RESTInterface.h @@ -0,0 +1,80 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_rest_model_restinterface_h +#define tuscany_sca_rest_model_restinterface_h + +#include <string> + +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/rest/exportinterface.h" + + +namespace tuscany +{ + namespace sca + { + namespace rest + { + /** + * Holds information about a REST interface + */ + class RESTInterface : public tuscany::sca::model::Interface + { + + public: + /** + * Constuctor. + * @param header Name of the header file containing the class that + * describes the interface. + * @param className Name of the class in the header file that + * describes the interface. + * @param scope The scope of the interface (stateless or composite). + * @param remotable True if the interface is remotable. + */ + RESTInterface(); + + /** + * Destructor. + */ + virtual ~RESTInterface(); + + /** + * return the QName of the schema type for this interface type + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#interface.rest") + */ + virtual const std::string& getInterfaceTypeQName() { return typeQName; }; + + /** + * The QName of the schema type for this interface type. + */ + SCA_REST_INTERFACE_API static const std::string typeQName; + + private: + + }; + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_rest_model_restinterface_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/Makefile.am new file mode 100644 index 0000000000..2a0247f16f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = curl
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/Makefile.am new file mode 100644 index 0000000000..f963effea2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/Makefile.am new file mode 100644 index 0000000000..f6e6c28b55 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/Makefile.am @@ -0,0 +1,28 @@ +libdir=$(prefix)/extensions/rest/reference/lib +lib_LTLIBRARIES = libtuscany_sca_rest_reference.la + +noinst_HEADERS = tuscany/sca/rest/*.h tuscany/sca/rest/model/*.h + +libtuscany_sca_rest_reference_la_SOURCES = \ +tuscany/sca/rest/RESTServiceBindingExtension.cpp \ +tuscany/sca/rest/model/RESTServiceBinding.cpp \ +tuscany/sca/rest/RESTServiceWrapper.cpp + +libtuscany_sca_rest_reference_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L$(top_builddir)/runtime/extensions/rest/interface/src -ltuscany_sca_rest_interface \ + -L${CURL_LIB} -lcurl + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I$(top_builddir)/runtime/extensions/rest/interface/src \ + -I${TUSCANY_SDOCPP}/include \ + -I${CURL_INCLUDE} + +moduledir=$(prefix)/extensions/rest/reference/module +extension = libtuscany_sca_rest_reference$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceBindingExtension.cpp new file mode 100644 index 0000000000..f8eb9ad05c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceBindingExtension.cpp @@ -0,0 +1,89 @@ +/* +* 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. +*/ + +#include "RESTServiceBindingExtension.h" +#include "model/RESTServiceBinding.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_rest_reference_initialize() + { + tuscany::sca::rest::RESTServiceBindingExtension::initialize(); + } +} + + +namespace tuscany +{ + namespace sca + { + namespace rest + { + // =================================================================== + // Constructor for the RESTServiceBinding class. + // =================================================================== + RESTServiceBindingExtension::RESTServiceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the RESTServiceBindingExtension class. + // =================================================================== + RESTServiceBindingExtension::~RESTServiceBindingExtension() + { + logentry(); + } + + const string RESTServiceBindingExtension::extensionName("rest"); + const string RESTServiceBindingExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#RESTBinding"); + + + // =================================================================== + // loadModelElement - load the info from binding.rest + // =================================================================== + ServiceBinding* RESTServiceBindingExtension::getServiceBinding(Composite *composite, Service* service, DataObjectPtr scdlBinding) + { + string uri = scdlBinding->getCString("uri"); + + RESTServiceBinding* serviceBinding = new RESTServiceBinding(service, uri); + + return serviceBinding; + } + + void RESTServiceBindingExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerServiceBindingExtension(new RESTServiceBindingExtension()); + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceBindingExtension.h new file mode 100644 index 0000000000..ad1d861d95 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceBindingExtension.h @@ -0,0 +1,75 @@ +/* + * 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. + */ + +#ifndef tuscany_sca_extension_rest_restservicebindingextension_h +#define tuscany_sca_extension_rest_restservicebindingextension_h + +#include "tuscany/sca/extension/ServiceBindingExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + class RESTServiceBindingExtension : public ServiceBindingExtension + { + public: + /** + * Default constructor + */ + RESTServiceBindingExtension(); + + /** + * Destructor + */ + virtual ~RESTServiceBindingExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.rest") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ServiceBinding* getServiceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Service* service, + commonj::sdo::DataObjectPtr scdlBinding); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif //tuscany_sca_extension_rest_restservicebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceWrapper.cpp new file mode 100644 index 0000000000..e28e7976e8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceWrapper.cpp @@ -0,0 +1,1225 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4091) +#endif + +#include <curl/curl.h> +#include <curl/types.h> +#include <curl/easy.h> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/SDOUtils.h" +#include "RESTServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/CompositeReference.h" +#include "model/RESTServiceBinding.h" +#include "tuscany/sca/rest/model/RESTInterface.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + class ResponseChunk { + public: + ResponseChunk() : memory(NULL), size(0) + { + } + + ~ResponseChunk() + { + if (memory) + { + free(memory); + } + } + + char *memory; + int size; + }; + + class RequestChunk { + public: + RequestChunk() : memory(NULL), size(0), read(0) + { + } + + ~RequestChunk() + { + } + + const char *memory; + int size; + int read; + }; + + class HeaderChunk { + public: + HeaderChunk() : location("") + { + } + + ~HeaderChunk() + { + } + + string location; + }; + + size_t write_callback(void *ptr, size_t size, size_t nmemb, void *data) + { + int realsize = size * nmemb; + ResponseChunk *mem = (ResponseChunk *)data; + + if (mem->memory != NULL) + { + mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1); + } + else + { + mem->memory = (char *)malloc(mem->size + realsize + 1); + } + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + return realsize; + } + + static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *data) + { + int realsize = size * nmemb; + RequestChunk *mem = (RequestChunk *)data; + + if (realsize > mem->size - mem->read) + { + realsize = mem->size - mem->read; + } + if (realsize != 0) + { + memcpy(ptr, &(mem->memory[mem->read]), realsize); + mem->read += realsize; + } + return realsize; + } + + size_t header_callback(void *ptr, size_t size, size_t nmemb, void *data) + { + int realsize = size * nmemb; + HeaderChunk* mem = (HeaderChunk*)data; + + char* str = new char[realsize + 1]; + memcpy(str, ptr, realsize); + str[realsize] = 0; + + if (strlen(str) > 10 && !strncmp(str, "Location: ", 10)) + { + string s = &str[10]; + mem->location = s.substr(0,s.find_last_not_of("\r\n")+1); + } + + delete str; + + return realsize; + } + + bool RESTServiceWrapper::initialized = false; + + RESTServiceWrapper::RESTServiceWrapper(Service* service) : ServiceWrapper(service) + { + logentry(); + + DataFactoryPtr dataFactory = service->getComponent()->getComposite()->getDataFactory(); + try { + const Type& tempType = dataFactory->getType("http://tempuri.org", "RootType"); + } catch (SDORuntimeException&) + { + dataFactory->addType("http://tempuri.org", "RootType", false, false, false); + dataFactory->addType("http://tempuri.org", "Wrapper", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Wrapper", + "http://tempuri.org", "Wrapper", + false, false, true); + dataFactory->addType("http://tempuri.org", "Part", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Part", + "http://tempuri.org", "Part", + false, false, true); + } + + if (!initialized) + { + curl_global_init(CURL_GLOBAL_ALL); + initialized = true; + } + } + + RESTServiceWrapper::~RESTServiceWrapper() + { + } + + /// + /// This method will be called when a service call needs to be made. + /// + void RESTServiceWrapper::invoke(Operation& operation) + { + logentry(); + + const string& operationName = operation.getName(); + + loginfo("Service: %s, operation: %s", getService()->getType()->getName().c_str() , operationName.c_str()); + + for (unsigned int i=0; i<operation.getNParms(); i++) + { + loginfo("Parameter: %p, type %u", operation.getParameterValue(i),(int) operation.getParameterType(i)); + } + + // Get the service, composite reference and composite + Service* service = getService(); + CompositeReference* compositeReference = (CompositeReference*)service->getComponent(); + Composite* composite = compositeReference->getComposite(); + XMLHelperPtr xmlHelper = composite->getXMLHelper(); + + // Get the REST binding + RESTServiceBinding* binding = (RESTServiceBinding *)service->getBinding(); + Interface* iface = service->getType()->getInterface(); + + // Init the curl session + CURL *curl_handle = curl_easy_init(); + + RequestChunk requestChunk; + ResponseChunk responseChunk; + HeaderChunk headerChunk; + + // Some servers don't like requests that are made without a user-agent + curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); + + // Get the operation name + string opName = operation.getName(); + + // If we have a REST interface, the operation name translates to an HTTP verb + if (iface != NULL && iface->getInterfaceTypeQName() == RESTInterface::typeQName) + { + + // HTTP GET + if (opName == "retrieve") + { + // Build the request URL + bool firstParm = 0; + string uri; + if (operation.getNParms() !=0) + { + + // If the first parameter is a URI, then we'll use it, + // otherwise we'll use the binding URI + ostringstream s0; + writeParameter(xmlHelper, s0, operation.getParameter(0)); + string p0 = s0.str(); + if (p0.find("://") != string::npos) + { + firstParm = 1; + uri = p0; + } + else + { + uri = getBindingURI(); + } + } + else + { + uri = getBindingURI(); + } + // Add the parameters to the end of the URI + ostringstream os; + if (uri[uri.length()-1] == '?') + { + // If the URI ends with a "?" then we use the query + // form param=value& + os << uri; + for (unsigned int i = firstParm; i < operation.getNParms(); i++) + { + Operation::Parameter param = operation.getParameter(i); + + if(param.hasName()) + { + os << param.getName() << "="; + } + else + { + // No name - use "param1", etc + os << "param" << (i + 1) << "="; + } + writeParameter(xmlHelper, os, param); + if (i < operation.getNParms()-1) + os << "&"; + } + } + else + { + // Add the parameters in the form + // value1 / value2 / value3 + os << uri; + for (unsigned int i = firstParm; i < operation.getNParms(); i++) + { + os << "/"; + writeParameter(xmlHelper, os, operation.getParameter(i)); + } + } + + string url = os.str(); + //loginfo("RESTServiceWrapper: HTTP GET %s", url.c_str()); + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + + // Send all data to this function + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&responseChunk); + + // Send all headers to this function + curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, header_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)&headerChunk); + + // Perform the HTTP GET + CURLcode rc = curl_easy_perform(curl_handle); + + if (rc) + { + throwException(ServiceInvocationException, curl_easy_strerror(rc)); + } + + // Get the output data out of the returned document + long httprc; + curl_easy_getinfo (curl_handle, CURLINFO_RESPONSE_CODE, &httprc); + + string responsePayload = ""; + if (responseChunk.memory) + { + responsePayload = string((const char*)responseChunk.memory, responseChunk.size); + } + + if (httprc == 200) + { + if (responsePayload != "") + { + //TODO Remove this workaround once SDO supports loading of open top level content + // The workaround is to wrap the open content in a wrapper element + string xmldecl; + string xml; + Utils::rTokeniseString("?>", responsePayload, xmldecl, xml); + string part = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + part += "<Part xmlns=\"http://tempuri.org\" xmlns:tns=\"http://tempuri.org\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; + part += xml; + part += "\n</Part>"; + + setReturn(xmlHelper, part, operation); + } + else + { + throwException(ServiceInvocationException, "Failed to retrieve resource, empty response"); + } + } + else + { + ostringstream msg; + msg << "Failed to retrieve REST resource, HTTP code: " << httprc; + if (responsePayload != "") + { + msg << ", payload: " << responsePayload; + } + throwException(ServiceInvocationException, msg.str().c_str()); + } + } + else if (opName == "create") + { + // HTTP POST + + // Set the target URL + string url = getBindingURI(); + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + + // Create the input payload + ostringstream spayload; + writeParameter(xmlHelper, spayload, operation.getParameter(0)); + const string& requestPayload = spayload.str(); + requestChunk.memory = requestPayload.c_str(); + requestChunk.size = requestPayload.size(); + + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, requestChunk.size); + + // Read all data using this function + curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, read_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_READDATA, (void *)&requestChunk); + + // Send all data to this function + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&responseChunk); + + // Send all headers to this function + curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, header_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)&headerChunk); + + // Configure headers + curl_slist *requestHeaders = NULL; + requestHeaders = curl_slist_append(requestHeaders, "Expect:"); + requestHeaders = curl_slist_append(requestHeaders, "Content-Type: text/xml"); + curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, requestHeaders); + + // Perform the HTTP POST + curl_easy_setopt(curl_handle, CURLOPT_POST, true); + CURLcode rc = curl_easy_perform(curl_handle); + + curl_slist_free_all(requestHeaders); + + if (rc) + { + throwException(ServiceInvocationException, curl_easy_strerror(rc)); + } + + // Get the output and location of the created resource + string responsePayload = ""; + if (responseChunk.memory) + { + responsePayload = string((const char*)responseChunk.memory, responseChunk.size); + } + + long httprc; + curl_easy_getinfo (curl_handle, CURLINFO_RESPONSE_CODE, &httprc); + if (httprc == 201) + { + string* location = new string; + *location = headerChunk.location; + operation.setReturnValue(location); + } + else + { + ostringstream msg; + msg << "Failed to create REST resource, HTTP code: " << httprc; + if (responsePayload != "") + { + msg << ", payload: " << responsePayload; + } + throwException(ServiceInvocationException, msg.str().c_str()); + } + } + else if (opName == "update") + { + // HTTP PUT + + // Build the request URL + bool firstParm = 0; + string uri; + if (operation.getNParms() > 1) + { + + // If the first parameter is a URI, then we'll use it, + // otherwise we'll use the binding URI + ostringstream s0; + writeParameter(xmlHelper, s0, operation.getParameter(0)); + string p0 = s0.str(); + if (p0.find("://") != string::npos) + { + firstParm = 1; + uri = p0; + } + else + { + uri = getBindingURI(); + } + } + else + { + uri = getBindingURI(); + } + // Add the parameters to the end of the URI + ostringstream os; + if (uri[uri.length()-1] == '?') + { + // If the URI ends with a "?" then we use the query + // form param=value& + os << uri; + for (unsigned int i = firstParm; i < operation.getNParms()-1; i++) + { + Operation::Parameter param = operation.getParameter(i); + if(param.hasName()) + { + os << param.getName() << "="; + } + else + { + // No name - use "param1", etc + os << "param" << (i + 1) << "="; + } + writeParameter(xmlHelper, os, param); + if (i < operation.getNParms()-1) + os << "&"; + } + } + else + { + // Add the parameters in the form + // value1 / value2 / value3 + os << uri; + for (unsigned int i = firstParm; i < operation.getNParms()-1; i++) + { + os << "/"; + writeParameter(xmlHelper, os, operation.getParameter(i)); + } + } + + string url = os.str(); + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + + // Create the input payload + ostringstream spayload; + writeParameter(xmlHelper, spayload, operation.getParameter(operation.getNParms()-1)); + const string& requestPayload = spayload.str(); + requestChunk.memory = requestPayload.c_str(); + requestChunk.size = requestPayload.size(); + + // Read all data using this function + curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, read_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_READDATA, (void *)&requestChunk); + + // Send all data to this function + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&responseChunk); + + // Send all headers to this function + curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, header_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)&headerChunk); + + // Configure headers + curl_slist *requestHeaders = NULL; + requestHeaders = curl_slist_append(requestHeaders, "Expect:"); + requestHeaders = curl_slist_append(requestHeaders, "Content-Type: text/xml"); + curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, requestHeaders); + + // Perform the HTTP PUT + curl_easy_setopt(curl_handle, CURLOPT_PUT, true); + curl_easy_setopt(curl_handle, CURLOPT_UPLOAD, true) ; + long size = (long)requestChunk.size; + curl_easy_setopt(curl_handle, CURLOPT_INFILESIZE, size); + + CURLcode rc = curl_easy_perform(curl_handle); + + curl_slist_free_all(requestHeaders); + + if (rc) + { + throwException(ServiceInvocationException, curl_easy_strerror(rc)); + } + + // Get the output and location of the created resource + string responsePayload = ""; + if (responseChunk.memory) + { + responsePayload = string((const char*)responseChunk.memory, responseChunk.size); + } + + long httprc; + curl_easy_getinfo (curl_handle, CURLINFO_RESPONSE_CODE, &httprc); + if (httprc != 200) + { + ostringstream msg; + msg << "Failed to update REST resource, HTTP code: " << httprc; + if (responsePayload != "") + { + msg << ", payload: " << responsePayload; + } + throwException(ServiceInvocationException, msg.str().c_str()); + } + } + else if (opName == "delete") + { + // HTTP DELETE + + // Build the request URL + bool firstParm = 0; + string uri; + if (operation.getNParms() !=0) + { + + // If the first parameter is a URI, then we'll use it, + // otherwise we'll use the binding URI + ostringstream s0; + writeParameter(xmlHelper, s0, operation.getParameter(0)); + string p0 = s0.str(); + if (p0.find("://") != string::npos) + { + firstParm = 1; + uri = p0; + } + else + { + uri = getBindingURI(); + } + } + else + { + uri = getBindingURI(); + } + // Add the parameters to the end of the URI + ostringstream os; + if (uri[uri.length()-1] == '?') + { + // If the URI ends with a "?" then we use the query + // form param=value& + os << uri; + for (unsigned int i = firstParm; i < operation.getNParms(); i++) + { + Operation::Parameter param = operation.getParameter(i); + + if(param.hasName()) + { + os << param.getName() << "="; + } + else + { + // No name - use "param1", etc + os << "param" << (i + 1) << "="; + } + writeParameter(xmlHelper, os, param); + if (i < operation.getNParms()-1) + os << "&"; + } + } + else + { + // Add the parameters in the form + // value1 / value2 / value3 + os << uri; + for (unsigned int i = firstParm; i < operation.getNParms(); i++) + { + os << "/"; + writeParameter(xmlHelper, os, operation.getParameter(i)); + } + } + + string url = os.str(); + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + + // Send all data to this function + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&responseChunk); + + // Send all headers to this function + curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, header_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)&headerChunk); + + // Perform the HTTP DELETE + curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "DELETE"); + CURLcode rc = curl_easy_perform(curl_handle); + if (rc) + { + throwException(ServiceInvocationException, curl_easy_strerror(rc)); + } + + // Get the output data out of the returned document + string responsePayload = ""; + if (responseChunk.memory) + { + responsePayload = string((const char*)responseChunk.memory, responseChunk.size); + } + + long httprc; + curl_easy_getinfo (curl_handle, CURLINFO_RESPONSE_CODE, &httprc); + if (httprc != 200) + { + ostringstream msg; + msg << "Failed to delete REST resource, HTTP code: " << httprc; + if (responsePayload != "") + { + msg << ", payload: " << responsePayload; + } + throwException(ServiceInvocationException, msg.str().c_str()); + } + } + else + { + string msg = "Unknown REST verb: " + opName; + throwException(ServiceInvocationException, msg.c_str()); + } + } + else + { + // Not a REST interface, XML / HTTP command style + curl_slist *requestHeaders = NULL; + struct curl_httppost *formpost = NULL; + ostringstream spayload; + string requestPayload; + string url; + + // If the request contains complex content then we'll use + // a POST, otherwise we use a GET with a query string + bool complexContent = false; + for (unsigned int i=0; i<operation.getNParms(); i++) + { + if (operation.getParameter(i).getType() == Operation::DATAOBJECT) + { + complexContent = true; + break; + } + } + + if (complexContent) + { + // Set the target URL + string uri = getBindingURI(); + ostringstream os; + os << uri << "/" << opName; + url = os.str(); + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + + // Disable the 100 continue handshake + requestHeaders = curl_slist_append(requestHeaders, "Expect:"); + + if (operation.getNParms() == 1) + { + // Single parameter, send it as the body of the POST + + // Create the input payload + writeParameter(xmlHelper, spayload, operation.getParameter(0)); + requestPayload = spayload.str(); + requestChunk.memory = requestPayload.c_str(); + requestChunk.size = requestPayload.size(); + + curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, requestChunk.size); + + // Read all data using this function + curl_easy_setopt(curl_handle, CURLOPT_READFUNCTION, read_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_READDATA, (void *)&requestChunk); + + // Set the content type + requestHeaders = curl_slist_append(requestHeaders, "Content-Type: text/xml"); + + // This will be a POST + curl_easy_setopt(curl_handle, CURLOPT_POST, true); + } + else + { + + // Multiple parameters, use a form type POST + struct curl_httppost *lastptr = NULL; + for (unsigned int i=0; i<operation.getNParms(); i++) + { + ostringstream pname; + Operation::Parameter param = operation.getParameter(i); + + if(param.hasName()) + { + pname << param.getName(); + } + else + { + // No name - use "param1", etc + pname << "param" << (i+1); + } + + const char* ctype; + if (param.getType() == Operation::DATAOBJECT) + { + ctype ="text/xml"; + } + else + { + ctype = "text/plain"; + } + + ostringstream pvalue; + writeParameter(xmlHelper, pvalue, param); + + curl_formadd(&formpost, + &lastptr, + CURLFORM_CONTENTTYPE, ctype, + CURLFORM_COPYNAME, pname.str().c_str(), + CURLFORM_COPYCONTENTS, pvalue.str().c_str(), + CURLFORM_END); + } + + // Set the form into the request + curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, formpost); + } + } + else + { + + // Build the request URL, uri / opName ? params + string uri = getBindingURI(); + ostringstream os; + os << uri << "/" << opName; + + // Add the parameters to the end of the URL in the form + // param=value& + for (unsigned int i=0; i<operation.getNParms(); i++) + { + if (i == 0) + os << "?"; + + Operation::Parameter param = operation.getParameter(i); + if(param.hasName()) + { + os << param.getName() << "="; + } + else + { + // No name - use "param1", etc + os << "param" << (i + 1) << "="; + } + writeParameter(xmlHelper, os, param); + if (i < operation.getNParms()-1) + os << "&"; + } + + url = os.str(); + loginfo("RESTServiceWrapper: HTTP GET %s", url.c_str()); + + curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str()); + } + + // Send all data to this function + curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + + // Pass our 'chunk' struct to the callback function + curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&responseChunk); + + // Configure the headers + if (requestHeaders) + { + curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, requestHeaders); + } + + loginfo("RESTServiceWrapper: Performing HTTP request"); + // Perform the HTTP request + CURLcode rc = curl_easy_perform(curl_handle); + + loginfo("RESTServiceWrapper: Completed HTTP request"); + // Free any headers + if (requestHeaders) + { + curl_slist_free_all(requestHeaders); + } + + // Cleanup the form + if (complexContent) + { + curl_formfree(formpost); + } + + if (rc) + { + throwException(ServiceInvocationException, curl_easy_strerror(rc)); + } + + if (responseChunk.memory) + { + string responsePayload((const char*)responseChunk.memory, responseChunk.size); + + + loginfo("RESTServiceWrapper: responsePayload: %s", responsePayload.c_str()); + + //TODO Remove this workaround once SDO supports loading of open top level content + // The workaround is to wrap the open content in a wrapper element + string xmldecl; + string xml; + Utils::rTokeniseString("?>", responsePayload, xmldecl, xml); + string part = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + part += "<Part xmlns=\"http://tempuri.org\" xmlns:tns=\"http://tempuri.org\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; + part += xml; + part += "\n</Part>"; + + setReturn(xmlHelper, part, operation); + } + } + + // Cleanup curl session + curl_easy_cleanup(curl_handle); + } + + + const string RESTServiceWrapper::getBindingURI() + { + string bindingURI = ""; + + // Get the binding URI configured on the top level component + Service* service = getService(); + CompositeReference* compositeReference = (CompositeReference*)service->getComponent(); + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + Component* component = runtime->getDefaultComponent(); + Reference* reference = component->findReference(compositeReference->getName()); + if (reference != NULL) + { + ReferenceBinding* binding = reference->getBinding(); + if (binding != NULL && binding->getURI() != "") + { + bindingURI = binding->getURI(); + } + } + if (bindingURI == "") + { + // Get the binding URI configured on the binding + RESTServiceBinding* binding = (RESTServiceBinding *)service->getBinding(); + bindingURI = binding->getURI(); + } + if (bindingURI != "") + { + + // Prepend the default base URI if the URI is not absolute + if (bindingURI.find("://") == string::npos) + { + bindingURI = runtime->getDefaultBaseURI() + string("/rest/") + bindingURI; + } + } + return bindingURI; + } + + + void RESTServiceWrapper::writeParameter(XMLHelperPtr xmlHelper, ostringstream& os, const Operation::Parameter& parm) + { + logentry(); + + switch(parm.getType()) + { + case Operation::BOOL: + { + os << *(bool*)parm.getValue(); + break; + } + case Operation::SHORT: + { + os << *(short*)parm.getValue(); + break; + } + case Operation::INT: + { + os << *(long*)parm.getValue(); + break; + } + case Operation::LONG: + { + os << *(long*)parm.getValue(); + break; + } + case Operation::USHORT: + { + os << *(short*)parm.getValue(); + break; + } + case Operation::UINT: + { + os << *(long*)parm.getValue(); + break; + } + case Operation::ULONG: + { + os << *(long*)parm.getValue(); + break; + } + case Operation::FLOAT: + { + os << *(float*)parm.getValue(); + break; + } + case Operation::DOUBLE: + { + os << *(long double*)parm.getValue(); + break; + } + case Operation::LONGDOUBLE: + { + os << *(long double*)parm.getValue(); + break; + } + case Operation::CHARS: + { + os << *(char**)parm.getValue(); + break; + } + case Operation::STRING: + { + os << (*(string*)parm.getValue()).c_str(); + break; + } + case Operation::DATAOBJECT: + { + DataObjectPtr dob = *(DataObjectPtr*)parm.getValue(); + XMLDocumentPtr doc = xmlHelper->createDocument(dob, NULL, NULL); + xmlHelper->save(doc, os); + break; + } + default: + { + break; + } + } + } + + void RESTServiceWrapper::setReturn(XMLHelperPtr xmlHelper, string& payload, + Operation& operation) + { + logentry(); + + //TODO Remove this workaround once SDO supports loading of open top level content + // The workaround is to wrap the open content in a wrapper element + string xmldecl; + string xml; + Utils::rTokeniseString("?>", payload, xmldecl, xml); + string body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + body += "<Wrapper xmlns=\"http://tempuri.org\" xmlns:tns=\"http://tempuri.org\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; + body += xml; + body += "\n</Wrapper>"; + + // Convert the body to an SDO DataObject + DataObjectPtr outputWrapperDataObject = NULL; + XMLDocumentPtr theXMLDocument = xmlHelper->load(body.c_str(), NULL); + if (theXMLDocument != 0) + { + outputWrapperDataObject = theXMLDocument->getRootDataObject(); + } + if(!outputWrapperDataObject) + { + ostringstream msg; + msg << "Could not convert received document to SDO: " << body; + throwException(ServiceDataException, msg.str().c_str()); + } + + // Get the body part + DataObjectPtr outputDataObject = NULL; + PropertyList bpl = outputWrapperDataObject->getInstanceProperties(); + if (bpl.size()!=0) + { + if (bpl[0].isMany()) + { + DataObjectList& parts = outputWrapperDataObject->getList((unsigned int)0); + outputDataObject = parts[0]; + } + else + { + outputDataObject = outputWrapperDataObject->getDataObject(bpl[0]); + } + } + if (outputDataObject == NULL) + { + ostringstream msg; + msg << "Could not convert body part to SDO: " << body; + throwException(ServiceDataException, msg.str().c_str()); + } + + PropertyList pl = outputDataObject->getInstanceProperties(); + unsigned int i = 0; + + switch(pl[i].getTypeEnum()) + { + case Type::BooleanType: + { + bool* boolData = new bool; + *boolData = outputDataObject->getBoolean(pl[i]); + operation.setReturnValue(boolData); + } + break; + case Type::ByteType: + { + char* byteData = new char; + *byteData = outputDataObject->getByte(pl[i]); + operation.setReturnValue(byteData); + } + break; + case Type::BytesType: + { + int len = outputDataObject->getLength(pl[i]); + char* bytesData = new char[len+1]; + int bytesWritten = outputDataObject->getBytes(pl[i], bytesData, len); + // Ensure the bytes end with the null char. Not sure if this is neccessary + if(bytesWritten <= len) + { + bytesData[bytesWritten] = 0; + } + else + { + bytesData[len] = 0; + } + operation.setReturnValue(&bytesData); + } + break; + case Type::CharacterType: + { + // This code should work but won't be used as there is no mapping from an XSD type to the SDO CharacterType + wchar_t* charData = new wchar_t; + *charData = outputDataObject->getCharacter(pl[i]); + operation.setReturnValue(charData); + } + break; + case Type::DoubleType: + { + long double* doubleData = new long double; + *doubleData = outputDataObject->getDouble(pl[i]); + operation.setReturnValue(doubleData); + } + break; + case Type::FloatType: + { + float* floatData = new float; + *floatData = outputDataObject->getFloat(pl[i]); + operation.setReturnValue(floatData); + } + break; + case Type::IntType: + { + long* intData = new long; + *intData = outputDataObject->getInt(pl[i]); + operation.setReturnValue(intData); + } + break; + case Type::ShortType: + { + short* shortData = new short; + *shortData = outputDataObject->getShort(pl[i]); + operation.setReturnValue(shortData); + } + break; + case Type::StringType: + { + string* str = new string(outputDataObject->getCString(pl[i])); + operation.setReturnValue(str); + } + break; + case Type::DataObjectType: + { + if (!strcmp(pl[0].getType().getURI(), SDOUtils::sdoURI) && + !strcmp(pl[0].getType().getName(), "OpenDataObject")) { + + /* + * This code deals with xsd:any element parameters + * Get each element as a DataObject and add in to the parameter list + */ + DataObjectList& dataObjectList = outputDataObject->getList(pl[i]); + + for(unsigned int j=0; j<dataObjectList.size(); j++) + { + DataObjectPtr dob = dataObjectList[j]; + if(!dob) + { + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = NULL; + operation.setReturnValue(dataObjectData); + loginfo("Null OpenDataObject return value"); + } + else + { + + SequencePtr sequence = dob->getSequence(); + if (sequence->size()!=0) + { + // Return a text element + if (sequence->isText(0)) + { + string* stringData = new string(sequence->getCStringValue(0)); + operation.setReturnValue(stringData); + } + else + { + // Return a DataObject representing a complex element + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = sequence->getDataObjectValue(0); + if(!*dataObjectData) + { + loginfo("Null DataObject return value"); + } + else + { + (*dataObjectData)->detach(); + } + operation.setReturnValue(dataObjectData); + } + } + else + { + // Empty content, add an empty string + loginfo("Null OpenDataObject return value"); + string *stringData = new string(""); + operation.setReturnValue(stringData); + } + } + } + } + else { + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = outputDataObject->getDataObject(pl[i]); + if(!*dataObjectData) + { + loginfo("Null SDO DataObject return value"); + } + else + { + (*dataObjectData)->detach(); + } + operation.setReturnValue(dataObjectData); + } + } + break; + default: + { + ostringstream msg; + msg << "Unsupported result type: " << pl[i].getTypeEnum(); + throwException(ServiceDataException, msg.str().c_str()); + } + } + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceWrapper.h new file mode 100644 index 0000000000..42e136a5d4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/RESTServiceWrapper.h @@ -0,0 +1,90 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_rest_restservicewrapper_h +#define tuscany_sca_extension_rest_restservicewrapper_h + +#include <sstream> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + + namespace rest + { + + class RESTServiceWrapper : public ServiceWrapper + { + public: + + /** + * Constructor. + * @param target The service wrapper represents a Web service. + */ + RESTServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor + */ + virtual ~RESTServiceWrapper(); + + /** + * All business method calls on the target service are performed through + * this invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target service. + */ + virtual void invoke(Operation& operation); + + private: + + /** + * Used to track initialization of the CURL library + */ + static bool initialized; + + /** + * Get the configured binding URI + */ + const std::string getBindingURI(); + + /** + * Write a parameter into a URL + */ + void writeParameter(commonj::sdo::XMLHelperPtr xmlHelper, std::ostringstream& os, const Operation::Parameter& parm); + + /** + * Set the return value on the given operation + */ + void setReturn(commonj::sdo::XMLHelperPtr xmlHelper, std::string& payload, Operation& operation); + + }; + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_rest_restservicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/model/RESTServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/model/RESTServiceBinding.cpp new file mode 100644 index 0000000000..72701bfa65 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/model/RESTServiceBinding.cpp @@ -0,0 +1,59 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/rest/model/RESTServiceBinding.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/rest/RESTServiceWrapper.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + // Constructor + RESTServiceBinding::RESTServiceBinding(Service* service, const string& uri) + : ServiceBinding(service, uri) + { + logentry(); + + serviceWrapper = new RESTServiceWrapper(service); + } + + // Destructor + RESTServiceBinding::~RESTServiceBinding() + { + logentry(); + } + + ServiceWrapper* RESTServiceBinding::getServiceWrapper() + { + logentry(); + + return serviceWrapper; + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/model/RESTServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/model/RESTServiceBinding.h new file mode 100644 index 0000000000..d19bcdacf5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/reference/curl/src/tuscany/sca/rest/model/RESTServiceBinding.h @@ -0,0 +1,76 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_rest_model_restservicebinding_h +#define tuscany_sca_extension_rest_model_restservicebinding_h + +#include <string> + +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/Service.h" + +namespace tuscany +{ + namespace sca + { + namespace rest + { + /** + * Information about a REST binding for a service or a reference. + */ + class RESTServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + */ + RESTServiceBinding(tuscany::sca::model::Service* service, const std::string& uri); + + /** + * Destructor. + */ + virtual ~RESTServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#RESTBinding"; }; + + /** + * Create a wrapper for the service configured by this + * binding. + */ + virtual ServiceWrapper* getServiceWrapper(); + + private: + + /** + * The wrapper for the service configured by this binding. + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_rest_model_restservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/Makefile.am new file mode 100644 index 0000000000..2ecfda6c6c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = httpd
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/Makefile.am new file mode 100644 index 0000000000..f963effea2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/Makefile.am new file mode 100644 index 0000000000..e5b3ce85bd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/Makefile.am @@ -0,0 +1,42 @@ +libdir=$(prefix)/extensions/rest/service/lib +lib_LTLIBRARIES = \ +libtuscany_sca_rest_service.la \ +libtuscany_sca_mod_rest.la + +noinst_HEADERS = \ +tuscany/sca/rest/*.h \ +tuscany/sca/rest/model/*.h + +libtuscany_sca_rest_service_la_SOURCES = \ +tuscany/sca/rest/RESTReferenceBindingExtension.cpp \ +tuscany/sca/rest/model/RESTReferenceBinding.cpp \ +tuscany/sca/rest/RESTServiceProxy.cpp + +libtuscany_sca_rest_service_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L$(top_builddir)/runtime/extensions/rest/interface/src -ltuscany_sca_rest_interface + +rootdir=$(prefix)/extensions/rest/service + +libtuscany_sca_mod_rest_la_SOURCES = \ +tuscany/sca/rest/ModREST.cpp + +libtuscany_sca_mod_rest_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L$(top_builddir)/runtime/extensions/rest/service/httpd/src -ltuscany_sca_rest_service \ + -L$(top_builddir)/runtime/extensions/rest/interface/src -ltuscany_sca_rest_interface + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I$(top_builddir)/runtime/extensions/rest/interface/src \ + -I${TUSCANY_SDOCPP}/include \ + -I${HTTPD_INCLUDE} -I${APR_INCLUDE} + +moduledir=$(prefix)/extensions/rest/service/module +extension = libtuscany_sca_rest_service$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp new file mode 100644 index 0000000000..4a63991515 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/ModREST.cpp @@ -0,0 +1,1372 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * 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. + */ + +#include <sstream> + +#include "apr_strings.h" +#include "apr_fnmatch.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "ap_config.h" +#include "httpd.h" + +// This section removes the windows/httpd build error "strtoul_is_not_a_portable_function_use_strtol_instead" +#if defined(WIN32) || defined (_WINDOWS) +#ifdef strtoul +#undef strtoul +#endif +#define strtoul strtoul +#endif + +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_script.h" +#include "util_md5.h" + +#include "mod_core.h" + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Logging.h" +#include "RESTServiceProxy.h" +#include "model/RESTReferenceBinding.h" +#include "tuscany/sca/rest/model/RESTInterface.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/CompositeService.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "tuscany/sca/model/WSDLMessagePart.h" +#include "tuscany/sca/model/WSDLInterface.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + + +extern "C" +{ + extern module AP_MODULE_DECLARE_DATA sca_rest_module; +} + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + typedef struct rest_server_config_rec + { + char * home; + } rest_server_config_rec_t; + + typedef struct rest_dir_config_rec + { + char * root; + char * path; + char * base_uri; + char * component; + } rest_dir_config_rec_t; + + CompositeService* initializeSCARuntime(const char* home, const char* root, + const char* path, const char* baseURI, const char *component, const char* service); + + DataObjectPtr createPayload(DataFactoryPtr dataFactory, + Operation& operation, const WSDLOperation& wsdlOperation); + + void addPart(XMLHelperPtr xmlHelper, string& payload, Operation& operation); + + int logHeaders(void* request, const char* key, const char* value); + + /** + * Initialize the SCA runtime + */ + CompositeService* initializeSCARuntime(const char* home, const char* root, + const char* path, const char* baseURI, const char *component, const char* service) + { + logentry(); + loginfo("Home: %s", home); + loginfo("Root: %s", root); + loginfo("Path: %s", path); + loginfo("Base URI: %s", baseURI); + loginfo("Component: %s", component); + loginfo("Service: %s", service); + + try + { + SCARuntime* runtime = SCARuntime::initializeSharedRuntime(home, root, path, baseURI); + + string componentName; + if (strlen(component)) + { + componentName = component; + } + else + { + componentName = runtime->getDefaultComponentName(); + } + string serviceName = service; + + loginfo("Resolving composite: %s, service: %s", componentName.c_str(), serviceName.c_str()); + Component* compositeComponent = runtime->getSystem()->findComponent(componentName); + if (compositeComponent == NULL) + { + string msg = "Component not found " + componentName; + throwException(SystemConfigurationException, msg.c_str()); + } + runtime->setDefaultComponent(compositeComponent); + + Composite* composite = (Composite*)compositeComponent->getType(); + CompositeService* compositeService = (CompositeService*)composite->findComponent(serviceName); + if (compositeService == NULL) + { + string msg = "Composite service not found " + serviceName; + throwException(SystemConfigurationException, msg.c_str()); + } + + return compositeService; + } + catch(TuscanyRuntimeException &ex) + { + ostringstream msg; + msg << ex; + logerror("Failed to initialize SCA runtime: %s", msg.str().c_str()); + throw; + } + } + + bool printRequest = false; + + int logHeaders(void* request, const char* key, const char* value) + { + loginfo("Header key: %s, value: %s", key, value); + if (printRequest) + { + ap_rprintf((request_rec*)request, "<br>Header key: %s, value: %s", key, value); + } + return 1; + } + + int rest_handler(request_rec *request) + { + logentry(); + + if (strcmp(request->handler, "sca_rest_module")) + { + return DECLINED; + } + + try { + + // Set up the read policy + int rc = ap_setup_client_block(request, REQUEST_CHUNKED_DECHUNK); + if (rc != OK) + { + return rc; + } + ap_should_client_block(request); + if (request->read_chunked == true && request->remaining == 0) + { + request->chunked = true; + } + + apr_table_setn(request->headers_out, "Connection", "close"); + + if (printRequest) + { + // Set the content type + ap_set_content_type(request, "text/html"); + + // Send the response document + ap_rputs("<html><body><p>Tuscany Mod_rest works!", request); + } + + rest_server_config_rec_t* server_conf = (rest_server_config_rec_t*)ap_get_module_config(request->server->module_config, &sca_rest_module); + loginfo("Tuscany home: %s", server_conf->home); + if (printRequest) + { + ap_rprintf(request, "<p>Tuscany home: %s", server_conf->home); + } + + rest_dir_config_rec_t* dir_conf = (rest_dir_config_rec_t*)ap_get_module_config(request->per_dir_config, &sca_rest_module); + loginfo("Tuscany root: %s", dir_conf->root); + if (printRequest) + { + ap_rprintf(request, "<p>Tuscany root: %s", dir_conf->root); + } + loginfo("Tuscany path: %s", dir_conf->path); + if (printRequest) + { + ap_rprintf(request, "<p>Tuscany path: %s", dir_conf->path); + } + loginfo("SCA component: %s", dir_conf->component); + if (printRequest) + { + ap_rprintf(request, "<p>SCA component: %s", dir_conf->component); + } + + if (request->protocol) + { + loginfo("Protocol: %s", request->protocol); + if (printRequest) + { + ap_rprintf(request, "<p>Protocol: %s", request->protocol); + } + } + + if (request->method) + { + loginfo("HTTP method: %s", request->method); + if (printRequest) + { + ap_rprintf(request, "<p>HTTP method: %s", request->method); + } + } + + loginfo("HTTP method number: %d", request->method_number); + if (printRequest) + { + ap_rprintf(request, "<p>HTTP method number: %d", request->method_number); + } + + const char* content_type = apr_table_get(request->headers_in, "Content-Type"); + if (content_type) + { + loginfo("Content type: %s", content_type); + if (printRequest) + { + ap_rprintf(request, "<p>Content type: %s", content_type); + } + } + else + { + content_type = "text/plain"; + } + + if (request->content_encoding) + { + loginfo("Content encoding: %s", request->content_encoding); + if (printRequest) + { + ap_rprintf(request, "<p>Content encoding: %s", request->content_encoding); + } + } + + if (printRequest) + { + ap_rputs("<p>", request); + } + apr_table_do(logHeaders, request, request->headers_in, NULL); + + if (request->uri) + { + loginfo("URI: %s", request->uri); + if (printRequest) + { + ap_rprintf(request, "<p>URI: %s", request->uri); + } + } + + if (request->path_info) + { + loginfo("Path info: %s", request->path_info); + if (printRequest) + { + ap_rprintf(request, "<p>Path info: %s", request->path_info); + } + } + + if (request->args) + { + loginfo("Args: %s", request->args); + if (printRequest) + { + ap_rprintf(request, "<p>Args: %s", request->args); + } + } + + if (printRequest) + { + ap_rputs("</body></html>", request); + } + + // Extract the service and component names from the HTTP URI path + string path; + if (strlen(request->path_info) != 0 && *(request->path_info) == '/') + { + path = request->path_info + 1; + } + else + { + path = request->path_info; + } + string uri; + + string component; + string service; + if (strlen(dir_conf->component)) + { + // The path only specifies the service, the component name + // is configured in the directory/location configured + component = dir_conf->component; + Utils::tokeniseString("/", path, service, uri); + } + else + { + // The path must be in the form component / service + string path2; + Utils::tokeniseString("/", path, component, path2); + Utils::tokeniseString("/", path2, service, uri); + } + + loginfo("Component name: %s", component.c_str()); + loginfo("Service name: %s", service.c_str()); + + // Initialize the SCA runtime + CompositeService* compositeService = initializeSCARuntime( + server_conf->home, dir_conf->root, dir_conf->path, dir_conf->base_uri, component.c_str(), service.c_str()); + + if(!compositeService) + { + throwException(SystemConfigurationException, + "Failed to initialize SCA runtime, could not initialize CompositeService"); + } + + Composite* composite = compositeService->getComposite(); + DataFactoryPtr dataFactory = composite->getDataFactory(); + if (dataFactory == 0) + { + throwException(SystemConfigurationException, + "Failed to initialize SCA runtime, could not get DataFactory"); + } + XMLHelperPtr xmlHelper = composite->getXMLHelper(); + + // Get the REST binding + Reference* reference = compositeService->getReference(); + RESTReferenceBinding* binding = (RESTReferenceBinding*)reference->getBinding(); + + // Get the REST proxy + RESTServiceProxy* proxy = (RESTServiceProxy*)binding->getServiceProxy(); + + // Get the component interface + Interface* iface = reference->getType()->getInterface(); + + if (request->method_number == M_GET) + { + // Handle an HTTP GET + + // Determine the operation to invoke + WSDLOperation wsdlOperation; + string wsdlNamespace = ""; + string op_name = ""; + string uriArgs = ""; + if (iface != NULL) + { + // If we have a REST interface, the operation name is "retrieve" + if (iface->getInterfaceTypeQName() == RESTInterface::typeQName) + { + op_name = "retrieve"; + uriArgs = uri; + } + else if (iface->getInterfaceTypeQName() == WSDLInterface::typeQName) + { + // we have a WSDL interface, the operation name is part of the URI + Utils::tokeniseString("/", uri, op_name, uriArgs); + + // look for the WSDL operation definition + WSDLInterface* wsdlInterface = (WSDLInterface*)iface; + wsdlNamespace = wsdlInterface->getNamespaceURI(); + + if (wsdlNamespace != "") + { + WSDLDefinition* wsdl = composite->findWSDLDefinition(wsdlNamespace); + if (wsdl == 0) + { + string msg = "WSDL not found for: " + wsdlNamespace; + throwException(SystemConfigurationException, msg.c_str()); + } + try + { + wsdlOperation = wsdl->findOperation(wsdlInterface->getName(), op_name.c_str()); + } + catch(SystemConfigurationException&) + { + throw; + } + + if (!wsdlOperation.isDocumentStyle() || !wsdlOperation.isWrappedStyle()) + { + throwException(ServiceInvocationException, + "Only wrapped document style WSDL operations are currentlysupported"); + } + } + } + } + else + { + Utils::tokeniseString("/", uri, op_name, uriArgs); + } + + // Create a default document literal wrapped WSDL operation + if (wsdlNamespace == "") + { + WSDLMessagePart inPart(op_name, "", "http://tempuri.org"); + WSDLMessagePart outPart((op_name+"Response"), "", "http://tempuri.org"); + wsdlNamespace = compositeService->getName(); + wsdlOperation = WSDLOperation(); + wsdlOperation.setOperationName(op_name.c_str()); + wsdlOperation.setSoapAction(wsdlNamespace+ "#" +op_name); + wsdlOperation.setEndpoint(""); + wsdlOperation.setSoapVersion(WSDLOperation::SOAP11); + wsdlOperation.setDocumentStyle(true); + wsdlOperation.setWrappedStyle(true); + wsdlOperation.setInputEncoded(false); + wsdlOperation.setOutputEncoded(false); + wsdlOperation.setInputMessagePart(op_name, inPart); + wsdlOperation.setOutputMessagePart((op_name+"Response"), outPart); + } + + // Create the input DataObject + Operation operation(op_name.c_str()); + + // Parse the args part of the URI + if (uriArgs != "") + { + string args = uriArgs; + for (; args != ""; ) + { + string param; + string next; + Utils::tokeniseString("/", args, param, next); + if (param != "") + { + string* data = new string; + *data = param; + operation.addParameter(data); + } + args = next; + } + } + + // Parse the query string + if (request->args) + { + string query = request->args; + for (; query != ""; ) + { + string param; + string next; + Utils::tokeniseString("&", query, param, next); + if (param != "") + { + string n; + string* data = new string; + Utils::tokeniseString("=", param, n, *data); + operation.addParameter(data); + } + query = next; + } + } + DataObjectPtr inputDataObject = createPayload(dataFactory, operation, wsdlOperation); + + // Dispatch to the REST proxy + DataObjectPtr outputDataObject = proxy->invoke(wsdlOperation, inputDataObject); + + // Send the output DataObject + if (iface!=NULL && + iface->getInterfaceTypeQName() == RESTInterface::typeQName) + { + if (outputDataObject == NULL) + { + throwException(ServiceInvocationException, "Null output from REST create operation"); + } + else + { + + // Pure REST, send the response document + XMLHelperPtr xm = HelperProvider::getXMLHelper(dataFactory); + DataObjectList& l = outputDataObject->getList("return"); + if (l.size() != 0) + { + DataObjectPtr resourceDataObject = l[0]; + XMLDocumentPtr doc = xm->createDocument( + resourceDataObject, + resourceDataObject->getType().getURI(), + resourceDataObject->getType().getName()); + char* str = xm->save(doc); + + // Calculate an Etag hash for the response + char* etag = ap_md5(request->pool, (const unsigned char*)str); + + // Handle a conditional GET, if the etag matches the etag + // sent by the client, we don't need to send the whole response + const char* match = apr_table_get(request->headers_in, "If-None-Match"); + if (match != NULL && !strcmp(etag, match)) + { + loginfo("REST resource matches ETag, sending HTTP 304 response code"); + request->status = HTTP_NOT_MODIFIED; + } + else + { + loginfo("Sending response: %s", str); + ap_set_content_type(request, "text/xml"); + apr_table_setn(request->headers_out, "ETag", etag); + + // Send an Etag header to allow caching and + // conditional gets + apr_table_setn(request->headers_out, "ETag", etag); + + ap_rputs(str, request); + } + } + else + { + loginfo("REST resource not found, sending HTTP 404 response code"); + request->status = HTTP_NOT_FOUND; + + return OK; + } + } + } + else + { + // Command style, send the response wrapper element + + if (outputDataObject == NULL) + { + loginfo("Sending empty response"); + //request->status = HTTP_NO_CONTENT; + } + else + { + XMLHelperPtr xm = HelperProvider::getXMLHelper(dataFactory); + DataObjectList& l = outputDataObject->getList("return"); + if (l.size() != 0) + { + DataObjectPtr resultDataObject = l[0]; + XMLDocumentPtr doc = xm->createDocument( + resultDataObject, + resultDataObject->getType().getURI(), + resultDataObject->getType().getName()); + char* str = xm->save(doc); + + loginfo("Sending response: %s", str); + ap_set_content_type(request, "text/xml"); + ap_rputs(str, request); + } + else + { + loginfo("Sending empty response"); + //request->status = HTTP_NO_CONTENT; + } + } + } + + return OK; + } + else if (request->method_number == M_POST) + { + // Handle an HTTP POST + + // Determine the operation to invoke + WSDLOperation wsdlOperation; + string wsdlNamespace = ""; + string op_name = ""; + string uriArgs = ""; + if (iface != NULL) + { + // If we have a REST interface, the operation name is "create" + if (iface->getInterfaceTypeQName() == RESTInterface::typeQName) + { + op_name = "create"; + } + else if (iface->getInterfaceTypeQName() == WSDLInterface::typeQName) + { + // we have a WSDL interface, the operation name is part of the URI + Utils::tokeniseString("/", uri, op_name, uriArgs); + + // look for the WSDL operation definition + WSDLInterface* wsdlInterface = (WSDLInterface*)iface; + wsdlNamespace = wsdlInterface->getNamespaceURI(); + + if (wsdlNamespace != "") + { + WSDLDefinition* wsdl = composite->findWSDLDefinition(wsdlNamespace); + if (wsdl == 0) + { + string msg = "WSDL not found for: " + wsdlNamespace; + throwException(SystemConfigurationException, msg.c_str()); + } + try + { + wsdlOperation = wsdl->findOperation(wsdlInterface->getName(), op_name.c_str()); + } + catch(SystemConfigurationException&) + { + throw; + } + + if (!wsdlOperation.isDocumentStyle() || !wsdlOperation.isWrappedStyle()) + { + throwException(ServiceInvocationException, + "Only wrapped document style WSDL operations are currentlysupported"); + } + } + } + } + else + { + Utils::tokeniseString("/", uri, op_name, uriArgs); + } + + // Create a default document literal wrapped WSDL operation + if (wsdlNamespace == "") + { + WSDLMessagePart inPart(op_name, "", "http://tempuri.org"); + WSDLMessagePart outPart((op_name+"Response"), "", "http://tempuri.org"); + wsdlNamespace = compositeService->getName(); + wsdlOperation = WSDLOperation(); + wsdlOperation.setOperationName(op_name.c_str()); + wsdlOperation.setSoapAction(wsdlNamespace+ "#" +op_name); + wsdlOperation.setEndpoint(""); + wsdlOperation.setSoapVersion(WSDLOperation::SOAP11); + wsdlOperation.setDocumentStyle(true); + wsdlOperation.setWrappedStyle(true); + wsdlOperation.setInputEncoded(false); + wsdlOperation.setOutputEncoded(false); + wsdlOperation.setInputMessagePart(op_name, inPart); + wsdlOperation.setOutputMessagePart((op_name+"Response"), outPart); + } + + // Create the input DataObject + Operation operation(op_name.c_str()); + + // Parse the args part of the URI + if (uriArgs != "") + { + string args = uriArgs; + for (; args != ""; ) + { + string param; + string next; + Utils::tokeniseString("/", args, param, next); + if (param != "") + { + string* data = new string; + *data = param; + operation.addParameter(data); + } + args = next; + } + } + + // Parse the query string + if (request->args) + { + string query = request->args; + for (; query != ""; ) + { + string param; + string next; + Utils::tokeniseString("&", query, param, next); + if (param != "") + { + string n; + string* data = new string; + Utils::tokeniseString("=", param, n, *data); + operation.addParameter(data); + } + query = next; + } + } + + // Read the POST input + ostringstream sinput; + char buffer[2049]; + for ( ; ; ) + { + int size = ap_get_client_block(request, buffer, 2048); + if (size > 0) + { + buffer[size] = '\0'; + sinput << buffer; + } + else if (size == 0) + { + break; + } + else if (size < 0) + { + throwException(ServiceInvocationException, "Error reading POST input"); + } + } + string input = sinput.str(); + + string contentType = content_type; + if (contentType.find("multipart/form-data") == 0) + { + // This is a multipart POST, extract each part from the + // POST body + string begin; + string boundary; + Utils::tokeniseString("boundary=", contentType, begin, boundary); + + for (;;) + { + // Read each part + string part; + string next; + Utils::tokeniseString(boundary, input, part, next); + input = next; + + // Skip first and last empty parts + if (part.length() == 0 || part == "--") + continue; + + // Read headers + bool xml = false; + int empty = -1; + for (;;) + { + string header; + Utils::tokeniseString("\r\n", part, header, next); + part = next; + if (header == "") + { + // Two empty lines signal the beginning of the content + empty++; + if (empty == 1) + break; + } + else + { + empty = 0; + + // Detect XML content + if (header == "Content-Type: text/xml") + xml = true; + } + } + + // Read the part content + if (part.length()) + { + // Strip the trailer + string value; + Utils::tokeniseString("\r\n--", part, value, next); + + if (xml) + { + // Add an XML parameter to the operation + addPart(xmlHelper, value, operation); + } + else + { + // Add a text parameter to the operation + string* stringData = new string; + *stringData = value; + operation.addParameter(stringData); + } + } + + // Read till the end of the POST body + if (input.length() == 0) + break; + } + } + else + { + // The POST body represents a single part + addPart(xmlHelper, input, operation); + } + + DataObjectPtr inputDataObject = createPayload(dataFactory, operation, wsdlOperation); + + // Dispatch to the REST proxy + DataObjectPtr outputDataObject = proxy->invoke(wsdlOperation, inputDataObject); + + // Send the response back to the client + if (iface!=NULL && + iface->getInterfaceTypeQName() == RESTInterface::typeQName) + { + // Pure REST, send the location of the created resource + + if (outputDataObject == NULL) + { + throwException(ServiceInvocationException, "Null output from REST create operation"); + } + + string location = ""; + + DataObjectList& l = outputDataObject->getList("return"); + if (l.size()) + { + location = l.getCString(0); + } + + if (location == "") + { + loginfo("No resource location, sending HTTP 400 response code"); + request->status = HTTP_BAD_REQUEST; + + return OK; + } + + string locuri = request->uri; + locuri += '/'; + locuri += location; + + const char* loc = ap_construct_url(request->pool, locuri.c_str(), request); + loginfo("Sending resource location: %s", loc); + apr_table_setn(request->headers_out, "Location", loc); + apr_table_setn(request->headers_out, "Content-Location", loc); + request->status = HTTP_CREATED; + + // Send the created resource entity back to the client + ap_set_content_type(request, "text/xml"); + ap_rputs(input.c_str(), request); + + } + else + { + // Command style, send the response element + + if (outputDataObject == NULL) + { + loginfo("Sending empty response"); + //request->status = HTTP_NO_CONTENT; + } + else + { + XMLHelperPtr xm = HelperProvider::getXMLHelper(dataFactory); + DataObjectList& l = outputDataObject->getList("return"); + if (l.size() != 0) + { + DataObjectPtr resultDataObject = l[0]; + XMLDocumentPtr doc = xm->createDocument( + resultDataObject, + resultDataObject->getType().getURI(), + resultDataObject->getType().getName()); + char* str = xm->save(doc); + + loginfo("Sending response: %s", str); + ap_set_content_type(request, "text/xml"); + ap_rputs(str, request); + } + else + { + loginfo("Sending empty response"); + //request->status = HTTP_NO_CONTENT; + } + } + } + + return OK; + } + else if (request->method_number == M_PUT) + { + + // Handle an HTTP PUT + + // Determine the operation to invoke + WSDLOperation wsdlOperation; + string wsdlNamespace = ""; + string op_name = "update"; + string uriArgs = uri; + + // Create a default document literal wrapped WSDL operation + WSDLMessagePart inputPart(op_name, "", "http://tempuri.org"); + WSDLMessagePart outputPart((op_name+"Response"), "", "http://tempuri.org"); + wsdlNamespace = compositeService->getName(); + wsdlOperation = WSDLOperation(); + wsdlOperation.setOperationName(op_name.c_str()); + wsdlOperation.setSoapAction(wsdlNamespace+ "#" +op_name); + wsdlOperation.setEndpoint(""); + wsdlOperation.setSoapVersion(WSDLOperation::SOAP11); + wsdlOperation.setDocumentStyle(true); + wsdlOperation.setWrappedStyle(true); + wsdlOperation.setInputEncoded(false); + wsdlOperation.setOutputEncoded(false); + wsdlOperation.setInputMessagePart(op_name, inputPart); + wsdlOperation.setOutputMessagePart((op_name+"Response"), outputPart); + + // Create the input DataObject + Operation operation(op_name.c_str()); + + // Parse the args part of the URI + if (uriArgs != "") + { + string args = uriArgs; + for (; args != ""; ) + { + string param; + string next; + Utils::tokeniseString("/", args, param, next); + if (param != "") + { + string* data = new string; + *data = param; + operation.addParameter(data); + } + args = next; + } + } + + // Parse the query string + if (request->args) + { + string query = request->args; + for (; query != ""; ) + { + string param; + string next; + Utils::tokeniseString("&", query, param, next); + if (param != "") + { + string n; + string* data = new string; + Utils::tokeniseString("=", param, n, *data); + operation.addParameter(data); + } + query = next; + } + } + + // Read the PUT input + ostringstream sinput; + char buffer[2049]; + for ( ; ; ) + { + int size = ap_get_client_block(request, buffer, 2048); + if (size > 0) + { + buffer[size] = '\0'; + sinput << buffer; + } + else if (size == 0) + { + break; + } + else if (size < 0) + { + throwException(ServiceInvocationException, "Error reading PUT input"); + } + } + string input = sinput.str(); + addPart(xmlHelper, input, operation); + + DataObjectPtr inputDataObject = createPayload(dataFactory, operation, wsdlOperation); + + // Dispatch to the REST proxy + DataObjectPtr outputDataObject = proxy->invoke(wsdlOperation, inputDataObject); + + // Empty response + //request->status = HTTP_NO_CONTENT; + return OK; + } + else if (request->method_number == M_DELETE) + { + + // Determine the operation to invoke + WSDLOperation wsdlOperation; + string wsdlNamespace = ""; + string op_name = "delete"; + string uriArgs = uri; + + // Create a default document literal wrapped WSDL operation + WSDLMessagePart inPart(op_name, "", "http://tempuri.org"); + WSDLMessagePart outPart((op_name+"Response"), "", "http://tempuri.org"); + wsdlNamespace = compositeService->getName(); + wsdlOperation = WSDLOperation(); + wsdlOperation.setOperationName(op_name.c_str()); + wsdlOperation.setSoapAction(wsdlNamespace+ "#" +op_name); + wsdlOperation.setEndpoint(""); + wsdlOperation.setSoapVersion(WSDLOperation::SOAP11); + wsdlOperation.setDocumentStyle(true); + wsdlOperation.setWrappedStyle(true); + wsdlOperation.setInputEncoded(false); + wsdlOperation.setOutputEncoded(false); + wsdlOperation.setInputMessagePart(op_name, inPart); + wsdlOperation.setOutputMessagePart((op_name+"Response"), outPart); + + // Create the input DataObject + Operation operation(op_name.c_str()); + + // Parse the args part of the URI + if (uriArgs != "") + { + string args = uriArgs; + for (; args != ""; ) + { + string param; + string next; + Utils::tokeniseString("/", args, param, next); + if (param != "") + { + string* data = new string; + *data = param; + operation.addParameter(data); + } + args = next; + } + } + + // Parse the query string + if (request->args) + { + string query = request->args; + for (; query != ""; ) + { + string param; + string next; + Utils::tokeniseString("&", query, param, next); + if (param != "") + { + string n; + string* data = new string; + Utils::tokeniseString("=", param, n, *data); + operation.addParameter(data); + } + query = next; + } + } + + DataObjectPtr inputDataObject = createPayload(dataFactory, operation, wsdlOperation); + + // Dispatch to the REST proxy + DataObjectPtr outputDataObject = proxy->invoke(wsdlOperation, inputDataObject); + + // Empty response + //request->status = HTTP_NO_CONTENT; + return OK; + } + else + { + if (request->method) + { + logerror("Unsupported HTTP method: %s", request->method); + } + else + { + logerror("Unsupported HTTP method: %d", request->method_number); + } + return HTTP_NOT_IMPLEMENTED; + } + } + catch(TuscanyRuntimeException& ex) + { + ostringstream msg; + msg << ex; + logerror("Failed to process REST request: %s", msg.str().c_str()); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + DataObjectPtr createPayload(DataFactoryPtr dataFactory, Operation& operation, const WSDLOperation& wsdlOperation) + { + logentry(); + + DataObjectPtr inputDataObject; + string inputTypeUri; + string inputTypeName; + try + { + // Since its Document wrapped, there will only be one part + std::list<std::string> partList = wsdlOperation.getInputMessagePartNames(); + const WSDLMessagePart &inputMessage = + wsdlOperation.getInputMessagePart(partList.front()); + inputTypeName = inputMessage.getPartType(); + inputTypeUri = inputMessage.getPartUri(); + + // Create the input wrapper + const Type& rootType = dataFactory->getType(inputTypeUri.c_str(), "RootType"); + const Property& prop = rootType.getProperty(inputTypeName.c_str()); + const Type& inputType = prop.getType(); + inputDataObject = dataFactory->create(inputType); + } + catch (SDORuntimeException&) + { + try + { + // Create the input wrapper + const Type& inputType = + dataFactory->getType(inputTypeUri.c_str(), inputTypeName.c_str()); + inputDataObject = dataFactory->create(inputType); + } + catch (SDORuntimeException&) + { + + // The input wrapper type is not known, create an open DataObject + inputDataObject = dataFactory->create("http://tempuri.org", "Wrapper"); + } + } + + // Go through data object to set the input parameters + PropertyList pl = inputDataObject->getType().getProperties(); + + if(pl.size() == 0) + { + if(inputDataObject->getType().isOpenType() && inputDataObject->getType().isDataObjectType()) + { + /* + * This code deals with sending xsd:any elements + */ + for (int i=0; i<operation.getNParms(); i++) + { + ostringstream pname; + pname << "param" << (i+1); + DataObjectList& l = inputDataObject->getList(pname.str()); + + const Operation::Parameter& parm = operation.getParameter(i); + switch(parm.getType()) + { + case Operation::STRING: + { + l.append((*(string*)parm.getValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + l.append(*(DataObjectPtr*)parm.getValue()); + break; + } + default: + { + break; + } + } + } + } + } + else { + + // Each parameter in the operation should be a property on the request dataobject + for (unsigned int i=0; i<operation.getNParms(); i++) + { + const Operation::Parameter& parm = operation.getParameter(i); + switch(parm.getType()) + { + case Operation::STRING: + { + inputDataObject->setCString(i, (*(string*)parm.getValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + inputDataObject->setDataObject(i, *(DataObjectPtr*)parm.getValue()); + break; + } + default: + { + break; + } + } + } + } + + return inputDataObject; + } + + void addPart(XMLHelperPtr xmlHelper, string& payload, Operation& operation) + { + logentry(); + + + //TODO Remove this workaround once SDO supports loading of open top level content + // The workaround is to wrap the open content in a wrapper element + string xmldecl; + string xml; + Utils::rTokeniseString("?>", payload, xmldecl, xml); + string body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + body += "<Wrapper xmlns=\"http://tempuri.org\" xmlns:tns=\"http://tempuri.org\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"; + body += xml; + body += "\n</Wrapper>"; + + // Convert the body to an SDO DataObject + DataObjectPtr inputWrapperDataObject = NULL; + XMLDocumentPtr theXMLDocument = xmlHelper->load(body.c_str(), NULL); + if (theXMLDocument != 0) + { + inputWrapperDataObject = theXMLDocument->getRootDataObject(); + } + if(!inputWrapperDataObject) + { + ostringstream msg; + msg << "Could not convert received document to SDO: " << body; + throwException(ServiceDataException, msg.str().c_str()); + } + + // Get the body part + DataObjectPtr inputDataObject = NULL; + PropertyList bpl = inputWrapperDataObject->getInstanceProperties(); + if (bpl.size()!=0) + { + if (bpl[0].isMany()) + { + DataObjectList& parts = inputWrapperDataObject->getList((unsigned int)0); + inputDataObject = parts[0]; + } + else + { + inputDataObject = inputWrapperDataObject->getDataObject(bpl[0]); + } + } + if (inputDataObject == NULL) + { + ostringstream msg; + msg << "Could not convert received document to SDO: " << body; + throwException(ServiceDataException, msg.str().c_str()); + } + + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = inputDataObject; + (*dataObjectData)->detach(); + operation.addParameter(dataObjectData); + } + + const char *rest_set_home(cmd_parms *cmd, void *dummy, + const char *arg) + { + rest_server_config_rec_t *conf = (rest_server_config_rec_t*)ap_get_module_config( + cmd->server->module_config, &sca_rest_module); + conf->home = apr_pstrdup(cmd->pool, arg); + return NULL; + } + + const char *rest_set_path(cmd_parms *cmd, void *c, + const char *arg) + { + rest_dir_config_rec_t *conf = (rest_dir_config_rec_t*)c; + conf->path = apr_pstrdup(cmd->pool, arg); + return NULL; + } + + const char *rest_set_root(cmd_parms *cmd, void *c, + const char *arg) + { + rest_dir_config_rec_t *conf = (rest_dir_config_rec_t*)c; + conf->root = apr_pstrdup(cmd->pool, arg); + return NULL; + } + + const char *rest_set_base_uri(cmd_parms *cmd, void *c, + const char *arg) + { + rest_dir_config_rec_t *conf = (rest_dir_config_rec_t*)c; + conf->base_uri = apr_pstrdup(cmd->pool, arg); + return NULL; + } + + const char *rest_set_component(cmd_parms *cmd, void *c, + const char *arg) + { + rest_dir_config_rec_t *conf = (rest_dir_config_rec_t*)c; + conf->component = apr_pstrdup(cmd->pool, arg); + return NULL; + } + + const command_rec rest_module_cmds[] = + { + AP_INIT_TAKE1("TuscanyHome", (const char*(*)())tuscany::sca::rest::rest_set_home, NULL, RSRC_CONF, + "Tuscany home directory"), + AP_INIT_TAKE1("TuscanyPath", (const char*(*)())tuscany::sca::rest::rest_set_path, NULL, ACCESS_CONF, + "Tuscany SCA composite search path"), + AP_INIT_TAKE1("TuscanyRoot", (const char*(*)())tuscany::sca::rest::rest_set_root, NULL, ACCESS_CONF, + "Tuscany root SCA configuration path"), + AP_INIT_TAKE1("TuscanyBaseURI", (const char*(*)())tuscany::sca::rest::rest_set_base_uri, NULL, ACCESS_CONF, + "Tuscany SCA system base URI"), + AP_INIT_TAKE1("TuscanyComponent", (const char*(*)())tuscany::sca::rest::rest_set_component, NULL, ACCESS_CONF, + "SCA component name"), + {NULL} + }; + + int rest_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, + server_rec *s) + { + return OK; + } + + void rest_child_init(apr_pool_t* p, server_rec* svr_rec) + { + rest_server_config_rec_t *conf = (rest_server_config_rec_t*)ap_get_module_config( + svr_rec->module_config, &sca_rest_module); + + if(false) + { + fprintf(stderr, "[Tuscany] Due to one or more errors mod_rest loading" + " failed. Causing apache2 to stop loading\n"); + exit(APEXIT_CHILDFATAL); + } + } + + void register_hooks(apr_pool_t *p) + { + ap_hook_handler(rest_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(rest_init, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(rest_child_init, NULL, NULL, APR_HOOK_MIDDLE); + } + + void *rest_create_dir_config(apr_pool_t *p, char *dirspec) + { + rest_dir_config_rec_t* conf = (rest_dir_config_rec_t* )apr_palloc(p, sizeof(*conf)); + conf->path = ""; + conf->root = ""; + conf->base_uri = ""; + conf->component = ""; + return conf; + } + + void* rest_create_server_config(apr_pool_t *p, server_rec *s) + { + rest_server_config_rec_t* conf = (rest_server_config_rec_t* )apr_palloc(p, sizeof(*conf)); + conf->home = ""; + return conf; + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +extern "C" +{ + + module AP_MODULE_DECLARE_DATA sca_rest_module = + { + STANDARD20_MODULE_STUFF, + tuscany::sca::rest::rest_create_dir_config, /* dir config */ + NULL, /* dir merger --- default is to override */ + tuscany::sca::rest::rest_create_server_config, /* server config */ + NULL, /* merge server config */ + tuscany::sca::rest::rest_module_cmds, /* command table */ + tuscany::sca::rest::register_hooks /* register_hooks */ + }; + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTReferenceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTReferenceBindingExtension.cpp new file mode 100644 index 0000000000..18720f42f5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTReferenceBindingExtension.cpp @@ -0,0 +1,86 @@ +/* +* 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. +*/ + +#include "RESTReferenceBindingExtension.h" +#include "model/RESTReferenceBinding.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_rest_service_initialize() + { + tuscany::sca::rest::RESTReferenceBindingExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace rest + { + // =================================================================== + // Constructor for the RESTReferenceBinding class. + // =================================================================== + RESTReferenceBindingExtension::RESTReferenceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the RESTReferenceBindingExtension class. + // =================================================================== + RESTReferenceBindingExtension::~RESTReferenceBindingExtension() + { + logentry(); + } + + const string RESTReferenceBindingExtension::extensionName("rest"); + const string RESTReferenceBindingExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#RESTBinding"); + + // =================================================================== + // loadModelElement - load the info from binding.rest + // =================================================================== + ReferenceBinding* RESTReferenceBindingExtension::getReferenceBinding(Composite *composite, Reference* reference, DataObjectPtr scdlBinding) + { + string uri = scdlBinding->getCString("uri"); + + RESTReferenceBinding* referenceBinding = new RESTReferenceBinding(reference, uri); + + return referenceBinding; + } + + void RESTReferenceBindingExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerReferenceBindingExtension(new RESTReferenceBindingExtension()); + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTReferenceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTReferenceBindingExtension.h new file mode 100644 index 0000000000..0d9e41841b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTReferenceBindingExtension.h @@ -0,0 +1,75 @@ +/* + * 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. + */ + +#ifndef tuscany_sca_extension_rest_restreferencebindingextension_h +#define tuscany_sca_extension_rest_restreferencebindingextension_h + +#include "tuscany/sca/extension/ReferenceBindingExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + class RESTReferenceBindingExtension : public ReferenceBindingExtension + { + public: + /** + * Default constructor + */ + RESTReferenceBindingExtension(); + + /** + * Destructor + */ + virtual ~RESTReferenceBindingExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.rest") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ReferenceBinding* getReferenceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Reference *reference, + commonj::sdo::DataObjectPtr scdlBinding); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_rest_restreferencebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTServiceProxy.cpp new file mode 100644 index 0000000000..95affe6202 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTServiceProxy.cpp @@ -0,0 +1,567 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <sstream> + +#include "commonj/sdo/SDO.h" + +#include "RESTServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/SDOUtils.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/WSDLInterface.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "tuscany/sca/model/WSDLMessagePart.h" +#include "model/RESTReferenceBinding.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + // ============================ + // Constructor: Create a proxy + // ============================ + RESTServiceProxy::RESTServiceProxy(Reference* reference) + : ServiceProxy(reference) + { + logentry(); + + // Get the target service wrapper + RESTReferenceBinding* referenceBinding = (RESTReferenceBinding*)reference->getBinding(); + serviceWrapper = referenceBinding->getTargetServiceBinding()->getServiceWrapper(); + + DataFactoryPtr dataFactory = reference->getComponent()->getComposite()->getDataFactory(); + try { + const Type& tempType = dataFactory->getType("http://tempuri.org", "RootType"); + } catch (SDORuntimeException&) + { + dataFactory->addType("http://tempuri.org", "RootType", false, false, false); + dataFactory->addType("http://tempuri.org", "Wrapper", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Wrapper", + "http://tempuri.org", "Wrapper", + false, false, true); + dataFactory->addType("http://tempuri.org", "Part", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Part", + "http://tempuri.org", "Part", + false, false, true); + } + } + + // ========== + // Destructor + // ========== + RESTServiceProxy::~RESTServiceProxy() + { + logentry(); + } + + /// + /// This method will be called to process an operation invocation. + /// + DataObjectPtr RESTServiceProxy::invoke(const WSDLOperation& wsdlOperation, DataObjectPtr inputDataObject) + { + logentry(); + + Reference* reference = getReference(); + Component* component = reference->getComponent(); + Composite* composite = component ->getComposite(); + + RESTReferenceBinding* referenceBinding = (RESTReferenceBinding*)reference->getBinding(); + DataFactoryPtr dataFactoryPtr = reference->getComponent()->getComposite()->getDataFactory(); + + // Since its Document wrapped, there will only be one message part + std::list<std::string> partList = wsdlOperation.getOutputMessagePartNames(); + const WSDLMessagePart &part = wsdlOperation.getOutputMessagePart(partList.front()); + const char* outputTypeURI = part.getPartUri().c_str(); + const char* outputTypeName = part.getPartName().c_str(); + + loginfo("WSDLOperation input message Type: %s#%s", + wsdlOperation.getInputMessageUri().c_str(), + wsdlOperation.getInputMessageName().c_str()); + loginfo("WSDLOperation output part Type: %s#%s", + outputTypeURI, + outputTypeName); + + // Create new Operation object and set parameters and return value + Operation operation(wsdlOperation.getOperationName().c_str()); + + try + { + + // Go through the input data object to set the operation parameters + PropertyList pl = inputDataObject->getInstanceProperties(); + + for(int i=0; i<pl.size(); i++) + { + const char* name = pl[i].getName(); + + switch (pl[i].getTypeEnum()) + { + case Type::BooleanType: + { + bool* boolData = new bool; + *boolData = inputDataObject->getBoolean(pl[i]); + operation.addParameter(boolData); + } + break; + case Type::ByteType: + { + char* byteData = new char; + *byteData = inputDataObject->getByte(pl[i]); + operation.addParameter(byteData); + } + break; + case Type::BytesType: + { + int len = inputDataObject->getLength(pl[i]); + char** bytesData = new char*; + *bytesData = new char[len+1]; + int bytesWritten = inputDataObject->getBytes(pl[i], *bytesData, len); + // Ensure the bytes end with the null char. Not sure if this is neccessary + if(bytesWritten <= len) + { + (*bytesData)[bytesWritten] = 0; + } + else + { + (*bytesData)[len] = 0; + } + operation.addParameter(bytesData); + } + break; + case Type::CharacterType: + { + // This code should work but won't be used as there is no mapping from an XSD type to the SDO CharacterType + wchar_t* charData = new wchar_t; + *charData = inputDataObject->getCharacter(pl[i]); + operation.addParameter(charData); + } + break; + case Type::DoubleType: + { + long double* doubleData = new long double; + *doubleData = inputDataObject->getDouble(pl[i]); + operation.addParameter(doubleData); + } + break; + case Type::FloatType: + { + float* floatData = new float; + *floatData = inputDataObject->getFloat(pl[i]); + operation.addParameter(floatData); + } + break; + case Type::IntType: + { + long* intData = new long; + *intData = inputDataObject->getInt(pl[i]); + operation.addParameter(intData); + } + break; + case Type::ShortType: + { + short* shortData = new short; + *shortData = inputDataObject->getShort(pl[i]); + operation.addParameter(shortData); + } + break; + case Type::StringType: + { + string* stringData; + if (pl[i].isMany()) + { + DataObjectList& l = inputDataObject->getList(pl[i]); + stringData = new string(l.getCString(0)); + } + else + { + if(inputDataObject->isSet(pl[i])) + { + stringData = new string(inputDataObject->getCString(pl[i])); + } + else + { + // The data is not set, so pass an empty string as the parameter + stringData = new string(); + } + } + operation.addParameter(stringData); + } + break; + case Type::DataObjectType: + { + if (!strcmp(pl[i].getType().getURI(), SDOUtils::sdoURI) && + !strcmp(pl[i].getType().getName(), "OpenDataObject")) { + + /* + * This code deals with xsd:any element parameters + * Get each element as a DataObject and add in to the parameter list + */ + + DataObjectList& dataObjectList = inputDataObject->getList(pl[i]); + + for(int j=0; j<dataObjectList.size(); j++) + { + DataObjectPtr dob = dataObjectList[j]; + if(!dob) + { + + // Add a null DataObject ptr + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = NULL; + loginfo("Null OpenDataObject parameter named %s[%d]", name, j); + operation.addParameter(dataObjectData); + } + else + { + + SequencePtr sequence = dob->getSequence(); + if (sequence->size()!=0) + { + // Add a text element + if (sequence->isText(0)) + { + string* stringData = new string(sequence->getCStringValue(0)); + operation.addParameter(stringData); + } + else + { + // Add a complex element DataObject + DataObjectPtr* dataObjectData =new DataObjectPtr; + *dataObjectData = sequence->getDataObjectValue(0); + if(!*dataObjectData) + { + loginfo("Null DataObject parameter named %s", name); + } + else + { + (*dataObjectData)->detach(); + } + operation.addParameter(dataObjectData); + } + } + else + { + // Empty content, add an empty string + loginfo("Empty OpenDataObject parameter named %s[%d]", name, j); + string* stringData = new string(""); + operation.addParameter(stringData); + } + } + } + } + else { + DataObjectPtr* dataObjectData = new DataObjectPtr; + if (pl[i].isMany()) + { + DataObjectList& l = inputDataObject->getList((unsigned int)i); + *dataObjectData = l[0]; + } + else + { + *dataObjectData = inputDataObject->getDataObject(pl[i]); + } + if(!*dataObjectData) + { + loginfo("Null DataObject parameter named %s", name); + } + else + { + (*dataObjectData)->detach(); + } + operation.addParameter(dataObjectData); + } + } + break; + default: + { + ostringstream msg; + msg << "Unsupported param type: " << pl[i].getTypeEnum(); + throwException(SystemConfigurationException, msg.str().c_str()); + } + } + } + + // Call into the target service wrapper + serviceWrapper->invoke(operation); + + // Set the data in the outputDataObject to be returned + DataObjectPtr outputDataObject; + try { + + // Create the output wrapper + const Type& rootType = dataFactoryPtr->getType(outputTypeURI, "RootType"); + const Property& prop = rootType.getProperty(outputTypeName); + const Type& outputType = prop.getType(); + outputDataObject = dataFactoryPtr->create(outputType); + } + catch (SDORuntimeException&) + { + try + { + + // Create the output wrapper + const Type& outputType = dataFactoryPtr->getType(outputTypeURI, outputTypeName); + outputDataObject = dataFactoryPtr->create(outputType); + } + catch (SDORuntimeException&) + { + // The output wrapper type is not known, create an open DataObject + outputDataObject = dataFactoryPtr->create("http://tempuri.org", "Wrapper"); + } + } + + setOutputData(operation, outputDataObject, dataFactoryPtr); + + return outputDataObject; + } + catch(SDORuntimeException& ex) + { + throwException(ServiceInvocationException, ex); + } + catch(TuscanyRuntimeException& ex) + { + throw; + } + } + + + void RESTServiceProxy::setOutputData(Operation& operation, DataObjectPtr outputDataObject, DataFactoryPtr dataFactoryPtr) + { + logentry(); + + // Go through data object to set the return value + PropertyList pl = outputDataObject->getType().getProperties(); + + if(pl.size() == 0) + { + if(outputDataObject->getType().isOpenType() && outputDataObject->getType().isDataObjectType()) + { + /* + * This code deals with returning xsd:any elements + */ + DataObjectList& l = outputDataObject->getList("return"); + Operation::ParameterType resultType = operation.getReturnType(); + switch(resultType) + { + case Operation::BOOL: + { + l.append(*(bool*)operation.getReturnValue()); + break; + } + case Operation::SHORT: + { + l.append(*(short*)operation.getReturnValue()); + break; + } + case Operation::INT: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::LONG: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::USHORT: + { + l.append(*(short*)operation.getReturnValue()); + break; + } + case Operation::UINT: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::ULONG: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + { + l.append(*(float*)operation.getReturnValue()); + break; + } + case Operation::DOUBLE: + { + l.append(*(long double*)operation.getReturnValue()); + break; + } + case Operation::LONGDOUBLE: + { + l.append(*(long double*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + l.append(*(char**)operation.getReturnValue()); + break; + } + case Operation::STRING: + { + l.append((*(string*)operation.getReturnValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + l.append(*(DataObjectPtr*)operation.getReturnValue()); + break; + } + default: + { + break; + } + } + } + else + { + loginfo("No return values defined"); + } + } + else { + + // Should only be one return value.. This goes through all return values + for(int i=0; i<pl.size(); i++) + { + const char* name = pl[i].getName(); + + Operation::ParameterType resultType = operation.getReturnType(); + switch(resultType) + { + case Operation::BOOL: + { + outputDataObject->setBoolean(pl[i], *(bool*)operation.getReturnValue()); + break; + } + case Operation::SHORT: + { + outputDataObject->setShort(pl[i], *(short*)operation.getReturnValue()); + break; + } + case Operation::INT: + { + outputDataObject->setInt(pl[i], *(int*)operation.getReturnValue()); + break; + } + case Operation::LONG: + { + outputDataObject->setInt(pl[i], *(long*)operation.getReturnValue()); + break; + } + case Operation::USHORT: + { + outputDataObject->setInt(pl[i], *(unsigned short*)operation.getReturnValue()); + break; + } + case Operation::UINT: + { + outputDataObject->setInt(pl[i], *(unsigned int*)operation.getReturnValue()); + break; + } + case Operation::ULONG: + { + outputDataObject->setInt(pl[i], *(unsigned long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + { + outputDataObject->setFloat(pl[i], *(float*)operation.getReturnValue()); + break; + } + case Operation::DOUBLE: + { + outputDataObject->setDouble(pl[i], *(double*)operation.getReturnValue()); + break; + } + case Operation::LONGDOUBLE: + { + outputDataObject->setDouble(pl[i], *(long double*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + if(*(char**)operation.getReturnValue() != NULL) + { + outputDataObject->setCString(pl[i], *(char**)operation.getReturnValue()); + } + else + { + loginfo("Null return value, leaving property %s unset", pl[i].getName()); + } + break; + } + case Operation::STRING: + { + outputDataObject->setCString(pl[i], (*(string*)operation.getReturnValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + + if(*(DataObjectPtr*)operation.getReturnValue() != NULL) + { + outputDataObject->setDataObject(pl[i], *(DataObjectPtr*)operation.getReturnValue()); + } + else + { + loginfo("Null return value, leaving property %s unset", pl[i].getName()); + } + + break; + } + default: + { + break; + } + } + } + } + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTServiceProxy.h new file mode 100644 index 0000000000..387add3f35 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/RESTServiceProxy.h @@ -0,0 +1,95 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_rest_restserviceproxy_h +#define tuscany_sca_extension_rest_restserviceproxy_h + +#include "commonj/sdo/SDO.h" + +#include "export.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "model/RESTReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + /** + * Holds a proxy for a given component and reference. + * The proxy which is held inside a ServiceProxy will be specific to the programming + * interface expected by the client. In this particular case the client is an Axis2 + * Web service skeleton. + */ + class RESTServiceProxy : public ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + * @param target The wrapper of the service which is wired to this reference. + */ + RESTServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Create a new service proxy for a service. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The service on the target component. + * @param target The wrapper of the target service. + */ + RESTServiceProxy(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~RESTServiceProxy(); + + /** + * Invoke the specified operation + */ + SCA_REST_SERVICE_API commonj::sdo::DataObjectPtr invoke( + const tuscany::sca::model::WSDLOperation& wsdlOperation, + commonj::sdo::DataObjectPtr inputDataObject); + + private: + + void setOutputData(Operation& operation, + commonj::sdo::DataObjectPtr outputDataObject, commonj::sdo::DataFactoryPtr dataFactoryPtr); + + /** + * The target service wrapper + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_rest_restserviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/export.h new file mode 100644 index 0000000000..802218a2fe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/export.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_rest_service_export_h +#define tuscany_sca_rest_service_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_REST_SERVICE_EXPORTS +#define SCA_REST_SERVICE_API __declspec(dllexport) +#else +#define SCA_REST_SERVICE_API __declspec(dllimport) +#endif + +#else +#define SCA_REST_SERVICE_API +#endif + +#endif // tuscany_sca_rest_service_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/model/RESTReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/model/RESTReferenceBinding.cpp new file mode 100644 index 0000000000..877ee01178 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/model/RESTReferenceBinding.cpp @@ -0,0 +1,66 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/rest/model/RESTReferenceBinding.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/rest/RESTServiceProxy.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace rest + { + + // Constructor + RESTReferenceBinding::RESTReferenceBinding(Reference* reference, const string& uri) + : ReferenceBinding(reference, uri) + { + logentry(); + } + + // Destructor + RESTReferenceBinding::~RESTReferenceBinding() + { + logentry(); + } + + void RESTReferenceBinding::configure(ServiceBinding *binding) + { + logentry(); + + setTargetServiceBinding(binding); + + serviceProxy = new RESTServiceProxy(getReference()); + } + + ServiceProxy* RESTReferenceBinding::getServiceProxy() + { + logentry(); + + return serviceProxy; + } + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/model/RESTReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/model/RESTReferenceBinding.h new file mode 100644 index 0000000000..22fc04c356 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/service/httpd/src/tuscany/sca/rest/model/RESTReferenceBinding.h @@ -0,0 +1,80 @@ +/* + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_rest_model_restreferencebinding_h +#define tuscany_sca_extension_rest_model_restreferencebinding_h + +#include <string> + +#include "tuscany/sca/model/ReferenceBinding.h" + +namespace tuscany +{ + namespace sca + { + namespace rest + { + /** + * Information about a web service binding for service or a reference. + */ + class RESTReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + */ + RESTReferenceBinding(tuscany::sca::model::Reference* reference, const std::string& uri); + + /** + * Destructor. + */ + virtual ~RESTReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#RESTBinding"; }; + + /** + * Configure this binding from a service binding. + */ + virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + /** + * Create a proxy representing the reference to the + * client component. + */ + virtual ServiceProxy* getServiceProxy(); + + private: + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + }; + + } // End namespace rest + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_rest_model_restreferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/xsd/sca-binding-rest.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/xsd/sca-binding-rest.xsd new file mode 100644 index 0000000000..ace4c54a39 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/xsd/sca-binding-rest.xsd @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + 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. + --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="binding.rest" type="sca:RESTBinding" substitutionGroup="sca:binding"/> + <complexType name="RESTBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/xsd/sca-interface-rest.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/xsd/sca-interface-rest.xsd new file mode 100644 index 0000000000..30422ab038 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/rest/xsd/sca-interface-rest.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="interface.rest" type="sca:RESTInterface" substitutionGroup="sca:interface"/> + <complexType name="RESTInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/Makefile.am new file mode 100644 index 0000000000..08ba2f553f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +SUBDIRS = src extension + +datadir=$(prefix)/extensions/ruby + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/Makefile.am new file mode 100644 index 0000000000..41ce75925b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/Makefile.am @@ -0,0 +1,34 @@ +# 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. +SUBDIRS = + +libdir=$(prefix)/extensions/ruby/lib +BUILT_SOURCES = extension_build + +EXTRA_DIST = src + +extension_build: src/Extension.cpp src/extconf.rb + cd src; ruby extconf.rb; make + touch extension_build + +clean: + cd src;make clean + rm -f extension_build + +install-exec-hook: + cp src/tuscany_sca_ruby.* $(libdir) + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/src/Extension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/src/Extension.cpp new file mode 100644 index 0000000000..458700e5f1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/src/Extension.cpp @@ -0,0 +1,56 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#define SCA_RUBYEXTENSION_API __declspec(dllexport) +#else +#define SCA_RUBYEXTENSION_API +#endif + +#include "tuscany/sca/ruby/Ruby.h" +#include "tuscany/sca/ruby/RubyCompositeContext.h" + +extern "C" +{ + + // Implement the Sca::locateService module function + SCA_RUBYEXTENSION_API VALUE tuscany_sca_ruby_locateService(VALUE module, VALUE value) + { + // Locate the service + const char* serviceName = rb_string_value_cstr(&value); + return tuscany::sca::ruby::RubyCompositeContext::locateService(serviceName); + } + + // Initialize the Ruby extension + SCA_RUBYEXTENSION_API void Init_tuscany_sca_ruby() + { + + // Define the Sca::locateService() function + VALUE module = rb_define_module("SCA"); + rb_define_module_function(module, "locateService", (VALUE(*)(ANYARGS))tuscany_sca_ruby_locateService, 1); + + } + + SCA_RUBYEXTENSION_API void Init_libtuscany_sca_ruby() + { + Init_tuscany_sca_ruby(); + } +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/src/extconf.rb b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/src/extconf.rb new file mode 100644 index 0000000000..9c41843d63 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/extension/src/extconf.rb @@ -0,0 +1,25 @@ +# +# 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. +# + + require 'mkmf' + CONFIG["CC"] = "g++" + $CPPFLAGS << " -I../../src " + $LIBPATH << "../../src/.libs" + $LIBS << " -ltuscany_sca_ruby_lang " + create_makefile 'tuscany_sca_ruby' diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/Makefile.am new file mode 100644 index 0000000000..d9310440b9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/Makefile.am @@ -0,0 +1,53 @@ +# 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. + +libdir=$(prefix)/extensions/ruby/lib +lib_LTLIBRARIES = libtuscany_sca_ruby_lang.la + +install-exec-hook: + +rootdir=$(prefix)/extensions/ruby + +noinst_HEADERS = \ +tuscany/sca/ruby/*.h \ +tuscany/sca/ruby/model/*.h + +libtuscany_sca_ruby_lang_la_SOURCES = \ +tuscany/sca/ruby/RubyExtension.cpp \ +tuscany/sca/ruby/RubyImplementationExtension.cpp \ +tuscany/sca/ruby/RubyServiceProxy.cpp \ +tuscany/sca/ruby/RubyServiceWrapper.cpp \ +tuscany/sca/ruby/model/RubyImplementation.cpp \ +tuscany/sca/ruby/model/RubyReferenceBinding.cpp \ +tuscany/sca/ruby/model/RubyServiceBinding.cpp \ +tuscany/sca/ruby/RubyCompositeContext.cpp + +libtuscany_sca_ruby_lang_la_LIBADD = -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L${RUBY_LIB} -lruby -lpthread + +INCLUDES = -Imodel -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include \ + -I${RUBY_INCLUDE} + +moduledir=$(prefix)/extensions/ruby/module +extension = libtuscany_sca_ruby_lang$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/Ruby.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/Ruby.h new file mode 100644 index 0000000000..a6b8ee8ffa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/Ruby.h @@ -0,0 +1,39 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ruby_ruby_h +#define tuscany_sca_ruby_ruby_h + +// Ruby inists on MS VC6 ... we'll see about that! +#if defined(WIN32) || defined (_WINDOWS) +#define _REAL_MSC_VER _MSC_VER +#undef _MSC_VER +#define _MSC_VER 1200 +#endif + +#include <ruby.h> + +#if defined(WIN32) || defined (_WINDOWS) +#undef _MSC_VER +#define _MSC_VER _REAL_MSC_VER +#endif + +#endif // tuscany_sca_ruby_ruby_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyCompositeContext.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyCompositeContext.cpp new file mode 100644 index 0000000000..5554ac6756 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyCompositeContext.cpp @@ -0,0 +1,70 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/ruby/RubyServiceProxy.h" +#include "tuscany/sca/ruby/RubyCompositeContext.h" + +using namespace std; +using namespace tuscany::sca::model; + + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + VALUE RubyCompositeContext::locateService(const char* serviceName) + { + // Get the default component + Component* defaultComponent = tuscany::sca::SCARuntime::getCurrentRuntime()->getDefaultComponent(); + Composite* composite = (Composite*)defaultComponent->getType(); + + // Locate the service + Service* service = composite->findComponentService(serviceName); + string msg; + if (!service) + { + string msg = "Service not found: "; + msg = msg + serviceName; + rb_raise(rb_eRuntimeError, msg.c_str()); + } + + // Get a Proxy for this service + tuscany::sca::ruby::RubyServiceProxy* serviceProxy = new tuscany::sca::ruby::RubyServiceProxy(service); + + // Return the Ruby proxy value object + return serviceProxy->getProxyValue(); + } + + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyCompositeContext.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyCompositeContext.h new file mode 100644 index 0000000000..2414b66fb1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyCompositeContext.h @@ -0,0 +1,50 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ruby_RubyCompositeContext_h +#define tuscany_sca_ruby_RubyCompositeContext_h + +#include "tuscany/sca/ruby/Ruby.h" +#include "tuscany/sca/ruby/export.h" + + + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + class RubyCompositeContext + { + public: + SCA_RUBY_API static VALUE locateService(const char* serviceName); + + }; + + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_RubyCompositeContext_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyExtension.cpp new file mode 100644 index 0000000000..5789517cfd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyExtension.cpp @@ -0,0 +1,72 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/ruby/RubyExtension.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/ruby/RubyImplementationExtension.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_ruby_lang_initialize() + { + tuscany::sca::ruby::RubyExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + // =================================================================== + // Constructor for the RubyExtension class. + // =================================================================== + RubyExtension::RubyExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the RubyExtension class. + // =================================================================== + RubyExtension::~RubyExtension() + { + logentry(); + } + + void RubyExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerImplementationExtension(new RubyImplementationExtension()); + } + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyExtension.h new file mode 100644 index 0000000000..232431ca1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyExtension.h @@ -0,0 +1,58 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_ruby_rubyextension_h +#define tuscany_sca_ruby_rubyextension_h + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + class RubyExtension + { + public: + /** + * Default constructor + */ + RubyExtension(); + + /** + * Destructor + */ + virtual ~RubyExtension(); + + static void initialize(); + + private: + + }; + + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_rubyextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyImplementationExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyImplementationExtension.cpp new file mode 100644 index 0000000000..aa416f139a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyImplementationExtension.cpp @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/ruby/RubyImplementationExtension.h" +#include "tuscany/sca/ruby/model/RubyImplementation.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + // =================================================================== + // Constructor for the RubyImplementationExtension class. + // =================================================================== + RubyImplementationExtension::RubyImplementationExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the RubyImplementationExtension class. + // =================================================================== + RubyImplementationExtension::~RubyImplementationExtension() + { + logentry(); + } + + const string RubyImplementationExtension::extensionName("ruby"); + const string RubyImplementationExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#RubyImplementation"); + + // =================================================================== + // loadModelElement - load the info from implementation.ruby + // =================================================================== + ComponentType* RubyImplementationExtension::getImplementation(Composite *composite, DataObjectPtr scdlImplementation) + { + logentry(); + + string module = scdlImplementation->getCString("module"); + string className = scdlImplementation->getCString("class"); + string script = scdlImplementation->getCString("script"); + + RubyImplementation* rubyImpl = new RubyImplementation(composite, module, className, script); + + return rubyImpl; + } + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyImplementationExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyImplementationExtension.h new file mode 100644 index 0000000000..79d9ed2dbe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyImplementationExtension.h @@ -0,0 +1,74 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ruby_rubyimplementationextension_h +#define tuscany_sca_ruby_rubyimplementationextension_h + +#include "tuscany/sca/extension/ImplementationExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + class RubyImplementationExtension : public ImplementationExtension + { + public: + /** + * Default constructor + */ + RubyImplementationExtension(); + + /** + * Destructor + */ + virtual ~RubyImplementationExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#implementation.ruby") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ComponentType* getImplementation( + tuscany::sca::model::Composite* composite, + commonj::sdo::DataObjectPtr scdlImplementation); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_rubyimplementationextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceProxy.cpp new file mode 100644 index 0000000000..d830cd92de --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceProxy.cpp @@ -0,0 +1,384 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include <sstream> + +#include "tuscany/sca/ruby/RubyServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/ruby/model/RubyImplementation.h" +#include "tuscany/sca/ruby/model/RubyReferenceBinding.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ + + // Initialize a Ruby proxy + SCA_RUBY_API VALUE tuscany_sca_ruby_proxy_initialize(VALUE self, VALUE serviceProxy) + { + rb_iv_set(self, "@cppProxy", serviceProxy); + return self; + } + + // Handle a method_missing message and dispatch to + // our C++ proxy + SCA_RUBY_API VALUE tuscany_sca_ruby_proxy_method_missing(int argc, VALUE* argv, VALUE self) + { + VALUE proxy = rb_iv_get(self, "@cppProxy"); + + // Get the target service wrapper + tuscany::sca::ruby::RubyServiceProxy *serviceProxy; + Data_Get_Struct(proxy, tuscany::sca::ruby::RubyServiceProxy, serviceProxy); + + // Handle the invocation + return serviceProxy->invoke(argc, argv); + + } + +} + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + VALUE RubyServiceProxy::proxyClass = Qnil; + + // ============================ + // Constructor: Create a proxy + // ============================ + RubyServiceProxy::RubyServiceProxy(Reference* reference) + : ServiceProxy(reference) + { + logentry(); + + // ---------------------- + // Get the component + // ---------------------- + component = reference->getComponent(); + string name = reference->getType()->getName(); + + // Get the service wrapper + RubyReferenceBinding* referenceBinding = (RubyReferenceBinding*)reference->getBinding(); + + serviceWrapper = referenceBinding->getTargetServiceBinding()->getServiceWrapper(); + + // Create the Ruby proxy + createProxy(); + } + + // ============================ + // Constructor: Create a proxy + // ============================ + RubyServiceProxy::RubyServiceProxy(Service* service) + : ServiceProxy(0) + { + logentry(); + + // ---------------------- + // Get the component + // ---------------------- + component = service->getComponent(); + string name = service->getType()->getName(); + + // Get the service wrapper + serviceWrapper = service->getBinding()->getServiceWrapper(); + + // Create the Ruby proxy + createProxy(); + } + + // ========== + // Destructor + // ========== + RubyServiceProxy::~RubyServiceProxy() + { + logentry(); + } + + void RubyServiceProxy::createProxy() + { + logentry(); + + // Create the Ruby proxy class + if (RubyServiceProxy::proxyClass == Qnil) + { + VALUE module = rb_define_module("Tuscany"); + proxyClass = rb_define_class_under(module, "ServiceProxy", rb_cObject); + rb_define_method(proxyClass, "initialize", (VALUE(*)(ANYARGS))tuscany_sca_ruby_proxy_initialize, 1); + rb_define_method(proxyClass, "method_missing", (VALUE(*)(ANYARGS))tuscany_sca_ruby_proxy_method_missing, -1); + } + + // Create the Ruby proxy instance, pass the service wrapper to it + VALUE* args = new VALUE[1]; + args[0] = Data_Wrap_Struct(rb_cObject, NULL, NULL, this); + proxyValue = rb_class_new_instance(1, args, proxyClass); + + // Mark proxyValue busy so that it doesn't get GC'ed by Ruby + rb_gc_register_address(&proxyValue); + } + + + VALUE RubyServiceProxy::invoke(int argc, VALUE* argv) + { + logentry(); + + // Get the method name + char* methodName = rb_id2name(SYM2ID(argv[0])); + + // Get the block passed by the caller + VALUE block =rb_block_given_p() ? rb_block_proc() : Qnil; + + // Create new Operation object + Operation operation(methodName); + + // Convert the Ruby parameters to C++ + for (int i = 1; i < argc; i++) + { + VALUE value = argv[i]; + + int valueType = TYPE(value); + + switch (valueType) + { + case T_FLOAT: + { + float* data = new float; + *data = rb_num2dbl(value); + operation.addParameter(data); + break; + } + case T_STRING: + { + string* data = new string(rb_string_value_cstr(&value)); + const char** cdata = new const char*; + *cdata = data->c_str(); + operation.addParameter(cdata); + break; + } + case T_FIXNUM: + { + long* data = new long; + *data = rb_num2long(value); + operation.addParameter(data); + break; + } + case T_BIGNUM: + { + long double* data = new long double; + *data = rb_num2dbl(value); + operation.addParameter(data); + break; + } + case T_TRUE: + { + bool* data = new bool; + *data = true; + operation.addParameter(data); + break; + } + case T_FALSE: + { + bool* data = new bool; + *data = false; + operation.addParameter(data); + break; + } + case T_OBJECT: + { + VALUE klass = rb_obj_class(value); + if (klass == RubyImplementation::getXMLDocumentClass()) + { + // Convert a REXML::Document to a DataObject + ID to_s = rb_intern("to_s"); + VALUE vstr = rb_funcall(value, to_s, 0); + string str = string(rb_string_value_cstr(&vstr)); + + loginfo("Converting Ruby Rexml document to SDO DataObject: %s", str.c_str()); + + Composite* composite = getReference()->getComponent()->getComposite(); + commonj::sdo::XMLHelperPtr xmlHelper = composite->getXMLHelper(); + commonj::sdo::XMLDocumentPtr xmlDoc = xmlHelper->load(str.c_str()); + + DataObjectPtr dob; + if (xmlDoc != NULL) + { + dob = xmlDoc->getRootDataObject(); + } + if (dob != NULL) + { + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = dob; + operation.addParameter(dataObjectData); + } + else + { + string msg = "Document could not be converted to a DataObject"; + rb_raise(rb_eTypeError, msg.c_str()); + return Qnil; + } + } + else + { + string msg = "Ruby type not supported: " + valueType; + rb_raise(rb_eTypeError, msg.c_str()); + return Qnil; + } + break; + } + default:; + string msg = "Ruby type not supported: " + valueType; + rb_raise(rb_eTypeError, msg.c_str()); + return Qnil; + } + + } + + try + { + // Call into the target service wrapper + serviceWrapper->invoke(operation); + + // Convert the result to a Ruby value + VALUE value; + Operation::ParameterType resultType = operation.getReturnType(); + switch(resultType) + { + case Operation::BOOL: + { + if( *(bool*)operation.getReturnValue()) + { + //boolean true + value = rb_int2inum(1); + } + else + { + value = rb_int2inum(0); + } + break; + } + case Operation::SHORT: + { + value = rb_int2inum(*(short*)operation.getReturnValue()); + break; + } + case Operation::USHORT: + { + value = rb_uint2inum(*(unsigned short*)operation.getReturnValue()); + break; + } + case Operation::LONG: + { + value = rb_int2inum(*(long*)operation.getReturnValue()); + break; + } + case Operation::ULONG: + { + value = rb_uint2inum(*(unsigned long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + { + value = rb_float_new(*(float*)operation.getReturnValue()); + break; + } + case Operation::DOUBLE: + { + value = rb_float_new(*(double*)operation.getReturnValue()); + break; + } + case Operation::LONGDOUBLE: + { + value = rb_float_new(*(long double*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + value = rb_str_new2(*(char**)operation.getReturnValue()); + break; + } + case Operation::STRING: + { + value = rb_str_new2((*(string*)operation.getReturnValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + DataObjectPtr dob = *(DataObjectPtr*)operation.getReturnValue(); + + // Convert a DataObject to a REXML Document object + Composite* composite = component->getComposite(); + commonj::sdo::XMLHelperPtr xmlHelper = composite->getXMLHelper(); + char* str = xmlHelper->save( + dob, + dob->getType().getURI(), + dob->getType().getName()); + + loginfo("Converting SDO DataObject to Ruby Rexml document: %s", str); + + VALUE vstr[1]; + vstr[0] = rb_str_new2(str); + + value = rb_class_new_instance(1, vstr, RubyImplementation::getXMLDocumentClass()); + break; + } + default: + { + value = Qnil; + break; + } + } + + return value; + + } + catch(TuscanyRuntimeException& ex) + { + string msg = "Exception while invoking a service: "; + msg += ex.getEClassName(); + msg += ": "; + msg += ex.getMessageText(); + rb_raise(rb_eRuntimeError, msg.c_str()); + return Qnil; + } + + return Qnil; + } + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceProxy.h new file mode 100644 index 0000000000..e6c37cf1da --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceProxy.h @@ -0,0 +1,114 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ruby_rubyserviceproxy_h +#define tuscany_sca_ruby_rubyserviceproxy_h + +#include "tuscany/sca/ruby/Ruby.h" +#include "tuscany/sca/ruby/export.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + /** + * Holds a proxy for a given component and reference. + * The proxy which is held inside a ServiceProxy will be specific to the component + * and reference and will have been code generated and be contained in a dll + * created by a developer of an SCA application. + */ + class RubyServiceProxy : public ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + * @param target The wrapper of the service which is wired to this reference. + */ + RubyServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Create a new service proxy for a service. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The service on the target component. + * @param target The wrapper of the target service. + */ + RubyServiceProxy(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~RubyServiceProxy(); + + /** + * Returns the Ruby value of the proxy + */ + VALUE getProxyValue() const { return proxyValue; }; + + /** + * Handles the invocation of a Ruby method. + */ + VALUE invoke(int argc, VALUE* argv); + + private: + + /** + * Create the Ruby proxy object + */ + void createProxy(); + + /** + * The target service wrapper + */ + ServiceWrapper* serviceWrapper; + + /** + * The Ruby value of the proxy + */ + VALUE proxyValue; + + /** + * The component owning the proxy + */ + tuscany::sca::model::Component* component; + + /** + * The Ruby proxy class + */ + static VALUE proxyClass; + + }; + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_rubyserviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceWrapper.cpp new file mode 100644 index 0000000000..db6bc07b7e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceWrapper.cpp @@ -0,0 +1,794 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include <sstream> + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/ruby/RubyServiceWrapper.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/Library.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/ruby/model/RubyImplementation.h" +#include "tuscany/sca/ruby/model/RubyServiceBinding.h" +#include "tuscany/sca/ruby/RubyServiceProxy.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + class RubyServiceInvocation + { + public: + VALUE instance; + ID method; + int argc; + const VALUE* argv; + }; + } + } +} + +extern "C" +{ + + static VALUE safe_rb_funcall(VALUE value) + { + tuscany::sca::ruby::RubyServiceInvocation* call = (tuscany::sca::ruby::RubyServiceInvocation*)value; + if (call->argc == 0) + { + VALUE result = rb_funcall(call->instance, call->method, 0); + return result; + } + else + { + VALUE result = rb_funcall2(call->instance, call->method, call->argc, call->argv); + return result; + } + } + +} + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + // =========== + // Constructor + // =========== + RubyServiceWrapper::RubyServiceWrapper(Service* service) + : ServiceWrapper(service) + { + logentry(); + + component = service->getComponent(); + implementation = (RubyImplementation*)component->getType(); + interf = service->getType()->getInterface(); + } + + // ========== + // Destructor + // ========== + RubyServiceWrapper::~RubyServiceWrapper() + { + logentry(); + } + + // ====================================================================== + // invoke: wrapper call to service with setting the component context + // ====================================================================== + void RubyServiceWrapper::invoke(Operation& operation) + { + logentry(); + + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + runtime->setCurrentComponent(component); + + try + { + + // Create a new instance of the Ruby implementation class + VALUE instance = rb_class_new_instance(0, NULL, implementation->getImplementationClass()); + + // Set all the references + const Component::REFERENCE_MAP& references = component->getReferences(); + Component::REFERENCE_MAP::const_iterator refiter = references.begin(); + for (int ri=0; ri< references.size(); ri++) + { + Reference* reference = refiter->second; + RubyServiceProxy* proxy = (RubyServiceProxy*)reference->getBinding()->getServiceProxy(); + if (proxy != NULL) + { + VALUE proxyValue = proxy->getProxyValue(); + string varName = "@" + refiter->first; + rb_iv_set(instance, varName.c_str(), proxyValue); + } + refiter++; + } + + // Set all the configured properties + DataObjectPtr properties = component->getProperties(); + PropertyList pl = properties->getInstanceProperties(); + for (int i = 0; i < pl.size(); i++) + { + if (properties->isSet(pl[i])) + { + string varName = "@"; + varName += pl[i].getName(); + string cstr = properties->getCString(pl[i]); + VALUE propertyValue; + if (cstr == "true") + { + propertyValue = Qtrue; + } + else if (cstr == "false") + { + propertyValue = Qfalse; + } + else + { + //TODO use one of the rb_str_to_inum() functions + // to convert a numeric value to a Ruby numeric + propertyValue = rb_str_new2(cstr.c_str()); + } + rb_iv_set(instance, varName.c_str(), propertyValue); + } + } + + // Get the ID of the specified method + ID method = rb_intern(operation.getName().c_str()); + + // Convert C++ parameters to Ruby parameters + VALUE *args = NULL; + int n = operation.getNParms(); + if (n != 0) + { + args=new VALUE[n]; + + for(int i = 0; i < operation.getNParms(); i++) + { + VALUE value; + + const Operation::Parameter& parm = operation.getParameter(i); + Operation::ParameterType parmType = parm.getType(); + switch(parmType) + { + case Operation::BOOL: + { + if( *(bool*)parm.getValue()) + { + //boolean true + value = rb_int2inum(1); + } + else + { + value = rb_int2inum(0); + } + break; + } + case Operation::SHORT: + { + value = rb_int2inum(*(short*)parm.getValue()); + break; + } + case Operation::USHORT: + { + value = rb_uint2inum(*(unsigned short*)parm.getValue()); + break; + } + case Operation::LONG: + { + value = rb_int2inum(*(long*)parm.getValue()); + break; + } + case Operation::ULONG: + { + value = rb_uint2inum(*(unsigned long*)parm.getValue()); + break; + } + case Operation::FLOAT: + { + value = rb_float_new(*(float*)parm.getValue()); + break; + } + case Operation::DOUBLE: + { + value = rb_float_new(*(double*)parm.getValue()); + break; + } + case Operation::LONGDOUBLE: + { + value = rb_float_new(*(long double*)parm.getValue()); + break; + } + case Operation::CHARS: + { + value = rb_str_new2(*(char**)parm.getValue()); + break; + } + case Operation::STRING: + { + value = rb_str_new2((*(string*)parm.getValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + DataObjectPtr dob = *(DataObjectPtr*)parm.getValue(); + + // Convert a DataObject to a REXML Document object + Composite* composite = component->getComposite(); + commonj::sdo::XMLHelperPtr xmlHelper = composite->getXMLHelper(); + char* str = xmlHelper->save( + dob, + dob->getType().getURI(), + dob->getType().getName()); + + loginfo("Converting SDO DataObject to Ruby Rexml document: %s", str); + + VALUE vstr[1]; + vstr[0] = rb_str_new2(str); + + value = rb_class_new_instance(1, vstr, RubyImplementation::getXMLDocumentClass()); + break; + } + default: + { + ostringstream msg; + msg << "Operation parameter type not supported: " << parmType; + throwException(ServiceDataException, msg.str().c_str()); + } + } + + args[i] = value; + } + } + + + // Invoke the specified method + RubyServiceInvocation call; + call.instance = instance; + call.method = method; + call.argc = n; + call.argv = args; + int error = 0; + VALUE result = rb_protect(safe_rb_funcall, (VALUE)&call, &error); + if (error) + { + // Convert a Ruby error to a C++ exception + VALUE lasterr = rb_gv_get("$!"); + ostringstream msg; + + // class + VALUE klass = rb_class_path(CLASS_OF(lasterr)); + msg << "Ruby Exception " << RSTRING(klass)->ptr << ": "; + + // message + VALUE message = rb_obj_as_string(lasterr); + msg << RSTRING(message)->ptr << endl; + + // backtrace + if(!NIL_P(ruby_errinfo)) { + VALUE ary = rb_funcall(ruby_errinfo, rb_intern("backtrace"), 0); + int c; + for (c=0; c<RARRAY(ary)->len; c++) { + msg << "from " << RSTRING(RARRAY(ary)->ptr[c])->ptr << endl; + } + } + throwException(ServiceInvocationException, msg.str().c_str()); + } + + // Convert the Ruby result value to a C++ result + int resultType = TYPE(result); + char buf[20]; + switch(resultType) + { + case T_FLOAT: + { + float* data = new float; + *data = rb_num2dbl(result); + + // Check if the return type has already been set for typed languages + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = (*data != 0.0); + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + sprintf(buf, "%f", *data); + *(char**)operation.getReturnValue() = buf; + break; + } + case Operation::STRING: + { + sprintf(buf, "%f", *data); + *(string*)operation.getReturnValue() = buf; + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + break; + } + case T_STRING: + { + string* stringdata = new string(rb_string_value_cstr(&result)); + const char** data = new const char*; + *data = stringdata->c_str(); + + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + // If the string is empty or "0" or "false" set to false, otherwise true + if(strlen(*data) == 0 || strcmp(*data, "0") == 0 || strcmp(*data, "false") == 0) + { + *(bool*)operation.getReturnValue() = false; + } + else + { + *(bool*)operation.getReturnValue() = true; + } + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)atoi(*data); + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)atoi(*data); + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)atoi(*data); + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)atoi(*data); + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)atol(*data); + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)atol(*data); + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)atof(*data); + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)atof(*data); + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)atof(*data); + break; + } + case Operation::CHARS: + { + *(const char**)operation.getReturnValue() = *data; + break; + } + case Operation::STRING: + { + *(string*)operation.getReturnValue() = *data; + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + break; + } + case T_FIXNUM: + { + long* data = new long; + *data = rb_num2long(result); + + // Check if the return type has already been (set for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = (*data != 0); + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + sprintf(buf, "%d", *data); + *(char**)operation.getReturnValue() = buf; + break; + } + case Operation::STRING: + { + sprintf(buf, "%d", *data); + *(string*)operation.getReturnValue() = buf; + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + + break; + } + case T_BIGNUM: + { + long double* data = new long double; + *data = rb_num2dbl(result); + + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = (*data != 0.0); + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + sprintf(buf, "%f", *data); + *(char**)operation.getReturnValue() = buf; + break; + } + case Operation::STRING: + { + sprintf(buf, "%f", *data); + *(string*)operation.getReturnValue() = buf; + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + break; + } + case T_TRUE: + case T_FALSE: + { + bool* data = new bool; + *data = (resultType == T_TRUE); + // Check if the return type has already been set (for typed languages) + switch(operation.getReturnType()) + { + case Operation::BOOL: + { + *(bool*)operation.getReturnValue() = *data; + break; + } + case Operation::SHORT: + { + *(short*)operation.getReturnValue() = (short)*data; + break; + } + case Operation::USHORT: + { + *(unsigned short*)operation.getReturnValue() = (unsigned short)*data; + break; + } + case Operation::INT: + { + *(int*)operation.getReturnValue() = (int)*data; + break; + } + case Operation::UINT: + { + *(unsigned int*)operation.getReturnValue() = (unsigned int)*data; + break; + } + case Operation::LONG: + { + *(long*)operation.getReturnValue() = (long)*data; + break; + } + case Operation::ULONG: + { + *(unsigned long*)operation.getReturnValue() = (unsigned long)*data; + break; + } + case Operation::FLOAT: + { + *(float*)operation.getReturnValue() = (float)*data; + break; + } + case Operation::DOUBLE: + { + *(double*)operation.getReturnValue() = (double)*data; + break; + } + case Operation::LONGDOUBLE: + { + *(long double*)operation.getReturnValue() = (long double)*data; + break; + } + case Operation::CHARS: + { + if(*data) + { + *(char**)operation.getReturnValue() = "true"; + } + else + { + *(char**)operation.getReturnValue() = "false"; + } + break; + } + case Operation::STRING: + { + if(*data) + { + *(string*)operation.getReturnValue() = "true"; + } + else + { + *(string*)operation.getReturnValue() = "false"; + } + break; + } + default: + { + // The type is set as something else or has not been set + operation.setReturnValue(data); + } + } + + break; + } + case T_OBJECT: + { + VALUE klass = rb_obj_class(result); + if (klass == RubyImplementation::getXMLDocumentClass()) + { + // Convert a REXML::Document to a DataObject + ID to_s = rb_intern("to_s"); + VALUE vstr = rb_funcall(result, to_s, 0); + string str = string(rb_string_value_cstr(&vstr)); + + loginfo("Converting Ruby Rexml document to SDO DataObject: %s", str.c_str()); + + Composite* composite = component->getComposite(); + commonj::sdo::XMLHelperPtr xmlHelper = composite->getXMLHelper(); + commonj::sdo::XMLDocumentPtr xmlDoc = xmlHelper->load(str.c_str()); + + DataObjectPtr* dataObjectData = new DataObjectPtr; + if (xmlDoc != NULL) + { + *dataObjectData = xmlDoc->getRootDataObject(); + } + else + { + *dataObjectData = NULL; + } + if (*dataObjectData != NULL) + { + operation.setReturnValue(dataObjectData); + } + else + { + string msg = "Document could not be converted to a DataObject"; + throwException(ServiceDataException, msg.c_str()); + } + } + else + { + string msg = "Ruby type not supported: " + resultType; + throwException(ServiceDataException, msg.c_str()); + } + break; + } + default: + { + string msg = "Ruby type not supported: " + resultType; + throwException(ServiceDataException, msg.c_str()); + } + } + + } + catch (...) + { + runtime->unsetCurrentComponent(); + throw; + } + + runtime->unsetCurrentComponent(); + } + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceWrapper.h new file mode 100644 index 0000000000..2526084a72 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/RubyServiceWrapper.h @@ -0,0 +1,94 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ruby_rubyservicewrapper_h +#define tuscany_sca_ruby_rubyservicewrapper_h + +#include "tuscany/sca/ruby/export.h" +#include "tuscany/sca/ruby/Ruby.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/ruby/model/RubyImplementation.h" + + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + class RubyInterface; + + /** + * Wraps the service on a component implementation. + * This abstract class is extended by generated code which provides + * the implementation of some of the methods. + * An instance of this class wraps the actual component implementation which + * has been written by a developer of an SCA application. + */ + class SCA_RUBY_API RubyServiceWrapper : public ServiceWrapper + { + public: + + /** + * Constructor. + * @param target The component service to which this wrapper refers. + */ + RubyServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~RubyServiceWrapper(); + + /** + * All business method calls to the target component go through the invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target component. + */ + virtual void invoke(Operation& operation); + + private: + + /** + * The component to which this wrapper refers. + */ + tuscany::sca::model::Component* component; + + /** + * A pointer to the interface which the service exposes. + */ + tuscany::sca::model::Interface* interf; + + /** + * The Ruby implementation + */ + RubyImplementation* implementation; + + }; + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_rubyservicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/export.h new file mode 100644 index 0000000000..5db72a1ebe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/export.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ruby_export_h +#define tuscany_sca_ruby_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_RUBY_LANG_EXPORTS +#define SCA_RUBY_API __declspec(dllexport) +#else +#define SCA_RUBY_API __declspec(dllimport) +#endif + +#else +#define SCA_RUBY_API +#endif + +#endif // tuscany_sca_ruby_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyImplementation.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyImplementation.cpp new file mode 100644 index 0000000000..fa30642318 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyImplementation.cpp @@ -0,0 +1,171 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/ruby/model/RubyImplementation.h" +#include "tuscany/sca/ruby/model/RubyServiceBinding.h" +#include "tuscany/sca/ruby/model/RubyReferenceBinding.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/util/Utils.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + + namespace ruby + { + + bool RubyImplementation::initialized = false; + VALUE RubyImplementation::xmlDocumentClass = 0; + + // Constructor + RubyImplementation::RubyImplementation(Composite* composite, const string& module, const string& className, const string& script) + : ComponentType(composite, script.substr(0, script.find_last_of('.'))), + module(module), className(className), script(script) + { + loadClass(); + } + + RubyImplementation::~RubyImplementation() + { + } + + VALUE RubyImplementation::getXMLDocumentClass() + { + logentry(); + + // Initialize the Ruby runtime + if (!initialized) + { + ruby_init(); + ruby_init_loadpath(); + + // Load the Rexml module. Rexml is used to handle XML documents. + //rb_require("rexml/document"); + // Use rb_eval_string for now as it provides better error reporting + rb_eval_string("require(\"rexml/document\")"); + + xmlDocumentClass = rb_path2class("REXML::Document"); + initialized = true; + } + + return xmlDocumentClass; + } + + void RubyImplementation::loadClass() + { + logentry(); + + // Ensure xmlDocumentClass is initialized + getXMLDocumentClass(); + + ID to_s = rb_intern("to_s"); + VALUE xstr = rb_funcall(xmlDocumentClass, to_s, 0); + loginfo("Got Ruby Rexml class: %s", rb_string_value_cstr(&xstr)); + + // Load the specified Ruby script + if (script != "") + { + // Convert any windows slashes \ in the root path to unix slashes / + string rootpath = getComposite()->getRoot(); + int pos = 0; + while((pos = rootpath.find('\\', pos)) != string::npos) + { + rootpath = rootpath.replace(pos, 1, "/"); + } + + // Use rb_eval_string for now as it provides better error reporting + string path = "require(\"" + rootpath + "/" + script +"\")"; + //rb_require((char *)path.c_str()); + rb_eval_string(path.c_str()); + } + + // Load the Ruby implementation class + implementationClass = rb_path2class(className.c_str()); + + // Create a default service + ServiceType* defaultServiceType = new ServiceType(this, "", NULL, NULL); + addServiceType(defaultServiceType); + + // Introspect the Ruby class and create references and properties for + // all public attributes + VALUE methods = rb_class_public_instance_methods(0, NULL, implementationClass); + int n = RARRAY(methods)->len; + for (int i = 0; i<n; i++) + { + VALUE method = rb_ary_entry(methods, i); + string methodName = string(rb_string_value_cstr(&method)); + + // Create a reference type for each setter method + int s = methodName.size(); + if (s > 1 && methodName[s-1] == '=' && methodName[0] != '=') + { + string variableName = methodName.substr(0, s-1); + ReferenceType* referenceType = new ReferenceType( + this, variableName, NULL, NULL, ReferenceType::ONE_ONE); + addReferenceType(referenceType); + + // Create a property type as well + addPropertyType(variableName, "http://www.w3.org/2001/XMLSchema#string", false, NULL); + + } + } + } + + void RubyImplementation::initializeComponent(Component* component) + { + ComponentType::initializeComponent(component); + + // Create Ruby bindings for all the services + const Component::SERVICE_MAP& services = component->getServices(); + Component::SERVICE_MAP::const_iterator iter = services.begin(); + for (int i=0; i< services.size(); i++) + { + Service *service = iter->second; + RubyServiceBinding* binding = new RubyServiceBinding(service); + service->setBinding(binding); + iter++; + } + + // Create Ruby bindings for all the references + const Component::REFERENCE_MAP& references = component->getReferences(); + Component::REFERENCE_MAP::const_iterator refiter = references.begin(); + for (int ri=0; ri< references.size(); ri++) + { + Reference *reference = refiter->second; + RubyReferenceBinding* binding = new RubyReferenceBinding(reference); + reference->setBinding(binding); + refiter++; + } + } + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyImplementation.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyImplementation.h new file mode 100644 index 0000000000..c7bc851635 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyImplementation.h @@ -0,0 +1,136 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_ruby_model_rubyimplementation_h +#define tuscany_sca_ruby_model_rubyimplementation_h + +#include <string> + +#include "tuscany/sca/ruby/Ruby.h" +#include "tuscany/sca/model/ComponentType.h" + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + /** + * Holds information about an SCA implementation written in Ruby + */ + class RubyImplementation : public tuscany::sca::model::ComponentType + { + + public: + /** + * Constructor. + * @param composite The composite containing this implementation. + * @param module Name of the Ruby module. + * @param className Name of the Ruby implementation class. + * @param script Path of the Ruby script. + */ + RubyImplementation(tuscany::sca::model::Composite* composite, + const std::string& module, const std::string& className, const std::string& script); + + /** + * Destructor + */ + virtual ~RubyImplementation(); + + /** + * Initialize a component of this type. + * @param component The component to initialize. + */ + virtual void initializeComponent(tuscany::sca::model::Component* component); + + /** + * Returns the name of the Ruby module. + * @return The name of the Ruby module. + */ + const std::string& getModule() const { return module; } + + /** + * Returns the name of Ruby class. + * @return Name of the Ruby class. + */ + const std::string& getClass() const { return className; } + + /** + * Returns the path of the Ruby script. + * @return The path of the Ruby script. + */ + const std::string& getScript() const { return script; } + + /** + * Returns the Ruby implementation class + */ + VALUE getImplementationClass() const { return implementationClass; } + + /** + * Returns the Ruby REXML::Document class + */ + static VALUE getXMLDocumentClass(); + + private: + + /** + * Load the Ruby implementation class + */ + void loadClass(); + + /** + * Name of the Ruby module. + */ + std::string module; + + /** + * Name of the Ruby class. + */ + std::string className; + + /** + * Path of the Ruby script. + */ + std::string script; + + /** + * The Ruby implementation class + */ + VALUE implementationClass; + + /** + * True if the Ruby runtime has been initialized + */ + static bool initialized; + + /** + * The Ruby REXML::Document class. + */ + static VALUE xmlDocumentClass; + + }; + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_model_rubyimplementation_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyReferenceBinding.cpp new file mode 100644 index 0000000000..3187c07973 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyReferenceBinding.cpp @@ -0,0 +1,60 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/ruby/model/RubyReferenceBinding.h" +#include "tuscany/sca/ruby/RubyServiceProxy.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + // Constructor + RubyReferenceBinding::RubyReferenceBinding(Reference* reference) + : ReferenceBinding(reference, ""), serviceProxy(NULL) + { + } + + // Destructor + RubyReferenceBinding::~RubyReferenceBinding() + { + } + + ServiceProxy* RubyReferenceBinding::getServiceProxy() + { + return serviceProxy; + } + + void RubyReferenceBinding::configure(ServiceBinding* binding) + { + setTargetServiceBinding(binding); + + serviceProxy = new RubyServiceProxy(getReference()); + } + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyReferenceBinding.h new file mode 100644 index 0000000000..72d39b5639 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyReferenceBinding.h @@ -0,0 +1,83 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_ruby_model_rubyreferencebinding_h +#define tuscany_sca_ruby_model_rubyreferencebinding_h + +#include <string> + +#include "tuscany/sca/model/ReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + /** + * Information about a Ruby service binding for service or a reference. + */ + class RubyReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + */ + RubyReferenceBinding(tuscany::sca::model::Reference* reference); + + /** + * Destructor. + */ + virtual ~RubyReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#RubyImplementationBinding"; }; + + /** + * Create a proxy representing the reference to the + * client component. + */ + virtual ServiceProxy* getServiceProxy(); + + /** + * Configure this binding from a service binding. + */ + virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + private: + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + }; + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_model_rubyreferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyServiceBinding.cpp new file mode 100644 index 0000000000..163f8a9d8b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyServiceBinding.cpp @@ -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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/ruby/model/RubyServiceBinding.h" +#include "tuscany/sca/ruby/RubyServiceWrapper.h" + +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + + // Constructor + RubyServiceBinding::RubyServiceBinding(Service* service) + : ServiceBinding(service, "") + { + serviceWrapper = new RubyServiceWrapper(service); + } + + // Destructor + RubyServiceBinding::~RubyServiceBinding() + { + } + + ServiceWrapper* RubyServiceBinding::getServiceWrapper() + { + return (ServiceWrapper*)serviceWrapper; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyServiceBinding.h new file mode 100644 index 0000000000..b772daf712 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/src/tuscany/sca/ruby/model/RubyServiceBinding.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_ruby_model_rubyservicebinding_h +#define tuscany_sca_ruby_model_rubyservicebinding_h + +#include <string> + +#include "tuscany/sca/model/ServiceBinding.h" + +namespace tuscany +{ + namespace sca + { + namespace ruby + { + /** + * Information about a Ruby service binding for service or a reference. + */ + class RubyServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + */ + RubyServiceBinding(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~RubyServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#RubyImplementationBinding"; }; + + /** + * Create a wrapper for the service configured by this + * binding. + */ + virtual ServiceWrapper* getServiceWrapper(); + + private: + + /** + * The wrapper for the service configured by this binding. + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace ruby + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ruby_model_rubyservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/xsd/sca-implementation-ruby.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/xsd/sca-implementation-ruby.xsd new file mode 100644 index 0000000000..5772019a4f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ruby/xsd/sca-implementation-ruby.xsd @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="implementation.ruby" type="sca:RubyImplementation" substitutionGroup="sca:implementation"/> + <complexType name="RubyImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="script" type="NCName" use="optional"/> + <attribute name="module" type="NCName" use="optional"/> + <attribute name="class" type="Name" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/Makefile.am new file mode 100644 index 0000000000..50dfb45557 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +SUBDIRS = reference service +datadir=$(prefix)/extensions/sca + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/Makefile.am new file mode 100644 index 0000000000..2b9491ec1c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = src diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/Makefile.am new file mode 100644 index 0000000000..d5fdf775ca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/Makefile.am @@ -0,0 +1,42 @@ +# 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. + +libdir=$(prefix)/extensions/sca/reference/lib +lib_LTLIBRARIES = libtuscany_sca_binding_reference.la + +noinst_HEADERS = \ +tuscany/sca/binding/*.h \ +tuscany/sca/binding/model/*.h + +libtuscany_sca_binding_reference_la_SOURCES = \ +tuscany/sca/binding/SCAServiceBindingExtension.cpp \ +tuscany/sca/binding/model/SCAServiceBinding.cpp + +libtuscany_sca_binding_reference_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo -ltuscany_sdo_axiom \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include + +moduledir=$(prefix)/extensions/sca/reference/module +extension = libtuscany_sca_binding_reference$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/SCAServiceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/SCAServiceBindingExtension.cpp new file mode 100644 index 0000000000..7d70f595cc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/SCAServiceBindingExtension.cpp @@ -0,0 +1,103 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "SCAServiceBindingExtension.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_binding_reference_initialize() + { + tuscany::sca::binding::SCAServiceBindingExtension::initialize(); + } +} + + +namespace tuscany +{ + namespace sca + { + namespace binding + { + // =================================================================== + // Constructor for the SCAServiceBinding class. + // =================================================================== + SCAServiceBindingExtension::SCAServiceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the SCAServiceBindingExtension class. + // =================================================================== + SCAServiceBindingExtension::~SCAServiceBindingExtension() + { + logentry(); + } + + const string SCAServiceBindingExtension::extensionName("sca"); + const string SCAServiceBindingExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#SCABinding"); + + + // =================================================================== + // loadModelElement - load the info from binding.ws + // =================================================================== + ServiceBinding* SCAServiceBindingExtension::getServiceBinding(Composite *composite, Service* service, DataObjectPtr scdlBinding) + { + logentry(); + + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + + ServiceBindingExtension* bindingExtension = NULL; // runtime->getServiceBindingExtension("http://www.osoa.org/xmlns/sca/1.0#RESTBinding"); + if (bindingExtension == NULL) + { + bindingExtension = runtime->getServiceBindingExtension("http://www.osoa.org/xmlns/sca/1.0#WebServiceBinding"); + if (bindingExtension == NULL) + { + logerror("SCA default binding requires the REST or WS binding to be available"); + + string message = "SCA default binding requires the REST or WS binding to be available"; + throwException(SystemConfigurationException, message.c_str()); + } + } + + return bindingExtension->getServiceBinding(composite, service, scdlBinding); + } + + void SCAServiceBindingExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerServiceBindingExtension(new SCAServiceBindingExtension()); + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/SCAServiceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/SCAServiceBindingExtension.h new file mode 100644 index 0000000000..389541061a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/SCAServiceBindingExtension.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_binding_scaservicebindingextension_h +#define tuscany_sca_extension_binding_scaservicebindingextension_h + +#include "tuscany/sca/extension/ServiceBindingExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace binding + { + + class SCAServiceBindingExtension : public ServiceBindingExtension + { + public: + /** + * Default constructor + */ + SCAServiceBindingExtension(); + + /** + * Destructor + */ + virtual ~SCAServiceBindingExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.ws") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ServiceBinding* getServiceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Service* service, + commonj::sdo::DataObjectPtr scdlBinding); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace binding + } // End namespace sca +} // End namespace tuscany + +#endif //tuscany_sca_extension_binding_scaservicebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/model/SCAServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/model/SCAServiceBinding.cpp new file mode 100644 index 0000000000..3b5564a765 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/model/SCAServiceBinding.cpp @@ -0,0 +1,59 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/binding/model/SCAServiceBinding.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace binding + { + + // Constructor + SCAServiceBinding::SCAServiceBinding(Composite* composite, Service* service, const string& uri, DataObjectPtr scdlBinding) + : ServiceBinding(service, uri) + { + } + + // Destructor + SCAServiceBinding::~SCAServiceBinding() + { + } + + ServiceWrapper* SCAServiceBinding::getServiceWrapper() + { + logentry(); + + throwException(SystemConfigurationException, "Not supported"); + } + + } // End namespace binding + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/model/SCAServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/model/SCAServiceBinding.h new file mode 100644 index 0000000000..d73a10f202 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/reference/src/tuscany/sca/binding/model/SCAServiceBinding.h @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_binding_model_scaservicebinding_h +#define tuscany_sca_extension_binding_model_scaservicebinding_h + +#include <string> + +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + namespace binding + { + /** + * Information about an SCA service binding for service or a reference. + */ + class SCAServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + */ + SCAServiceBinding(tuscany::sca::model::Composite* composite, tuscany::sca::model::Service* service, const std::string& uri, commonj::sdo::DataObjectPtr scdlBinding); + + /** + * Destructor. + */ + virtual ~SCAServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#SCABinding"; }; + + /** + * Create a service wrapper handling the interaction + * with the service configured with this binding. + */ + virtual tuscany::sca::ServiceWrapper* getServiceWrapper(); + + private: + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_model_wsservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/Makefile.am new file mode 100644 index 0000000000..2b9491ec1c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = src diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/Makefile.am new file mode 100644 index 0000000000..1136dba677 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/Makefile.am @@ -0,0 +1,42 @@ +# 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. + +libdir=$(prefix)/extensions/sca/service/lib +lib_LTLIBRARIES = libtuscany_sca_binding_service.la + +noinst_HEADERS = \ +tuscany/sca/binding/*.h \ +tuscany/sca/binding/model/*.h + +libtuscany_sca_binding_service_la_SOURCES = \ +tuscany/sca/binding/SCAReferenceBindingExtension.cpp \ +tuscany/sca/binding/model/SCAReferenceBinding.cpp + +libtuscany_sca_binding_service_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo -ltuscany_sdo_axiom \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include + +moduledir=$(prefix)/extensions/sca/service/module +extension = libtuscany_sca_binding_service$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/SCAReferenceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/SCAReferenceBindingExtension.cpp new file mode 100644 index 0000000000..789d8794df --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/SCAReferenceBindingExtension.cpp @@ -0,0 +1,103 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "SCAReferenceBindingExtension.h" +#include "model/SCAReferenceBinding.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/core/Exceptions.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_binding_service_initialize() + { + tuscany::sca::binding::SCAReferenceBindingExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace binding + { + // =================================================================== + // Constructor for the SCAReferenceBinding class. + // =================================================================== + SCAReferenceBindingExtension::SCAReferenceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the SCAReferenceBindingExtension class. + // =================================================================== + SCAReferenceBindingExtension::~SCAReferenceBindingExtension() + { + logentry(); + } + + const string SCAReferenceBindingExtension::extensionName("sca"); + const string SCAReferenceBindingExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#SCABinding"); + + // =================================================================== + // loadModelElement - load the info from binding.ws + // =================================================================== + ReferenceBinding* SCAReferenceBindingExtension::getReferenceBinding(Composite *composite, Reference* reference, DataObjectPtr scdlBinding) + { + logentry(); + + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + + ReferenceBindingExtension* bindingExtension = NULL; // runtime->getReferenceBindingExtension("http://www.osoa.org/xmlns/sca/1.0#RESTBinding"); + if (bindingExtension == NULL) + { + bindingExtension = runtime->getReferenceBindingExtension("http://www.osoa.org/xmlns/sca/1.0#WebServiceBinding"); + if (bindingExtension == NULL) + { + logerror("SCA default binding requires the REST or WS binding to be available"); + + string message = "SCA default binding requires the REST or WS binding to be available"; + throwException(SystemConfigurationException, message.c_str()); + } + } + + return bindingExtension->getReferenceBinding(composite, reference, scdlBinding); + } + + void SCAReferenceBindingExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerReferenceBindingExtension(new SCAReferenceBindingExtension()); + } + + } // End namespace binding + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/SCAReferenceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/SCAReferenceBindingExtension.h new file mode 100644 index 0000000000..8cde2fbef4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/SCAReferenceBindingExtension.h @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_binding_scareferencebindingextension_h +#define tuscany_sca_extension_binding_scareferencebindingextension_h + +#include "tuscany/sca/extension/ReferenceBindingExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace binding + { + + class SCAReferenceBindingExtension : public ReferenceBindingExtension + { + public: + /** + * Default constructor + */ + SCAReferenceBindingExtension(); + + /** + * Destructor + */ + virtual ~SCAReferenceBindingExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.ws") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ReferenceBinding* getReferenceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Reference *reference, + commonj::sdo::DataObjectPtr scdlBinding); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace binding + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_binding_scareferencebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/model/SCAReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/model/SCAReferenceBinding.cpp new file mode 100644 index 0000000000..b8eaaaa1f9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/model/SCAReferenceBinding.cpp @@ -0,0 +1,66 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/binding/model/SCAReferenceBinding.h" +#include "tuscany/sca/core/ServiceProxy.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace binding + { + + // Constructor + SCAReferenceBinding::SCAReferenceBinding(Composite* composite, Reference* reference, const string& uri, DataObjectPtr scdlBinding) + : ReferenceBinding(reference, uri) + { + } + + // Destructor + SCAReferenceBinding::~SCAReferenceBinding() + { + } + + ServiceProxy* SCAReferenceBinding::getServiceProxy() + { + throwException(SystemConfigurationException, "Not supported"); + } + + void SCAReferenceBinding::configure(ServiceBinding* serviceBinding) + { + throwException(SystemConfigurationException, "Not supported"); + } + + void SCAReferenceBinding::configure(const std::string& uri) + { + throwException(SystemConfigurationException, "Not supported"); + } + + } // End namespace binding + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/model/SCAReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/model/SCAReferenceBinding.h new file mode 100644 index 0000000000..f3e699e2ee --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/service/src/tuscany/sca/binding/model/SCAReferenceBinding.h @@ -0,0 +1,85 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_binding_model_scareferencebinding_h +#define tuscany_sca_extension_binding_model_scareferencebinding_h + +#include <string> + +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ReferenceBinding.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/core/ServiceProxy.h" + +namespace tuscany +{ + namespace sca + { + namespace binding + { + /** + * Information about a web service binding for service or a reference. + */ + class SCAReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + */ + SCAReferenceBinding(tuscany::sca::model::Composite* composite, tuscany::sca::model::Reference* reference, const std::string&uri, commonj::sdo::DataObjectPtr scdlBinding); + + /** + * Destructor. + */ + virtual ~SCAReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#SCABinding"; }; + + /** + * Create a proxy representing the reference to the + * client component. + */ + virtual tuscany::sca::ServiceProxy* getServiceProxy(); + + /** + * Configure this binding from a service binding. + */ + virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + /** + * Configure this binding from a URI. + */ + virtual void configure(const std::string& uri); + + private: + + }; + + } // End namespace binding + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_binding_model_scareferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/xsd/sca-binding-sca.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/xsd/sca-binding-sca.xsd new file mode 100644 index 0000000000..6ec18bd992 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/sca/xsd/sca-binding-sca.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="binding.sca" type="sca:SCABinding" substitutionGroup="sca:binding"/> + <complexType name="SCABinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/Makefile.am new file mode 100644 index 0000000000..806786ce04 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +SUBDIRS = reference service +datadir=$(prefix)/extensions/ws + +nobase_data_DATA = xsd/*.xsd + +EXTRA_DIST = xsd diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/Makefile.am new file mode 100644 index 0000000000..18e9ba89b9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = axis2c diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/Makefile.am new file mode 100644 index 0000000000..2b9491ec1c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = src diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/Makefile.am new file mode 100644 index 0000000000..fbf304f8c2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/Makefile.am @@ -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. + +libdir=$(prefix)/extensions/ws/reference/lib +lib_LTLIBRARIES = libtuscany_sca_ws_reference.la + +noinst_HEADERS = tuscany/sca/ws/*.h tuscany/sca/ws/model/*.h + +libtuscany_sca_ws_reference_la_SOURCES = \ +tuscany/sca/ws/WSServiceBindingExtension.cpp \ +tuscany/sca/ws/model/WSServiceBinding.cpp \ +tuscany/sca/ws/WSServiceWrapper.cpp \ +tuscany/sca/ws/Axis2Client.cpp + +libtuscany_sca_ws_reference_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo -ltuscany_sdo_axiom \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L$(AXIS2C_HOME)/lib \ + -laxis2_util \ + -laxis2_axiom \ + -laxis2_wsdl \ + -laxis2_engine \ + -laxis2_parser \ + -laxis2_minizip \ + -lpthread \ + -lwoden \ + -laxis2_http_sender \ + -laxis2_http_receiver + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include \ + -I${AXIS2C_HOME}/include + +moduledir=$(prefix)/extensions/ws/reference/module +extension = libtuscany_sca_ws_reference$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp new file mode 100644 index 0000000000..fa55c049b7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp @@ -0,0 +1,820 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4091) +#pragma warning(disable: 4786) +#endif + +#include <sstream> + +#include <axis2_client.h> + +#include <axis2_error_default.h> +#include <axis2_log_default.h> +#include <axis2_defines.h> +#include <axiom_soap_const.h> +#include <platforms/axis2_platform_auto_sense.h> + +#include <sdo_axiom.h> + +#include "Axis2Client.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/SDOUtils.h" +#include "model/WSServiceBinding.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/WSDLInterface.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "tuscany/sca/model/WSDLMessagePart.h" + +using namespace std; +using namespace commonj::sdo; +using namespace commonj::sdo_axiom; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + Axis2Client::Axis2Client(CompositeReference* compositeReference) + : compositeReference(compositeReference) + { + logentry(); + } + + Axis2Client::~Axis2Client() + { + logentry(); + } + + void Axis2Client::invoke(tuscany::sca::Operation& operation) + { + logentry(); + + // Initialize Axis2 stuff + axis2_env_t *env = axis2_env_create_all("tuscany_ws_reference.log",AXIS2_LOG_LEVEL_TRACE); + axis2_error_init(); + + // Get the WS service binding and WSDLOperation + Composite* composite=compositeReference->getComposite(); + Service* service = compositeReference->getService(); + WSServiceBinding* binding = (WSServiceBinding *)service->getBinding(); + const string& operationName = operation.getName(); + WSDLOperation wsdlOperation; + + // Get the WSDL namespace + string wsdlNamespace = binding->getWSDLNamespaceURL(); + if (wsdlNamespace != "") + { + + // Lookup the wsdl model from the composite, keyed on the namespace + // (the wsdl will have been loaded at startup) + WSDLDefinition* wsdlDefinition = composite->findWSDLDefinition(wsdlNamespace); + if (wsdlDefinition == 0) + { + string msg = "WSDL not found for " + wsdlNamespace; + throwException(SystemConfigurationException, msg.c_str()); + } + + // Match the operation in Operation to the operation in the wsdl port type. + try + { + wsdlOperation = wsdlDefinition->findOperation( + binding->getServiceName(), + binding->getEndpointName(), + operationName); + } + catch(SystemConfigurationException&) + { + throw; + } + } + else + { + Interface* iface = service->getType()->getInterface(); + if (iface != NULL && + iface->getInterfaceTypeQName() == WSDLInterface::typeQName) + { + WSDLInterface* wsdlInterface = (WSDLInterface*)iface; + wsdlNamespace = wsdlInterface->getNamespaceURI(); + + if (wsdlNamespace != "") + { + + WSDLDefinition* wsdl = composite->findWSDLDefinition(wsdlNamespace); + if (wsdl == 0) + { + string msg = "WSDL not found for " + wsdlNamespace; + throwException(SystemConfigurationException, msg.c_str()); + } + + try + { + wsdlOperation = wsdl->findOperation(wsdlInterface->getName(), operationName); + } + catch(SystemConfigurationException&) + { + throw; + } + } + } + } + + if (wsdlNamespace == "") + { + + // Create a default document literal wrapped WSDL operation + WSDLMessagePart inputPart(operationName, "", "http://tempuri.org"); + WSDLMessagePart outputPart((operationName+"Response"), "", "http://tempuri.org"); + wsdlNamespace = compositeReference->getName(); + wsdlOperation = WSDLOperation(); + wsdlOperation.setOperationName(operationName); + wsdlOperation.setSoapAction(wsdlNamespace+ "#" +operationName); + wsdlOperation.setEndpoint(""); + wsdlOperation.setSoapVersion(WSDLOperation::SOAP11); + wsdlOperation.setDocumentStyle(true); + wsdlOperation.setWrappedStyle(true); + wsdlOperation.setInputEncoded(false); + wsdlOperation.setOutputEncoded(false); + wsdlOperation.setInputMessagePart(operationName, inputPart); + wsdlOperation.setOutputMessagePart((operationName+"Response"), outputPart); + } + else if (!wsdlOperation.isDocumentStyle() || !wsdlOperation.isWrappedStyle()) + { + throwException(ServiceInvocationException, + "Only wrapped document style WSDL operations are currentlysupported"); + } + + // The URI specified in the binding overrides the address specified in + // the WSDL + axis2_char_t* address; + + // Get the URI configured on the top level component + string bindingURI = ""; + SCARuntime* runtime = SCARuntime::getCurrentRuntime(); + Component* component = runtime->getDefaultComponent(); + Reference* reference = component->findReference(compositeReference->getName()); + if (reference != NULL) + { + ReferenceBinding* referenceBinding = reference->getBinding(); + if (referenceBinding != NULL && referenceBinding->getURI() != "") + { + bindingURI = referenceBinding->getURI(); + } + } + if (bindingURI == "") + { + // Get the URI configured on the binding + if (binding->getURI() != "") + { + bindingURI = binding->getURI(); + } + } + if (bindingURI != "") + { + // Prepend the default base URI if the URI is not absolute + if (bindingURI.find("://") == string::npos) + { + bindingURI = runtime->getDefaultBaseURI() + string("/axis2/services/") + bindingURI; + } + address = (axis2_char_t*)bindingURI.c_str(); + } + else + { + address = (axis2_char_t*)wsdlOperation.getEndpoint().c_str(); + } + + axis2_char_t* opName = (axis2_char_t*)operationName.c_str(); + axis2_char_t* soap_action = (axis2_char_t*)wsdlOperation.getSoapAction().c_str(); + + // create OM from Operation and wsdlOperation + axiom_node_t* payload = createPayload(operation, wsdlOperation, env); + /* Create EPR with given address */ + axis2_endpoint_ref_t* endpoint_ref = axis2_endpoint_ref_create(env, address); + + /* Setup options */ + axis2_options_t* options = axis2_options_create(env); + AXIS2_OPTIONS_SET_TO(options, env, endpoint_ref); + int soap_version = AXIOM_SOAP11; + if (binding->getSOAPVersion() == "1.2") + { + soap_version = AXIOM_SOAP12; + } + else + { + if (wsdlOperation.getSoapVersion() == WSDLOperation::SOAP12) + { + soap_version = AXIOM_SOAP12; + } + } + + AXIS2_OPTIONS_SET_SOAP_VERSION(options, env, soap_version); + AXIS2_OPTIONS_SET_ACTION(options, env, soap_action); + AXIS2_OPTIONS_SET_XML_PARSER_RESET(options, env, AXIS2_FALSE); + + loginfo("WS SOAP action: %s", soap_action); + loginfo("WS Endpoint address: %s", address); + if(soap_version == AXIOM_SOAP11) + { + // Only set the SOAP action when using SOAP1.1 + AXIS2_OPTIONS_SET_SOAP_ACTION(options, env, soap_action); + loginfo("Set soap version: 1.1"); + } + else if(soap_version == AXIOM_SOAP12) + { + loginfo("Set soap version: 1.2"); + } + else + { + loginfo("Set soap version: unset"); + } + /* Create service client */ + + axis2_char_t* client_home = AXIS2_GETENV("AXIS2C_HOME"); + if (!client_home) + { + throwException(SystemConfigurationException, "AXIS2C_HOME not set"); + } + axis2_svc_client_t* svc_client = axis2_svc_client_create(env, client_home); + if (!svc_client) + { + ostringstream msg; + msg << "Axis2 svc_client_create failed, error: " << env->error->error_number << + ", " << AXIS2_ERROR_GET_MESSAGE(env->error); + throwException(SystemConfigurationException, msg.str().c_str()); + } + + /* Set service client options */ + AXIS2_SVC_CLIENT_SET_OPTIONS(svc_client, env, options); + + /* Engage addressing module */ + AXIS2_SVC_CLIENT_ENGAGE_MODULE(svc_client, env, AXIS2_MODULE_ADDRESSING); + + loginfo("Sending WS request"); + /* Send request */ + axiom_node_t* ret_node = AXIS2_SVC_CLIENT_SEND_RECEIVE(svc_client, env, payload); + if(ret_node) + { + setReturn(ret_node, operation, wsdlOperation, env); + + // Set return value - now need to detach the node from the Axiom document + // for clean-up + axiom_document_t *document = AXIOM_NODE_GET_DOCUMENT(ret_node, env); + if (document) + { + AXIOM_DOCUMENT_BUILD_ALL (document, env); + } + AXIOM_NODE_DETACH (ret_node, env); + } + else + { + ostringstream msg; + msg << "Axis2 client_send_received failed, error: " << env->error->error_number << + ", " << AXIS2_ERROR_GET_MESSAGE(env->error); + throwException(ServiceInvocationException, msg.str().c_str()); + } + + if (svc_client) + { + AXIS2_SVC_CLIENT_FREE(svc_client, env); + svc_client = NULL; + } + + if(env) + { + axis2_env_free((axis2_env_t *) env); + env = NULL; + } + loginfo("Freed env"); + + } + + axiom_node_t* Axis2Client::createPayload(Operation& operation, + const WSDLOperation& wsdlOperation, + axis2_env_t* env) + { + logentry(); + + axiom_node_t* request_node = NULL; + + // Build up the payload as an SDO + + // Get the data factory for the composite (it will already have the typecreates loaded for the xsds) + DataFactoryPtr dataFactory = compositeReference->getComposite()->getDataFactory(); + + DataObjectPtr inputDataObject; + string inputTypeUri; + string inputTypeName; + + try + { + // Since its Document wrapped, there will only be one part + std::list<std::string> partList = wsdlOperation.getInputMessagePartNames(); + const WSDLMessagePart &inputMessage = + wsdlOperation.getInputMessagePart(partList.front()); + inputTypeName = inputMessage.getPartType(); + inputTypeUri = inputMessage.getPartUri(); + + // Create the input wrapper + const Type& rootType = dataFactory->getType(inputTypeUri.c_str(), "RootType"); + const Property& prop = rootType.getProperty(inputTypeName.c_str()); + const Type& inputType = prop.getType(); + inputDataObject = dataFactory->create(inputType); + } + catch (SDORuntimeException&) + { + try + { + // Create the input wrapper + const Type& inputType = + dataFactory->getType(inputTypeUri.c_str(), inputTypeName.c_str()); + inputDataObject = dataFactory->create(inputType); + } + catch (SDORuntimeException&) + { + + // The input wrapper type is not known, create an open DataObject + //inputDataObject = dataFactory->create("http://tempuri.org", "Wrapper"); + inputDataObject = dataFactory->create(SDOUtils::sdoURI, "OpenDataObject"); + } + } + + // Go through data object to set the input parameters + PropertyList pl = inputDataObject->getType().getProperties(); + + if(pl.size() == 0) + { + if(inputDataObject->getType().isOpenType() && inputDataObject->getType().isDataObjectType()) + { + /* + * This code deals with sending xsd:any elements + */ + for (unsigned int i=0; i<operation.getNParms(); i++) + { + ostringstream pname; + pname << "param" << (i+1); + DataObjectList& l = inputDataObject->getList(pname.str()); + + const Operation::Parameter& parm = operation.getParameter(i); + switch(parm.getType()) + { + case Operation::BOOL: + { + l.append(*(bool*)parm.getValue()); + break; + } + case Operation::SHORT: + { + l.append(*(short*)parm.getValue()); + break; + } + case Operation::INT: + { + l.append(*(long*)parm.getValue()); + break; + } + case Operation::LONG: + { + l.append(*(long*)parm.getValue()); + break; + } + case Operation::USHORT: + { + l.append(*(short*)parm.getValue()); + break; + } + case Operation::UINT: + { + l.append(*(long*)parm.getValue()); + break; + } + case Operation::ULONG: + { + l.append(*(long*)parm.getValue()); + break; + } + case Operation::FLOAT: + { + l.append(*(float*)parm.getValue()); + break; + } + case Operation::DOUBLE: + { + l.append(*(long double*)parm.getValue()); + break; + } + case Operation::LONGDOUBLE: + { + l.append(*(long double*)parm.getValue()); + break; + } + case Operation::CHARS: + { + l.append(*(char**)parm.getValue()); + break; + } + case Operation::STRING: + { + l.append((*(string*)parm.getValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + l.append(*(DataObjectPtr*)parm.getValue()); + break; + } + default: + { + ostringstream msg; + msg << "Unsupported parameter type: " << parm.getType(); + throwException(ServiceDataException, msg.str().c_str()); + } + } + } + } + } + else { + + // Each parameter in the operation should be a property on the request dataobject + for (unsigned int i=0; i<operation.getNParms(); i++) + { + const Operation::Parameter& parm = operation.getParameter(i); + switch(parm.getType()) + { + case Operation::BOOL: + { + inputDataObject->setBoolean(i, *(bool*)parm.getValue()); + break; + } + case Operation::SHORT: + { + inputDataObject->setShort(i, *(short*)parm.getValue()); + break; + } + case Operation::INT: + { + inputDataObject->setInt(i, *(int*)parm.getValue()); + break; + } + case Operation::LONG: + { + inputDataObject->setLong(i, *(long*)parm.getValue()); + break; + } + case Operation::USHORT: + { + inputDataObject->setInt(i, *(unsigned short*)parm.getValue()); + break; + } + case Operation::UINT: + { + inputDataObject->setInt(i, *(unsigned int*)parm.getValue()); + break; + } + case Operation::ULONG: + { + inputDataObject->setInt(i, *(unsigned long*)parm.getValue()); + break; + } + case Operation::FLOAT: + { + inputDataObject->setFloat(i, *(float*)parm.getValue()); + break; + } + case Operation::DOUBLE: + { + inputDataObject->setDouble(i, *(double*)parm.getValue()); + break; + } + case Operation::LONGDOUBLE: + { + inputDataObject->setDouble(i, *(long double*)parm.getValue()); + break; + } + case Operation::CHARS: + { + inputDataObject->setCString(i, *(char**)parm.getValue()); + break; + } + case Operation::STRING: + { + inputDataObject->setCString(i, (*(string*)parm.getValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + inputDataObject->setDataObject(i, *(DataObjectPtr*)parm.getValue()); + break; + } + default: + ostringstream msg; + msg << "Unsupported parameter type: " << parm.getType(); + throwException(ServiceDataException, msg.str().c_str()); + } + } + } + + // Create the Axiom object from the request dataobject + AxiomHelper* axiomHelper = AxiomHelper::getHelper(); + request_node = axiomHelper->toAxiomNode(inputDataObject, + inputTypeUri.c_str(), inputTypeName.c_str()); + AxiomHelper::releaseHelper(axiomHelper); + + char* str = AXIOM_NODE_TO_STRING(request_node, env); + loginfo("Sending Axis2 OM: %s ", str); + + return request_node; + + } + + void Axis2Client::setReturn(axiom_node_t* ret_node, + Operation& operation, + const WSDLOperation& wsdlOperation, + axis2_env_t* env) + { + logentry(); + + DataFactoryPtr dataFactory = compositeReference->getComposite()->getDataFactory(); + + // Get the AXIOM node representing the SOAP Body + axiom_node_t* body = AXIOM_NODE_GET_PARENT(ret_node, env); + + // Convert the AXIOM node to an SDO DataObject + char* str = NULL; + str = AXIOM_NODE_TO_STRING(body, env); + if (str) + { + loginfo("Received Axis2 OM: %s ", str); + } + + // Convert the SOAP body to an SDO DataObject + AxiomHelper* axiomHelper = AxiomHelper::getHelper(); + DataObjectPtr outputBodyDataObject = axiomHelper->toSdo(body, dataFactory); + AxiomHelper::releaseHelper(axiomHelper); + + if(!outputBodyDataObject) + { + string msg = "Could not convert Axis2 OM node to SDO"; + throwException(ServiceInvocationException, msg.c_str()); + } + else + { + ostringstream os; + os << outputBodyDataObject; + loginfo("Converted Axis2 OM node to SDO: %s", os.str().c_str()); + } + + XMLHelperPtr xmlHelper = compositeReference->getComposite()->getXMLHelper(); + + // Get the first body part representing the doc-lit-wrapped wrapper element + DataObjectPtr outputDataObject = NULL; + PropertyList bpl = outputBodyDataObject->getInstanceProperties(); + if (bpl.size()!=0) + { + if (bpl[0].isMany()) + { + DataObjectList& parts = outputBodyDataObject->getList((unsigned int)0); + outputDataObject = parts[0]; + } + else + { + outputDataObject = outputBodyDataObject->getDataObject(bpl[0]); + } + } + if (outputDataObject == NULL) + { + string msg = "Could not convert Axis2 body part to SDO"; + throwException(ServiceInvocationException, msg.c_str()); + } + + PropertyList pl = outputDataObject->getType().getProperties(); + if (pl.size() == 0) + { + if (outputDataObject->getType().isOpenType() && outputDataObject->getType().isDataObjectType()) + { + SequencePtr sequence = outputDataObject->getSequence(); + if (sequence != NULL && sequence->size() != 0) + { + // Return a text element + if (sequence->isText(0)) + { + string* stringData = new string(sequence->getCStringValue(0)); + operation.setReturnValue(stringData); + } + else + { + // Return a DataObject representing a complex element + DataObjectPtr *dataObjectData = new DataObjectPtr; + *dataObjectData = sequence->getDataObjectValue(0); + if(!*dataObjectData) + { + loginfo("Null DataObject return value"); + } + else + { + (*dataObjectData)->detach(); + } + operation.setReturnValue(dataObjectData); + } + } + } + } + else + { + const Property* p = &pl[0]; + + switch(pl[0].getTypeEnum()) + { + case Type::BooleanType: + { + bool* boolData = new bool; + *boolData = outputDataObject->getBoolean(pl[0]); + operation.setReturnValue(boolData); + } + break; + case Type::ByteType: + { + char* byteData = new char; + *byteData = outputDataObject->getByte(pl[0]); + operation.setReturnValue(byteData); + } + break; + case Type::BytesType: + { + int len = outputDataObject->getLength(pl[0]); + char** bytesData = new char*; + *bytesData = new char[len+1]; + int bytesWritten = outputDataObject->getBytes(pl[0], *bytesData, len); + // Ensure the bytes end with the null char. Not sure if this is neccessary + if(bytesWritten <= len) + { + (*bytesData)[bytesWritten] = 0; + } + else + { + (*bytesData)[len] = 0; + } + //printf("outputDataObject has BytesType named %s with length %d\n", name, bytesWritten); + operation.setReturnValue(bytesData); + } + break; + case Type::CharacterType: + { + // This code should work but won't be used as there is no mapping from an XSD type to the SDO CharacterType + wchar_t* charData = new wchar_t; + *charData = outputDataObject->getCharacter(pl[0]); + operation.setReturnValue(charData); + } + break; + case Type::DoubleType: + { + long double* doubleData = new long double; + *doubleData = outputDataObject->getDouble(pl[0]); + operation.setReturnValue(doubleData); + } + break; + case Type::FloatType: + { + float* floatData = new float; + *floatData = outputDataObject->getFloat(pl[0]); + operation.setReturnValue(floatData); + } + break; + case Type::IntType: + { + long* intData = new long; + *intData = outputDataObject->getInt(pl[0]); + operation.setReturnValue(intData); + } + break; + case Type::ShortType: + { + short* shortData = new short; + *shortData = outputDataObject->getShort(pl[0]); + operation.setReturnValue(shortData); + } + break; + case Type::StringType: + { + string* stringData = new string(outputDataObject->getCString(pl[0])); + operation.setReturnValue(stringData); + } + break; + case Type::DataObjectType: + { + if (!strcmp(pl[0].getType().getURI(), SDOUtils::sdoURI) && + !strcmp(pl[0].getType().getName(), "OpenDataObject")) { + + /* + * This code deals with xsd:any element parameters + */ + + DataObjectList& dataObjectList = outputDataObject->getList(pl[0]); + + for(unsigned int j=0; j<dataObjectList.size(); j++) + { + DataObjectPtr dob = dataObjectList[j]; + if(!dob) + { + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = NULL; + operation.setReturnValue(dataObjectData); + loginfo("Null OpenDataObject return value"); + } + else + { + + SequencePtr sequence = dob->getSequence(); + if (sequence->size()!=0) + { + // Return a text element + if (sequence->isText(0)) + { + string* stringData = new string(sequence->getCStringValue(0)); + operation.setReturnValue(stringData); + } + else + { + // Return a DataObject representing a complex element + DataObjectPtr *dataObjectData = new DataObjectPtr; + *dataObjectData = sequence->getDataObjectValue(0); + if(!*dataObjectData) + { + loginfo("Null DataObject return value"); + } + else + { + (*dataObjectData)->detach(); + } + operation.setReturnValue(dataObjectData); + } + } + else + { + // Empty content, add an empty string + loginfo("Null OpenDataObject return value"); + string *stringData = new string(""); + operation.setReturnValue(stringData); + } + } + } + } + else { + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = outputDataObject->getDataObject(pl[0]); + if(!*dataObjectData) + { + loginfo("Null DataObject return value"); + } + else + { + (*dataObjectData)->detach(); + } + operation.setReturnValue(dataObjectData); + } + } + break; + default: + { + ostringstream msg; + msg << "Unsupported result type: " << pl[0].getTypeEnum(); + throwException(SystemConfigurationException, msg.str().c_str()); + } + } + } + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.h new file mode 100644 index 0000000000..397440dd5d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.h @@ -0,0 +1,65 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_extension_ws_axis2client_h +#define tuscany_sca_extension_ws_axis2client_h + +#include <axiom.h> + +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/CompositeReference.h" +#include "tuscany/sca/model/WSDLOperation.h" + + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + class Axis2Client + { + public: + Axis2Client(tuscany::sca::model::CompositeReference* compositeReference); + virtual ~Axis2Client(); + + virtual void invoke(Operation& operation); + + private: + tuscany::sca::model::CompositeReference* compositeReference; + + axiom_node_t* createPayload(Operation& operation, + const tuscany::sca::model::WSDLOperation& wsdlOp, + axis2_env_t* env); + + void setReturn(axiom_node_t* returnNode, + Operation& operation, + const tuscany::sca::model::WSDLOperation& wsdlOp, + axis2_env_t* env); + + }; + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_axis2client_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceBindingExtension.cpp new file mode 100644 index 0000000000..53d6075bbd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceBindingExtension.cpp @@ -0,0 +1,118 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "WSServiceBindingExtension.h" +#include "model/WSServiceBinding.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_ws_reference_initialize() + { + tuscany::sca::ws::WSServiceBindingExtension::initialize(); + } +} + + +namespace tuscany +{ + namespace sca + { + namespace ws + { + // =================================================================== + // Constructor for the WSServiceBinding class. + // =================================================================== + WSServiceBindingExtension::WSServiceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the WSServiceBindingExtension class. + // =================================================================== + WSServiceBindingExtension::~WSServiceBindingExtension() + { + logentry(); + } + + const string WSServiceBindingExtension::extensionName("ws"); + const string WSServiceBindingExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#WebServiceBinding"); + + + // =================================================================== + // loadModelElement - load the info from binding.ws + // =================================================================== + ServiceBinding* WSServiceBindingExtension::getServiceBinding(Composite *composite, Service* service, DataObjectPtr scdlBinding) + { + logentry(); + + string uri = scdlBinding->getCString("uri"); + string endpoint; + try + { + endpoint = scdlBinding->getCString("endpoint"); + } + catch (SDORuntimeException&) + { + endpoint = ""; + } + string version; + try + { + commonj::sdo::DataObjectList& soap = scdlBinding->getList("soapbinding"); + if (soap.size()!=0) + { + version = soap.getCString(0); + } + else + { + version = ""; + } + } + catch (SDORuntimeException&) + { + version = ""; + } + + WSServiceBinding* serviceBinding = new WSServiceBinding(service, uri, endpoint, version); + + return serviceBinding; + } + + void WSServiceBindingExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerServiceBindingExtension(new WSServiceBindingExtension()); + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceBindingExtension.h new file mode 100644 index 0000000000..68dd657657 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceBindingExtension.h @@ -0,0 +1,78 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef tuscany_sca_extension_ws_wsservicebindingextension_h +#define tuscany_sca_extension_ws_wsservicebindingextension_h + +#include "tuscany/sca/extension/ServiceBindingExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + class WSServiceBindingExtension : public ServiceBindingExtension + { + public: + /** + * Default constructor + */ + WSServiceBindingExtension(); + + /** + * Destructor + */ + virtual ~WSServiceBindingExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.ws") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ServiceBinding* getServiceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Service* service, + commonj::sdo::DataObjectPtr scdlBinding); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif //tuscany_sca_extension_ws_wsservicebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp new file mode 100644 index 0000000000..4adcd5b4ff --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp @@ -0,0 +1,131 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4091) +#endif + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/util/Logging.h" +#include "Axis2Client.h" +#include "WSServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceType.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + WSServiceWrapper::WSServiceWrapper(Service* service) : ServiceWrapper(service) + { + logentry(); + + // Define the SOAP Body type and element to allow a SOAP body to + // be loaded in a DataObject + DataFactoryPtr dataFactory = service->getComponent()->getComposite()->getDataFactory(); + try { + const Type& bodyType = dataFactory->getType("http://www.w3.org/2003/05/soap-envelope", "Body"); + } catch (SDORuntimeException&) + { + dataFactory->addType("http://www.w3.org/2003/05/soap-envelope", "RootType", false, false, false); + dataFactory->addType("http://www.w3.org/2003/05/soap-envelope", "Body", false, true, false); + dataFactory->addPropertyToType( + "http://www.w3.org/2003/05/soap-envelope", "RootType", + "Body", + "http://www.w3.org/2003/05/soap-envelope", "Body", + false, false, true); + + dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/", "RootType", false, false, false); + dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/", "Body", false, true, false); + dataFactory->addPropertyToType( + "http://schemas.xmlsoap.org/soap/envelope/", "RootType", + "Body", + "http://schemas.xmlsoap.org/soap/envelope/", "Body", + false, false, true); + } + + try { + const Type& tempType = dataFactory->getType("http://tempuri.org", "RootType"); + } catch (SDORuntimeException&) + { + dataFactory->addType("http://tempuri.org", "RootType", false, false, false); + dataFactory->addType("http://tempuri.org", "Wrapper", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Wrapper", + "http://tempuri.org", "Wrapper", + false, false, true); + dataFactory->addType("http://tempuri.org", "Part", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Part", + "http://tempuri.org", "Part", + false, false, true); + } + } + + WSServiceWrapper::~WSServiceWrapper() + { + logentry(); + } + + /// + /// This method will be called when a web service call needs to be made. + /// + void WSServiceWrapper::invoke(Operation& operation) + { + logentry(); + + const string& operationName = operation.getName(); + + loginfo("Service: %s, operation: %s", getService()->getType()->getName().c_str() , operationName.c_str()); + + for (unsigned int i=0; i<operation.getNParms(); i++) + { + loginfo("Parameter: %p, type: %u", operation.getParameterValue(i),(int) operation.getParameterType(i)); + } + + // Create the Axis2 client that will handle the Web Service invocation + Service* service = getService(); + CompositeReference* compositeReference = (CompositeReference*)service->getComponent(); + + Axis2Client client(compositeReference); + client.invoke(operation); + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.h new file mode 100644 index 0000000000..f7aebbb575 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.h @@ -0,0 +1,65 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_ws_wsservicewrapper_h +#define tuscany_sca_extension_ws_wsservicewrapper_h + +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/core/Operation.h" +#include "tuscany/sca/model/Service.h" + + +namespace tuscany +{ + namespace sca + { + + namespace ws + { + + class WSServiceWrapper : public ServiceWrapper + { + public: + + /** + * Constructor. + * @param target The service wrapper represents a Web service. + */ + WSServiceWrapper(tuscany::sca::model::Service* service); + + /** + * Destructor + */ + virtual ~WSServiceWrapper(); + + /** + * All business method calls on the target service are performed through + * this invoke method. + * @param operation The details of the method, paramaters and return value for the + * business method to be called on the target service. + */ + virtual void invoke(Operation& operation); + }; + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_ws_wsservicewrapper_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/export.h new file mode 100644 index 0000000000..d0e708f1a1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/export.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ws_reference_export_h +#define tuscany_sca_ws_reference_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_WS_REFERENCE_EXPORTS +#define SCA_WS_REFERENCE_API __declspec(dllexport) +#else +#define SCA_WS_REFERENCE_API __declspec(dllimport) +#endif + +#else +#define SCA_WS_REFERENCE_API +#endif + +#endif // tuscany_sca_ws_reference_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/model/WSServiceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/model/WSServiceBinding.cpp new file mode 100644 index 0000000000..26d8dffc45 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/model/WSServiceBinding.cpp @@ -0,0 +1,144 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/ws/model/WSServiceBinding.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/ws/WSServiceWrapper.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + // Constructor + WSServiceBinding::WSServiceBinding(Service* service, const string& uri, const string& endpoint, const string& version) + : ServiceBinding(service, uri), endpoint(endpoint), soapVersion(version) + { + logentry(); + + parseEndpoint(); + + serviceWrapper = new WSServiceWrapper(service); + } + + void WSServiceBinding::parseEndpoint() + { + logentry(); + + // Endpoint is of the form: <wsdl-namepace-uri>#wsdl.endpoint(<service-name>/<endpoint-name>) + string::size_type hash = endpoint.find("#"); + if (hash != string::npos) + { + // Found a hash + + // Namepace is the part before the # + wsdlNamespaceURL = endpoint.substr(0, hash); + + + if ( (hash+1) < endpoint.length()) + { + // Check the next part is wsdl.endpoint( + int ending = hash+15; + string check = endpoint.substr(hash+1, 14); + if (check.compare("wsdl.endpoint(") == 0) + { + // Find the matching ) + int endBracket = endpoint.find(")",ending); + if (endBracket-1 > ending+1) + { + string serviceAndEndpoint = endpoint.substr(ending, endBracket-ending); + // Look for a '/' + string::size_type slash = serviceAndEndpoint.find("/"); + if (slash != string::npos) + { + serviceName = serviceAndEndpoint.substr(0, slash); + + if ( (slash+1) < serviceAndEndpoint.length()) + { + endpointName = serviceAndEndpoint.substr(slash+1); + } + else + { + endpointName = ""; + } + + } + else + { + // No '/' so all of it is the service name + serviceName = serviceAndEndpoint; + endpointName = ""; + + } + } + else + { + // Nothing between the () + serviceName = ""; + endpointName = ""; + } + } + else + { + // not the correct characters after the #, ignore the rest + serviceName = ""; + endpointName = ""; + } + + } + else + { + // Nothing after the hash + serviceName = ""; + endpointName = ""; + } + } + else + { + // No hash at all + wsdlNamespaceURL = endpoint; + serviceName = ""; + endpointName = ""; + } + } + + // Destructor + WSServiceBinding::~WSServiceBinding() + { + logentry(); + } + + ServiceWrapper* WSServiceBinding::getServiceWrapper() + { + logentry(); + + return serviceWrapper; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/model/WSServiceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/model/WSServiceBinding.h new file mode 100644 index 0000000000..3c8c5eb12d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/model/WSServiceBinding.h @@ -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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_ws_model_wsservicebinding_h +#define tuscany_sca_extension_ws_model_wsservicebinding_h + +#include <string> + +#include "tuscany/sca/ws/export.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/Service.h" + +namespace tuscany +{ + namespace sca + { + namespace ws + { + /** + * Information about a web service binding for service or a reference. + */ + class WSServiceBinding : public tuscany::sca::model::ServiceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + * @param endpoint The definition of the endpoint to which the service + * or reference is to be bound. This is of the form + * "namespace"#endpoint("service"/"endpoint") + */ + SCA_WS_REFERENCE_API WSServiceBinding(tuscany::sca::model::Service* service, const std::string& uri, const std::string& endpoint, const std::string& version); + + /** + * Destructor. + */ + SCA_WS_REFERENCE_API virtual ~WSServiceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#WebServiceBinding"; }; + + /** + * Create a wrapper for the service configured by this + * binding. + */ + SCA_WS_REFERENCE_API virtual ServiceWrapper* getServiceWrapper(); + + /** + * Return the part of the endpoint definition describing the wsdl + * namespace. + * @return The wsdl namespace. + */ + std::string getWSDLNamespaceURL() const { return wsdlNamespaceURL; }; + + /** + * Return the service part of the endpoint definition. + * @return The service to use. + */ + std::string getServiceName() const { return serviceName; }; + + /** + * Return the endpoint name part of the endpoint definition. + * @return The endpoint name to use. + */ + std::string getEndpointName() const { return endpointName; }; + + /** + * Return the SOAP version. + * @return The SOAP version to use. + */ + std::string getSOAPVersion() const { return soapVersion; }; + + private: + + /** + * Parse the endpoint specification. + */ + void parseEndpoint(); + + /** + * The full endpoint string. + */ + std::string endpoint; + + /** + * Namespace from the endpoint. + */ + std::string wsdlNamespaceURL; + + /** + * Service name from the endpoint. + */ + std::string serviceName; + + /** + * WSDL Endpoint name. + */ + std::string endpointName; + + /** + * SOAP version. + */ + std::string soapVersion; + + /** + * The wrapper for the service configured by this binding. + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace model + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_model_wsservicebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/Makefile.am new file mode 100644 index 0000000000..18e9ba89b9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = axis2c diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/Makefile.am new file mode 100644 index 0000000000..feadf9e317 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/Makefile.am @@ -0,0 +1,18 @@ +# 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. + +SUBDIRS = src
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/Makefile.am new file mode 100644 index 0000000000..88f7fc1a9e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/Makefile.am @@ -0,0 +1,94 @@ +# 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. + +libdir=$(prefix)/extensions/ws/service/lib +lib_LTLIBRARIES = \ +libtuscany_sca_ws_service.la \ +libtuscany_sca_ws_dispatcher.la + +noinst_HEADERS = \ +tuscany/sca/ws/*.h \ +tuscany/sca/ws/model/*.h + +libtuscany_sca_ws_service_la_SOURCES = \ +tuscany/sca/ws/WSReferenceBindingExtension.cpp \ +tuscany/sca/ws/model/WSReferenceBinding.cpp \ +tuscany/sca/ws/WSServiceProxy.cpp \ +tuscany/sca/ws/Axis2Service.cpp \ +tuscany/sca/ws/Axis2Utils.cpp + +libtuscany_sca_ws_service_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo -ltuscany_sdo_axiom \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L$(AXIS2C_HOME)/lib \ + -laxis2_util \ + -laxis2_axiom \ + -laxis2_wsdl \ + -laxis2_engine \ + -laxis2_parser \ + -laxis2_minizip \ + -lpthread \ + -lwoden \ + -laxis2_http_sender \ + -laxis2_http_receiver + +rootdir=$(prefix)/extensions/ws/service +root_DATA = axis2.xml +root_SCRIPTS = deploy.sh + +libtuscany_sca_ws_dispatcher_la_SOURCES = \ +tuscany/sca/ws/Axis2Dispatcher.cpp \ +tuscany/sca/ws/Axis2DispatcherModule.cpp + +libtuscany_sca_ws_dispatcher_la_LIBADD = \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo -ltuscany_sdo_axiom \ + -L$(top_builddir)/runtime/core/src -ltuscany_sca \ + -L$(AXIS2C_HOME)/lib \ + -laxis2_util \ + -laxis2_axiom \ + -laxis2_wsdl \ + -laxis2_engine \ + -laxis2_parser \ + -laxis2_minizip \ + -lpthread \ + -lwoden \ + -laxis2_http_sender \ + -laxis2_http_receiver + +servicedir=$(rootdir)/services/tuscany +service_DATA = services.xml + +modulesdir=$(rootdir)/modules/tuscany +modules_DATA = module.xml + +EXTRA_DIST = axis2.xml services.xml module.xml deploy.sh + +install-data-hook: + cd $(servicedir); ln -s -f ../../lib/libtuscany_sca_ws_service.so libtuscany_sca_ws_service.so + cd $(modulesdir); ln -s -f ../../lib/libtuscany_sca_ws_dispatcher.so libtuscany_sca_ws_dispatcher.so + +INCLUDES = -I$(top_builddir)/runtime/core/src \ + -I${TUSCANY_SDOCPP}/include \ + -I${AXIS2C_HOME}/include + +moduledir=$(prefix)/extensions/ws/service/module +extension = libtuscany_sca_ws_service$(libsuffix) + +install-exec-hook: + test -z $(moduledir) || $(mkdir_p) $(moduledir); + -rm -f $(moduledir)/$(extension) + $(LN_S) $(libdir)/$(extension) $(moduledir)/$(extension) diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/axis2.xml b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/axis2.xml new file mode 100644 index 0000000000..641085466e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/axis2.xml @@ -0,0 +1,181 @@ +<!-- + 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. +--> +<axisconfig name="Axis2/C"> + <!-- ================================================= --> + <!-- Parameters --> + <!-- ================================================= --> + <parameter name="hotdeployment" locked="false">false</parameter> + <parameter name="hotupdate" locked="false">false</parameter> + <parameter name="enableMTOM" locked="false">false</parameter> + <parameter name="enableREST" locked="false">true</parameter> + + <parameter name="userName" locked="false">admin</parameter> + <parameter name="password" locked="false">axis2</parameter> + + <parameter name="seralizeLocation" locked="false">.</parameter> + <hostConfiguration> + <ip>127.0.0.1</ip> + <port>5555</port> + </hostConfiguration> + + + <!--if you want to extract the service archive file and work with that please uncomment this--> + <!--else , it wont extract archive file or does not take into consideration if someone drop--> + <!--exploded directory into /service directory--> + <!--<parameter name="extractServiceArchive" locked="false">true</parameter>--> + + + <!-- The way of adding listener to the system--> + <!-- <listener class="org.apache.axis2.ObserverIMPL">--> + <!-- <parameter name="RSS_URL" locked="false">http://127.0.0.1/rss</parameter>--> + <!-- </listener>--> + + <!-- ================================================= --> + <!-- Message Receivers --> + <!-- ================================================= --> + <!-- This is the Deafult Message Receiver for the Request Response style Operations --> + <!--messageReceiver mep="INOUT" class="axis2_receivers"/--> + + <!-- ================================================= --> + <!-- Transport Ins --> + <!-- ================================================= --> + <transportReceiver name="http" class="axis2_http_receiver"> + <parameter name="port" locked="false">6060</parameter> + </transportReceiver> + + <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver + <transportReceiver name="mail" class="org.apache.axis2.transport.mail.SimpleMailListener"> + <parameter name="transport.mail.pop3.host" locked="false">127.0.0.1</parameter> + <parameter name="transport.mail.pop3.user" locked="false">axis2</parameter> + <parameter name="transport.mail.pop3.password" locked="false">axis2</parameter> + <parameter name="transport.mail.pop3.port" locked="false">110</parameter> + <parameter name="transport.mail.replyToAddress" locked="false">axis2@127.0.0.1</parameter> + </transportReceiver> --> + + <!-- + <transportReceiver name="tcp" class="org.apache.axis2.transport.tcp.TCPServer"> + <parameter name="port" locked="false">6060</parameter> + </transportReceiver> + --> + <!-- ================================================= --> + <!-- Transport Outs --> + <!-- ================================================= --> + + <!-- + <transportSender name="tcp" class="org.apache.axis2.transport.tcp.TCPTransportSender"/> + <transportSender name="local" class="org.apache.axis2.transport.local.LocalTransportSender"/> + --> + <transportSender name="http" class="axis2_http_sender"> + <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> + <!--parameter name="Transfer-Encoding">chunked</parameter--> + <!--parameter name="PROXY" proxy_host="127.0.0.1" proxy_port="8080" locked="true"/--> + </transportSender> + <!-- + <transportSender name="https" class="axis2_http_sender"> + <parameter name="PROTOCOL" locked="false">HTTP/1.1</parameter> + </transportSender> + --> + <!-- Uncomment this one with the appropriate papameters to enable the SMTP transport Receiver + <transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender"> + <parameter name="transport.mail.smtp.host" locked="false">127.0.0.1</parameter> + <parameter name="transport.mail.smtp.user" locked="false">axis2</parameter> + <parameter name="transport.mail.smtp.password" locked="false">axis2</parameter> + <parameter name="transport.mail.smtp.port" locked="false">25</parameter> + </transportSender> + --> + + <!-- ================================================= --> + <!-- Global Modules --> + <!-- ================================================= --> + <!-- Comment this to disable Addressing --> + <module ref="addressing"/> + + <module ref="tuscany"/> + + <!--Configuring module , providing paramters for modules whether they refer or not--> + <!--<moduleConfig name="addressing">--> + <!--<parameter name="addressingPara" locked="false">N/A</parameter>--> + <!--</moduleConfig>--> + + <!-- ================================================= --> + <!-- Phases --> + <!-- ================================================= --> + <phaseOrder type="inflow"> + <!-- System pre defined phases --> + <phase name="TransportIn"/> + <phase name="PreDispatch"/> + <phase name="Dispatch"> + <handler name="AddressingBasedDispatcher" + class="axis2_engine"> + <order phase="Dispatch"/> + </handler> + <handler name="RequestURIBasedDispatcher" + class="axis2_engine"> + <order phase="Dispatch"/> + </handler> + <handler name="SOAPActionBasedDispatcher" + class="axis2_engine"> + <order phase="Dispatch"/> + </handler> + <handler name="SOAPMessageBodyBasedDispatcher" + class="axis2_engine"> + <order phase="Dispatch"/> + </handler> + </phase> + <phase name="PostDispatch"> + <handler name="DispatchPostConditionsEvaluator" + class="axis2_engine"> + <order phase="PostDispatch"/> + </handler> + <handler name="InstanceDispatcher" + class="axis2_engine"> + <order phase="PostDispatch"/> + </handler> + <handler name="SOAPProcessingModelChecker" + class="axis2_engine"> + <order phase="PostDispatch"/> + </handler> + </phase> + <!-- System pre defined phases --> + <!-- After Postdispatch phase module author or or service author can add any phase he want --> + <!--phase name="userphase1"/--> + </phaseOrder> + <phaseOrder type="outflow"> + <!-- user can add his own phases to this area --> + <!--phase name="RMPhase"/--> + <!--phase name="userphase1"/--> + <!--system predefined phase--> + <!--these phase will run irrespective of the service--> + <!--phase name="PolicyDetermination"/--> + <!--phase name="MessageOut"/--> + </phaseOrder> + <phaseOrder type="INfaultflow"> + <!-- user can add his own phases to this area --> + <!--phase name="userphase1"/--> + <!--phase name="RMPhase"/--> + </phaseOrder> + <phaseOrder type="Outfaultflow"> + <!-- user can add his own phases to this area --> + <!--phase name="RMPhase"/--> + <!--phase name="userphase1"/--> + <!--phase name="PolicyDetermination"/--> + <phase name="MessageOut"/> + </phaseOrder> +</axisconfig> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/deploy.bat b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/deploy.bat new file mode 100644 index 0000000000..6493e1cec9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/deploy.bat @@ -0,0 +1,39 @@ +@echo off
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+
+
+rem Will deploy the Tuscany SCA WS service Axis2C service and module
+rem to the correct places within the AXIS2C_HOME directory
+setlocal
+set currentPath=%~d0%~p0
+
+if "%AXIS2C_HOME%" == "" (
+echo "AXIS2C_HOME not set"
+goto end
+)
+echo Deploying to Axis2C installed at %AXIS2C_HOME%
+
+if not exist %AXIS2C_HOME%\services\tuscany mkdir %AXIS2C_HOME%\services\tuscany
+if not exist %AXIS2C_HOME%\modules\tuscany mkdir %AXIS2C_HOME%\modules\tuscany
+
+copy %currentPath%\services\tuscany\* %AXIS2C_HOME%\services\tuscany
+copy %currentPath%\modules\tuscany\* %AXIS2C_HOME%\modules\tuscany
+copy %currentPath%\axis2.xml %AXIS2C_HOME%\axis2.xml
+
+:end
+endlocal
diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/deploy.sh b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/deploy.sh new file mode 100755 index 0000000000..ffe571b0ee --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/deploy.sh @@ -0,0 +1,47 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Deploying to Axis2C installed at $AXIS2C_HOME" + +if ! [ -d $AXIS2C_HOME/services/tuscany ]; then + mkdir $AXIS2C_HOME/services/tuscany +fi + +if ! [ -d $AXIS2C_HOME/modules/tuscany ]; then + mkdir $AXIS2C_HOME/modules/tuscany +fi + +cp $APFULLDIR/services/tuscany/services.xml $AXIS2C_HOME/services/tuscany + +if ! [ -f $AXIS2C_HOME/services/tuscany/libtuscany_sca_ws_service.so ]; then + ln -s $APFULLDIR/services/tuscany/libtuscany_sca_ws_service.so $AXIS2C_HOME/services/tuscany/libtuscany_sca_ws_service.so +fi + +cp $APFULLDIR/modules/tuscany/module.xml $AXIS2C_HOME/modules/tuscany +if ! [ -f $AXIS2C_HOME/modules/tuscany/libtuscany_sca_ws_dispatcher.so ]; then + ln -s $APFULLDIR/modules/tuscany/libtuscany_sca_ws_dispatcher.so $AXIS2C_HOME/modules/tuscany/libtuscany_sca_ws_dispatcher.so +fi + +cp $APFULLDIR/axis2.xml $AXIS2C_HOME/axis2.xml diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/module.xml b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/module.xml new file mode 100644 index 0000000000..97d4d43a86 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/module.xml @@ -0,0 +1,25 @@ +<!-- + 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. +--> +<module name="tuscany" class="tuscany_sca_ws_dispatcher"> + <inflow> + <handler name="TuscanyDispatcher" class="tuscany_sca_ws_dispatcher"> + <order phase="Dispatch"/> + </handler> + </inflow> +</module> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/services.xml b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/services.xml new file mode 100644 index 0000000000..335d4d96be --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/services.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<serviceGroup> +<service name="TuscanyService"> + <parameter name="ServiceClass" locked="xsd:false">tuscany_sca_ws_service</parameter> + <operation name="execute"/> +</service> +</serviceGroup> diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Dispatcher.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Dispatcher.cpp new file mode 100644 index 0000000000..b6d2ac9225 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Dispatcher.cpp @@ -0,0 +1,177 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#pragma warning(disable: 4091) +#endif + +#include <axis2_handler_desc.h> +#include <axis2_qname.h> +#include <axis2_relates_to.h> +#include <axis2_svc.h> +#include <axis2_const.h> +#include <axis2_conf_ctx.h> +#include <axis2_addr.h> +#include <axis2_utils.h> +#include <axiom_soap_envelope.h> +#include <axiom_soap_body.h> + +#include "tuscany/sca/util/Logging.h" + +extern "C" +{ + +axis2_status_t AXIS2_CALL +Axis2Dispatcher_invoke ( + axis2_handler_t * handler, + const axis2_env_t *env, + struct axis2_msg_ctx *msg_ctx); + +axis2_svc_t *AXIS2_CALL +Axis2Dispatcher_find_svc( + axis2_msg_ctx_t *msg_ctx, + const axis2_env_t *env); + +axis2_op_t *AXIS2_CALL +Axis2Dispatcher_find_op( + axis2_msg_ctx_t *msg_ctx, + const axis2_env_t *env, + axis2_svc_t *svc); + + +AXIS2_EXPORT axis2_handler_t* AXIS2_CALL +Axis2Dispatcher_create(const axis2_env_t *env, + axis2_qname_t *qname) +{ + axis2_handler_t *handler = NULL; + + handler = axis2_handler_create(env); + if (!handler) + { + return NULL; + } + + /* handler init is handled by conf loading, so no need to do it here */ + + /* set the base struct's invoke op */ + if (handler->ops) + handler->ops->invoke = Axis2Dispatcher_invoke; + + return handler; +} + +axis2_svc_t *AXIS2_CALL +Axis2Dispatcher_find_svc( + axis2_msg_ctx_t *msg_ctx, + const axis2_env_t *env) +{ + axis2_svc_t *svc = NULL; + + AXIS2_ENV_CHECK(env, NULL); + + axis2_conf_ctx_t *conf_ctx = NULL; + conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env); + if (conf_ctx) + { + axis2_conf_t *conf = NULL; + conf = AXIS2_CONF_CTX_GET_CONF(conf_ctx, env); + if (conf) + { + axis2_char_t* service_name = "TuscanyService"; + svc = AXIS2_CONF_GET_SVC(conf, env, service_name); + if (svc) + { + loginfo("Service found using target endpoint address"); + } + } + } + + return svc; +} + +axis2_op_t *AXIS2_CALL +Axis2Dispatcher_find_op( + axis2_msg_ctx_t *msg_ctx, + const axis2_env_t *env, + axis2_svc_t *svc) +{ + axis2_op_t *op = NULL; + + AXIS2_ENV_CHECK(env, NULL); + + axis2_qname_t *op_qname = NULL; + axis2_char_t* execute_op_name = "execute"; + op_qname = axis2_qname_create(env, execute_op_name, NULL, NULL); + + op = AXIS2_SVC_GET_OP_WITH_NAME(svc, env, AXIS2_QNAME_GET_LOCALPART(op_qname, env)); + + AXIS2_QNAME_FREE(op_qname, env); + if (op) + { + loginfo("TuscanyService execute operation found"); + } + return op; +} + +axis2_status_t AXIS2_CALL +Axis2Dispatcher_invoke( + axis2_handler_t * handler, + const axis2_env_t *env, + struct axis2_msg_ctx *msg_ctx) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + if (!(AXIS2_MSG_CTX_GET_SERVER_SIDE(msg_ctx, env))) + return AXIS2_SUCCESS; + + msg_ctx->ops->find_svc = Axis2Dispatcher_find_svc; + msg_ctx->ops->find_op = Axis2Dispatcher_find_op; + + axis2_svc_t *axis_service = NULL; + axis2_op_t *op = NULL; + + axis_service = AXIS2_MSG_CTX_GET_SVC(msg_ctx, env); + + if (!axis_service) + { + axis_service = AXIS2_MSG_CTX_FIND_SVC(msg_ctx, env); + if (axis_service) + { + AXIS2_MSG_CTX_SET_SVC(msg_ctx, env, axis_service); + /*TODO Set the Service Group Context to the message Context*/ + } + } + op = AXIS2_MSG_CTX_GET_OP(msg_ctx, env); + if (!op) + { + op = AXIS2_MSG_CTX_FIND_OP(msg_ctx, env, axis_service); + + if (op) + { + AXIS2_MSG_CTX_SET_OP(msg_ctx, env, op); + } + } + + return AXIS2_SUCCESS; +} + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2DispatcherModule.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2DispatcherModule.cpp new file mode 100644 index 0000000000..0dc8f3358a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2DispatcherModule.cpp @@ -0,0 +1,149 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#pragma warning(disable: 4091) +#endif + +#include <axis2_module.h> +#include <axis2_addr_mod.h> +#include <axis2_conf_ctx.h> +#include <axis2_disp.h> + +extern "C" +{ + +axis2_status_t AXIS2_CALL +Axis2DispatcherModule_shutdown(axis2_module_t *module, + const axis2_env_t *env); + +axis2_status_t AXIS2_CALL +Axis2DispatcherModule_init( + axis2_module_t *module, + const axis2_env_t *env, + axis2_conf_ctx_t *conf_ctx, + axis2_module_desc_t *module_desc); + +axis2_status_t AXIS2_CALL +Axis2DispatcherModule_fill_handler_create_func_map(axis2_module_t *module, + const axis2_env_t *env); + +AXIS2_EXTERN axis2_handler_t* AXIS2_CALL +Axis2Dispatcher_create(const axis2_env_t *env, + axis2_qname_t *qname); + +axis2_module_t * +Axis2DispatcherModule_create(const axis2_env_t *env) +{ + axis2_module_t *module = NULL; + module = (axis2_module_t*)AXIS2_MALLOC(env->allocator, + sizeof(axis2_module_t)); + + + module->ops = (axis2_module_ops_t*)AXIS2_MALLOC( + env->allocator, sizeof(axis2_module_ops_t)); + + module->ops->shutdown = Axis2DispatcherModule_shutdown; + module->ops->init = Axis2DispatcherModule_init; + module->ops->fill_handler_create_func_map = + Axis2DispatcherModule_fill_handler_create_func_map; + + return module; +} + +axis2_status_t AXIS2_CALL +Axis2DispatcherModule_init( + axis2_module_t *module, + const axis2_env_t *env, + axis2_conf_ctx_t *conf_ctx, + axis2_module_desc_t *module_desc) +{ + return AXIS2_SUCCESS; +} + +axis2_status_t AXIS2_CALL +Axis2DispatcherModule_shutdown(axis2_module_t *module, + const axis2_env_t *env) +{ + if(module->ops) + { + AXIS2_FREE(env->allocator, module->ops); + module->ops = NULL; + } + + if(module->handler_create_func_map) + { + axis2_hash_free(module->handler_create_func_map, env); + module->handler_create_func_map = NULL; + } + + if(module) + { + AXIS2_FREE(env->allocator, module); + module = NULL; + } + return AXIS2_SUCCESS; +} + +axis2_status_t AXIS2_CALL +Axis2DispatcherModule_fill_handler_create_func_map(axis2_module_t *module, + const axis2_env_t *env) +{ + AXIS2_ENV_CHECK(env, AXIS2_FAILURE); + + module->handler_create_func_map = axis2_hash_make(env); + axis2_hash_set(module->handler_create_func_map, "TuscanyDispatcher", + (axis2_ssize_t)AXIS2_HASH_KEY_STRING, (const void *)Axis2Dispatcher_create); + + return AXIS2_SUCCESS; +} + +/** + * Following block distinguish the exposed part of the dll. + */ + +AXIS2_EXPORT int +axis2_get_instance(axis2_module_t **inst, + const axis2_env_t *env) +{ + *inst = Axis2DispatcherModule_create(env); + if(!(*inst)) + { + return AXIS2_FAILURE; + } + + return AXIS2_SUCCESS; +} + +AXIS2_EXPORT int +axis2_remove_instance(axis2_module_t *inst, + const axis2_env_t *env) +{ + axis2_status_t status = AXIS2_FAILURE; + if (inst) + { + status = Axis2DispatcherModule_shutdown(inst, env); + } + return status; +} + +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp new file mode 100644 index 0000000000..9f1207dce8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp @@ -0,0 +1,553 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#pragma warning(disable: 4091) +#endif + +#include <sstream> + +#include <axis2_svc_skeleton.h> +#include <axis2_array_list.h> +#include <axis2_log_default.h> +#include <axis2_error_default.h> +#include <axiom.h> + +#include <sdo_axiom.h> + +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Logging.h" +#include "WSServiceProxy.h" +#include "model/WSReferenceBinding.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/CompositeService.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "tuscany/sca/model/WSDLMessagePart.h" +#include "tuscany/sca/model/WSDLInterface.h" +#include "tuscany/sca/model/Interface.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/util/Utils.h" +#include "Axis2Utils.h" + +using namespace std; +using namespace commonj::sdo; +using namespace commonj::sdo_axiom; +using namespace tuscany::sca; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + int AXIS2_CALL + Axis2Service_free(axis2_svc_skeleton_t *svc_skeleton, + const axis2_env_t *env); + + axiom_node_t* AXIS2_CALL + Axis2Service_invoke(axis2_svc_skeleton_t *svc_skeleton, + const axis2_env_t *env, + axiom_node_t *node, + axis2_msg_ctx_t *msg_ctx); + + int AXIS2_CALL + Axis2Service_init(axis2_svc_skeleton_t *svc_skeleton, + const axis2_env_t *env); + + axis2_svc_skeleton_t* + axis2_Axis2Service_create(axis2_env_t *env) + { + axis2_svc_skeleton_t *svc_skeleton = NULL; + svc_skeleton = (axis2_svc_skeleton_t *) AXIS2_MALLOC((env)->allocator, + sizeof(axis2_svc_skeleton_t)); + + + svc_skeleton->ops = (axis2_svc_skeleton_ops_t *) AXIS2_MALLOC( + (env)->allocator, sizeof(axis2_svc_skeleton_ops_t)); + + svc_skeleton->func_array = NULL; + + svc_skeleton->ops->free = Axis2Service_free; + svc_skeleton->ops->init = Axis2Service_init; + svc_skeleton->ops->invoke = Axis2Service_invoke; + /*svc_skeleton->ops->on_fault = Axis2Service_on_fault;*/ + + return svc_skeleton; + } + + int AXIS2_CALL + Axis2Service_init(axis2_svc_skeleton_t *svc_skeleton, + const axis2_env_t *env) + { + // This method never seems to be called - an old Axis2C artifact? + + svc_skeleton->func_array = axis2_array_list_create(env, 0); + return AXIS2_SUCCESS; + } + + int AXIS2_CALL + Axis2Service_free(axis2_svc_skeleton_t *svc_skeleton, + const axis2_env_t *env) + { + if(svc_skeleton->ops) + { + AXIS2_FREE((env)->allocator, svc_skeleton->ops); + svc_skeleton->ops = NULL; + } + + if(svc_skeleton) + { + AXIS2_FREE((env)->allocator, svc_skeleton); + svc_skeleton = NULL; + } + return AXIS2_SUCCESS; + } + + + /** + * Initialize the SCA runtime + */ + CompositeService* initializeSCARuntime(const char*home, const char* root, + const char* path, const char* baseURI, const char *component, const char* service) + { + logentry(); + loginfo("Home: %s", home); + loginfo("Root: %s", root); + loginfo("Path: %s", path); + loginfo("Base URI: %s", baseURI); + loginfo("Component: %s", component); + loginfo("Service: %s", service); + + try + { + SCARuntime* runtime = SCARuntime::initializeSharedRuntime(home, root, path, baseURI); + + string componentName; + if (strlen(component)) + { + componentName = component; + } + else + { + componentName = runtime->getDefaultComponentName(); + } + string serviceName = service; + + loginfo("Resolving composite: %s, service: %s", componentName.c_str(), serviceName.c_str()); + Component* compositeComponent = runtime->getSystem()->findComponent(componentName); + if (compositeComponent == NULL) + { + string msg = "Component not found " + componentName; + throwException(SystemConfigurationException, msg.c_str()); + } + runtime->setDefaultComponent(compositeComponent); + + Composite* composite = (Composite*)compositeComponent->getType(); + CompositeService* compositeService = (CompositeService*)composite->findComponent(serviceName); + if (compositeService == NULL) + { + string msg = "Composite service not found " + serviceName; + throwException(SystemConfigurationException, msg.c_str()); + } + + return compositeService; + } + catch(TuscanyRuntimeException &ex) + { + ostringstream msg; + msg << ex; + logerror("Failed to initialize SCA runtime: %s", msg.str().c_str()); + throw; + } + } + + + /* + * This method invokes the target service method + */ + axiom_node_t* AXIS2_CALL + Axis2Service_invoke(axis2_svc_skeleton_t *svc_skeleton, + const axis2_env_t *env, + axiom_node_t *node, + axis2_msg_ctx_t *msg_ctx) + { + logentry(); + + try + { + if (node) + { + if (AXIOM_NODE_GET_NODE_TYPE(node, env) == AXIOM_ELEMENT) + { + axiom_element_t *element = NULL; + element = (axiom_element_t *)AXIOM_NODE_GET_DATA_ELEMENT(node, env); + if (element) + { + string op_name = ""; + + axis2_bool_t rest = AXIS2_MSG_CTX_GET_DOING_REST(msg_ctx, env); + if (rest) + { + axis2_endpoint_ref_t *endpoint_ref = AXIS2_MSG_CTX_GET_FROM(msg_ctx, env); + if (endpoint_ref) + { + const axis2_char_t *addr = AXIS2_ENDPOINT_REF_GET_ADDRESS(endpoint_ref, env); + if (addr) + { + // REST request, the op name is the last segment of the path + string raddress = addr; + string path; + string query; + Utils::tokeniseString("?", raddress, path, query); + string uri; + Utils::rTokeniseString("/", path, uri, op_name); + } + } + } + else + { + // SOAP request + // Get the operation name from the root element name, this is correct for DocLit Wrapped style + op_name = AXIOM_ELEMENT_GET_LOCALNAME(element, env); + } + + if (op_name != "") + { + CompositeService* compositeService; + + // Get the Tuscany home, system root, path and composite service name from the Axis2 + // service parameters + char* homeParam = Axis2Utils::getAxisServiceParameterValue(env, msg_ctx, "TuscanyHome"); + if (homeParam == NULL) + homeParam = ""; + + char* rootParam = Axis2Utils::getAxisServiceParameterValue(env, msg_ctx, "TuscanyRoot"); + if (rootParam == NULL) + rootParam = ""; + + char* pathParam = Axis2Utils::getAxisServiceParameterValue(env, msg_ctx, "TuscanyPath"); + if (pathParam == NULL) + pathParam = ""; + + char* baseURIParam = Axis2Utils::getAxisServiceParameterValue(env, msg_ctx, "TuscanyBaseURI"); + if (baseURIParam == NULL) + baseURIParam = ""; + + char* serviceParam = Axis2Utils::getAxisServiceParameterValue(env, msg_ctx, "TuscanyService"); + if (serviceParam != NULL) + { + loginfo("System root: %s, service name: %s, operation name: %s", rootParam, serviceParam, op_name.c_str()); + + // Service is of the form "component name"/"composite service name" + string component, service; + Utils::rTokeniseString("/", serviceParam, component, service); + + compositeService = initializeSCARuntime(homeParam, rootParam, pathParam, baseURIParam, component.c_str(), service.c_str()); + } + else { + + // Use the default home, system root and component, the service is + // derived from the target address + axis2_endpoint_ref_t *endpoint_ref = NULL; + endpoint_ref = AXIS2_MSG_CTX_GET_FROM(msg_ctx, env); + string address = AXIS2_ENDPOINT_REF_GET_ADDRESS(endpoint_ref, env); + + axis2_bool_t isrest = AXIS2_MSG_CTX_GET_DOING_REST(msg_ctx, env); + string path; + if (isrest) + { + string op; + Utils::rTokeniseString("/", address, path, op); + } + else + { + path = address; + } + + string path2; + string service; + Utils::rTokeniseString("/", path, path2, service); + + string path3; + string component; + Utils::rTokeniseString("/", path2, path3, component); + if (component == "services") + { + component = ""; + } + + loginfo("System root: %s, component name: %s, service name: %s, operation name: %s", + rootParam, component.c_str(), service.c_str(), op_name.c_str()); + + compositeService = initializeSCARuntime(homeParam, rootParam, pathParam, baseURIParam, component.c_str(), service.c_str()); + } + + if(!compositeService) + { + throwException(SystemConfigurationException, + "Failed to initialize SCA runtime, could not initialize CompositeService"); + } + + DataFactoryPtr dataFactory = compositeService->getComposite()->getDataFactory(); + if (dataFactory == 0) + { + throwException(SystemConfigurationException, + "Failed to initialize SCA runtime, could not get DataFactory"); + } + + // Get the WS binding and the WSDL operation + Composite* composite = compositeService->getComposite(); + Reference* reference = compositeService->getReference(); + WSReferenceBinding* binding = (WSReferenceBinding*)reference->getBinding(); + WSDLOperation wsdlOperation; + + // First use the WSDL definition specified in the binding + string wsdlNamespace = binding->getWSDLNamespaceURL(); + if (wsdlNamespace != "") + { + WSDLDefinition* wsdlDefinition = composite->findWSDLDefinition(wsdlNamespace); + if (wsdlDefinition == 0) + { + string msg = "WSDL not found for: " + wsdlNamespace; + throwException(SystemConfigurationException, msg.c_str()); + } + + // Find the target operation in the WSDL port type. + try { + wsdlOperation = wsdlDefinition->findOperation( + binding->getServiceName(), + binding->getEndpointName(), + op_name.c_str()); + } + catch(SystemConfigurationException&) + { + throw; + } + + } + else + { + // Then use the WSDL definition specified in the WSDL interface, if any + Interface* iface = reference->getType()->getInterface(); + if (iface != NULL && + iface->getInterfaceTypeQName() == WSDLInterface::typeQName) + { + WSDLInterface* wsdlInterface = (WSDLInterface*)iface; + wsdlNamespace = wsdlInterface->getNamespaceURI(); + + if (wsdlNamespace != "") + { + + WSDLDefinition* wsdl = composite->findWSDLDefinition(wsdlNamespace); + if (wsdl == 0) + { + string msg = "WSDL not found for: " + wsdlNamespace; + throwException(SystemConfigurationException, msg.c_str()); + } + + try + { + wsdlOperation = wsdl->findOperation(wsdlInterface->getName(), op_name.c_str()); + } + catch(SystemConfigurationException&) + { + throw; + } + } + } + } + + // No WSDL definition was specified in the binding or interface + // Create a default document literal wrapped WSDL operation + if (wsdlNamespace == "") + { + WSDLMessagePart inPart(op_name, "", "http://tempuri.org"); + WSDLMessagePart outPart((op_name+"Response"), "", "http://tempuri.org"); + wsdlNamespace = compositeService->getName(); + wsdlOperation = WSDLOperation(); + wsdlOperation.setOperationName(op_name.c_str()); + wsdlOperation.setSoapAction(wsdlNamespace+ "#" +op_name); + wsdlOperation.setEndpoint(""); + wsdlOperation.setSoapVersion(WSDLOperation::SOAP11); + wsdlOperation.setDocumentStyle(true); + wsdlOperation.setWrappedStyle(true); + wsdlOperation.setInputEncoded(false); + wsdlOperation.setOutputEncoded(false); + wsdlOperation.setInputMessagePart(op_name, inPart); + wsdlOperation.setOutputMessagePart((op_name+"Response"), outPart); + } + else if (!wsdlOperation.isDocumentStyle() || !wsdlOperation.isWrappedStyle()) + { + throwException(ServiceInvocationException, + "Only wrapped document style WSDL operations are currentlysupported"); + } + + // Convert the input AXIOM node to an SDO DataObject + axiom_node_t* body = AXIOM_NODE_GET_PARENT(node, env); + char* str = NULL; + str = AXIOM_NODE_TO_STRING(body, env); + if (str) + { + loginfo("Received request Axis2 OM: %s", str); + } + + // Convert the SOAP body to an SDO DataObject + DataObjectPtr inputBodyDataObject = NULL; + DataObjectPtr inputDataObject = NULL; + + AxiomHelper* axiomHelper = AxiomHelper::getHelper(); + + try + { + inputBodyDataObject = axiomHelper->toSdo(body, dataFactory); + if(!inputBodyDataObject) + { + string msg = "Could not convert request Axis2 OM to SDO"; + throwException(ServiceInvocationException, msg.c_str()); + } + else + { + ostringstream os; + os << inputBodyDataObject; + loginfo("Converted Axis2 OM node to SDO: %s", os.str().c_str()); + } + + // Get the first body part representing the doc-lit-wrapped wrapper element + PropertyList bpl = inputBodyDataObject->getInstanceProperties(); + if (bpl.size()!=0) + { + if (bpl[0].isMany()) + { + DataObjectList& parts = inputBodyDataObject->getList((unsigned int)0); + inputDataObject = parts[0]; + } + else + { + inputDataObject = inputBodyDataObject->getDataObject(bpl[0]); + } + } + if (inputDataObject == NULL) + { + string msg = "Could not convert Axis2 body part to SDO"; + throwException(ServiceInvocationException, msg.c_str()); + } + } + catch(SDORuntimeException &ex) + { + throwException(ServiceDataException, ex); + } + + // Dispatch to the WS proxy + WSServiceProxy* proxy = (WSServiceProxy*)binding->getServiceProxy(); + + DataObjectPtr outputDataObject = proxy->invoke(wsdlOperation, inputDataObject); + + if(!outputDataObject) + { + return 0; + } + + try + { + std::list<std::string> partList = + wsdlOperation.getOutputMessagePartNames(); + const WSDLMessagePart &outPart = + wsdlOperation.getOutputMessagePart(partList.front()); + // Convert the output DataObject to an Axiom node + axiom_node_t* outputNode = + axiomHelper->toAxiomNode(outputDataObject, + outPart.getPartUri().c_str(), + outPart.getPartName().c_str()); + + AxiomHelper::releaseHelper(axiomHelper); + + str = AXIOM_NODE_TO_STRING(outputNode, env); + if (str) + { + loginfo("Sending response Axis2 OM : %s", str); + } + + return outputNode; + } + catch(SDORuntimeException &ex) + { + throwException(ServiceDataException, ex); + } + } + } + } + } + + string msg = "Invalid parameters in Axis2 request OM"; + throwException(ServiceInvocationException, msg.c_str()); + + } + catch(TuscanyRuntimeException& ex) + { + ostringstream msg; + msg << ex; + logerror("Failed to process Web service invocation: %s", msg.str().c_str()); + } + return 0; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +extern "C" +{ + + /** + * Following block distinguish the exposed part of the dll. + */ + + AXIS2_EXPORT int axis2_get_instance(axis2_svc_skeleton **inst, + axis2_env_t *env) + { + *inst = tuscany::sca::ws::axis2_Axis2Service_create(env); + if(!(*inst)) + { + return AXIS2_FAILURE; + } + + return AXIS2_SUCCESS; + } + + AXIS2_EXPORT int axis2_remove_instance(axis2_svc_skeleton_t *inst, + axis2_env_t *env) + { + axis2_status_t status = AXIS2_FAILURE; + if (inst) + { + status = AXIS2_SVC_SKELETON_FREE(inst, env); + } + return status; + } +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Utils.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Utils.cpp new file mode 100644 index 0000000000..09c3862590 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Utils.cpp @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#pragma warning(disable: 4091) +#endif + +#include <axis2_svc_ctx.h> +#include <axis2_defines.h> + +#include "tuscany/sca/util/Logging.h" +#include "Axis2Utils.h" + +using namespace tuscany::sca; +using namespace tuscany::sca::ws; + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + char* Axis2Utils::getAxisServiceParameterValue(const axis2_env_t *env, axis2_msg_ctx_t *msg_ctx, char* parameterName) + { + logentry(); + + struct axis2_svc *svc = NULL; + struct axis2_op_ctx *op_ctx = NULL; + struct axis2_svc_ctx *svc_ctx = NULL; + axis2_param_t *param = NULL; + char* paramValue = NULL; + + op_ctx = AXIS2_MSG_CTX_GET_OP_CTX(msg_ctx, env); + svc_ctx = AXIS2_OP_CTX_GET_PARENT(op_ctx, env); + svc = AXIS2_SVC_CTX_GET_SVC(svc_ctx, env); + if(NULL == svc) + { + return NULL; + } + + param = AXIS2_SVC_GET_PARAM(svc, env, parameterName); + if(!param) + { + logwarning("Axis parameter %s cannot be found", parameterName); + } + else + { + paramValue = (char*) AXIS2_PARAM_GET_VALUE(param, env); + } + + return paramValue; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Utils.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Utils.h new file mode 100644 index 0000000000..4e8b069010 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Utils.h @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_ws_axis2utils_h +#define tuscany_sca_extension_ws_axis2utils_h + +#include <axis2_env.h> +#include <axis2_msg_ctx.h> + + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + class Axis2Utils + { + public: + static char* getAxisServiceParameterValue(const axis2_env_t *env, axis2_msg_ctx_t *msg_ctx, char* parameterName); + }; + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_axis2utils_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSReferenceBindingExtension.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSReferenceBindingExtension.cpp new file mode 100644 index 0000000000..24a7552bc4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSReferenceBindingExtension.cpp @@ -0,0 +1,119 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#include "WSReferenceBindingExtension.h" +#include "model/WSReferenceBinding.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/core/SCARuntime.h" + +using namespace std; +using namespace tuscany::sca::model; +using namespace commonj::sdo; + +extern "C" +{ +#if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) +#endif + void tuscany_sca_ws_service_initialize() + { + tuscany::sca::ws::WSReferenceBindingExtension::initialize(); + } +} + +namespace tuscany +{ + namespace sca + { + namespace ws + { + // =================================================================== + // Constructor for the WSReferenceBinding class. + // =================================================================== + WSReferenceBindingExtension::WSReferenceBindingExtension() + { + logentry(); + } + + // =================================================================== + // Destructor for the WSReferenceBindingExtension class. + // =================================================================== + WSReferenceBindingExtension::~WSReferenceBindingExtension() + { + logentry(); + } + + const string WSReferenceBindingExtension::extensionName("ws"); + const string WSReferenceBindingExtension::typeQName("http://www.osoa.org/xmlns/sca/1.0#WebServiceBinding"); + + // =================================================================== + // loadModelElement - load the info from binding.ws + // =================================================================== + ReferenceBinding* WSReferenceBindingExtension::getReferenceBinding(Composite *composite, Reference* reference, DataObjectPtr scdlBinding) + { + logentry(); + + string uri = scdlBinding->getCString("uri"); + + string endpoint; + try + { + endpoint = scdlBinding->getCString("endpoint"); + } + catch (SDORuntimeException&) + { + endpoint = ""; + } + + string version; + try + { + commonj::sdo::DataObjectList& soap = scdlBinding->getList("soapbinding"); + if (soap.size()!=0) + { + version = soap.getCString(0); + } + else + { + version = ""; + } + } + catch (SDORuntimeException&) + { + version = ""; + } + + WSReferenceBinding* serviceBinding = new WSReferenceBinding(reference, uri, endpoint, version); + + return serviceBinding; + } + + void WSReferenceBindingExtension::initialize() + { + logentry(); + SCARuntime::getCurrentRuntime()->registerReferenceBindingExtension(new WSReferenceBindingExtension()); + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSReferenceBindingExtension.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSReferenceBindingExtension.h new file mode 100644 index 0000000000..712e7d2646 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSReferenceBindingExtension.h @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_ws_wsreferencebindingextension_h +#define tuscany_sca_extension_ws_wsreferencebindingextension_h + +#include "tuscany/sca/extension/ReferenceBindingExtension.h" + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + class WSReferenceBindingExtension : public ReferenceBindingExtension + { + public: + /** + * Default constructor + */ + WSReferenceBindingExtension(); + + /** + * Destructor + */ + virtual ~WSReferenceBindingExtension(); + + /** + * return the name of the extension + */ + virtual const std::string& getExtensionName() {return extensionName;} + + /** + * return the QName of schema elemant for this implementation extension + * (e.g. "http://www.osoa.org/xmlns/sca/1.0#binding.ws") + */ + virtual const std::string& getExtensionTypeQName() {return typeQName;} + + virtual tuscany::sca::model::ReferenceBinding* getReferenceBinding( + tuscany::sca::model::Composite* composite, + tuscany::sca::model::Reference *reference, commonj::sdo::DataObjectPtr scdlBinding); + + static void initialize(); + + private: + static const std::string extensionName; + static const std::string typeQName; + + }; + + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_wsreferencebindingextension_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp new file mode 100644 index 0000000000..bea4168984 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp @@ -0,0 +1,579 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <sstream> + +#include "commonj/sdo/SDO.h" + +#include "WSServiceProxy.h" +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/core/Exceptions.h" +#include "tuscany/sca/util/Utils.h" +#include "tuscany/sca/util/SDOUtils.h" +#include "tuscany/sca/core/SCARuntime.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/ReferenceType.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/ServiceType.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/ComponentType.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Composite.h" +#include "tuscany/sca/model/ServiceBinding.h" +#include "tuscany/sca/model/WSDLDefinition.h" +#include "tuscany/sca/model/WSDLInterface.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "model/WSReferenceBinding.h" + +using namespace std; +using namespace commonj::sdo; +using namespace tuscany::sca::model; +using namespace tuscany::sca::util; + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + // ============================ + // Constructor: Create a proxy + // ============================ + WSServiceProxy::WSServiceProxy(Reference* reference) + : ServiceProxy(reference) + { + logentry(); + + // Get the target service wrapper + WSReferenceBinding* referenceBinding = (WSReferenceBinding*)reference->getBinding(); + serviceWrapper = referenceBinding->getTargetServiceBinding()->getServiceWrapper(); + + // Define the SOAP Body type and element to allow a SOAP body to + // be loaded in a DataObject + DataFactoryPtr dataFactory = reference->getComponent()->getComposite()->getDataFactory(); + try { + const Type& bodyType = dataFactory->getType("http://www.w3.org/2003/05/soap-envelope", "Body"); + } catch (SDORuntimeException&) + { + + // Define the SOAP 1.2 Body type + dataFactory->addType("http://www.w3.org/2003/05/soap-envelope", "RootType", false, false, false); + dataFactory->addType("http://www.w3.org/2003/05/soap-envelope", "Body", false, true, false); + dataFactory->addPropertyToType( + "http://www.w3.org/2003/05/soap-envelope", "RootType", + "Body", + "http://www.w3.org/2003/05/soap-envelope", "Body", + false, false, true); + + // Define the SOAP 1.1 Body type + dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/", "RootType", false, false, false); + dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/", "Body", false, true, false); + dataFactory->addPropertyToType( + "http://schemas.xmlsoap.org/soap/envelope/", "RootType", + "Body", + "http://schemas.xmlsoap.org/soap/envelope/", "Body", + false, false, true); + } + + try { + const Type& tempType = dataFactory->getType("http://tempuri.org", "RootType"); + } catch (SDORuntimeException&) + { + dataFactory->addType("http://tempuri.org", "RootType", false, false, false); + dataFactory->addType("http://tempuri.org", "Wrapper", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Wrapper", + "http://tempuri.org", "Wrapper", + false, false, true); + dataFactory->addType("http://tempuri.org", "Part", false, true, false); + dataFactory->addPropertyToType( + "http://tempuri.org", "RootType", + "Part", + "http://tempuri.org", "Part", + false, false, true); + } + } + + // ========== + // Destructor + // ========== + WSServiceProxy::~WSServiceProxy() + { + logentry(); + } + + /// + /// This method will be called to process an operation invocation. + /// + DataObjectPtr WSServiceProxy::invoke(const WSDLOperation& wsdlOperation, DataObjectPtr inputDataObject) + { + logentry(); + + Reference* reference = getReference(); + Component* component = reference->getComponent(); + Composite* composite = component ->getComposite(); + + WSReferenceBinding* referenceBinding = (WSReferenceBinding*)reference->getBinding(); + DataFactoryPtr dataFactoryPtr = reference->getComponent()->getComposite()->getDataFactory(); + + // Since its Document wrapped, there will only be one message part + std::list<std::string> partList = wsdlOperation.getOutputMessagePartNames(); + const WSDLMessagePart &part = wsdlOperation.getOutputMessagePart(partList.front()); + const char* outputTypeURI = part.getPartUri().c_str(); + const char* outputTypeName = part.getPartName().c_str(); + + loginfo("WSDLOperation input message Type: %s#%s", + wsdlOperation.getInputMessageUri().c_str(), + wsdlOperation.getInputMessageName().c_str()); + loginfo("WSDLOperation outputType: %s#%s", + outputTypeURI, + outputTypeName); + + try + { + + // Create new Operation object and set parameters and return value + Operation operation(wsdlOperation.getOperationName().c_str()); + + // Go through the input data object to set the operation parameters + PropertyList pl = inputDataObject->getInstanceProperties(); + + for(unsigned int i=0; i<pl.size(); i++) + { + const char* name = pl[i].getName(); + + switch (pl[i].getTypeEnum()) + { + case Type::BooleanType: + { + bool* boolData = new bool; + *boolData = inputDataObject->getBoolean(pl[i]); + operation.addParameter(boolData); + } + break; + case Type::ByteType: + { + char* byteData = new char; + *byteData = inputDataObject->getByte(pl[i]); + operation.addParameter(byteData); + } + break; + case Type::BytesType: + { + int len = inputDataObject->getLength(pl[i]); + char** bytesData = new char*; + *bytesData = new char[len+1]; + int bytesWritten = inputDataObject->getBytes(pl[i], *bytesData, len); + // Ensure the bytes end with the null char. Not sure if this is neccessary + if(bytesWritten <= len) + { + (*bytesData)[bytesWritten] = 0; + } + else + { + (*bytesData)[len] = 0; + } + operation.addParameter(bytesData); + } + break; + case Type::CharacterType: + { + // This code should work but won't be used as there is no mapping from an XSD type to the SDO CharacterType + wchar_t* charData = new wchar_t; + *charData = inputDataObject->getCharacter(pl[i]); + operation.addParameter(charData); + } + break; + case Type::DoubleType: + { + long double* doubleData = new long double; + *doubleData = inputDataObject->getDouble(pl[i]); + operation.addParameter(doubleData); + } + break; + case Type::FloatType: + { + float* floatData = new float; + *floatData = inputDataObject->getFloat(pl[i]); + operation.addParameter(floatData); + } + break; + case Type::IntType: + { + long* intData = new long; + *intData = inputDataObject->getInt(pl[i]); + operation.addParameter(intData); + } + break; + case Type::ShortType: + { + short* shortData = new short; + *shortData = inputDataObject->getShort(pl[i]); + operation.addParameter(shortData); + } + break; + case Type::StringType: + { + string* stringData; + if(inputDataObject->isSet(pl[i])) + { + stringData = new string(inputDataObject->getCString(pl[i])); + } + else + { + // The data is not set, so pass an empty string as the parameter + stringData = new string(); + } + operation.addParameter(stringData); + } + break; + case Type::DataObjectType: + { + if (!strcmp(pl[i].getType().getURI(), SDOUtils::sdoURI) && + !strcmp(pl[i].getType().getName(), "OpenDataObject")) { + + /* + * This code deals with xsd:any element parameters + * Get each element as a DataObject and add in to the parameter list + */ + + DataObjectList& dataObjectList = inputDataObject->getList(pl[i]); + + for(unsigned int j=0; j<dataObjectList.size(); j++) + { + DataObjectPtr dob = dataObjectList[j]; + if(!dob) + { + + // Add a null DataObject ptr + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = NULL; + loginfo("Null OpenDataObject parameter named %s[%d]", name, j); + operation.addParameter(dataObjectData); + } + else + { + + SequencePtr sequence = dob->getSequence(); + if (sequence->size()!=0) + { + // Add a text element + if (sequence->isText(0)) + { + string* stringData = new string(sequence->getCStringValue(0)); + operation.addParameter(stringData); + } + else + { + // Add a complex element DataObject + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = sequence->getDataObjectValue(0); + if(!*dataObjectData) + { + loginfo("Null DataObject parameter named %s", name); + } + else + { + (*dataObjectData)->detach(); + } + operation.addParameter(dataObjectData); + } + } + else + { + // Empty content, add an empty string + loginfo("Empty OpenDataObject parameter named %s[%d]", name, j); + string* stringData = new string(""); + operation.addParameter(stringData); + } + } + } + } + else { + DataObjectPtr* dataObjectData = new DataObjectPtr; + *dataObjectData = inputDataObject->getDataObject(pl[i]); + if(!*dataObjectData) + { + loginfo("Null DataObject parameter named %s", name); + } + else + { + (*dataObjectData)->detach(); + } + operation.addParameter(dataObjectData); + } + } + break; + default: + { + ostringstream msg; + msg << "Unsupported param type: " << pl[i].getTypeEnum(); + throwException(SystemConfigurationException, msg.str().c_str()); + } + } + } + + // Call into the target service wrapper + serviceWrapper->invoke(operation); + + // Set the data in the outputDataObject to be returned + DataObjectPtr outputDataObject; + try + { + // Create the output wrapper + const Type& rootType = dataFactoryPtr->getType(outputTypeURI, "RootType"); + const Property& prop = rootType.getProperty(outputTypeName); + const Type& outputType = prop.getType(); + outputDataObject = dataFactoryPtr->create(outputType); + } + catch (SDORuntimeException&) + { + try + { + // Create the output wrapper + const Type& outputType = dataFactoryPtr->getType(outputTypeURI, outputTypeName); + outputDataObject = dataFactoryPtr->create(outputType); + } + catch (SDORuntimeException&) + { + // The output wrapper type is not known, create an open DataObject + //outputDataObject = dataFactoryPtr->create("http://tempuri.org", "Wrapper"); + outputDataObject = dataFactoryPtr->create(SDOUtils::sdoURI, "OpenDataObject"); + } + } + + setOutputData(operation, outputDataObject, dataFactoryPtr); + + return outputDataObject; + + } + catch(SDORuntimeException& ex) + { + throwException(ServiceInvocationException, ex); + } + catch(TuscanyRuntimeException&) + { + throw; + } + } + + + void WSServiceProxy::setOutputData(Operation& operation, DataObjectPtr outputDataObject, DataFactoryPtr dataFactoryPtr) + { + logentry(); + + // Go through data object to set the return value + PropertyList pl = outputDataObject->getType().getProperties(); + + if(pl.size() == 0) + { + if(outputDataObject->getType().isOpenType() && outputDataObject->getType().isDataObjectType()) + { + /* + * This code deals with returning xsd:any elements + */ + DataObjectList& l = outputDataObject->getList("return"); + Operation::ParameterType resultType = operation.getReturnType(); + switch(resultType) + { + case Operation::BOOL: + { + l.append(*(bool*)operation.getReturnValue()); + break; + } + case Operation::SHORT: + { + l.append(*(short*)operation.getReturnValue()); + break; + } + case Operation::INT: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::LONG: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::USHORT: + { + l.append(*(short*)operation.getReturnValue()); + break; + } + case Operation::UINT: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::ULONG: + { + l.append(*(long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + { + l.append(*(float*)operation.getReturnValue()); + break; + } + case Operation::DOUBLE: + { + l.append(*(long double*)operation.getReturnValue()); + break; + } + case Operation::LONGDOUBLE: + { + l.append(*(long double*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + l.append(*(char**)operation.getReturnValue()); + break; + } + case Operation::STRING: + { + l.append((*(string*)operation.getReturnValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + l.append(*(DataObjectPtr*)operation.getReturnValue()); + break; + } + default: + { + // One way operation, no return value + break; + } + } + } + else + { + loginfo("No return values defined"); + } + } + else { + + // Should only be one return value.. This goes through all return values + for(unsigned int i=0; i<pl.size(); i++) + { + const char* name = pl[i].getName(); + + Operation::ParameterType resultType = operation.getReturnType(); + switch(resultType) + { + case Operation::BOOL: + { + outputDataObject->setBoolean(pl[i], *(bool*)operation.getReturnValue()); + break; + } + case Operation::SHORT: + { + outputDataObject->setShort(pl[i], *(short*)operation.getReturnValue()); + break; + } + case Operation::INT: + { + outputDataObject->setInt(pl[i], *(int*)operation.getReturnValue()); + break; + } + case Operation::LONG: + { + outputDataObject->setInt(pl[i], *(long*)operation.getReturnValue()); + break; + } + case Operation::USHORT: + { + outputDataObject->setInt(pl[i], *(unsigned short*)operation.getReturnValue()); + break; + } + case Operation::UINT: + { + outputDataObject->setInt(pl[i], *(unsigned int*)operation.getReturnValue()); + break; + } + case Operation::ULONG: + { + outputDataObject->setInt(pl[i], *(unsigned long*)operation.getReturnValue()); + break; + } + case Operation::FLOAT: + { + outputDataObject->setFloat(pl[i], *(float*)operation.getReturnValue()); + break; + } + case Operation::DOUBLE: + { + outputDataObject->setDouble(pl[i], *(double*)operation.getReturnValue()); + break; + } + case Operation::LONGDOUBLE: + { + outputDataObject->setDouble(pl[i], *(long double*)operation.getReturnValue()); + break; + } + case Operation::CHARS: + { + if(*(char**)operation.getReturnValue() != NULL) + { + outputDataObject->setCString(pl[i], *(char**)operation.getReturnValue()); + } + else + { + loginfo("Null return value, leaving property %s unset", pl[i].getName()); + } + break; + } + case Operation::STRING: + { + outputDataObject->setCString(pl[i], (*(string*)operation.getReturnValue()).c_str()); + break; + } + case Operation::DATAOBJECT: + { + + if(*(DataObjectPtr*)operation.getReturnValue() != NULL) + { + outputDataObject->setDataObject(pl[i], *(DataObjectPtr*)operation.getReturnValue()); + } + else + { + loginfo("Null return value, leaving property %s unset", pl[i].getName()); + } + + break; + } + default: + { + // One way operation, no return value + break; + } + } + } + } + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.h new file mode 100644 index 0000000000..4d57514688 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.h @@ -0,0 +1,95 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_ws_wsserviceproxy_h +#define tuscany_sca_extension_ws_wsserviceproxy_h + +#include "commonj/sdo/SDO.h" + +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/core/ServiceWrapper.h" +#include "tuscany/sca/model/Component.h" +#include "tuscany/sca/model/Reference.h" +#include "tuscany/sca/model/Service.h" +#include "tuscany/sca/model/WSDLOperation.h" +#include "model/WSReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + /** + * Holds a proxy for a given component and reference. + * The proxy which is held inside a ServiceProxy will be specific to the programming + * interface expected by the client. In this particular case the client is an Axis2 + * Web service skeleton. + */ + class WSServiceProxy : public ServiceProxy + { + public: + /** + * Create a new service proxy for a reference. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The reference on the source component. + * @param target The wrapper of the service which is wired to this reference. + */ + WSServiceProxy(tuscany::sca::model::Reference* reference); + + /** + * Create a new service proxy for a service. The proxy will contain a pointer to + * the target ServiceWrapper. + * @param reference The service on the target component. + * @param target The wrapper of the target service. + */ + WSServiceProxy(tuscany::sca::model::Service* service); + + /** + * Destructor. + */ + virtual ~WSServiceProxy(); + + /** + * Invoke the specified operation + */ + commonj::sdo::DataObjectPtr invoke(const tuscany::sca::model::WSDLOperation& wsdlOperation, + commonj::sdo::DataObjectPtr inputDataObject); + + private: + + void setOutputData(Operation& operation, + commonj::sdo::DataObjectPtr outputDataObject, commonj::sdo::DataFactoryPtr dataFactoryPtr); + + /** + * The target service wrapper + */ + ServiceWrapper* serviceWrapper; + + }; + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_wsserviceproxy_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/export.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/export.h new file mode 100644 index 0000000000..e52adf4db0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/export.h @@ -0,0 +1,38 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_ws_service_export_h +#define tuscany_sca_ws_service_export_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) + +#ifdef TUSCANY_SCA_WS_SERVICE_EXPORTS +#define SCA_WS_SERVICE_API __declspec(dllexport) +#else +#define SCA_WS_SERVICE_API __declspec(dllimport) +#endif + +#else +#define SCA_WS_SERVICE_API +#endif + +#endif // tuscany_sca_ws_service_export_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/model/WSReferenceBinding.cpp b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/model/WSReferenceBinding.cpp new file mode 100644 index 0000000000..4f170ebf52 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/model/WSReferenceBinding.cpp @@ -0,0 +1,151 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "tuscany/sca/util/Logging.h" +#include "tuscany/sca/ws/model/WSReferenceBinding.h" +#include "tuscany/sca/core/ServiceProxy.h" +#include "tuscany/sca/ws/WSServiceProxy.h" + +using namespace std; +using namespace tuscany::sca::model; + +namespace tuscany +{ + namespace sca + { + namespace ws + { + + // Constructor + WSReferenceBinding::WSReferenceBinding(Reference* reference, const string& uri, const string& endpoint, const string&version) + : ReferenceBinding(reference, uri), endpoint(endpoint), soapVersion(version) + { + logentry(); + + parseEndpoint(); + } + + void WSReferenceBinding::parseEndpoint() + { + logentry(); + + // Endpoint is of the form: <wsdl-namepace-uri>#wsdl.endpoint(<service-name>/<endpoint-name>) + string::size_type hash = endpoint.find("#"); + if (hash != string::npos) + { + // Found a hash + + // Namepace is the part before the # + wsdlNamespaceURL = endpoint.substr(0, hash); + + + if ( (hash+1) < endpoint.length()) + { + // Check the next part is wsdl.endpoint( + int ending = hash+15; + string check = endpoint.substr(hash+1, 14); + if (check.compare("wsdl.endpoint(") == 0) + { + // Find the matching ) + int endBracket = endpoint.find(")",ending); + if (endBracket-1 > ending+1) + { + string serviceAndEndpoint = endpoint.substr(ending, endBracket-ending); + // Look for a '/' + string::size_type slash = serviceAndEndpoint.find("/"); + if (slash != string::npos) + { + serviceName = serviceAndEndpoint.substr(0, slash); + + if ( (slash+1) < serviceAndEndpoint.length()) + { + endpointName = serviceAndEndpoint.substr(slash+1); + } + else + { + endpointName = ""; + } + + } + else + { + // No '/' so all of it is the service name + serviceName = serviceAndEndpoint; + endpointName = ""; + + } + } + else + { + // Nothing between the () + serviceName = ""; + endpointName = ""; + } + } + else + { + // not the correct characters after the #, ignore the rest + serviceName = ""; + endpointName = ""; + } + + } + else + { + // Nothing after the hash + serviceName = ""; + endpointName = ""; + } + } + else + { + // No hash at all + wsdlNamespaceURL = endpoint; + serviceName = ""; + endpointName = ""; + } + } + + // Destructor + WSReferenceBinding::~WSReferenceBinding() + { + logentry(); + } + + void WSReferenceBinding::configure(ServiceBinding *binding) + { + logentry(); + + setTargetServiceBinding(binding); + + serviceProxy = new WSServiceProxy(getReference()); + } + + ServiceProxy* WSReferenceBinding::getServiceProxy() + { + logentry(); + + return serviceProxy; + } + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/model/WSReferenceBinding.h b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/model/WSReferenceBinding.h new file mode 100644 index 0000000000..14f17dbc3c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/model/WSReferenceBinding.h @@ -0,0 +1,143 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_extension_ws_model_wsreferencebinding_h +#define tuscany_sca_extension_ws_model_wsreferencebinding_h + +#include <string> + +#include "tuscany/sca/ws/export.h" +#include "tuscany/sca/model/ReferenceBinding.h" + + +namespace tuscany +{ + namespace sca + { + namespace ws + { + /** + * Information about a web service binding for service or a reference. + */ + class WSReferenceBinding : public tuscany::sca::model::ReferenceBinding + { + public: + + /** + * Constructor. + * @param uri The uri of the binding. + * @param endpoint The definition of the endpoint to which the entrypoint + * or external service is to be bound. This is of the form + * "namespace"#endpoint("service"/"endpoint") + */ + SCA_WS_SERVICE_API WSReferenceBinding(tuscany::sca::model::Reference* reference, + const std::string&uri, const std::string& endpoint, const std::string& version); + + /** + * Destructor. + */ + SCA_WS_SERVICE_API virtual ~WSReferenceBinding(); + + /** + * Returns the type of binding. + */ + virtual std::string getType() { return "http://www.osoa.org/xmlns/sca/1.0#WebServiceBinding"; }; + + /** + * Configure this binding from a service binding. + */ + SCA_WS_SERVICE_API virtual void configure(tuscany::sca::model::ServiceBinding* serviceBinding); + + /** + * Create a proxy representing the reference to the + * client component. + */ + SCA_WS_SERVICE_API virtual ServiceProxy* getServiceProxy(); + + /** + * Return the part of the endpoint definition describing the wsdl + * namespace. + * @return The wsdl namespace. + */ + std::string getWSDLNamespaceURL() const { return wsdlNamespaceURL; }; + + /** + * Return the service part of the endpoint definition. + * @return The service to use. + */ + std::string getServiceName() const { return serviceName; }; + + /** + * Return the endpoint name part of the endpoint definition. + * @return The endpoint name to use. + */ + std::string getEndpointName() const { return endpointName; }; + + /** + * Return the SOAP version. + * @return The SOAP version to use. + */ + std::string getSOAPVersion() const { return soapVersion; }; + + private: + + /** + * Parse the endpoint specification. + */ + void parseEndpoint(); + + /** + * The full endpoint string. + */ + std::string endpoint; + + /** + * Namespace from the endpoint. + */ + std::string wsdlNamespaceURL; + + /** + * Service name from the endpoint. + */ + std::string serviceName; + + /** + * Endpoint name from the endpoint. + */ + std::string endpointName; + + /** + * SOAP version. + */ + std::string soapVersion; + + /** + * The proxy representing the reference to the client + * component. + */ + ServiceProxy* serviceProxy; + }; + + } // End namespace ws + } // End namespace sca +} // End namespace tuscany + +#endif // tuscany_sca_extension_ws_model_wsreferencebinding_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/xsd/sca-binding-webservice.xsd b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/xsd/sca-binding-webservice.xsd new file mode 100644 index 0000000000..680dd809a8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/runtime/extensions/ws/xsd/sca-binding-webservice.xsd @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.osoa.org/xmlns/sca/1.0" + xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" + elementFormDefault="qualified"> + + <include schemaLocation="../../../xsd/sca-core.xsd"/> + + <element name="binding.ws" type="sca:WebServiceBinding" substitutionGroup="sca:binding"/> + <complexType name="WebServiceBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <element name="soapbinding" type="sca:SOAPBinding" minOccurs="0" maxOccurs="unbounded"/> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="endpoint" type="anyURI" use="optional" /> + <attribute name="location" type="anyURI" use="optional" /> + <attribute name="conformanceURIs" type="sca:ConformanceURIList" use="optional" /> + <attribute name="interfaceMapping" type="string" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <complexType name="SOAPBinding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="optional" /> + <attribute name="version" type="string" use="optional" /> + <anyAttribute namespace="##any" processContents="lax" /> + </complexType> + + <simpleType name="ConformanceURIList"> + <list itemType="anyURI"/> + </simpleType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AUTHORS b/sca-cpp/branches/cpp-contrib/contrib/samples/AUTHORS new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AUTHORS diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/AlertAggregatorSCADiagram.png b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/AlertAggregatorSCADiagram.png Binary files differnew file mode 100644 index 0000000000..4672a5e22e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/AlertAggregatorSCADiagram.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/Makefile.am new file mode 100644 index 0000000000..0b39db277d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/AlertAggregator/deploy +SUBDIRS = sample.alerter sample.display httpserver +EXTRA_DIST = *.composite *.xml README.html +deploy_DATA = *.composite *.xml diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/README b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/README new file mode 100644 index 0000000000..e605168052 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/README @@ -0,0 +1,38 @@ +Tuscany SCA for C++ Samples - Alert Aggregator Sample +===================================================== + +This is a sample that shows how a Web 2.0-style application can be built using +SCA. The Alert Aggregator Sample aggregates various data sources and presents +a unified view of data from these sources, served as XML and displayed via a +web page + +There are three sub-directories in this workspace: + - sample.alerter + This contains the source code and SCDL artifacts for the Alert + Aggregator. Includes components to retrieve emails from POP servers and + to retrieve items from RSS/Atom feeds, a component that aggregates these + alerts and a component that manages the configuration of which POP accounts + and which RSS feeds to read. + + - sample.display + Contains a single SCA component that provides a HTML display of the + Alert Aggregator data + + - httpserver + Configuration files and scripts to run the sample under Apache HTTPD. Also + includes the HTML file that calls the HTMLDisplay component + + +Additionally, there is the sample.alerter.app.composite file. This +describes the configuration of the Alerter and Display composites deployed to the +SCA runtime. + +This sample requires the following Tuscany extensions: +Python +REST service +REST reference + +It also requires the Python FeedParser library, available from http://feedparser.org/ + + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/README.html new file mode 100644 index 0000000000..69d5434527 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/README.html @@ -0,0 +1,263 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - Alert Aggregator Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - Alert Aggregator Sample</H1> + + <P>This is a more complex sample that shows how Tuscany and SCA can be used to + develop and run mash-up style web applications.</P> + <P>The Alert Aggregator sample aggregates items of information from various data + sources into a series of "alerts" that are displayed in an + automatically updating web page. Alert sources can currently include RSS/Atom + news feeds and POP3/IMAP email</P> + <P>The Alert Aggregator sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Service and Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </P> + <P>Additionally, the Alert Aggregator sample requires the Python FeedParser library, available from + <A HREF="http://feedparser.org" TARGET="_blank">http://feedparser.org</A>. Please download and + install the library by following the documentation.</P> + <P>There are three sub-projects in this workspace: + <UL> + <LI>sample.alerter<BR/> + This contains the source code and SCDL artifacts for the SCA components + implementing the Alert Aggregator configuration and alert retrieval. + </LI> + <LI>sample.display<BR/> + This contains the source code and SCDL artifacts for the SCA components + implementing the display and storage of the retrieved alerts. + </LI> + <LI>httpserver<BR/> + This contains a minimal configuration for the Apache HTTP server used + to host the services as well as scripts to start and stop the server. + </LI> + </UL> + Additionally, there is the sample.alerter.app.composite file. This + describes the configuration of the SCA composites deployed to the SCA + runtime.</P> + <P>The following SCA diagram shows the different components and composites and how the + wiring between them is specified. Not all of these components are currently + implemented in this sample.</P> + <IMG SRC="AlertAggregatorSCADiagram.png" ALT="Alert Aggregator SCA Diagram"/> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the Alert Aggregator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the Alert Aggregator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the Alert Aggregator sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the Alert Aggregator sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the Alert Aggregator sample on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the sample on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>As the Alert Aggregator sample is based on Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Python samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-python --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/AlertAggregator</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the Alert Aggregator sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The Alert Aggregator sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Service and Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The Alert Aggregator sample requires the Python FeedParser library, available from + <A HREF="http://feedparser.org" TARGET="_blank">http://feedparser.org</A>. Please download and + install the library by following the documentation.</LI> + <LI>Start the Apache HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>PYTHON_LIB=<path to the Python library><BR/> + Note: If you are using a default installation of Python 2.5 this is usually /usr/lib</LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/AlertAggregator/deploy/httpserver</LI> + <LI>./startserver.sh<BR/> + NOTE: Depending on your installation of Apache HTTPD you may need to log in as root before following + these steps. If so, you may also need to uncomment the User and Group directives in the + <tuscany_sca_install_dir>/samples/AlertAggregator/deploy/httpserver/conf/httpd.conf file + and set these to the appropriate username and group that the server should run as</LI> + </OL> + </LI> + <LI>Run the client from your web browser: + <OL> + <LI>Point your browser at <A HREF="http://localhost:9090/index.html" TARGET="_blank">http://localhost:9090/index.html</A><BR/> + NOTE: If plain text is diplayed by your browser, rather than a rendered web page, you may need + to uncomment the LoadModule mime_module directive in the + <tuscany_sca_install_dir>/samples/AlertAggregator/deploy/httpserver/conf/httpd.conf file. Set the correct path to + the mod_mime.so library and restart the server</LI> + <LI>You should see the Alert Aggregator web interface that allows you to: + <UL> + <LI>Read new alerts</LI> + <LI>Update alerts from all sources</LI> + <LI>Update alerts from a specific source</LI> + <LI>Edit the configuration of a data source</LI> + <LI>Add a new RSS/Atom or POP email data source</LI> + <LI>Remove a specific data source and all associated alerts</LI> + </UL> + </LI> + </OL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the Alert Aggregator sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As this sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\AlertAggregator</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the Alert Aggregator sample on Windows</H2></A> + <OL> + + <LI>The Alert Aggregator sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Service and Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The Alert Aggregator sample requires the Python FeedParser library, available from + <A HREF="http://feedparser.org" TARGET="_blank">http://feedparser.org</A>. Please download and + install the library by following the documentation.</LI> + <LI>Start the Apache HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>HTTPD_HOME=<path to installed Apache HTTPD server></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\AlertAggregator\deploy\httpserver</LI> + <LI>startserver.bat</LI> + </OL> + </LI> + <LI>Run the client from your web browser: + <OL> + <LI>Point your browser at <A HREF="http://localhost:9090/index.html" TARGET="_blank">http://localhost:9090/index.html</A><BR/> + NOTE: If plain text is diplayed by your browser, rather than a rendered web page, you may need + to uncomment the LoadModule mime_module directive in the + <tuscany_sca_install_dir>\samples\AlertAggregator\deploy\httpserver\conf\httpd.conf file. Set the correct path to + the mod_mime.so library (e.g. C:\Apache2.2\modules\mod_mime.so) and restart the server</LI> + <LI>You should see the Alert Aggregator web interface that allows you to: + <UL> + <LI>Read new alerts</LI> + <LI>Update alerts from all sources</LI> + <LI>Update alerts from a specific source</LI> + <LI>Edit the configuration of a data source</LI> + <LI>Add a new RSS/Atom or POP email data source</LI> + <LI>Remove a specific data source and all associated alerts</LI> + </UL> + </LI> + </OL> + </LI> + </OL> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/config.xml b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/config.xml new file mode 100644 index 0000000000..0b33cb7911 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/config.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<ns0:config xmlns:ns0="http://tuscany.apache.org/samples/alerter"> +<ns0:source id="0" type="rss"> + <ns0:name>BBC News</ns0:name> + <ns0:address>http://news.bbc.co.uk/</ns0:address> + <ns0:lastChecked>2007-02-07T17:11:16</ns0:lastChecked> + <ns0:feedAddress>http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/world/rss.xml</ns0:feedAddress> +</ns0:source> +<ns0:source id="1" type="rss"> + <ns0:name>Engadget</ns0:name> + <ns0:address>http://www.engadget.com</ns0:address> + <ns0:lastChecked>2007-02-07T17:11:14</ns0:lastChecked> + <ns0:feedAddress>http://www.engadget.com/rss.xml</ns0:feedAddress> +</ns0:source> +</ns0:config>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/README b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/README new file mode 100644 index 0000000000..207e6394e1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/README @@ -0,0 +1,33 @@ +Alert Aggregator - PHP Display Component
+========================================
+
+This httpserver configuration includes a PHP implementation of the display
+component that replaces the python component in sample.display.
+
+The HTTPD configuration created by the startserver scrips relies on the
+PHP_HOME environment variable in order to install PHP in Apache as follows:
+
+LoadModule php5_module %PHP_HOME%\php5apache2.dll
+AddType application/x-httpd-php .php
+PHPIniDir %PHP_HOME%
+
+PHP must be configured to include the PHP SCA_SDO extension from PECL.
+This provides the SCA and SDO support that the display component relies on.
+Currently you must have the version from the AVOCET branch as changes have
+been made here that this application requires.
+
+To run the AlertAggregator sample with the PHP component you must start the
+original HTTP server, e.g., on windows
+
+> cd AlertAggregator\httpserver
+> startserver.bat
+
+and then start the HTTPD server that servers the PHP part of the application, e.g.,
+
+> cd AlertAggregator\httpserver.php
+> startserver.bat
+
+then point your browser at
+
+http://localhost:9091/index.html
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/conf/httpd.conf b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/conf/httpd.conf new file mode 100644 index 0000000000..92026c9717 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/conf/httpd.conf @@ -0,0 +1,28 @@ +# 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.
+
+# This is the main Apache HTTP server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.
+
+Listen 9091
+
+# Generated by the startserver script
+Include conf/base.conf
+
+# SCA rest module not required for the PHP part
+# Include conf/tuscany_sca_mod_rest.conf
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/conf/mime.types b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/conf/mime.types new file mode 100644 index 0000000000..4279f51bca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/conf/mime.types @@ -0,0 +1,607 @@ +# 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. + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at <http://www.iana.org/assignments/media-types/>. + +# MIME type Extensions +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomicmail +application/batch-smtp +application/beep+xml +application/cals-1840 +application/cnrp+xml +application/commonground +application/cpl+xml +application/cybercash +application/dca-rft +application/dec-dx +application/dvcs +application/edi-consent +application/edifact +application/edi-x12 +application/eshop +application/font-tdpfr +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica +application/mathml+xml mathml +application/msword doc +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin dms lha lzh exe class so dll dmg +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rdf+xml rdf +application/reginfo+xml +application/remote-printing +application/riscos +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/srgs gram +application/srgs+xml grxml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/vemmi +application/vnd.3gpp.pic-bw-large +application/vnd.3gpp.pic-bw-small +application/vnd.3gpp.pic-bw-var +application/vnd.3gpp.sms +application/vnd.3m.post-it-notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.acucorp +application/vnd.adobe.xfdf +application/vnd.aether.imp +application/vnd.amiga.ami +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.blueice.multipass +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.criticaltools.wbs+xml +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl +application/vnd.cybank +application/vnd.data-vision.rdz +application/vnd.dna +application/vnd.dpgraph +application/vnd.dreamfactory +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-help +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hbci +application/vnd.hhe.lesson-player +application/vnd.hp-hpgl +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.hp-pcl +application/vnd.hp-pclxl +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay +application/vnd.ibm.modcap +application/vnd.ibm.rights-management +application/vnd.ibm.secure-container +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jisp +application/vnd.kde.karbon +application/vnd.kde.kchart +application/vnd.kde.kformula +application/vnd.kde.kivio +application/vnd.kde.kontour +application/vnd.kde.kpresenter +application/vnd.kde.kspread +application/vnd.kde.kword +application/vnd.kenameaapp +application/vnd.koan +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop +application/vnd.llamagraphics.life-balance.exchange+xml +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.micrografx.flo +application/vnd.micrografx.igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.mbk +application/vnd.mobius.mqy +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.mophun.application +application/vnd.mophun.certificate +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls +application/vnd.ms-lrm +application/vnd.ms-powerpoint ppt +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.ms-wpl +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.edm +application/vnd.novadigm.edx +application/vnd.novadigm.ext +application/vnd.obn +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.quark.quarkxpress +application/vnd.rapid +application/vnd.s3sms +application/vnd.sealed.net +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.street-stream +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio +application/vnd.visionary +application/vnd.vividence.scriptfile +application/vnd.vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.wv.csp+wbxml +application/vnd.xara +application/vnd.xfdl +application/vnd.yamaha.hv-dic +application/vnd.yamaha.hv-script +application/vnd.yamaha.hv-voice +application/vnd.yellowriver-custom-menu +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip +application/x-hdf hdf +application/x-javascript js +application/x-koan skp skd skt skm +application/x-latex latex +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x400-bp +application/xhtml+xml xhtml xht +application/xslt+xml xslt +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/zip zip +audio/32kadpcm +audio/amr +audio/amr-wb +audio/basic au snd +audio/cn +audio/dat12 +audio/dsr-es201108 +audio/dvi4 +audio/evrc +audio/evrc0 +audio/g722 +audio/g.722.1 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g729D +audio/g729E +audio/gsm +audio/gsm-efr +audio/l8 +audio/l16 +audio/l20 +audio/l24 +audio/lpc +audio/midi mid midi kar +audio/mpa +audio/mpa-robust +audio/mp4a-latm +audio/mpeg mpga mp2 mp3 +audio/parityfec +audio/pcma +audio/pcmu +audio/prs.sid +audio/qcelp +audio/red +audio/smv +audio/smv0 +audio/telephone-event +audio/tone +audio/vdvi +audio/vnd.3gpp.iufp +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-alaw-basic +audio/x-mpegurl m3u +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin +application/vnd.rn-realmedia rm +audio/x-wav wav +chemical/x-pdb pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg +image/t38 +image/tiff tiff tif +image/tiff-fx +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.globalgraphics.pgb +image/vnd.mix +image/vnd.ms-modi +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-icon ico +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/news +message/partial +message/rfc822 +message/s-http +message/sip +message/sipfrag +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics ifb +text/css css +text/directory +text/enriched +text/html html htm +text/parityfec +text/plain asc txt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.dmclientscript +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.iptc.nitf +text/vnd.iptc.newsml +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.sun.j2me.app-descriptor +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-setext etx +text/xml +text/xml-external-parsed-entity +video/bmpeg +video/bt656 +video/celb +video/dv +video/h261 +video/h263 +video/h263-1998 +video/h263-2000 +video/jpeg +video/mp1s +video/mp2p +video/mp2t +video/mp4v-es +video/mpv +video/mpeg mpeg mpg mpe +video/nv +video/parityfec +video/pointer +video/quicktime qt mov +video/smpte292m +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.nokia.interleaved-multimedia +video/vnd.objectvideo +video/vnd.vivo +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/AlertDisplay.php b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/AlertDisplay.php new file mode 100644 index 0000000000..2b9eb916a0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/AlertDisplay.php @@ -0,0 +1,204 @@ +<!-- + 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. +--> +<?php +include 'SCA/SCA.php'; + +/** + * @service
+ * @binding.rest.rpc
+ * @types http://tuscany.apache.org/samples/alerter ./Alerter.xsd + */ +class AlertDisplay +{
+ /**
+ * @reference
+ * @binding.rest.rpc http://localhost:9090/rest/sample.alerter.AlerterComponent/AlerterService
+ * @types http://tuscany.apache.org/samples/alerter ./Alerter.xsd
+ */
+ public $alert_service;
+
+ /**
+ * @return string
+ */
+ public function getAlertsHTMLTable()
+ {
+ $xmldas = SDO_DAS_XML::create("./Alerter.xsd");
+ $doc = $xmldas->loadFile("./Cached_Alerts.xml");
+ $cached_alerts = $doc->getRootDataObject();
+
+ // Use the alertService reference
+ $new_alerts = $this->alert_service->getAllNewAlerts();
+
+ foreach($new_alerts->alert as $alert){
+ $new_alert = $cached_alerts->createDataObject('alert');
+ $new_alert->title = $alert->title;
+ $new_alert->summary = $alert->summary;
+ $new_alert->address = $alert->address;
+ $new_alert->date = $alert->date;
+ $new_alert->sourceid = $alert->sourceid;
+ $new_alert->unread = true;
+ }
+
+ $return_table = "<TABLE border=\'0\'>";
+ $alert_id_number = 0;
+ foreach($cached_alerts->alert as $alert){
+ $alert->id = "alert_" . $alert_id_number;
+ $title = substr($alert->title,0,80);
+ $summary = substr($alert->summary,0,40);
+ $unread_string = $alert->unread ? "unread_title" : "read_title";
+ $return_row = <<<ALERTROW
+<TR class="source_$alert->sourceid clickable" onclick="displayAlert('$alert->address', '')">
+ <TD>
+ <SPAN id="$alert->id" class="$unread_string">$title</SPAN>
+ <SPAN class="summary"> - $summary ...</SPAN>
+ </TD>
+ <TD>
+ $alert->date
+ </TD>
+</TR>
+ALERTROW;
+ $return_table = $return_table . $return_row;
+ $alert_id_number += 1;
+ }
+ $return_table = $return_table . "</TABLE>";
+
+ // as php is one shot we have to save away the alerts we want to cache
+ $xmldas->saveFile($doc, "./Cached_Alerts.xml");
+
+ return $return_table;
+ }
+
+ /**
+ * @param string $alert_id
+ * @return string
+ */
+ public function readAlert($alert_id)
+ {
+ $xmldas = SDO_DAS_XML::create("./Alerter.xsd");
+ $doc = $xmldas->loadFile("./Cached_Alerts.xml");
+ $cached_alerts = $doc->getRootDataObject();
+
+ $return_summary = "";
+
+ foreach($cached_alerts->alert as $alert){
+SCA::$logger->log($alert->id . " vs " . $alert_id );
+ if (strcmp($alert->id,$alert_id) == 0){
+ SCA::$logger->log("Match");
+ $alert->unread = false;
+ $return_summary = "<PRE>" . $alert->summary . "</PRE>";
+ }
+ }
+
+ // as php is one shot we have to save away the alerts we want to cache
+ $xmldas->saveFile($doc, "./Cached_Alerts.xml");
+
+ return $return_summary;
+ }
+
+ /**
+ * @return string
+ */
+ public function getAlertSourcesHTMLTable()
+ {
+ # Use the alertService reference
+ $alert_sources = $this->alert_service->getAlertSources();
+
+// some debug
+//ob_start();
+//print_r( $alert_sources );
+//$debug = ob_get_contents();
+//ob_end_clean();
+//SCA::$logger->log($debug);
+
+ $return_table = "<TABLE border='0'>\n";
+
+ foreach ($alert_sources->source as $alert_source){
+ $source_id = $alert_source->id;
+ $return_row = <<<SOURCEROW
+<TR CLASS="source_$source_id" >
+ <TD CLASS="clickable" ONCLICK="displayAlert('$alert_source->address', '')">
+ <IMG SRC="rss.png"/> $alert_source->name
+ </TD>
+ <TD CLASS="clickable link" ONCLICK="showEditSource('$source_id')">Edit</TD>
+ <TD CLASS="clickable link" ONCLICK="deleteSource('$source_id')">Delete</TD>
+</TR>
+<TR ID="edit_source_$source_id" CLASS="hidden source_$source_id">
+ <TD COLSPAN="3">
+ <TABLE CLASS="sourceDetailsTable">
+ <TR>
+ <TD>Source name:</TD>
+ <TD>
+ <INPUT ID="source_{$source_id}_name" TYPE="TEXT" SIZE="50" VALUE="$alert_source->name"/>
+ </TD>
+ </TR>
+ <TR>
+ <TD>Source address:</TD>
+ <TD>
+ <INPUT ID="source_{$source_id}_address" TYPE="TEXT" SIZE="50" VALUE="$alert_source->address"/>
+ </TD>
+ </TR>
+ <TR>
+ <TD>
+ <INPUT ID="source_{$source_id}_type" TYPE="HIDDEN" VALUE="$source_id"/>
+ <INPUT TYPE="BUTTON" VALUE="Update" ONCLICK="updateSource('$source_id')"/>
+ <INPUT TYPE="BUTTON" VALUE="Cancel" ONCLICK="hideEditSource('$source_id')"/>
+ </TD>
+ </TR>
+ </TABLE>
+ </TD>
+</TR>
+SOURCEROW;
+ $return_table = $return_table . $return_row;
+ }
+
+ $return_table = $return_table . "</TABLE>\n";
+ return $return_table;
+ }
+
+ /**
+ * @param integer $source_id
+ * @return string
+ */
+ public function deleteAlertSource($source_id){
+ # Use the alertService reference
+ $this->alertService->removeAlertSource($source_id);
+
+ //TODO
+ }
+
+ /**
+ * @param source $alert_source http://tuscany.apache.org/samples/alerter
+ */
+ public function addAlertSource($alert_source){
+ # Use the alertService reference
+ $this->alertService->addAlertSource($alert_source);
+ }
+
+ /**
+ * @param source $alert_source http://tuscany.apache.org/samples/alerter
+ */
+ public function updateAlertSource($alert_source){
+ # Use the alertService reference
+ $this->alertService->updateAlertSource($alert_source);
+ } +} +?>
+
+
+ diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/Alerter.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/Alerter.xsd new file mode 100644 index 0000000000..58b9982d38 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/Alerter.xsd @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<schema targetNamespace="http://tuscany.apache.org/samples/alerter"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ns="http://tuscany.apache.org/samples/alerter"> + <element name="alerts" type="ns:alerts"/>
+ + <complexType name="alert"> + <sequence> + <element name="title" type="string"/>
+ <element name="summary" type="string"/> + <element name="address" type="anyURI" maxOccurs="1" minOccurs="1"/> + <element name="date" type="string" maxOccurs="1" minOccurs="1"/> + </sequence>
+ <attribute name="sourceid" type="string" use="optional"/>
+ <attribute name="unread" type="boolean" use="optional"/>
+ <attribute name="id" type="string" use="optional"/>
+ </complexType> + + <complexType name="alerts"> + <sequence> + <element name="alert" type="ns:alert" maxOccurs="unbounded" minOccurs="0" /> + </sequence>
+ </complexType>
+ + <element name="config" type="ns:config"/>
+ <element name="source" type="ns:source"/>
+ + <complexType name="source"> + <sequence> + <element name="name" type="string" maxOccurs="1" minOccurs="1"/>
+ <element name="address" type="anyURI" maxOccurs="1" minOccurs="1"/>
+ <element name="lastChecked" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="feedAddress" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popServer" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popUsername" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popPassword" type="string" maxOccurs="1" minOccurs="0"/>
+ <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence>
+ <attribute name="id" type="string" use="optional"/>
+ <attribute name="type" use="required">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="rss"/>
+ <enumeration value="pop"/> + <enumeration value="nntp"/> + </restriction>
+ </simpleType>
+ </attribute> + </complexType> + + <complexType name="config"> + <sequence> + <element name="source" type="ns:source" maxOccurs="unbounded" minOccurs="0"/>
+ </sequence>
+ </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/Cached_Alerts.xml b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/Cached_Alerts.xml new file mode 100644 index 0000000000..03901c804c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/Cached_Alerts.xml @@ -0,0 +1,214 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<alerts xmlns="http://tuscany.apache.org/samples/alerter" xmlns:tns="http://tuscany.apache.org/samples/alerter" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><alert sourceid="1" unread="false" id="alert_0"><title>Polymer Vision's Readius rollable display gets face time</title><summary>Filed under: Cellphones, DisplaysTalk about a long time coming, as what is now Polymer Vision has seemed to finally put all the pieces together and produce an actual working product from the idea envisioned by Philips around two years ago. We knew the spinoff was looking to commercialize the product later this year, but after nearly 24 months of coming up empty, a bit of understandable skepticism begins to seep through. Nevertheless, the firm's rollable, pocket-friendly "Cellular-Book" was out and showing its stuff at 3GSM, proving that there's at least something there to put on store shelves. Although the unit on display was indeed a standalone device -- sporting 16 shades of grey, USB, "10-days" of battery life, 4GB of internal storage, and GPRS, EDGE, and DVB-H connectivity just like we'd heard -- Polymer Vision is actually hoping to integrate its e-paper technology into mobile handset displays in the near future. Sadly, there still didn't seem to be any hints of a release date for the nifty pocket reader, but be sure to click on through for the very long awaited pictures of the Readius in action.[Via Slashdot]Continue reading Polymer Vision's Readius rollable display gets face time Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92945682/</address><date>2007-02-19T15:54:00</date></alert><alert sourceid="1" unread="false" id="alert_1"><title>Sirius and XM set to merge?</title><summary>Filed under: Portable Audio +Well, we can't exactly say that we didn't see this one coming, but for the deal to actually get inked would indeed be something special. According to the New York Post, Sirius and XM are all set to announce a merger deal after hammering out details all weekend long. Of course, it was noted that the somewhat shaky agreement "could fall apart at any time," and interestingly enough, both companies purportedly spent the majority of their (and their lawyers) time ironing out the good stuff while leaving "regulatory concerns" on the back burner. Unfortunately, those very issues could be insurmountable hurdles, as the typically stubborn FCC certainly has played hard ball with each company before, and having one overriding satellite provider with no competition in sight is ripe for monopoly arguments. Regardless, you won't find us complaining about a little Howard just a few channels down from Oprah, or a dash of MLB just a dozen notches from the NFL, but considering that gaining that oh-so-critical regulatory approval "could take up to 15 months," we wouldn't count on your lineup changing anytime soon no matter what. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92940034/</address><date>2007-02-19T15:24:00</date></alert><alert sourceid="1" unread="false" id="alert_2"><title>Sony's Cybershot DSC-W80: their latest 7.2 megapixel camera?</title><summary>Filed under: Digital Cameras +Out of the gates early for PMA (Photo Marketing Association) 2007, we've got rumors of the latest Sony Cybershot, the DSC-W80. The cam's already made its appearance on a few German and Dutch web sites and certainly makes sense as the successor to the 7.2 megapixel W70 launched at last year's show. However, instead of 8 megapixels like you might expect, we're still talking that same 7.2-megapixel, 1/2.5-inch CCD (which won't help improve the high rates of noise above ISO 200 any), 3x optical zoom, and 2.5-inch LCD. Other than a new ISO 3200 sensitivity and slightly larger chassis -- up from 89 x 57 x 23-mm to 91 x 58 x 23-mm -- there isn't anything new on the surface to report. No one's sayin' but perhaps they've added some optical image stabilization to bring these in-line with most other compact shooters in this range. We've also got rumors of a new Cybershot DSC-W60 and Cybershot DSC-W90 -- both unannounced and both said to work with a new SPK-SA underwater case (pictured after the break). The W80 is expected to hit in April for around 280/$368. As to the rest... well, the PMA show starts March 8th so we'll know soon enough. [Via Let's Go Digital, thanks David]Continue reading Sony's Cybershot DSC-W80: their latest 7.2 megapixel camera? Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92929558/</address><date>2007-02-19T14:42:00</date></alert><alert sourceid="1" unread="false" id="alert_3"><title>Gresso's Symphonia MP3 players for the nouveau riche</title><summary>Filed under: Portable AudioHow do you make a splash in the already saturated MP3 player market? Well, there's always limited-edition pink, or how 'bout a $4,000+ luxury player which touts "craftsmanship" (not sound quality or user experience) as its primary forte? Naturally, we're talking about Gresso, the Russian outfit already infamous for their luxury cellphones. Their new Symphonia audio players all measure in at 39 x 39 x 10.5-mm making them just a touch bigger than the iRiver S7 and iPod shuffle. Each features a RAZR-esque laser-etched keypad, built-in FM tuner, and 1GB of flash memory for your MP3, WMA, ASF and OGG files. In fact, the four models only differ in materials which range from ancient hardwoods to 18 carat gold. Expected in Q2 with too-beaucoup pricing in the area of $4,000 to $6,000. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92922919/</address><date>2007-02-19T14:22:00</date></alert><alert sourceid="1" unread="false" id="alert_4"><title>Earth Trek's USB Tape Dispenser</title><summary>Filed under: Misc. Gadgets, Peripherals +Ours is not to question why, only to accept the inevitable convergence of USB and pretty much everything else within the vicinity of our PCs. Meet the newly announced 4-port USB 2.0 hub and tape dispenser from Hong Kong's Earth Trek. It comes in large and small versions and can naturally be affixed with your very own logo for some good ol' corporate schwag. Sorry, these devices are not USB powered -- but if you're the type who finds it overly taxing to dispense tape, then maybe you should be looking into a bionic suit. "Coming soon" in several color options for an undisclosed price. + +[Via Akihabara News] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92922925/</address><date>2007-02-19T14:02:00</date></alert><alert sourceid="1" unread="false" id="alert_5"><title>The do-it-yourself SSD adapter</title><summary>Filed under: Storage + If you can't afford the real deal, then prepare to get your jank on with this, the not-so-poor-man's solid state disk. The SDB25SD from GeekStuff4U can host up to 4x SD (not SDHC) cards for a maximum capacity of 8GB. Just slip the four cards into the 2.5-inch sled which then slots-in to any available IDE connector where -- presumably -- the total capacity is presented as a single disk volume... who knows? So how much would you pay for something like this: $50, $40, or maybe $20? Try $258.50 and you have to provide the SD flash. Word to the wise: SSD prices are dropping fast -- you'll pay about the same price for a full 16GB SSD card if you can hold on until June or so.[Via Akihabara News] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92910485/</address><date>2007-02-19T13:32:00</date></alert><alert sourceid="1" unread="true" id="alert_6"><title>Sharp's EM ONE: a dual-sliding Pocket PC with HSDPA and WiFi</title><summary>Filed under: Handhelds, Wireless +Check it W-Zero3, Sharp just one-upped your azz with their new EM ONE handheld. This Windows Mobile 5.0 Pocket PC device brings 3.6Mbps HSDPA and 802.11b/g data to the game along with hot dual-sliding action under that 4.1-inch touch-screen display. Unlike Samsung's F520 dual-slider which combines a QWERTY and numeric keypad for making calls, Sharp's slab is a data-only device so they combine the QWERTY with a side-sliding navigation pad for scooting around the 800 x 480 pixel display. However, Sharp's EM ONE comes heavy on the chub at 140x70x18.9-mm compared to the F520's 105x54x17.4-mm or even Nokia's N800 which is about the same length and width but much thinner at 145x75x12.7-mm. The whole kit comes powered by a Marvell 520MHz PXA270 processor and nVidia GoForce 5500 graphics along with 512MB/128MB flash/SDRAM memory and miniSD expansion. The display boasts a rather anemic 65k color palette (albeit, the same as the N800) for viewing integrated 1-Seg mobile TV and WMV videos with WMA and MP3 audio playback supported by a pair of built-in stereo speakers. Rounding out the specs are Bluetooth 1.2, a 1.3 megapixel CMOS camera, stylus, and a 4-hour battery. On sale in Japan starting March 31st for 95,000 (about $797) without contract or 39,800 ($332) with 2-year commitment.Gallery: Sharp's EM ONE: a dual-sliding PocketPC with HSDPA and WiFi[Via Impress] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92903979/</address><date>2007-02-19T13:02:00</date></alert><alert sourceid="0" unread="false" id="alert_7"><title>Leaders condemn India train blast</title><summary>India and Pakistan say a train bombing that killed at least 66 people will not disrupt their peace process.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6375749.stm</address><date>2007-02-19T13:27:07</date></alert><alert sourceid="0" unread="true" id="alert_8"><title>At least 30 die in Iraq attacks</title><summary>A number of attacks in Iraq leave at least 30 dead, despite a security operation across the country.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6374909.stm</address><date>2007-02-19T16:20:31</date></alert><alert sourceid="0" unread="true" id="alert_9"><title>Priest jailed for exorcism death</title><summary>A Romanian priest who caused the death of a nun during an exorcism ritual is jailed for 14 years.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6376211.stm</address><date>2007-02-19T16:29:36</date></alert><alert sourceid="0" unread="true" id="alert_10"><title>Czech-Polish OK for US missiles</title><summary>Czech and Polish leaders back a US plan to install missile defence facilities on their territory.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6376137.stm</address><date>2007-02-19T15:02:36</date></alert><alert sourceid="0" unread="false" id="alert_11"><title>Mexico holds mine tragedy vigil</title><summary>Mexico marks the anniversary of a blast that killed 65 miners, most of whose bodies have not been found.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6376267.stm</address><date>2007-02-19T15:47:12</date></alert><alert sourceid="0" unread="true" id="alert_12"><title>'Anti-terror force' for Somalia</title><summary>Somalia's government sets up a joint police and military unit to counter attacks by suspected Islamists.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6375699.stm</address><date>2007-02-19T12:33:12</date></alert><alert sourceid="0" unread="true" id="alert_13"><title>Row threatens Nigerian alliance</title><summary>Two top Nigerian presidential candidates swap insults, casting doubt on the alliance between their two parties.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6376521.stm</address><date>2007-02-19T15:53:07</date></alert><alert sourceid="0" unread="true" id="alert_14"><title>Colombian foreign minister quits</title><summary>Colombia's foreign minister resigns after the arrest of her brother on suspicion of links with paramilitary groups.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6376359.stm</address><date>2007-02-19T15:40:03</date></alert><alert sourceid="0" unread="true" id="alert_15"><title>Wrangling hits Airbus restructure</title><summary>Airbus shelves a key decision on a major overhaul of the business, amid strife between its European partners.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/business/6375517.stm</address><date>2007-02-19T13:04:02</date></alert><alert sourceid="0" unread="true" id="alert_16"><title>Nepal king 'takes responsibility'</title><summary>Nepal's King Gyanendra publicly accepts responsibility for "success and failure" under his period of direct rule.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6375207.stm</address><date>2007-02-19T14:11:40</date></alert><alert sourceid="0" unread="true" id="alert_17"><title>More than 20 die in Iraq attacks</title><summary>A number of attacks in Iraq leave more than 20 dead, despite a security operation across the country.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6374909.stm</address><date>2007-02-19T17:05:24</date></alert><alert sourceid="1" unread="true" id="alert_18"><title>Sling's upcoming SlingLink Turbo leaked?</title><summary>Filed under: Home Entertainment, Networking +When you're slinging media across the home, there's no such thing as "too much bandwidth," and it looks like Sling Media is beefing up its SlingLink line of home wiring network products with the SlingLink Turbo. The new device ups the bandwidth from 14Mbps to 85Mbps, and while the original SlingLinks were primarily designed for a single Slingbox connection, the Turbo vision should be able to handle more general purpose home media networking tasks. The SlingLink Turbo was spotted by a SlingCommunity member on Amazon.com, with an expected ship date of February 27th 2007 for $149. The device is interoperable with existing PowerLine adapters, and has four Ethernet ports beyond the PowerLine link. As far as rumors go, this one looks pretty legit, but with a February 27th date on the books, we should know exactly how legit before too terribly long.[Thanks TieGuy] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93021486/</address><date>2007-02-19T20:55:00</date></alert><alert sourceid="1" unread="true" id="alert_19"><title>It's official: XM and Sirius plan to tie the knot</title><summary> + It's been more than two years since we first reported that XM and Sirius were in talks to merge, and although the New York Post may have jumped the gun a bit way back then, it was certainly on the money today, as the two satellite radio pioneers have just issued a joint press release stating their intention to become life partners. In the proposed $13 billion deal -- which they'd like to go down by the end of the year but which still must pass rather daunting regulatory scrutiny and opposition from such heavyweights as the National Association of Broadcasters -- investors would get 4.6 shares of Sirius stock for each share of XM, with current Sirius CEO Mel Karmazin and XM Chairman Gary Parsons retaining those roles, respectively, in the combined entity (whose name has yet to be decided). As you might imagine, the companies are already trying to spin this as a big win for everyone from Martha Stewart on down, arguing that consumers will end up benefiting from more programming choices and better hardware, manufacturers and retailers will see increased sales, and of course shareholders would gain value through the economies of scale and elimination of redundancies realized from a merger. The new pals also took an opportunity to sneak in a mention about the growing number of choices consumers have for receiving audio content, from old school AM/FM to internet radio to the the still-nascent technologies of cellphone streaming and HD radio, clearly hoping to sway public opinion on that whole anti-trust thing. Still, keep in mind that the FCC is gonna be taking a long, hard look at this one -- in fact, current regulations would need to be changed in order for the merger to gain approval -- so don't get your celebratin' started just yet. Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93011139/</address><date>2007-02-19T20:30:00</date></alert><alert sourceid="1" unread="true" id="alert_20"><title>Details emerge on Sony's DSC-W90, W200 digital cameras</title><summary>Filed under: Digital CamerasThe big PMA 07 trade show is still weeks away, but we seem to be already getting a pretty good idea of what Sony will be showing off, first with word of its 7.2 megapixel DSC-W80 getting out earlier today, and now with details on two additional models appearing on SonyCenter.lu's discussion forums before not-so-mysteriously disappearing. Thankfully, good 'ol Google Cache has preserved all the relevant information so you won't have to wait until March to satisfy your curiosity. Apart from the difference in megapixels, with 12 on the W200 and 8 on the W90, the two cameras appear to be virtually identical, each boasting a 3x optical zoom, 2.5-inch LCD, Carl Zeiss Vario-Tessar optics, Sony's trademark SteadyShot and Face Recognition features, ISO settings up to 3200 and, perhaps most notable, HDMI outputs. Unfortunately, there's no pics of either camera, although they'll apparently be similar in design to the W55 (pictured here), only with a "finer," "more beautiful" case. There's also no word on price or availability, although that should be revealed at the official PMA launch next month.[Thanks, Rashid] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93004352/</address><date>2007-02-19T19:48:00</date></alert><alert sourceid="1" unread="true" id="alert_21"><title>What tech would the Presidents rock in 2007?</title><summary>Filed under: Features, Misc. Gadgets + Sure, Washington had his dentures, Lincoln his ironclads and Jefferson his swivel chair, but what kind of kit would they be messing around with in 2007? In search of answers based on broad and most likely mis-guided and / or offensive stereotypes, we bring you the following list. Feel free to rip it to shreds in the comments, just make sure to keep it patriotic -- Big Brother is watching. Happy Presidents Day!#vistachart { border: 2px solid #333; border-collapse: collapse; } #vistachart td { padding: 3px; border: 1px solid #ccc; vertical-align: top; margin: 0; line-height: 1.3em; } #vistachart th { font-weight: bold; text-align: left; padding: 4px; background: #eee; } #vistachart th.mainth { border-bottom: 1px solid #333; font-size: 1.2em; } #vistachart td.red { background-color: #f08c85; } #vistachart td.green { background-color: #b3e2c4; + + + + Washington(rebel)Lincoln(uniter)Jefferson(hipster)Roosevelt(fearless) + + + OS + Linux (last night's build) + Mac OS X (with Vista in Parallels and Linux via Boot Camp) + Mac OS X + Vista (x64) + + + Computer + OQO (has an OLPC XO at home) + MBP + MacBook + Toughbook + + + Media player + Make Daisy + Sansa + iPod + Zune + + + HD format + HD DVD + LG BH100 hybrid player + Blu-ray + DivX + BitTorrent, dude + + + Carrier + T-Mobile + AT T + T-Mobile + VoIP over neighborFi + + + Console + Gamepark GP2X, SNES + Wii, Xbox 360, PS3 + Wii + PS3 + + + Vehicle + Homebrew biodiesel + Prius + Tesla Roadster + Segway + + + Phone + OpenMoko + 8525 + Sidekick 3 + Greenphone + + + Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92998051/</address><date>2007-02-19T19:21:00</date></alert><alert sourceid="1" unread="true" id="alert_22"><title>Solar Technology's Freeloader saps power from USB, the Sun</title><summary>Filed under: Misc. Gadgets, Peripherals +While it won't do your laptop any good, this new Freeloader gig from Solar Technology should be able to provide juice to just about every other gadget in your repertoire. The device contains its own li-ion rechargeable battery, which it can fill up from your laptop or desktop's power via USB, or using its 120mA crystalline solar cells. From there you've got a master cable and eleven adaptors to get the electricity into your phone, camera, PDA, GPS, gaming handheld or DAP. Solar Technology seems to have most of the big brands covered, and claims it can fuel an iPod for 18 hours, a mobile phone for 44 hours, PSP for 2.5 hours and a PDA for 22 hours -- not too shabby for the 6.5 ounce unit. Sure, we've seen plenty of similar chargers before, but the combination of device compatibility and relatively low price ( 30, about $59 US) makes this a decent option for those sun-drenched road warriors out there. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92990699/</address><date>2007-02-19T18:54:00</date></alert><alert sourceid="1" unread="true" id="alert_23"><title>Sony's 1/1.8-inch high-speed CMOS sensor outputs 60fps</title><summary>Filed under: Digital CamerasThankfully, it looks like Sony has come through yet again, and while it wasn't exactly in the timeliest of manners, the high-speed CMOS sensor that it promised would deliver 60fps of video output is finally upon us. The 1/1.8-inch IMX017CQE sensor boasts 6.4-megapixels of resolution and the uncanny ability to "output this resolution at 60 frames per second (a data rate of around 384 megapixels per second)." In layman's terms, this chip has the ability to capture full motion video and grab high-quality stills without dropping a single frame, giving users a seamless transition between the two. Additionally, the 1/1.8-inch size and its ability to deliver 300 frames per second at lower resolutions moves it a bit further from the pack, not to mention the 12-bit A/D converter for each column. No word just yet on when these video-centric chips will hit Sony's CyberShot lineup, but it's an awful lot closer to reality than the last time we caught wind of it. [Warning: PDF read link][Via DPReview] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92983675/</address><date>2007-02-19T18:24:00</date></alert><alert sourceid="1" unread="true" id="alert_24"><title>Is "3X DVD" HD DVD's secret weapon against Blu-ray?</title><summary>Filed under: HDTV While the Blu-ray camp is busy claiming victory, recently HD DVD supporters seem to be circling the wagons around an old friend, the -- 'til now -- unused 3X DVD technology. HD DVD has always claimed it holds a price advantage over Blu-ray, by way of offering low cost upgrades for existing DVD manufacturing processes. The 3X DVD spec takes that a step further, while it's a part of the HD DVD format and apparently only compatible with HD DVD players, the discs themselves are physically exactly the same as standard red-laser DVDs. Throw in a software upgrade to support high definition content, HD DVD's UDF 2.5 file structure and AACS and you have a way to deliver HDTV content on a 9.4 GB DVD. By using newer encoding technologies like MPEG-4 and VC-1 and/or lowering the resolution to say, 720p, full length movies easily fit on a standard DVD. Eclipse Data Technologies, a supplier of HD DVD mastering equipment just announced it is offering free upgrades to its customers in order to support 3X DVD manufacturing. This was followed today by DCA Inc. announcing it has mastered the first 3X DVD disc, and that several manufacturers are looking at it as a possible low cost path into HD video. 3X DVD's potential to allow for noticeably lower-priced HD content to come to market is definitely there, but it still remains to be seen if this, like combo DVD/HD DVDs and Total Hi-Def discs will find a home and support in the marketplace. Read - First 3X DVD-ROM Disc Cut with DCA Equipment Read - Eclipse Provides Free HD DVD Upgrade to Replication Facilities Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/92975896/</address><date>2007-02-19T17:54:00</date></alert><alert sourceid="0" unread="true" id="alert_25"><title>Leaders condemn India train blast</title><summary>India and Pakistan say a train bombing that killed at least 66 people will not disrupt their peace process.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6375749.stm</address><date>2007-02-19T18:39:31</date></alert><alert sourceid="0" unread="true" id="alert_26"><title>Iran, Russia in nuclear plant row</title><summary>Tehran denies Russian claims it is late on payments for work on a nuclear reactor in southern Iran.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6375477.stm</address><date>2007-02-19T18:33:05</date></alert><alert sourceid="0" unread="true" id="alert_27"><title>Colombian foreign minister quits</title><summary>Colombia's foreign minister resigns after the arrest of her brother on suspicion of links with paramilitary groups.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6376359.stm</address><date>2007-02-19T18:39:55</date></alert><alert sourceid="0" unread="true" id="alert_28"><title>Five US troops die in Iraq raids</title><summary>Five US soldiers die in two attacks in Iraq on a day violence claims more than 25 lives across the country.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6374909.stm</address><date>2007-02-19T20:24:32</date></alert><alert sourceid="0" unread="true" id="alert_29"><title>Iran hangs man for attack on bus</title><summary>Iran executes a man over a bomb attack which killed 11 members of its elite Revolutionary Guards last week.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6377101.stm</address><date>2007-02-19T20:15:50</date></alert><alert sourceid="0" unread="true" id="alert_30"><title>Flood aid struggle in Mozambique</title><summary>Mozambique says it has the use of only one UN helicopter to help thousands of people displaced by severe floods.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6377427.stm</address><date>2007-02-19T21:57:46</date></alert><alert sourceid="0" unread="true" id="alert_31"><title>Manhunt for train fire suspects</title><summary>Police in India issue sketches of two men they believe got off a train minutes before a deadly bomb attack.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6377471.stm</address><date>2007-02-20T07:32:59</date></alert><alert sourceid="0" unread="true" id="alert_32"><title>Miami baby sets premature record</title><summary>A baby believed to have spent the shortest time in her mother's womb is set to leave hospital in the US.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6377639.stm</address><date>2007-02-20T08:14:18</date></alert><alert sourceid="0" unread="true" id="alert_33"><title>Nato troops raid Karadzic homes</title><summary>Nato troops in Bosnia search the homes of the children of indicted war criminal Radovan Karadzic.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6377711.stm</address><date>2007-02-20T08:19:29</date></alert><alert sourceid="0" unread="true" id="alert_34"><title>Cheney ready for US-Japan talks</title><summary>US Vice-President Dick Cheney arrives in Tokyo to discuss regional security issues and Iraq.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6377649.stm</address><date>2007-02-20T08:25:12</date></alert><alert sourceid="1" unread="true" id="alert_35"><title>LG's 17-inch W1PRO EXPRESS DUAL laptop packs DVB-T, Vista</title><summary>Filed under: LaptopsIf you've been eying a Vista-equipped laptop to treat yourself after all that chocolate you dutifully resisted last week, you might as well get a TV tuner built right in. LG Electronics' latest 17-inch behemoth packs a silver / black enclosure, integrated DVB-T tuner, and your choice of Intel Core 2 Duo processors to boot. Under the hood you'll find a WSXGA+ display, support for 5.1 Dolby Digital audio, dual 1.2-watt stereo speakers, ATI's Mobility Radeon X1600 graphics set, Bluetooth 2.0, WiFi, and of course, Windows Vista Home Premium pre-installed. While the W1PRO EXPRESS DUAL isn't exactly the lightest machine out there, it weighs in at a respectable 6.8-pounds and shouldn't make a half bad media-centric portable, but considering the nearly $2,600 pricetag LG has slapped on it, bargain hunters needn't look here long.[Via Gizmag] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93370051/</address><date>2007-02-20T15:38:00</date></alert><alert sourceid="1" unread="true" id="alert_36"><title>GlobalTop intros GPS HUD Speed Meter</title><summary>Filed under: GPS, TransportationIt's practically a foregone conclusion that eying your handy GPS unit a bit too much whilst cruising down the freeway can indeed put you and your fellow motorists in peril, and while robotic turn-by-turn voiceovers do quell the staring fits somewhat, we still tend to rely a tad too much on sheer visuals. GlobalTop is hoping to make the roads a safer place to navigate with its forthcoming GPS HUD Speed Meter, which will supposedly makes its debut at CeBIT. This Bluetooth-enabled device purportedly "displays your speed and other navigational info, like direction, onto your car's windshield," and also enables handsfree communications with your BT-equipped cellphone. Moreover, the speed meter can be setup to alert the driver when exceeding a user-set limit, and while you may not be familiar with the brand, it's reportedly a spinoff of f-tech, which bodes fairly well for us actually seeing this thing beyond the Photoshop stage. As expected, there's no pricing or availability deets surfacing just yet, but all that should change come next month.[Via NaviGadget] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93355876/</address><date>2007-02-20T15:08:00</date></alert><alert sourceid="1" unread="true" id="alert_37"><title>Cylo's 3style jog wheel / mouse spins it up</title><summary>Filed under: PeripheralsWhile we've seen more than a few folks get a little mod-happy when it comes to crafting their own mousing devices, Cylo Technology is offering up an apparently well thought-out device that should have audio / video editors going wild. If you feel more comfortable spinning a jog wheel than you ever have manually moving a cursor, the "three-dimensional" 3style mouse is right down your alley, as the hybrid input peripheral handles the typical X and Y axes as well as giving users the ability to scroll in any direction with a simple spin. Utilizing a ball bearing pad, the knob can spin freely with just a nudge, and can interpret Z-axis data as well as offering up right-click functionality by squeezing the edges. While some may envision faint similarities to the iMac's hockey puck mouse of days past, this rendition could probably last a bit more than 30 seconds before becoming destined for the trash bin. Nevertheless, the 3style mouse can be used wirelessly as well as in a wired form, and can purportedly work seamlessly with any application that supports a scroll wheel or jog dial, but we'll have to wait until this thing actually hits store shelves before testing out these bold claims ourselves. Click on through for a live demonstration.[Via HackedGadgets]Continue reading Cylo's 3style jog wheel / mouse spins it up Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93350237/</address><date>2007-02-20T14:42:00</date></alert><alert sourceid="1" unread="true" id="alert_38"><title>Segway's RMP platform for nerdy robots</title><summary>Filed under: Robots, TransportationWhat do you do when your overly hyped Human Transporter skids off the plateau of human interest only to be pummeled by archaic transportation laws? Why, start building mobility solutions for robots, of course. We've already seen a few lazy robots riding Segways around the lab; soon enough, we'll be seeing a lot more what with the Segway RMP (Robotic Mobility Platform) now launched in Japan. The RMP is meant to provide a quick and easy transportation underpinning for new domestic and military robots. RMPs range in price from 6,037,500 to 1,376,550 ($50,000 to about $11,500) and vary by maximum load, speed, size, max angle of climb, and battery capacity. Let the robot crusades begin! Via Robot Watch] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93336617/</address><date>2007-02-20T14:12:00</date></alert><alert sourceid="1" unread="true" id="alert_39"><title>Century's Dolphin waterproof MP3 player</title><summary>Filed under: Cellphones, Portable Audio + Wrap an MP3 player in a silicon tube held secure with cable-ties and what do you get? Well, if you're Japan's Century then you've got yourselves a waterproof MP3 player dubbed the Dolphin. Ok, the player does carry an IPX7 Ingress protection rating which means it really is waterproof (not just splash-proof) up to a depth of about 1 meter -- ideal for laps around the Coral Key Park Marine Preserve. Inside, the Dolphin packs 1GB of flash, USB 2.0, and support for MP3/WMA playback off 8-hour battery. Looks aside, at 12,800 (about $107) -- which includes a pair of unusually decent looking waterproof headphones -- it'll save you a healthy chunk-o-change compared to the $250 waterproof iPod shuffle we showed you last week. [Via Impress] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93336618/</address><date>2007-02-20T13:52:00</date></alert><alert sourceid="1" unread="true" id="alert_40"><title>Sharp's AQUOS R-series of LCDs announced</title><summary>Filed under: Displays, HDTV +Step aside AQOUS D-Series of LCDs, Sharp just unveiled their new flagship R-series of LCD panels for Japan. The new line-up ranges in size from 42- to 65-inches with each packing a 120Hz ASV LCD panel, 3x 1080p HDMI inputs, 1x DVI for that quick all-digital hook-up to your PC, and 2x Firewire for connecting your DV camera and one of Sharp's line-up of hi-def recorders including their new BD-HP1 Blu-ray recorder for on-the-quick dubbing. Just for kicks, Sharp also added their favorite new pet technology, IrSS (AKA, IrSimple) high-speed infrared for throwing up images from like-equipped cellphones and digital cameras. Of course, they also feature dual, integrated analog and digital tuners and 10/100Mbps Ethernet to access Japan's acTVila TV Internet service. The big, bad 65-inch LC-65RX1W (pictured above) mama of the bunch features a 450cd/m2 brightness, 3000:1 contrast ratio, 176-degree angle of visibility, while tipping the scales at 66kg (146-pounds) at just 9.6~12.4-cm (3.78~4.88-inches) thin. It's available March 10th in Japan for 1,000,000 or about $8,361. Expect the rest to hit no later than April with the 57-inch LC-57RX1W demanding 900,000 ($7,524), the 52-inch LC-52RX1W 650,000 ($5,434), the 46-inch LC-46RX1W 550,000 ($4,598), and the 42-inch LC-42RX1W 500,000 ($4,180). [Via Impress] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93330298/</address><date>2007-02-20T13:22:00</date></alert><alert sourceid="1" unread="true" id="alert_41"><title>Sharp's BD-MPC70 Blu-ray theater in a box</title><summary>Filed under: HDTV, Home Entertainment +We already caught their 2.1 channel home theater back at the CEDIA show in September. This time however, Sharp gets official with their new 7.1 Blu-ray in a box home theater kit. The BD-MPC70 pumps 175W across a full 7.1 channels of 8-ohm phallus with playback support for single-layer BD-R/RE media in addition to DVD video, DVD R/RW, DVD-RAM, music CDs, and CD-RW/-R discs. It delivers a 12bit/148.5MHz video DAC and 24bit/192kHz audio DAC with a healthy smattering of the ol' in and outs including 2x digital and 2x analog audio inputs and 1080p video output over HDMI. Available June 25th in Japan for 1,050,000 or about $8,779 whenever these come Stateside. [Via Impress] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93314228/</address><date>2007-02-20T12:42:00</date></alert><alert sourceid="1" unread="true" id="alert_42"><title>Engadget Exclusive: Sony's 2007 Cybershot lineup</title><summary>Filed under: Digital Cameras + That's right, we've got 'em -- catalog shots for Sony's 2007 Cybershot line-up of digital cameras. Go ahead, check the new T20HDPR, T100, T20, H9, H7, G1 (pictured), W200, and W90 Cybershots -- you won't be sorry. All the new cams bring Sony's Super SteadyShot image stabilization and HD output to the show in addition to a hot mix of features spread out across the line; these include such notables as 802.11b/g WiFi with DLNA support, 2GB on-board memory for music playback, a 3-inch tilt-screen LCD, 3.5-inch (yes, 3.5-inch!) LCD, a couple of 15x optical zooms, face-detection technology, and BIONZ image processing -- good to know. Judging by the pics, we can expect a formal, pre-PMA show announcement from Sony on 27 February. Check the gallery below for all the details.Gallery: Engadget Exclusive: Sony's 2007 Cybershot lineup[Thanks, anonymous tipster] Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93308137/</address><date>2007-02-20T12:07:00</date></alert><alert sourceid="1" unread="true" id="alert_43"><title>Woman plummets onto subway tracks while carelessly texting</title><summary>Filed under: Cellphones Granted, texting just might be bigger than Hollywood these days, but bigger than concern for one's own life? Apparently a Kawanishi woman was taking her well-being for granted during her daily route to work, as she collided with a man in a subway station whilst texting away at 8:30 in the morning. Subsequently, she plummeted a few feet down onto the subway tracks, only to be saved by a station worker who fearlessly hopped down to rescue her SMS-focused mind (and body, too) as the oncoming train screeched to a halt just 20 meters before running her over. Thankfully, the dame suffered just minor injuries in the fall, but an estimated 4,500 employees were blaming her for holding up their progress when clocking in late. Notably, there was no word on whether or not the phone was saved, or more importantly, whether or not the presumably urgent SMS ever got sent -- but considering this is the second case in a matter of days in which a human being nearly lost their life to a cellphone, we beg you: text responsibly, dear friends.[Via TokyoMango] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93274207/</address><date>2007-02-20T10:27:00</date></alert><alert sourceid="0" unread="true" id="alert_44"><title>Iran defiant on nuclear programme</title><summary>Iran's president rejects calls to suspend uranium enrichment, a day before a UN deadline runs out.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6378289.stm</address><date>2007-02-20T15:33:54</date></alert><alert sourceid="0" unread="true" id="alert_45"><title>Tobacco firm wins payout appeal</title><summary>The US supreme court throws out a ruling that Philip Morris must pay $79.5m to the widow of a dead smoker.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/business/6379767.stm</address><date>2007-02-20T15:48:25</date></alert><alert sourceid="0" unread="true" id="alert_46"><title>New footage of JFK's last moments</title><summary>A previously unreleased film of John F Kennedy's motorcade shows new details of the final moments before his killing.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6378463.stm</address><date>2007-02-20T11:04:18</date></alert><alert sourceid="0" unread="true" id="alert_47"><title>Heavy shelling in Somali capital</title><summary>At least 12 people are killed in the heaviest fighting in the Somali capital Mogadishu this year.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6377941.stm</address><date>2007-02-20T13:22:09</date></alert><alert sourceid="0" unread="true" id="alert_48"><title>Pakistan FM visits bomb survivors</title><summary>Pakistan's foreign minister, in India for peace talks, visits survivors of an attack on a cross-border train.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6379119.stm</address><date>2007-02-20T14:41:38</date></alert><alert sourceid="0" unread="true" id="alert_49"><title>EU reaches emissions cuts deal</title><summary>EU environment ministers agree in principle to cut emissions by 20% by 2020, and seek a global 30% cut.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6377983.stm</address><date>2007-02-20T13:45:47</date></alert><alert sourceid="0" unread="true" id="alert_50"><title>Most premature baby going home</title><summary>A baby believed to have spent the shortest time in her mother's womb is set to leave hospital in the US.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6377639.stm</address><date>2007-02-20T09:48:15</date></alert><alert sourceid="0" unread="true" id="alert_51"><title>Experts tackle the devil's tumour</title><summary>Scientists meet to discuss ways of saving the Tasmanian devil, which is being ravaged by an unusual cancer.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6378279.stm</address><date>2007-02-20T11:40:00</date></alert><alert sourceid="0" unread="true" id="alert_52"><title>Nato troops raid Karadzic homes</title><summary>Nato troops in Bosnia search the homes of the children of indicted war criminal Radovan Karadzic.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6377711.stm</address><date>2007-02-20T12:53:35</date></alert><alert sourceid="0" unread="true" id="alert_53"><title>Nigerian VP 'cannot be removed'</title><summary>A court rules President Olusegun Obasanjo cannot sack his deputy for joining an opposition party.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6378625.stm</address><date>2007-02-20T11:50:56</date></alert><alert sourceid="0" unread="true" id="alert_54"><title>Kenya's 'most wanted' shot dead</title><summary>Police kill a man believed to be behind a string of murders and armed robberies in Nairobi.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6378315.stm</address><date>2007-02-20T11:09:37</date></alert><alert sourceid="0" unread="true" id="alert_55"><title>Salvador politicians found dead</title><summary>The bodies of three politicians from El Salvador and their driver are found in a bullet-riddled car in Guatemala.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6378645.stm</address><date>2007-02-20T11:48:56</date></alert><alert sourceid="0" unread="true" id="alert_56"><title>Philippines approves terror bill</title><summary>The Philippine Congress passes a controversial anti-terror bill aimed at tackling militants in the south.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6374875.stm</address><date>2007-02-20T11:21:43</date></alert><alert sourceid="0" unread="true" id="alert_57"><title>Australia pulls plug on old bulbs</title><summary>Australia plans to ditch traditional incandescent filament light bulbs in favour of a greener alternative.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6378161.stm</address><date>2007-02-20T10:56:33</date></alert><alert sourceid="0" unread="true" id="alert_58"><title>Royal seeks to revive French bid</title><summary>France's Socialist candidate Segolene Royal tries to revive her presidential bid in a televised appearance.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6377503.stm</address><date>2007-02-20T13:02:05</date></alert><alert sourceid="0" unread="true" id="alert_59"><title>Rape claim splits Iraq government</title><summary>Allegations Iraqi police raped a Sunni woman threaten to eclipse the government's new security drive in Baghdad.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6378821.stm</address><date>2007-02-20T13:09:02</date></alert><alert sourceid="0" unread="true" id="alert_60"><title>US 'Iran attack plans' revealed</title><summary>US contingency plans for possible air strikes on Iran include most of its military infrastructure, the BBC learns.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6376639.stm</address><date>2007-02-20T10:28:34</date></alert><alert sourceid="0" unread="true" id="alert_61"><title>Gunman kills Pakistani minister</title><summary>A Pakistani provincial government minister is shot dead as she prepares to address a political meeting.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6379169.stm</address><date>2007-02-20T14:30:35</date></alert><alert sourceid="0" unread="true" id="alert_62"><title>Bird flu outbreak in Pakistan zoo</title><summary>An outbreak of the deadly H5N1 strain of bird flu kills four peacocks and a goose in an Islamabad zoo.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6378045.stm</address><date>2007-02-20T09:34:56</date></alert><alert sourceid="1" unread="true" id="alert_63"><title>Canon EOS 40D rumors abound</title><summary>Filed under: Digital CamerasIt all started with an EOS 40D splash page posted (and later pulled) from Canon's official Hong Kong web site. Now the 40D's specs are popping on digicam retail sites all over the Intertubes. Most interesting is the supposed spec sheet posted, pulled, and then extracted from a Belgian site by our tireless Engadget interns; here's what it says: 10.1 megapixel CMOS sensor measuring 22.5 x 15-mm, 5fps burst mode, integrated anti-dust cleaning system, 2.5-inch LCD, and sadly... DIGIC II (not III) image processing. It's that last bit of information which makes us a bit skeptical. Although the DIGIC II can be found in their full-frame 400D, the improved DIGIC III is already loosed thereby bringing the whole spec sheet into question. No worries, if Canon is ready to push the 40D out the door then it'll be soon. The big PMA show kicks off in just a few weeks. Now quit staring at that picture, it's not the 40D.[Via Digital Photography Blog] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93789980/</address><date>2007-02-21T13:17:00</date></alert><alert sourceid="1" unread="true" id="alert_64"><title>Blackberry 8800 now on Cingular</title><summary>Filed under: CellphonesStraighten your ties and button your suit jackets, RIM's promiscuous debutante -- the Blackberry 8800 -- is up and dancin' on on Cingular's website. $500 list, or $300 after $50 mail-in rebate and 2-year contract, the 8800 brings everything we expected: quad-band EDGE, GPS, microSD expansion, Bluetooth 2.0, push-to-talk support, and 5-hours talk / 24-days standby in a 0.55-inch device weighing just 4.73-ounces. 3G data? No. WiFi? Not this time. For that we'll have to hold tight for the anticipated mid-year launch of the 8820. [Thanks, President and everyone who sent this in] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93789982/</address><date>2007-02-21T12:47:00</date></alert><alert sourceid="1" unread="true" id="alert_65"><title>Ubixon's Lubix Bluetooth stereo headsets: the magnets make the magic</title><summary>Filed under: Portable Audio +Here's an interesting twist to the Bluetooth headset from Ubixon -- the UBHS-LC1-3D and UBHS-NC1-3D. These Lubix headsets consist of two, magnetically held halves which can be separated and bunged into the ears or slung around the neck, connected for easy toting. They both simulated 3D sound and Bluetooth 2.0 with support for the A2DP, AVRCP, HSP, and HFP profiles. In other words, they support stereo Bluetooth audio while allowing you to control your like-profiled audio device from up to 10-meters away. They'll even work seamlessly (as seamless as Bluetooth gets anyway) with your cellphone although the LC1 does it a bit better (and bulkier) by flashing the caller's ID on that one-line LCD screen. The 28-gram LC1 delivers 10 hours of talk or 9 hours of music while the NC1 goes 6-hours or 5-hours in a lighter, 22-gram package. The LC1 hits Korea for 79,000KRW ($84) while the NC1 slips in at about 59,000KRW ($63). [Via AVING] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93781795/</address><date>2007-02-21T11:47:00</date></alert><alert sourceid="1" unread="true" id="alert_66"><title>Cellphone-packing smoke detector dials for danger</title><summary>Filed under: Cellphones, Misc. GadgetsWhile most smoke detectors will handle the basic job of detecting smoke just fine (providing you check that batt regularly), there's plenty of options out there for those wanting a little something extra, be it added style or additional functionality. Joining those other over-achieving smoke detectors is this new unit from Japanese manufacturer Keisoku Giken, which will automatically phone you at the first whiff of smoke to inform you of its impending demise. Unfortunately, you'll have to supply your own cellphone and service for it (it doesn't appear to support landlines), which makes the device's already hefty 16,800 yen price tag (about $140) even less of a bargain.[Via Textually.org] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93743515/</address><date>2007-02-21T09:24:00</date></alert><alert sourceid="1" unread="true" id="alert_67"><title>TDK's Xa-10 mini flat panel speakers</title><summary>Filed under: Peripherals, Portable Audio +TDK just slipped NXT's crazy-thin SoundVu technology into your pocket. That's right, the 80 117 x 16-mm (3.15 x 4.6 x 0.63-inch) Xa-10 flat panel speaker brings a 1.2W x 2ch waft of breathy bass you might otherwise choose not to float from your trou. The speakers will accept USB power (or batteries) and a mini-stereo input when they hit Japan in March for just 2,980 or about $25. [Via Impress] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93727030/</address><date>2007-02-21T08:02:00</date></alert><alert sourceid="1" unread="true" id="alert_68"><title>Lexar intros 300x UDMA CompactFlash cards, readers</title><summary>Filed under: Digital Cameras, StorageLexar has already given its SDHC cards a boost this year, and the company doesn't seem to be wasting any time bringing its CompactFlash offerings up to speed as well, today introducing a series of new 300x UDMA CompactFlash cards, as well as a pair of card readers to go along with 'em. Available in 2, 4, and 8GB varities, the cards are said to be 125% faster than the company's current CompactFlash cards, delivering a sustained write time of 45MB per second. To hit that top speed, however, you'll need to use them with a UDMA-enabled device, which are currently a rare breed, although Lexar says it expects "several" UDMA-enabled digital cameras to be announced later this year. In addition those mystery cameras, you'll also be able to get the most out of the cards using one of the two UDMA card readers Lexar's set to release this spring, available in your choice of FireWire or USB 2.0 models for $80 and $50 respectively. The cards themselves should also be released about the same time, although Lexar doesn't seem willing to spill the details on how much they're gonna cost just yet.Read - Photography Blog, Lexar Professional UDMA 300x Memory CardsRead - Photography Blog, Lexar UDMA Card Readers Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93699645/</address><date>2007-02-21T06:31:00</date></alert><alert sourceid="1" unread="true" id="alert_69"><title>Fon wants you to help steal business from Starbucks and T-Mobile</title><summary>Filed under: Wireless, Networking +Oh tricky, sneaky Fon. Fresh off their 10,000 Fonero giveaway, they're stepping up the ante with how they give away their loss-leader routers. Their newest campaign is sure to strike a chord with armchair entrepreneurs and Adbusters fans alike: if you live within the immediate vicinity of a Starbucks (read: WiFi range), Fon would like to send you one of their Foneros. Why? Because, if you recall, when you allow users to connect with your internet connection over your Fonero, Fon splits the profit with you -- $1 for every user (who pays $2 to use your connection). So for every $10 T-Mobile / Starbucks WiFi user you swipe, Fon gives you a buck; now, granted this still isn't a scheme for those paranoid about home network security, bandwidth usage, or nefarious hax0rs type with a spoofed MAC and a keen eye for easy hotspot access, but who knows, for those near Starbucks (yes, they'll be checking against known locations) it might even be worth it to buy a budget DSL line just to profit with Fon. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93662859/</address><date>2007-02-21T05:01:00</date></alert><alert sourceid="1" unread="true" id="alert_70"><title>Vonage to become Vonage Wireless?</title><summary>Filed under: Cellphones, WirelessVoIP provider Vonage has already cut a deal with EarthLink to resell WiFi, presumably to go along with some sort of WiFi phone service, but could they have something way crazier (and more costly) on tap? BusinessWeek speculates that Vonage might be getting into the cellular game by launching an MVNO (Mobile Virtual Network Operator). It's not hard to imagine them offering something similar to T-Mobile's HotSpot @Home service, which lets you use a WiFi-enabled cellphone to make VoIP calls over WiFi and and then seamlessly switch over to cellular networks whenever you're outside WiFi range. The problem is that launching an MVNO is no small undertaking. ESPN shuttered MobileESPN last year after failing to attract more than a handful of subscribers, and Amp'd and Helio have spent hundreds of millions of dollars to carve out a slice of what is an incredibly competitive wireless market (Apple was working on an MVNO to accompany the launch of the iPhone, but scrapped the whole thing once it became obvious how difficult it would be to gain marketshare). Could they do it? Maybe, but not without spending a TON of money, which is why it's more likely that they'll introduce a more modest Voice over WiFi service.[Via GigaOm] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93658206/</address><date>2007-02-21T04:25:00</date></alert><alert sourceid="1" unread="true" id="alert_71"><title>Desktop Digital Photo Cube shows photos on diminutive LCD</title><summary>Filed under: Displays, Misc. Gadgets +Here's one from the same folks who brought you the USB Sound Flash Drive, and while eNECESSITIES' Desktop Digital Photo Cube may not adorn your wall as fashionably as a digiframe might, this piece is made for conversation. Ready to perch atop your living room table or office desk, the cube sports a squint-inducing 1- x 1-inch color LCD display, power / brightness / skip buttons, USB 2.0 connectivity, and the ability to internally store "up to 30 digital photos" for cycling through on the built-in screen. Additionally, the "mood light" should set the tone for the upcoming photo, and those looking for the ultimate party favor can toss their own logo on here for an additional charge. Unfortunately, we're not quite sure just how this snapshot showin' block gets its juice, but those looking to snag 25 or more (sorry, non-bulk customers) can find out for themselves at $51.34 a pop.[Via Everything USB] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93640955/</address><date>2007-02-21T03:42:00</date></alert><alert sourceid="1" unread="true" id="alert_72"><title>IEEE pushing 802.16m WiMAX to 1Gbps, hopes to converge with 4G</title><summary>Filed under: Cellphones, WirelessIf there's one thing that we'll never be satisfied with, it's finding out just how many nanoseconds we can shave off our download times from year to year, and thankfully, the IEEE seems to get that. While it has certainly taken its sweet time with 802.11n, the task force has already voted to make 100G the next Ethernet speed, and now it's pushing to make WiMAX implementations even quicker. Reportedly announced at 3GSM, the IEEE has began working on a new version of the 802.16 standard, dubbed 802.16m, which "could push data transfer speeds up to 1Gbps while maintaining backwards compatibility with existing WiMAX radios." Potentially more interesting than cheering for speed boosts is the group's outright assurance that this protocol will meet the ITU's requirements for 4G, insinuating that it should be the token choice for further 4G developments. Nevertheless, the increased bandwidth is supposedly needed due to convergence between VoIP and various forms of multimedia (IPTV, streaming video, digital downloads, etc.), and however true that may be, some skeptics are still understandably doubting the whole "backwards compatibility" aspect. Still, the IEEE hopes to have this together by "the end of 2009," but considering the team's less-than-stellar track record in the deadline department, we're not holding our collective breath.[Via DailyWireless] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93621068/</address><date>2007-02-21T02:42:00</date></alert><alert sourceid="1" unread="true" id="alert_73"><title>GPS-enabled wind chimes sound off while geo-tracking</title><summary>Filed under: GPS +If you think the Dandellas were outlandish uses of GPS technology, here's one that comes mighty close to one-upping even those. The GPS-enabled wind chimes have DIY written all over them, and while the chimes themselves where purchased (after a failed attempt at creating his own, notably), basically everything else that makes the system tick was homegrown. Utilizing Mologogo, servos, circuit boards, and a good bit of coding, the GPS chimes emit their music whenever the tracked individual's cellphone moves in a user-selected path, essentially acting as an alert that someone's headed to their domicile. Of course, the actual options here are a tad limited (albeit very intriguing), but the foundation of the project could indeed be used for a much broader geo-tracking scenario. Regardless, we know there are folks out there eager to give this a whirl, and thankfully for you, everything you need to know (including the oh-so-critical code) is just a Read link away.[Via MAKE] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93596281/</address><date>2007-02-21T01:42:00</date></alert><alert sourceid="1" unread="true" id="alert_74"><title>Sigma finally cops to a release date for its SD14 DSLR</title><summary>Filed under: Digital Cameras +Well it'll have been over six months between the time we first heard about it and when it actually hits store shelves, but we finally have a solid release date for the somewhat-anticipated, Foveon-packing Sigma SD14 DSLR. If it's possible for you to remember back that far, you may recall that Sigma attempted to drum up some interest in this 14 megapixel shooter with a teaser campaign in late August of last year, just before it was officially announced at Photokina 2006. The disappointment came a few months later when Sigma pushed back the SD14's street launch to March, citing some hardware issue that the company wouldn't disclose. And according to a press release on Sigma's website, the problem has indeed been addressed, with the camera scheduled to ship starting on the 6th of next month. Keep in mind, though, that this model isn't for the thrifty -- it's gonna cost you over $2,000 to get in on this action. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93572592/</address><date>2007-02-21T00:42:00</date></alert><alert sourceid="1" unread="true" id="alert_75"><title>Quantum strikes again, charging iPhone touchscreen infringement</title><summary>Filed under: Cellphones, DisplaysIt's not just Apple's ubiquitous click-wheel that Quantum Research is bothering Apple about these days, Quantum is also fussing about the iPhone's touchscreen technology. "We will be looking very carefully at the iPhone," says Duncan Bryan, licensing director at QR. And wouldn't you know: "The description of the iPhone suggests it uses a rear-surface touch screen, and has proximity sensing which can tell if it is held to the ear. That's a QR capability." No formal lawsuit has been filed yet, but based on Apple's complete denial and counterclaims of QR's December 2005 click-wheel allegations, we're guessing it won't be backing down on this one anytime soon. Apparently this "charge transfer capacitive sensing" stuff has been licensed to Motorola and was invented by QR's founder and CEO Hal Philipp. Usually we'd be content to sit back and watch, but all these Apple-related lawsuits and copycats are getting a little tried -- remember those good old fashioned RIM / NTP days?[Via AppleInsider] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93553936/</address><date>2007-02-20T23:42:00</date></alert><alert sourceid="1" unread="true" id="alert_76"><title>Motion Computing unveils RFID-reading C5 medical tablet PC</title><summary>Filed under: Tablet PCs, WirelessAlthough we sincerely hope your only encounter with a clinical assistant tablet PC comes by way of your occupation, it looks like Motion Computing is busting out a medically-focused device to help the dear LPNs keep things in order for the high-falutin' doctors. The C5 touts a vertically centered design, top-mounted carry handle, handwriting recognition, built-in digital camera for documenting wounds, time-stamp / voice-tag capabilities, and even an optional RFID reader to easily check patients in by scanning their wrist straps. Claiming to be the world's first device in the new mobile clinical assistant (MCA) category of PCs, it packs a 1.2GHz Intel Core Solo U1400 processor, Windows Vista Business or Windows XP Tablet PC Edition, a 10.4-inch XGA touchscreen, up to 1.5GB of DDR2 RAM, 30 / 60GB 1.8-inch hard drive options, 802.11a/b/g, Bluetooth, and a rechargeable Li-ion to boot. Furthermore, it weighs in at just 3.1-pounds, so toting this bad boy around the office shouldn't be too much of a burden, and the "durable, semi-sealed enclosure" shouldn't have any issues handling the daily mishaps of your average doctor's lounge. So if you've been looking for a way to digitize your office and get far, far away from those paper-filled drawers, we're sure your IT rep will be hitting you up soon to sneak a peek at this $2,199 tablet.[Via GottaBeMobile] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93548878/</address><date>2007-02-20T23:08:00</date></alert><alert sourceid="1" unread="true" id="alert_77"><title>Prober P360 GPS / PMP handheld does it all</title><summary>Filed under: GPS +These fanciful all-in-one devices just don't seem to come Europe or North America's way very often, and unfortunately for most, Prober's P360 doesn't seem to be breaking that mold anytime soon. Packing a respectable mix of multimedia and GPS capabilities, this pocket-friendly device packs a 3.5-inch touchscreen display, 400MHz Samsung S3C2440A processor, 64MB of NAND Flash ROM, 64MB of SDRAM, WinCE 4.2 runnin' the show, a SiRF Star III chipset, and a built-in speaker to boot. Furthermore, you'll find a dual-mode map for wrapping your brain around POI locations, voice guidance, a rechargeable five-hour Li-ion battery, SD card slot, USB 1.1, wired remote / headphones, audio out, and the ability to play back WMV, WMA, and WAV files on the AV front, while handling a bevy of snapshot formats and even boasting a text viewer. Unfortunately, we've no idea how much the P360 will run folks who are lucky enough to acquire it in four to six weeks, but just know that most of the world will probably envy you.[Via NaviGadget] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93531504/</address><date>2007-02-20T22:38:00</date></alert><alert sourceid="1" unread="true" id="alert_78"><title>Shredz64 project bringing Guitar Hero to the Commodore 64</title><summary>Filed under: Gaming We've already seen the Guitar Hero controller hooked up to a PC, but hardware hacker Toni has decided up the difficultly level even further, endeavoring to wire the ubiquitous plastic axe to his Commodore 64, complete with an all new "Guitar Hero-like" C64 game. While he's still quite a ways from fully realizing that goal, as the pic above and audio clip on the page linked below show, he is making considerable progress, with all of the guitar's buttons working, although the whammy bar, sadly, remains silent. Unfortunately, it's also been over a month since the last update on the project, so we can only hope that he hasn't given up on it -- there's undoubtedly countless C64s just waiting to be dusted off as soon as the DIY guide is ready.[Thanks, Joseph S] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93511887/</address><date>2007-02-20T22:08:00</date></alert><alert sourceid="1" unread="true" id="alert_79"><title>Thrustmaster unveils bevy of Wiimote accessories</title><summary>Filed under: Gaming +If you can't penetrate the market early, you might as well arrive fashionably late with a tempting pricetag, right?. Apparently, Thrustmaster's trying to do just that with its latest barrage of Wiimote accessories, as the firm's charging (and non-charging) docking stations arrive a few months after JoyTech and Nyko's renditions, and the Wiimote sleeves are almost an afterthought at this point. Nevertheless, the T-Charge NW comes in black or white finishes, charges two AA cells via USB (four included), sports a blue status LED, and of course, neatly holds your dear Wiimote / nunchuck combo. The T-Care NW removes the charging functionality, but still manages to include a set of silicone protector sleeves for one Wiimote / nunchuck tandem, and if you're already set in the dock department, the controller covers are available all by their lonesome as well. Thrustmaster's lineup seems to hit all the main areas of concern, including price, as a set of sleeves will run you $9.99 while the T-Care NW and T-Charge NW demand $14.99 and $24.99, respectively. So if you're intrigued about these budget-friendly offerings and just adore high-resolution shots, head on over to Joystiq for a gallery of photos while you wait for these to land in April.[Via Joystiq] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93508830/</address><date>2007-02-20T21:38:00</date></alert><alert sourceid="1" unread="true" id="alert_80"><title>Sony Cybershot G1 digital camera detailed</title><summary>Filed under: Digital CamerasThat batch of new Sony Cybershots let loose this morning was quite a bit to digest all at once, so we thought we'd take a minute to go over one of the more interesting of the still-to-be-officially-announced cameras in greater detail, namely, the Cybershot G1. Apart from that new (for Sony) model name, the camera's particularly notable for its big 3.5-inch (or possibly 3-inch) LCD and uncommonly spacious 2GB of internal memory. Though less unusual, the camera's other specs are also nothing to sneeze at, with a decent 6 megapixel resolution, 3x optical zoom, Carl Zeiss Vario-Tesar lens, built-in WiFi, and Sony's usual SteadyShot and Anti-Blur features. Still not clear, unfortunately, is the price, although as we mentioned earlier, that should be revealed by the end of the month. Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93489405/</address><date>2007-02-20T21:08:00</date></alert><alert sourceid="1" unread="true" id="alert_81"><title>Magellan preps Maestro 4000, 4040, and 4050 GPS units for release</title><summary>Filed under: GPS +Magellan's been known to toss out GPS units three at a time before, and while the company hasn't come forward yet about its presumably forthcoming trio of navigation devices, we've got the skinny anyway. All three Maestro units will sport a 4.3-inch WQVGA touchscreen display, SiRF Star III chipset, and an in-car mounting kit, but the similarities basically end there. On the low-end, you'll find NAVTEQ maps for the 48 contiguous United States, QuickSpell, 1.6 million POIs, and a rechargeable battery with around three hours of juice. The 4040 steps it up by adding more detailed map coverage, 4.5 million POIs, text-to-speech / Bluetooth capabilities, and by playing nice with the real-time traffic add-on service. The flagship unit boasts all the capabilities of its lesser siblings, but also adds traffic functions right out of the box as well as voice recognition software. The Maestro 4000 / 4040 are each slated to land in "early April" for $449.99 / $599.99, respectively, while the high-end 4050 will demand a somewhat steep $799.99 for its niceties when it arrives in May.Read - Magellan Maestro 4000Read - Magellan Maestro 4040Read - Magellan Maestro 4050[Via GPSGazette] Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93486827/</address><date>2007-02-20T20:38:00</date></alert><alert sourceid="1" unread="true" id="alert_82"><title>AMD's new consumer flagship proc, the X2 6000+</title><summary>Filed under: Desktops +The 90nm Athlon 64 X2 processor line looks close to its last breath with the X2 6000+, a 3GHz monstrosity designed as a consumer equivalent to the FX-74. The 6000+ is limited to single processor systems, none of those quad-core frivolities the FX-74 is known to partake in, but the chip can still suck down a maximum of 125 watts, and carries 1MB of L2 cache per core. Where the 6000+ processor really departs from its enthusiast sibling is the $464 pricetag, less than half the cost of a FX-74. The chip is a few months late -- it was slated for Q4 2006 originally -- and will be followed by an 89 watt version in the third quarter of this year, along with a slightly less beefy 5800+ edition, but then its quitsville for AMD's 90nm creations. 65nm here we come! Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93476480/</address><date>2007-02-20T20:08:00</date></alert><alert sourceid="1" unread="true" id="alert_83"><title>ACCS GRAViTONUS gives quadriplegics tongue-controlled computer interface</title><summary>Filed under: Desktops, Misc. Gadgets +While other forms of alternative computing are certainly available, yet another group of researchers are touting their own rendition as a radical new way for quadriplegics to engage in computerized learning and entertainment. Dubbed the Alternative Computer Control System (ACCS) GRAViTONUS, the proposed hands-free system would enable folks who have suffered spinal cord injuries or other forms of paralysis to dictate basic computer functions entirely with their tongue. The prototype looks to be quite non-invasive, and when worn around one's head, can enable users to mouse around and navigate within applications by way of a precise tongue-controllable interface. Interestingly, it's even stated that the device won't hinder one's ability to drink, speak, or breathe, but we assume you'd have to give the mouthpiece a good washing after every use to avoid bacterial buildup. Nevertheless, the ACCS GRAViTONUS backers are now scouting VCs who'd like to get this creation to market, so if you've been looking for something intriguing to get wrapped up in, give these blokes a ring. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93458983/</address><date>2007-02-20T19:38:00</date></alert><alert sourceid="1" unread="true" id="alert_84"><title>Hello Kitty embraces warming blankets, gets fired up via USB</title><summary>Filed under: Misc. Gadgets +If you think we were baffled after seeing Hello Kitty USB foot warmers, you probably can't imagine the speechlessness we all feel when seeing the USB-powered lap warmer. Considering that anyone who would actually toss out their hard-earned dollars on feline feet heaters would likely not have the will power to resist this mat, it's fairly to say to say that this is a must-have for hardcore fans braving the tail end of winter. No word on just how large this thing is, nor if poses any eruption capabilities like one of its siblings (clones?), but judging by the mat-to-USB-connector ratio, this kitty ought to warmly cover a litter or two at least. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93453293/</address><date>2007-02-20T19:08:00</date></alert><alert sourceid="1" unread="true" id="alert_85"><title>Graffiti Research Lab's L.A.S.E.R. Tag</title><summary>Filed under: Displays + Lessee here, we've got lasers, creative input devices, a "stick it to The Man" aesthetic and a Mooninite -- sounds like a successful night of hacking to us. Graffiti Research Lab and friends hacked together a high powered projector with some computer components and a camera to track the writings of a 60mW Green Laser on the side of a building in Rotterdam and project it as blue graffiti. The resulting art looks surprisingly good, and the perpetrators were kind enough to document the event, along with providing instructions for doing up your own version. It's hard to describe, so we recommend peeping the video after the break, or the better quality vids and pics over at the read link.[Thanks, Teferri]Continue reading Graffiti Research Lab's L.A.S.E.R. Tag Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93438390/</address><date>2007-02-20T18:42:00</date></alert><alert sourceid="1" unread="true" id="alert_86"><title>Australia to phase out incandescent bulbs by 2010</title><summary>Filed under: HouseholdWhile some US cities like Raleigh are already planning steps to cut back on energy wastes by converting to more efficient lighting systems, it looks like the entire continent of Australia could be following suit. Claiming to be the "world's first" national government to phase out incandescent light bulbs in favor of the more "fuel-efficient, compact fluorescent bulb," environment minister Malcolm Turnbull is hoping to "cut Australia's greenhouse gas emissions by four million metric tonnes a year by 2015." Citing the "climate changes" the world is facing as a "global challenge," Turnbell also urged other nations to follow suit in making a difference, but didn't exactly open up his personal wallet to stock our households with those uber-pricey bulbs. Interestingly, some environmentalists feel that the bulk of greenhouse gas emissions come from government and business-related activities, which should presumably take priority over swapping out a country's light bulbs. Still, we've got no complaints with hooking homes up with LED / fluorescent options to help Mother Earth, but shouldn't Australia (and America, too) ink its name on the Kyoto Protocol before getting all high and mighty about saving the planet? Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93432534/</address><date>2007-02-20T18:08:00</date></alert><alert sourceid="1" unread="true" id="alert_87"><title>Palm makes Treo 700wx official for Verizon</title><summary>Filed under: Cellphones, Handhelds +Palm and Verizon have made official today what we've known now for a while (as have Sprint and Alltel): 32MB of RAM in a Windows Mobile 5 device just doesn't really cut it. The Treo 700wx rights the 700w's wrongs with an extra 32MB of memory for a grand total of 64MB; otherwise, though, the device is all but identical to its older sibling, with Windows Mobile 6 sadly nowhere in sight. Get it now while it's hot at Verizon stores or online for a stiff $399 on 2-year contract after $100 rebate. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93414274/</address><date>2007-02-20T17:40:00</date></alert><alert sourceid="1" unread="true" id="alert_88"><title>Powered bumpers defend your smart car when all else fails</title><summary>Filed under: Robots, Transportation +Smart cars are all well and good until you start to think of the horrible consequences if something should go wrong. Honestly, we're willing to take that risk just for the rewards of cruising along in a robotic car "platoon": saving gas, skipping traffic and perhaps getting in a bit of Gears of War while we're at it. Luckily, more judicious minds than ours are hard at work at the problem, and just might've discovered a way to keep smart car-filled roads from becoming riddled with the bodies of overly-optimistic bloggers. Alasdair Renfrew of Manchester University, UK, along with a couple of colleagues, has devised an extendable fender that can keep you safe and humming along the freeway, even when traditional wireless communications fail. The smart cars will traditionally be communicating with each other and roadside beacons wirelessly, and if one of those elements breaks down, the cars bust out powered bumpers to feel the car in front and navigate accordingly. That way, as long as the front car of a pack keeps to the speed limit and in its lane, the group should be fine -- and your Xbox session needn't be interrupted. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93410533/</address><date>2007-02-20T17:08:00</date></alert><alert sourceid="1" unread="true" id="alert_89"><title>GoogleFi gives 360 addicts Xbox Live on the go</title><summary>Filed under: Gaming, Transportation, Wireless + Obviously, quite a few possibilities open up when your whole town is wired for WiFi, but we can't say we really pegged drive-by 360 play as one of them. Mountain View, CA residents Brandon Wirtz and Jake Ludington fixed up Brandon's Jeep with 23-inch Samsung LCD and an Xbox connected to Google WiFi via Jake's laptop. The total cost of wire-free 360 action is about $4000 if starting from scratch, but isn't that a small price to pay for the freedom to frag?[Via BBC News] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93394047/</address><date>2007-02-20T16:38:00</date></alert><alert sourceid="1" unread="true" id="alert_90"><title>Cingular's BlackBerry 8800 unboxed</title><summary>Filed under: Cellphones +He got us those original BlackBerry 8800 shots, so we're guessing these unboxing pics of the phone here were no sweat for Boy Genius. We still can't claim to be crazy about the device, which launched last week, but we're sure plenty of suits will be glad to replace their aging CrackBerries with this fancy new QWERTY version. As a side note -- could Cingular's boxes be any more boring? Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93388948/</address><date>2007-02-20T16:08:00</date></alert><alert sourceid="0" unread="true" id="alert_91"><title>Blair announces Iraq troops cut</title><summary>Tony Blair says he hopes to cut the number of UK troops in Iraq from 7,100 to 5,000 within months.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/uk_politics/6380933.stm</address><date>2007-02-21T13:15:15</date></alert><alert sourceid="0" unread="true" id="alert_92"><title>Tehran dismisses threat of force</title><summary>Iran's top nuclear negotiator dismisses threats of force against it, as the UN prepares to make a crucial report.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6380879.stm</address><date>2007-02-21T02:38:26</date></alert><alert sourceid="0" unread="true" id="alert_93"><title>Zimbabwe's police ban protests</title><summary>Zimbabwe police ban protests as Robert Mugabe marks his 83rd birthday by vowing to stay on as president.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6382405.stm</address><date>2007-02-21T11:35:20</date></alert><alert sourceid="0" unread="true" id="alert_94"><title>S Asia rivals sign nuclear pact</title><summary>India and Pakistan sign an agreement to reduce the risk of accidental nuclear conflict in the region.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6381261.stm</address><date>2007-02-21T11:54:32</date></alert><alert sourceid="0" unread="true" id="alert_95"><title>Iraq PM sacks 'rape case' critic</title><summary>Iraq's prime minister moves to put an end to disquiet about an alleged rape of a Sunni women by police.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6382119.stm</address><date>2007-02-21T13:01:17</date></alert><alert sourceid="0" unread="true" id="alert_96"><title>Maoists walk out of Nepal camp</title><summary>Hundreds of former Maoist rebels walk out of a holding camp in Nepal, complaining of poor conditions.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6382093.stm</address><date>2007-02-21T12:16:21</date></alert><alert sourceid="0" unread="true" id="alert_97"><title>Philippines army is 'in denial'</title><summary>A UN envoy says the Philippines army is in "almost total denial" about a wave of extra-judicial killings.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6381291.stm</address><date>2007-02-21T05:15:15</date></alert><alert sourceid="0" unread="true" id="alert_98"><title>Stars raise $1.3m for Obama</title><summary>Celebrities donate $1.3m to Democrat Barack Obama's presidential campaign at a lavish Beverly Hills fund-raiser.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6381375.stm</address><date>2007-02-21T07:55:03</date></alert><alert sourceid="0" unread="true" id="alert_99"><title>Britney Spears 'back into rehab'</title><summary>Pop star Britney Spears is back in rehab, days after shaving her head, US media reports say.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/entertainment/6380827.stm</address><date>2007-02-21T09:02:53</date></alert><alert sourceid="0" unread="true" id="alert_100"><title>Football: Lille 0-1 Man Utd</title><summary>Ryan Giggs' controversial late winner for Man Utd almost sparks a Champions League walk-out by Lille.</summary><address>http://news.bbc.co.uk/go/rss/-/sport1/hi/football/europe/6371329.stm</address><date>2007-02-20T21:38:44</date></alert><alert sourceid="0" unread="true" id="alert_101"><title>UN backs peace force for Somalia</title><summary>The UN Security Council approves the deployment of an African peacekeeping force to tackle unrest in Somalia.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6381189.stm</address><date>2007-02-21T08:39:08</date></alert><alert sourceid="0" unread="true" id="alert_102"><title>Big Anglo American profits jump</title><summary>Mining giant Anglo American is to return $3bn to shareholders after reporting a 46% rise in annual profits.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/business/6381739.stm</address><date>2007-02-21T09:36:52</date></alert><alert sourceid="0" unread="true" id="alert_103"><title>US probes troops' neglect claims</title><summary>The US says it is reviewing the way its wounded soldiers are cared for at hospitals, after critical media reports.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6381453.stm</address><date>2007-02-21T09:17:06</date></alert><alert sourceid="0" unread="true" id="alert_104"><title>No end to deadly Bolivian floods</title><summary>Up to 340,000 people have been affected by continuing flooding in Bolivia, which has left 35 people dead.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6380331.stm</address><date>2007-02-20T18:25:36</date></alert><alert sourceid="0" unread="true" id="alert_105"><title>Japan ups interest rates to 0.5%</title><summary>Japan's central bank shows signs of confidence in the country's economy, raising interest rates to 0.5%.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/business/6381335.stm</address><date>2007-02-21T08:07:26</date></alert><alert sourceid="0" unread="true" id="alert_106"><title>Prison demand for Poso suspects</title><summary>Indonesia prosecutors seek 20 year jail terms for three men accused of beheading Christian schoolgirls.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6381511.stm</address><date>2007-02-21T08:40:06</date></alert><alert sourceid="0" unread="true" id="alert_107"><title>Denmark to pull troops from Iraq</title><summary>Denmark will withdraw its troops from Iraq by August, Danish Prime Minister Anders Fogh Rasmussen says.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6382675.stm</address><date>2007-02-21T13:07:30</date></alert><alert sourceid="0" unread="true" id="alert_108"><title>Leaders discuss UN's Kosovo plan</title><summary>Serbian and ethnic Albanian leaders are holding final talks in Vienna on the UN plan for Kosovo's future.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6380565.stm</address><date>2007-02-21T11:48:45</date></alert><alert sourceid="0" unread="true" id="alert_109"><title>Iran 'swiftly seeks nuclear goal'</title><summary>Iran's president says he wants nuclear power as soon as possible, as critics in Iran urge him to accept UN demands.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6381477.stm</address><date>2007-02-21T12:10:51</date></alert><alert sourceid="0" unread="true" id="alert_110"><title>Militant dies in Israeli ambush</title><summary>Israeli undercover agents kill a commander of the militant Islamic Jihad group in the northern West Bank.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6381653.stm</address><date>2007-02-21T08:49:42</date></alert><alert sourceid="0" unread="true" id="alert_111"><title>India eyes Scotch takeover</title><summary>An Indian businessman is set to complete a deal to buy Scottish whisky firm Whyte and Mackay for ?550m.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/business/6381339.stm</address><date>2007-02-21T13:04:47</date></alert><alert sourceid="0" unread="true" id="alert_112"><title>India boat capsize bodies found</title><summary>Rescue workers recover bodies of 15 children and three men from a school trip boat accident in India.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6381289.stm</address><date>2007-02-21T04:57:46</date></alert><alert sourceid="0" unread="true" id="alert_113"><title>Blair announces Iraq troops cut</title><summary>Tony Blair says he hopes to cut the number of UK troops in Iraq from 7,100 to 5,000 within months.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/uk_politics/6380933.stm</address><date>2007-02-21T13:44:46</date></alert><alert sourceid="0" unread="true" id="alert_114"><title>Fear as cyclone nears Mozambique</title><summary>Mozambique is on the highest level of alert as a cyclone with winds of up to 175km/h approaches.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/africa/6383675.stm</address><date>2007-02-21T17:06:58</date></alert><alert sourceid="0" unread="true" id="alert_115"><title>Italian PM faces coalition crisis</title><summary>Italy's Romano Prodi calls a special cabinet session after his fragile coalition loses a key foreign policy vote.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/6383051.stm</address><date>2007-02-21T17:22:45</date></alert><alert sourceid="1" unread="true" id="alert_116"><title>Fujifilm's FinePix S5700</title><summary>Filed under: Digital Cameras + Another hot off the pre-PMA presses, Fujifilm's got their new FinePix S5600 followup ready to go, the S5700. It's got a 10x zoom, 7.1 megapixel sensor, 2.5-inch display, 1600 ISO setting, image stabilization, 27MB internal memory, and, you're not going to believe this, xD and SD support. Unfortunately it uses four AA cells instead of a nice Li-ion battery. No price just yet, but the black model lands (somewhere) at the end of March, with the silver following in April.Gallery: Fujifilm's FinePix S5700 Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94150403/</address><date>2007-02-22T06:14:00</date></alert><alert sourceid="1" unread="true" id="alert_117"><title>Fujifilm's FinePix A820 and A900 for consumers</title><summary>Filed under: Digital Cameras + Just like Canon's new PMA-bound A Series cameras, Fujifilm's new A820 and A900 cameras don't really break a lot of new ground, but there sure is a lot more megapixel bang-for-buck going on here. For $180 and $200, respectively, the A820 brings 8 megapixels and the A900 goes for 9, while both camera have 4x zooms and 2.5-inch LCDs. Unfortunately, there doesn't seem to be any form of optical image stabilisation here, nor any of those much-hyped Face Recognition AF/AE features we've been seeing in other PMA offerings, but if all you're looking for is pixels and lots of 'em, you can't go far wrong with this pair of FinePix, which will be hitting shelves in March. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94137650/</address><date>2007-02-22T05:46:00</date></alert><alert sourceid="1" unread="true" id="alert_118"><title>Canon's new PowerShot A570 and A560</title><summary>Filed under: Digital Cameras + Canon sure likes to yuk it up with the "A Series" puns. "A" for affordable, for the AA batteries you can stick in these things, for the "A" Team the cameras represent -- it's a real riot. Luckily, "affordable" doesn't have to mean "boring" anymore, and these two PowerShots include fancy 4x zooms, 7.1 megapixel CCDs, 2.5-inch LCDs and that DIGIC III processor for speedier operation, along with 1600 ISO and Face Detection. Sound familiar? You can have it all for a few more bucks, 1x less zoom and quite a bit more pocketability in the Digital ELPH series. What the A570 adds that the A560 and those ELPH cousins lack is optical image stabilisation. You can pick one up for $280, or if you don't mind the blur, grab an A560 for $230. Both will be out in March.Gallery: Canon's new PowerShot A570 and A560 Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94115873/</address><date>2007-02-22T04:43:00</date></alert><alert sourceid="1" unread="true" id="alert_119"><title>Canon's compact PowerShot TX1 captures 7.1 megapixel stills and HD video</title><summary>Filed under: Digital Cameras + Watch out, Sanyo, because your diminutive HD2 camcorder is about to face some very daunting competition from Canon. Like the recently announced Sanyo, the PowerShot TX1 packs a 7.1 megapixel CCD into a tiny little package capable of capturing 720p HD video as well -- but unlike the $700 HD2, Canon is hanging just a $500 pricetag on this model. Besides its one-two punch of high resolution stills and videos, this device offers a 10x optical zoom (with an optically-stabilized lens), a 115,000 pixel LCD, and ISO settings ranging from 80 to 1600. You're also getting the latest Digic image processor, advanced face detection and red eye reduction, Vista-compatibility, 14 shooting modes, and a so-called "Intelligent Orientation Sensor" to keep the display looking right no matter how you're holding the cam. No word so far on a release date, but with all this functionality at a very attractive price, you can probably expect the TX1 to fly off shelves when it finally makes its debut.Gallery: Canon's compact PowerShot TX1 captures 7.1 megapixel stills and HD video Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94113961/</address><date>2007-02-22T04:25:00</date></alert><alert sourceid="1" unread="true" id="alert_120"><title>Canon debuts SD750 and SD1000 Digital ELPH cameras</title><summary>Filed under: Digital Cameras + Two new compact and fashionable PowerShot Digital ELPHs from big C, the SD750 and SD1000. Canon seems to be mostly focused on the looks here: we've never seen a growed-up digicam manufacturer be so proud of "Dynamic Dual-Tone Elegance," but there's decent stuff under the hood. Like most of the PMA-bound cameras we've spotted, these include Face Detection-based auto focus, auto exposure and red-eye correction. There's also the DIGIC III Image processor, and ISO as high as 1600, but everybody comes for the basics: 3x zoom, 7.1 megapixel CCD and a 2.5-inch LCD in each shooter. The $300 SD750 gets a bit fancy on form factor, but manages to be a mere 0.75-inches thick, while the 4.5 ounce SD1000 keeps the the classic ELPH look and also retails for $300. Both should be out in March, and include 32MB SD cards for good luck, though no mention is made of SDHC. Remember, it's fashion first for this line.Gallery: Canon debuts SD750 and SD1000 Digital ELPH cameras Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94113962/</address><date>2007-02-22T04:23:00</date></alert><alert sourceid="1" unread="true" id="alert_121"><title>Canon's EOS-1D Mark III DSLR with live LCD</title><summary>Filed under: Digital Cameras + Canon's latest pro DSLR is officially here as of tonight: welcome the EOS-1D Mark III. This 10.1 megapixel shooter can fire 10fps in bursts of up to 110 large JPEGs or 30 RAW files with is dual DIGIC III processor. It also features a really friggin light sensitive APS-H size 28.1 x 18.7mm CMOS sensor with ISO modes up to 3200 (it's also got a "highly usable" just-in-case 6400 mode sure to kill image quality), but the real winner here is the 3-inch live LCD (with 5 and 10x magnification for locking that zoom). There's also a new WFT- E2A Wireless File Transmitter option for dumping to external storage and even GPS geotagging, the OSK-E3 Original Data Security Kit for file encryption and verification (if your images are just that valuable), the Speedlite 580EX II flash, and EF 16-35mm f/2.8L II USM lens. We don't yet have word on price or release date, but you know what they say about having to ask.Gallery: Canon's EOS-1D Mark III DSLR with live LCD Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94110286/</address><date>2007-02-22T04:16:00</date></alert><alert sourceid="1" unread="true" id="alert_122"><title>S1Digital's impressive new lineup of Media Centers</title><summary>Filed under: Home Entertainment, Media PCsMedia Centers are so in now and that you have to really do something to make your black box stand out, and S1Digital's new lineup of media centers and servers does just that. Actually there are two series, the ProLine for professional installers and home automation companies and the Home Series for the rest of us. The Home Series includes the Platinum, Gold and Mighty editions, all running Core 2 Duo processors and Vista Home Premium. The Mighty is the size of a book and includes built in WiFi and DVD burner. Up next is the Gold, which is a more traditional size and adds up to 1TB of storage, HDMI, 2 ATSC and 2 NTSC tuners (sorry no CableCARD here), 7.1 audio and Viiv. The Platinum tops the Home Series, adding a quiet design an internal scaler and optional HD DVD or Blu-ray drive. But they don't stop there and are trying to join Niveus in the high end market with the ProLine Series, which of course does everything the Home series does, but with Vista Ultimate, rack mountable, a silent design and two-way control for all your favorite home automation systems like Crestron and AMX. As impressive as this lineup is, we are once again left wonder, where are the CableCARDs?Read: S1Digital Introduces the Home Series Line of Media CentersRead: S1Digital Sets a New Reference Standard with ProLine Series Media Centers Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94110287/</address><date>2007-02-22T04:04:00</date></alert><alert sourceid="1" unread="true" id="alert_123"><title>Apple and Cisco settle! iPhone name to be used by both</title><summary>Filed under: Cellphones + + +Here's one we didn't exactly see coming (at least not like this): Apple and Cisco have settled that "silly" lawsuit, with Apple agreeing to guarantee the exploration of "interoperability in the areas of security, and consumer and enterprise communications" according to the WSJ. We don't know exactly what that means, but it doesn't sound fantastic for Jobs, who we're sure wanted to have exclusivity over the name without cutting a partnership with Cisco, and didn't want to have to pay a red cent for it. But this does sound a lot like what Cisco wanted initially from Apple, and might possibly wind up in some kind of SIP / VoIP solution that allows iPhones and iPhones to communicate. Apparently both will make use of the trademark in the market (i.e. Apple's and Cisco's iPhones will both continue to be iPhones), and all's well that ends non-litigious.[Thanks, Nick and Jay] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94075975/</address><date>2007-02-22T02:42:00</date></alert><alert sourceid="1" unread="true" id="alert_124"><title>Nintendo Wii beats up on the competition in power savings</title><summary>Filed under: Gaming, Home Entertainment +So, the graphics might just be warmed over GameCube fare, but the Wii sure does take those wimpy specs and runs with 'em. A new showdown between the big three home consoles and a mid-range PC doesn't compare games or GPUs, but rather power consumption, and the Wii wins by a landslide. The watts don't just bleed during gameplay, DVD playback seems to require immense effort from the 360 and PS3, and even the consoles in "idle" mode consume about ten times the watts of the Wii. Of course, the consoles consume a minimal amount of power in standby, which is substantially more when the Wii's Connect24 service is on, but not quite a deal breaker, just about a $1 a month of power. So if you're looking to shave a few bucks off your power bill or do your treehuggin' duty to the environment, it looks like the choice is fairly obvious -- though you'll naturally have to look elsewhere than the Wii to get your video playback kicks.[Via Joystiq] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94066659/</address><date>2007-02-22T02:09:00</date></alert><alert sourceid="1" unread="true" id="alert_125"><title>Frenzy Rumble transforming headphones: lamer it sounds</title><summary>Filed under: Misc. Gadgets, Portable Audio +You know, a Transformers movie was really its own reward, but all these transforming gadgets -- movie related and no -- are really making it all the more exciting, especially when we're talking completely superfluous fluff. Take these new Frenzy Rumble Earphones, for example. There's no reason you'd want 'em on your head, and there's no way they push out an adequate volume for desktop use when in that transformed state. A perfect blend of uselessness and inconvenience. You can get yours in July for about $37.[Thanks, Aaron D] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94046982/</address><date>2007-02-22T01:14:00</date></alert><alert sourceid="1" unread="true" id="alert_126"><title>Bill Gates clamps down on daughter's internet time</title><summary>Filed under: Desktops, Laptops, Tablet PCsSure, we've seen individuals getting their hand slapped (or worse) for browsing the internet a bit too often, but you'd assume that having a dad who envisioned the Redmond powerhouse and pays the bills by way of computing would be the perfect father figure for the computer-addicted. Apparently, that's not exactly so, as a recent Reuters report tells of Bill Gates himself clamping down on his 10-year old daughter's internet and gaming time. According to Bill, his oldest gal wasn't even into the 'net until this school year, where tablet PCs became a necessary tool, but now that she's found access to a never-ending supply of information, her habits have suddenly changed. She latched onto Viva Pi ata, purportedly playing for "two to three hours per day," after which her health started deteriorating and her chore accomplishments plummeted. Although we mention those last bits in jest, Mr. Gates slapped down a "45-minutes per day" law for non-school related computing tasks on the weekdays, and added just 15 minutes for weekends, probably garnering quite the evil eye and stirring up early thoughts of rebellion in his youngster. Seriously Bill, if you're that worried about daddy's little girl stumbling upon some form of cyber predator, there's always the parent-approved IM-Me, but throwing time restrictions on your own products is just a tad illogical, no?[Via BloggingStocks, thanks Randall] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94027868/</address><date>2007-02-22T00:19:00</date></alert><alert sourceid="1" unread="true" id="alert_127"><title>Pentax busts out Hasselbladian 31.6 megapixel 645 Digital</title><summary>Filed under: Digital Cameras + Pentax has apparently tapped Kodak to provide its 31.6 megapixel KAF-31600 medium format CCD for the upcoming 645 Digital, which would seem to be the company's highest resolution digital camera to date. So far all that's known from the pre-PMA announcement is that the 645 will sport both SD and CF slots, and will ship with a specially-built 55mm lens that's also compatible with 645-series SLR film cameras. We should find out more about this behemoth in early March -- although possibly not pricing and release info -- but one thing we can say for sure is that if it's priced anything like the Hasselblad H3D-31 whose sensor it shares, expect to pay out well into five figures.[Thanks, David N.] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94009335/</address><date>2007-02-21T23:24:00</date></alert><alert sourceid="1" unread="true" id="alert_128"><title>Pentax pops out the Optio W30 and A30</title><summary>Filed under: Digital Cameras +There's some heated competition already for our PMA eyeballs, and Pentax sure wants a slice. They don't have anything terribly outstanding on the consumer end, but these W30 and A30 Optio shooters still do pretty well for themselves. The A30 (pictured) takes a pretty traditional approach to the compact genre, boosting the megapixels to 10 and offering up 2.5-inches of LCD. There's also ISO 3200 and some fancy gyro-based shake reduction, along with face recognition auto focus and auto exposure, all in a pretty dang compact SDHC-munching body. The W30 steps it back a bit, with a 7.1 megapixel CCD and mere digital shake reduction, but the rest of the specs are there, along with a waterproof and dustproof housing that can handle being up to three meters under water for two hours. No word on price or availability for either camera, but we're sure we'll be finding out soon enough. Peep the W30 after the break.[Thanks, David N]Read - Optio A30Read - Optio W30Continue reading Pentax pops out the Optio W30 and A30 Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/94000890/</address><date>2007-02-21T23:09:00</date></alert><alert sourceid="1" unread="true" id="alert_129"><title>Xbox 360 Wireless Receiver for Windows now available</title><summary>Filed under: Desktops, Gaming, Peripherals, Wireless +It sure took its own sweet time to make it to market -- we first saw this thing at E3 in 2006 -- but the Xbox 360 Wireless Receiver for Windows is finally available for purchase. The adapter lets you use your standard wireless 360 peripherals, such as the Xbox 360 Wireless Controller and Wireless Headset, with your Windows PC. That means Windows users, which have been enjoying the fruits of a USB 360 controller since before the console launched, can finally get in on some wireless action, and it'll only cost them $20 for the privilege. It also means that much more fun for upcoming Games for Windows titles such as Shadowrun, UNO and Halo 2, along with generic game controls and VoIP functionality. Microsoft is also releasing a $60 package which includes a receiver and a wireless controller. Both items should be available at retail now. Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93985665/</address><date>2007-02-21T22:24:00</date></alert><alert sourceid="1" unread="true" id="alert_130"><title>Engadget Podcast 100 - 02.21.2007</title><summary>Engadget Podcast 100</summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93966098/</address><date>2007-02-21T21:49:00</date></alert><alert sourceid="1" unread="true" id="alert_131"><title>Switched On: What of the Wii-buked?</title><summary>Filed under: Features, Gaming +Each week Ross Rubin contributes Switched On, a column about technology, multimedia, and digital entertainment: + +Nintendo has been on an Apple-like hit parade since the disappointing market performance of the GameCube. The DS and DS Lite handily staved off highly touted competition from Sony. The PSP may have appealed to a different, if for now narrower, demographic, but units are units, and there's no escaping them when you're marketing a platform. +The launch of the Wii has been nothing but magic mushrooms from the hype around the controller to the E3 reception to late-night Wii Tennis face-offs between Conan and Serena Williams. Check out this apologetic fan comment on Amazon's product page: "Graphics might not be high definition, but it looks very close to the Xbox 360 and PS3 when not running in HD mode. And definitively better than the original Xbox and PS2." Better than the Xbox and PS2, eh? That's setting the sensor bar pretty low for a system that shipped six years after the PS2. +Yet, it's no suprise that the Wii has been highly sought. I thought it was the best consumer technology product of 2006. The Nintendo team has executed almost flawlessly, but the company has brushed aside criticisms regarding product shortages without so much as a flick from a Wiimote. Commenting earlier this month on the mayhem surrounding Sony's PlayStation 3's product launch shortages, Nintendo of America vice president of marketing and corporate affairs Perrin Kaplan noted that "we didn't have anyone in line that got shot waiting for our system. So there's one sign of the different approaches between our two companies."Continue reading Switched On: What of the Wii-buked? Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93966099/</address><date>2007-02-21T21:34:00</date></alert><alert sourceid="1" unread="true" id="alert_132"><title>Sirius' and XM's merger presentation revealed</title><summary>Filed under: Portable Audio, Portable Video + Brace yourself: corporate speak ahead. We normally aren't in for all this "cost synergies" and "roadmap" hogwash that all the suits seem to get so hot for, but when it comes to a merger of two cutthroat competitors like this, we couldn't help but take a peek. Other than the technology improvements we mentioned, there isn't much talk about consumer benefits in here, and there's absolutely no mention of creating some sort of single satellite radio provider, just the power of combined resources. Most of the talk is directed at shareholders and those "synergies" that help out the bottom line -- to the tune of an estimated $3-7 billion in savings, though a $4 billion "flex" does seem to cast a bit of doubt on those numbers. The rest of the slides deal with plans for getting regulatory approval, which basically amount to arguing the case of intense competition from radio, iPods and other emerging wireless standards (see above). That said, XM and Sirius seem quite confident of success on the regulatory end of things, and look to have put a quite a bit of thought into it. Pending approval from the feds, along with respective shareholder go-ahead, XM and Sirius plan on sealing the deal by the end of 2007.Gallery: Sirius and XM's merger presentation revealed Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93959647/</address><date>2007-02-21T21:12:00</date></alert><alert sourceid="1" unread="true" id="alert_133"><title>Art Lebedev intros Verbarius electronic clock</title><summary>Filed under: Misc. GadgetsArt Lebedev may be best known these days for its various display-ridden peripherals, and the delays and uncertainty surrounding each, but the prolific design firm's got plenty more on its plate, to which it's now added the Verbarius electronic clock. As you can see above, the clock does away with the usual time-telling tools in favor of spelling things out, in five different languages no less. What's more, it changes up its verbiage each time you ask it the time, displaying variations like "forty-five minutes past four," "fifteen minutes to five," "four forty-five", and "a quarter to five." This being Lebedev, of course, they're also taking their time to build up anticipation in the device, with the clock supposedly set to only begin shipping in November. You can get your pre-orders in now, however, with a discount price of $158.25 available to those who order before September 1st, after which it'll set you back about $180. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93944802/</address><date>2007-02-21T20:44:00</date></alert><alert sourceid="1" unread="true" id="alert_134"><title>HTC "Gene" makes FCC appearance</title><summary>Filed under: Cellphones, Handhelds +After a fairly productive 3GSM last week showing off new Windows Mobile 6 wares in the form of the Vox and the Advantage, everyone's favorite Taiwanese Windows Mobile ODM has graced us with this here "Gene" (or at least we think that's what it's called, based on its model number, GENE100) via our usual Tipster Extraordinare, the FCC. The specs aren't really enough to knock our socks off -- data tops out with quadband EDGE, the cam is a simple 2 megapixel unit, plus the usual Bluetooth 2.0, 128MB of ROM, 64MB of RAM, and QVGA display atop a 201MHz TI OMAP850 -- but at this point, we're still happy to get whatever new Professional hardware we can get. Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93941965/</address><date>2007-02-21T20:24:00</date></alert><alert sourceid="1" unread="true" id="alert_135"><title>Helio's Pantech PN-810 QWERTY device pops up in FCC</title><summary>Filed under: Cellphones, Handhelds +And here it is, Helio's coup de gr ce. The QWERTY handset we'd heard Helio was cookin' up with Korea's Pantech actually hit the FCC some time ago, but the shots we were able to glean from the test apparatus documentation were teasers at best. Thanks to the wonders of expired confientiality agreements, that same FCC documentation now yields a bounty of goodness, including a user's manual and a full array of pictures. The so-called PN-810 gives the illusion of a dual slider, but actually employs two distinct layers to provide two completely different keypads depending on the slide direction: QWERTY in one, numeric in the other. Key features (other than the unusual form factor, of course) include a 2.1 megapixel cam, Bluetooth, and the full array of goodies that comes with Helio membership. A release date remains uncertain, but the PN-810's been chilling with the feds for some time now, so we wouldn't be terribly surprised to see it hit in the near term.Gallery: Helio's Pantech PN-810 QWERTY device pops up in FCC Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93938442/</address><date>2007-02-21T20:05:00</date></alert><alert sourceid="1" unread="true" id="alert_136"><title>ATI's R600 graphics chip hits snag</title><summary>Filed under: Desktops, GamingWe've had our eye on ATI"s new top-end R600 graphics chip for some time now, first getting a look at some impressive early benchmarks and then being taken aback by the foot-long graphics card the chips will call home (at least in some configurations). Sadly, it seems that those with money and power (as in 270W) to spare will have to wait a bit longer to slot one of the behemoths into their own PCs, with The Inquirer reporting that the R600 chips, and consequently the graphics cards based on 'em, have been delayed yet again, now pushed back to sometime in the second quarter of this year. There doesn't seem to be any word on the reason for the delay, but the news apparently came straight from ATI parent company AMD. Given what the cards are likely to cost, however, we're guessing that at least some won't be too disappointed in the delay, with the extra time allowing you to save up some more money and make some more excuses for why you're spending so much on a graphics card.[Via TG Daily] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93920986/</address><date>2007-02-21T19:32:00</date></alert><alert sourceid="1" unread="true" id="alert_137"><title>Russians congregate over internet, drink via USB shot glasses</title><summary>Filed under: Misc. Gadgets + Considering that we've all some of us have been enjoying online chats, poker, and dating for quite some while, it's not too shocking to see the Russians utilize the power of the web to bring alcoholics and social drinkers together in inebriated harmony. Sergey Mikheev, head of e-generator, has devised a USB shot glass to allow lonely, alcohol-needing individuals to get their drink on while safely at home. While we don't consider ourselves experts in Russian culture, it's apparently not tactful to get plastered solo, and while online drinking might be stretching the rules just a bit, we're sure those vodka-lovin' internet dwellers aren't complaining. The idea is to join a group of drinkers in an online lounge, where the USB shot glass levels are shown on each person's screen; once the go-ahead is given, the folks turn up their glasses and chug it down, ideally showing an empty glass after a random smashing of keys somehow spells out congratulatory phrases. As interesting and novel as this may be, let it remind us all how "getting a life" should be taken oh-so-seriously.[Via ChipChick] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93918114/</address><date>2007-02-21T19:02:00</date></alert><alert sourceid="1" unread="true" id="alert_138"><title>Samsung's 19-inch SyncMaster 940UX LCD picks USB</title><summary>Filed under: Displays +After DisplayLink hit us up with a cordless monitor care of Wireless USB, things really can't get much simpler for connecting LCDs with PC towers, but for those not quite ready to jump into all that, Samsung is reportedly readying a USB-only monitor that'll be showcased at CeBIT. Yep, according to reports, the 19-inch SyncMaster 940UX will be axing the DVI and VGA inputs in favor of a USB 2.0 connector, which means you can finally do away with those flakey USB to VGA adapters of days past. Slated for a May release, the display should sync up with Windows XP initially, with Vista drivers (no OS X love?) to follow shortly thereafter. No other details regarding contrast ratio, resolution, or whether a 0.25-page installation manual will be included is currently available, and more importantly, we're not so sure how your CPU is going to feel about its newfangled processing duties when you plug this sucka in. Still, Samsung claims between "three and five" of these monitors can be plugged in and used at any given time based on the amount of processing requirements your applications have, but the real question is how quickly can ATI / NVIDIA can crank out a next-generation GPU with USB 2.0 outputs, eh?[Via Slashgear] Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93898699/</address><date>2007-02-21T18:32:00</date></alert><alert sourceid="1" unread="true" id="alert_139"><title>Latest BlackBerry OS confirms 8820 with WiFi</title><summary>Filed under: Cellphones, Handhelds, Wireless + A feature notoriously missing from RIM's range, WiFi is one add-on we can pretty much all agree would make the average BlackBerry user's life noticeably better. We'd heard rumblings ahead of the 8800's release that Canada's newest handset would sport some manner of 802.11 out of the box, but alas -- the release came and went with no 2.4GHz (or 5GHz, for that matter) goodness in sight, allegedly due to technical glitches on RIM's side that the company was unwilling to delay the initial model for. No worries, though -- well, maybe a few worries if you're AT T and you're trying to push the 8800 out the door -- the WiFi-enabled 8820 looks pretty official now thanks to a cameo in RIM's latest BlackBerry OS offering. Other changes should be minimal from its predecessor; a camera still isn't in the cards, leaving shutterbugs who like their BlackBerry served QWERTY style up the same creek they are now. No word on a release, but rumblings have the device launching mid-year. Read | Permalink | Email this | CommentsBOLD MOVES: THE FUTURE OF FORD A new documentary series. Be part of the transformation as it happens in real-timeOffice Depot Featured Gadget: Xbox 360 Platinum System Packs the power to bring games to life! + </summary><address>http://feeds.engadget.com/~r/weblogsinc/engadget/~3/93882167/</address><date>2007-02-21T18:02:00</date></alert><alert sourceid="0" unread="true" id="alert_140"><title>Italian crisis talks as PM quits</title><summary>Italian President Giorgio Napolitano is to begin crisis talks after the resignation of PM Romano Prodi.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/europe/6384953.stm</address><date>2007-02-22T07:09:56</date></alert><alert sourceid="0" unread="true" id="alert_141"><title>Iraq leader welcomes troops' exit</title><summary>The Iraqi president welcomes Tony Blair's plans to cut UK troops in Iraq from 7,100 to 5,000 within months.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/uk_politics/6384685.stm</address><date>2007-02-22T01:06:14</date></alert><alert sourceid="0" unread="true" id="alert_142"><title>Apple and Cisco share iPhone</title><summary>Apple and Cisco Systems agree to share the iPhone trademark, allowing both firms to use the name.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/business/6384875.stm</address><date>2007-02-22T04:52:01</date></alert><alert sourceid="0" unread="true" id="alert_143"><title>Indonesia ferry fire kills six</title><summary>At least seven people - two of them children - die as fire breaks out on a ferry sailing from Indonesia's capital.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6384859.stm</address><date>2007-02-22T07:29:35</date></alert><alert sourceid="0" unread="true" id="alert_144"><title>Clinton and Obama row erupts</title><summary>A row erupts between two leading contenders for the US Democratic Party's presidential nomination.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6384821.stm</address><date>2007-02-22T02:02:19</date></alert><alert sourceid="0" unread="true" id="alert_145"><title>Menchu to stand in Guatemala</title><summary>Indigenous activist and Nobel winner Rigoberta Menchu says she will run for president in Guatemala.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6384845.stm</address><date>2007-02-22T03:33:05</date></alert><alert sourceid="0" unread="true" id="alert_146"><title>Most-premature baby goes home</title><summary>The world's most-premature baby leaves a Miami hospital, four months after weighing in at just 280 grams.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6384621.stm</address><date>2007-02-21T22:33:54</date></alert><alert sourceid="0" unread="true" id="alert_147"><title>US wants tougher Iran sanctions</title><summary>Washington says it will now push for tougher sanctions against Iran over its nuclear activities.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6384725.stm</address><date>2007-02-21T23:43:08</date></alert><alert sourceid="0" unread="true" id="alert_148"><title>US soldier admits murdering girl</title><summary>A second US soldier admits to the gang rape and murder of a 14-year-old Iraqi girl and her family.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6384781.stm</address><date>2007-02-22T01:40:53</date></alert><alert sourceid="0" unread="true" id="alert_149"><title>Football: Barca 1-2 L'pool</title><summary>Craig Bellamy and John Arne Riise both score as Liverpool beat holders Barcelona in the first leg of their Champions League tie.</summary><address>http://news.bbc.co.uk/go/rss/-/sport1/hi/football/europe/6371395.stm</address><date>2007-02-21T21:37:03</date></alert><alert sourceid="0" unread="true" id="alert_150"><title>Football: Porto 1-1 Chelsea</title><summary>Andriy Shevchenko's goal earns Chelsea a draw, but the Blues lose John Terry to an ankle injury in Porto.</summary><address>http://news.bbc.co.uk/go/rss/-/sport1/hi/football/europe/6371399.stm</address><date>2007-02-21T21:36:15</date></alert><alert sourceid="0" unread="true" id="alert_151"><title>Crisis talks over Bolivian floods</title><summary>The Bolivian government is holding emergency talks over the severe flooding in much of the country.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/americas/6384267.stm</address><date>2007-02-21T20:54:40</date></alert><alert sourceid="0" unread="true" id="alert_152"><title>Spears 'leaves rehab after a day'</title><summary>Pop star Britney Spears has left a rehab centre after just one day for the second time, according to US reports.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/entertainment/6384081.stm</address><date>2007-02-21T18:31:01</date></alert><alert sourceid="0" unread="true" id="alert_153"><title>Australia may lift Afghan force</title><summary>Australia studies sending 450 more troops to Afghanistan, as US Vice-President Dick Cheney prepares to visit.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/asia-pacific/6384965.stm</address><date>2007-02-22T06:43:29</date></alert><alert sourceid="0" unread="true" id="alert_154"><title>Blair announces Iraq troops cut</title><summary>Tony Blair says he hopes to cut the number of UK troops in Iraq from 7,100 to 5,000 within months.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/uk_politics/6380933.stm</address><date>2007-02-21T18:15:55</date></alert><alert sourceid="0" unread="true" id="alert_155"><title>India ban on Iran nuclear exports</title><summary>Indian officials say exports to Iran that could be used in the country's nuclear programme have been banned.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6384919.stm</address><date>2007-02-22T05:52:36</date></alert><alert sourceid="0" unread="true" id="alert_156"><title>Quartet warning to Palestinians</title><summary>The Quartet of Mid-East peace negotiators says the new Palestinian government must recognise Israel.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/middle_east/6384189.stm</address><date>2007-02-21T20:30:30</date></alert><alert sourceid="0" unread="true" id="alert_157"><title>Three 'detained' over train blast</title><summary>Police in India say they are holding three people after Sunday's bomb attack on a train to Pakistan.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6384867.stm</address><date>2007-02-22T05:20:31</date></alert><alert sourceid="0" unread="true" id="alert_158"><title>India state airlines set to merge</title><summary>Air India and Indian, India's two main state-owned airlines, are to merge to compete with private rivals.</summary><address>http://news.bbc.co.uk/go/rss/-/1/hi/world/south_asia/6384881.stm</address><date>2007-02-22T05:11:16</date></alert></alerts> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/index.html b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/index.html new file mode 100644 index 0000000000..2ecd0434b6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/index.html @@ -0,0 +1,280 @@ +<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<HTML>
+<HEAD>
+ <TITLE>Apache Tuscany Alert Aggregator Sample</TITLE>
+ <link REL="stylesheet" TYPE="text/css" href="style.css">
+</HEAD>
+
+<BODY ONLOAD="getSources()">
+<script type="text/javascript">
+function getXMLHTTP()
+{
+ var xmlHttp;
+ try
+ {
+ // Firefox, Opera 8.0+, Safari
+ xmlHttp=new XMLHttpRequest();
+ }
+ catch (e)
+ {
+ // Internet Explorer
+ try
+ {
+ xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
+ }
+ catch (e)
+ {
+ try
+ {
+ xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
+ }
+ catch (e)
+ {
+ alert("Your browser does not support AJAX!");
+ return false;
+ }
+ }
+ }
+ return xmlHttp;
+}
+
+var callIsRunning = false;
+
+function getAlerts()
+{
+ var xmlHttp = getXMLHTTP();
+ xmlHttp.onreadystatechange=function()
+ {
+ var refr = document.getElementById("refresh");
+ if(xmlHttp.readyState<4)
+ {
+ callIsRunning = true;
+ refr.innerHTML="<SPAN>Updating...</SPAN>";
+ }
+ if(xmlHttp.readyState==4)
+ {
+ callIsRunning = false;
+ refr.innerHTML="<SPAN CLASS=\"clickable link\" ONCLICK=\"getAlerts()\">Refresh</SPAN>";
+ document.getElementById("alertTable").innerHTML=xmlHttp.responseText;
+ }
+ }
+
+ if(!callIsRunning)
+ {
+ xmlHttp.open("GET","AlertDisplay.php/getAlertsHTMLTable",true);
+ xmlHttp.send(null);
+ }
+
+ // Call this function again after x minutes
+ setTimeout("getAlerts();", 5*60000);
+}
+
+function displayAlert(url, alertid)
+{
+ if(alertid=="")
+ {
+ document.getElementById("alertData").innerHTML="<IFRAME CLASS=\"alert_data\" SRC=\""+url+"\"/>";
+ window.location="#data";
+ return;
+ }
+
+ document.getElementById(alertid).className="read_title";
+
+ var xmlHttp = getXMLHTTP()
+ xmlHttp.onreadystatechange=function()
+ {
+ if(xmlHttp.readyState==4)
+ {
+ if(xmlHttp.responseText=="")
+ {
+ document.getElementById("alertData").innerHTML="<IFRAME CLASS=\"alert_data\" SRC=\""+url+"\"/>";
+ }
+ else
+ {
+ document.getElementById("alertData").innerHTML=xmlHttp.responseText;
+ }
+ window.location="#data";
+ }
+ }
+
+ xmlHttp.open("GET","AlertDisplay.php/readAlert?alertID="+alertid,true);
+ xmlHttp.send(null);
+}
+
+function getSources()
+{
+ var xmlHttp = getXMLHTTP()
+ xmlHttp.onreadystatechange=function()
+ {
+ var refreshSources = document.getElementById("refreshSources");
+ var refresh = document.getElementById("refresh");
+ if(xmlHttp.readyState<4)
+ {
+ refreshSources.innerHTML=" (Updating...)";
+ refresh.innerHTML="<SPAN>Updating...</SPAN>";
+ }
+ if(xmlHttp.readyState==4)
+ {
+ refreshSources.innerHTML="";
+ document.getElementById("sourcesTable").innerHTML=xmlHttp.responseText;
+ getAlerts();
+ }
+ }
+ xmlHttp.open("GET","AlertDisplay.php/getAlertSourcesHTMLTable",true);
+ xmlHttp.send(null);
+}
+
+function showEditSource(sourceid)
+{
+ document.getElementById("edit_source_"+sourceid).className = "source_"+sourceid;
+}
+
+function hideEditSource(sourceid)
+{
+ document.getElementById("edit_source_"+sourceid).className = "hidden source_"+sourceid;
+}
+
+function updateSource(sourceid)
+{
+ hideEditSource(sourceid);
+ var type = document.getElementById("source_"+sourceid+"_type").value;
+ var sourceXML = constructSourceXML(sourceid, type);
+
+ sendSource("AlertDisplay.php/updateAlertSource", sourceXML);
+
+}
+
+function sendSource(url, sourceXML)
+{
+ var xmlHttp = getXMLHTTP()
+ xmlHttp.onreadystatechange=function()
+ {
+ var refreshSources = document.getElementById("refreshSources");
+ var refresh = document.getElementById("refresh");
+ if(xmlHttp.readyState<4)
+ {
+ refreshSources.innerHTML=" (Updating...)";
+ refresh.innerHTML="<SPAN>Updating...</SPAN>";
+ }
+ if(xmlHttp.readyState==4)
+ {
+ getSources();
+ }
+ }
+ xmlHttp.open("POST",url,true);
+ xmlHttp.send(sourceXML);
+
+}
+
+function deleteSource(sourceid)
+{
+ var xmlHttp = getXMLHTTP()
+ xmlHttp.onreadystatechange=function()
+ {
+ if(xmlHttp.readyState==4)
+ {
+ getSources();
+ document.getElementById("alertData").innerHTML=""
+ }
+ }
+ xmlHttp.open("GET","AlertDisplay.php/deleteAlertSource?sourceId="+sourceid,true);
+ xmlHttp.send(null);
+}
+
+function showAddNewSource(sourceid)
+{
+ document.getElementById("add_source_"+sourceid).className = "source_"+sourceid;
+}
+
+function hideAddNewSource(sourceid)
+{
+ document.getElementById("add_source_"+sourceid).className = "hidden source_"+sourceid;
+}
+
+function showSourceType(sourceid)
+{
+ var typeElem = document.getElementById("source_"+sourceid+"_type");
+ var type = typeElem.options[typeElem.selectedIndex].value;
+
+ if(type=="rss")
+ {
+ document.getElementById("add_rss_source").className = "";
+ document.getElementById("add_pop_source").className = "hidden";
+ }
+ else if(type=="pop")
+ {
+ document.getElementById("add_rss_source").className = "hidden";
+ document.getElementById("add_pop_source").className = "";
+ }
+}
+
+function addSource(sourceid)
+{
+ hideAddNewSource(sourceid);
+
+ var typeElem = document.getElementById("source_"+sourceid+"_type");
+ var type = typeElem.options[typeElem.selectedIndex].value;
+ var sourceXML = constructSourceXML(sourceid, type);
+
+ sendSource("AlertDisplay.php/addAlertSource", sourceXML);
+
+}
+
+function constructSourceXML(sourceid, type)
+{
+ var name = document.getElementById("source_"+sourceid+"_name").value;
+ var address = document.getElementById("source_"+sourceid+"_address").value;
+
+ var sourceXML = "<source xmlns=\"http://tuscany.apache.org/samples/alerter\" type=\""+type+"\" id=\""+sourceid+"\">";
+ sourceXML += "<name>"+name+"</name>";
+ sourceXML += "<address>"+address+"</address>";
+
+ if(type=="rss")
+ {
+ var feedAddress = document.getElementById("source_"+sourceid+"_feedAddress").value;
+ sourceXML += "<feedAddress>"+feedAddress+"</feedAddress>";
+ }
+ else if(type=="pop")
+ {
+ var popServer = document.getElementById("source_"+sourceid+"_popServer").value;
+ sourceXML += "<popServer>"+popServer+"</popServer>";
+ var popUsername = document.getElementById("source_"+sourceid+"_popUsername").value;
+ sourceXML += "<popUsername>"+popUsername+"</popUsername>";
+ var popPassword = document.getElementById("source_"+sourceid+"_popPassword").value;
+ sourceXML += "<popPassword>"+popPassword+"</popPassword>";
+ }
+ sourceXML += "</source>";
+
+ return sourceXML;
+}
+</script>
+<H1 ID="top">Apache Tuscany Alert Aggregator Sample</H1>
+<P>Alert Sources<SPAN ID="refreshSources"></SPAN>:</P>
+<DIV ID="sourcesTable"></DIV>
+<P>Recent Alerts (<SPAN ID="refresh"><SPAN CLASS="clickable link" ONCLICK="getAlerts()">Refresh</SPAN></SPAN>):</P
+<DIV ID="alertTable"></DIV>
+<HR></HR>
+<P><A ID="data" HREF="#top">Back to top</A></P>
+<DIV ID="alertData"></DIV>
+
+</BODY>
+</HTML>
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/pop.png b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/pop.png Binary files differnew file mode 100644 index 0000000000..1cf1df24a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/pop.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/rss.png b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/rss.png Binary files differnew file mode 100644 index 0000000000..b3c949d224 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/rss.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/style.css b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/style.css new file mode 100644 index 0000000000..cd377e90e5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/htdocs/style.css @@ -0,0 +1,166 @@ +/*
+ * 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.
+ */
+
+p,table,li,h1,h2,h3
+{
+font-family: verdana, arial, 'sans serif';
+}
+
+p, h1, h2, h3, table, li, hr
+{
+margin-left: 10pt;
+}
+
+table
+{
+border-color: black;
+border-collapse: separate;
+border-spacing: 0px 1px;
+
+margin-right: 10pt;
+margin-left: 10pt;
+width: 800px;
+}
+
+.sourceDetailsTable
+{
+width: 600px;
+}
+
+tr, td
+{
+margin-left: 0pt;
+margin-right: 0pt;
+padding-left: 10pt;
+font-size: 90%;
+}
+
+p,li,th
+{
+font-size: 90%;
+margin-left: 10pt;
+}
+
+pre
+{
+margin-left: 10pt;
+}
+
+body
+{
+#ffffff;
+}
+
+h1,h2,h3,hr
+{
+color: firebrick;
+}
+
+a:link {COLOR: firebrick;}
+a:visited {COLOR: firebrick;}
+a:active {COLOR: navy;}
+
+.link
+{
+COLOR: firebrick;
+text-decoration: underline;
+}
+
+.clickable
+{
+cursor: pointer
+}
+
+.unread_title
+{
+font-weight: bold;
+}
+
+.read_title
+{
+font-weight: normal;
+}
+
+.summary
+{
+color: DimGrey;
+}
+
+.hidden
+{
+display: none;
+}
+
+.alert_data
+{
+margin-left: 10px;
+width: 800px;
+height: 800px;
+}
+
+.source_0
+{
+background-color: LightGreen;
+}
+
+.source_1
+{
+background-color: LightSkyBlue;
+}
+
+.source_2
+{
+background-color: Khaki;
+}
+
+.source_3
+{
+background-color: LightPink;
+}
+
+.source_4
+{
+background-color: Orange;
+}
+
+.source_5
+{
+background-color: LightCoral;
+}
+
+.source_6
+{
+background-color: Orchid;
+}
+
+.source_7
+{
+background-color: Peru;
+}
+
+.source_8
+{
+background-color: SpringGreen;
+}
+
+.source_9
+{
+background-color: LightGrey;
+}
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/startserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/startserver.bat new file mode 100644 index 0000000000..dab8cd6c61 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver.php/startserver.bat @@ -0,0 +1,76 @@ +@echo off
+
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+
+setlocal
+
+set APFULLDIR=%~d0%~p0
+echo Running from %APFULLDIR%
+
+if "%TUSCANY_SCACPP%" == "" (
+echo "TUSCANY_SCACPP not set"
+goto end
+)
+echo Using SCA installed at %TUSCANY_SCACPP%
+
+if "%TUSCANY_SDOCPP%" == "" (
+echo "TUSCANY_SDOCPP not set"
+goto end
+)
+echo Using SDO installed at %TUSCANY_SDOCPP%
+
+if "%HTTPD_HOME%" == "" (
+echo "HTTPD_HOME not set"
+goto end
+)
+echo Using HTTPD installed at %HTTPD_HOME%
+
+set PATH=%TUSCANY_SCACPP%\extensions\python\bin;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\rest\service\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%HTTPD_HOME%\bin;%PATH%
+set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin
+
+set TUSCANY_SCACPP_ROOT=%APFULLDIR%\..\
+set TUSCANY_SCACPP_BASE_URI=http://localhost:9091
+
+@REM Generate the tuscany_sca_mod_rest configuration
+if not exist %APFULLDIR%\conf\tuscany_sca_mod_rest.conf (
+ echo LoadModule sca_rest_module %TUSCANY_SCACPP%/extensions/rest\service/bin/tuscany_sca_mod_rest.dll > %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo TuscanyHome %TUSCANY_SCACPP% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo ^<Location /rest^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo SetHandler sca_rest_module >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo TuscanyRoot %TUSCANY_SCACPP_ROOT% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo ^</Location^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+)
+
+@REM Generate the base HTTPD configuration
+if not exist %APFULLDIR%\conf\base.conf (
+ echo LoadModule mime_module %HTTPD_HOME%\modules\mod_mime.so > %APFULLDIR%\conf\base.conf
+ echo LoadModule dir_module %HTTPD_HOME%\modules\mod_dir.so >> %APFULLDIR%\conf\base.conf
+ echo DocumentRoot %APFULLDIR%\htdocs >> %APFULLDIR%\conf\base.conf
+ echo LoadModule php5_module %PHP_HOME%\php5apache2.dll >> %APFULLDIR%\conf\base.conf
+ echo AddType application/x-httpd-php .php >> %APFULLDIR%\conf\base.conf
+ echo PHPIniDir %PHP_HOME% >> %APFULLDIR%\conf\base.conf
+)
+
+@REM Create logs directory
+if not exist %APFULLDIR%\logs mkdir %APFULLDIR%\logs
+set TUSCANY_SCACPP_LOG=%APFULLDIR%\logs\tuscany-server.log
+set TUSCANY_SCACPP_LOGGING=9
+
+@REM Start the HTTP server
+echo Starting Apache httpd
+httpd -d %APFULLDIR%
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/Makefile.am new file mode 100644 index 0000000000..5db11696dc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/AlertAggregator/deploy +serverdir=$(deploydir)/httpserver + +server_SCRIPTS = startserver.sh stopserver.sh +EXTRA_DIST = startserver.sh stopserver.sh conf htdocs +nobase_server_DATA = conf/httpd.conf conf/mime.types htdocs/index.html htdocs/style.css htdocs/*.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/conf/httpd.conf b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/conf/httpd.conf new file mode 100644 index 0000000000..d243f85fbf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/conf/httpd.conf @@ -0,0 +1,43 @@ +# 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.
+
+# This is the main Apache HTTP server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.
+
+Listen 9090
+
+# Generated by the startserver script
+Include conf/base.conf
+Include conf/tuscany_sca_mod_rest.conf
+
+# User and Group directives may be required if the server must be
+# started from the root account. Uncomment the following lines and
+# set the correct username and group
+#
+# User myusername
+# Group mygroupname
+
+
+# The Mime module may need to be specifically loaded if
+# text rather than a web page is displayed when the web browser goes to
+# http://localhost:9090/index.html. Uncomment the following LoadModule
+# directive and ensure that the path to mod_mime.so is correct
+#
+# LoadModule mime_module /usr/lib/httpd/modules/mod_mime.so
+
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/conf/mime.types b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/conf/mime.types new file mode 100644 index 0000000000..4279f51bca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/conf/mime.types @@ -0,0 +1,607 @@ +# 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. + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at <http://www.iana.org/assignments/media-types/>. + +# MIME type Extensions +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomicmail +application/batch-smtp +application/beep+xml +application/cals-1840 +application/cnrp+xml +application/commonground +application/cpl+xml +application/cybercash +application/dca-rft +application/dec-dx +application/dvcs +application/edi-consent +application/edifact +application/edi-x12 +application/eshop +application/font-tdpfr +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica +application/mathml+xml mathml +application/msword doc +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin dms lha lzh exe class so dll dmg +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rdf+xml rdf +application/reginfo+xml +application/remote-printing +application/riscos +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/srgs gram +application/srgs+xml grxml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/vemmi +application/vnd.3gpp.pic-bw-large +application/vnd.3gpp.pic-bw-small +application/vnd.3gpp.pic-bw-var +application/vnd.3gpp.sms +application/vnd.3m.post-it-notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.acucorp +application/vnd.adobe.xfdf +application/vnd.aether.imp +application/vnd.amiga.ami +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.blueice.multipass +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.criticaltools.wbs+xml +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl +application/vnd.cybank +application/vnd.data-vision.rdz +application/vnd.dna +application/vnd.dpgraph +application/vnd.dreamfactory +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-help +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hbci +application/vnd.hhe.lesson-player +application/vnd.hp-hpgl +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.hp-pcl +application/vnd.hp-pclxl +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay +application/vnd.ibm.modcap +application/vnd.ibm.rights-management +application/vnd.ibm.secure-container +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jisp +application/vnd.kde.karbon +application/vnd.kde.kchart +application/vnd.kde.kformula +application/vnd.kde.kivio +application/vnd.kde.kontour +application/vnd.kde.kpresenter +application/vnd.kde.kspread +application/vnd.kde.kword +application/vnd.kenameaapp +application/vnd.koan +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop +application/vnd.llamagraphics.life-balance.exchange+xml +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.micrografx.flo +application/vnd.micrografx.igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.mbk +application/vnd.mobius.mqy +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.mophun.application +application/vnd.mophun.certificate +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls +application/vnd.ms-lrm +application/vnd.ms-powerpoint ppt +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.ms-wpl +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.edm +application/vnd.novadigm.edx +application/vnd.novadigm.ext +application/vnd.obn +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.quark.quarkxpress +application/vnd.rapid +application/vnd.s3sms +application/vnd.sealed.net +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.street-stream +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio +application/vnd.visionary +application/vnd.vividence.scriptfile +application/vnd.vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.wv.csp+wbxml +application/vnd.xara +application/vnd.xfdl +application/vnd.yamaha.hv-dic +application/vnd.yamaha.hv-script +application/vnd.yamaha.hv-voice +application/vnd.yellowriver-custom-menu +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip +application/x-hdf hdf +application/x-javascript js +application/x-koan skp skd skt skm +application/x-latex latex +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x400-bp +application/xhtml+xml xhtml xht +application/xslt+xml xslt +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/zip zip +audio/32kadpcm +audio/amr +audio/amr-wb +audio/basic au snd +audio/cn +audio/dat12 +audio/dsr-es201108 +audio/dvi4 +audio/evrc +audio/evrc0 +audio/g722 +audio/g.722.1 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g729D +audio/g729E +audio/gsm +audio/gsm-efr +audio/l8 +audio/l16 +audio/l20 +audio/l24 +audio/lpc +audio/midi mid midi kar +audio/mpa +audio/mpa-robust +audio/mp4a-latm +audio/mpeg mpga mp2 mp3 +audio/parityfec +audio/pcma +audio/pcmu +audio/prs.sid +audio/qcelp +audio/red +audio/smv +audio/smv0 +audio/telephone-event +audio/tone +audio/vdvi +audio/vnd.3gpp.iufp +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-alaw-basic +audio/x-mpegurl m3u +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin +application/vnd.rn-realmedia rm +audio/x-wav wav +chemical/x-pdb pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg +image/t38 +image/tiff tiff tif +image/tiff-fx +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.globalgraphics.pgb +image/vnd.mix +image/vnd.ms-modi +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-icon ico +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/news +message/partial +message/rfc822 +message/s-http +message/sip +message/sipfrag +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics ifb +text/css css +text/directory +text/enriched +text/html html htm +text/parityfec +text/plain asc txt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.dmclientscript +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.iptc.nitf +text/vnd.iptc.newsml +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.sun.j2me.app-descriptor +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-setext etx +text/xml +text/xml-external-parsed-entity +video/bmpeg +video/bt656 +video/celb +video/dv +video/h261 +video/h263 +video/h263-1998 +video/h263-2000 +video/jpeg +video/mp1s +video/mp2p +video/mp2t +video/mp4v-es +video/mpv +video/mpeg mpeg mpg mpe +video/nv +video/parityfec +video/pointer +video/quicktime qt mov +video/smpte292m +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.nokia.interleaved-multimedia +video/vnd.objectvideo +video/vnd.vivo +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/index.html b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/index.html new file mode 100644 index 0000000000..911f66e013 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/index.html @@ -0,0 +1,290 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <TITLE>Apache Tuscany Alert Aggregator Sample</TITLE> + <link REL="stylesheet" TYPE="text/css" href="style.css"> +</HEAD> + +<BODY ONLOAD="getSources('')"> +<script type="text/javascript"> +function getXMLHTTP() +{ + var xmlHttp; + try + { + // Firefox, Opera 8.0+, Safari + xmlHttp=new XMLHttpRequest(); + } + catch (e) + { + // Internet Explorer + try + { + xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) + { + try + { + xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (e) + { + alert("Your browser does not support AJAX!"); + return false; + } + } + } + return xmlHttp; +} + +var callIsRunning = false; + +function getAlerts(sourceid) +{ + var xmlHttp = getXMLHTTP(); + xmlHttp.onreadystatechange=function() + { + var refr = document.getElementById("refresh"); + if(xmlHttp.readyState<4) + { + callIsRunning = true; + refr.innerHTML="<SPAN>Updating...</SPAN>"; + } + if(xmlHttp.readyState==4) + { + callIsRunning = false; + refr.innerHTML="<SPAN CLASS=\"clickable link\" ONCLICK=\"getAlerts('')\">Refresh</SPAN>"; + document.getElementById("alertTable").innerHTML=xmlHttp.responseText; + } + } + + if(!callIsRunning) + { + if(sourceid=='') + { + xmlHttp.open("GET","rest/sample.display.DisplayComponent/HTMLDisplayService/updateAllAlertsHTMLTable",true); + } + else + { + xmlHttp.open("GET","rest/sample.display.DisplayComponent/HTMLDisplayService/updateSourceAlertsHTMLTable?sourceId="+sourceid,true); + } + xmlHttp.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); + xmlHttp.send(null); + } + + // Call this function again after x minutes + setTimeout("getAlerts('');", 5*60000); +} + +function displayAlert(url, alertid) +{ + if(alertid=="") + { + document.getElementById("alertData").innerHTML="<IFRAME CLASS=\"alert_data\" SRC=\""+url+"\"/>"; + window.location="#data"; + return; + } + + document.getElementById(alertid).className="read_title"; + + var xmlHttp = getXMLHTTP() + xmlHttp.onreadystatechange=function() + { + if(xmlHttp.readyState==4) + { + if(xmlHttp.responseText=="") + { + document.getElementById("alertData").innerHTML="<IFRAME CLASS=\"alert_data\" SRC=\""+url+"\"/>"; + } + else + { + document.getElementById("alertData").innerHTML=xmlHttp.responseText; + } + window.location="#data"; + } + } + + xmlHttp.open("GET","rest/sample.display.DisplayComponent/HTMLDisplayService/readAlert?alertID="+alertid,true); + xmlHttp.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); + xmlHttp.send(null); +} + +function getSources(sourceid) +{ + var xmlHttp = getXMLHTTP() + xmlHttp.onreadystatechange=function() + { + var refreshSources = document.getElementById("refreshSources"); + var refresh = document.getElementById("refresh"); + if(xmlHttp.readyState<4) + { + refreshSources.innerHTML=" (Updating...)"; + refresh.innerHTML="<SPAN>Updating...</SPAN>"; + } + if(xmlHttp.readyState==4) + { + refreshSources.innerHTML=""; + document.getElementById("sourcesTable").innerHTML=xmlHttp.responseText; + getAlerts(sourceid); + } + } + xmlHttp.open("GET","rest/sample.display.DisplayComponent/HTMLDisplayService/getAlertSourcesHTMLTable",true); + xmlHttp.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); + xmlHttp.send(null); +} + +function showEditSource(sourceid) +{ + document.getElementById("edit_source_"+sourceid).className = "source_"+sourceid; +} + +function hideEditSource(sourceid) +{ + document.getElementById("edit_source_"+sourceid).className = "hidden source_"+sourceid; +} + +function updateSource(sourceid) +{ + hideEditSource(sourceid); + var type = document.getElementById("source_"+sourceid+"_type").value; + var sourceXML = constructSourceXML(sourceid, type); + + sendSourceData("rest/sample.display.DisplayComponent/HTMLDisplayService/updateAlertSource", sourceXML, sourceid); +} + +function sendSourceData(url, sourceXML, sourceid) +{ + var xmlHttp = getXMLHTTP() + xmlHttp.onreadystatechange=function() + { + var refreshSources = document.getElementById("refreshSources"); + var refresh = document.getElementById("refresh"); + if(xmlHttp.readyState<4) + { + refreshSources.innerHTML=" (Updating...)"; + refresh.innerHTML="<SPAN>Updating...</SPAN>"; + } + if(xmlHttp.readyState==4) + { + getSources(sourceid); + } + } + xmlHttp.open("POST",url,true); + xmlHttp.send(sourceXML); + +} + +function deleteSource(sourceid) +{ + var xmlHttp = getXMLHTTP() + xmlHttp.onreadystatechange=function() + { + if(xmlHttp.readyState==4) + { + getSources(''); + document.getElementById("alertData").innerHTML=""; + } + } + xmlHttp.open("GET","rest/sample.display.DisplayComponent/HTMLDisplayService/deleteAlertSource?sourceId="+sourceid,true); + xmlHttp.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" ); + xmlHttp.send(null); +} + +function showAddNewSource(sourceid) +{ + document.getElementById("add_source_"+sourceid).className = "source_"+sourceid; +} + +function hideAddNewSource(sourceid) +{ + document.getElementById("add_source_"+sourceid).className = "hidden source_"+sourceid; +} + +function showSourceType(sourceid) +{ + var typeElem = document.getElementById("source_"+sourceid+"_type"); + var type = typeElem.options[typeElem.selectedIndex].value; + + if(type=="rss") + { + document.getElementById("add_rss_source").className = ""; + document.getElementById("add_pop_source").className = "hidden"; + } + else if(type=="pop") + { + document.getElementById("add_rss_source").className = "hidden"; + document.getElementById("add_pop_source").className = ""; + } +} + +function addSource(sourceid) +{ + hideAddNewSource(sourceid); + + var typeElem = document.getElementById("source_"+sourceid+"_type"); + var type = typeElem.options[typeElem.selectedIndex].value; + var sourceXML = constructSourceXML(sourceid, type); + + sendSourceData("rest/sample.display.DisplayComponent/HTMLDisplayService/addAlertSource", sourceXML, sourceid); + +} + +function constructSourceXML(sourceid, type) +{ + var name = document.getElementById("source_"+sourceid+"_name").value; + var address = document.getElementById("source_"+sourceid+"_address").value; + + var sourceXML = "<source xmlns=\"http://tuscany.apache.org/samples/alerter\" type=\""+type+"\" id=\""+sourceid+"\">"; + sourceXML += "<name>"+name+"</name>"; + sourceXML += "<address>"+address+"</address>"; + + if(type=="rss") + { + var feedAddress = document.getElementById("source_"+sourceid+"_feedAddress").value; + sourceXML += "<feedAddress>"+feedAddress+"</feedAddress>"; + } + else if(type=="pop") + { + var popServer = document.getElementById("source_"+sourceid+"_popServer").value; + sourceXML += "<popServer>"+popServer+"</popServer>"; + var popUsername = document.getElementById("source_"+sourceid+"_popUsername").value; + sourceXML += "<popUsername>"+popUsername+"</popUsername>"; + var popPassword = document.getElementById("source_"+sourceid+"_popPassword").value; + sourceXML += "<popPassword>"+popPassword+"</popPassword>"; + } + sourceXML += "</source>"; + + return sourceXML; +} +</script> +<H1 ID="top">Apache Tuscany Alert Aggregator Sample</H1> +<P>Alert Sources<SPAN ID="refreshSources"></SPAN>:</P> +<DIV ID="sourcesTable"></DIV> +<P>Recent Alerts (<SPAN ID="refresh"><SPAN CLASS="clickable link" ONCLICK="getAlerts('')">Refresh</SPAN></SPAN>):</P> +<DIV ID="alertTable"></DIV> +<HR></HR> +<P><A ID="data" HREF="#top">Back to top</A></P> +<DIV ID="alertData"></DIV> + +</BODY> +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/pop.png b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/pop.png Binary files differnew file mode 100644 index 0000000000..1cf1df24a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/pop.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/rss.png b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/rss.png Binary files differnew file mode 100644 index 0000000000..b3c949d224 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/rss.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/style.css b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/style.css new file mode 100644 index 0000000000..cd377e90e5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/htdocs/style.css @@ -0,0 +1,166 @@ +/*
+ * 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.
+ */
+
+p,table,li,h1,h2,h3
+{
+font-family: verdana, arial, 'sans serif';
+}
+
+p, h1, h2, h3, table, li, hr
+{
+margin-left: 10pt;
+}
+
+table
+{
+border-color: black;
+border-collapse: separate;
+border-spacing: 0px 1px;
+
+margin-right: 10pt;
+margin-left: 10pt;
+width: 800px;
+}
+
+.sourceDetailsTable
+{
+width: 600px;
+}
+
+tr, td
+{
+margin-left: 0pt;
+margin-right: 0pt;
+padding-left: 10pt;
+font-size: 90%;
+}
+
+p,li,th
+{
+font-size: 90%;
+margin-left: 10pt;
+}
+
+pre
+{
+margin-left: 10pt;
+}
+
+body
+{
+#ffffff;
+}
+
+h1,h2,h3,hr
+{
+color: firebrick;
+}
+
+a:link {COLOR: firebrick;}
+a:visited {COLOR: firebrick;}
+a:active {COLOR: navy;}
+
+.link
+{
+COLOR: firebrick;
+text-decoration: underline;
+}
+
+.clickable
+{
+cursor: pointer
+}
+
+.unread_title
+{
+font-weight: bold;
+}
+
+.read_title
+{
+font-weight: normal;
+}
+
+.summary
+{
+color: DimGrey;
+}
+
+.hidden
+{
+display: none;
+}
+
+.alert_data
+{
+margin-left: 10px;
+width: 800px;
+height: 800px;
+}
+
+.source_0
+{
+background-color: LightGreen;
+}
+
+.source_1
+{
+background-color: LightSkyBlue;
+}
+
+.source_2
+{
+background-color: Khaki;
+}
+
+.source_3
+{
+background-color: LightPink;
+}
+
+.source_4
+{
+background-color: Orange;
+}
+
+.source_5
+{
+background-color: LightCoral;
+}
+
+.source_6
+{
+background-color: Orchid;
+}
+
+.source_7
+{
+background-color: Peru;
+}
+
+.source_8
+{
+background-color: SpringGreen;
+}
+
+.source_9
+{
+background-color: LightGrey;
+}
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/startserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/startserver.bat new file mode 100644 index 0000000000..fa4d66df31 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/startserver.bat @@ -0,0 +1,73 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +set APFULLDIR=%~d0%~p0 +echo Running from %APFULLDIR% + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%HTTPD_HOME%" == "" ( +echo "HTTPD_HOME not set" +goto end +) +echo Using HTTPD installed at %HTTPD_HOME% + +set PATH=%TUSCANY_SCACPP%\extensions\python\bin;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\rest\service\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%HTTPD_HOME%\bin;%PATH% +set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin + +set TUSCANY_SCACPP_ROOT=%APFULLDIR%\..\ +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +@REM Generate the tuscany_sca_mod_rest configuration +if not exist %APFULLDIR%\conf\tuscany_sca_mod_rest.conf ( + echo LoadModule sca_rest_module %TUSCANY_SCACPP%/extensions/rest\service/bin/tuscany_sca_mod_rest.dll > %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo TuscanyHome %TUSCANY_SCACPP% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo ^<Location /rest^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo SetHandler sca_rest_module >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo TuscanyRoot %TUSCANY_SCACPP_ROOT% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo ^</Location^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +) + +@REM Generate the base HTTPD configuration +if not exist %APFULLDIR%\conf\base.conf ( + echo LoadModule mime_module %HTTPD_HOME%\modules\mod_mime.so > %APFULLDIR%\conf\base.conf + echo LoadModule dir_module %HTTPD_HOME%\modules\mod_dir.so >> %APFULLDIR%\conf\base.conf + echo DocumentRoot %APFULLDIR%\htdocs >> %APFULLDIR%\conf\base.conf +) + +@REM Create logs directory +if not exist %APFULLDIR%\logs mkdir %APFULLDIR%\logs +set TUSCANY_SCACPP_LOG=%APFULLDIR%\logs\tuscany-server.log +set TUSCANY_SCACPP_LOGGING=9 + +@REM Start the HTTP server +echo Starting Apache httpd +httpd -d %APFULLDIR% diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/startserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/startserver.sh new file mode 100755 index 0000000000..d197b94245 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/startserver.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$PYTHON_LIB != x ]; then +echo "Using Python library installed at $PYTHON_LIB" +export LD_LIBRARY_PATH=$PYTHON_LIB:$LD_LIBRARY_PATH +export PATH=$PYTHON_LIB/../bin:$PATH +fi + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/python/lib:$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +libsuffix=.so +UNAME=`uname -s` +if [ "x$UNAME" = "xDarwin" ]; then + libsuffix=.dylib +fi + +# Generate the mod_rest configuration +if [ ! -f conf/tuscany_sca_mod_rest.conf ]; then + echo "LoadModule sca_rest_module $TUSCANY_SCACPP/extensions/rest/service/lib/libtuscany_sca_mod_rest$libsuffix" >conf/tuscany_sca_mod_rest.conf + echo "TuscanyHome $TUSCANY_SCACPP" >>conf/tuscany_sca_mod_rest.conf + echo "<Location /rest>" >>conf/tuscany_sca_mod_rest.conf + echo " SetHandler sca_rest_module" >>conf/tuscany_sca_mod_rest.conf + echo " TuscanyRoot $TUSCANY_SCACPP_ROOT" >>conf/tuscany_sca_mod_rest.conf + echo "</Location>" >>conf/tuscany_sca_mod_rest.conf +fi + +if [ ! -f conf/base.conf ]; then + echo "DocumentRoot $APFULLDIR/htdocs" >conf/base.conf +fi + +# Create logs directory +if [ ! -d logs ]; then + mkdir logs +fi + +# Start the HTTP server +echo "Starting Apache httpd" + +# Set LD_PRELOAD to use the expat included in Python to avoid incompatibilities +export LD_PRELOAD=$TUSCANY_SCACPP/extensions/python/lib/libtuscany_sca_python$libsuffix + +apachectl -k start -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/stopserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/stopserver.sh new file mode 100755 index 0000000000..c17f632a3e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/httpserver/stopserver.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +# Stop the HTTP server +echo "Stopping Apache httpd" +apachectl -k stop -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter.app.composite new file mode 100644 index 0000000000..4c0d4ccd1a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter.app.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.alerter.app"> + + <component name="sample.display.DisplayComponent"> + <implementation.composite name="sample.display" /> + <reference name="AlerterService">sample.alerter.AlerterComponent/AlerterService</reference> + </component> + + <component name="sample.alerter.AlerterComponent"> + <implementation.composite name="sample.alerter" /> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/AlertCheckerImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/AlertCheckerImpl.py new file mode 100644 index 0000000000..d9aab820ac --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/AlertCheckerImpl.py @@ -0,0 +1,116 @@ +# 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. +# +import xml.etree.ElementTree, datetime + +def getAllNewAlerts (): + + returnXML = "<alerts xmlns=\"http://tuscany.apache.org/samples/alerter\">\n</alerts>" + returnElem = xml.etree.ElementTree.XML(returnXML) + + # Use the alertConfigService to get the configuration + configElem = alertConfigService.getAlertConfig() + + for sourceElem in configElem.findall("./{http://tuscany.apache.org/samples/alerter}source"): + + sourceid = sourceElem.attrib["id"] + + newAlerts = getAlerts(sourceElem) + if xml.etree.ElementTree.iselement(newAlerts): + # Add the sourceid to each alert and append to the entire list + for alert in newAlerts.findall("./{http://tuscany.apache.org/samples/alerter}alert"): + alert.attrib["sourceid"] = sourceid + returnElem.append(alert) + + return returnElem + +def getAlerts (sourceElem): + + lastcheckedElem = sourceElem.find("./{http://tuscany.apache.org/samples/alerter}lastChecked") + if not xml.etree.ElementTree.iselement(lastcheckedElem): + lastcheckedElem = xml.etree.ElementTree.SubElement(sourceElem, "lastChecked") + lastcheckedElem.text = "" + + if sourceElem.attrib["type"] == "rss": + + feedaddress = sourceElem.find("./{http://tuscany.apache.org/samples/alerter}feedAddress").text + + if feedaddress: + # Use the rssCheckerService to get new articles for this config + newAlerts = rssCheckerService.getNewAlerts(feedaddress, lastcheckedElem.text) + + lastcheckedElem.text = datetime.datetime.now().replace(microsecond=0).isoformat() + alertConfigService.updateSourceConfig(sourceElem) + return newAlerts + + elif sourceElem.attrib["type"] == "pop": + + popserver = sourceElem.find("./{http://tuscany.apache.org/samples/alerter}popServer").text + popusername = sourceElem.find("./{http://tuscany.apache.org/samples/alerter}popUsername").text + poppassword = sourceElem.find("./{http://tuscany.apache.org/samples/alerter}popPassword").text + + if popserver and popusername and poppassword: + # Use the popCheckerService to get new emails for this config + newAlerts = popCheckerService.getNewAlerts(popserver, popusername, poppassword, lastcheckedElem.text) + + lastcheckedElem.text = datetime.datetime.now().replace(microsecond=0).isoformat() + alertConfigService.updateSourceConfig(sourceElem) + return newAlerts + + else: + print "Source type not supported: ", sourceElem.attrib["type"] + + return None + + +def getNewAlerts (sourceId): + # Use the alertConfigService to get the configuration + sourceConfigElem = alertConfigService.getSourceConfig(sourceId) + + # Get the alerts + newAlerts = getAlerts(sourceConfigElem) + + if xml.etree.ElementTree.iselement(newAlerts): + # Add the sourceid to each alert + for alert in newAlerts.findall("./{http://tuscany.apache.org/samples/alerter}alert"): + alert.attrib["sourceid"] = sourceId + + return newAlerts + +def addAlertSource (sourceElem): + # Add the source directly to the configuration + return alertConfigService.addSourceConfig(sourceElem) + +def updateAlertSource (sourceElem): + # Update the source in the configuration + return alertConfigService.updateSourceConfig(sourceElem) + +def removeAlertSource (sourceId): + # Remove the source from the configuration + alertConfigService.removeSourceConfig(sourceId) + +def getAlertSources (): + # Get the config for all the sources + return alertConfigService.getAlertConfig() + +# # Testing +# import AlertConfigImpl as alertConfigService +# import RSSCheckerImpl as rssCheckerService +# import POPCheckerImpl as popCheckerService +# +# print xml.etree.ElementTree.tostring(getAlertSources()) +# print xml.etree.ElementTree.tostring(getAllNewAlerts()) diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/AlertConfigImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/AlertConfigImpl.py new file mode 100644 index 0000000000..2800a940b4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/AlertConfigImpl.py @@ -0,0 +1,175 @@ +# 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. +# + +import xml.etree.ElementTree, os.path, os + +def getAlertConfig (): + + # Set up some default config data + configData = "<config xmlns=\"http://tuscany.apache.org/samples/alerter\">\n</config>" + + if os.path.isfile(os.environ['TUSCANY_SCACPP_ROOT']+"/config.xml"): + # Retrieve the configuration from a file + f = open(os.environ['TUSCANY_SCACPP_ROOT']+"/config.xml") + try: + configData = f.read() + finally: + f.close() + + configElem = xml.etree.ElementTree.XML(configData) + + return configElem + +def getSourceConfig (sourceId): + + configElem = getAlertConfig() + + for sourceElem in configElem.findall("./{http://tuscany.apache.org/samples/alerter}source"): + if sourceElem.attrib["id"] == sourceId: + return sourceElem + + print "Source with id matching",sourceId,"not found" + return + +def updateSourceConfig (alertSourceConfigElem): + + configElem = getAlertConfig() + sourceId = alertSourceConfigElem.attrib["id"] + + for sourceElem in configElem.findall("./{http://tuscany.apache.org/samples/alerter}source"): + if sourceElem.attrib["id"] == sourceId: + configElem.remove(sourceElem) + configElem.append(alertSourceConfigElem) + saveConfigData(configElem) + return + print "Source with id matching",sourceId,"not found" + return + +def addSourceConfig (alertSourceConfigElem): + configElem = getAlertConfig() + + #check for source ID, make sure it's not the same as others and create one if it's missing + if "id" in alertSourceConfigElem.attrib: + configId = alertSourceConfigElem.attrib["id"] + else: + configId = "0" + + gotConfigId = False + + while gotConfigId == False: + + config = getSourceConfig(configId) + if config: + configId = str( int(configId)+1 ) + else: + gotConfigId = True + + + alertSourceConfigElem.attrib["id"] = configId + + configElem.append(alertSourceConfigElem) + saveConfigData(configElem) + + return configId + +def saveConfigData (configElem): + configData = xml.etree.ElementTree.tostring(configElem) + + # Save the configuration to a file + f = open(os.environ['TUSCANY_SCACPP_ROOT']+"/config.xml", "w") + + if not f: + print "Failed to open config file for writing" + try: + f.write(configData) + finally: + f.close() + +def removeSourceConfig(sourceId): + configElem = getAlertConfig() + for sourceElem in configElem.findall("./{http://tuscany.apache.org/samples/alerter}source"): + if sourceElem.attrib["id"] == sourceId: + configElem.remove(sourceElem) + saveConfigData(configElem) + return + +# # Testing +# if os.path.isfile("config.xml"): +# os.remove("config.xml") +# data = getAlertConfig() +# print xml.etree.ElementTree.tostring(data), "\n" +# +# newsrcxml = "<source xmlns=\"http://tuscany.apache.org/samples/alerter\" type=\"rss\" id=\"0\">\n" +# newsrcxml += "<name>PSP Updates</name>\n" +# newsrcxml += "<address>http://pspupdates.qj.net</address>\n" +# newsrcxml += "<feedAddress>http://pspupdates.qj.net/rss.xml</feedAddress></source>" +# +# newsrc = xml.etree.ElementTree.XML(newsrcxml) +# ID = addSourceConfig(newsrc) +# print "Added src with ID:", ID, "\n" +# +# newsrcxml = "<source xmlns=\"http://tuscany.apache.org/samples/alerter\" type=\"rss\" id=\"1\">\n" +# newsrcxml += "<name>PSP Updates</name>\n" +# newsrcxml += "<address>http://pspupdates.qj.net!</address>\n" +# newsrcxml += "<feedAddress>http://pspupdates.qj.net/atom.xml</feedAddress></source>" +# +# newsrc = xml.etree.ElementTree.XML(newsrcxml) +# ID = addSourceConfig(newsrc) +# print "Added src with ID:", ID, "\n" +# +# data = getAlertConfig() +# print xml.etree.ElementTree.tostring(data), "\n" +# +# data = getSourceConfig("0") +# print xml.etree.ElementTree.tostring(data), "\n" +# print dir(data), "\n" +# +# name = data.find("./{http://tuscany.apache.org/samples/alerter}name") +# name.text = "Hello world!" +# +# updateSourceConfig(data) +# data = getSourceConfig("1") +# print xml.etree.ElementTree.tostring(data), "\n" +# +# removeSourceConfig("1") +# data = getAlertConfig() +# print xml.etree.ElementTree.tostring(data), "\n" +# +# ID = addSourceConfig(newsrc) +# print "Added src with ID:", ID, "\n" +# +# ID = addSourceConfig(newsrc) +# print "Added src with ID:", ID, "\n" +# +# data = getAlertConfig() +# print xml.etree.ElementTree.tostring(data), "\n" +# +# +# newsrcxml = "<source xmlns=\"http://tuscany.apache.org/samples/alerter\" type=\"rss\">\n" +# newsrcxml += "<name>PSP Updates</name>\n" +# newsrcxml += "<address>http://pspupdates.qj.net!</address>\n" +# newsrcxml += "<feedAddress>http://pspupdates.qj.net/atom.xml</feedAddress></source>" +# +# newsrc = xml.etree.ElementTree.XML(newsrcxml) +# ID = addSourceConfig(newsrc) +# print "Added src with ID:", ID, "\n" +# +# data = getAlertConfig() +# print xml.etree.ElementTree.tostring(data), "\n" +# + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/Alerter.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/Alerter.xsd new file mode 100644 index 0000000000..c59460995d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/Alerter.xsd @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<schema targetNamespace="http://tuscany.apache.org/samples/alerter"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ns="http://tuscany.apache.org/samples/alerter"> + <element name="alerts" type="ns:alerts"/>
+ + <complexType name="alert"> + <sequence> + <element name="title" type="string"/>
+ <element name="summary" type="string"/> + <element name="address" type="anyURI" maxOccurs="1" minOccurs="1"/> + <element name="date" type="string" maxOccurs="1" minOccurs="1"/> + </sequence>
+ <attribute name="sourceid" type="string" use="optional"/>
+ </complexType> + + <complexType name="alerts"> + <sequence> + <element name="alert" type="ns:alert" maxOccurs="unbounded" minOccurs="0" /> + </sequence>
+ </complexType>
+ + <element name="config" type="ns:config"/>
+ <element name="source" type="ns:source"/>
+ + <complexType name="source"> + <sequence> + <element name="name" type="string" maxOccurs="1" minOccurs="1"/>
+ <element name="address" type="anyURI" maxOccurs="1" minOccurs="1"/>
+ <element name="lastChecked" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="feedAddress" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popServer" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popUsername" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popPassword" type="string" maxOccurs="1" minOccurs="0"/>
+ <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence>
+ <attribute name="id" type="string" use="optional"/>
+ <attribute name="type" use="required">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="rss"/>
+ <enumeration value="pop"/> + <enumeration value="nntp"/> + </restriction>
+ </simpleType>
+ </attribute> + </complexType> + + <complexType name="config"> + <sequence> + <element name="source" type="ns:source" maxOccurs="unbounded" minOccurs="0"/>
+ </sequence>
+ </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/Makefile.am new file mode 100644 index 0000000000..9a0ca276a0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/AlertAggregator/deploy +compositedir=$(deploydir)/sample.alerter + +composite_DATA = *.composite *.py *.rb *.xsd +EXTRA_DIST = *.composite *.py *.rb *.xsd + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/POPCheckerImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/POPCheckerImpl.py new file mode 100644 index 0000000000..0ae115ac2e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/POPCheckerImpl.py @@ -0,0 +1,104 @@ +# 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. +# + +import poplib, email, datetime, re, xml.etree.ElementTree + +def getNewAlerts(popserver, username, password, lastchecktimestamp): + + print "POPCheckerImpl getting new POP e-mail alerts\n" + + alertsXML = "<alerts xmlns=\"http://tuscany.apache.org/samples/alerter\">\n" + + # initially set lastchecked to the epoch before trying to use the lastchecked string + lastcheckdate = datetime.datetime.min + if lastchecktimestamp: + lastcheckdate = datetime.datetime.strptime(lastchecktimestamp, "%Y-%m-%dT%H:%M:%S") + + numberOfNewEmails = 0 + + mail = poplib.POP3(popserver) + mail.user(username) + mail.pass_(password) + msgCount, inboxSize = mail.stat() + + for msgNum in range(msgCount): + + print "getting msg", msgNum+1, "of", msgCount + + data = "" + for line in mail.retr(msgNum+1)[1]: + data += str(line) + data += "\n" + + msg = email.message_from_string(data) + + # date is of form "Sun, 21 Jan 2007 13:51:53 -0500" + msgDateString = msg.get("Date") + msgDateString, tz = msgDateString.rsplit(None, 1) + + timezoneadjust = datetime.timedelta(0, (int(tz)/100)*60*60 + int(tz[3:5])*60) + + msgdate = datetime.datetime.strptime(msgDateString, "%a, %d %b %Y %H:%M:%S") + timezoneadjust + + if msgdate >= lastcheckdate: + msgTo = msg.get("To") + msgFrom = msg.get("From") + msgSubject = msg.get("Subject") + + msgBody = "" + if msg.is_multipart(): + for msgPart in msg.get_payload(): + if msgPart.get_content_type() == "text/plain" or (msgPart.get_content_type() == "text/html" and msgBody == ""): + msgBody = msgPart.get_payload() + else: + msgBody = msg.get_payload() + + alertsXML += "<alert><title>" + encodeXML(msgFrom) + " - "+encodeXML(msgSubject)+"</title>\n" + alertsXML += "<address></address>\n" + alertsXML += "<date>" + msgdate.isoformat() + "</date>\n" + alertsXML += "<summary>From: " + encodeXML(msgFrom) + alertsXML += "\nTo: "+encodeXML(msgTo) + alertsXML += "\nSubject: "+encodeXML(msgSubject) + alertsXML += "\nDate: " + msgdate.isoformat() + alertsXML += "\n\n" + stripXML(msgBody) + "</summary></alert>\n" + + + mail.quit() + + alertsXML += "</alerts>" + + return xml.etree.ElementTree.XML(alertsXML) + + +def encodeXML(data): + data = re.sub("<","[", data) + data = re.sub(">","]", data) + return data + +def stripXML(data): + elementsRemoved = re.sub("<.*?>","", data) + entitiesRemoved = re.sub("&.*?;", " ", elementsRemoved) + asciiEncoded = entitiesRemoved.encode('ASCII', 'replace') + returnData = asciiEncoded.replace('&', 'and') + return returnData + + + +# Testing + +# print getNewAlerts("mail.eclipse.co.uk", "andrew@borley-hall.eclipse.co.uk", "app73sauc3", "2007-01-29T02:15:53") diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/POPCheckerImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/POPCheckerImpl.rb new file mode 100644 index 0000000000..e61046cb84 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/POPCheckerImpl.rb @@ -0,0 +1,122 @@ +# 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. +# + +require 'net/pop' +require "rexml/document" +include REXML + +# class POPChecker +# +# def initialize() +# print "POPCheckerImpl.initialize\n" +# end + +def getNewAlerts(popserver, username, password, lastchecked) + + print "POPCheckerImpl getting new POP e-mail alerts\n" + + alertsXML = "<alerts xmlns=\"http://tuscany.apache.org/samples/alerter\">\n" + + # initially set lastchecked to the epoch before trying to use the lastchecked string + lastcheckedtime = Time.at(0) + if lastchecked != '' + # lastchecked (if provided) is of form 2007-02-17T23:34:56 + year , month, day, hour, min, sec = lastchecked.split(/[-T:]/) + lastcheckedtime = Time.gm(year , month, day, hour, min, sec, nil) + end + + numberOfEmails = 0 + + Net::POP3.start(popserver, 110, username, password) do |pop| + + if !pop.mails.empty? + pop.each_mail do |m| + msg = m.pop + + header, body = msg.split("\r\n\r\n", 2) + date = getMessageField("Date", header) + # date is of form "Sun, 21 Jan 2007 13:51:53 -0500" + parts = date.split(' ') + timeparts = parts[4].split(':') + timezoneSecs = (parts[5].to_i()/100)*60*60 + (parts[5].slice(-2,0).to_i())*60 + + msgtime = Time.gm(timeparts[2], timeparts[1], timeparts[0], parts[1], parts[2], parts[3], nil, nil, nil, nil) + timezoneSecs + + + if msgtime >= lastcheckedtime + from = getMessageField("From", header) + subject = getMessageField("Subject", header) + + alertsXML += "<alert><title>From: " + encodeXML(from) + "\nSubject: "+encodeXML(subject)+"</title>\n" + alertsXML += "<address></address>\n" + alertsXML += "<date>" + msgtime.strftime("%Y-%m-%dT%H:%M:%S") + "</date>\n" + alertsXML += "<summary>" + stripXML(body) + "</summary></alert>\n" + + numberOfEmails += 1 + end + + end + end + end + alertsXML += "</alerts>" + + # Print XML + # puts alertsXML + print "POPCheckerImpl retrieved "+numberOfEmails.to_s+" new POP e-mail alerts\n" + + # Return data as REXML document + result = Document.new(alertsXML) + + return result +end + + +def getMessageField(field, message) + + # Use a regex to get the field + pattern = '^'+field+': (.*?)$' + + re = Regexp.new(pattern) + re =~ message + + if $1 == nil + return '' + end + + return $1 +end + +def encodeXML(data) + data = data.gsub(/</,'<') + data = data.gsub(/>/,'>') + return data +end + +def stripXML(data) + data = data.gsub(/<.*?>/m,'') + data = data.gsub(/&.*?;/, ' ') + data = data.gsub(/&/, 'and') + data = encodeXML(data) + return data +end + + + +# # Testing +# pop = POPChecker.new() +# print pop.getNewAlerts("mail.eclipse.co.uk", "andrew@borley-hall.eclipse.co.uk", "app73sauc3", "2007-01-29T02:15:53") diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/RSSCheckerImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/RSSCheckerImpl.py new file mode 100644 index 0000000000..2e320c0b22 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/RSSCheckerImpl.py @@ -0,0 +1,76 @@ +# 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. +# + +import feedparser, datetime, xml.etree.ElementTree, re + +def getNewAlerts(rssaddress, lastchecktimestamp): + + print "RSSCheckerImpl.getNewAlerts() called", rssaddress, lastchecktimestamp + + #Get and parse the RSS/Atom data + d = feedparser.parse(rssaddress) + + newalertsxml = "<alerts xmlns=\"http://tuscany.apache.org/samples/alerter\">\n" + + lastcheckdate = datetime.datetime.min + if lastchecktimestamp: + lastcheckdate = datetime.datetime.strptime(lastchecktimestamp, "%Y-%m-%dT%H:%M:%S") + + defaultTitle = d.feed.get('title', 'RSS feed article') + defaultLink = d.feed.get('link', 'http://incubator.apache.org/tuscany') + defaultSummary = 'No information provided' + + for entry in d.entries: + + if entry.has_key('date'): + (year, month, day, hour, minute, second, millisecond, microsecond, tzinfo) = entry.date_parsed + entrydate = datetime.datetime(year, month, day, hour, minute, second) + else: + entrydate = datetime.datetime.now() + + + if (entrydate > lastcheckdate) : + + newalertsxml += "<alert><title>" + stripXML(entry.get('title', defaultTitle)) + "</title>\n" + newalertsxml += "<address>" + entry.get('link', defaultLink) + "</address>\n" + newalertsxml += "<date>" + entrydate.isoformat() + "</date>\n" + newalertsxml += "<summary>" + stripXML(entry.get('description', defaultSummary)) + "</summary></alert>\n" + newalertsxml += "</alerts>" + + return xml.etree.ElementTree.XML(newalertsxml) + +def stripXML(data): + elementsRemoved = re.sub("<.*?>","", data) + entitiesRemoved = re.sub("&.*?;", " ", elementsRemoved) + asciiEncoded = entitiesRemoved.encode('ASCII', 'replace') + returnData = asciiEncoded.replace('&', 'and') + return returnData + + +# Testing +# print xml.etree.ElementTree.tostring(getNewAlerts("http://www.engadget.com/rss.xml", "2007-02-07T17:11:14")) +# +# +# today = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) +# data2 = getNewAlerts("http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml", today.isoformat()) +# print xml.etree.ElementTree.tostring(data2) +# +# print "1st call returned", len(data.findall("./{http://tuscany.apache.org/samples/alerter}alert")), "elements" +# print "2nd call returned", len(data2.findall("./{http://tuscany.apache.org/samples/alerter}alert")), "elements" + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/sample.alerter.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/sample.alerter.composite new file mode 100644 index 0000000000..21c4ee1093 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.alerter/sample.alerter.composite @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.alerter"> + + <service name="AlerterService"> + <binding.rest/> + <reference>AlertCheckerComponent</reference> + </service> + + <component name="AlertCheckerComponent"> + <implementation.python module="AlertCheckerImpl" scope="composite"/> + <reference name="alertConfigService">AlertConfigComponent</reference> + <reference name="rssCheckerService">RSSCheckerComponent</reference> + <reference name="popCheckerService">POPCheckerComponent</reference> + </component> + + <component name="RSSCheckerComponent"> + <implementation.python module="RSSCheckerImpl" scope="composite"/> + </component> + + <component name="POPCheckerComponent"> + <!--implementation.ruby script="POPCheckerImpl.rb" scope="stateless"/--> + <implementation.python module="POPCheckerImpl" scope="composite"/> + </component> + + <component name="AlertConfigComponent"> + <implementation.python module="AlertConfigImpl" scope="composite"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/Alerter.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/Alerter.xsd new file mode 100644 index 0000000000..c59460995d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/Alerter.xsd @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<schema targetNamespace="http://tuscany.apache.org/samples/alerter"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:ns="http://tuscany.apache.org/samples/alerter"> + <element name="alerts" type="ns:alerts"/>
+ + <complexType name="alert"> + <sequence> + <element name="title" type="string"/>
+ <element name="summary" type="string"/> + <element name="address" type="anyURI" maxOccurs="1" minOccurs="1"/> + <element name="date" type="string" maxOccurs="1" minOccurs="1"/> + </sequence>
+ <attribute name="sourceid" type="string" use="optional"/>
+ </complexType> + + <complexType name="alerts"> + <sequence> + <element name="alert" type="ns:alert" maxOccurs="unbounded" minOccurs="0" /> + </sequence>
+ </complexType>
+ + <element name="config" type="ns:config"/>
+ <element name="source" type="ns:source"/>
+ + <complexType name="source"> + <sequence> + <element name="name" type="string" maxOccurs="1" minOccurs="1"/>
+ <element name="address" type="anyURI" maxOccurs="1" minOccurs="1"/>
+ <element name="lastChecked" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="feedAddress" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popServer" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popUsername" type="string" maxOccurs="1" minOccurs="0"/>
+ <element name="popPassword" type="string" maxOccurs="1" minOccurs="0"/>
+ <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence>
+ <attribute name="id" type="string" use="optional"/>
+ <attribute name="type" use="required">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="rss"/>
+ <enumeration value="pop"/> + <enumeration value="nntp"/> + </restriction>
+ </simpleType>
+ </attribute> + </complexType> + + <complexType name="config"> + <sequence> + <element name="source" type="ns:source" maxOccurs="unbounded" minOccurs="0"/>
+ </sequence>
+ </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/HTMLDisplayImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/HTMLDisplayImpl.py new file mode 100644 index 0000000000..0122701063 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/HTMLDisplayImpl.py @@ -0,0 +1,379 @@ +# 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. +# +# + + +import xml.etree.ElementTree, datetime, os.path, os + +ns = "./{http://tuscany.apache.org/samples/alerter}" + +def getSavedAlerts(): + + # Set up some default config data + alertsData = "<alerts xmlns=\"http://tuscany.apache.org/samples/alerter\">\n</alerts>" + + if os.path.isfile(os.environ['TUSCANY_SCACPP_ROOT']+"/sample.display/alerts.xml"): + # Retrieve the configuration from a file + f = open(os.environ['TUSCANY_SCACPP_ROOT']+"/sample.display/alerts.xml") + try: + alertsData = f.read() + finally: + f.close() + + alertsElem = xml.etree.ElementTree.XML(alertsData) + + return alertsElem + +def saveAlerts(alertsElem): + alertsData = xml.etree.ElementTree.tostring(alertsElem) + + # Save the configuration to a file + f = open(os.environ['TUSCANY_SCACPP_ROOT']+"/sample.display/alerts.xml", "w") + + if not f: + print "Failed to open alerts file for writing" + try: + f.write(alertsData) + finally: + f.close() + + +def updateAllAlertsHTMLTable (): + + alertsElem = getSavedAlerts() + + # Use the alertService reference + newAlertsElem = alertService.getAllNewAlerts() + #newAlertsElem = getAllNewAlerts(); # For testing + + for alert in newAlertsElem.findall(ns+"alert"): + + alert.attrib["unread"]="True" + alertsElem.append(alert) + + return generateHTMLTable(alertsElem) + + +def updateSourceAlertsHTMLTable (sourceId): + + alertsElem = getSavedAlerts() + + # Use the alertService reference + newAlertsElem = alertService.getNewAlerts(sourceId); + #newAlertsElem = getAllNewAlerts(); # For testing + + for alert in newAlertsElem.findall(ns+"alert"): + + alert.attrib["unread"]="True" + alertsElem.append(alert) + + return generateHTMLTable(alertsElem) + + + +def generateHTMLTable (alertsElem): + + returnData = "<TABLE border=\"0\">" + + # If we have more than x alerts, clear out any that have been read + # x is determined by the showNumberOfReadAlerts property + alerts = alertsElem.findall(ns+"alert") + if len(alerts) > int(showNumberOfReadAlerts): + for alert in alerts: + if alert.attrib["unread"]!="True": + alertsElem.remove(alert) + + alertIDNumber = 0 + for alert in alertsElem.findall(ns+"alert"): + + date = datetime.datetime.strptime(alert.find(ns+"date").text, "%Y-%m-%dT%H:%M:%S") + alertID = "alert_"+str(alertIDNumber) + alert.attrib["id"]= alertID + alertIDNumber += 1 + + returnData += "<TR class=\"source_" + returnData += alert.attrib["sourceid"] + returnData += " clickable\" onclick=\"displayAlert('" + address = alert.find(ns+"address").text + if address != None: + returnData += address + returnData += "', '"+alertID+"')\"><TD><SPAN id=\""+alertID+"\" class=\"" + if alert.attrib["unread"] == "True": + returnData += "unread_title" + else: + returnData += "read_title" + returnData += "\">" + title = alert.find(ns+"title").text + noOfChars = 75-len(title) + + if noOfChars>0: + returnData += title + returnData += "</SPAN><SPAN class=\"summary\"> - " + returnData += alert.find(ns+"summary").text[0:noOfChars] + returnData += "...</SPAN></TD><TD>" + else: + returnData += title[0:80] + returnData += "</SPAN></TD><TD>" + + returnData += date.strftime("%d/%m/%Y %I:%M %p") + returnData += "</TD></TR>\n" + + returnData += "</TABLE>" + + saveAlerts(alertsElem) + #print xml.etree.ElementTree.tostring(alertsElem) + return returnData + +def readAlert (alertID): + + alertsElem = getSavedAlerts() + + returnData = "" + for alert in alertsElem.findall(ns+"alert"): + + if alert.attrib["id"]==alertID: + alert.attrib["unread"] = "False" + + saveAlerts(alertsElem) + + srcType = getSourceType(alert.attrib["sourceid"]) + + if srcType=="pop": + returnData += "<PRE>" + returnData += alert.find(ns+"summary").text + returnData += "</PRE>" + return returnData + + return + +def getSourceType(sourceid): + # Use the alertService reference + alertSources = alertService.getAlertSources() + #alertSources = getAlertSources() #testing + + for source in alertSources.findall(ns+"source"): + + if sourceid == source.attrib["id"]: + return source.attrib["type"] + + return "none" + + +def getAlertSourcesHTMLTable(): + + returnData = "<TABLE border=\"0\">\n" + + # Use the alertService reference + alertSources = alertService.getAlertSources() + #alertSources = getAlertSources() #testing + + srcIdList = [] + + for source in alertSources.findall(ns+"source"): + + srcId = source.attrib["id"] + srcIdList.append(srcId) + srcType = source.attrib["type"] + + # Write out the source data row + returnData += "<TR CLASS=\"source_" + returnData += srcId + returnData += "\"><TD CLASS=\"clickable\" ONCLICK=\"displayAlert('" + returnData += source.find(ns+"address").text + returnData += "', '')\">" + returnData += "<IMG SRC=\"" + returnData += srcType + returnData += ".png\"/> " + returnData += source.find(ns+"name").text + returnData += "</TD><TD CLASS=\"clickable link\" ONCLICK=\"getAlerts('" + returnData += srcId + returnData += "')\">Update Alerts</TD><TD CLASS=\"clickable link\" ONCLICK=\"showEditSource('" + returnData += srcId + returnData += "')\">Edit Source</TD><TD CLASS=\"clickable link\" ONCLICK=\"deleteSource('" + returnData += srcId + returnData += "')\">Delete Source</TD></TR>\n" + + # Now write out the row that gets shown when "edit" is pressed + returnData += "<TR ID=\"edit_source_" + returnData += srcId + returnData += "\" CLASS=\"hidden source_" + returnData += srcId + returnData += "\"><TD COLSPAN=\"4\"><TABLE CLASS=\"sourceDetailsTable\"><TR><TD>Source name:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_name\" TYPE=\"TEXT\" SIZE=\"50\" VALUE=\"" + returnData += source.find(ns+"name").text + returnData += "\"/></TR><TR><TD>Source address:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_address\" TYPE=\"TEXT\" SIZE=\"50\" VALUE=\"" + returnData += source.find(ns+"address").text + returnData += "\"/></TR>" + if srcType=="rss": + returnData += "<TR><TD>Feed address:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_feedAddress\" TYPE=\"TEXT\" SIZE=\"50\" VALUE=\"" + returnData += source.find(ns+"feedAddress").text + returnData += "\"/></TR>" + elif srcType=="pop": + returnData += "<TR><TD>POP3 server:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_popServer\" TYPE=\"TEXT\" SIZE=\"50\" VALUE=\"" + returnData += source.find(ns+"popServer").text + returnData += "\"/></TR>" + returnData += "<TR><TD>Username:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_popUsername\" TYPE=\"TEXT\" SIZE=\"50\" VALUE=\"" + returnData += source.find(ns+"popUsername").text + returnData += "\"/></TD></TR>" + returnData += "<TR><TD>Password:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_popPassword\" TYPE=\"PASSWORD\" SIZE=\"50\" VALUE=\"" + returnData += source.find(ns+"popPassword").text + returnData += "\"/></TD></TR>" + returnData += "<TR><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_type\" TYPE=\"HIDDEN\" VALUE=\"" + returnData += srcType + returnData += "\"/><INPUT TYPE=\"BUTTON\" VALUE=\"Update\" ONCLICK=\"updateSource('" + returnData += srcId + returnData += "')\"><INPUT TYPE=\"BUTTON\" VALUE=\"Cancel\" ONCLICK=\"hideEditSource('" + returnData += srcId + returnData += "')\"></TR></TABLE></TD></TR>" + + # Get the first unused srcId + srcId = "0" + while srcId in srcIdList: + srcId = str(int(srcId)+1) + + # Now write out the "add new source" row + returnData += "<TR CLASS=\"source_" + returnData += srcId + returnData += "\"><TD COLSPAN=\"4\" CLASS=\"clickable link\" ONCLICK=\"showAddNewSource('" + returnData += srcId + returnData += "')\">Add new Alert Source</TD></TR>" + # Add the (initially hidden) new source details row + returnData += "<TR ID=\"add_source_" + returnData += srcId + returnData += "\"CLASS=\"hidden source_" + returnData += srcId + returnData += "\"><TD COLSPAN=\"4\"><TABLE CLASS=\"sourceDetailsTable\"><TR><TD>Source name:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_name\" TYPE=\"TEXT\" SIZE=\"50\"/></TD></TR><TR><TD>Source address:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_address\" TYPE=\"TEXT\" SIZE=\"50\"/></TD></TR><TR><TD>Source type:</TD><TD><SELECT ID=\"source_" + returnData += srcId + returnData += "_type\" ONCHANGE=\"showSourceType('" + returnData += srcId + returnData += "')\"><OPTION value=\"rss\" selected=\"selected\">RSS/Atom feed</OPTION>" + returnData += "<OPTION value=\"pop\">POP3 Email</OPTION></SELECT></TD></TR>" + # Section for RSS feeds + returnData += "<TR ID=\"add_rss_source\"><TD COLSPAN=\"2\"><TABLE CLASS=\"sourceDetailsTable\"><TR><TD>Feed address:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_feedAddress\" TYPE=\"TEXT\" SIZE=\"50\"/></TD></TR></TABLE></TD></TR>" + # Section for POP3 email + returnData += "<TR ID=\"add_pop_source\" CLASS=\"hidden\"><TD COLSPAN=\"2\"><TABLE CLASS=\"sourceDetailsTable\"><TR><TD>POP3 server:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_popServer\" TYPE=\"TEXT\" SIZE=\"50\"/></TR>" + returnData += "<TR><TD>Username:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_popUsername\" TYPE=\"TEXT\" SIZE=\"50\"/></TD></TR>" + returnData += "<TR><TD>Password:</TD><TD><INPUT ID=\"source_" + returnData += srcId + returnData += "_popPassword\" TYPE=\"PASSWORD\" SIZE=\"50\"/></TD></TR></TABLE></TD></TR>" + # Last row for buttons + returnData += "<TR><TD><INPUT TYPE=\"BUTTON\" VALUE=\"Add\" ONCLICK=\"addSource('" + returnData += srcId + returnData += "')\"><INPUT TYPE=\"BUTTON\" VALUE=\"Cancel\" ONCLICK=\"hideAddNewSource('" + returnData += srcId + returnData += "')\"></TD></TR></TABLE></TD></TR>" + returnData += "</TABLE>\n" + return returnData + + +def deleteAlertSource (sourceId): + # Use the alertService reference + alertService.removeAlertSource(sourceId) + + + # Remove all alerts with this sourceid + alertsElem = getSavedAlerts() + for alert in alertsElem.findall(ns+"alert"): + if alert.attrib["sourceid"]==sourceId: + alertsElem.remove(alert) + + saveAlerts(alertsElem) + +def addAlertSource(alertSourceElem): + if xml.etree.ElementTree.iselement(alertSourceElem): + # Use the alertService reference + alertService.addAlertSource(alertSourceElem) + return + +def updateAlertSource(alertSourceElem): + + if xml.etree.ElementTree.iselement(alertSourceElem): + + alertsElem = getSavedAlerts() + + # Get the sourceid + sourceId = alertSourceElem.attrib["id"] + + # Remove all alerts with this sourceid - they may have changed + for alert in alertsElem.findall(ns+"alert"): + if alert.attrib["sourceid"]==sourceId: + alertsElem.remove(alert) + + # Use the alertService reference to update the config + alertService.updateAlertSource(alertSourceElem) + + saveAlerts(alertsElem) + + return + + +# # For testing +# showNumberOfReadAlerts = 3 +# +# def getAllNewAlerts (): +# +# data = "<alerts xmlns=\"http://tuscany.apache.org/samples/alerter\">" +# +# data += "<alert sourceid=\"0\" id=\"alert_0\"><title>Arrests over 'terror kidnap plot'</title>" +# data += "<summary>Anti-terror police arrest eight people in Birmingham over an alleged plot to kidnap a member of the armed forces.</summary>" +# data += "<address>http://news.bbc.co.uk/go/rss/-/1/hi/uk/6315989.stm</address><date>2007-01-31T15:34:18</date></alert>" +# +# data += "</alerts>" +# +# return xml.etree.ElementTree.XML(data) +# +# print getAlertsHTMLTable () + "\n" +# +# readAlert("http://news.bbc.co.uk/go/rss/-/1/hi/uk/6315989.stm") +# +# print getAlertsHTMLTable () + "\n" +# +# def getAlertSources (): +# +# data = "<config xmlns=\"http://tuscany.apache.org/samples/alerter\">" +# data += "<source id=\"0\" type=\"rss\"><name>BBC News</name>" +# data += "<address>http://news.bbc.co.uk/</address>" +# data += "<lastChecked>2007-02-02T10:08:40</lastChecked>" +# data += "<feedAddress>http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml</feedAddress></source>" +# data += "</config>" +# return xml.etree.ElementTree.XML(data) +# +# print getAlertSourcesHTMLTable() diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/Makefile.am new file mode 100644 index 0000000000..6ac781c7df --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/AlertAggregator/deploy +compositedir=$(deploydir)/sample.display + +composite_DATA = *.composite *.py *.xsd +EXTRA_DIST = *.composite *.py *.xsd + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/sample.display.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/sample.display.composite new file mode 100644 index 0000000000..593c53c15f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/AlertAggregator/sample.display/sample.display.composite @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.display"> + + <service name="HTMLDisplayService"> + <binding.rest/> + <reference>HTMLDisplayComponent</reference> + </service> + + <component name="HTMLDisplayComponent"> + <implementation.python module="HTMLDisplayImpl" scope="composite"/> + <reference name="alertService">AlerterService</reference> + <property name="showNumberOfReadAlerts">20</property> + </component> + + <reference name="AlerterService"> + <binding.rest/> + </reference> + +</composite>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/COPYING b/sca-cpp/branches/cpp-contrib/contrib/samples/COPYING new file mode 100755 index 0000000000..6b0b1270ff --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/COPYING @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/ChangeLog b/sca-cpp/branches/cpp-contrib/contrib/samples/ChangeLog new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/ChangeLog diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/Makefile.am new file mode 100644 index 0000000000..95045e0be6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/CppBigBank/deploy +SUBDIRS = bigbank.account bigbank.client bigbank.phpwsclient +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/README b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/README new file mode 100644 index 0000000000..341db17b63 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/README @@ -0,0 +1,26 @@ +Tuscany SCA for C++ Samples - C++ BigBank Sample +=============================================== + +This sample implements the "Simplified BigBank" scenario. A whitepaper +describing the scenario based on the SCA 0.9 Assembly specification can be +found here. This sample uses multiple C++ components, calls out to an +external Web Service via a reference, exposes the service as a Web Service +and also provides a PHP based client. + +There are three sub projects in this workspace: + - bigbank.account + This contains the source code and SCDL artifacts for the SCA BigBank + composite implementing the account services. + + - bigbank.client + A sample client which does a local call to the BigBank service. + + - bigbank.phpclient + A sample PHP client which calls the BigBank Web service and then + deconstructs and displays the result by using the SDO for PHP extension. + +Additionally, there is the bigbank.app.composite file. This describes the +configuration of the SCA BigBank composite deployed to the SCA runtime. + +See the README.html file for instructions to build and run this sample + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/README.html new file mode 100644 index 0000000000..4720dd7b57 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/README.html @@ -0,0 +1,389 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - C++ BigBank Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - C++ BigBank Sample</H1> + + <P>This sample implements the "Simplified BigBank" scenario. A whitepaper describing + the scenario based on the SCA 0.9 Assembly specification can be found + <A HREF="http://www.osoa.org/display/Main/SCA+-+Previously+Published+Specifications">here</A>. + This sample uses multiple C++ components, calls out to an external Web Service via a reference, + exposes the service as a Web Service and also provides a PHP based client. + </P> + <P>There are three sub projects in this workspace:</P> + <UL> + <LI>bigbank.account<BR/> + This contains the source code and SCDL artifacts for the SCA BigBank + composite implementing the account services. + </LI> + <LI>bigbank.client<BR/> + A sample client which does a local call to the BigBank service. + </LI> + <LI>bigbank.phpclient<BR/> + A sample PHP client which calls the BigBank Web service and then deconstructs + and displays the result by using the + <A HREF="http://www.osoa.org/display/PHP/SOA+PHP+Homepage">SDO for PHP extension</A>. + <P>This is a pair of very simple PHP scripts to demonstrate how the Accounts service + that the C++ Big Bank sample exposes can be used from within the PHP scripting + language. + </P> + <P>bigwelcome.php<BR/> + A bootstrap script that shows a form and allows the user to press a button + in order to invoke the bigaccount.php script + </P> + <P>bigaccount.php<BR/> + Makes a call to a locally installed BigBank Accounts service. The script + shows how to use PHP SDO and SOAP extensions to construct the call + and interpret the result. + </P> + </LI> + </UL> + <P>Additionally, there is the bigbank.app.composite file. This describes the + configuration of the SCA BigBank composite deployed to the SCA runtime. + </P> + + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the C++ samples on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the C++ BigBank sample on Linux and Mac OS X:</A></LI> + <UL> + <LI><A HREF="#linuxbasic">Running the basic client</A></LI> + <LI><A HREF="#linuxphp">Installing and running the PHP web client</A></LI> + </UL> + <LI><A HREF="#winbld">Building the C++ BigBank sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the C++ BigBank sample on Windows:</A></LI> + <UL> + <LI><A HREF="#winbasic">Running the basic client</A></LI> + <LI><A HREF="#winphp">Installing and running the PHP web client</A></LI> + </UL> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the C++ samples on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>Build the C++ samples with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --prefix=$TUSCANY_SCACPP/samples --enable-static=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/CppBigBank</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the C++ BigBank sample on Linux and Mac OS X</H2></A> + <A NAME="linuxbasic"><H3>BigBank with basic client</H3></A> + <OL> + <LI>The C++ BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/CppExtension.html">C++ Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/CppBigBank/deploy/bigbank.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + <A NAME="linuxphp"><H3>BigBank with PHP web client</H3></A> + <OL> + <LI>The C++ BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/CppExtension.html">C++ Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Ensure you have enabled Axis2/C to run Tuscany SCA services. Follow the instructions + found <A HREF="../../doc/Axis2CWSExtension.html#deploy">here</A>. + </LI> + <LI>Start the Axis2/C simple http server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/CppBigBank/deploy/bin + </LI> + <LI>./runwsserver.sh</LI> + </OL> + </LI> + <LI>To run the php scripts requires some configuration and setup of a php runtime with + the SDO and SimpleXML extensions enabled. The bits you will need are: + <UL> + <LI><A HREF="http://httpd.apache.org/">Apache web server</A> (tested with version 2.0.55)</LI> + <LI><A HREF="http://www.php.net/downloads.php">PHP 5</A> (tested with version 5.1.6)</LI> + <LI><A HREF="http://pecl.php.net/package/sdo">PHP SDO</A> (tested with version 1.0.3)</LI> + </UL> + <P>Follow + <A HREF="http://livedocs.phpdoc.info/index.php?l=en&q=ref.sdo">these instructions</A> to + install SDO and DAS. + </P> + </LI> + <LI>You need to configure Apache to run PHP of course. This is well documented but this + is what to put at the end of httpd.conf: + <PRE># PHP5 Support +LoadModule php5_module "/home/php/php5.1.6/php5apache2.so" +AddType application/x-httpd-php .php + +# configure the path to php.ini +PHPIniDir "/home/php/php5.1.6"</PRE> + </LI> + <LI>Copy the <tuscany_sca_install_dir>/samples/CppBigBank/bigbank.phpwsclient + directory to your Apache document root directory (by default this is named 'htdocs'). + </LI> + <LI>Finally, start your Apache web server. + </LI> + <LI>Run the PHP web client by pointing your browser at + <A HREF="http://localhost/bigbank.phpwsclient/welcome.php">http://localhost/bigbank.phpwsclient/welcome.php</A>. + You should now be able to press the "GetAccount" button and see the values + returned from the BigBank SCA application. + </LI> + + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the C++ BigBank sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. + The build command will call vcvars32 to set the environment. Ensure the + directory containing this is on your path. This will be where you + installed the compiler. + </LI> + <LI>Build the source, either via the Visual Studio Express projects under + <tuscany_sca_install_dir>\samples\CppBigBank\VSExpress\CppBigBank.sln or via the command-line build file + found at <tuscany_sca_install_dir>\samples\CppBigBank\VSExpress\CppBigBank\build.bat + which will build and deploy the samples. + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the C++ BigBank sample on Windows</H2></A> + <A NAME="winbasic"><H3>BigBank with basic client</H3></A> + <OL> + <LI>The C++ BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/CppExtension.html">C++ Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\CppBigBank\deploy\bigbank.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </OL> + <A NAME="winphp"><H3>BigBank with PHP web client</H3></A> + <OL> + <LI>The C++ BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/CppExtension.html">C++ Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Ensure you have enabled Axis2/C to run Tuscany SCA services. Follow the instructions + found <A HREF="../../doc/Axis2CWSExtension.html#deploy">here</A>. + </LI> + <LI>Start the Axis2/C simple http server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\CppBigBank\deploy\bigbank.account + </LI> + <LI>runwsserver.bat</LI> + </OL> + </LI> + <LI>To run the php scripts requires some configuration and setup of a php runtime with + the SDO and SimpleXML extensions enabled. The bits you will need are: + <UL> + <LI><A HREF="http://httpd.apache.org/">Apache web server</A> (tested with version 2.0.55)</LI> + <LI><A HREF="http://www.php.net/downloads.php">PHP 5</A> (tested with version 5.1.6)</LI> + <LI><A HREF="http://pecl.php.net/package/sdo">PHP SDO</A> (tested with version 1.0.3)</LI> + </UL> + <P>You can get Windows binary builds from + <A HREF="http://www.php.net/downloads.php">http://www.php.net/downloads.php</A>. + For SDO you need two dlls as follows: + </P> + <UL> + <LI><A HREF="http://pecl4win.php.net/ext.php/php_sdo.dll">php_sdo.dll</A></LI> + <LI><A HREF="http://pecl4win.php.net/ext.php/php_sdo_das_xml.dll">php_sdo_das_xml.dll</A></LI> + </UL> + <P>Copy these to the php5.1.6\ext dir ( php_soap.dll is already there) and add the + following to php.ini file (having already renamed php.ini-recommended to php.ini + of course) + <PRE>extension=php_soap.dll +extension=php_sdo.dll +extension=php_sdo_das_xml.dll</PRE> + I also changed the extension_dir directive to point to my extensions directory: + <PRE>extension_dir="C:\php5.1.6\ext"</PRE> + </P> + <P>Asking PHP to list what modules are active gives the following: + <PRE>C:\php5.1.6>php -m +[PHP Modules] +bcmath +calendar +com_dotnet +ctype +date +dom +ftp +hash +iconv +libxml +odbc +pcre +Reflection +sdo +sdo_das_xml +session +SimpleXML +soap +SPL +standard +tokenizer +wddx +xml +xmlreader +xmlwriter +zlib + +[Zend Modules]</PRE> + Of particular relevance to these scripts note that soap, sdo and sdo_das_xml are active. + </P> + </LI> + <LI>You need to configure Apache to run PHP of course. This is well documented but this + is what to put at the end of httpd.conf: + <PRE># PHP5 Support +LoadModule php5_module "C:\php5.1.6\php5apache2.dll" +AddType application/x-httpd-php .php + +# configure the path to php.ini +PHPIniDir "C:\php5.1.6"</PRE> + </LI> + <LI>Copy the <tuscany_sca_install_dir>\samples\CppBigBank\bigbank.phpwsclient + directory to your Apache document root directory (by default this is named 'htdocs'). + </LI> + <LI>Finally, start your Apache web server. + </LI> + <LI>Run the PHP web client by pointing your browser at + <A HREF="http://localhost/bigbank.phpwsclient/welcome.php">http://localhost/bigbank.phpwsclient/welcome.php</A>. + You should now be able to press the "GetAccount" button and see the values + returned from the BigBank SCA application. + </LI> + </OL> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataService.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataService.h new file mode 100644 index 0000000000..64d093ac6f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataService.h @@ -0,0 +1,63 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <string> + +#include "commonj/sdo/SDO.h" + +namespace services +{ + namespace accountdata + { + + /** + * AccountDataService business interface + */ + class AccountDataService + { + public: + + // CheckingAccount is a data object containing + // string accountNumber + // float balance + + virtual commonj::sdo::DataObjectPtr /* CheckingAccount*/ getCheckingAccount( + const std::string id) = 0; + + // SavingsAccount is a data object containing + // string accountNumber + // float balance + + virtual commonj::sdo::DataObjectPtr /* SavingsAccount */ getSavingsAccount( + const std::string id) = 0; + + // StockAccount is a data object containing + // string accountNumber + // string symbol + // int quantity + + virtual commonj::sdo::DataObjectPtr /* StockAccount */ getStockAccount ( + const std::string id) = 0; + + }; + + } // End accountdata +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.componentType new file mode 100644 index 0000000000..b1cab9e1f9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.componentType @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="AccountDataService"> + <interface.cpp header="AccountDataService.h"/> + </service> + +</componentType> +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.cpp new file mode 100644 index 0000000000..2deee17eb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.cpp @@ -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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "commonj/sdo/SDO.h" +#include "osoa/sca/sca.h" + +#include "AccountDataServiceImpl.h" + +using namespace std; +using namespace commonj::sdo; +using namespace osoa::sca; + +/** + * AccountDataServiceImpl component implementation + */ + +namespace services +{ + namespace accountdata + { + + DataObjectPtr /* CheckingAccount*/ + AccountDataServiceImpl::getCheckingAccount(const string id) + { + try { + + DataFactoryPtr factory = ComponentContext::getCurrent().getDataFactory(); + + DataObjectPtr newaccount = + factory->create("http://www.bigbank.com/AccountService","CheckingAccount"); + + char* name = new char[id.size() + 10]; + strcpy(name,id.c_str()); + strcat(name,"_CHA12345"); + + newaccount->setCString("accountNumber",name); + + delete name; + + newaccount->setFloat("balance",1500.0f); + + return newaccount; + + } + catch (SDORuntimeException&) + { + return 0; + } + } + + + + DataObjectPtr /* SavingsAccount */ + AccountDataServiceImpl::getSavingsAccount(const string id) + { + try { + + DataFactoryPtr factory = ComponentContext::getCurrent().getDataFactory(); + + DataObjectPtr newaccount = + factory->create("http://www.bigbank.com/AccountService","SavingsAccount"); + + char* name = new char[id.size() + 10]; + strcpy(name,id.c_str()); + strcat(name,"_SAA12345"); + + newaccount->setCString("accountNumber",name); + + delete name; + + newaccount->setFloat("balance",1500.0f); + + return newaccount; + + } + catch (SDORuntimeException&) + { + return 0; + } + } + + + DataObjectPtr /* StockAccount */ + AccountDataServiceImpl::getStockAccount (const string id) + { + try { + + DataFactoryPtr factory = ComponentContext::getCurrent().getDataFactory(); + + DataObjectPtr newaccount = + factory->create("http://www.bigbank.com/AccountService","StockAccount"); + + char* name = new char[id.size() + 10]; + strcpy(name,id.c_str()); + strcat(name,"_STA12345"); + + newaccount->setCString("accountNumber",name); + + delete name; + + newaccount->setCString("symbol","IBM"); + + newaccount->setInt("quantity",100); + + return newaccount; + + } + catch (SDORuntimeException&) + { + return 0; + } + } + + } // End accountdata +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.h new file mode 100644 index 0000000000..9312175540 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountDataServiceImpl.h @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include "AccountDataService.h" + +namespace services +{ + namespace accountdata + { + + /** + * AccountDataServiceImpl component implementation class + */ + class AccountDataServiceImpl : public AccountDataService + { + public: + + // CheckingAccount is a data object containing + // string accountNumber + // float balance + + virtual commonj::sdo::DataObjectPtr /* CheckingAccount*/ getCheckingAccount( + const std::string id); + + // SavingsAccount is a data object containing + // string accountNumber + // float balance + + virtual commonj::sdo::DataObjectPtr /* SavingsAccount */ getSavingsAccount( + const std::string id); + + // StockAccount is a data object containing + // string accountNumber + // string symbol + // int quantity + + virtual commonj::sdo::DataObjectPtr /* StockAccount */ getStockAccount ( + const std::string id); + + }; + + } // End accountdata +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountService.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountService.h new file mode 100644 index 0000000000..85337d37a9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountService.h @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <string> + +#include "commonj/sdo/SDO.h" + +namespace services +{ + namespace account + { + + /** + * AccountService business interface + */ + class AccountService + { + public: + + // The account report data object has one many-valued + // property "accountSummaries", containing the following + // properties: + // string accountNumber + // string accountType + // float balance. + + virtual commonj::sdo::DataObjectPtr /*AccountReport*/ + getAccountReport(const std::string customerID) = 0; + + }; + + } // End account +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountService.wsdl new file mode 100644 index 0000000000..b83c453462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountService.wsdl @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.bigbank.com/AccountService" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.bigbank.com/AccountService" + name="AccountService"> + + <wsdl:types> + <xsd:schema + targetNamespace="http://www.bigbank.com/AccountService" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="getAccountReport"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" + type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="getAccountReportResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" + type="tns:AccountReport" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="AccountReport"> + <xsd:sequence> + <xsd:element name="checking" + type="tns:CheckingAccount" maxOccurs="unbounded" /> + <xsd:element name="savings" + type="tns:SavingsAccount" maxOccurs="unbounded" /> + <xsd:element name="stocks" type="tns:StockAccount" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="getAccountReportRequest"> + <wsdl:part element="tns:getAccountReport" + name="getAccountReportRequest" /> + </wsdl:message> + + <wsdl:message name="getAccountReportResponse"> + <wsdl:part element="tns:getAccountReportResponse" + name="getAccountReportResponse" /> + </wsdl:message> + + <wsdl:portType name="AccountService"> + <wsdl:operation name="getAccountReport"> + <wsdl:input message="tns:getAccountReportRequest" /> + <wsdl:output message="tns:getAccountReportResponse" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="getAccountReport"> + <soap:operation + soapAction="http://www.bigbank.com/AccountService/getAccountReport" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + + <wsdl:service name="AccountService"> + <wsdl:port binding="tns:AccountServiceSOAP" + name="AccountServiceSOAP"> + <soap:address + location="http://localhost:9090/axis2/services/bigbank.AccountManagementComponent/AccountService" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.componentType new file mode 100644 index 0000000000..b65fa1dc18 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.componentType @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <service name="AccountService"> + <interface.cpp header="AccountService.h"/> + </service> + + <reference name="accountDataService"> + <interface.cpp header="AccountDataService.h"/> + </reference> + + <reference name="stockQuoteService"> + <interface.cpp header="StockQuoteService.h"/> + </reference> + + <property name="currency" type="xs:string">USD</property> + +</componentType> +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.cpp new file mode 100644 index 0000000000..e9fcace81f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.cpp @@ -0,0 +1,132 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "osoa/sca/sca.h" + +#include "AccountServiceImpl.h" +#include "StockQuoteService.h" +#include "AccountDataService.h" + +using namespace std; +using namespace commonj::sdo; +using namespace osoa::sca; +using namespace services::accountdata; +using namespace services::stockquote; + +/** + * AccountServiceImpl component implementation + */ +namespace services +{ + namespace account + { + + DataObjectPtr /*AccountReport**/ + AccountServiceImpl::getAccountReport(const string customerID) + { + ComponentContext theContext = ComponentContext::getCurrent(); + + commonj::sdo::DataFactoryPtr factory = theContext.getDataFactory(); + + commonj::sdo::DataObjectPtr newReport = + factory->create("http://www.bigbank.com/AccountService","AccountReport"); + + // Get the accountDataService service + AccountDataService *dataService = + (AccountDataService*)theContext.getService("accountDataService"); + + // would be better to return a list of accounts - this only + // gets the first of each. + + commonj::sdo::DataObjectPtr checking = + dataService->getCheckingAccount(customerID); + + if (checking != 0) + { + commonj::sdo::DataObjectList& dl = newReport->getList("checking"); + checking->setFloat("balance", + fromUSDollarToCurrency(checking->getFloat("balance"))); + dl.append(checking); + } + + commonj::sdo::DataObjectPtr savings = dataService->getSavingsAccount(customerID); + + if (savings != 0) + { + commonj::sdo::DataObjectList& dl = newReport->getList("savings"); + savings->setFloat("balance", + fromUSDollarToCurrency(savings->getFloat("balance"))); + dl.append(savings); + } + + // Get the stockQuoteService service + StockQuoteService* stockService = + (StockQuoteService*)theContext.getService("stockQuoteService"); + + commonj::sdo::DataObjectPtr stocks = dataService->getStockAccount(customerID); + + if (stocks != 0) + { + commonj::sdo::DataObjectList& dl = newReport->getList("stocks"); + + float value = 10.0f; + try { + value = stockService->getQuote( + stocks->getCString("symbol")); + } + catch (ServiceRuntimeException& e) + { + std::cout << "Fault from stock quote service" << e << std::endl; + } + stocks->setFloat("balance", + fromUSDollarToCurrency(stocks->getInt("quantity") * + value)); + dl.append(stocks); + } + + return newReport; + } + + float AccountServiceImpl::fromUSDollarToCurrency(float value) + { + // Get the "currency" property + ComponentContext myContext = ComponentContext::getCurrent(); + + commonj::sdo::DataObjectPtr properties = myContext.getProperties(); + if (properties) + { + const char* currency = properties->getCString("currency"); + if (currency != 0) + { + std::cout << "Currency is : " << currency << std::endl; + if (!strcmp(currency,"USD")) return value; + if (!strcmp(currency,"EURO")) return 0.8f * value; + } + } + return 0.0f; + } + + } // End account +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.h new file mode 100644 index 0000000000..0c172823fb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/AccountServiceImpl.h @@ -0,0 +1,44 @@ +/** + * + * Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +#include "AccountService.h" + + +namespace services +{ + namespace account + { + + /** + * AccountServiceImpl component implementation class + */ + class AccountServiceImpl: public AccountService + { + public: + + virtual commonj::sdo::DataObjectPtr /*AccountReport*/ + getAccountReport(const std::string customerID); + + private: + + float fromUSDollarToCurrency(float value); + + }; + + } // End account +} // End services + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/Makefile.am new file mode 100644 index 0000000000..e9af461312 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/Makefile.am @@ -0,0 +1,59 @@ +# 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. + +deploydir=$(prefix)/CppBigBank/deploy +compositedir=$(deploydir)/bigbank.account + +BUILT_SOURCES = scagen + +noinst_HEADERS = *.h + +composite_SCRIPTS = runwsserver.sh + +scagen: + java -jar $(TUSCANY_SCACPP)/bin/scagen.jar -dir . -output . + +composite_LTLIBRARIES = libAccount.la +composite_DATA = *.composite *.componentType *.wsdl *.xsd +EXTRA_DIST = *.composite *.componentType *.wsdl *.xsd runwsserver.sh + +dist_libAccount_la_SOURCES = \ +AccountDataServiceImpl.cpp \ +AccountServiceImpl.cpp \ +StockQuoteServiceImpl.cpp + +nodist_libAccount_la_SOURCES = \ +AccountDataServiceImpl_AccountDataService_Proxy.cpp \ +AccountDataServiceImpl_AccountDataService_Wrapper.cpp \ +AccountServiceImpl_accountDataService_Proxy.cpp \ +AccountServiceImpl_AccountService_Proxy.cpp \ +AccountServiceImpl_AccountService_Wrapper.cpp \ +AccountServiceImpl_stockQuoteService_Proxy.cpp \ +StockQuoteServiceImpl_StockQuoteService_Proxy.cpp \ +StockQuoteServiceImpl_StockQuoteService_Wrapper.cpp \ +StockQuoteServiceImpl_webService_Proxy.cpp + +libAccount_la_LIBADD = \ +-L${TUSCANY_SCACPP}/lib \ + -ltuscany_sca \ +-L${TUSCANY_SCACPP}/extensions/cpp/lib \ + -ltuscany_sca_cpp + +INCLUDES = \ + -I$(TUSCANY_SCACPP)/extensions/cpp/include \ + -I$(TUSCANY_SCACPP)/include \ + -I${TUSCANY_SDOCPP}/include diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteService.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteService.h new file mode 100644 index 0000000000..379af5b425 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteService.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +#include <string> + +namespace services +{ + namespace stockquote + { + /** + * StockQuoteService business interface + */ + class StockQuoteService + { + public: + + virtual float getQuote(const std::string symbol) = 0; + + }; + + } // End stockquote +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.componentType new file mode 100644 index 0000000000..6ac2b77255 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.componentType @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright 2005 The Apache Software Foundation or its licensors, as applicable. + + 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. + --> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="StockQuoteService"> + <interface.cpp header="StockQuoteService.h"/> + </service> + + <reference name="webService"> + <interface.cpp header="StockQuoteWebService.h"/> + </reference> + +</componentType> +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.cpp new file mode 100644 index 0000000000..8332730d73 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.cpp @@ -0,0 +1,73 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "osoa/sca/sca.h" +#include "commonj/sdo/SDO.h" + +#include "StockQuoteServiceImpl.h" +#include "StockQuoteWebService.h" + +using namespace std; +using namespace osoa::sca; +using namespace commonj::sdo; + +/** + * StockQuoteServiceImpl component implementation + */ +namespace services { + namespace stockquote { + + // Map the format returned by the StockQuote Web service to + // the format expected in the BigBank application + float StockQuoteServiceImpl::getQuote(const string symbol) + { + ComponentContext myContext = ComponentContext::getCurrent(); + + // Get the StockQuote Web service + StockQuoteWebService* webService = + (StockQuoteWebService*)myContext.getService("webService"); + + // Invoke the service + const string result = webService->GetQuote(symbol); + + float stockPrice = 0.0f; + + // Get the stock price out of the document returned by the StockQuote + // Web service + try + { + XMLHelperPtr xmlHelper = HelperProvider::getXMLHelper(myContext.getDataFactory()); + XMLDocumentPtr stockDoc = xmlHelper->load(result); + if (stockDoc->getRootDataObject()) + { + stockPrice=stockDoc->getRootDataObject()->getFloat("Stock.0/Last"); + } + } + catch (SDORuntimeException& e) + { + std::cout << e << std::endl; + return 0.0f; + } + return stockPrice; + } + + } // End stockquote +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.h new file mode 100644 index 0000000000..9b0ac69b0c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteServiceImpl.h @@ -0,0 +1,36 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +#include "StockQuoteService.h" + +namespace services +{ + namespace stockquote + { + + /** + * StockQuoteServiceImpl component implementation class + */ + class StockQuoteServiceImpl : public StockQuoteService + { + public: + + virtual float getQuote(const std::string symbol); + }; + + } // End stockquote +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteTypes.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteTypes.xsd new file mode 100644 index 0000000000..5bce3a63dc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteTypes.xsd @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + + 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. + --> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="StockQuotes" type="tStockQuotes"/> + <xs:complexType name="tStockQuotes"> + <xs:sequence> + <xs:element name="Stock" type="tStock" minOccurs="0" maxOccurs="unbounded"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> + + <xs:complexType name="tStock"> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="1" name="Symbol" type="xs:string"/> + <xs:element minOccurs="0" maxOccurs="1" name="Last" type="xs:float"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteWebService.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteWebService.h new file mode 100644 index 0000000000..5c32ff8eaa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteWebService.h @@ -0,0 +1,40 @@ +/* + * + * Copyright 2006 The Apache Software Foundation or its licensors, as applicable. + * + * 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. + */ + +#include <string> + +namespace services +{ + namespace stockquote + { + + /** + * StockQuoteWebService business interface + * + * This is the interface of the Web service used to get + * live stock quotes. + */ + class StockQuoteWebService + { + public: + + virtual const std::string GetQuote(const std::string symbol) = 0; + + }; + + } // End stockquote +} // End services diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteWebService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteWebService.wsdl new file mode 100644 index 0000000000..c14f97c87b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/StockQuoteWebService.wsdl @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:s="http://www.w3.org/2001/XMLSchema" + xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" + xmlns:tns="http://www.webserviceX.NET/" + xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" + xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" + targetNamespace="http://www.webserviceX.NET/" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + <wsdl:types> + <s:schema elementFormDefault="qualified" + targetNamespace="http://www.webserviceX.NET/"> + <s:element name="GetQuote"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="symbol" type="s:string" /> + </s:sequence> + </s:complexType> + + </s:element> + <s:element name="GetQuoteResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="GetQuoteResult" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="string" nillable="true" type="s:string" /> + + </s:schema> + </wsdl:types> + <wsdl:message name="GetQuoteSoapIn"> + <wsdl:part name="parameters" element="tns:GetQuote" /> + </wsdl:message> + <wsdl:message name="GetQuoteSoapOut"> + <wsdl:part name="parameters" element="tns:GetQuoteResponse" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpGetIn"> + + <wsdl:part name="symbol" type="s:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpGetOut"> + <wsdl:part name="Body" element="tns:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpPostIn"> + <wsdl:part name="symbol" type="s:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpPostOut"> + + <wsdl:part name="Body" element="tns:string" /> + </wsdl:message> + <wsdl:portType name="StockQuoteSoap"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteSoapIn" /> + <wsdl:output message="tns:GetQuoteSoapOut" /> + </wsdl:operation> + + </wsdl:portType> + <wsdl:portType name="StockQuoteHttpGet"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteHttpGetIn" /> + <wsdl:output message="tns:GetQuoteHttpGetOut" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:portType name="StockQuoteHttpPost"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteHttpPostIn" /> + <wsdl:output message="tns:GetQuoteHttpPostOut" /> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap"> + + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" + style="document" /> + <wsdl:operation name="GetQuote"> + <soap:operation + soapAction="http://www.webserviceX.NET/GetQuote" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="StockQuoteHttpGet" + type="tns:StockQuoteHttpGet"> + <http:binding verb="GET" /> + <wsdl:operation name="GetQuote"> + <http:operation location="/GetQuote" /> + <wsdl:input> + <http:urlEncoded /> + </wsdl:input> + + <wsdl:output> + <mime:mimeXml part="Body" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="StockQuoteHttpPost" + type="tns:StockQuoteHttpPost"> + <http:binding verb="POST" /> + <wsdl:operation name="GetQuote"> + <http:operation location="/GetQuote" /> + + <wsdl:input> + <mime:content type="application/x-www-form-urlencoded" /> + </wsdl:input> + <wsdl:output> + <mime:mimeXml part="Body" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:service name="StockQuote"> + + <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap"> + <soap:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + <wsdl:port name="StockQuoteHttpGet" + binding="tns:StockQuoteHttpGet"> + <http:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + <wsdl:port name="StockQuoteHttpPost" + binding="tns:StockQuoteHttpPost"> + <http:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/bigbank.account.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/bigbank.account.composite new file mode 100644 index 0000000000..7173d584d2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/bigbank.account.composite @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + 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. + --> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.account"> + + <service name="AccountService"> + <interface.wsdl interface="http://www.bigbank.com/AccountService#wsdl.interface(AccountService)"/> + <!-- The endpoint is optional --> + <!-- <binding.ws endpoint="http://www.bigbank.com/AccountService#wsdl.endpoint(AccountService/AccountServiceSOAP)"/> --> + <binding.ws/> + <reference>AccountServiceComponent</reference> + </service> + + <component name="AccountServiceComponent"> + <implementation.cpp library="Account" header="AccountServiceImpl.h"/> + <reference name="accountDataService">AccountDataServiceComponent</reference> + <reference name="stockQuoteService">StockQuoteServiceComponent</reference> + <property name="currency">EURO</property> + </component> + + <component name="AccountDataServiceComponent"> + <implementation.cpp library="Account" header="AccountDataServiceImpl.h"/> + </component> + + <component name="StockQuoteServiceComponent"> + <implementation.cpp library="Account" header="StockQuoteServiceImpl.h"/> + <reference name="webService">StockQuoteWebService</reference> + </component> + + <reference name="StockQuoteWebService"> + <interface.wsdl interface="http://www.webserviceX.NET/#wsdl.interface(StockQuoteSoap)"/> + <binding.ws endpoint="http://www.webserviceX.NET/#wsdl.endpoint(StockQuote/StockQuoteSoap)"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/runwsserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/runwsserver.bat new file mode 100644 index 0000000000..c08a8fc5d9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/runwsserver.bat @@ -0,0 +1,50 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +rem Run the server +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\cpp\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +set APFULLDIR=%~d0%~p0 +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ + +cd %AXIS2C_HOME%\bin +.\axis2_http_server.exe + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/runwsserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/runwsserver.sh new file mode 100755 index 0000000000..047e541360 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.account/runwsserver.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/cpp/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ + +cd $AXIS2C_HOME/bin +./axis2_http_server diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.app.composite new file mode 100644 index 0000000000..5d68e0ae1a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.app.composite @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.app"> + + <component name="bigbank.AccountManagementComponent"> + <implementation.composite name="bigbank.account"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/AccountClient.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/AccountClient.cpp new file mode 100644 index 0000000000..009c2d0c4d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/AccountClient.cpp @@ -0,0 +1,127 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include <iostream> +#include <stdlib.h> + +#include "osoa/sca/sca.h" + +#include "AccountService.h" + +using namespace std; +using namespace commonj::sdo; +using namespace osoa::sca; +using namespace services::account; + +int main(int argc, char* argv[]) +{ + + if (argc != 2) + { + cout << "account_client: Argument must be the name of the account" << endl; + return 0; + } + try + { + + // Locate a service + CompositeContext myContext = CompositeContext::getCurrent(); + AccountService *accountService = + (AccountService*) myContext.locateService("AccountServiceComponent"); + if (accountService == 0) + { + cout << "account_client: Unable to find Account service" << endl; + } + else + { + try + { + // exercise the account service + + DataObjectPtr report = + accountService->getAccountReport(argv[1]); + + XMLHelperPtr xmlHelper = HelperProvider::getXMLHelper(myContext.getDataFactory()); + char* doc = xmlHelper->save(report, report->getType().getURI(), report->getType().getName()); + cout << "XML: " << doc <<endl; + + if (report != 0) + { + unsigned int i; + char balanceStr[20]; + float balance; + + cout << "My Account Report" << endl; + cout << "=================" << endl; + + DataObjectList& stocks = report->getList("stocks"); + + for (i=0;i< stocks.size() ;i++) + { + cout << "Stock Account " << stocks[i]->getCString("accountNumber") << endl; + cout << "Stock Symbol : " << stocks[i]->getCString("symbol") << endl; + cout << " Holding : " << stocks[i]->getCString("quantity") << endl; + balance = stocks[i]->getFloat("balance"); + sprintf(balanceStr,"%.2f",balance); + cout << " Value : " << balanceStr << endl << endl; + } + + DataObjectList& checking = report->getList("checking"); + + for (i=0;i< checking.size() ;i++) + { + cout << "Checking Account " << checking[i]->getCString("accountNumber") << endl; + balance = checking[i]->getFloat("balance"); + sprintf(balanceStr,"%.2f",balance); + cout << " Balance : " << balanceStr << endl << endl; + } + + DataObjectList& savings = report->getList("savings"); + + for (i=0;i< savings.size() ;i++) + { + cout << "Savings Account " << savings[i]->getCString("accountNumber") << endl; + balance = savings[i]->getFloat("balance"); + sprintf(balanceStr,"%.2f",balance); + cout << " Balance : " << balanceStr << endl << endl; + } + + cout << endl; + } + } + catch (SDORuntimeException& e) + { + cout << e << endl; + } + } + + } + catch (ServiceRuntimeException& ex) + { + cout << ex << endl; + } + return 0; +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/Makefile.am new file mode 100644 index 0000000000..cfc5e8a661 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/Makefile.am @@ -0,0 +1,35 @@ +# 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. + +deploydir=$(prefix)/CppBigBank/deploy +clientdir=$(deploydir)/bigbank.client + +client_PROGRAMS = account_client +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh + +account_client_SOURCES = AccountClient.cpp + +account_client_LDADD = -L${TUSCANY_SCACPP}/lib -ltuscany_sca \ + -L${TUSCANY_SCACPP}/extensions/cpp/lib -ltuscany_sca_cpp \ + -L${TUSCANY_SDOCPP}/lib -ltuscany_sdo + + +INCLUDES = -I$(TUSCANY_SCACPP)/extensions/cpp/include \ + -I${TUSCANY_SCACPP}/include \ + -I${TUSCANY_SDOCPP}/include \ + -I../bigbank.account diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/runclient.bat new file mode 100644 index 0000000000..069463ba2d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/runclient.bat @@ -0,0 +1,50 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +rem Run the client +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\cpp\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +set APFULLDIR=%~d0%~p0 +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=bigbank.AccountManagementComponent + +.\AccountClient.exe 1234 + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/runclient.sh new file mode 100755 index 0000000000..1cf924a008 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.client/runclient.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/cpp/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=bigbank.AccountManagementComponent + +./AccountClient 1234 + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/AccountService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/AccountService.wsdl new file mode 100644 index 0000000000..b83c453462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/AccountService.wsdl @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.bigbank.com/AccountService" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.bigbank.com/AccountService" + name="AccountService"> + + <wsdl:types> + <xsd:schema + targetNamespace="http://www.bigbank.com/AccountService" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="getAccountReport"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" + type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="getAccountReportResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" + type="tns:AccountReport" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="AccountReport"> + <xsd:sequence> + <xsd:element name="checking" + type="tns:CheckingAccount" maxOccurs="unbounded" /> + <xsd:element name="savings" + type="tns:SavingsAccount" maxOccurs="unbounded" /> + <xsd:element name="stocks" type="tns:StockAccount" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="getAccountReportRequest"> + <wsdl:part element="tns:getAccountReport" + name="getAccountReportRequest" /> + </wsdl:message> + + <wsdl:message name="getAccountReportResponse"> + <wsdl:part element="tns:getAccountReportResponse" + name="getAccountReportResponse" /> + </wsdl:message> + + <wsdl:portType name="AccountService"> + <wsdl:operation name="getAccountReport"> + <wsdl:input message="tns:getAccountReportRequest" /> + <wsdl:output message="tns:getAccountReportResponse" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="getAccountReport"> + <soap:operation + soapAction="http://www.bigbank.com/AccountService/getAccountReport" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + + <wsdl:service name="AccountService"> + <wsdl:port binding="tns:AccountServiceSOAP" + name="AccountServiceSOAP"> + <soap:address + location="http://localhost:9090/axis2/services/bigbank.AccountManagementComponent/AccountService" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/Makefile.am new file mode 100644 index 0000000000..bdc846e58c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/CppBigBank/deploy +phpwsclientdir=$(deploydir)/bigbank.phpwsclient + +phpwsclient_DATA = *.php *.wsdl README +EXTRA_DIST = *.php *.wsdl README diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/README b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/README new file mode 100644 index 0000000000..d02873e860 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/README @@ -0,0 +1,137 @@ +Big Bank PHP Client +=================== + +Overview +-------- + +This is a pair of very simple PHP scripts to demonstrate how the Accounts service +that the C++ Big Bank sample exposes can be used from within the PHP scripting +language. + +bigwelcome.php + A bootstrap script that shows a form and allows the user to press a button + in order to invoke the bigaccount.php script + +bigaccount.php + Makes a call to a locally installed BigBank Accounts service. The script + shows how to use PHP SDO and SOAP extensions to construct the call + and interpret the result. + +As this is a very simple test client once you have reached bigaccount.php you are done. +So there are no further buttons other than the browser back button. + +Installation +------------ + +This assumes that you have the BigBank sample runnig as a web service in your local +Axis2C container at http://localhost:9090/axis2/services/AccountService + +To run the php scripts requires some configuration and setup of a php runtime with +the SDO and SimpleXML extensions enabled. The bits you will need are: + +Apache web server - http://httpd.apache.org/ (I'm currently at 2.0.55) +PHP 5.1.6 - http://www.php.net/downloads.php (I'm currently at 5.1.6) +PHP SDO - http://pecl.php.net/package/sdo (I'm currently at 1.0.3) + +Windows +------- +If you are on windows you can get binary builds from http://www.php.net/downloads.php. +For SDO you need two dlls as followd + +php_sdo.dll http://pecl4win.php.net/ext.php/php_sdo.dll +php_sdo_das_xml.dll http://pecl4win.php.net/ext.php/php_sdo_das_xml.dll + +I copied these to my php5.1.6/ext dir ( php_soap.dll is already there) + +And added the following to my php.ini file (having already renamed php.ini-recommended to +php.ini of course) + +extension=php_soap.dll +extension=php_sdo.dll +extension=php_sdo_das_xml.dll + +I also changed the extension_dir directive to point to my extensions directory: + +extension_dir="C:/simon/apps/php5.1.6/ext" + +When I ask PHP to list what modules are active in my version of PHP I get the +following + +C:\simon\apps\php5.1.6>php -m +[PHP Modules] +bcmath +calendar +com_dotnet +ctype +date +dom +ftp +hash +iconv +libxml +odbc +pcre +Reflection +sdo +sdo_das_xml +session +SimpleXML +soap +SPL +standard +tokenizer +wddx +xml +xmlreader +xmlwriter +zlib + +[Zend Modules] + +Of particular relevance to these scripts note that soap, sdo and sd_das_xml are active. + +Other Platforms +--------------- + +If your on on another platform, such as Linux, then you will need to compile the +SDO extension. The documentation at the SDO extension page (http://livedocs.phpdoc.info/index.php?l=en&q=ref.sdo) +is currently a bit missleading and needs updating. What you need to do is do a +phpize build of the SDO PECL extension. This is discussed in the SDO documentation +but is also discussed in many other places, for example, http://www.php.net/manual/en/install.pecl.phpize.php. +Here is not the time to go into the details of how to build PHP extensions using +phpize but if you are familar with the process I use the following configure line +on windows. + +cscript configure.js --with-extra-includes=c:\simon\projects\tuscany\php\win32build\include; + c:\simon\apps\libxml2-2.6.23.win32\include; + c:\simon\apps\iconv-1.9.1.win32\include + --with-extra-libs=c:\simon\projects\tuscany\php\win32build\lib; + c:\simon\apps\libxml2-2.6.23.win32\lib; + c:\simon\apps\iconv-1.9.1.win32\lib + --enable-sdo=shared + --enable-soap + +There are no newlines in my command line by the way. I've just included them +here so you can see the command. + +Running +------- + +You need to configure Apache to run PHP of course. This is well documented but this +is what I put at the end of httpd.conf + +# PHP5 Support +LoadModule php5_module "C:/simon/apps/php5.1.6/php5apache2.dll" +AddType application/x-httpd-php .php + +# configure the path to php.ini +PHPIniDir "C:/simon/apps/php5.1.6" + +Having set up Apache all that remains is to + +- put the bigbank.phpwsclient directory in your web server's root documents directory +- start up the Axis2C runtime configured to run BigBank +- point your browser at http://myserver:port/bigbank.phpwsclient/bigwelcome.php + +You should now be able to press the "GetAccount" button and see the values +returned from the BigBank SCA application. diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/bigaccount.php b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/bigaccount.php new file mode 100644 index 0000000000..b9f77d3297 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/bigaccount.php @@ -0,0 +1,113 @@ +<!-- + 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. + +$Rev$ $Date: 2005/12/22 11:33:21 $ +--> +<head> + <title>BigBank Sample</title> +</head> + +<body BGCOLOR="#EFEFEF"> + +<script type="text/javascript"></script> + +<?php + try + { + // In case we want to see what's in the request + //print_r ($_POST); + + // get the entered account name + $accountname = $_POST['accountname']; + + try + { + // configure the SOAP client + $client = new SoapClient("AccountService.wsdl"); + + // make the call but its a wrapped call so we + // can't just do... + // $result = $client->getAccountReport($accountname); + // we have to construct an object hierarchy that matches the + // WSDL request. We can use SDO to do this for us + + // configure SDO based on the WSDL + $xmldas = SDO_DAS_XML::create("AccountService.wsdl"); + + // Get a document that represents the request + // and get the root element + $requestxdoc = $xmldas->createDocument("getAccountReport"); + $requestsdo = $requestxdoc->getRootDataObject(); + + // add the parameter + $requestsdo['customerID'] = $accountname; + + // make the call + $result = $client->getAccountReport($requestsdo); + + // now we have the result as a PHP object + // we can turn this into an SDO but we have to do it manually + // as the SOAP extension won't generate types for us + // automatically just yet + $responsexdoc = $xmldas->createDocument("getAccountReportResponse"); + $responsesdo = $responsexdoc->getRootDataObject(); + + // flesh out the object hierarchy + $account = $responsesdo->createDataObject ('result'); + $checking = $account->createDataObject ('checking'); + $saving = $account->createDataObject ('savings'); + $stocks = $account->createDataObject ('stocks'); + + //copy the data + $checking['accountNumber'] = $result->result->checking->accountNumber; + $checking['balance'] = $result->result->checking->balance; + //etc.. + // This is a bit rubbish as we would want this to happen automatically + + // Now just put the data on the screen + // To do this we don't need to use SDO as you can see but + // it would be really handy if we wanted to pass the XML doc + // onto another service or if we wanted to do some other + // more complex XML manipulation or XPath searches + echo "<h2>Account $accountname</h2>"; + echo "<h2>Checking Account</h2><table>"; + echo "<tr><td>Account Number</td><td> $checking->accountNumber </td></tr>"; + echo "<tr><td>Balance</td><td> $checking->balance </td></tr>"; + echo "</table><h2>Saving Account</h2><table>"; + echo "<tr><td>Account Number</td><td>" . $result->result->savings->accountNumber . "</td></tr>"; + echo "<tr><td>Balance</td><td>" . $result->result->savings->balance . "</td></tr>"; + echo "</table><h2>Stock Account</h2><table>"; + echo "<tr><td>Account Number</td><td>" . $result->result->stocks->accountNumber . "</td></tr>"; + echo "<tr><td>Symbol</td><td>" . $result->result->stocks->symbol . "</td></tr>"; + echo "<tr><td>Quantity</td><td>" . $result->result->stocks->quantity . "</td></tr>"; + echo "<tr><td>Banalce</td><td>" . $result->result->stocks->balance . "</td></tr>"; + echo "</table>"; + } + catch (SoapFault $f) + { + echo "Caught soap exception: \n"; + print_r ( $f ); + } + } + catch ( Exception $e ) + { + echo "Caught exception: \n"; + print_r ( $e ); + + } +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/bigwelcome.php b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/bigwelcome.php new file mode 100644 index 0000000000..32159ddc16 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppBigBank/bigbank.phpwsclient/bigwelcome.php @@ -0,0 +1,44 @@ +<html> +<!-- + 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. + +$Rev$ $Date: 2005/12/22 11:33:21 $ +--> +<head> + <title>BigBank Sample</title> +</head> + +<body BGCOLOR="#EFEFEF"> + +<script type="text/javascript"></script> + +<?php +define('APP_ROOT', $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].'/bigbank.phpwsclient'); +?> + +<h1>Welcome To The BigBank Sample</h1> + + <form action="http://<?php echo APP_ROOT . '/bigaccount.php' ?>" method="POST"> + Please enter your account ID + <input type="text" name="accountname" size="30" value="ED" /> + <button type="submit">GetAccount</button> + </form> + + <div id="statusString"/> +</body> +</html> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/Makefile.am new file mode 100644 index 0000000000..d9d4b499b7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/CppCalculator/deploy +SUBDIRS = sample.calculator sample.calculator.client +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/README b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/README new file mode 100644 index 0000000000..b9dedd2da3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/README @@ -0,0 +1,4 @@ +Tuscany SCA for C++ Samples - C++ Calculator Sample +=================================================== + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/README.html new file mode 100644 index 0000000000..264ba3d881 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/README.html @@ -0,0 +1,176 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - C++ Calculator Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - C++ Calculator Sample</H1> + + <P>This is a very simple sample to show how an SCA composite can wire + together two C++ components to implement a Calculator service and invoke + the service via a local client. + </P> + <P>There are two sub projects in this workspace:</P> + <UL> + <LI>sample.calculator<BR/> + This contains the source code and SCDL artifacts for the SCA Calculator + composite implementing the sample Calculator. + </LI> + <LI>sample.calculator.client<BR/> + A sample client which does a local call to the Calculator service. + </LI> + </UL> + <P>Additionally, there is the sample.calculator.app.composite file. This + describes the configuration of the SCA Calculator composite deployed to the SCA + runtime. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the C++ samples on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the C++ Calculator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the C++ Calculator sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the C++ Calculator sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the C++ samples on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>Build the C++ samples with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --prefix=$TUSCANY_SCACPP/samples --enable-static=no</LI> + <LI>make</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/CppCalculator</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the C++ Calculator sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/CppCalculator/deploy/sample.calculator.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the C++ Calculator sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>You must have set up the environment for Microsoft Visual C++ tools. + The build command will call vcvars32 to set the environment. Ensure the + directory containing this is on your path. This will be where you + installed the compiler. + </LI> + <LI>Build the source, either via the Visual Studio Express projects under + <tuscany_sca_install_dir>\samples\CppCalculator\VSExpress\CppCalculator.sln or via the command-line build file + found at <tuscany_sca_install_dir>\samples\CppCalculator\VSExpress\CppCalculator\build.bat + which will build and deploy the samples. + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the C++ Calculator sample on Windows</H2></A> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\CppCalculator\deploy\sample.calculator.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.app.composite new file mode 100644 index 0000000000..5753b3c593 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.app.composite @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.app"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + +</composite> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/CalculatorClient.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/CalculatorClient.cpp new file mode 100644 index 0000000000..37e9d40f66 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/CalculatorClient.cpp @@ -0,0 +1,150 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> +#include <stdlib.h> + +#include "osoa/sca/sca.h" + +#include "Calculator.h" + +using namespace std; +using namespace osoa::sca; + + +void usage(); +bool IsNumber(const char *p); + +int main(int argc, char* argv[]) +{ + const char *operation; + float arg1 = 0; + float arg2 = 0; + + if (argc == 4) + { + operation = argv[1]; + + if (!IsNumber(argv[2])) + { + cout << "calculator_client: Argument 1 is not a number" << endl; + usage(); + } + else + { + arg1 = atof(argv[2]); + } + + if (!IsNumber(argv[3])) + { + cout << "calculator_client: Argument 2 is not a number" << endl; + usage(); + } + else + { + arg2 = atof(argv[3]); + } + } + else + { + usage(); + } + + try + { + // Locate a service + CompositeContext myContext = CompositeContext::getCurrent(); + Calculator *calcService = (Calculator*) myContext.locateService("CalculatorComponent/CalculatorService"); + if (calcService == 0) + { + cout << "calculator_client: Unable to find Calculator service" << endl; + } + else + { + float result = 0; + if (strcmp(operation, "add") == 0) + { + result = calcService->add(arg1, arg2); + cout << "calculator_client: add(" << arg1 << "," << arg2 << ") = " << result << endl; + } + else + if (strcmp(operation, "sub") == 0) + { + result = calcService->sub(arg1, arg2); + cout << "calculator_client: sub(" << arg1 << "," << arg2 << ") = " << result << endl; + } + else + if (strcmp(operation, "mul") == 0) + { + result = calcService->mul(arg1, arg2); + cout << "calculator_client: mul(" << arg1 << "," << arg2 << ") = " << result << endl; + } + else + if (strcmp(operation, "div") == 0) + { + result = calcService->div(arg1, arg2); + cout << "calculator_client: div(" << arg1 << "," << arg2 << ") = " << result << endl; + } + else + { + cout << "calculator_client: Unrecognized operation: " << operation << endl; + } + } + } + catch (ServiceRuntimeException& ex) + { + cout << "calculator_client: exception caught: " << ex << endl; + } + return 0; +} + +void usage() +{ + cout << "Usage: calculator_client add|sub|mul|div arg1 arg2" << endl; + exit(1); +} + +bool IsNumber (const char *p) +{ + int len = strlen(p); + int pointcount = 0; + + if (!isdigit (p[0]) && p[0] != '-' && p[0] != '+') + { + return false; + } + for (int i = 1; i < len; i++) + { + if (!isdigit (p[i])) + { + if (p[i] == '.') + { + if (pointcount > 0) return false; + pointcount++; + } + else + { + return false; + } + } + } + return true; +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/Makefile.am new file mode 100644 index 0000000000..9782bf5041 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/Makefile.am @@ -0,0 +1,40 @@ +# 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. + +deploydir=$(prefix)/CppCalculator/deploy +clientdir=$(deploydir)/sample.calculator.client + +client_PROGRAMS = calculator_client +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh + +calculator_client_SOURCES = \ +CalculatorClient.cpp + +calculator_client_LDADD = \ +-L${TUSCANY_SCACPP}/lib \ + -ltuscany_sca \ +-L${TUSCANY_SCACPP}/extensions/cpp/lib \ + -ltuscany_sca_cpp \ +-L${TUSCANY_SDOCPP}/lib \ + -ltuscany_sdo + +INCLUDES = \ +-I$(TUSCANY_SCACPP)/extensions/cpp/include \ +-I${TUSCANY_SCACPP}/include \ +-I${TUSCANY_SDOCPP}/include \ +-I../sample.calculator diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/runclient.bat new file mode 100644 index 0000000000..795325ab52 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/runclient.bat @@ -0,0 +1,42 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo using SDO installed at %TUSCANY_SDOCPP% + +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\cpp\bin;%TUSCANY_SDOCPP%\bin;%PATH% + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent + +.\calculator_client.exe div 5 2 + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/runclient.sh new file mode 100755 index 0000000000..feae29d557 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator.client/runclient.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/cpp/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent + +./calculator_client div 5 2 diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Calculator.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Calculator.h new file mode 100644 index 0000000000..90e97b5319 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Calculator.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef sample_calculator_h +#define sample_calculator_h + +class Calculator +{ +public: + virtual float add(float arg1, float arg2) = 0; + virtual float sub(float arg1, float arg2) = 0; + virtual float mul(float arg1, float arg2) = 0; + virtual float div(float arg1, float arg2) = 0; +}; + +#endif // sample_calculator_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.componentType new file mode 100644 index 0000000000..72fe9842e8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.componentType @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="CalculatorService"> + <interface.cpp header="Calculator.h"/> + </service> + + <reference name="divideService"> + <interface.cpp header="Divide.h"/> + </reference> + +</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.cpp new file mode 100644 index 0000000000..01dac77c92 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.cpp @@ -0,0 +1,90 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <stdio.h> + +#include "osoa/sca/ComponentContext.h" +#include "osoa/sca/ServiceRuntimeException.h" + +#include "CalculatorImpl.h" +#include "Divide.h" + +CalculatorImpl::CalculatorImpl() +{ +} + +CalculatorImpl::~CalculatorImpl() +{ +} + +// Calculator interface +float CalculatorImpl::add(float arg1, float arg2) +{ + float result = arg1 + arg2; + + printf("CalculatorImpl::add %f + %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::sub(float arg1, float arg2) +{ + float result = arg1 - arg2; + printf("CalculatorImpl::sub %f - %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::mul(float arg1, float arg2) +{ + float result = arg1 * arg2; + printf("CalculatorImpl::mul %f * %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::div(float arg1, float arg2) +{ + float result = 0; + + // This method shows how to invoke a service on a different component from within a component + + // First, get the current ComponentContext + osoa::sca::ComponentContext myContext = osoa::sca::ComponentContext::getCurrent(); + + try + { + // Find the required service, as referenced in CalculatorImpl.componentType + Divide* divideService = (Divide*)myContext.getService("divideService"); + + // Finally, invoke the service + result = divideService->divide(arg1, arg2); + + printf("CalculatorImpl::div Divide returned result: %f\n", result); + + } + catch (osoa::sca::ServiceRuntimeException& e) + { + // Print out error message and carry on + printf("CalculatorImpl::div Error whilst invoking Divide: %s", e.getMessageText()); + } + + return result; +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.h new file mode 100644 index 0000000000..af8a5eeab1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/CalculatorImpl.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef sample_calculatorimpl_h +#define sample_calculatorimpl_h + +#include "Calculator.h" + +class CalculatorImpl : public Calculator +{ +public: + CalculatorImpl(); + virtual ~CalculatorImpl(); + + // Calculator interface + virtual float add(float arg1, float arg2); + virtual float sub(float arg1, float arg2); + virtual float mul(float arg1, float arg2); + virtual float div(float arg1, float arg2); +}; + +#endif // sample_calculatorimpl_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Divide.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Divide.h new file mode 100644 index 0000000000..6e171ed733 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Divide.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_divide_h +#define sample_divide_h + +class Divide +{ +public: + virtual float divide(float arg1, float arg2) = 0; +}; + +#endif // sample_divide_h + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.componentType new file mode 100644 index 0000000000..d7369e3ff0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.componentType @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="DivideService"> + <interface.cpp header="Divide.h"/> + </service> + +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.cpp new file mode 100644 index 0000000000..f1a927cf4c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.cpp @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <stdio.h> + +#include "DivideImpl.h" + +DivideImpl::DivideImpl() +{ +} + +DivideImpl::~DivideImpl() +{ +} + +// Divide interface +float DivideImpl::divide(float arg1, float arg2) +{ + if(arg2 == 0.0) + { + printf("DivideImpl::div %f / %f !! Cannot divide by zero, so returning 0\n", arg1, arg2); + return 0; + } + + float result = arg1 / arg2; + printf("DivideImpl::div %f / %f = %f\n", arg1, arg2, result); + return result; +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.h new file mode 100644 index 0000000000..64045f1899 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/DivideImpl.h @@ -0,0 +1,39 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_divideimpl_h +#define sample_divideimpl_h + +#include "Divide.h" + +class DivideImpl : public Divide +{ +public: + DivideImpl(); + virtual ~DivideImpl(); + + // Divide interface + virtual float divide(float arg1, float arg2); +}; + +#endif // sample_divideimpl_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Makefile.am new file mode 100644 index 0000000000..de6dad787d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/Makefile.am @@ -0,0 +1,53 @@ +# 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. + +deploydir=$(prefix)/CppCalculator/deploy +compositedir=$(deploydir)/sample.calculator + +BUILT_SOURCES = scagen + +noinst_HEADERS = *.h + +scagen: + java -jar $(TUSCANY_SCACPP)/bin/scagen.jar -dir . -output . + +composite_LTLIBRARIES = libCalculator.la +composite_DATA = *.composite *.componentType +EXTRA_DIST = *.composite *.componentType + +dist_libCalculator_la_SOURCES = \ +CalculatorImpl.cpp \ +DivideImpl.cpp + +nodist_libCalculator_la_SOURCES = \ +CalculatorImpl_CalculatorService_Proxy.cpp \ +CalculatorImpl_CalculatorService_Wrapper.cpp \ +CalculatorImpl_divideService_Proxy.cpp \ +DivideImpl_DivideService_Proxy.cpp \ +DivideImpl_DivideService_Wrapper.cpp + +libCalculator_la_LIBADD = \ +-L${TUSCANY_SCACPP}/lib \ + -ltuscany_sca \ +-L${TUSCANY_SCACPP}/extensions/cpp/lib \ + -ltuscany_sca_cpp + +INCLUDES = \ +-I$(TUSCANY_SCACPP)/extensions/cpp/include \ +-I$(TUSCANY_SCACPP)/include \ +-I${TUSCANY_SDOCPP}/include + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/sample.calculator.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/sample.calculator.composite new file mode 100644 index 0000000000..6903cf21d8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/CppCalculator/sample.calculator/sample.calculator.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> + + <component name="CalculatorComponent"> + <implementation.cpp library="Calculator" header="CalculatorImpl.h"/> + <reference name="divideService">DivideComponent/DivideService</reference> + </component> + + <component name="DivideComponent"> + <implementation.cpp library="Calculator" header="DivideImpl.h"/> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/GettingStarted.html b/sca-cpp/branches/cpp-contrib/contrib/samples/GettingStarted.html new file mode 100644 index 0000000000..dcb2cfd19c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/GettingStarted.html @@ -0,0 +1,513 @@ +<!-- + 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. +--> + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../doc/css/maven-base.css"); +@import url("../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - Getting Started</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany Samples - Getting Started - SCA Native Milestone release 3</H1> + + <P>Tuscany SCA Native includes a set of simple technology samples that demonstrates some of the functionality of + the Tuscany SCA Native runtime. This page describes the samples and links to the documents that describe how to + build and run them + </P> + </DIV> + + <DIV CLASS="section"> + <A NAME="samples"><H2>Samples</H2></A> + <TABLE CLASS="bodyTable"> + <TBODY> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="CppCalculator/README.html">CppCalculator</A></TD> + <TD>A very simple sample to show how an SCA composite can wire + together two C++ components to implement a Calculator service + </TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PythonCalculator/README.html">PythonCalculator</A></TD> + <TD>A very simple sample to show how an SCA composite can wire + together two Python components to implement a Calculator service + </TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RubyCalculator/README.html">RubyCalculator</A></TD> + <TD>A very simple sample to show how an SCA composite can wire + together two Ruby components to implement a Calculator service + </TD> + </TR> +<!-- <TR CLASS="a"> --> +<!-- <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PHPCalculator/README.html">PHPCalculator</A></TD> --> +<!-- <TD>This is a simple sample to show how an SCA composite can wire together --> +<!-- a number of components to implement a Calculator service and expose that service as --> +<!-- to a number of different tpyes of client. The sample components are implemented in various --> +<!-- ways to demonstrate the different features of the PHP SCA extension. --> +<!-- </TD> --> +<!-- </TR> --> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestCalculator/README.html">RESTCalculator</A></TD> + <TD>This sample is based on RubyCalculator but exposes the Calculator service as a REST Service + running under the Apache HTTPD server</TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="CppBigBank/README.html">CppBigBank</A></TD> + <TD>A more complex sample that implements the "Simplified BigBank" scenario. A whitepaper describing + the scenario based on the SCA 0.9 Assembly specification can be found + <A HREF="http://www.osoa.org/display/Main/SCA+-+Previously+Published+Specifications">here</A>. + This sample uses multiple C++ components, calls out to an external Web Service via a reference, + exposes the service as a Web Service and also provides a PHP based client. + </TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RubyBigBank/README.html">RubyBigBank</A></TD> + <TD>A more complex sample that implements the "Simplified BigBank" scenario. This sample uses multiple + Ruby components, calls out to an external Web Service via a reference and exposes the service as a + Web Service. + </TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="HTTPDBigBank/README.html">HTTPDBigBank</A></TD> + <TD>A more complex sample that implements the "Simplified BigBank" scenario. This sample contains the same + SCA components and calls as RubyBigBank, but demonstrates running the sample under the Apache HTTPD server + </TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PythonWeatherForecast/README.html">PythonWeatherForecast</A></TD> + <TD>This sample makes calls to an external Web Service via a reference, demonstrating how Python + ElementTree objects are used in Tuscany to access the XML data returned from the service.</TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestCustomer/README.html">RestCustomer</A></TD> + <TD>This sample demonstrates a Python component exposed as a REST Service either with or without the REST + interface (which specifies whether the service uses CRUD operations that translate to HTTP POST, GET, PUT + and DELETE or uses HTTP GET and XML over HTTP POST to invoke named operations) running under the Apache + HTTPD server</TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestYahoo/README.html">RestYahoo</A></TD> + <TD>This sample demonstrates a Python component that is wired to make REST calls out to the external + Yahoo! Web Search service. This sample uses a Ruby local client to invoke the Python component.</TD> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="AlertAggregator/README.html">AlertAggregator</A></TD> + <TD>A more complex sample that shows how a Web 2.0-style application can be built using SCA. The Alert + Aggregator Sample aggregates various data sources and presents a unified view of data from these sources, + served as XML and displayed via a web page</TD> + </TR> + </TBODY> + </TABLE> + <BR> + </DIV> + <DIV CLASS="section"> + <A NAME="samples"><H2>Sample Dependencies</H2></A> + <P>The Tuscany samples each demonstrate different aspects of functionality provided by Tuscany, often in + particular extensions. The table below documents the extension dependencies that each sample has. + Please see the extension documentation for more details on the dependencies that particular extensions have. + </P> + <TABLE CLASS="bodyTable"> + <THEAD> + <TR STYLE="vertical-align: top;"> + <TD></TD> + <TD><A HREF="../doc/CppExtension.html">C++ Extension</A></TD> + <TD><A HREF="../doc/PythonExtension.html">Python Extension</A></TD> + <TD><A HREF="../doc/RubyExtension.html">Ruby Extension</A></TD> + <!--TD><A HREF="../doc/PHPExtension.html">PHP Extension</A></TD> --> + <TD><A HREF="../doc/Axis2CWSExtension.html#service">Axis2C Web Service Service Extension</A></TD> + <TD><A HREF="../doc/Axis2CWSExtension.html#reference">Axis2C Web Service Reference Extension</A></TD> + <TD><A HREF="../doc/RESTExtension.html#service">REST Service Extension</A></TD> + <TD><A HREF="../doc/RESTExtension.html#reference">REST Reference Extension</A></TD> + <TD><A HREF="../doc/RESTExtension.html#interface">REST Interface Extension</A></TD> + <TD><A HREF="../doc/SCAExtension.html#service">SCA Service Extension</A></TD> + <TD><A HREF="../doc/SCAExtension.html#reference">SCA Reference Extension</A></TD> + </TR> + </THEAD> + <TBODY> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="CppCalculator/README.html">CppCalculator</A></TD> + <TD>Yes</TD> <!-- C++ --> + <TD></TD> <!-- Python --> + <TD></TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PythonCalculator/README.html">PythonCalculator</A></TD> + <TD></TD> <!-- C++ --> + <TD>Yes</TD> <!-- Python --> + <TD></TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RubyCalculator/README.html">RubyCalculator</A></TD> + <TD></TD> <!-- C++ --> + <TD></TD> <!-- Python --> + <TD>Yes</TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> +<!-- <TR CLASS="b"> --> +<!-- <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PHPCalculator/README.html">PHPCalculator</A></TD> --> +<!-- <TD></TD> <!-- C++ - -> --> +<!-- <TD></TD> <!-- Python - -> --> +<!-- <TD></TD> <!-- Ruby - -> --> +<!-- <TD>Yes</TD> <!-- PHP - -> --> +<!-- <TD>?</TD> <!-- WS Service - -> --> +<!-- <TD>?</TD> <!-- WS Reference - -> --> +<!-- <TD></TD> <!-- REST Service - -> --> +<!-- <TD></TD> <!-- REST Reference - -> --> +<!-- <TD></TD> <!-- REST Interface - -> --> +<!-- <TD></TD> <!-- SCA Service - -> --> +<!-- <TD></TD> <!-- SCA Reference - -> --> +<!-- </TR> --> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestCalculator/README.html">RESTCalculator</A></TD> + <TD></TD> <!-- C++ --> + <TD></TD> <!-- Python --> + <TD>Yes</TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD>Yes</TD> <!-- REST Service --> + <TD>Yes</TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="CppBigBank/README.html">CppBigBank</A></TD> + <TD>Yes</TD> <!-- C++ --> + <TD></TD> <!-- Python --> + <TD></TD> <!-- Ruby --> + <TD>Yes</TD> <!-- WS Service --> + <TD>Yes</TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RubyBigBank/README.html">RubyBigBank</A></TD> + <TD></TD> <!-- C++ --> + <TD></TD> <!-- Python --> + <TD>Yes</TD> <!-- Ruby --> + <TD>Yes</TD> <!-- WS Service --> + <TD>Yes</TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="HTTPDBigBank/README.html">HTTPDBigBank</A></TD> + <TD></TD> <!-- C++ --> + <TD></TD> <!-- Python --> + <TD>Yes</TD> <!-- Ruby --> + <TD>Yes</TD> <!-- WS Service --> + <TD>Yes</TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD>Yes</TD> <!-- SCA Service --> + <TD>Yes</TD> <!-- SCA Reference --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PythonWeatherForecast/README.html">PythonWeatherForecast</A></TD> + <TD></TD> <!-- C++ --> + <TD>Yes</TD> <!-- Python --> + <TD></TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD>Yes</TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD></TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestCustomer/README.html">RestCustomer</A></TD> + <TD></TD> <!-- C++ --> + <TD>Yes</TD> <!-- Python --> + <TD></TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD>Yes</TD> <!-- REST Service --> + <TD>Yes</TD> <!-- REST Reference --> + <TD>Yes</TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestYahoo/README.html">RestYahoo</A></TD> + <TD></TD> <!-- C++ --> + <TD>Yes</TD> <!-- Python --> + <TD>Yes</TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD></TD> <!-- REST Service --> + <TD>Yes</TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="AlertAggregator/README.html">AlertAggregator</A></TD> + <TD></TD> <!-- C++ --> + <TD>Yes</TD> <!-- Python --> + <TD></TD> <!-- Ruby --> + <TD></TD> <!-- WS Service --> + <TD></TD> <!-- WS Reference --> + <TD>Yes</TD> <!-- REST Service --> + <TD>Yes</TD> <!-- REST Reference --> + <TD></TD> <!-- REST Interface --> + <TD></TD> <!-- SCA Service --> + <TD></TD> <!-- SCA Reference --> + </TR> + </TBODY> + </TABLE> + <BR/> + <P>The table below documents the libraries or environments necessary to build and/or run each sample. These are generally + required by the Tuscany extensions that the sample employs. + Please see the extension documentation for more details (such as the version required) about the dependencies that particular + extensions require. + </P> + <TABLE CLASS="bodyTable"> + <THEAD> + <TR STYLE="vertical-align: top;"> + <TD></TD> + <TD><A HREF="http://java.sun.com/javase/downloads/index.jsp">Java runtime</A></TD> + <TD><A HREF="http://www.python.org/">Python runtime</A></TD> + <TD><A HREF="http://www.ruby-lang.org/">Ruby runtime</A></TD> +<!-- <TD><A HREF="http://www.php.net/">PHP runtime</A></TD> --> +<!-- <TD><A HREF="http://pecl.php.net/package/SCA_SDO/">PHP SCA_SDO package</A></TD> --> + <TD><A HREF="http://ws.apache.org/axis2/c/">Axis2/C library</A></TD> + <TD><A HREF="http://ws.apache.org/axis2/c/">Axis2/C HTTP server</A></TD> + <TD><A HREF="http://curl.haxx.se/">libcurl library</A></TD> + <TD><A HREF="http://httpd.apache.org/">HTTPD server</A></TD> + <TD><A HREF="http://feedparser.org/">Universal Feed Parser library</A></TD> + </TR> + </THEAD> + <TBODY> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="CppCalculator/README.html">CppCalculator</A></TD> + <TD>Build</TD> <!-- Java runtime --> + <TD></TD> <!--Python runtime --> + <TD></TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PythonCalculator/README.html">PythonCalculator</A></TD> + <TD></TD> <!-- Java runtime --> + <TD>Run</TD> <!--Python runtime --> + <TD></TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RubyCalculator/README.html">RubyCalculator</A></TD> + <TD></TD> <!-- Java runtime --> + <TD></TD> <!--Python runtime --> + <TD>Run</TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> +<!-- <TR CLASS="b"> --> +<!-- <!-- TODO - check/fix/remove this - -> --> +<!-- <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PHPCalculator/README.html">PHPCalculator</A></TD> --> +<!-- <TD></TD> <!-- Java runtime - -> --> +<!-- <TD></TD> <!--Python runtime - -> --> +<!-- <TD></TD> <!--Ruby runtime - -> --> +<!-- <TD>Run</TD> <!--PHP runtime - -> --> +<!-- <TD>Run</TD> <!--PHP SCA_SDO package - -> --> +<!-- <TD>?</TD> <!--Axis2/C library - -> --> +<!-- <TD>?</TD> <!--Axis2/C server - -> --> +<!-- <TD></TD> <!--libcurl library - -> --> +<!-- <TD>?</TD> <!--HTTPD server - -> --> +<!-- <TD></TD> <!--Universal Feed Parser - -> --> +<!-- </TR> --> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestCalculator/README.html">RESTCalculator</A></TD> + <TD></TD> <!-- Java runtime --> + <TD></TD> <!--Python runtime --> + <TD>Run</TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD>Run</TD> <!--libcurl library --> + <TD>Run</TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="CppBigBank/README.html">CppBigBank</A></TD> + <TD>Build</TD> <!-- Java runtime --> + <TD></TD> <!--Python runtime --> + <TD></TD> <!--Ruby runtime --> + <TD>Run</TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RubyBigBank/README.html">RubyBigBank</A></TD> + <TD></TD> <!-- Java runtime --> + <TD></TD> <!--Python runtime --> + <TD>Run</TD> <!--Ruby runtime --> + <TD>Run</TD> <!--Axis2/C library --> + <TD>Run</TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="HTTPDBigBank/README.html">HTTPDBigBank</A></TD> + <TD></TD> <!-- Java runtime --> + <TD></TD> <!--Python runtime --> + <TD>Run</TD> <!--Ruby runtime --> + <TD>Run</TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD>Run</TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="PythonWeatherForecast/README.html">PythonWeatherForecast</A></TD> + <TD></TD> <!-- Java runtime --> + <TD>Run</TD> <!--Python runtime --> + <TD></TD> <!--Ruby runtime --> + <TD>Run</TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD></TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestCustomer/README.html">RestCustomer</A></TD> + <TD></TD> <!-- Java runtime --> + <TD>Run</TD> <!--Python runtime --> + <TD></TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD>Run</TD> <!--libcurl library --> + <TD>Run</TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="b"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="RestYahoo/README.html">RestYahoo</A></TD> + <TD></TD> <!-- Java runtime --> + <TD>Run</TD> <!--Python runtime --> + <TD>Run</TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD>Run</TD> <!--libcurl library --> + <TD></TD> <!--HTTPD server --> + <TD></TD> <!--Universal Feed Parser --> + </TR> + <TR CLASS="a"> + <TD STYLE="vertical-align: top; white-space: nowrap;"><A HREF="AlertAggregator/README.html">AlertAggregator</A></TD> + <TD></TD> <!-- Java runtime --> + <TD>Run</TD> <!--Python runtime --> + <TD></TD> <!--Ruby runtime --> + <TD></TD> <!--Axis2/C library --> + <TD></TD> <!--Axis2/C server --> + <TD>Run</TD> <!--libcurl library --> + <TD>Run</TD> <!--HTTPD server --> + <TD>Run</TD> <!--Universal Feed Parser --> + </TR> + </TBODY> + </TABLE> + <BR/> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + + <P> </P> + + <P> </P> + + <P> </P> + <TABLE CLASS="bodyTable"> + <TBODY> + <TR CLASS="a"> + <TD> + + <P>Thank you for your interest in Tuscany.</P> <STRONG><EM>-The + Tuscany Development Team</EM></STRONG> + </TD> + </TR> + </TBODY> + </TABLE> + </DIV> + + </DIV> + +</DIV> +</BODY> + +</HTML> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/Makefile.am new file mode 100644 index 0000000000..7ae86e6d2c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/HttpdBigBank/deploy +SUBDIRS = bigbank.account bigbank.accountdata bigbank.wsclient httpserver +EXTRA_DIST = *.composite +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/README b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/README new file mode 100644 index 0000000000..a3442236bd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/README @@ -0,0 +1,37 @@ +# 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. + +This sample shows how to run the Bigbank app with the Apache HTTP server + +This is a more modular version of the original Bigbank app, the account +service and the account data service are in different composites. + +The httpserver directory contains a minimal httpd configuration. +Make sure that Apache apachectl and httpd 2.2.x are on the PATH. + +To start the server, cd to httpserver, and run ./startserver.sh. + +To verify that the server is working, point your Web browser to +http://localhost:9090. + +To verify that Axis2C is working, point your Web browser to +http://localhost:9090/axis2, you should see a list of deployed services. + +To stop the server, cd to httpserver, and run ./stopserver.sh. + +To run the sample go to bigbank.wsclient, and run ./runwsclient.sh. + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/README.html new file mode 100644 index 0000000000..bfd33ee1cd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/README.html @@ -0,0 +1,197 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - HTTPD BigBank Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - HTTPD BigBank Sample</H1> + + <P>This sample implements the "Simplified BigBank" scenario. A whitepaper describing + the scenario based on the SCA 0.9 Assembly specification can be found + <A HREF="http://www.osoa.org/display/Main/SCA+-+Previously+Published+Specifications">here</A>. + This is a more modular version of the original Bigbank app, with the account + service and the account data service are in different composites. + </P> + <P>The HTTPD BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + <LI><A HREF="../../doc/SCAExtension.html">SCA Binding Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </P> + <P>There are three sub-projects in this workspace:</P> + <UL> + <LI>bigbank.account<BR/> + This contains the source code and SCDL artifacts for the SCA HTTPD BigBank + composite implementing the account services. + </LI> + <LI>bigbank.accountdata<BR/> + This contains the source code and SCDL artifacts for the SCA HTTPD BigBank + composite implementing the account data services. + </LI> + <LI>bigbank.wsclient<BR/> + A sample client which uses an SCA Web Service reference to make a remote + call to the BigBank service. + </LI> + </UL> + <P>Additionally, there is the bigbank.app.composite file. This + describes the configuration of the SCA BigBank composite deployed to the SCA + runtime. + </P> + <P>Note that this sample does not run on Windows, due to threading incompatibilities + between Apache HTTPD and the Ruby runtime</P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the HTTPD BigBank sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the HTTPD BigBank sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#win">The HTTPD BigBank sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the HTTPD BigBank sample on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As the HTTPD BigBank sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Ruby samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-ruby --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/HttpdBigBank + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the HTTPD BigBank sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The HTTPD BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + <LI><A HREF="../../doc/SCAExtension.html">SCA Binding Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Ensure you have enabled Axis2/C to run Tuscany SCA services. Follow the instructions + found <A HREF="../../doc/Axis2CWSExtension.html#deploy">here</A>. + </LI> + <LI>Start the Apache HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/HttpdBigBank/deploy/httpserver</LI> + <LI>./startserver.sh<BR/> + NOTE: Depending on your installation of Apache HTTPD you may need to log in as root before following + these steps. If so, you may also need to uncomment the User and Group directives in the + <tuscany_sca_install_dir>/samples/HttpdBigBank/deploy/httpserver/conf/httpd.conf file + and set these to the appropriate username and group that the server should run as</LI> + </OL> + </LI> + <LI>Now run the Web Service client: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/HttpdBigBank/deploy/bigbank.wsclient</LI> + <LI>./runwsclient.sh</LI> + </UL> + </LI> + </OL> + </LI> + <LI>The PHP web client detailed in the + <A HREF="../CppBigBank/README.html">CppBigBank</A> sample can also be used + with the HTTPD BigBank service that is served by the HTTPD server started above. + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="win"><H2>The HTTPD BigBank sample on Windows</H2></A> + <P>The HttpdBigBank sample does not currently run on Windows, due to the sample being based on Ruby + components running under Apache HTTPD. The Ruby runtime is single-threaded and, on Windows, HTTPD + is multi-threaded, which means that Ruby throws "cross-thread violation" errors when Tuscany + attempts to run a Ruby script under HTTPD.</P> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/AccountService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/AccountService.wsdl new file mode 100644 index 0000000000..b83c453462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/AccountService.wsdl @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.bigbank.com/AccountService" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.bigbank.com/AccountService" + name="AccountService"> + + <wsdl:types> + <xsd:schema + targetNamespace="http://www.bigbank.com/AccountService" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="getAccountReport"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" + type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="getAccountReportResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" + type="tns:AccountReport" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="AccountReport"> + <xsd:sequence> + <xsd:element name="checking" + type="tns:CheckingAccount" maxOccurs="unbounded" /> + <xsd:element name="savings" + type="tns:SavingsAccount" maxOccurs="unbounded" /> + <xsd:element name="stocks" type="tns:StockAccount" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="getAccountReportRequest"> + <wsdl:part element="tns:getAccountReport" + name="getAccountReportRequest" /> + </wsdl:message> + + <wsdl:message name="getAccountReportResponse"> + <wsdl:part element="tns:getAccountReportResponse" + name="getAccountReportResponse" /> + </wsdl:message> + + <wsdl:portType name="AccountService"> + <wsdl:operation name="getAccountReport"> + <wsdl:input message="tns:getAccountReportRequest" /> + <wsdl:output message="tns:getAccountReportResponse" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="getAccountReport"> + <soap:operation + soapAction="http://www.bigbank.com/AccountService/getAccountReport" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + + <wsdl:service name="AccountService"> + <wsdl:port binding="tns:AccountServiceSOAP" + name="AccountServiceSOAP"> + <soap:address + location="http://localhost:9090/axis2/services/bigbank.AccountManagementComponent/AccountService" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/AccountServiceImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/AccountServiceImpl.rb new file mode 100644 index 0000000000..20af2cfedb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/AccountServiceImpl.rb @@ -0,0 +1,83 @@ +# 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. +# + +require "rexml/document" +include REXML + +class AccountServiceImpl + + attr_writer :accountDataService + attr_writer :stockQuoteService + attr_writer :currency + + def initialize() + print "Ruby - AccountServiceImpl.initialize\n" + end + + def getAccountReport(customerID) + + # Get the checking account info + checking = @accountDataService.getCheckingAccount(customerID) + + # Get the savings account info + savings = @accountDataService.getSavingsAccount(customerID) + + # Get the stocks account info + stock = @accountDataService.getStockAccount(customerID); + + symbol = stock.root.elements["symbol"].text + quantity = stock.root.elements["quantity"].text + + # Get the stock price + price = @stockQuoteService.getQuote(symbol); + + # Convert to the configured currency + price = price.to_f * 0.80 if @currency == "EUR" + + # Calculate the balance + balance = price.to_f * quantity.to_f + + # Form the AccountReport document + report = Document.new <<-eof + <AccountReport xmlns="http://www.bigbank.com/AccountService" + xsi:type="AccountReport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <checking> + <accountNumber>#{ checking.root.elements["accountNumber"].text }</accountNumber> + <balance>#{ checking.root.elements["balance"].text }</balance> + </checking> + + <savings> + <accountNumber>#{ savings.root.elements["accountNumber"].text }</accountNumber> + <balance>#{ savings.root.elements["balance"].text }</balance> + </savings> + + <stocks> + <accountNumber>#{ stock.root.elements["accountNumber"].text }</accountNumber> + <symbol>#{ symbol }</symbol> + <quantity>#{ quantity }</quantity> + <balance>#{ balance }</balance> + </stocks> + + </AccountReport> + eof + + return report + end + +end diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/Makefile.am new file mode 100644 index 0000000000..01c8681555 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/HttpdBigBank/deploy +compositedir=$(deploydir)/bigbank.account + +composite_DATA = *.composite *.wsdl *.xsd *.rb +EXTRA_DIST = *.composite *.wsdl *.xsd *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteServiceImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteServiceImpl.rb new file mode 100644 index 0000000000..7f8634072c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteServiceImpl.rb @@ -0,0 +1,52 @@ +# 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. +# + +require "rexml/document" +include REXML + +class StockQuoteServiceImpl + + attr_writer :webService + + def initialize() + print "Ruby - StockQuoteServiceImpl.initialize\n" + end + + def getQuote(symbol) + print "Ruby - StockQuoteServiceImpl.getQuote ", symbol, "\n" + + price = 0 + catch (:RuntimeError) do + begin + + result = @webService.GetQuote(symbol) + doc = Document.new(result) + price = doc.root.elements["Stock"].elements["Last"].text; + + rescue + # offline or StockQuote web service is down + price = 95.0 + end + end + + print "Ruby - stock price = ", price, "\n" + + return price.to_f + end + +end
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteTypes.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteTypes.xsd new file mode 100644 index 0000000000..2f7012b5fb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteTypes.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="StockQuotes" type="tStockQuotes"/> + <xs:complexType name="tStockQuotes"> + <xs:sequence> + <xs:element name="Stock" type="tStock" minOccurs="0" maxOccurs="unbounded"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> + + <xs:complexType name="tStock"> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="1" name="Symbol" type="xs:string"/> + <xs:element minOccurs="0" maxOccurs="1" name="Last" type="xs:float"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteWebService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteWebService.wsdl new file mode 100644 index 0000000000..c14f97c87b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/StockQuoteWebService.wsdl @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:s="http://www.w3.org/2001/XMLSchema" + xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" + xmlns:tns="http://www.webserviceX.NET/" + xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" + xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" + targetNamespace="http://www.webserviceX.NET/" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + <wsdl:types> + <s:schema elementFormDefault="qualified" + targetNamespace="http://www.webserviceX.NET/"> + <s:element name="GetQuote"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="symbol" type="s:string" /> + </s:sequence> + </s:complexType> + + </s:element> + <s:element name="GetQuoteResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="GetQuoteResult" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="string" nillable="true" type="s:string" /> + + </s:schema> + </wsdl:types> + <wsdl:message name="GetQuoteSoapIn"> + <wsdl:part name="parameters" element="tns:GetQuote" /> + </wsdl:message> + <wsdl:message name="GetQuoteSoapOut"> + <wsdl:part name="parameters" element="tns:GetQuoteResponse" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpGetIn"> + + <wsdl:part name="symbol" type="s:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpGetOut"> + <wsdl:part name="Body" element="tns:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpPostIn"> + <wsdl:part name="symbol" type="s:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpPostOut"> + + <wsdl:part name="Body" element="tns:string" /> + </wsdl:message> + <wsdl:portType name="StockQuoteSoap"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteSoapIn" /> + <wsdl:output message="tns:GetQuoteSoapOut" /> + </wsdl:operation> + + </wsdl:portType> + <wsdl:portType name="StockQuoteHttpGet"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteHttpGetIn" /> + <wsdl:output message="tns:GetQuoteHttpGetOut" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:portType name="StockQuoteHttpPost"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteHttpPostIn" /> + <wsdl:output message="tns:GetQuoteHttpPostOut" /> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap"> + + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" + style="document" /> + <wsdl:operation name="GetQuote"> + <soap:operation + soapAction="http://www.webserviceX.NET/GetQuote" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="StockQuoteHttpGet" + type="tns:StockQuoteHttpGet"> + <http:binding verb="GET" /> + <wsdl:operation name="GetQuote"> + <http:operation location="/GetQuote" /> + <wsdl:input> + <http:urlEncoded /> + </wsdl:input> + + <wsdl:output> + <mime:mimeXml part="Body" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="StockQuoteHttpPost" + type="tns:StockQuoteHttpPost"> + <http:binding verb="POST" /> + <wsdl:operation name="GetQuote"> + <http:operation location="/GetQuote" /> + + <wsdl:input> + <mime:content type="application/x-www-form-urlencoded" /> + </wsdl:input> + <wsdl:output> + <mime:mimeXml part="Body" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:service name="StockQuote"> + + <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap"> + <soap:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + <wsdl:port name="StockQuoteHttpGet" + binding="tns:StockQuoteHttpGet"> + <http:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + <wsdl:port name="StockQuoteHttpPost" + binding="tns:StockQuoteHttpPost"> + <http:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/bigbank.account.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/bigbank.account.composite new file mode 100644 index 0000000000..208402cdb3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.account/bigbank.account.composite @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.account"> + + <service name="AccountService"> + <interface.wsdl interface="http://www.bigbank.com/AccountService#wsdl.interface(AccountService)"/> + <binding.ws/> + <reference>AccountServiceComponent</reference> + </service> + + <component name="AccountServiceComponent"> + <implementation.ruby script="AccountServiceImpl.rb" class="AccountServiceImpl"/> + <reference name="accountDataService">AccountDataService</reference> + <reference name="stockQuoteService">StockQuoteServiceComponent</reference> + <property name="currency">USD</property> + </component> + + <component name="StockQuoteServiceComponent"> + <implementation.ruby script="StockQuoteServiceImpl.rb" class="StockQuoteServiceImpl"/> + <reference name="webService">StockQuoteWebService</reference> + </component> + + <reference name="StockQuoteWebService"> + <interface.wsdl interface="http://www.webserviceX.NET/#wsdl.interface(StockQuoteSoap)"/> + <binding.ws endpoint="http://www.webserviceX.NET/#wsdl.endpoint(StockQuote/StockQuoteSoap)"/> + </reference> + + <reference name="AccountDataService"> + <binding.sca/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/AccountData.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/AccountData.xsd new file mode 100644 index 0000000000..8c8ff7c637 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/AccountData.xsd @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<xsd:schema targetNamespace="http://www.bigbank.com/AccountService" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + +</xsd:schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/AccountDataServiceImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/AccountDataServiceImpl.rb new file mode 100644 index 0000000000..8ae0e23bab --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/AccountDataServiceImpl.rb @@ -0,0 +1,72 @@ +# 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. +# + +require "rexml/document" +include REXML + +class AccountDataServiceImpl + + def initialize() + print "Ruby - AccountDataServiceImpl.initialize\n" + end + + def getCheckingAccount(id) + print "Ruby - AccountDataServiceImpl.getCheckingAccount ", id, "\n" + + result = Document.new <<-eof + <CheckingAccount xmlns="http://www.bigbank.com/AccountService" + xsi:type="CheckingAccount" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <accountNumber>#{ id.to_s + "_CHA12345"}</accountNumber> + <balance>1500.0</balance> + </CheckingAccount> + eof + + return result + end + + def getSavingsAccount(id) + print "Ruby - AccountDataServiceImpl.getSavingsAccount ", id, "\n" + + result = Document.new <<-eof + <SavingsAccount xmlns="http://www.bigbank.com/AccountService" + xsi:type="SavingsAccount" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <accountNumber>#{ id.to_s + "_SAA12345"}</accountNumber> + <balance>1500.0</balance> + </SavingsAccount> + eof + + return result + end + + def getStockAccount(id) + print "Ruby - AccountDataServiceImpl.getStockAccount ", id, "\n" + + result = Document.new <<-eof + <StockAccount xmlns="http://www.bigbank.com/AccountService" + xsi:type="StockAccount" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <accountNumber>#{ id.to_s + "_STA12345"}</accountNumber> + <symbol>IBM</symbol> + <quantity>100</quantity> + <balance></balance> + </StockAccount> + eof + + return result + end + +end diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/Makefile.am new file mode 100644 index 0000000000..7735720b26 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/HttpdBigBank/deploy +compositedir=$(deploydir)/bigbank.accountdata + +composite_DATA = *.composite *.xsd *.rb +EXTRA_DIST = *.composite *.xsd *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/bigbank.accountdata.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/bigbank.accountdata.composite new file mode 100644 index 0000000000..30c2802d5b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.accountdata/bigbank.accountdata.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.accountdata"> + + <service name="AccountDataService"> + <binding.sca/> + <reference>AccountDataServiceComponent</reference> + </service> + + <component name="AccountDataServiceComponent"> + <implementation.ruby script="AccountDataServiceImpl.rb" class="AccountDataServiceImpl"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.app.composite new file mode 100644 index 0000000000..9507997464 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.app.composite @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.app"> + + <component name="bigbank.AccountManagementComponent"> + <implementation.composite name="bigbank.account"/> + <reference name="AccountDataService">bigbank.AccountDataManagementComponent/AccountDataService</reference> + </component> + + <component name="bigbank.AccountDataManagementComponent"> + <implementation.composite name="bigbank.accountdata"/> + </component> + + <component name="bigbank.AccountWSClientComponent"> + <implementation.composite name="bigbank.wsclient"/> + <reference name="AccountService">bigbank.AccountManagementComponent/AccountService</reference> + </component> + +</composite> +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/AccountService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/AccountService.wsdl new file mode 100644 index 0000000000..b83c453462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/AccountService.wsdl @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.bigbank.com/AccountService" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.bigbank.com/AccountService" + name="AccountService"> + + <wsdl:types> + <xsd:schema + targetNamespace="http://www.bigbank.com/AccountService" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="getAccountReport"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" + type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="getAccountReportResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" + type="tns:AccountReport" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="AccountReport"> + <xsd:sequence> + <xsd:element name="checking" + type="tns:CheckingAccount" maxOccurs="unbounded" /> + <xsd:element name="savings" + type="tns:SavingsAccount" maxOccurs="unbounded" /> + <xsd:element name="stocks" type="tns:StockAccount" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="getAccountReportRequest"> + <wsdl:part element="tns:getAccountReport" + name="getAccountReportRequest" /> + </wsdl:message> + + <wsdl:message name="getAccountReportResponse"> + <wsdl:part element="tns:getAccountReportResponse" + name="getAccountReportResponse" /> + </wsdl:message> + + <wsdl:portType name="AccountService"> + <wsdl:operation name="getAccountReport"> + <wsdl:input message="tns:getAccountReportRequest" /> + <wsdl:output message="tns:getAccountReportResponse" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="getAccountReport"> + <soap:operation + soapAction="http://www.bigbank.com/AccountService/getAccountReport" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + + <wsdl:service name="AccountService"> + <wsdl:port binding="tns:AccountServiceSOAP" + name="AccountServiceSOAP"> + <soap:address + location="http://localhost:9090/axis2/services/bigbank.AccountManagementComponent/AccountService" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/AccountWSClient.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/AccountWSClient.rb new file mode 100644 index 0000000000..6775b80f7a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/AccountWSClient.rb @@ -0,0 +1,40 @@ +# 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. +# +# + +require("tuscany_sca_ruby") + +accountService = SCA::locateService("AccountService") + +report = accountService.getAccountReport(1234) + +checking = report.root.elements["checking"] +savings = report.root.elements["savings"] +stocks = report.root.elements["stocks"] + +print "\n\n" +print "Checking account #: ", checking.elements["accountNumber"].text.strip, "\n" +print "Balance: ", checking.elements["balance"].text.strip, "\n" + +print "Savings account #: ", savings.elements["accountNumber"].text.strip, "\n" +print "Balance: ", savings.elements["balance"].text.strip, "\n" + +print "Stocks account #:", stocks.elements["accountNumber"].text.strip, "\n" +print "Symbol: ", stocks.elements["symbol"].text.strip, "\n" +print "Quantity: ", stocks.elements["quantity"].text.strip, "\n" +print "Balance: ", stocks.elements["balance"].text.strip, "\n" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/Makefile.am new file mode 100644 index 0000000000..b1f1cfff0e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/Makefile.am @@ -0,0 +1,6 @@ +deploydir=$(prefix)/HttpdBigBank/deploy +clientdir=$(deploydir)/bigbank.wsclient + +client_DATA = *.rb *.composite *.wsdl +client_SCRIPTS = runwsclient.sh +EXTRA_DIST = runwsclient.sh *.rb *.composite *.wsdl diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/bigbank.wsclient.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/bigbank.wsclient.composite new file mode 100644 index 0000000000..f484a2fc7c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/bigbank.wsclient.composite @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.wsclient"> + + <reference name="AccountService"> + <interface.wsdl interface="http://www.bigbank.com/AccountService#wsdl.interface(AccountService)"/> + <binding.ws/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/runwsclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/runwsclient.bat new file mode 100644 index 0000000000..05d0ee2153 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/runwsclient.bat @@ -0,0 +1,51 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +rem Run the client +set PATH=%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\ws\reference\bin;%TUSCANY_SCACPP%\extensions\ws\service\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=bigbank.AccountWSClientComponent +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd %TUSCANY_SCACPP_ROOT%\bigbank.wsclient +ruby -I%TUSCANY_SCACPP%\extensions\ruby\bin AccountWSClient.rb + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/runwsclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/runwsclient.sh new file mode 100755 index 0000000000..d50e6a4b0a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/bigbank.wsclient/runwsclient.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# 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. + + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=bigbank.AccountWSClientComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/bigbank.wsclient +ruby -I$TUSCANY_SCACPP/extensions/ruby/lib AccountWSClient.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/Makefile.am new file mode 100644 index 0000000000..1195ee1aae --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/Makefile.am @@ -0,0 +1,6 @@ +deploydir=$(prefix)/HttpdBigBank/deploy +serverdir=$(deploydir)/httpserver + +server_SCRIPTS = startserver.sh stopserver.sh +EXTRA_DIST = startserver.sh stopserver.sh conf htdocs +nobase_server_DATA = conf/httpd.conf conf/mime.types htdocs/index.html diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/conf/httpd.conf b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/conf/httpd.conf new file mode 100644 index 0000000000..e9a438dc85 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/conf/httpd.conf @@ -0,0 +1,35 @@ +# 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.
+
+# This is the main Apache HTTP server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.
+
+Listen 9090
+
+# Generated by the startserver script
+Include conf/base.conf
+Include conf/mod_axis2.conf
+# Include conf/tuscany_sca_mod_rest.conf
+
+# User and Group directives may be required if the server must be
+# started from the root account. Uncomment the following lines and
+# set the correct username and group
+#
+# User myusername
+# Group mygroupname
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/conf/mime.types b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/conf/mime.types new file mode 100644 index 0000000000..4279f51bca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/conf/mime.types @@ -0,0 +1,607 @@ +# 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. + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at <http://www.iana.org/assignments/media-types/>. + +# MIME type Extensions +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomicmail +application/batch-smtp +application/beep+xml +application/cals-1840 +application/cnrp+xml +application/commonground +application/cpl+xml +application/cybercash +application/dca-rft +application/dec-dx +application/dvcs +application/edi-consent +application/edifact +application/edi-x12 +application/eshop +application/font-tdpfr +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica +application/mathml+xml mathml +application/msword doc +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin dms lha lzh exe class so dll dmg +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rdf+xml rdf +application/reginfo+xml +application/remote-printing +application/riscos +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/srgs gram +application/srgs+xml grxml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/vemmi +application/vnd.3gpp.pic-bw-large +application/vnd.3gpp.pic-bw-small +application/vnd.3gpp.pic-bw-var +application/vnd.3gpp.sms +application/vnd.3m.post-it-notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.acucorp +application/vnd.adobe.xfdf +application/vnd.aether.imp +application/vnd.amiga.ami +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.blueice.multipass +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.criticaltools.wbs+xml +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl +application/vnd.cybank +application/vnd.data-vision.rdz +application/vnd.dna +application/vnd.dpgraph +application/vnd.dreamfactory +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-help +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hbci +application/vnd.hhe.lesson-player +application/vnd.hp-hpgl +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.hp-pcl +application/vnd.hp-pclxl +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay +application/vnd.ibm.modcap +application/vnd.ibm.rights-management +application/vnd.ibm.secure-container +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jisp +application/vnd.kde.karbon +application/vnd.kde.kchart +application/vnd.kde.kformula +application/vnd.kde.kivio +application/vnd.kde.kontour +application/vnd.kde.kpresenter +application/vnd.kde.kspread +application/vnd.kde.kword +application/vnd.kenameaapp +application/vnd.koan +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop +application/vnd.llamagraphics.life-balance.exchange+xml +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.micrografx.flo +application/vnd.micrografx.igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.mbk +application/vnd.mobius.mqy +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.mophun.application +application/vnd.mophun.certificate +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls +application/vnd.ms-lrm +application/vnd.ms-powerpoint ppt +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.ms-wpl +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.edm +application/vnd.novadigm.edx +application/vnd.novadigm.ext +application/vnd.obn +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.quark.quarkxpress +application/vnd.rapid +application/vnd.s3sms +application/vnd.sealed.net +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.street-stream +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio +application/vnd.visionary +application/vnd.vividence.scriptfile +application/vnd.vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.wv.csp+wbxml +application/vnd.xara +application/vnd.xfdl +application/vnd.yamaha.hv-dic +application/vnd.yamaha.hv-script +application/vnd.yamaha.hv-voice +application/vnd.yellowriver-custom-menu +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip +application/x-hdf hdf +application/x-javascript js +application/x-koan skp skd skt skm +application/x-latex latex +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x400-bp +application/xhtml+xml xhtml xht +application/xslt+xml xslt +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/zip zip +audio/32kadpcm +audio/amr +audio/amr-wb +audio/basic au snd +audio/cn +audio/dat12 +audio/dsr-es201108 +audio/dvi4 +audio/evrc +audio/evrc0 +audio/g722 +audio/g.722.1 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g729D +audio/g729E +audio/gsm +audio/gsm-efr +audio/l8 +audio/l16 +audio/l20 +audio/l24 +audio/lpc +audio/midi mid midi kar +audio/mpa +audio/mpa-robust +audio/mp4a-latm +audio/mpeg mpga mp2 mp3 +audio/parityfec +audio/pcma +audio/pcmu +audio/prs.sid +audio/qcelp +audio/red +audio/smv +audio/smv0 +audio/telephone-event +audio/tone +audio/vdvi +audio/vnd.3gpp.iufp +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-alaw-basic +audio/x-mpegurl m3u +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin +application/vnd.rn-realmedia rm +audio/x-wav wav +chemical/x-pdb pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg +image/t38 +image/tiff tiff tif +image/tiff-fx +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.globalgraphics.pgb +image/vnd.mix +image/vnd.ms-modi +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-icon ico +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/news +message/partial +message/rfc822 +message/s-http +message/sip +message/sipfrag +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics ifb +text/css css +text/directory +text/enriched +text/html html htm +text/parityfec +text/plain asc txt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.dmclientscript +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.iptc.nitf +text/vnd.iptc.newsml +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.sun.j2me.app-descriptor +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-setext etx +text/xml +text/xml-external-parsed-entity +video/bmpeg +video/bt656 +video/celb +video/dv +video/h261 +video/h263 +video/h263-1998 +video/h263-2000 +video/jpeg +video/mp1s +video/mp2p +video/mp2t +video/mp4v-es +video/mpv +video/mpeg mpeg mpg mpe +video/nv +video/parityfec +video/pointer +video/quicktime qt mov +video/smpte292m +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.nokia.interleaved-multimedia +video/vnd.objectvideo +video/vnd.vivo +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/htdocs/index.html b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/htdocs/index.html new file mode 100644 index 0000000000..1bfb3e30c2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/htdocs/index.html @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body><h1>It works!</h1></body></html> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/startserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/startserver.bat new file mode 100644 index 0000000000..fe319248f5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/startserver.bat @@ -0,0 +1,89 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +set APFULLDIR=%~d0%~p0 +echo Running from %APFULLDIR% + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +if "%HTTPD_HOME%" == "" ( +echo "HTTPD_HOME not set" +goto end +) +echo Using HTTPD installed at %HTTPD_HOME% + +set PATH=%TUSCANY_SCACPP%\extensions\sca\reference\bin;%TUSCANY_SCACPP%\extensions\sca\service\bin;%TUSCANY_SCACPP%\extensions\ws\reference\bin;%TUSCANY_SCACPP%\extensions\ws\service\bin;%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%HTTPD_HOME%\bin;%PATH% + +set TUSCANY_SCACPP_ROOT=%APFULLDIR%\..\ +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +@REM Generate the mod_axis2 configuration +if not exist %APFULLDIR%\conf\mod_axis2.conf ( + echo LoadModule axis2_module %AXIS2C_HOME%\lib\mod_axis2.dll > %APFULLDIR%\conf\mod_axis2.conf + echo Axis2RepoPath %AXIS2C_HOME% >> %APFULLDIR%\conf\mod_axis2.conf + echo Axis2LogFile %AXIS2C_HOME%\logs\httpd.log >> %APFULLDIR%\conf\mod_axis2.conf + echo Axis2LogLevel AXIS2_LOG_LEVEL_DEBUG >> %APFULLDIR%\conf\mod_axis2.conf + echo ^<Location /axis2^> >> %APFULLDIR%\conf\mod_axis2.conf + echo SetHandler axis2_module >> %APFULLDIR%\conf\mod_axis2.conf + echo ^</Location^> >> %APFULLDIR%\conf\mod_axis2.conf +) + +@REM Generate the tuscany_sca_mod_rest configuration +@REM if not exist %APFULLDIR%\conf\tuscany_sca_mod_rest.conf ( +@REM echo LoadModule sca_rest_module %TUSCANY_SCACPP%/extensions/rest\service/bin/tuscany_sca_mod_rest.dll > %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +@REM echo TuscanyHome %TUSCANY_SCACPP% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +@REM echo ^<Location /rest^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +@REM echo SetHandler sca_rest_module >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +@REM echo TuscanyRoot %TUSCANY_SCACPP_ROOT% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +@REM echo ^</Location^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +@REM ) + +@REM Generate the base HTTPD configuration +if not exist %APFULLDIR%\conf\base.conf ( + echo LoadModule mime_module %HTTPD_HOME%\modules\mod_mime.so > %APFULLDIR%\conf\base.conf + echo LoadModule dir_module %HTTPD_HOME%\modules\mod_dir.so >> %APFULLDIR%\conf\base.conf + echo DocumentRoot %APFULLDIR%\htdocs >> %APFULLDIR%\conf\base.conf +) + +@REM Create logs directory +if not exist %APFULLDIR%\logs mkdir %APFULLDIR%\logs +@rem set TUSCANY_SCACPP_LOG=%APFULLDIR%\logs\tuscany-server.log +set TUSCANY_SCACPP_LOGGING=9 + +@REM Start the HTTP server +echo Starting Apache httpd +httpd -X -d %APFULLDIR% diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/startserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/startserver.sh new file mode 100755 index 0000000000..cca8472b75 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/startserver.sh @@ -0,0 +1,78 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/cpp/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +# Generate the mod_axis2 configuration +if [ ! -f conf/mod_axis2.conf ]; then + echo "LoadModule axis2_module $AXIS2C_HOME/lib/libmod_axis2.so.0.0.0" >conf/mod_axis2.conf + echo "Axis2RepoPath $AXIS2C_HOME" >>conf/mod_axis2.conf + echo "Axis2LogFile $AXIS2C_HOME/logs/httpd.log" >>conf/mod_axis2.conf + echo "Axis2LogLevel AXIS2_LOG_LEVEL_INFO" >>conf/mod_axis2.conf + echo "<Location /axis2>" >>conf/mod_axis2.conf + echo " SetHandler axis2_module" >>conf/mod_axis2.conf + echo "</Location>" >>conf/mod_axis2.conf +fi + +# Generate the mod_rest configuration +if [ ! -f conf/tuscany_sca_mod_rest.conf ]; then + echo "LoadModule sca_rest_module $TUSCANY_SCACPP/extensions/rest/service/lib/libtuscany_sca_mod_rest.so.0.0.0" >conf/tuscany_sca_mod_rest.conf + echo "TuscanyHome $TUSCANY_SCACPP" >>conf/tuscany_sca_mod_rest.conf + echo "<Location /rest>" >>conf/tuscany_sca_mod_rest.conf + echo " SetHandler sca_rest_module" >>conf/tuscany_sca_mod_rest.conf + echo " TuscanyRoot $TUSCANY_SCACPP_ROOT" >>conf/tuscany_sca_mod_rest.conf + echo "</Location>" >>conf/tuscany_sca_mod_rest.conf +fi + +# Generate the HTTPD base configuration +if [ ! -f conf/base.conf ]; then + echo "DocumentRoot $APFULLDIR/htdocs" >conf/base.conf +fi + +# Create logs directory +if [ ! -d logs ]; then + mkdir logs +fi + +# Start the HTTP server +echo "Starting Apache httpd" +apachectl -k start -d $APFULLDIR diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/stopserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/stopserver.sh new file mode 100755 index 0000000000..c17f632a3e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/HttpdBigBank/httpserver/stopserver.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +# Stop the HTTP server +echo "Stopping Apache httpd" +apachectl -k stop -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/INSTALL b/sca-cpp/branches/cpp-contrib/contrib/samples/INSTALL new file mode 100644 index 0000000000..3d7155367d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/INSTALL @@ -0,0 +1,2 @@ +Please read the GettingStarted.html document for information on +building, installing and running Tuscany SCA for C++ Samples
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/LICENSE b/sca-cpp/branches/cpp-contrib/contrib/samples/LICENSE new file mode 100755 index 0000000000..f433b1a53f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/Makefile.am new file mode 100644 index 0000000000..0fdf524cc1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/Makefile.am @@ -0,0 +1,40 @@ +# 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. + +if WANT_ALL_SAMPLES + CPP_SAMPLES = CppCalculator CppBigBank + PYTHON_SAMPLES = PythonCalculator PythonWeatherForecast RestCustomer AlertAggregator + RUBY_SAMPLES = RubyCalculator RubyBigBank HttpdBigBank RestCalculator + PYTHON_RUBY_SAMPLES = RestYahoo +else +if WANT_CPP_SAMPLES + CPP_SAMPLES = CppCalculator CppBigBank +endif +if WANT_PYTHON_SAMPLES + PYTHON_SAMPLES = PythonCalculator PythonWeatherForecast RestCustomer AlertAggregator +if WANT_RUBY_SAMPLES + PYTHON_RUBY_SAMPLES = RestYahoo +endif +endif +if WANT_RUBY_SAMPLES + RUBY_SAMPLES = RubyCalculator RubyBigBank HttpdBigBank RestCalculator +endif +endif +SUBDIRS = ${CPP_SAMPLES} ${PYTHON_SAMPLES} ${RUBY_SAMPLES} ${PYTHON_RUBY_SAMPLES} + +EXTRA_DIST = autogen.sh build.sh GettingStarted.html + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/NEWS b/sca-cpp/branches/cpp-contrib/contrib/samples/NEWS new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/NEWS diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/NOTICE b/sca-cpp/branches/cpp-contrib/contrib/samples/NOTICE new file mode 100644 index 0000000000..44befbee63 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/NOTICE @@ -0,0 +1,5 @@ +Apache Tuscany SCA Native +Copyright 2005, 2007 The Apache Software Foundation + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/)
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/Makefile.am new file mode 100644 index 0000000000..3277f97e6e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/PHPCalculator/deploy +# SUBDIRS = sample.calculator sample.calculator.client +SUBDIRS = sample.calculator +EXTRA_DIST = *.composite +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/README b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/README new file mode 100644 index 0000000000..d91c958763 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/README @@ -0,0 +1,122 @@ +Tuscany SCA for C++ Samples - PHP Calculator Sample +=================================================== + +This is a simple sample to show how an SCA composite can wire together +a number of components to implement a Calculator service and expose that service as +to a number of different tpyes of client. The sample components are implemented in various +ways to demonstrate the different features of the PHP SCA extension. + +There are three sub projects in this workspace: + - sample.calculator + This contains the source code and SCDL artifacts for the SCA Calculator + composite implementing the sample Calculator + + - sample.calculator.client + A sample client which does a local call to the Calculator service + + - sample.calculator.wsclient + A sample PHP SCA Web Service client which calls the Calculator Web service. + +Additionally, there is the sample.calculator.app.composite file. This +describes the configuration of the SCA Calculator composite deployed to the +SCA runtime. + +(See the README.html file for instructions to build and run this sample - TODO) + +The file phpcalculator.png is a picture of the sample. Given the restrictions on the +current PHP extension (see TODOs in the PHP Extension README) some parts of this +have not been tested yet. + +The path that has been tested is as follows: + +Local CPP client -> CPP Calculator -> PHP Divide -> PHP Add ------> PHP Log + |-------> PHP Subtract -> PHP Log + |-------> PHP Multiple -> PHP Log + |-------> PHP Divide ---> PHP Log + +The local CPP client is used because + - the work to enable PHP to host SCA is not done yet + - running with the axis service causes missing symbols errors on my box + +The CPP Calculator component is used because + - The local CPP client can only talk directly to a CPP component + +To run the sample in this configuration use the CalculatorClient.cpp found in the +sample.calculator.client directory + +Windows +======= + +Hasn't yet been tests on windows in this configuration so ignore the following + +I use the following bat file to start the stand alone axis server and include +appropriate references to PHP dependencies. This needs turning into a proper +run script but I haven't got to this yet + +set TUSCANY_SCACPP_LOGGING=9 +set AXIS2C_HOME=C:\axis2c-bin-0.95-win32 +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%TUSCANY_SCACPP%\extensions\php\bin;%AXIS2C_HOME%\lib;c:\libxml2-2.6.23.win32\bin;c:\apps\iconv-1.9.1.win32\bin;c:\apps\zlib-1.2.3.win32\bin;C:\php-5.2.0\ +set TUSCANY_SCACPP_ROOT=%TUSCANY_SCACPP%\samples\PHPCalculator +rem set TUSCANY_SCACPP_DEFAULT_COMPONENT=sample.calculator.CalculatorComponent + +%AXIS2C_HOME%\bin\axis2_http_server.exe -l 9 + +I then + +cd %TUSCANY_SCACPP%\samples\PHPCalculator\samples.calculator.wsclient +runwsclient.bat + +This has the effect of runing a PHP/SCA client (no C++ SCA content at all) +to generate a web service request to the C++ SCA runtime hosting the calculator +application. + +Currently this doesn't run all the way through due to a WSDL bug in PHP SCA +(http://pecl.php.net/bugs/bug.php?id=9572). But it gets 99% of the way there. +You will see the server doing all of its stuff and returning the correct result. + +Linux +===== + +I find the following environment variables useful when running PHP embedded inside of +Tuscany SCA. + +# the library path use to locate shared libraries +export LD_LIBRARY_PATH=$LIBXML2_LIB:\ +$AXIS2C_HOME/lib:\ +$PHP_LIB:\ +$TUSCANY_SDOCPP/lib:\ +$TUSCANY_SCACPP/lib:\ +$TUSCANY_SCACPP/extensions/cpp/lib:\ +$TUSCANY_SCACPP/extensions/php/lib:\ +$TUSCANY_SCACPP/extensions/ws/lib:\ +$TUSCANY_SCACPP/samples/PHPCalculator/deploy/sample.calculator:\ +$PHP_SCA_SDO_LIB + +# tell PHP specifically where to find php.ini rather than relying on the default +set PHPRC=/usr/local/lib + +# tell Tuscany SCA which composite appplication to run +export TUSCANY_SCACPP_ROOT=/usr/local/tuscany/cpp/sca/deploy/samples/PHPCalculator + +# tell Tuscany SCA which is the default component in this composite +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent + +# turn on logging so you can see what's going on +export TUSCANY_SCACPP_LOGGING=9 + +There is an env.sh file that can be edited and used to set your environment. One edited +to reflect your environment do: + +source env.sh + +The CPP client currently has an independent Makefile due to build problems with the automake +build on my box. If you have your environment configured as above you should be able to do: + +make + +This will produce a.out which can be run using the provided script. + +runclient_cpp.sh + + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/phpcalculator.png b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/phpcalculator.png Binary files differnew file mode 100644 index 0000000000..c251364548 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/phpcalculator.png diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.app.composite new file mode 100644 index 0000000000..1450ad687b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.app.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.app"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + +<!-- + <component name="sample.calculator.CalculatorWSClientComponent"> + <implementation.composite name="sample.calculator.wsclient" /> + </component> +--> +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/CalculatorClient.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/CalculatorClient.cpp new file mode 100644 index 0000000000..e72b52f87e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/CalculatorClient.cpp @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +// some strangeness in the build that causes +// WinSock.h and WinSock2.h to be included leading to redefinitions +//#define _WINSOCKAPI_ + + +#include <iostream> + +#include <php_embed.h> + +#include <string> + +#include "commonj/sdo/SDO.h" + +#include "osoa/sca/sca.h" + +#include "Calculator.h" + + +using namespace std; +using namespace commonj::sdo; +using namespace osoa::sca; + + +int main (int argc, char** argv) +{ + + try + { + CompositeContext myContext = CompositeContext::getCurrent(); + Calculator *calcService = (Calculator*) myContext.locateService("CalculatorCPPComponent/CalculatorService"); + float result = calcService->div(10, 2); + cout << "calculator_client: div(10,2) = " << result << endl; + } + catch (...) + { + printf("Got and exception"); + } + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/CalculatorClient.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/CalculatorClient.php new file mode 100644 index 0000000000..7a512260ae --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/CalculatorClient.php @@ -0,0 +1,32 @@ +<?php +# 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. +# +# + +include 'SCA/SCA.php'; + +// Get a proxy to the local Calculator.php +$service = SCA::getService('../sample.calculator/Calculator.php'); + +// Call the local service and write out the response +echo "add(1.23, 4.56) = " . $service->add(1.23, 4.56) . "\n"; +echo "sub(1.23, 4.56) = " . $service->sub(1.23, 4.56) . "\n"; +echo "mul(1.23, 4.56) = " . $service->mul(1.23, 4.56) . "\n"; +echo "div(1.23, 4.56) = " . $service->div(1.23, 4.56) . "\n"; + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/env.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/env.sh new file mode 100755 index 0000000000..de34f1b42a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/env.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# 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. + +export AXIS2C_HOME=/home/slaws/apps/axis2c-bin-0.96-linux + +export LIBXML2_LIB=/usr/lib +export LIBXML2_INCLUDE=/usr/include/libxml2 + +export PHP_LIB=/usr/local/lib +export PHP_INCLUDE=/usr/local/include/php + +export PHP_SCA_SDO_INCLUDE=/home/slaws/phpbuild-5-2/pecl/SDO +export PHP_SCA_SDO_LIB=$PHP_LIB/php/extensions/no-debug-zts-20060613/ + +export TUSCANY_SDOCPP=/sdo/deploy +export TUSCANY_SCACPP=/usr/local/tuscany/cpp/sca/deploy + +export LD_LIBRARY_PATH=$LIBXML2_LIB:\ +$AXIS2C_HOME/lib:\ +$PHP_LIB:\ +$TUSCANY_SDOCPP/lib:\ +$TUSCANY_SCACPP/lib:\ +$TUSCANY_SCACPP/extensions/cpp/lib:\ +$TUSCANY_SCACPP/extensions/php/lib:\ +$TUSCANY_SCACPP/extensions/ws/lib:\ +$TUSCANY_SCACPP/samples/PHPCalculator/deploy/sample.calculator:\ +$PHP_SCA_SDO_LIB + +export TUSCANY_SCACPP_LOGGING=9 +export TUSCANY_SCACPP_ROOT=/usr/local/tuscany/cpp/sca/deploy/samples/PHPCalculator + +export PATH=.:$PATH diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_cpp.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_cpp.bat new file mode 100644 index 0000000000..0493d7410d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_cpp.bat @@ -0,0 +1,26 @@ +@echo off
+
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+
+set TUSCANY_SCACPP_ROOT=%TUSCANY_SCACPP%\samples\PHPCalculator\deploy
+set TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent
+set TUSCANY_SCACPP_LOGGING=9
+set PHRC=C:\simon\Projects\Tuscany\php\php-5.2.0\Debug_TS
+
+calculator_client.exe
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_cpp.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_cpp.sh new file mode 100755 index 0000000000..85a472b7fb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_cpp.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# 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. + +export TUSCANY_SCACPP_ROOT=/usr/local/tuscany/cpp/sca/deploy/samples/PHPCalculator +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent + +a.out +# gdb a.out +# strace a.out &> strace.txt +# valgrind a.out diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_php.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_php.bat new file mode 100644 index 0000000000..815c4fb58e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.client/runclient_php.bat @@ -0,0 +1,25 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +php TuscanyTest.php + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/Calculator.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/Calculator.wsdl new file mode 100644 index 0000000000..4d6904b687 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/Calculator.wsdl @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" + targetNamespace="http://sample/calculator"> + <types> + <xs:schema targetNamespace="http://sample/calculator" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" elementFormDefault="qualified"> + + <xs:element name="add"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="sub"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="mul"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="div"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="addResponse"> + <xs:complexType> + <xs:sequence> + <xs:element name="addReturn" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="result"> + <xs:complexType> + <xs:sequence> + <xs:element name="data" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + </xs:schema> + </types> + + <message name="addRequestMsg"> + <part name="body" element="tns:add" /> + </message> + <message name="addResponseMsg"> + <part name="body" element="tns:addResponse" /> + </message> + <message name="subRequestMsg"> + <part name="body" element="tns:sub" /> + </message> + <message name="mulRequestMsg"> + <part name="body" element="tns:mul" /> + </message> + <message name="divRequestMsg"> + <part name="body" element="tns:div" /> + </message> + + <message name="calculatorResponseMsg"> + <part name="body" element="tns:result" /> + </message> + + <portType name="Calculator"> + <operation name="add"> + <input message="tns:addRequestMsg" /> + <output message="tns:addResponseMsg" /> + </operation> + <operation name="sub"> + <input message="tns:subRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="mul"> + <input message="tns:mulRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="div"> + <input message="tns:divRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + </portType> + + <binding name="CalculatorBinding" + type="tns:Calculator"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> + <operation name="add"> + <soap:operation soapAction="CalculatorService#add" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="sub"> + <soap:operation soapAction="CalculatorService#sub" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="mul"> + <soap:operation soapAction="CalculatorService#mul" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="div"> + <soap:operation soapAction="CalculatorService#div" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + </binding> + + <service name="CalculatorService"> + <port name="CalculatorPort" + binding="tns:CalculatorBinding"> + <soap:address location="http://localhost:9090/axis2/services/sample.calculator.CalculatorComponent/CalculatorService" /> + </port> + </service> +</definitions> +<!-- this line identifies this file as WSDL generated by SCA for PHP. Do not remove --> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/CalculatorWSClient.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/CalculatorWSClient.php new file mode 100644 index 0000000000..82faf1ef19 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/CalculatorWSClient.php @@ -0,0 +1,31 @@ +<?php +# 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. +# +# +include 'SCA/SCA.php'; + +// Get a proxy to the local Calculator.php +$service = SCA::getService('Calculator.wsdl'); + +// Call the local service and write out the response +//echo "add(1.23, 4.56) = " . $service->add(1.23, 4.56) . "\n"; +//echo "sub(1.23, 4.56) = " . $service->sub(1.23, 4.56) . "\n"; +//echo "mul(1.23, 4.56) = " . $service->mul(1.23, 4.56) . "\n"; +echo "div(1.23, 4.56) = " . $service->div(1.23, 4.56) . "\n"; + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/runwsclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/runwsclient.bat new file mode 100644 index 0000000000..a1482be5db --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator.wsclient/runwsclient.bat @@ -0,0 +1,25 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +php CalculatorWSClient.php + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.componentType new file mode 100644 index 0000000000..aca0b2a6e4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.componentType @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="AddService"> + <interface.cpp header="Add.h"/> + </service> + + <reference name="log_service"> + <interface.cpp header="Log.h"/> + </reference> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.h new file mode 100644 index 0000000000..4abfe9af6b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_add_h +#define sample_add_h + +class Add +{ + public: + virtual float add(float num1, float num2) = 0; +}; + +#endif // sample_add_h + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.php new file mode 100644 index 0000000000..4b5747e10f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Add.php @@ -0,0 +1,32 @@ +<?php +# 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. +# +# + +require 'SCA/SCA.php'; + +$num1 = $_REQUEST[0]; +$num2 = $_REQUEST[1]; + +$result = $num1 + $num2; + +$log_proxy = SCA::getService("log_service"); +$log_proxy->log_message($result); + +echo $result; +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.componentType new file mode 100644 index 0000000000..7767c663bf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.componentType @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="CalculatorService"> + <interface.cpp header="Calculator.h"/> + </service> + + <reference name="add_service"> + <interface.cpp header="Add.h"/> + </reference> + + <reference name="sub_service"> + <interface.cpp header="Subtract.h"/> + </reference> + + <reference name="mul_service"> + <interface.cpp header="Multiply.h"/> + </reference> + + <reference name="div_service"> + <interface.cpp header="Divide.h"/> + </reference> + +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.h new file mode 100644 index 0000000000..90e97b5319 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef sample_calculator_h +#define sample_calculator_h + +class Calculator +{ +public: + virtual float add(float arg1, float arg2) = 0; + virtual float sub(float arg1, float arg2) = 0; + virtual float mul(float arg1, float arg2) = 0; + virtual float div(float arg1, float arg2) = 0; +}; + +#endif // sample_calculator_h diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.php new file mode 100644 index 0000000000..ce8f7899da --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.php @@ -0,0 +1,97 @@ +<?php +# 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. +# +# +include 'SCA/SCA.php'; + +/** + * @service + * @binding.ws + */ +class Calculator { + + /** + * @reference + * @binding.php Add.php + */ + public $add_service; + + /** + * @reference + * @binding.php Subtract.php + */ + public $sub_service; + + /** + * @reference + * @binding.php Multiply.php + */ + public $mul_service; + + /** + * @reference + * @binding.ws Divide.wsdl + */ + public $div_service; + + /** + * Addition + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function add($num1, $num2) { + return $this->mul_service->add($num1, $num2); + } + + /** + * Subtraction + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function sub($num1, $num2) { + return $this->mul_service->sub($num1, $num2); + } + + /** + * Multiplication + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function mul($num1, $num2) { + return $this->mul_service->mul($num1, $num2); + } + + /** + * Division + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function div($num1, $num2) { + return $this->div_service->div($num1, $num2); + } +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.wsdl new file mode 100644 index 0000000000..331b996ba2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Calculator.wsdl @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" + targetNamespace="http://sample/calculator"> + <types> + <xs:schema targetNamespace="http://sample/calculator" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" elementFormDefault="qualified"> + + <xs:element name="add"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="sub"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="mul"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="div"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="result"> + <xs:complexType> + <xs:sequence> + <xs:element name="data" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + </xs:schema> + </types> + + <message name="addRequestMsg"> + <part name="body" element="tns:add" /> + </message> + <message name="subRequestMsg"> + <part name="body" element="tns:sub" /> + </message> + <message name="mulRequestMsg"> + <part name="body" element="tns:mul" /> + </message> + <message name="divRequestMsg"> + <part name="body" element="tns:div" /> + </message> + + <message name="calculatorResponseMsg"> + <part name="body" element="tns:result" /> + </message> + + <portType name="Calculator"> + <operation name="add"> + <input message="tns:addRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="sub"> + <input message="tns:subRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="mul"> + <input message="tns:mulRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="div"> + <input message="tns:divRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + </portType> + + <binding name="CalculatorBinding" + type="tns:Calculator"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> + <operation name="add"> + <soap:operation soapAction="CalculatorService#add" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="sub"> + <soap:operation soapAction="CalculatorService#sub" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="mul"> + <soap:operation soapAction="CalculatorService#mul" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="div"> + <soap:operation soapAction="CalculatorService#div" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + </binding> + + <service name="CalculatorService"> + <port name="CalculatorPort" + binding="tns:CalculatorBinding"> + <soap:address location="http://localhost:9090/axis2/services/sample.calculator.CalculatorComponent/CalculatorService" /> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.componentType new file mode 100644 index 0000000000..e2799af955 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.componentType @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="CalculatorService"> + <interface.cpp header="Calculator.h"/> + </service> + + <reference name="divideService"> + <interface.cpp header="Divide.h"/> + </reference> + +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.cpp new file mode 100644 index 0000000000..2d880de72d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.cpp @@ -0,0 +1,90 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <stdio.h> + +#include "osoa/sca/ComponentContext.h" +#include "osoa/sca/ServiceRuntimeException.h" + +#include "CalculatorImpl.h" +#include "Divide.h" + +CalculatorImpl::CalculatorImpl() +{ +} + +CalculatorImpl::~CalculatorImpl() +{ +} + +// Calculator interface +float CalculatorImpl::add(float arg1, float arg2) +{ + float result = arg1 + arg2; + + printf("CalculatorImpl::add %f + %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::sub(float arg1, float arg2) +{ + float result = arg1 - arg2; + printf("CalculatorImpl::sub %f - %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::mul(float arg1, float arg2) +{ + float result = arg1 * arg2; + printf("CalculatorImpl::mul %f * %f = %f\n", arg1, arg2, result); + return result; +} + +float CalculatorImpl::div(float arg1, float arg2) +{ + float result = 0; + + // This method shows how to invoke a service on a different component from within a component + + // First, get the current ComponentContext + osoa::sca::ComponentContext myContext = osoa::sca::ComponentContext::getCurrent(); + + try + { + // Find the required service, as referenced in CalculatorImpl.componentType + Divide* divideService = (Divide*)myContext.getService("divideService"); + + // Finally, invoke the service + result = divideService->div(arg1, arg2); + + printf("CalculatorImpl::div Divide returned result: %f\n", result); + + } + catch (osoa::sca::ServiceRuntimeException& e) + { + // Print out error message and carry on + printf("CalculatorImpl::div Error whilst invoking Divide: %s", e.getMessageText()); + } + + return result; +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.h new file mode 100644 index 0000000000..af8a5eeab1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef sample_calculatorimpl_h +#define sample_calculatorimpl_h + +#include "Calculator.h" + +class CalculatorImpl : public Calculator +{ +public: + CalculatorImpl(); + virtual ~CalculatorImpl(); + + // Calculator interface + virtual float add(float arg1, float arg2); + virtual float sub(float arg1, float arg2); + virtual float mul(float arg1, float arg2); + virtual float div(float arg1, float arg2); +}; + +#endif // sample_calculatorimpl_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Proxy.cpp new file mode 100644 index 0000000000..084e6fbf2f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Proxy.cpp @@ -0,0 +1,98 @@ +/* + * 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. + */ + +#include "CalculatorImpl_CalculatorService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorImpl_CalculatorService_Proxy* CalculatorImpl_CalculatorService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CalculatorImpl_CalculatorService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CalculatorImpl_CalculatorService_Proxy_Destructor(void* proxy) + { + delete (CalculatorImpl_CalculatorService_Proxy*)proxy; + } +} + +CalculatorImpl_CalculatorService_Proxy::CalculatorImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CalculatorImpl_CalculatorService_Proxy::~CalculatorImpl_CalculatorService_Proxy() +{ + if (target) + delete target; +} + +float CalculatorImpl_CalculatorService_Proxy::add( float arg0, float arg1) +{ + tuscany::sca::Operation operation("add"); + operation.addParameter("arg1", &arg0); + operation.addParameter("arg2", &arg1); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float CalculatorImpl_CalculatorService_Proxy::sub( float arg0, float arg1) +{ + tuscany::sca::Operation operation("sub"); + operation.addParameter("arg1", &arg0); + operation.addParameter("arg2", &arg1); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float CalculatorImpl_CalculatorService_Proxy::mul( float arg0, float arg1) +{ + tuscany::sca::Operation operation("mul"); + operation.addParameter("arg1", &arg0); + operation.addParameter("arg2", &arg1); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + +float CalculatorImpl_CalculatorService_Proxy::div( float arg0, float arg1) +{ + tuscany::sca::Operation operation("div"); + operation.addParameter("arg1", &arg0); + operation.addParameter("arg2", &arg1); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Proxy.h new file mode 100644 index 0000000000..700a060636 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Proxy.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef CalculatorImpl_CalculatorService_Proxy_h +#define CalculatorImpl_CalculatorService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "Calculator.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CalculatorImpl_CalculatorService_Proxy : public Calculator +{ +public: + CalculatorImpl_CalculatorService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CalculatorImpl_CalculatorService_Proxy(); + virtual float add( float arg1, float arg2); + virtual float sub( float arg1, float arg2); + virtual float mul( float arg1, float arg2); + virtual float div( float arg1, float arg2); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CalculatorImpl_CalculatorService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Wrapper.cpp new file mode 100644 index 0000000000..82114b4d6d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Wrapper.cpp @@ -0,0 +1,135 @@ +/* + * 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. + */ + +#include "CalculatorImpl_CalculatorService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorImpl_CalculatorService_Wrapper* CalculatorImpl_CalculatorService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new CalculatorImpl_CalculatorService_Wrapper(target); + } +} + +CalculatorImpl_CalculatorService_Wrapper::CalculatorImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (CalculatorImpl*)getImplementation(); +} + +CalculatorImpl_CalculatorService_Wrapper::~CalculatorImpl_CalculatorService_Wrapper() +{ + releaseImplementation(); +} + +void* CalculatorImpl_CalculatorService_Wrapper::newImplementation() +{ + return new CalculatorImpl; +} + +void CalculatorImpl_CalculatorService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void CalculatorImpl_CalculatorService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "add") + { + float& p0 = *( float*)operation.getParameterValue(0); + float& p1 = *( float*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->add(p0, p1); + } + else + { + float* ret = new float; + *ret = impl->add(p0, p1); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "sub") + { + float& p0 = *( float*)operation.getParameterValue(0); + float& p1 = *( float*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->sub(p0, p1); + } + else + { + float* ret = new float; + *ret = impl->sub(p0, p1); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "mul") + { + float& p0 = *( float*)operation.getParameterValue(0); + float& p1 = *( float*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->mul(p0, p1); + } + else + { + float* ret = new float; + *ret = impl->mul(p0, p1); + operation.setReturnValue((const float*)ret); + } + return; + } + if (operationName == "div") + { + float& p0 = *( float*)operation.getParameterValue(0); + float& p1 = *( float*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->div(p0, p1); + } + else + { + float* ret = new float; + *ret = impl->div(p0, p1); + operation.setReturnValue((const float*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Wrapper.h new file mode 100644 index 0000000000..63bae2f75c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_CalculatorService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef CalculatorImpl_CalculatorService_Wrapper_h +#define CalculatorImpl_CalculatorService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "CalculatorImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class CalculatorImpl_CalculatorService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + CalculatorImpl_CalculatorService_Wrapper(tuscany::sca::model::Service* target); + virtual ~CalculatorImpl_CalculatorService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + CalculatorImpl* impl; +}; + +#endif // CalculatorImpl_CalculatorService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_divideService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_divideService_Proxy.cpp new file mode 100644 index 0000000000..510069c331 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_divideService_Proxy.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#include "CalculatorImpl_divideService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + CalculatorImpl_divideService_Proxy* CalculatorImpl_divideService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new CalculatorImpl_divideService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void CalculatorImpl_divideService_Proxy_Destructor(void* proxy) + { + delete (CalculatorImpl_divideService_Proxy*)proxy; + } +} + +CalculatorImpl_divideService_Proxy::CalculatorImpl_divideService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +CalculatorImpl_divideService_Proxy::~CalculatorImpl_divideService_Proxy() +{ + if (target) + delete target; +} + +float CalculatorImpl_divideService_Proxy::div( float arg0, float arg1) +{ + tuscany::sca::Operation operation("div"); + operation.addParameter("num1", &arg0); + operation.addParameter("num2", &arg1); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_divideService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_divideService_Proxy.h new file mode 100644 index 0000000000..0459e70f33 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/CalculatorImpl_divideService_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef CalculatorImpl_divideService_Proxy_h +#define CalculatorImpl_divideService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "Divide.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class CalculatorImpl_divideService_Proxy : public Divide +{ +public: + CalculatorImpl_divideService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~CalculatorImpl_divideService_Proxy(); + virtual float div( float num1, float num2); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // CalculatorImpl_divideService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.componentType new file mode 100644 index 0000000000..428d19f8bc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.componentType @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="DivideService"> + <interface.cpp header="Divide.h"/> + </service> + + <reference name="cppDivideService"> + <interface.cpp header="Divide.h"/> + </reference> + + <reference name="add_service"> + <interface.cpp header="Add.h"/> + </reference> + + <reference name="subtract_service"> + <interface.cpp header="Subtract.h"/> + </reference> + + <reference name="multiply_service"> + <interface.cpp header="Multiply.h"/> + </reference> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.h new file mode 100644 index 0000000000..c2ab3b816c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_divide_h +#define sample_divide_h + +class Divide +{ + public: + virtual float div(float num1, float num2) = 0; +}; + +#endif // sample_divide_h + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.php new file mode 100644 index 0000000000..c2e9adda70 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Divide.php @@ -0,0 +1,71 @@ +<?php +# 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. +# +# + +/** + * @service + * @binding.ws + */ +class Divide { + + /** + * @reference + * @binding.tuscany cppDivideService + */ + public $another_divide; + + /** + * @reference + * @binding.tuscany add_service + */ + public $add_service; + + /** + * @reference + * @binding.tuscany subtract_service + */ + public $subtract_service; + + /** + * @reference + * @binding.tuscany multiply_service + */ + public $multiply_service; + + /** + * Division + * + * @param float $num1 (the first number) + * @param float $num2 (the second number) + * @return float The result + */ + function div($num1, $num2) { + + //$this->add_service->add(12.0, 27.0); + //$this->subtract_service->sub(12.0, 27.0); + $this->multiply_service->mul(12.0, 27.0); + + $result = $this->another_divide->div($num1, $num2); + + return $result; + } + +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.componentType new file mode 100644 index 0000000000..d7369e3ff0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.componentType @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + + <service name="DivideService"> + <interface.cpp header="Divide.h"/> + </service> + +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.cpp new file mode 100644 index 0000000000..88b9065171 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.cpp @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <stdio.h> + +#include "DivideImpl.h" + +DivideImpl::DivideImpl() +{ +} + +DivideImpl::~DivideImpl() +{ +} + +// Divide interface +float DivideImpl::div(float arg1, float arg2) +{ + if(arg2 == 0.0) + { + printf("DivideImpl::div %f / %f !! Cannot divide by zero, so returning 0\n", arg1, arg2); + return 0; + } + + float result = arg1 / arg2; + printf("DivideImpl::div %f / %f = %f\n", arg1, arg2, result); + return result; +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.h new file mode 100644 index 0000000000..42cf47b1d4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl.h @@ -0,0 +1,39 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_divideimpl_h +#define sample_divideimpl_h + +#include "Divide.h" + +class DivideImpl : public Divide +{ +public: + DivideImpl(); + virtual ~DivideImpl(); + + // Divide interface + virtual float div(float arg1, float arg2); +}; + +#endif // sample_divideimpl_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Proxy.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Proxy.cpp new file mode 100644 index 0000000000..e8dbeb2e0d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Proxy.cpp @@ -0,0 +1,65 @@ +/* + * 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. + */ + +#include "DivideImpl_DivideService_Proxy.h" + +#include "osoa/sca/sca.h" + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + DivideImpl_DivideService_Proxy* DivideImpl_DivideService_Proxy_Factory(tuscany::sca::ServiceWrapper* target) + { + return new DivideImpl_DivideService_Proxy(target); + } + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + void DivideImpl_DivideService_Proxy_Destructor(void* proxy) + { + delete (DivideImpl_DivideService_Proxy*)proxy; + } +} + +DivideImpl_DivideService_Proxy::DivideImpl_DivideService_Proxy(tuscany::sca::ServiceWrapper* targ) : target(targ) +{ +} + +DivideImpl_DivideService_Proxy::~DivideImpl_DivideService_Proxy() +{ + if (target) + delete target; +} + +float DivideImpl_DivideService_Proxy::div( float arg0, float arg1) +{ + tuscany::sca::Operation operation("div"); + operation.addParameter("num1", &arg0); + operation.addParameter("num2", &arg1); + float ret; + operation.setReturnValue(&ret); + target->invoke(operation); + return *(float*)operation.getReturnValue(); +} + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Proxy.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Proxy.h new file mode 100644 index 0000000000..d66cde1c06 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Proxy.h @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#ifndef DivideImpl_DivideService_Proxy_h +#define DivideImpl_DivideService_Proxy_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "Divide.h" +#include "tuscany/sca/core/ServiceWrapper.h" + +class DivideImpl_DivideService_Proxy : public Divide +{ +public: + DivideImpl_DivideService_Proxy(tuscany::sca::ServiceWrapper*); + virtual ~DivideImpl_DivideService_Proxy(); + virtual float div( float num1, float num2); +private: + tuscany::sca::ServiceWrapper* target; +}; + +#endif // DivideImpl_DivideService_Proxy_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Wrapper.cpp b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Wrapper.cpp new file mode 100644 index 0000000000..9c6f2101fe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Wrapper.cpp @@ -0,0 +1,84 @@ +/* + * 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. + */ + +#include "DivideImpl_DivideService_Wrapper.h" + +#include "osoa/sca/sca.h" + + + +extern "C" +{ + + #if defined(WIN32) || defined(_WINDOWS) + __declspec(dllexport) + #endif + DivideImpl_DivideService_Wrapper* DivideImpl_DivideService_Wrapper_Factory(tuscany::sca::model::Service* target) + { + return new DivideImpl_DivideService_Wrapper(target); + } +} + +DivideImpl_DivideService_Wrapper::DivideImpl_DivideService_Wrapper(tuscany::sca::model::Service* target) : tuscany::sca::cpp::CPPServiceWrapper(target) +{ + impl = (DivideImpl*)getImplementation(); +} + +DivideImpl_DivideService_Wrapper::~DivideImpl_DivideService_Wrapper() +{ + releaseImplementation(); +} + +void* DivideImpl_DivideService_Wrapper::newImplementation() +{ + return new DivideImpl; +} + +void DivideImpl_DivideService_Wrapper::deleteImplementation() +{ + delete impl; +} + +void DivideImpl_DivideService_Wrapper::invokeService(tuscany::sca::Operation& operation) +{ + const std::string& operationName = operation.getName(); + + if (operationName == "div") + { + float& p0 = *( float*)operation.getParameterValue(0); + float& p1 = *( float*)operation.getParameterValue(1); + + if(operation.getReturnValue() != NULL) + { + *(float*)operation.getReturnValue() = impl->div(p0, p1); + } + else + { + float* ret = new float; + *ret = impl->div(p0, p1); + operation.setReturnValue((const float*)ret); + } + return; + } + + + throw osoa::sca::ServiceRuntimeException("Invalid operation"); + +} + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Wrapper.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Wrapper.h new file mode 100644 index 0000000000..5cd10f5188 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/DivideImpl_DivideService_Wrapper.h @@ -0,0 +1,43 @@ +/* + * 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. + */ + +#ifndef DivideImpl_DivideService_Wrapper_h +#define DivideImpl_DivideService_Wrapper_h + +#if defined(WIN32) || defined (_WINDOWS) +#pragma warning(disable: 4786) +#endif + +#include "DivideImpl.h" +#include "tuscany/sca/cpp/CPPServiceWrapper.h" + +class DivideImpl_DivideService_Wrapper : public tuscany::sca::cpp::CPPServiceWrapper +{ +public: + DivideImpl_DivideService_Wrapper(tuscany::sca::model::Service* target); + virtual ~DivideImpl_DivideService_Wrapper(); + virtual void invokeService(tuscany::sca::Operation& operation); + virtual void* newImplementation(); + virtual void deleteImplementation(); +private: + DivideImpl* impl; +}; + +#endif // DivideImpl_DivideService_Wrapper_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.componentType new file mode 100644 index 0000000000..0b4423300d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.componentType @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="LogService"> + <interface.cpp header="Log.h"/> + </service> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.h new file mode 100644 index 0000000000..c21da1bddf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_log_h +#define sample_log_h + +class Log +{ + public: + virtual void div(char *message) = 0; +}; + +#endif // sample_log_h + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.php new file mode 100644 index 0000000000..0a955f36d3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Log.php @@ -0,0 +1,36 @@ +<?php +# 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. +# +# + +/** + * @service + */ +class Log { + + /** + * Log + * + * @param string $message (the message to be logged) + */ + function log_message($message) { + SCA::$logger->toLog('>>> ' . $message); + } +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Makefile.am new file mode 100644 index 0000000000..84567a5add --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Makefile.am @@ -0,0 +1,56 @@ +# 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. + +deploydir=$(prefix)/PHPCalculator/deploy +compositedir=$(deploydir)/sample.calculator + +BUILT_SOURCES = scagen + +noinst_HEADERS = *.h + +scagen: + java -jar $(TUSCANY_SCACPP)/bin/scagen.jar -dir . -output . + +composite_SCRIPTS = runwsserver.sh + +composite_LTLIBRARIES = libCalculator.la +composite_DATA = *.composite *.componentType *.wsdl *.php +EXTRA_DIST = *.composite *.componentType *.wsdl *.php runwsserver.sh + +dist_libCalculator_la_SOURCES = \ +CalculatorImpl.cpp \ +DivideImpl.cpp + +nodist_libCalculator_la_SOURCES = \ +CalculatorImpl_CalculatorService_Proxy.cpp \ +CalculatorImpl_CalculatorService_Wrapper.cpp \ +CalculatorImpl_divideService_Proxy.cpp \ +DivideImpl_DivideService_Proxy.cpp \ +DivideImpl_DivideService_Wrapper.cpp + + +libCalculator_la_LIBADD = \ +-L${TUSCANY_SCACPP}/lib \ + -ltuscany_sca \ +-L${TUSCANY_SCACPP}/extensions/cpp/lib \ + -ltuscany_sca_cpp + +INCLUDES = \ +-I$(TUSCANY_SCACPP)/extensions/cpp/include \ +-I$(TUSCANY_SCACPP)/include \ +-I${TUSCANY_SDOCPP}/include + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.componentType new file mode 100644 index 0000000000..af1631518a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.componentType @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="MultiplyService"> + <interface.cpp header="Multiply.h"/> + </service> + <reference name="log_service"> + <interface.cpp header="Log.h"/> + </reference> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.h new file mode 100644 index 0000000000..94de825f62 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_multiply_h +#define sample_multiply_h + +class Multiply +{ + public: + virtual float mul(float num1, float num2) = 0; +}; + +#endif // sample_multiply_h + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.php new file mode 100644 index 0000000000..8ffe02675d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Multiply.php @@ -0,0 +1,33 @@ +<?php +# 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. +# +# +require 'SCA/SCA.php'; + +class Multiply { + function mul($num1, $num2) { + $result = $num1 * $num2; + + $log_proxy = SCA::getService("log_service"); + $log_proxy->log_message($result); + + return $result; + } +} + +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.componentType new file mode 100644 index 0000000000..35dab8bb9b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.componentType @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0"> + <service name="SubtractService"> + <interface.cpp header="Subtract.h"/> + </service> + + <reference name="log_service"> + <interface.cpp header="Log.h"/> + </reference> +</componentType> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.h b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.h new file mode 100644 index 0000000000..a50b79ccc6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.h @@ -0,0 +1,34 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + + +#ifndef sample_subtract_h +#define sample_subtract_h + +class Subtract +{ + public: + virtual float sub(float num1, float num2) = 0; +}; + +#endif // sample_subtract_h + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.php b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.php new file mode 100644 index 0000000000..8d3a1b3ddf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/Subtract.php @@ -0,0 +1,30 @@ +<?php +# 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. +# +# +require 'SCA/SCA.php'; + +function sub($num1, $num2){ + $result = $num1 - $num2; + + $log_proxy = SCA::getService("log_service"); + $log_proxy->log_message($result); + + return $result; +} +?> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/runwsserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/runwsserver.sh new file mode 100755 index 0000000000..069d734fea --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/runwsserver.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/lib:$TUSCANY_SCACPP/extensions/cpp/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ + +cd $AXIS2C_HOME/bin +./axis2_http_server diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/sample.calculator.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/sample.calculator.composite new file mode 100644 index 0000000000..09b7070fb8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PHPCalculator/sample.calculator/sample.calculator.composite @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> +<!-- + <service name="CalculatorService"> + <interface.wsdl interface="http://sample/calculator#wsdl.interface(Calculator)"/> + <binding.ws/> + <reference>CalculatorCPPComponent</reference> + </service> +--> + + <component name="CalculatorCPPComponent"> + <implementation.cpp library="Calculator" header="CalculatorImpl.h"/> + <reference name="divideService">DivideComponent/DivideService</reference> + </component> + + <component name="CalculatorPHPComponent"> + <implementation.php module="Calculator" scope="composite"/> + <reference name="add_service">AddComponent</reference> + <reference name="sub_service">SubtractComponent</reference> + <reference name="mul_service">MultiplyComponent</reference> + <reference name="div_service">DivideComponent</reference> + </component> + + <component name="AddComponent"> + <implementation.php module="Add" scope="composite"/> + <reference name="log_service">LogComponent</reference> + </component> + + <component name="SubtractComponent"> + <implementation.php module="Subtract" scope="composite"/> + <reference name="log_service">LogComponent</reference> + </component> + + <component name="MultiplyComponent"> + <implementation.php module="Multiply" class="Multiply" scope="composite"/> + <reference name="log_service">LogComponent</reference> + </component> + + <component name="DivideComponent"> + <implementation.php module="Divide" class="Divide" scope="composite"/> + <reference name="cppDivideService">DivideCPPComponent/DivideService</reference> + <reference name="add_service">AddComponent</reference> + <reference name="multiply_service">MultiplyComponent</reference> + <reference name="subtract_service">SubtractComponent</reference> + <reference name="add_service">AddComponent</reference> + </component> + + <component name="DivideCPPComponent"> + <implementation.cpp library="Calculator" header="DivideImpl.h"/> + </component> + + <component name="LogComponent"> + <implementation.php module="Log" class="Log" scope="composite"/> + </component> + + + + + +</composite> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/Makefile.am new file mode 100644 index 0000000000..21952e3df4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/PythonCalculator/deploy +SUBDIRS = sample.calculator sample.calculator.client +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/README b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/README new file mode 100644 index 0000000000..670f561dc1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/README @@ -0,0 +1,20 @@ +Tuscany SCA for C++ Samples - Calculator Sample +=============================================== + +This is a very simple sample to show how an SCA composite can wire together +two components to implement a Calculator service and expose that service as +a Web Service. + +There are two sub projects in this workspace: + - sample.calculator + This contains the source code and SCDL artifacts for the SCA Calculator. + composite implementing the sample Calculator. + + - sample.calculator.client + A sample client which does a local call to the Calculator service. + +Additionally, there is the sample.calculator.app.composite file. This +describes the configuration of the SCA Calculator composite deployed to the +SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/README.html new file mode 100644 index 0000000000..3b9f72864e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/README.html @@ -0,0 +1,191 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - Python Calculator Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - Python Calculator Sample</H1> + + <P>This is a very simple sample to show how an SCA composite can wire + together two Python components to implement a Calculator service and invoke + the service via a local client. + </P> + <P>See the <A HREF="../../doc/PythonExtension.html">Python extension</A> + documentation for information about building the Tuscany Python extension + and using Python in SCA composites. + </P> + <P>There are two sub projects in this workspace:</P> + <UL> + <LI>sample.calculator<BR/> + This contains the Python scripts and SCDL artifacts for the SCA Calculator + composite implementing the sample Calculator. + </LI> + <LI>sample.calculator.client<BR/> + A sample client which does a local call to the Calculator service. + </LI> + </UL> + <P>Additionally, there is the sample.calculator.app.composite file. This + describes the configuration of the SCA Calculator composite deployed to the SCA + runtime. + </P> + + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the Python samples on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the Python Calculator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the Python Calculator sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the Python Calculator sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the Python samples on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL></LI> + </LI> + <LI>As the Python Calculator sample is based on Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Python samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-python --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/PythonCalculator</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the Python Calculator sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The Python Calculator sample requires the following extension: + <UL> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have this extension built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/PythonCalculator/deploy/sample.calculator.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the Python Calculator sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL></LI> + </LI> + <LI>As this sample is based on Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\PythonCalculator</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the Python Calculator sample on Windows</H2></A> + <OL> + <LI>The Python Calculator sample requires the following extension: + <UL> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have this extension built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\PythonCalculator\deploy\sample.calculator.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.app.composite new file mode 100644 index 0000000000..ea4e3e118d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.app.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.app"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/Makefile.am new file mode 100644 index 0000000000..df1187aab1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/PythonCalculator/deploy +clientdir=$(deploydir)/sample.calculator.client + +client_DATA = *.py +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh *.py diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/calculator_client.py b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/calculator_client.py new file mode 100644 index 0000000000..58d6f45606 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/calculator_client.py @@ -0,0 +1,50 @@ +# 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. +# +# +# +# +# This Python code is a simple sample that provides a Python +# client for the Calculator sample + + +import sys +import sca + +op = sys.argv[1] +val1 = sys.argv[2] +val2 = sys.argv[3] + +# Locate the calculator service +calc = sca.locateservice("CalculatorComponent") + +# Invoke the calculator operations +if op == 'add': + result = calc.add(val1, val2) + +elif op == 'sub': + result = calc.sub(val1, val2) + +elif op == 'mul': + result = calc.mul(val1, val2) + +elif op == 'div': + result = calc.div(val1, val2) + + +print "calculator_client: ",op,"(",val1,",",val2,") = ",result + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/runclient.bat new file mode 100644 index 0000000000..206b1e5a59 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/runclient.bat @@ -0,0 +1,45 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo using SDO installed at %TUSCANY_SDOCPP% + +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\python\bin;%TUSCANY_SDOCPP%\bin;%PATH% +set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd %TUSCANY_SCACPP_ROOT%\sample.calculator.client +python calculator_client.py div 5 2 + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/runclient.sh new file mode 100755 index 0000000000..d500d3d132 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator.client/runclient.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$PYTHON_LIB != x ]; then +echo "Using Python library installed at $PYTHON_LIB" +export LD_LIBRARY_PATH=$PYTHON_LIB:$LD_LIBRARY_PATH +export PATH=$PYTHON_LIB/../bin:$PATH +fi + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/lib:$TUSCANY_SCACPP/extensions/python/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/sample.calculator.client +python calculator_client.py div 5 2 diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/Calculator.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/Calculator.wsdl new file mode 100644 index 0000000000..331b996ba2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/Calculator.wsdl @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" + targetNamespace="http://sample/calculator"> + <types> + <xs:schema targetNamespace="http://sample/calculator" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" elementFormDefault="qualified"> + + <xs:element name="add"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="sub"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="mul"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="div"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="result"> + <xs:complexType> + <xs:sequence> + <xs:element name="data" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + </xs:schema> + </types> + + <message name="addRequestMsg"> + <part name="body" element="tns:add" /> + </message> + <message name="subRequestMsg"> + <part name="body" element="tns:sub" /> + </message> + <message name="mulRequestMsg"> + <part name="body" element="tns:mul" /> + </message> + <message name="divRequestMsg"> + <part name="body" element="tns:div" /> + </message> + + <message name="calculatorResponseMsg"> + <part name="body" element="tns:result" /> + </message> + + <portType name="Calculator"> + <operation name="add"> + <input message="tns:addRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="sub"> + <input message="tns:subRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="mul"> + <input message="tns:mulRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="div"> + <input message="tns:divRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + </portType> + + <binding name="CalculatorBinding" + type="tns:Calculator"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> + <operation name="add"> + <soap:operation soapAction="CalculatorService#add" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="sub"> + <soap:operation soapAction="CalculatorService#sub" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="mul"> + <soap:operation soapAction="CalculatorService#mul" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="div"> + <soap:operation soapAction="CalculatorService#div" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + </binding> + + <service name="CalculatorService"> + <port name="CalculatorPort" + binding="tns:CalculatorBinding"> + <soap:address location="http://localhost:9090/axis2/services/sample.calculator.CalculatorComponent/CalculatorService" /> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/CalculatorImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/CalculatorImpl.py new file mode 100644 index 0000000000..86dbef9e4d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/CalculatorImpl.py @@ -0,0 +1,56 @@ +# 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. +# +# +# +# +# This Python code is a simple sample that provides a Python implementation of +# the Calculator sample +# + + +# The module-level add function +def add(val1, val2): + result = float(val1) + float(val2) + print "Python - CalculatorImpl.add " + str(val1) + " + " + str(val2) + " = " + str(result) + return result + +# The module-level sub function +def sub(val1, val2): + result = float(val1) - float(val2) + print "Python - CalculatorImpl.sub " + str(val1) + " - " + str(val2) + " = " + str(result) + return result + +# The module-level mul function +def mul(val1, val2): + result = float(val1) * float(val2) + print "Python - CalculatorImpl.mul " + str(val1) + " * " + str(val2) + " = " + str(result) + return result + +# The module-level div function +def div(val1, val2): + + + print "Python - CalculatorImpl.div calling divideService to determine " + str(val1) + " / " + str(val2) + + # Use the divideService reference + result = divideService.divide(val1, val2) + + print "Python - CalculatorImpl.div divideService returned " + str(result) + + return result + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/DivideImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/DivideImpl.py new file mode 100644 index 0000000000..3921731de6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/DivideImpl.py @@ -0,0 +1,65 @@ +# 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. +# +# +# +# +# This Python code is a simple sample that provides a Python implementation of +# the Divide Service used in the Calculator sample +# +# Either use the divide function in the DivideClass class (using classes allows +# composite scoping to be used) +# e.g. in CalculatorComposite.composite use the line: +# <implementation.python module="DivideImpl" class="DivideClass"/> +# +# Or just use the module-level divide function +# e.g. in CalculatorComposite.composite use the line: +# <implementation.python module="DivideImpl" /> +# + + +class DivideClass: + "A class to handle dividing" + + def __init__(self): + print "Python - DivideImpl.DivideClass constructor" + + # The class-level divide function + def divide(self, val1, val2): + result = float(val1) / float(val2) + + print "Python - DivideImpl.DivideClass.divide " + str( val1 ) + " / " + str(val2) + " = " + str(result) + + # Use the doRounding property + if doRounding: + result = round(result) + print "Python - DivideImpl.DivideClass.divide is rounding the result to " + str(result) + + return result + +# The module-level divide function +def divide(val1, val2): + result = float(val1) / float(val2) + print "Python - DivideImpl.divide " + str(val1) + " / " + str(val2) + " = " + str(result) + + # Use the doRounding property + if doRounding: + result = round(result) + print "Python - DivideImpl.divide is rounding the result to " + str(result) + + return result + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/Makefile.am new file mode 100644 index 0000000000..ec7cf8a8ad --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/PythonCalculator/deploy +compositedir=$(deploydir)/sample.calculator + +composite_DATA = *.composite *.wsdl *.py + +EXTRA_DIST = *.composite *.wsdl *.py diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/sample.calculator.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/sample.calculator.composite new file mode 100644 index 0000000000..7f2221b696 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonCalculator/sample.calculator/sample.calculator.composite @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> + + <component name="CalculatorComponent"> + <implementation.python module="CalculatorImpl" scope="composite"/> + <reference name="divideService">DivideComponent</reference> + </component> + + <component name="DivideComponent"> + <implementation.python module="DivideImpl" scope="composite"/> + <property name="doRounding">true</property> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/Makefile.am new file mode 100644 index 0000000000..6b2d218134 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/PythonWeatherForecast/deploy +SUBDIRS = sample.weather sample.weather.client +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/README b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/README new file mode 100644 index 0000000000..c590973f5f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/README @@ -0,0 +1,20 @@ +Tuscany SCA for C++ Samples - Weather Sample +============================================ + +This is a very simple sample to show how an SCA composite can wire together +two components to implement calls to a Weather Forecast web service + +There are three sub projects in this workspace: + - sample.weather + This contains the source code and SCDL artifacts for the SCA Weather + composite implementing the calls to the Weather web services. + + - sample.weather.client + A sample client which does a local call to the SCA Weather service. + + +Additionally, there is the sample.weather.app.composite file. This +describes the configuration of the SCA Weather composite deployed to the +SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/README.html new file mode 100644 index 0000000000..c52cb6ec86 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/README.html @@ -0,0 +1,200 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - PythonWeatherForecast Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - PythonWeatherForecast Sample</H1> + + <P>This is a very simple sample to show how an SCA composite can wire + together two components to implement calls to a Weather Forecast web service. + </P> + <P>The PythonWeatherForecast sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Service Reference Extension</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </P> + <P>There are two sub projects in this workspace:</P> + <UL> + <LI>sample.weather<BR/> + This contains the source code and SCDL artifacts for the SCA Weather + composite implementing the calls to the Weather web services. + </LI> + <LI>sample.weather.client<BR/> + A sample client which does a local call to the SCA Weather service. + </LI> + </UL> + <P>Additionally, there is the sample.weather.app.composite file. This + describes the configuration of the SCA Weather composite deployed to the SCA + runtime. + </P> + + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the PythonWeatherForecast sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the PythonWeatherForecast sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the PythonWeatherForecast sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the PythonWeatherForecast sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the PythonWeatherForecast sample on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>As the PythonWeatherForecast sample is based on Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Python samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-python --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/PythonWeatherForecast</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the PythonWeatherForecast sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The PythonWeatherForecast sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Service Reference Extension</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + <LI>PYTHON_LIB=<path to the Python library><BR/> + Note: If you are using a default installation of Python 2.5 this is usually /usr/lib</LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/PythonWeatherForecast/deploy/sample.weather.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the PythonWeatherForecast sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As this sample is based on Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\PythonWeatherForecast</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the PythonWeatherForecast sample on Windows</H2></A> + <OL> + <LI>The PythonWeatherForecast sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Service Reference Extension</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\PythonWeatherForecast\deploy\sample.weather.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.app.composite new file mode 100644 index 0000000000..522a2fc0c8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.app.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.weather.app"> + + <component name="sample.weather.WeatherForecastComponent"> + <implementation.composite name="sample.weather" /> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/Makefile.am new file mode 100644 index 0000000000..8c4781759e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/PythonWeatherForecast/deploy +clientdir=$(deploydir)/sample.weather.client + +client_DATA = *.py +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh *.py diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/runclient.bat new file mode 100644 index 0000000000..93c044ed82 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/runclient.bat @@ -0,0 +1,50 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo using Axis2C installed at %AXIS2C_HOME% + +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\python\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% +set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=sample.weather.WeatherForecastComponent + +cd %TUSCANY_SCACPP_ROOT%\sample.weather.client +python weather_forecast_client.py + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/runclient.sh new file mode 100755 index 0000000000..e6ec73b209 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/runclient.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +if [ x$PYTHON_LIB != x ]; then +echo "Using Python library installed at $PYTHON_LIB" +export LD_LIBRARY_PATH=$PYTHON_LIB:$LD_LIBRARY_PATH +export PATH=$PYTHON_LIB/../bin:$PATH +fi + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/lib:$TUSCANY_SCACPP/extensions/python/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.weather.WeatherForecastComponent + +cd $TUSCANY_SCACPP_ROOT/sample.weather.client +python weather_forecast_client.py + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/weather_forecast_client.py b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/weather_forecast_client.py new file mode 100644 index 0000000000..5de99fcf8e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather.client/weather_forecast_client.py @@ -0,0 +1,49 @@ +# 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. +# +# +# +# +# This Python code is a simple sample that provides a Python +# client for the WeatherForecast sample + + +import sys +import sca +import xml.etree.ElementTree + + + +# The main script: + +# Locate the Weather service +weatherService = sca.locateservice("WeatherComponent") + +place = "San Jose" +print "\nFinding Weather Forecast for", place +weatherText = weatherService.getForecastByPlaceName(place) +print weatherText + +zip = 90210 +print "\nFinding Weather Forecast for zip code", zip +weatherText = weatherService.getForecastByZipCode(zip) +print weatherText + + + + + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/Makefile.am new file mode 100644 index 0000000000..d0450ef707 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/PythonWeatherForecast/deploy +compositedir=$(deploydir)/sample.weather + +composite_DATA = *.composite *.wsdl *.py +EXTRA_DIST = *.composite *.wsdl *.py + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/WeatherForecast.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/WeatherForecast.wsdl new file mode 100644 index 0000000000..ec39e2287a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/WeatherForecast.wsdl @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://www.webservicex.net" + targetNamespace="http://www.webservicex.net" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + <wsdl:types> + <xsd:schema elementFormDefault="qualified" targetNamespace="http://www.webservicex.net"> + <xsd:element name="GetWeatherByZipCode"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="1" name="ZipCode" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="GetWeatherByZipCodeResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="1" maxOccurs="1" name="GetWeatherByZipCodeResult" type="tns:WeatherForecasts" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:complexType name="WeatherForecasts"> + <xsd:sequence> + <xsd:element minOccurs="1" maxOccurs="1" name="Latitude" type="xsd:float" /> + <xsd:element minOccurs="1" maxOccurs="1" name="Longitude" type="xsd:float" /> + <xsd:element minOccurs="1" maxOccurs="1" name="AllocationFactor" type="xsd:float" /> + <xsd:element minOccurs="0" maxOccurs="1" name="FipsCode" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="PlaceName" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="StateCode" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="Status" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="Details" type="tns:ArrayOfWeatherData" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="ArrayOfWeatherData"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="unbounded" name="WeatherData" type="tns:WeatherData" /> + </xsd:sequence> + </xsd:complexType> + <xsd:complexType name="WeatherData"> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="1" name="Day" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="WeatherImage" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="MaxTemperatureF" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="MinTemperatureF" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="MaxTemperatureC" type="xsd:string" /> + <xsd:element minOccurs="0" maxOccurs="1" name="MinTemperatureC" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + <xsd:element name="GetWeatherByPlaceName"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="0" maxOccurs="1" name="PlaceName" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="GetWeatherByPlaceNameResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element minOccurs="1" maxOccurs="1" name="GetWeatherByPlaceNameResult" type="tns:WeatherForecasts" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + <xsd:element name="WeatherForecasts" type="tns:WeatherForecasts" /> + </xsd:schema> + </wsdl:types> + <wsdl:message name="GetWeatherByZipCodeRequest"> + <wsdl:part name="parameters" element="tns:GetWeatherByZipCode" /> + </wsdl:message> + <wsdl:message name="GetWeatherByZipCodeResponse"> + <wsdl:part name="parameters" element="tns:GetWeatherByZipCodeResponse" /> + </wsdl:message> + <wsdl:message name="GetWeatherByPlaceNameRequest"> + <wsdl:part name="parameters" element="tns:GetWeatherByPlaceName" /> + </wsdl:message> + <wsdl:message name="GetWeatherByPlaceNameResponse"> + <wsdl:part name="parameters" element="tns:GetWeatherByPlaceNameResponse" /> + </wsdl:message> + <wsdl:portType name="WeatherForecastPortType"> + <wsdl:operation name="GetWeatherByZipCode"> + <wsdl:input message="tns:GetWeatherByZipCodeRequest" /> + <wsdl:output message="tns:GetWeatherByZipCodeResponse" /> + </wsdl:operation> + <wsdl:operation name="GetWeatherByPlaceName"> + <wsdl:input message="tns:GetWeatherByPlaceNameRequest" /> + <wsdl:output message="tns:GetWeatherByPlaceNameResponse" /> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="WeatherForecastSoapBinding" type="tns:WeatherForecastPortType"> + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> + <wsdl:operation name="GetWeatherByZipCode"> + <soap:operation soapAction="http://www.webservicex.net/GetWeatherByZipCode" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + <wsdl:operation name="GetWeatherByPlaceName"> + <soap:operation soapAction="http://www.webservicex.net/GetWeatherByPlaceName" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:service name="WeatherForecast"> + <wsdl:port name="WeatherForecastPort" binding="tns:WeatherForecastSoapBinding"> + <soap:address location="http://www.webservicex.net/WeatherForecast.asmx" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/WeatherForecastImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/WeatherForecastImpl.py new file mode 100644 index 0000000000..6e3775de0b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/WeatherForecastImpl.py @@ -0,0 +1,65 @@ +# 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. +# +# +# +# +# This Python code is a simple sample that calls a service that returns an +# SDO which has been converted into an ElementTree Element object. The Element +# object is then converted into formatted text + +import xml.etree.ElementTree + +def getForecastByPlaceName(placeName): + + print "Python - WeatherForecastImpl.getForecastByPlaceName:", placeName + + xmlResult = weatherWebService.GetWeatherByPlaceName(placeName) + + print "Python - Formatting result from weatherService:", xmlResult + + return formatWeather(xmlResult, placeName) + + +def getForecastByZipCode(zipCode): + + print "Python - WeatherForecastImpl.getForecastByZipCode:", zipCode + + xmlResult = weatherWebService.GetWeatherByZipCode(zipCode) + + print "Python - Formatting result from weatherService:", xmlResult + + return formatWeather(xmlResult, zipCode) + + +def formatWeather(weather, name): + + result = "Could not retrieve Weather Forecast for " + str(name) + + pathAndNS = "./{http://www.webservicex.net}" + + if weather.findtext(pathAndNS+"PlaceName"): + + result = "\n\nWeather Forecast for "+ weather.findtext(pathAndNS+"PlaceName")+ ", "+ weather.findtext(pathAndNS+"StateCode")+"\n" + result += "Latitude: "+ weather.findtext(pathAndNS+"Latitude")+ " Longitude: "+ weather.findtext(pathAndNS+"Longitude")+"\n\n" + + for node in weather.findall(".//{http://www.webservicex.net}WeatherData"): + if node.findtext(pathAndNS+"Day"): result += node.findtext(pathAndNS+"Day") + if node.findtext(pathAndNS+"MaxTemperatureC"): result += ":\tMax "+ node.findtext(pathAndNS+"MaxTemperatureC") + if node.findtext(pathAndNS+"MinTemperatureC"): result += "C. Min "+ node.findtext(pathAndNS+"MinTemperatureC")+ "C.\n" + + return result diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/sample.weather.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/sample.weather.composite new file mode 100644 index 0000000000..70e9674d23 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/PythonWeatherForecast/sample.weather/sample.weather.composite @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.weather"> + + <component name="WeatherComponent"> + <implementation.python module="WeatherForecastImpl"/> + <!--implementation.ruby script="WeatherForecastImpl.rb" class="WeatherForecastImpl"/--> + <reference name="weatherWebService">WeatherService</reference> + </component> + + <reference name="WeatherService"> + <interface.wsdl interface="http://www.webservicex.net#wsdl.interface(WeatherForecastPortType)"/> + <binding.ws endpoint="http://www.webservicex.net#wsdl.endpoint(WeatherForecast/WeatherForecastPort)"/> + <!--binding.ws uri="http://www.webservicex.net/WeatherForecast.asmx"/--> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/README b/sca-cpp/branches/cpp-contrib/contrib/samples/README new file mode 100644 index 0000000000..3d7155367d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/README @@ -0,0 +1,2 @@ +Please read the GettingStarted.html document for information on +building, installing and running Tuscany SCA for C++ Samples
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/Makefile.am new file mode 100644 index 0000000000..e3b215ad90 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RestCalculator/deploy +SUBDIRS = sample.calculator sample.calculator.restclient httpserver + +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/README b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/README new file mode 100644 index 0000000000..03c6b6a325 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/README @@ -0,0 +1,23 @@ +Tuscany SCA for C++ Samples - REST Calculator Sample +=============================================== + +This is a very simple sample to show how to use the SCA REST binding to +expose a Calculator service as a REST service and invoke that service. + +There are three sub projects in this workspace: + - sample.calculator + This contains the source code and SCDL artifacts for the SCA Calculator. + composite implementing the sample Calculator. + + - sample.calculator.restclient + A sample REST client which calls the Calculator service. + + - httpserver + This contains a minimal configuration for the Apache HTTP server used + to host the REST service as well as scripts to start and stop the server. + +Additionally, there is the sample.calculator.app.composite file. This +describes the configuration of the SCA Calculator composite deployed to the +SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/README.html new file mode 100644 index 0000000000..80f7462c8a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/README.html @@ -0,0 +1,231 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - REST Calculator Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - REST Calculator Sample</H1> + + <P>This is a very simple sample to show how an SCA composite can wire + together two Ruby components to implement a Calculator service and expose + that service as a REST Service running under Apache HTTPD. + </P> + <P>The REST Calculator sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RestExtension.html">REST Service & Reference Extensions</A></LI> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system</P> + <P>There are three sub projects in this workspace:</P> + <UL> + <LI>sample.calculator<BR/> + This contains the Ruby scripts and SCDL artifacts for the SCA Calculator + composite implementing the sample Calculator. + </LI> + <LI>sample.calculator.restclient<BR/> + A sample client which does a local call to the Calculator service. + </LI> + <LI>httpserver<BR/> + A minimal configuration for the Apache HTTP server used to host the + REST service as well as scripts to start and stop the server. + </LI> + </UL> + <P>Additionally, there is the sample.calculator.app.composite file. This + describes the configuration of the SCA Calculator composite deployed to the SCA + runtime. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the REST Calculator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the REST Calculator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the REST Calculator sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the REST Calculator sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the REST Calculator sample on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>As the REST Calculator sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Ruby samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-ruby --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/RestCalculator</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the REST Calculator sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The REST Calculator sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RestExtension.html">REST Service & Reference Extensions</A></LI> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Start the HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/RestCalculator/deploy/httpserver</LI> + <LI>./startserver.sh<BR/> + NOTE: Depending on your installation of Apache HTTPD you may need to log in as root before following + these steps. If so, you may also need to uncomment the User and Group directives in the + <tuscany_sca_install_dir>/samples/RestCalculator/deploy/httpserver/conf/httpd.conf file + and set these to the appropriate username and group that the server should run as</LI> + </OL> + </LI> + <LI>Run the client: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/RestCalculator/deploy/sample.calculator.restclient</LI> + <LI>./runrestclient.sh</LI> + </OL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the REST Calculator sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As this sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RestCalculator</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the REST Calculator sample on Windows</H2></A> + <OL> + <LI>The REST Calculator sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RestExtension.html">REST Service & Reference Extensions</A></LI> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Start the HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>HTTPD_HOME=<path to installed Apache HTTPD server></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\RestCalculator\deploy\httpserver</LI> + <LI>startserver.bat</LI> + </OL> + </LI> + <LI>Run the client: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>LIBCURL_HOME=<path to installed libcurl libraries></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\RestCalculator\deploy\sample.calculator.restclient</LI> + <LI>runrestclient.bat</LI> + </OL> + </LI> + </OL> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/Makefile.am new file mode 100644 index 0000000000..f9412183dc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/Makefile.am @@ -0,0 +1,6 @@ +deploydir=$(prefix)/RestCalculator/deploy +serverdir=$(deploydir)/httpserver + +server_SCRIPTS = startserver.sh stopserver.sh +EXTRA_DIST = startserver.sh stopserver.sh conf htdocs +nobase_server_DATA = conf/httpd.conf conf/mime.types htdocs/index.html diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/conf/httpd.conf b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/conf/httpd.conf new file mode 100644 index 0000000000..0303f787e9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/conf/httpd.conf @@ -0,0 +1,34 @@ +# 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.
+
+# This is the main Apache HTTP server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.
+
+Listen 9090
+
+# Generated by the startserver script
+Include conf/base.conf
+Include conf/tuscany_sca_mod_rest.conf
+
+# User and Group directives may be required if the server must be
+# started from the root account. Uncomment the following lines and
+# set the correct username and group
+#
+# User myusername
+# Group mygroupname
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/conf/mime.types b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/conf/mime.types new file mode 100644 index 0000000000..4279f51bca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/conf/mime.types @@ -0,0 +1,607 @@ +# 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. + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at <http://www.iana.org/assignments/media-types/>. + +# MIME type Extensions +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomicmail +application/batch-smtp +application/beep+xml +application/cals-1840 +application/cnrp+xml +application/commonground +application/cpl+xml +application/cybercash +application/dca-rft +application/dec-dx +application/dvcs +application/edi-consent +application/edifact +application/edi-x12 +application/eshop +application/font-tdpfr +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica +application/mathml+xml mathml +application/msword doc +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin dms lha lzh exe class so dll dmg +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rdf+xml rdf +application/reginfo+xml +application/remote-printing +application/riscos +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/srgs gram +application/srgs+xml grxml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/vemmi +application/vnd.3gpp.pic-bw-large +application/vnd.3gpp.pic-bw-small +application/vnd.3gpp.pic-bw-var +application/vnd.3gpp.sms +application/vnd.3m.post-it-notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.acucorp +application/vnd.adobe.xfdf +application/vnd.aether.imp +application/vnd.amiga.ami +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.blueice.multipass +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.criticaltools.wbs+xml +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl +application/vnd.cybank +application/vnd.data-vision.rdz +application/vnd.dna +application/vnd.dpgraph +application/vnd.dreamfactory +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-help +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hbci +application/vnd.hhe.lesson-player +application/vnd.hp-hpgl +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.hp-pcl +application/vnd.hp-pclxl +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay +application/vnd.ibm.modcap +application/vnd.ibm.rights-management +application/vnd.ibm.secure-container +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jisp +application/vnd.kde.karbon +application/vnd.kde.kchart +application/vnd.kde.kformula +application/vnd.kde.kivio +application/vnd.kde.kontour +application/vnd.kde.kpresenter +application/vnd.kde.kspread +application/vnd.kde.kword +application/vnd.kenameaapp +application/vnd.koan +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop +application/vnd.llamagraphics.life-balance.exchange+xml +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.micrografx.flo +application/vnd.micrografx.igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.mbk +application/vnd.mobius.mqy +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.mophun.application +application/vnd.mophun.certificate +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls +application/vnd.ms-lrm +application/vnd.ms-powerpoint ppt +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.ms-wpl +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.edm +application/vnd.novadigm.edx +application/vnd.novadigm.ext +application/vnd.obn +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.quark.quarkxpress +application/vnd.rapid +application/vnd.s3sms +application/vnd.sealed.net +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.street-stream +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio +application/vnd.visionary +application/vnd.vividence.scriptfile +application/vnd.vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.wv.csp+wbxml +application/vnd.xara +application/vnd.xfdl +application/vnd.yamaha.hv-dic +application/vnd.yamaha.hv-script +application/vnd.yamaha.hv-voice +application/vnd.yellowriver-custom-menu +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip +application/x-hdf hdf +application/x-javascript js +application/x-koan skp skd skt skm +application/x-latex latex +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x400-bp +application/xhtml+xml xhtml xht +application/xslt+xml xslt +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/zip zip +audio/32kadpcm +audio/amr +audio/amr-wb +audio/basic au snd +audio/cn +audio/dat12 +audio/dsr-es201108 +audio/dvi4 +audio/evrc +audio/evrc0 +audio/g722 +audio/g.722.1 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g729D +audio/g729E +audio/gsm +audio/gsm-efr +audio/l8 +audio/l16 +audio/l20 +audio/l24 +audio/lpc +audio/midi mid midi kar +audio/mpa +audio/mpa-robust +audio/mp4a-latm +audio/mpeg mpga mp2 mp3 +audio/parityfec +audio/pcma +audio/pcmu +audio/prs.sid +audio/qcelp +audio/red +audio/smv +audio/smv0 +audio/telephone-event +audio/tone +audio/vdvi +audio/vnd.3gpp.iufp +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-alaw-basic +audio/x-mpegurl m3u +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin +application/vnd.rn-realmedia rm +audio/x-wav wav +chemical/x-pdb pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg +image/t38 +image/tiff tiff tif +image/tiff-fx +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.globalgraphics.pgb +image/vnd.mix +image/vnd.ms-modi +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-icon ico +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/news +message/partial +message/rfc822 +message/s-http +message/sip +message/sipfrag +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics ifb +text/css css +text/directory +text/enriched +text/html html htm +text/parityfec +text/plain asc txt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.dmclientscript +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.iptc.nitf +text/vnd.iptc.newsml +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.sun.j2me.app-descriptor +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-setext etx +text/xml +text/xml-external-parsed-entity +video/bmpeg +video/bt656 +video/celb +video/dv +video/h261 +video/h263 +video/h263-1998 +video/h263-2000 +video/jpeg +video/mp1s +video/mp2p +video/mp2t +video/mp4v-es +video/mpv +video/mpeg mpeg mpg mpe +video/nv +video/parityfec +video/pointer +video/quicktime qt mov +video/smpte292m +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.nokia.interleaved-multimedia +video/vnd.objectvideo +video/vnd.vivo +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/htdocs/index.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/htdocs/index.html new file mode 100644 index 0000000000..1bfb3e30c2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/htdocs/index.html @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body><h1>It works!</h1></body></html> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/startserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/startserver.bat new file mode 100644 index 0000000000..2fc567a7e6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/startserver.bat @@ -0,0 +1,72 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +set APFULLDIR=%~d0%~p0 +echo Running from %APFULLDIR% + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%HTTPD_HOME%" == "" ( +echo "HTTPD_HOME not set" +goto end +) +echo Using HTTPD installed at %HTTPD_HOME% + +set PATH=%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\rest\service\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%HTTPD_HOME%\bin;%PATH% + +set TUSCANY_SCACPP_ROOT=%APFULLDIR%\..\ +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +@REM Generate the tuscany_sca_mod_rest configuration +if not exist %APFULLDIR%\conf\tuscany_sca_mod_rest.conf ( + echo LoadModule sca_rest_module %TUSCANY_SCACPP%/extensions/rest\service/bin/tuscany_sca_mod_rest.dll > %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo TuscanyHome %TUSCANY_SCACPP% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo ^<Location /rest^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo SetHandler sca_rest_module >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo TuscanyRoot %TUSCANY_SCACPP_ROOT% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf + echo ^</Location^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf +) + +@REM Generate the base HTTPD configuration +if not exist %APFULLDIR%\conf\base.conf ( + echo LoadModule mime_module %HTTPD_HOME%\modules\mod_mime.so > %APFULLDIR%\conf\base.conf + echo LoadModule dir_module %HTTPD_HOME%\modules\mod_dir.so >> %APFULLDIR%\conf\base.conf + echo DocumentRoot %APFULLDIR%\htdocs >> %APFULLDIR%\conf\base.conf +) + +@REM Create logs directory +if not exist %APFULLDIR%\logs mkdir %APFULLDIR%\logs +set TUSCANY_SCACPP_LOG=%APFULLDIR%\logs\tuscany-server.log +set TUSCANY_SCACPP_LOGGING=9 + +@REM Start the HTTP server +echo Starting Apache httpd +httpd -d %APFULLDIR% diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/startserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/startserver.sh new file mode 100755 index 0000000000..e5d3d8f1ce --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/startserver.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +libsuffix=.so +UNAME=`uname -s` +if [ "x$UNAME" = "xDarwin" ]; then + libsuffix=.dylib +fi +# Generate the mod_rest configuration +if [ ! -f conf/tuscany_sca_mod_rest.conf ]; then + echo "LoadModule sca_rest_module $TUSCANY_SCACPP/extensions/rest/service/lib/libtuscany_sca_mod_rest$libsuffix" >conf/tuscany_sca_mod_rest.conf + echo "TuscanyHome $TUSCANY_SCACPP" >>conf/tuscany_sca_mod_rest.conf + echo "<Location /rest>" >>conf/tuscany_sca_mod_rest.conf + echo " SetHandler sca_rest_module" >>conf/tuscany_sca_mod_rest.conf + echo " TuscanyRoot $TUSCANY_SCACPP_ROOT" >>conf/tuscany_sca_mod_rest.conf + echo "</Location>" >>conf/tuscany_sca_mod_rest.conf +fi + +if [ ! -f conf/base.conf ]; then + echo "DocumentRoot $APFULLDIR/htdocs" >conf/base.conf +fi + +# Create logs directory +if [ ! -d logs ]; then + mkdir logs +fi + +# Start the HTTP server +echo "Starting Apache httpd" +apachectl -k start -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/stopserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/stopserver.sh new file mode 100755 index 0000000000..c17f632a3e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/httpserver/stopserver.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +# Stop the HTTP server +echo "Stopping Apache httpd" +apachectl -k stop -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.app.composite new file mode 100644 index 0000000000..b7c42f4731 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.app.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.app"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + + <component name="sample.calculator.CalculatorRestClientComponent"> + <implementation.composite name="sample.calculator.restclient" /> + <reference name="CalculatorService">sample.calculator.CalculatorComponent/CalculatorService</reference> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/CalculatorRestClient.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/CalculatorRestClient.rb new file mode 100644 index 0000000000..4305c3e185 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/CalculatorRestClient.rb @@ -0,0 +1,25 @@ +# 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. +# +# + +require("tuscany_sca_ruby") + +calculator = SCA::locateService("CalculatorService") + +x = calculator.div(5, 2) +print "Retrieved result from RestCalculator service: ", x, "\n" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/Makefile.am new file mode 100644 index 0000000000..5eee4677b8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RestCalculator/deploy +restclientdir=$(deploydir)/sample.calculator.restclient + +restclient_DATA = *.rb *.composite +restclient_SCRIPTS = runrestclient.sh +EXTRA_DIST = runrestclient.sh *.rb *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/runrestclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/runrestclient.bat new file mode 100644 index 0000000000..fb97ed8b74 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/runrestclient.bat @@ -0,0 +1,50 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo TUSCANY_SCACPP not set +goto end +) +echo using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo TUSCANY_SDOCPP not set +goto end +) +echo using SDO installed at %TUSCANY_SDOCPP% + +if "%LIBCURL_HOME%" == "" ( +echo LIBCURL_HOME not set +goto end +) +echo using Libcurl installed at %LIBCURL_HOME% + +set PATH=%HTTPD_HOME%\bin;%LIBCURL_HOME%\lib;%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\rest\reference\bin;%TUSCANY_SCACPP%\extensions\rest\service\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%PATH% + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorRestClientComponent +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd %TUSCANY_SCACPP_ROOT%\sample.calculator.restclient +ruby -I%TUSCANY_SCACPP%\extensions\ruby\bin CalculatorRestClient.rb + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/runrestclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/runrestclient.sh new file mode 100755 index 0000000000..0c6c6c182c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/runrestclient.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorRestClientComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/sample.calculator.restclient +ruby -I$TUSCANY_SCACPP/extensions/ruby/lib CalculatorRestClient.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/sample.calculator.restclient.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/sample.calculator.restclient.composite new file mode 100644 index 0000000000..fee8c6e14f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator.restclient/sample.calculator.restclient.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.restclient"> + + <reference name="CalculatorService"> + <binding.rest/> + </reference> + +</composite>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/CalculatorImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/CalculatorImpl.rb new file mode 100644 index 0000000000..36ed15ff9b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/CalculatorImpl.rb @@ -0,0 +1,48 @@ +# 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 CalculatorImpl + + attr_writer :divideService + + def initialize() + print "Ruby - CalculatorImpl.initialize\n" + end + + def div(arg1, arg2) + print "Ruby - CalculatorImpl.div\n" + @divideService.divide(arg1.to_f, arg2.to_f) + end + + def add(arg1, arg2) + print "Ruby - CalculatorImpl.add\n" + arg1.to_f + arg2.to_f + end + + def sub(arg1, arg2) + print "Ruby - CalculatorImpl.sub\n" + arg1.to_f - arg2.to_f + end + + def mul(arg1, arg2) + print "Ruby - CalculatorImpl.mul\n" + arg1.to_f * arg2.to_f + end + +end
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/DivideImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/DivideImpl.rb new file mode 100644 index 0000000000..c6615bfcfa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/DivideImpl.rb @@ -0,0 +1,39 @@ +# 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 DivideImpl + + attr_writer :round + + def initialize() + print "Ruby - DivideImpl.initialize\n" + end + + def divide(arg1, arg2) + print "Ruby - DivideImpl.divide ", arg1, " / ", arg2, "\n" + res = arg1.to_f / arg2.to_f + if @round then + res = res.round + print "DivideImpl.divide rounding\n" + end + print "DivideImpl.divide ", res, "\n" + res + end + +end
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/Makefile.am new file mode 100644 index 0000000000..b715fe2424 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/RestCalculator/deploy +compositedir=$(deploydir)/sample.calculator + +composite_DATA = *.composite *.rb +EXTRA_DIST = *.composite *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/sample.calculator.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/sample.calculator.composite new file mode 100644 index 0000000000..49fbf17f54 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCalculator/sample.calculator/sample.calculator.composite @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> + + <service name="CalculatorService"> + <binding.rest/> + <reference>CalculatorComponent</reference> + </service> + + <component name="CalculatorComponent"> + <implementation.ruby script="CalculatorImpl.rb" class="CalculatorImpl"/> + <reference name="divideService">DivideComponent</reference> + </component> + + <component name="DivideComponent"> + <implementation.ruby script="DivideImpl.rb" class="DivideImpl"/> + <property name="round">true</property> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/Makefile.am new file mode 100644 index 0000000000..bf259580ce --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/RestCustomer/deploy +SUBDIRS = sample.customer sample.customer.restclient httpserver + +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/README b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/README new file mode 100644 index 0000000000..bf2a1c3eb6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/README @@ -0,0 +1,25 @@ +Tuscany SCA for C++ Samples - REST Customer Sample +================================================== + +This is a very simple sample to show how to use the SCA REST binding to +implement a resource management service and make resources available +through HTTP. + +There are three sub projects in this workspace: + - sample.customer + This contains the source code and SCDL artifacts for the SCA component + implementing the Customer resource management service. + + - sample.customer.restclient + A sample REST client which shows how to create, update, retrieve, and + delete Customer resources. + + - httpserver + This contains a minimal configuration for the Apache HTTP server used + to host the REST service as well as scripts to start and stop the server. + +Additionally, there is the sample.customer.app.composite file. This +describes the configuration of the SCA Calculator composite deployed to the +SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/README.html new file mode 100644 index 0000000000..7d43177b9a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/README.html @@ -0,0 +1,236 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - REST Customer Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - REST Customer Sample</H1> + + <P>This is a very simple sample to show how to use the SCA REST binding to + implement a resource management service and make resources available + through HTTP. + </P> + <P>The REST Customer sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Service and Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </P> + <P>There are three sub-projects in this workspace:</P> + <UL> + <LI>sample.customer<BR/> + This contains the source code and SCDL artifacts for the SCA component + implementing the Customer resource management service. + </LI> + <LI>sample.customer.restclient<BR/> + A sample REST client which shows how to create, update, retrieve, and + delete Customer resources. + </LI> + <LI>httpserver<BR/> + This contains a minimal configuration for the Apache HTTP server used + to host the REST service as well as scripts to start and stop the server. + </LI> + </UL> + <P>Additionally, there is the sample.customer.app.composite file. This + describes the configuration of the SCA Customer composite deployed to the SCA + runtime. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the REST Customer sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the REST Customer sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the REST Customer sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the REST Customer sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the REST Customer sample on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>As the REST Customer sample is based on Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Python samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-python --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/RestCustomer</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the REST Customer sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The REST Customer sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Service and Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Start the Apache HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>PYTHON_LIB=<path to the Python library><BR/> + Note: If you are using a default installation of Python 2.5 this is usually /usr/lib</LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/RestCustomer/deploy/httpserver</LI> + <LI>./startserver.sh<BR/> + NOTE: Depending on your installation of Apache HTTPD you may need to log in as root before following + these steps. If so, you may also need to uncomment the User and Group directives in the + <tuscany_sca_install_dir>/samples/RestCustomer/deploy/httpserver/conf/httpd.conf file + and set these to the appropriate username and group that the server should run as</LI> + </OL> + </LI> + <LI>Run the client: + <OL> + <LI>The following environment variable is required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>PYTHON_LIB=<path to the Python library><BR/> + Note: If you are using a default installation of Python 2.5 this is usually /usr/lib</LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/RestCustomer/deploy/sample.customer.restclient</LI> + <LI>./runrestclient.sh</LI> + </OL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the REST Customer sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As this sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RestCustomer</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the REST Customer sample on Windows</H2></A> + <LI>The REST Customer sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Service and Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Start the Apache HTTPD server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>HTTPD_HOME=<path to installed Apache HTTPD server></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\RestCustomer\deploy\httpserver</LI> + <LI>startserver.bat</LI> + </OL> + </LI> + <LI>Run the client: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>LIBCURL_HOME=<path to installed libcurl libraries></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\RestCustomer\deploy\sample.customer.restclient</LI> + <LI>runrestclient.bat</LI> + </OL> + </LI> + </OL> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/Makefile.am new file mode 100644 index 0000000000..af8c0bb550 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/Makefile.am @@ -0,0 +1,6 @@ +deploydir=$(prefix)/RestCustomer/deploy +serverdir=$(deploydir)/httpserver + +server_SCRIPTS = startserver.sh stopserver.sh +EXTRA_DIST = startserver.sh stopserver.sh conf htdocs +nobase_server_DATA = conf/httpd.conf conf/mime.types htdocs/index.html diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/conf/httpd.conf b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/conf/httpd.conf new file mode 100644 index 0000000000..0303f787e9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/conf/httpd.conf @@ -0,0 +1,34 @@ +# 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.
+
+# This is the main Apache HTTP server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.
+
+Listen 9090
+
+# Generated by the startserver script
+Include conf/base.conf
+Include conf/tuscany_sca_mod_rest.conf
+
+# User and Group directives may be required if the server must be
+# started from the root account. Uncomment the following lines and
+# set the correct username and group
+#
+# User myusername
+# Group mygroupname
+
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/conf/mime.types b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/conf/mime.types new file mode 100644 index 0000000000..4279f51bca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/conf/mime.types @@ -0,0 +1,607 @@ +# 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. + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at <http://www.iana.org/assignments/media-types/>. + +# MIME type Extensions +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomicmail +application/batch-smtp +application/beep+xml +application/cals-1840 +application/cnrp+xml +application/commonground +application/cpl+xml +application/cybercash +application/dca-rft +application/dec-dx +application/dvcs +application/edi-consent +application/edifact +application/edi-x12 +application/eshop +application/font-tdpfr +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica +application/mathml+xml mathml +application/msword doc +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin dms lha lzh exe class so dll dmg +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rdf+xml rdf +application/reginfo+xml +application/remote-printing +application/riscos +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/srgs gram +application/srgs+xml grxml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/vemmi +application/vnd.3gpp.pic-bw-large +application/vnd.3gpp.pic-bw-small +application/vnd.3gpp.pic-bw-var +application/vnd.3gpp.sms +application/vnd.3m.post-it-notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.acucorp +application/vnd.adobe.xfdf +application/vnd.aether.imp +application/vnd.amiga.ami +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.blueice.multipass +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.criticaltools.wbs+xml +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl +application/vnd.cybank +application/vnd.data-vision.rdz +application/vnd.dna +application/vnd.dpgraph +application/vnd.dreamfactory +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-help +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hbci +application/vnd.hhe.lesson-player +application/vnd.hp-hpgl +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.hp-pcl +application/vnd.hp-pclxl +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay +application/vnd.ibm.modcap +application/vnd.ibm.rights-management +application/vnd.ibm.secure-container +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jisp +application/vnd.kde.karbon +application/vnd.kde.kchart +application/vnd.kde.kformula +application/vnd.kde.kivio +application/vnd.kde.kontour +application/vnd.kde.kpresenter +application/vnd.kde.kspread +application/vnd.kde.kword +application/vnd.kenameaapp +application/vnd.koan +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop +application/vnd.llamagraphics.life-balance.exchange+xml +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.micrografx.flo +application/vnd.micrografx.igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.mbk +application/vnd.mobius.mqy +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.mophun.application +application/vnd.mophun.certificate +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls +application/vnd.ms-lrm +application/vnd.ms-powerpoint ppt +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.ms-wpl +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.edm +application/vnd.novadigm.edx +application/vnd.novadigm.ext +application/vnd.obn +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.quark.quarkxpress +application/vnd.rapid +application/vnd.s3sms +application/vnd.sealed.net +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.street-stream +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio +application/vnd.visionary +application/vnd.vividence.scriptfile +application/vnd.vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.wv.csp+wbxml +application/vnd.xara +application/vnd.xfdl +application/vnd.yamaha.hv-dic +application/vnd.yamaha.hv-script +application/vnd.yamaha.hv-voice +application/vnd.yellowriver-custom-menu +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip +application/x-hdf hdf +application/x-javascript js +application/x-koan skp skd skt skm +application/x-latex latex +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x400-bp +application/xhtml+xml xhtml xht +application/xslt+xml xslt +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/zip zip +audio/32kadpcm +audio/amr +audio/amr-wb +audio/basic au snd +audio/cn +audio/dat12 +audio/dsr-es201108 +audio/dvi4 +audio/evrc +audio/evrc0 +audio/g722 +audio/g.722.1 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g729D +audio/g729E +audio/gsm +audio/gsm-efr +audio/l8 +audio/l16 +audio/l20 +audio/l24 +audio/lpc +audio/midi mid midi kar +audio/mpa +audio/mpa-robust +audio/mp4a-latm +audio/mpeg mpga mp2 mp3 +audio/parityfec +audio/pcma +audio/pcmu +audio/prs.sid +audio/qcelp +audio/red +audio/smv +audio/smv0 +audio/telephone-event +audio/tone +audio/vdvi +audio/vnd.3gpp.iufp +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-alaw-basic +audio/x-mpegurl m3u +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin +application/vnd.rn-realmedia rm +audio/x-wav wav +chemical/x-pdb pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg +image/t38 +image/tiff tiff tif +image/tiff-fx +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.globalgraphics.pgb +image/vnd.mix +image/vnd.ms-modi +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-icon ico +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/news +message/partial +message/rfc822 +message/s-http +message/sip +message/sipfrag +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics ifb +text/css css +text/directory +text/enriched +text/html html htm +text/parityfec +text/plain asc txt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.dmclientscript +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.iptc.nitf +text/vnd.iptc.newsml +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.sun.j2me.app-descriptor +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-setext etx +text/xml +text/xml-external-parsed-entity +video/bmpeg +video/bt656 +video/celb +video/dv +video/h261 +video/h263 +video/h263-1998 +video/h263-2000 +video/jpeg +video/mp1s +video/mp2p +video/mp2t +video/mp4v-es +video/mpv +video/mpeg mpeg mpg mpe +video/nv +video/parityfec +video/pointer +video/quicktime qt mov +video/smpte292m +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.nokia.interleaved-multimedia +video/vnd.objectvideo +video/vnd.vivo +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/htdocs/index.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/htdocs/index.html new file mode 100644 index 0000000000..1bfb3e30c2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/htdocs/index.html @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body><h1>It works!</h1></body></html> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/startserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/startserver.bat new file mode 100644 index 0000000000..a62f4bd510 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/startserver.bat @@ -0,0 +1,75 @@ +@echo off
+
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+
+setlocal
+
+set APFULLDIR=%~d0%~p0
+echo Running from %APFULLDIR%
+
+if "%TUSCANY_SCACPP%" == "" (
+echo "TUSCANY_SCACPP not set"
+goto end
+)
+echo Using SCA installed at %TUSCANY_SCACPP%
+
+if "%TUSCANY_SDOCPP%" == "" (
+echo "TUSCANY_SDOCPP not set"
+goto end
+)
+echo Using SDO installed at %TUSCANY_SDOCPP%
+
+if "%HTTPD_HOME%" == "" (
+echo "HTTPD_HOME not set"
+goto end
+)
+echo Using HTTPD installed at %HTTPD_HOME%
+
+set PATH=%TUSCANY_SCACPP%\extensions\python\bin;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\rest\service\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%HTTPD_HOME%\bin;%PATH%
+set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin
+
+set TUSCANY_SCACPP_ROOT=%APFULLDIR%\..\
+set TUSCANY_SCACPP_BASE_URI=http://localhost:9090
+
+set CUSTOMER_DIR=%TUSCANY_SCACPP_ROOT%\sample.customer
+
+@REM Generate the tuscany_sca_mod_rest configuration
+if not exist %APFULLDIR%\conf\tuscany_sca_mod_rest.conf (
+ echo LoadModule sca_rest_module %TUSCANY_SCACPP%/extensions/rest\service/bin/tuscany_sca_mod_rest.dll > %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo TuscanyHome %TUSCANY_SCACPP% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo ^<Location /rest^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo SetHandler sca_rest_module >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo TuscanyRoot %TUSCANY_SCACPP_ROOT% >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+ echo ^</Location^> >> %APFULLDIR%\conf\tuscany_sca_mod_rest.conf
+)
+
+@REM Generate the base HTTPD configuration
+if not exist %APFULLDIR%\conf\base.conf (
+ echo LoadModule mime_module %HTTPD_HOME%\modules\mod_mime.so > %APFULLDIR%\conf\base.conf
+ echo LoadModule dir_module %HTTPD_HOME%\modules\mod_dir.so >> %APFULLDIR%\conf\base.conf
+ echo DocumentRoot %APFULLDIR%\htdocs >> %APFULLDIR%\conf\base.conf
+)
+
+@REM Create logs directory
+if not exist %APFULLDIR%\logs mkdir %APFULLDIR%\logs
+set TUSCANY_SCACPP_LOG=%APFULLDIR%\logs\tuscany-server.log
+set TUSCANY_SCACPP_LOGGING=9
+
+@REM Start the HTTP server
+echo Starting Apache httpd
+httpd -d %APFULLDIR%
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/startserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/startserver.sh new file mode 100755 index 0000000000..0d4561e3d3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/startserver.sh @@ -0,0 +1,80 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$PYTHON_LIB != x ]; then +echo "Using Python library installed at $PYTHON_LIB" +export LD_LIBRARY_PATH=$PYTHON_LIB:$LD_LIBRARY_PATH +export PATH=$PYTHON_LIB/../bin:$PATH +fi + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/lib:$TUSCANY_SCACPP/extensions/python/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +export CUSTOMER_DIR=$TUSCANY_SCACPP_ROOT/sample.customer + +libsuffix=.so +UNAME=`uname -s` +if [ "x$UNAME" = "xDarwin" ]; then + libsuffix=.dylib +fi + +# Generate the mod_rest configuration +if [ ! -f conf/tuscany_sca_mod_rest.conf ]; then + echo "LoadModule sca_rest_module $TUSCANY_SCACPP/extensions/rest/service/lib/libtuscany_sca_mod_rest$libsuffix" >conf/tuscany_sca_mod_rest.conf + echo "TuscanyHome $TUSCANY_SCACPP" >>conf/tuscany_sca_mod_rest.conf + echo "<Location /rest>" >>conf/tuscany_sca_mod_rest.conf + echo " SetHandler sca_rest_module" >>conf/tuscany_sca_mod_rest.conf + echo " TuscanyRoot $TUSCANY_SCACPP_ROOT" >>conf/tuscany_sca_mod_rest.conf + echo "</Location>" >>conf/tuscany_sca_mod_rest.conf +fi + +if [ ! -f conf/base.conf ]; then + echo "DocumentRoot $APFULLDIR/htdocs" >conf/base.conf +fi + +# Create logs directory +if [ ! -d logs ]; then + mkdir logs +fi + +# Start the HTTP server +echo "Starting Apache httpd" + +# Set LD_PRELOAD to use the expat included in Python to avoid incompatibilities +export LD_PRELOAD=$TUSCANY_SCACPP/extensions/python/lib/libtuscany_sca_python$libsuffix + +apachectl -k start -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/stopserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/stopserver.sh new file mode 100755 index 0000000000..c17f632a3e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/httpserver/stopserver.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +# Stop the HTTP server +echo "Stopping Apache httpd" +apachectl -k stop -d $APFULLDIR + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.app.composite new file mode 100644 index 0000000000..65565f1e3c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.app.composite @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.customer.app"> + + <component name="sample.customer.CustomerComponent"> + <implementation.composite name="sample.customer" /> + </component> + + <component name="sample.customer.CustomerRestClientComponent"> + <implementation.composite name="sample.customer.restclient" /> + <reference name="CustomerResource">sample.customer.CustomerComponent/CustomerResource</reference> + <reference name="CustomerCommand">sample.customer.CustomerComponent/CustomerCommand</reference> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/Customer.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/Customer.xsd new file mode 100644 index 0000000000..1cec1b0ae6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/Customer.xsd @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<xsd:schema targetNamespace="http://sample.customer" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="customer"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="id" type="xsd:int" /> + <xsd:element name="firstName" type="xsd:string" /> + <xsd:element name="lastName" type="xsd:string" /> + <xsd:element name="address" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + +</xsd:schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/CustomerRestClient.py b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/CustomerRestClient.py new file mode 100644 index 0000000000..340da8700d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/CustomerRestClient.py @@ -0,0 +1,85 @@ +# 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. +# +# + +# +# This Python code is a simple sample that provides a Python +# client for the REST Customer sample + + +from xml.etree import ElementTree as et +import sca + +# Locate the customer resource service +customerResource = sca.locateservice("CustomerResource") + +# Show how to invoke CRUD operations on the customer resource +# The CRUD operations translate to HTTP POST, GET, PUT and DELETE +# according to the REST pattern + +customer = customerResource.retrieve("2345") +print "Rest - Retrieved customer " + et.tostring(customer) + +customer = et.fromstring("""<customer xmlns="http://sample.customer"><id>1234</id><firstName>Jane</firstName><lastName>Doe</lastName></customer>""") +url = customerResource.create(customer) +print "Rest - Created customer " + url + +customer = customerResource.retrieve("1234") +print "Rest - Retrieved customer " + et.tostring(customer) + +customer = customerResource.retrieve(url) +print "Rest - Retrieved by url " + et.tostring(customer) + +customer.find("{http://sample.customer}lastName").text="Smith" +customerResource.update("1234", customer) +print "Rest - Updated customer 1234" + +customer = customerResource.retrieve("1234") +print "Rest - Retrieved customer " + et.tostring(customer) + +customerResource.delete("1234") +print "Rest - Deleted customer 1234" + +# Also show how to use REST binding to invoke remote commands +# using HTTP GET and XML over HTTP POST, the REST binding +# uses that command pattern when you don't declare a REST interface +# on your SCA reference + +# Locate the customer command service +customerCommand = sca.locateservice("CustomerCommand") + +# Invoke operations on the customer command service +customer = customerCommand.retrieve("2345") +print "Command - Retrieved customer " + et.tostring(customer) + +customer = et.fromstring("""<customer xmlns="http://sample.customer"><id>1234</id><firstName>Jane</firstName><lastName>Doe</lastName></customer>""") +url = customerCommand.create(customer) +print "Command - Created customer " + url + +customer = customerCommand.retrieve("1234") +print "Command - Retrieved customer " + et.tostring(customer) + +customer.find("{http://sample.customer}lastName").text="Smith" +customerCommand.update("1234", customer) +print "Command - Updated customer 1234" + +customer = customerCommand.retrieve("1234") +print "Command - Retrieved customer " + et.tostring(customer) + +customerCommand.delete("1234") +print "Command - Deleted customer 1234" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/Makefile.am new file mode 100644 index 0000000000..13c14d07e9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RestCustomer/deploy +restclientdir=$(deploydir)/sample.customer.restclient + +restclient_DATA = *.py *.composite *.xsd +restclient_SCRIPTS = runrestclient.sh +EXTRA_DIST = runrestclient.sh *.py *.composite *.xsd diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/runrestclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/runrestclient.bat new file mode 100644 index 0000000000..982b9b5e83 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/runrestclient.bat @@ -0,0 +1,53 @@ +@echo off
+
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+
+setlocal
+
+if "%TUSCANY_SCACPP%" == "" (
+echo TUSCANY_SCACPP not set
+goto end
+)
+echo using SCA installed at %TUSCANY_SCACPP%
+
+if "%TUSCANY_SDOCPP%" == "" (
+echo TUSCANY_SDOCPP not set
+goto end
+)
+echo using SDO installed at %TUSCANY_SDOCPP%
+
+if "%LIBCURL_HOME%" == "" (
+echo LIBCURL_HOME not set
+goto end
+)
+echo using Libcurl installed at %LIBCURL_HOME%
+
+set PATH=%HTTPD_HOME%\bin;%LIBCURL_HOME%\lib;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\rest\reference\bin;%TUSCANY_SCACPP%\extensions\python\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%PATH%
+set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin
+
+set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\
+set TUSCANY_SCACPP_COMPONENT=sample.customer.CustomerRestClientComponent
+set TUSCANY_SCACPP_BASE_URI=http://localhost:9090
+
+set CUSTOMER_DIR=%TUSCANY_SCACPP_ROOT%\sample.customer
+
+cd %TUSCANY_SCACPP_ROOT%\sample.customer.restclient
+python CustomerRestClient.py
+
+:end
+endlocal
diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/runrestclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/runrestclient.sh new file mode 100755 index 0000000000..54c068f4e2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/runrestclient.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$PYTHON_LIB != x ]; then +echo "Using Python library installed at $PYTHON_LIB" +export LD_LIBRARY_PATH=$PYTHON_LIB:$LD_LIBRARY_PATH +export PATH=$PYTHON_LIB/../bin:$PATH +fi + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/lib:$TUSCANY_SCACPP/extensions/python/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.customer.CustomerRestClientComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +export CUSTOMER_DIR=$TUSCANY_SCACPP_ROOT/sample.customer + +cd $TUSCANY_SCACPP_ROOT/sample.customer.restclient +python CustomerRestClient.py diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/sample.customer.restclient.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/sample.customer.restclient.composite new file mode 100644 index 0000000000..15072f28f8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer.restclient/sample.customer.restclient.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.customer.restclient"> + + <reference name="CustomerResource"> + <interface.rest/> + <binding.rest/> + </reference> + + <reference name="CustomerCommand"> + <binding.rest/> + </reference> + +</composite>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/2345.xml b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/2345.xml new file mode 100644 index 0000000000..48083380ea --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/2345.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<ns0:customer xmlns:ns0="http://sample.customer"><ns0:id>2345</ns0:id><ns0:firstName>John</ns0:firstName><ns0:lastName>Smith</ns0:lastName></ns0:customer>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/Customer.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/Customer.xsd new file mode 100644 index 0000000000..1cec1b0ae6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/Customer.xsd @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<xsd:schema targetNamespace="http://sample.customer" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="customer"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="id" type="xsd:int" /> + <xsd:element name="firstName" type="xsd:string" /> + <xsd:element name="lastName" type="xsd:string" /> + <xsd:element name="address" type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + +</xsd:schema> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/CustomerResourceImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/CustomerResourceImpl.py new file mode 100644 index 0000000000..1d6796959e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/CustomerResourceImpl.py @@ -0,0 +1,59 @@ +# 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. +# +# + +# +# This Python code implements a simple SCA component that +# manages Customer resources. +# + +import os +import shutil +from xml.etree import ElementTree as et + +qname = "{http://sample.customer}id" +dir = os.environ["CUSTOMER_DIR"] + +class CustomerResourceImpl: + "A class that manages Customer resources" + + def create(self, customer): + id = customer.findtext(qname) + print "Python - CustomerResourceImpl.create " + id + f = open(dir + "/" + id + ".xml", "w") + f.write(et.tostring(customer)) + f.close() + return id + + def retrieve(self, id): + print "Python - CustomerResourceImpl.retrieve " + id + f = open(dir + "/" + id + ".xml", "r") + customer = et.fromstring(f.read()) + f.close() + return customer + + def update(self, id, customer): + print "Python - CustomerResourceImpl.update " + id + f = open(dir + "/" + id + ".xml", "w") + f.write(et.tostring(customer)) + f.close() + + def delete(self, id): + print "Python - CustomerResourceImpl.delete " + id + shutil.copyfile(dir + "/" + id + ".xml", dir + "/" + id + "-bak.xml") + os.remove(dir + "/" + id + ".xml") diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/Makefile.am new file mode 100644 index 0000000000..e48bb502c8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/RestCustomer/deploy +compositedir=$(deploydir)/sample.customer + +composite_DATA = *.composite *.py *.xsd *.xml +EXTRA_DIST = *.composite *.py *.xsd *.xml diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/sample.customer.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/sample.customer.composite new file mode 100644 index 0000000000..1ee3b2d6a2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestCustomer/sample.customer/sample.customer.composite @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.customer"> + + <service name="CustomerResource"> + <interface.rest/> + <binding.rest/> + <reference>CustomerComponent</reference> + </service> + + <service name="CustomerCommand"> + <binding.rest/> + <reference>CustomerComponent</reference> + </service> + + <component name="CustomerComponent"> + <implementation.python module="CustomerResourceImpl" class="CustomerResourceImpl"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/Makefile.am new file mode 100644 index 0000000000..de28cf2d53 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RestYahoo/deploy +SUBDIRS = sample.yahoo sample.yahoo.client + +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/README b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/README new file mode 100644 index 0000000000..79ee6c7813 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/README @@ -0,0 +1,19 @@ +Tuscany SCA for C++ Samples - REST Yahoo Sample +=============================================== + +This is a very simple sample to show how to use the SCA REST binding to +invoke the Yahoo Web Search REST service. + +There are two sub-projects in this workspace: + - sample.yahoo + This contains the SCDL artifacts and source code for the WebSearch + Component which calls a Reference that is configured to call the + Yahoo service + - sample.yahoo.client + A Ruby client which calls the WebSearch component. + +Additionally, there is the sample.yahoo.app.composite file. This +describes the configuration of the SCA Yahoo Search composite deployed to +the SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/README.html new file mode 100644 index 0000000000..967f2c84b1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/README.html @@ -0,0 +1,202 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - REST Yahoo Search Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - REST Yahoo Search Sample</H1> + + <P>This is a very simple sample to show how to use the SCA REST binding to + invoke the Yahoo Web Search REST service. + </P> + <P>The REST Yahoo Search sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </P> + <P>There are two sub projects in this workspace:</P> + <UL> + <LI>sample.yahoo<BR/> + This contains the SCDL artifacts and Python source code for the WebSearch + Component which calls a Reference that is configured to call the + Yahoo service + </LI> + <LI>sample.yahoo.client<BR/> + A Ruby client which calls the WebSearch component + </LI> + </UL> + <P>Additionally, there is the sample.yahoo.app.composite file. This + describes the configuration of the SCA Yahoo Search composite deployed to + the SCA runtime. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the REST Yahoo Search sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the REST Yahoo Search sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the REST Yahoo Search sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the REST Yahoo Search sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the Ruby & Python samples on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As the REST Yahoo sample is based on Ruby and Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Ruby and Python samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-ruby --enable-python --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/RestYahoo</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the REST Yahoo Search sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The REST Yahoo Search sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/RestYahoo/deploy/sample.yahoo.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the REST Yahoo Search sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As this sample is based on Ruby and Python scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RestYahoo</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the REST Yahoo Search sample on Windows</H2></A> + <OL> + <LI>The REST Yahoo Search sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RESTExtension.html">REST Reference Extensions</A></LI> + <LI><A HREF="../../doc/PythonExtension.html">Python Extension</A></LI> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>LIBCURL_HOME=<path to libcurl></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RestYahoo\deploy\sample.yahoo.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.app.composite new file mode 100644 index 0000000000..eb19962fe3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.app.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.yahoo.app"> + + <component name="sample.yahoo.app.WebSearchComponent"> + <implementation.composite name="sample.yahoo" /> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/Makefile.am new file mode 100644 index 0000000000..4fcbf00e16 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RestYahoo/deploy +clientdir=$(deploydir)/sample.yahoo.client + +client_DATA = *.rb +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/YahooWebSearchClient.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/YahooWebSearchClient.rb new file mode 100644 index 0000000000..0a87ccd815 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/YahooWebSearchClient.rb @@ -0,0 +1,25 @@ +# 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. +# +# + +require("tuscany_sca_ruby") + +yahooWebSearch = SCA::locateService("WebSearchComponent") + +results = yahooWebSearch.search("Tuscany") +print results, "\n" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/runclient.bat new file mode 100644 index 0000000000..bf95f27738 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/runclient.bat @@ -0,0 +1,50 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo TUSCANY_SCACPP not set +goto end +) +echo using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo TUSCANY_SDOCPP not set +goto end +) +echo using SDO installed at %TUSCANY_SDOCPP% + +if "%LIBCURL_HOME%" == "" ( +echo LIBCURL_HOME not set +goto end +) +echo using Libcurl installed at %LIBCURL_HOME% + +set PATH=%LIBCURL_HOME%\lib;%TUSCANY_SCACPP%\extensions\rest\interface\bin;%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\extensions\rest\reference\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%PATH% +set PYTHONPATH=%TUSCANY_SCACPP%\extensions\python\bin + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=sample.yahoo.app.WebSearchComponent + +cd %TUSCANY_SCACPP_ROOT%\sample.yahoo.client +ruby -I%TUSCANY_SCACPP%\extensions\ruby\bin YahooWebSearchClient.rb + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/runclient.sh new file mode 100755 index 0000000000..7dbae64748 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo.client/runclient.sh @@ -0,0 +1,51 @@ +#!/bin/sh + +# 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. + + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$TUSCANY_SCACPP/extensions/python/lib:$LD_LIBRARY_PATH +export PYTHONPATH=$TUSCANY_SCACPP/extensions/python/lib:$PYTHONPATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.yahoo.app.WebSearchComponent + +cd $TUSCANY_SCACPP_ROOT/sample.yahoo.client + +libsuffix=.so +UNAME=`uname -s` +if [ "x$UNAME" = "xDarwin" ]; then + libsuffix=.dylib +fi +# Set LD_PRELOAD to use the expat included in Python to avoid incompatibilities +export LD_PRELOAD=$TUSCANY_SCACPP/extensions/python/lib/libtuscany_sca_python$libsuffix + +ruby -I$TUSCANY_SCACPP/extensions/ruby/lib YahooWebSearchClient.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/Makefile.am new file mode 100644 index 0000000000..7e330ca7b1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/RestYahoo/deploy +compositedir=$(deploydir)/sample.yahoo + +composite_DATA = *.composite *.py *.xsd +EXTRA_DIST = *.composite *.py *.xsd diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/YahooWebSearchImpl.py b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/YahooWebSearchImpl.py new file mode 100644 index 0000000000..7ba6ab80ef --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/YahooWebSearchImpl.py @@ -0,0 +1,60 @@ +# 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. +# +# + +try: + import xml.etree.ElementTree +except ImportError: + # Running under a pre-Python2.5 + try: + import elementtree.ElementTree + except ImportError: + print "The RestYahoo sample requires the ElementTree package" + + +def search(searchText): + + print "Python - YahooWebSearchImpl.py running Yahoo search for:", searchText, "with ID:", yahooAppID + + # Use the yahooWebSearchService reference to call the Yahoo REST service + # also use the yahooAppID property from the composite definition + xmlResult = yahooWebSearchService.webSearch(appid = yahooAppID, query = searchText, results = 5) + + print "Python - YahooWebSearchImpl.py formatting result from Yahoo:", xmlResult + + return formatResults(xmlResult, searchText) + + +def formatResults(results, searchText): + + formatted = "Failed to run Yahoo search service for \"" + str(searchText) + "\"" + + ns = "{urn:yahoo:srch}" + pathAndNS = "./" + ns + + formatted = "\n\nYahoo Web Search Results for \""+ str(searchText) +"\"\n" + formatted += results.attrib["totalResultsAvailable"]+ " results available. First "+ results.attrib["totalResultsReturned"]+ " below\n\n" + pos = 1 + + for node in results.findall(".//"+ns+"Result"): + formatted += str(pos) + ". "+ node.findtext(pathAndNS+"Title") +"\n\t" + formatted += node.findtext(pathAndNS+"Summary") +"\n\t" + formatted += node.findtext(pathAndNS+"Url") +"\n\n" + pos += 1 + + return formatted diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/YahooWebSearchResponse.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/YahooWebSearchResponse.xsd new file mode 100644 index 0000000000..210aabcf42 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/YahooWebSearchResponse.xsd @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="urn:yahoo:srch" + xmlns="urn:yahoo:srch" + elementFormDefault="qualified"> + + <xsd:element name="ResultSet"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="Result" type="ResultType" minOccurs="0" maxOccurs="100" /> + </xsd:sequence> + <xsd:attribute name="totalResultsAvailable" type="xsd:integer" /> + <xsd:attribute name="totalResultsReturned" type="xsd:integer" /> + <xsd:attribute name="firstResultPosition" type="xsd:integer" /> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="ResultType"> + <xsd:sequence> + <xsd:element name="Title" type="xsd:string" /> + <xsd:element name="Summary" type="xsd:string" /> + <xsd:element name="Url" type="xsd:string" /> + <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="skip"/> + </xsd:sequence> + </xsd:complexType> + +</xsd:schema> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/sample.yahoo.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/sample.yahoo.composite new file mode 100644 index 0000000000..a37a9be7c4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RestYahoo/sample.yahoo/sample.yahoo.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" name="sample.yahoo"> + + <component name="WebSearchComponent"> + <implementation.python module="YahooWebSearchImpl"/> + <reference name="yahooWebSearchService">YahooWebSearchReference</reference> + <property name="yahooAppID">ApacheTuscanyC++SampleRestYahoo</property> + </component> + + <reference name="YahooWebSearchReference"> + <binding.rest uri="http://search.yahooapis.com/WebSearchService/V1"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/Makefile.am new file mode 100644 index 0000000000..ae0b4958f1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/RubyBigBank/deploy +SUBDIRS = bigbank.account bigbank.client bigbank.wsclient +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/README b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/README new file mode 100644 index 0000000000..6b2dba4206 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/README @@ -0,0 +1,21 @@ +Tuscany SCA for C++ Samples - Ruby BigBank Sample +=============================================== + +This sample implements the "Simplified BigBank" scenario. A whitepaper +describing the scenario based on the SCA 0.9 Assembly specification can be +found here. This sample uses multiple Ruby components, calls out to an +external Web Service via a reference, exposes the service as a Web Service +and also provides a PHP based client. + +There are two sub projects in this workspace: + - bigbank.account + This contains the source code and SCDL artifacts for the SCA BigBank + composite implementing the account services. + + - bigbank.client + A sample client which does a local call to the BigBank service. + +Additionally, there is the bigbank.app.composite file. This describes the +configuration of the SCA BigBank composite deployed to the SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/README.html new file mode 100644 index 0000000000..6eeb377d6f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/README.html @@ -0,0 +1,312 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - Ruby BigBank Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - Ruby BigBank Sample</H1> + + <P>This sample implements the "Simplified BigBank" scenario. A whitepaper describing + the scenario based on the SCA 0.9 Assembly specification can be found + <A HREF="http://www.osoa.org/display/Main/SCA+-+Previously+Published+Specifications">here</A>. + This sample uses multiple Ruby components, calls out to an external Web Service via a reference + and exposes the service as a Web Service. + </P> + <P>The Ruby BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </P> + <P>There are three sub projects in this workspace:</P> + <UL> + <LI>bigbank.account<BR/> + This contains the source code and SCDL artifacts for the SCA Ruby BigBank + composite implementing the account services. + </LI> + <LI>bigbank.client<BR/> + A sample client which does a local call to the BigBank service. + </LI> + <LI>bigbank.wsclient<BR/> + A sample client which uses an SCA Web Service reference to make a remote + call to the BigBank service. + </LI> + </UL> + <P>Additionally, there is the bigbank.app.composite file. This + describes the configuration of the SCA BigBank composite deployed to the SCA + runtime. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the Ruby BigBank sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the Ruby BigBank sample on Linux and Mac OS X:</A></LI> + <UL> + <LI><A HREF="#linuxbasic">Running the basic client</A></LI> + <LI><A HREF="#linuxws">Running with Web Service clients</A></LI> + </UL> + <LI><A HREF="#winbld">Building the Ruby BigBank sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the Ruby BigBank sample on Windows:</A></LI> + <UL> + <LI><A HREF="#winbasic">Running the basic client</A></LI> + <LI><A HREF="#winws">Running with Web Service clients</A></LI> + </UL> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the Ruby BigBank sample on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As the Ruby BigBank sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Ruby samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-ruby --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/RubyBigBank + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the Ruby BigBank sample on Linux and Mac OS X</H2></A> + <A NAME="linuxbasic"><H3>BigBank with basic client</H3></A> + <OL> + <LI>The Ruby BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/RubyBigBank/deploy/bigbank.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + <A NAME="linuxws"><H3>BigBank with Web Service clients</H3></A> + <OL> + <LI>The Ruby BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Ensure you have enabled Axis2/C to run Tuscany SCA services. Follow the instructions + found <A HREF="../../doc/Axis2CWSExtension.html#deploy">here</A>. + </LI> + <LI>Start the Axis2/C simple http server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>/samples/RubyBigBank/deploy/bigbank.account</LI> + <LI>./runwsserver.sh</LI> + </OL> + </LI> + <LI>Now run the Web Service client: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/RubyBigBank/deploy/bigbank.wsclient</LI> + <LI>./runwsclient.sh</LI> + </UL> + </LI> + </OL> + </LI> + <LI>The PHP web client detailed in the + <A HREF="../CppBigBank/README.html">CppBigBank</A> sample can also be used + with the Ruby BigBank service that is served by the Axis2/C http server started above. + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the Ruby BigBank sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO> + </UL></LI> + </LI> + <LI>As this sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RubyBigBank</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the Ruby BigBank sample on Windows</H2></A> + <A NAME="winbasic"><H3>BigBank with basic client</H3></A> + <OL> + <LI>The Ruby BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RubyBigBank\deploy\bigbank.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </OL> + <A NAME="winws"><H3>BigBank with Web Service clients</H3></A> + <OL> + <LI>The Ruby BigBank sample requires the following extensions: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + <LI><A HREF="../../doc/Axis2CWSExtension.html">Axis2/C Web Services Extension</A></LI> + </UL> + Please follow the documentation to ensure you have these extensions built and installed + on your system + </LI> + <LI>Ensure you have enabled Axis2/C to run Tuscany SCA services. Follow the instructions + found <A HREF="../../doc/Axis2CWSExtension.html#deploy">here</A>. + </LI> + <LI>Start the Axis2/C simple http server: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>cd <tuscany_sca_install_dir>\samples\RubyBigBank\deploy\bigbank.account + </LI> + <LI>runwsserver.bat</LI> + </OL> + </LI> + <LI>Now run the Web Service client: + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + <LI>AXIS2C_HOME=<path to Axis2/C version 0.96></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/RubyBigBank/deploy/bigbank.wsclient</LI> + <LI>./runwsclient.bat</LI> + </UL> + </LI> + </OL> + </LI> + <LI>The PHP web client detailed in the + <A HREF="../CppBigBank/README.html">CppBigBank</A> sample can also be used + with the Ruby BigBank service that is served by the Axis2/C http server started above. + </LI> + </OL> + </DIV> + + + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountDataServiceImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountDataServiceImpl.rb new file mode 100644 index 0000000000..8ae0e23bab --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountDataServiceImpl.rb @@ -0,0 +1,72 @@ +# 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. +# + +require "rexml/document" +include REXML + +class AccountDataServiceImpl + + def initialize() + print "Ruby - AccountDataServiceImpl.initialize\n" + end + + def getCheckingAccount(id) + print "Ruby - AccountDataServiceImpl.getCheckingAccount ", id, "\n" + + result = Document.new <<-eof + <CheckingAccount xmlns="http://www.bigbank.com/AccountService" + xsi:type="CheckingAccount" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <accountNumber>#{ id.to_s + "_CHA12345"}</accountNumber> + <balance>1500.0</balance> + </CheckingAccount> + eof + + return result + end + + def getSavingsAccount(id) + print "Ruby - AccountDataServiceImpl.getSavingsAccount ", id, "\n" + + result = Document.new <<-eof + <SavingsAccount xmlns="http://www.bigbank.com/AccountService" + xsi:type="SavingsAccount" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <accountNumber>#{ id.to_s + "_SAA12345"}</accountNumber> + <balance>1500.0</balance> + </SavingsAccount> + eof + + return result + end + + def getStockAccount(id) + print "Ruby - AccountDataServiceImpl.getStockAccount ", id, "\n" + + result = Document.new <<-eof + <StockAccount xmlns="http://www.bigbank.com/AccountService" + xsi:type="StockAccount" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <accountNumber>#{ id.to_s + "_STA12345"}</accountNumber> + <symbol>IBM</symbol> + <quantity>100</quantity> + <balance></balance> + </StockAccount> + eof + + return result + end + +end diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountService.wsdl new file mode 100644 index 0000000000..b83c453462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountService.wsdl @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.bigbank.com/AccountService" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.bigbank.com/AccountService" + name="AccountService"> + + <wsdl:types> + <xsd:schema + targetNamespace="http://www.bigbank.com/AccountService" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="getAccountReport"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" + type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="getAccountReportResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" + type="tns:AccountReport" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="AccountReport"> + <xsd:sequence> + <xsd:element name="checking" + type="tns:CheckingAccount" maxOccurs="unbounded" /> + <xsd:element name="savings" + type="tns:SavingsAccount" maxOccurs="unbounded" /> + <xsd:element name="stocks" type="tns:StockAccount" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="getAccountReportRequest"> + <wsdl:part element="tns:getAccountReport" + name="getAccountReportRequest" /> + </wsdl:message> + + <wsdl:message name="getAccountReportResponse"> + <wsdl:part element="tns:getAccountReportResponse" + name="getAccountReportResponse" /> + </wsdl:message> + + <wsdl:portType name="AccountService"> + <wsdl:operation name="getAccountReport"> + <wsdl:input message="tns:getAccountReportRequest" /> + <wsdl:output message="tns:getAccountReportResponse" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="getAccountReport"> + <soap:operation + soapAction="http://www.bigbank.com/AccountService/getAccountReport" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + + <wsdl:service name="AccountService"> + <wsdl:port binding="tns:AccountServiceSOAP" + name="AccountServiceSOAP"> + <soap:address + location="http://localhost:9090/axis2/services/bigbank.AccountManagementComponent/AccountService" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountServiceImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountServiceImpl.rb new file mode 100644 index 0000000000..aab789ca13 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/AccountServiceImpl.rb @@ -0,0 +1,82 @@ +# 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. +# + +require "rexml/document" +include REXML + +class AccountServiceImpl + + attr_writer :accountDataService + attr_writer :stockQuoteService + attr_writer :currency + + def initialize() + print "Ruby - AccountServiceImpl.initialize\n" + end + + def getAccountReport(customerID) + + # Get the checking account info + checking = @accountDataService.getCheckingAccount(customerID) + + # Get the savings account info + savings = @accountDataService.getSavingsAccount(customerID) + + # Get the stocks account info + stock = @accountDataService.getStockAccount(customerID); + symbol = stock.root.elements["symbol"].text + quantity = stock.root.elements["quantity"].text + + # Get the stock price + price = @stockQuoteService.getQuote(symbol); + + # Convert to the configured currency + price = price.to_f * 0.80 if @currency == "EUR" + + # Calculate the balance + balance = price.to_f * quantity.to_f + + # Form the AccountReport document + report = Document.new <<-eof + <AccountReport xmlns="http://www.bigbank.com/AccountService" + xsi:type="AccountReport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <checking> + <accountNumber>#{ checking.root.elements["accountNumber"].text }</accountNumber> + <balance>#{ checking.root.elements["balance"].text }</balance> + </checking> + + <savings> + <accountNumber>#{ savings.root.elements["accountNumber"].text }</accountNumber> + <balance>#{ savings.root.elements["balance"].text }</balance> + </savings> + + <stocks> + <accountNumber>#{ stock.root.elements["accountNumber"].text }</accountNumber> + <symbol>#{ symbol }</symbol> + <quantity>#{ quantity }</quantity> + <balance>#{ balance }</balance> + </stocks> + + </AccountReport> + eof + + return report + end + +end diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/Makefile.am new file mode 100644 index 0000000000..6e5ec38414 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/Makefile.am @@ -0,0 +1,24 @@ +# 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. + +deploydir=$(prefix)/RubyBigBank/deploy +compositedir=$(deploydir)/bigbank.account + +composite_SCRIPTS = runwsserver.sh + +composite_DATA = *.composite *.wsdl *.xsd *.rb +EXTRA_DIST = *.composite *.wsdl *.xsd runwsserver.sh *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteServiceImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteServiceImpl.rb new file mode 100644 index 0000000000..7f8634072c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteServiceImpl.rb @@ -0,0 +1,52 @@ +# 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. +# + +require "rexml/document" +include REXML + +class StockQuoteServiceImpl + + attr_writer :webService + + def initialize() + print "Ruby - StockQuoteServiceImpl.initialize\n" + end + + def getQuote(symbol) + print "Ruby - StockQuoteServiceImpl.getQuote ", symbol, "\n" + + price = 0 + catch (:RuntimeError) do + begin + + result = @webService.GetQuote(symbol) + doc = Document.new(result) + price = doc.root.elements["Stock"].elements["Last"].text; + + rescue + # offline or StockQuote web service is down + price = 95.0 + end + end + + print "Ruby - stock price = ", price, "\n" + + return price.to_f + end + +end
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteTypes.xsd b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteTypes.xsd new file mode 100644 index 0000000000..2f7012b5fb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteTypes.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <xs:element name="StockQuotes" type="tStockQuotes"/> + <xs:complexType name="tStockQuotes"> + <xs:sequence> + <xs:element name="Stock" type="tStock" minOccurs="0" maxOccurs="unbounded"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> + + <xs:complexType name="tStock"> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="1" name="Symbol" type="xs:string"/> + <xs:element minOccurs="0" maxOccurs="1" name="Last" type="xs:float"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax"/> + </xs:complexType> +</xs:schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteWebService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteWebService.wsdl new file mode 100644 index 0000000000..c14f97c87b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/StockQuoteWebService.wsdl @@ -0,0 +1,165 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:s="http://www.w3.org/2001/XMLSchema" + xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" + xmlns:tns="http://www.webserviceX.NET/" + xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" + xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" + targetNamespace="http://www.webserviceX.NET/" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + <wsdl:types> + <s:schema elementFormDefault="qualified" + targetNamespace="http://www.webserviceX.NET/"> + <s:element name="GetQuote"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="symbol" type="s:string" /> + </s:sequence> + </s:complexType> + + </s:element> + <s:element name="GetQuoteResponse"> + <s:complexType> + <s:sequence> + <s:element minOccurs="0" maxOccurs="1" + name="GetQuoteResult" type="s:string" /> + </s:sequence> + </s:complexType> + </s:element> + <s:element name="string" nillable="true" type="s:string" /> + + </s:schema> + </wsdl:types> + <wsdl:message name="GetQuoteSoapIn"> + <wsdl:part name="parameters" element="tns:GetQuote" /> + </wsdl:message> + <wsdl:message name="GetQuoteSoapOut"> + <wsdl:part name="parameters" element="tns:GetQuoteResponse" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpGetIn"> + + <wsdl:part name="symbol" type="s:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpGetOut"> + <wsdl:part name="Body" element="tns:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpPostIn"> + <wsdl:part name="symbol" type="s:string" /> + </wsdl:message> + <wsdl:message name="GetQuoteHttpPostOut"> + + <wsdl:part name="Body" element="tns:string" /> + </wsdl:message> + <wsdl:portType name="StockQuoteSoap"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteSoapIn" /> + <wsdl:output message="tns:GetQuoteSoapOut" /> + </wsdl:operation> + + </wsdl:portType> + <wsdl:portType name="StockQuoteHttpGet"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteHttpGetIn" /> + <wsdl:output message="tns:GetQuoteHttpGetOut" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:portType name="StockQuoteHttpPost"> + <wsdl:operation name="GetQuote"> + <documentation xmlns="http://schemas.xmlsoap.org/wsdl/"> + Get Stock quote for a company Symbol + </documentation> + <wsdl:input message="tns:GetQuoteHttpPostIn" /> + <wsdl:output message="tns:GetQuoteHttpPostOut" /> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="StockQuoteSoap" type="tns:StockQuoteSoap"> + + <soap:binding transport="http://schemas.xmlsoap.org/soap/http" + style="document" /> + <wsdl:operation name="GetQuote"> + <soap:operation + soapAction="http://www.webserviceX.NET/GetQuote" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="StockQuoteHttpGet" + type="tns:StockQuoteHttpGet"> + <http:binding verb="GET" /> + <wsdl:operation name="GetQuote"> + <http:operation location="/GetQuote" /> + <wsdl:input> + <http:urlEncoded /> + </wsdl:input> + + <wsdl:output> + <mime:mimeXml part="Body" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:binding name="StockQuoteHttpPost" + type="tns:StockQuoteHttpPost"> + <http:binding verb="POST" /> + <wsdl:operation name="GetQuote"> + <http:operation location="/GetQuote" /> + + <wsdl:input> + <mime:content type="application/x-www-form-urlencoded" /> + </wsdl:input> + <wsdl:output> + <mime:mimeXml part="Body" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + <wsdl:service name="StockQuote"> + + <wsdl:port name="StockQuoteSoap" binding="tns:StockQuoteSoap"> + <soap:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + <wsdl:port name="StockQuoteHttpGet" + binding="tns:StockQuoteHttpGet"> + <http:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + <wsdl:port name="StockQuoteHttpPost" + binding="tns:StockQuoteHttpPost"> + <http:address + location="http://www.webservicex.net/stockquote.asmx" /> + </wsdl:port> + + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/bigbank.account.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/bigbank.account.composite new file mode 100644 index 0000000000..8fff8425a1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/bigbank.account.composite @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.account"> + + <service name="AccountService"> + <interface.wsdl interface="http://www.bigbank.com/AccountService#wsdl.interface(AccountService)"/> + <!-- The endpoint is optional --> + <!-- <binding.ws endpoint="http://www.bigbank.com/AccountService#wsdl.endpoint(AccountService/AccountServiceSOAP)"/> --> + <binding.ws/> + <reference>AccountServiceComponent</reference> + </service> + + <component name="AccountServiceComponent"> + <implementation.ruby script="AccountServiceImpl.rb" class="AccountServiceImpl"/> + <reference name="accountDataService">AccountDataServiceComponent</reference> + <reference name="stockQuoteService">StockQuoteServiceComponent</reference> + <property name="currency">USD</property> + </component> + + <component name="AccountDataServiceComponent"> + <implementation.ruby script="AccountDataServiceImpl.rb" class="AccountDataServiceImpl"/> + </component> + + <component name="StockQuoteServiceComponent"> + <implementation.ruby script="StockQuoteServiceImpl.rb" class="StockQuoteServiceImpl"/> + <reference name="webService">StockQuoteWebService</reference> + </component> + + <reference name="StockQuoteWebService"> + <interface.wsdl interface="http://www.webserviceX.NET/#wsdl.interface(StockQuoteSoap)"/> + <binding.ws endpoint="http://www.webserviceX.NET/#wsdl.endpoint(StockQuote/StockQuoteSoap)"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/runwsserver.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/runwsserver.bat new file mode 100644 index 0000000000..3ab4275436 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/runwsserver.bat @@ -0,0 +1,51 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +set APFULLDIR=%~d0%~p0 +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +rem Run the server +set PATH=%TUSCANY_SCACPP%\bin;%TUSCANY_SCACPP%\extensions\cpp\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +cd %AXIS2C_HOME%\bin +.\axis2_http_server.exe + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/runwsserver.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/runwsserver.sh new file mode 100755 index 0000000000..e3bbca46c6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.account/runwsserver.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +# 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. + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/cpp/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $AXIS2C_HOME/bin +./axis2_http_server diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.app.composite new file mode 100644 index 0000000000..dd94e61e5b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.app.composite @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.app"> + + <component name="bigbank.AccountManagementComponent"> + <implementation.composite name="bigbank.account"/> + </component> + + <component name="bigbank.AccountWSClientComponent"> + <implementation.composite name="bigbank.wsclient"/> + <reference name="AccountService">bigbank.AccountManagementComponent/AccountService</reference> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/AccountClient.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/AccountClient.rb new file mode 100644 index 0000000000..31c0acc909 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/AccountClient.rb @@ -0,0 +1,40 @@ +# 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. +# +# + +require("tuscany_sca_ruby") + +accountService = SCA::locateService("AccountServiceComponent") + +report = accountService.getAccountReport(1234) + +checking = report.root.elements["checking"] +savings = report.root.elements["savings"] +stocks = report.root.elements["stocks"] + +print "\n" +print "Checking account: ", checking.elements["accountNumber"].text.strip, "\n" +print "Balance: ", checking.elements["balance"].text.strip, "\n" + +print "Savings account: ", savings.elements["accountNumber"].text.strip, "\n" +print "Balance: ", savings.elements["balance"].text.strip, "\n" + +print "Stocks account:", stocks.elements["accountNumber"].text.strip, "\n" +print "Symbol: ", stocks.elements["symbol"].text.strip, "\n" +print "Quantity: ", stocks.elements["quantity"].text.strip, "\n" +print "Balance: ", stocks.elements["balance"].text.strip, "\n" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/Makefile.am new file mode 100644 index 0000000000..4e4936746a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RubyBigBank/deploy +clientdir=$(deploydir)/bigbank.client + +client_DATA = *.rb +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/runclient.bat new file mode 100644 index 0000000000..0495237f7f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/runclient.bat @@ -0,0 +1,51 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +rem Run the client +set PATH=%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=bigbank.AccountManagementComponent +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd %TUSCANY_SCACPP_ROOT%\bigbank.client +ruby -I%TUSCANY_SCACPP%\extensions\ruby\bin AccountClient.rb + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/runclient.sh new file mode 100755 index 0000000000..94d5cd6ff8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.client/runclient.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# 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. + + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=bigbank.AccountManagementComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/bigbank.client +ruby -I$TUSCANY_SCACPP/extensions/ruby/lib AccountClient.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/AccountService.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/AccountService.wsdl new file mode 100644 index 0000000000..b83c453462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/AccountService.wsdl @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:tns="http://www.bigbank.com/AccountService" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xsd="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.bigbank.com/AccountService" + name="AccountService"> + + <wsdl:types> + <xsd:schema + targetNamespace="http://www.bigbank.com/AccountService" + xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <xsd:element name="getAccountReport"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="customerID" + type="xsd:string" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:element name="getAccountReportResponse"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="result" + type="tns:AccountReport" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + + <xsd:complexType name="AccountReport"> + <xsd:sequence> + <xsd:element name="checking" + type="tns:CheckingAccount" maxOccurs="unbounded" /> + <xsd:element name="savings" + type="tns:SavingsAccount" maxOccurs="unbounded" /> + <xsd:element name="stocks" type="tns:StockAccount" + maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="StockAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="symbol" type="xsd:string" /> + <xsd:element name="quantity" type="xsd:integer" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="CheckingAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + + <xsd:complexType name="SavingsAccount"> + <xsd:sequence> + <xsd:element name="accountNumber" type="xsd:string" /> + <xsd:element name="balance" type="xsd:float" /> + </xsd:sequence> + </xsd:complexType> + </xsd:schema> + </wsdl:types> + + <wsdl:message name="getAccountReportRequest"> + <wsdl:part element="tns:getAccountReport" + name="getAccountReportRequest" /> + </wsdl:message> + + <wsdl:message name="getAccountReportResponse"> + <wsdl:part element="tns:getAccountReportResponse" + name="getAccountReportResponse" /> + </wsdl:message> + + <wsdl:portType name="AccountService"> + <wsdl:operation name="getAccountReport"> + <wsdl:input message="tns:getAccountReportRequest" /> + <wsdl:output message="tns:getAccountReportResponse" /> + </wsdl:operation> + </wsdl:portType> + + <wsdl:binding name="AccountServiceSOAP" type="tns:AccountService"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="getAccountReport"> + <soap:operation + soapAction="http://www.bigbank.com/AccountService/getAccountReport" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + </wsdl:operation> + </wsdl:binding> + + <wsdl:service name="AccountService"> + <wsdl:port binding="tns:AccountServiceSOAP" + name="AccountServiceSOAP"> + <soap:address + location="http://localhost:9090/axis2/services/bigbank.AccountManagementComponent/AccountService" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/AccountWSClient.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/AccountWSClient.rb new file mode 100644 index 0000000000..6775b80f7a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/AccountWSClient.rb @@ -0,0 +1,40 @@ +# 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. +# +# + +require("tuscany_sca_ruby") + +accountService = SCA::locateService("AccountService") + +report = accountService.getAccountReport(1234) + +checking = report.root.elements["checking"] +savings = report.root.elements["savings"] +stocks = report.root.elements["stocks"] + +print "\n\n" +print "Checking account #: ", checking.elements["accountNumber"].text.strip, "\n" +print "Balance: ", checking.elements["balance"].text.strip, "\n" + +print "Savings account #: ", savings.elements["accountNumber"].text.strip, "\n" +print "Balance: ", savings.elements["balance"].text.strip, "\n" + +print "Stocks account #:", stocks.elements["accountNumber"].text.strip, "\n" +print "Symbol: ", stocks.elements["symbol"].text.strip, "\n" +print "Quantity: ", stocks.elements["quantity"].text.strip, "\n" +print "Balance: ", stocks.elements["balance"].text.strip, "\n" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/Makefile.am new file mode 100644 index 0000000000..23f8b55959 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RubyBigBank/deploy +clientdir=$(deploydir)/bigbank.wsclient + +client_DATA = *.rb *.composite *.wsdl +client_SCRIPTS = runwsclient.sh +EXTRA_DIST = runwsclient.sh *.rb *.composite *.wsdl diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/bigbank.wsclient.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/bigbank.wsclient.composite new file mode 100644 index 0000000000..f484a2fc7c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/bigbank.wsclient.composite @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="bigbank.wsclient"> + + <reference name="AccountService"> + <interface.wsdl interface="http://www.bigbank.com/AccountService#wsdl.interface(AccountService)"/> + <binding.ws/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/runwsclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/runwsclient.bat new file mode 100644 index 0000000000..6e1bb27b4a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/runwsclient.bat @@ -0,0 +1,51 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo Using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo Using SDO installed at %TUSCANY_SDOCPP% + +if "%AXIS2C_HOME%" == "" ( +echo "AXIS2C_HOME not set" +goto end +) +echo Using Axis2C installed at %AXIS2C_HOME% + +rem Run the client +set PATH=%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%AXIS2C_HOME%\lib;%PATH% + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=bigbank.AccountWSClientComponent +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd %TUSCANY_SCACPP_ROOT%\bigbank.wsclient +ruby -I%TUSCANY_SCACPP%\extensions\ruby\bin AccountWSClient.rb + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/runwsclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/runwsclient.sh new file mode 100755 index 0000000000..d50e6a4b0a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyBigBank/bigbank.wsclient/runwsclient.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# 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. + + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +if [ x$AXIS2C_HOME = x ]; then +echo "AXIS2C_HOME not set" +exit; +fi +echo "Using Axis2C installed at $AXIS2C_HOME" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$AXIS2C_HOME/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=bigbank.AccountWSClientComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/bigbank.wsclient +ruby -I$TUSCANY_SCACPP/extensions/ruby/lib AccountWSClient.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/Makefile.am new file mode 100644 index 0000000000..246ea1852f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/Makefile.am @@ -0,0 +1,21 @@ +# 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. + +deploydir=$(prefix)/RubyCalculator/deploy +SUBDIRS = sample.calculator sample.calculator.client +EXTRA_DIST = *.composite README.html +deploy_DATA = *.composite diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/README b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/README new file mode 100644 index 0000000000..670f561dc1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/README @@ -0,0 +1,20 @@ +Tuscany SCA for C++ Samples - Calculator Sample +=============================================== + +This is a very simple sample to show how an SCA composite can wire together +two components to implement a Calculator service and expose that service as +a Web Service. + +There are two sub projects in this workspace: + - sample.calculator + This contains the source code and SCDL artifacts for the SCA Calculator. + composite implementing the sample Calculator. + + - sample.calculator.client + A sample client which does a local call to the Calculator service. + +Additionally, there is the sample.calculator.app.composite file. This +describes the configuration of the SCA Calculator composite deployed to the +SCA runtime. + +See the README.html file for instructions to build and run this sample diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/README.html b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/README.html new file mode 100644 index 0000000000..bb6fe7e0ea --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/README.html @@ -0,0 +1,187 @@ + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<HTML> +<HEAD> + <META CONTENT="text/html; charset=iso-8859-1" HTTP-EQUIV="Content-Type"> + <META CONTENT="text/css" HTTP-EQUIV="Content-Style-Type"> + <STYLE MEDIA="all" TYPE="text/css"> +@import url("../../doc/css/maven-base.css"); +@import url("../../doc/css/maven-theme.css"); + </STYLE> + + <LINK HREF="../doc/css/maven-theme.css" MEDIA="print" REL="stylesheet" + TYPE="text/css"> + <TITLE>Tuscany SCA Native Samples - Ruby Calculator Sample</TITLE> +</HEAD> + +<BODY> +<DIV ID="bodyColumn"> + <DIV ID="contentBox"> + <DIV CLASS="section"> + <H1>Tuscany SCA Native Samples - Ruby Calculator Sample</H1> + + <P>This is a very simple sample to show how an SCA composite can wire + together two Ruby components to implement a Calculator service and invoke + the service via a local client. + </P> + <P>There are two sub projects in this workspace:</P> + <UL> + <LI>sample.calculator<BR/> + This contains the Ruby scripts and SCDL artifacts for the SCA Calculator + composite implementing the sample Calculator. + </LI> + <LI>sample.calculator.client<BR/> + A sample client which does a local call to the Calculator service. + </LI> + </UL> + <P>Additionally, there is the sample.calculator.app.composite file. This + describes the configuration of the SCA Calculator composite deployed to the SCA + runtime. + </P> + </DIV> + + <DIV CLASS="section"> + <H2>Contents</H2> + <OL> + <LI><A HREF="#linuxbld">Building the Ruby samples on Linux and Mac OS X</A></LI> + <LI><A HREF="#linuxrun">Running the Ruby Calculator sample on Linux and Mac OS X</A></LI> + <LI><A HREF="#winbld">Building the Ruby Calculator sample on Windows</A></LI> + <LI><A HREF="#winrun">Running the Ruby Calculator sample on Windows</A></LI> + <LI><A HREF="#help">Getting help</A></LI> + </OL> + </DIV> + + + <DIV CLASS="section"> + <A NAME="linuxbld"><H2>Building the Ruby samples on Linux and Mac OS X</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>/samples - go directly to <A HREF="#linuxrun">Running the samples on Linux and Mac OS X</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL></LI> + </LI> + <LI>As the Ruby Calculator sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the Ruby samples only with the following command sequence: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples</LI> + <LI>./configure --enable-ruby --enable-cpp=no --prefix=$TUSCANY_SCACPP/samples</LI> + <LI>make install</LI> + </UL> + NOTE: If you don't provide the --prefix configure option, it will by default install into + /usr/local/tuscany/sca/samples/RubyCalculator</LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="linuxrun"><H2>Running the Ruby Calculator sample on Linux and Mac OS X</H2></A> + <OL> + <LI>The Ruby Calculator sample requires the following extension: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have this extension built and installed + on your system + </LI> + + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>/samples/RubyCalculator/deploy/sample.calculator.client</LI> + <LI>./runclient.sh</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winbld"><H2>Building the Ruby Calculator sample on Windows</H2></A> + <P>If using the binary distribution the samples are built and installed in + <tuscany_sca_install_dir>\samples - go directly to <A HREF="#winrun">Running the samples on Windows</A>.</P> + <OL> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>As this sample is based on Ruby scripts, a specific compilation step is not necessary - + only deployment is required. Deploy the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RubyCalculator</LI> + <LI>deploy.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="winrun"><H2>Running the Ruby Calculator sample on Windows</H2></A> + <OL> + <LI>The Ruby Calculator sample requires the following extension: + <UL> + <LI><A HREF="../../doc/RubyExtension.html">Ruby Extension</A></LI> + </UL> + Please follow the documentation to ensure you have this extension built and installed + on your system + </LI> + <LI>The following environment variables are required: + <UL> + <LI>TUSCANY_SCACPP=<path to installed Tuscany SCA></LI> + <LI>TUSCANY_SDOCPP=<path to installed Tuscany SDO></LI> + </UL> + </LI> + <LI>Run the sample with the following commands: + <UL> + <LI>cd <tuscany_sca_install_dir>\samples\RubyCalculator\deploy\sample.calculator.client</LI> + <LI>runclient.bat</LI> + </UL> + </LI> + </OL> + </DIV> + + <DIV CLASS="section"> + <A NAME="help"><H2>Getting Help</H2></A> + + <P>The first place to look is at the Tuscany SCA FAQ at + <A HREF="http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ" + TARGET="_blank">http://cwiki.apache.org/confluence/display/TUSCANY/Tuscany+SCA+-+FAQ</A> </P> + + <P>Any problem with this release can be reported to the Tuscany + <A HREF="http://cwiki.apache.org/TUSCANY/mailing-lists.html" + TARGET="_blank">mailing lists</A> or create a JIRA issue at <A HREF="http://issues.apache.org/jira/browse/Tuscany" + TARGET="_blank">http://issues.apache.org/jira/browse/Tuscany</A>.</P> + + </DIV> + </DIV> +</DIV> +</BODY> + +</HTML> + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.app.composite new file mode 100644 index 0000000000..ada4d89a1c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.app.composite @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator.app"> + + <component name="sample.calculator.CalculatorComponent"> + <implementation.composite name="sample.calculator" /> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/CalculatorClient.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/CalculatorClient.rb new file mode 100644 index 0000000000..253928df0c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/CalculatorClient.rb @@ -0,0 +1,25 @@ +# 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. +# +# + +require("tuscany_sca_ruby") + +calculator = SCA::locateService("CalculatorComponent") + +x = calculator.div(5, 2) +print x, "\n" diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/Makefile.am new file mode 100644 index 0000000000..38f61539d3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +deploydir=$(prefix)/RubyCalculator/deploy +clientdir=$(deploydir)/sample.calculator.client + +client_DATA = *.rb +client_SCRIPTS = runclient.sh +EXTRA_DIST = runclient.sh *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/runclient.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/runclient.bat new file mode 100644 index 0000000000..4a1079986a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/runclient.bat @@ -0,0 +1,44 @@ +@echo off + +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +setlocal + +if "%TUSCANY_SCACPP%" == "" ( +echo "TUSCANY_SCACPP not set" +goto end +) +echo using SCA installed at %TUSCANY_SCACPP% + +if "%TUSCANY_SDOCPP%" == "" ( +echo "TUSCANY_SDOCPP not set" +goto end +) +echo using SDO installed at %TUSCANY_SDOCPP% + +set PATH=%TUSCANY_SCACPP%\extensions\ruby\bin;%TUSCANY_SCACPP%\bin;%TUSCANY_SDOCPP%\bin;%PATH% + +set TUSCANY_SCACPP_ROOT=%~d0%~p0\..\ +set TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent +set TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd %TUSCANY_SCACPP_ROOT%\sample.calculator.client +ruby -I%TUSCANY_SCACPP%\extensions\ruby\bin CalculatorClient.rb + +:end +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/runclient.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/runclient.sh new file mode 100755 index 0000000000..bc2d6c0904 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator.client/runclient.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +# 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. + + +APFULLDIR=`pwd` + +if [ x$TUSCANY_SCACPP = x ]; then +echo "TUSCANY_SCACPP not set" +exit; +fi +echo "Using SCA installed at $TUSCANY_SCACPP" + +if [ x$TUSCANY_SDOCPP = x ]; then +echo "TUSCANY_SDOCPP not set" +exit; +fi +echo "Using SDO installed at $TUSCANY_SDOCPP" + +export LD_LIBRARY_PATH=$TUSCANY_SCACPP/extensions/ruby/lib:$TUSCANY_SCACPP/lib:$TUSCANY_SDOCPP/lib:$LD_LIBRARY_PATH + +export TUSCANY_SCACPP_ROOT=$APFULLDIR/../ +export TUSCANY_SCACPP_COMPONENT=sample.calculator.CalculatorComponent +export TUSCANY_SCACPP_BASE_URI=http://localhost:9090 + +cd $TUSCANY_SCACPP_ROOT/sample.calculator.client +ruby -I$TUSCANY_SCACPP/extensions/ruby/lib CalculatorClient.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/Calculator.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/Calculator.wsdl new file mode 100644 index 0000000000..331b996ba2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/Calculator.wsdl @@ -0,0 +1,161 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" + targetNamespace="http://sample/calculator"> + <types> + <xs:schema targetNamespace="http://sample/calculator" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://sample/calculator" elementFormDefault="qualified"> + + <xs:element name="add"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="sub"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="mul"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="div"> + <xs:complexType> + <xs:sequence> + <xs:element name="param1" type="xs:float"/> + <xs:element name="param2" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + <xs:element name="result"> + <xs:complexType> + <xs:sequence> + <xs:element name="data" type="xs:float"/> + </xs:sequence> + </xs:complexType> + </xs:element> + + </xs:schema> + </types> + + <message name="addRequestMsg"> + <part name="body" element="tns:add" /> + </message> + <message name="subRequestMsg"> + <part name="body" element="tns:sub" /> + </message> + <message name="mulRequestMsg"> + <part name="body" element="tns:mul" /> + </message> + <message name="divRequestMsg"> + <part name="body" element="tns:div" /> + </message> + + <message name="calculatorResponseMsg"> + <part name="body" element="tns:result" /> + </message> + + <portType name="Calculator"> + <operation name="add"> + <input message="tns:addRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="sub"> + <input message="tns:subRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="mul"> + <input message="tns:mulRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + <operation name="div"> + <input message="tns:divRequestMsg" /> + <output message="tns:calculatorResponseMsg" /> + </operation> + </portType> + + <binding name="CalculatorBinding" + type="tns:Calculator"> + <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> + <operation name="add"> + <soap:operation soapAction="CalculatorService#add" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="sub"> + <soap:operation soapAction="CalculatorService#sub" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="mul"> + <soap:operation soapAction="CalculatorService#mul" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + <operation name="div"> + <soap:operation soapAction="CalculatorService#div" /> + <input> + <soap:body use="literal" /> + </input> + <output> + <soap:body use="literal" /> + </output> + </operation> + </binding> + + <service name="CalculatorService"> + <port name="CalculatorPort" + binding="tns:CalculatorBinding"> + <soap:address location="http://localhost:9090/axis2/services/sample.calculator.CalculatorComponent/CalculatorService" /> + </port> + </service> +</definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/CalculatorImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/CalculatorImpl.rb new file mode 100644 index 0000000000..36ed15ff9b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/CalculatorImpl.rb @@ -0,0 +1,48 @@ +# 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 CalculatorImpl + + attr_writer :divideService + + def initialize() + print "Ruby - CalculatorImpl.initialize\n" + end + + def div(arg1, arg2) + print "Ruby - CalculatorImpl.div\n" + @divideService.divide(arg1.to_f, arg2.to_f) + end + + def add(arg1, arg2) + print "Ruby - CalculatorImpl.add\n" + arg1.to_f + arg2.to_f + end + + def sub(arg1, arg2) + print "Ruby - CalculatorImpl.sub\n" + arg1.to_f - arg2.to_f + end + + def mul(arg1, arg2) + print "Ruby - CalculatorImpl.mul\n" + arg1.to_f * arg2.to_f + end + +end
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/DivideImpl.rb b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/DivideImpl.rb new file mode 100644 index 0000000000..c6615bfcfa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/DivideImpl.rb @@ -0,0 +1,39 @@ +# 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 DivideImpl + + attr_writer :round + + def initialize() + print "Ruby - DivideImpl.initialize\n" + end + + def divide(arg1, arg2) + print "Ruby - DivideImpl.divide ", arg1, " / ", arg2, "\n" + res = arg1.to_f / arg2.to_f + if @round then + res = res.round + print "DivideImpl.divide rounding\n" + end + print "DivideImpl.divide ", res, "\n" + res + end + +end
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/Makefile.am new file mode 100644 index 0000000000..7de5b9fdd3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +deploydir=$(prefix)/RubyCalculator/deploy +compositedir=$(deploydir)/sample.calculator + +composite_DATA = *.composite *.wsdl *.rb +EXTRA_DIST = *.composite *.wsdl *.rb diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/sample.calculator.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/sample.calculator.composite new file mode 100644 index 0000000000..d77ba538fe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/RubyCalculator/sample.calculator/sample.calculator.composite @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="sample.calculator"> + + <component name="CalculatorComponent"> + <implementation.ruby script="CalculatorImpl.rb" class="CalculatorImpl"/> + <reference name="divideService">DivideComponent</reference> + </component> + + <component name="DivideComponent"> + <implementation.ruby script="DivideImpl.rb" class="DivideImpl"/> + <property name="round">true</property> + </component> + +</composite>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo.app.composite new file mode 100644 index 0000000000..3b8738a843 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo.app.composite @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.demo.app"> + + <component name="supplychain.DemoClient"> + <implementation.composite name="supplychain.demo"/> + <reference name="retailer">supplychain.Retailer/RetailerService</reference> + <reference name="logging">supplychain.Logging/LoggingService</reference> + </component> + + <component name="supplychain.Logging"> + <implementation.composite name="supplychain.logging"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo/DemoClientImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo/DemoClientImpl.componentType new file mode 100644 index 0000000000..a63e4c37d3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo/DemoClientImpl.componentType @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <reference name="retailer"> + <interface.cpp header="Retailer.h"/> + </reference> + + <reference name="logging"> + <interface.cpp header="Logging.h"/> + </reference> + +</componentType> +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo/supplychain.demo.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo/supplychain.demo.composite new file mode 100644 index 0000000000..20b0e49ec1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.demo/supplychain.demo.composite @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.demo"> + + <component name="DemoClient"> + <implementation.cpp library="demo" header="DemoClientImpl.h"/> + <reference name="retailer">retailer</reference> + <reference name="logging">logging</reference> + </component> + + <reference name="retailer"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl#wsdl.interface(RetailerPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl#wsdl.endpoint(RetailerService/RetailerPort)" + uri="http://localhost:9090/axis2/services/supplychain.retailer.solution/RetailerService"/> + </reference> + + <reference name="logging"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.interface(LoggingFacilityLogPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.endpoint(LoggingFacilityService/LoggingFacilityPort)"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/LoggerImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/LoggerImpl.componentType new file mode 100644 index 0000000000..e78e602635 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/LoggerImpl.componentType @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <service name="LoggingService"> + <interface.cpp header="Logging.h"/> + </service> + +</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/LoggingFacility.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/LoggingFacility.wsdl new file mode 100644 index 0000000000..c78357b1a8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/LoggingFacility.wsdl @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> +<wsdl:definitions name="LoggingFacility" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl" + xmlns:tns="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + + <wsdl:import + namespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl" + location="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl" /> + + <wsdl:service name="LoggingFacilityService"> + <wsdl:port name="LoggingFacilityPort" + binding="tns:LoggingFacilitySoapBinding"> + <soap:address + location="http://localhost:9090/axis2/services/LoggingFacility" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/supplychain.logging.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/supplychain.logging.composite new file mode 100644 index 0000000000..2b28c8f9e2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.logging/supplychain.logging.composite @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.logging"> + + <service name="LoggingService"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.interface(LoggingFacilityLogPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.endpoint(LoggingFacilityService/LoggingFacilityPort)"/> + <reference>Logger/Logging</reference> + </service> + + <component name="Logger"> + <implementation.cpp library="logging" header="LoggerImpl.h"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/Manufacturer.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/Manufacturer.wsdl new file mode 100644 index 0000000000..fb0c8a5676 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/Manufacturer.wsdl @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions name="Manufacturer" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl" + xmlns:tns="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl"> + + <wsdl:import + namespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl" + location="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl" /> + + <wsdl:service name="ManufacturerService"> + <wsdl:port name="ManufacturerPort" + binding="tns:ManufacturerSoapBinding"> + <soap:address + location="http://localhost:9090/axis2/services/Manufacturer" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/ManufacturerImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/ManufacturerImpl.componentType new file mode 100644 index 0000000000..63530bc0ee --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/ManufacturerImpl.componentType @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <service name="ManufacturerService"> + <interface.cpp header="Manufacturer.h"/> + </service> + + <reference name="callback"> + <interface.cpp header="WarehouseCallback.h"/> + </reference> + + <reference name="logging"> + <interface.cpp header="Logging.h"/> + </reference> + + <property name="manufacturerID" type="xs:string"/> + +</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/WarehouseCallback.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/WarehouseCallback.wsdl new file mode 100644 index 0000000000..256671f64f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/WarehouseCallback.wsdl @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions name="WarehouseCallback" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + targetNamespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl" + xmlns:tns="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl"> + + <wsdl:import + namespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl" + location="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl" /> + + <wsdl:service name="WarehouseCallbackService"> + <wsdl:port name="WarehouseCallbackPort" + binding="tns:WarehouseCallbackSoapBinding"> + <soap:address + location="http://localhost:9090/axis2/services/WarehouseCallback" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/supplychain.manufacturer.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/supplychain.manufacturer.composite new file mode 100644 index 0000000000..c61657c0a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturer/supplychain.manufacturer.composite @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + name="supplychain.manufacturer"> + + <service name="ManufacturerService"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.interface(ManufacturerPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.endpoint(ManufacturerService/ManufacturerPort)"/> + <reference>ManufacturerProcess/ManufacturerService</reference> + </service> + + <property name="manufacturerID" type="xs:string"/> + + <component name="ManufacturerProcess"> + <implementation.cpp library="manufacturer" header="ManufacturerImpl.h"/> + <reference name="callback">callback</reference> + <reference name="logging">logging</reference> + <property name="manufacturerID" source="$manufacturerID"/> + </component> + + <reference name="logging"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.interface(LoggingFacilityLogPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.endpoint(LoggingFacilityService/LoggingFacilityPort)"/> + </reference> + + <reference name="callback"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.interface(WarehouseCallbackPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.endpoint(WarehouseCallbackService/WarehouseCallbackPort)"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerA.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerA.app.composite new file mode 100644 index 0000000000..1963304b83 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerA.app.composite @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.manufacturerA.app"> + + <component name="supplychain.manufacturerA"> + <implementation.composite name="supplychain.manufacturer"/> + <reference name="logging">supplychain.Logging/LoggingService</reference> + <property name="manufacturerID">manufacturerA</property> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerB.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerB.app.composite new file mode 100644 index 0000000000..a2f9141f00 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerB.app.composite @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.manufacturerB.app"> + + <component name="supplychain.manufacturerB"> + <implementation.composite name="supplychain.manufacturer"/> + <reference name="logging">supplychain.Logging/LoggingService</reference> + <property name="manufacturerID">manufacturerB</property> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerC.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerC.app.composite new file mode 100644 index 0000000000..a48258b6ca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.manufacturerC.app.composite @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.manufacturerC.app"> + + <component name="supplychain.manufacturerC"> + <implementation.composite name="supplychain.manufacturer"/> + <reference name="logging">supplychain.Logging/LoggingService</reference> + <property name="manufacturerID">manufacturerC</property> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer.app.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer.app.composite new file mode 100644 index 0000000000..734849de05 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer.app.composite @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.retailer.app"> + + <component name="supplychain.Retailer"> + <implementation.composite name="supplychain.retailer"/> + <reference name="warehouse">supplychain.WarehouseA/WarehouseService</reference> + <reference name="warehouse">supplychain.WarehouseB/WarehouseService</reference> + <reference name="warehouse">supplychain.WarehouseC/WarehouseService</reference> + <reference name="logging">supplychain.Logging/LoggingService</reference> + </component> + + <component name="supplychain.WarehouseA"> + <implementation.composite name="supplychain.warehouse"/> + <reference name="manufacturer">supplychain.manufacturerA/ManufacturerService</reference> + <reference name="logging">supplychain.Logging/LoggingService</reference> + <property name="warehouseID">warehouseA</property> + </component> + + <component name="supplychain.WarehouseB"> + <implementation.composite name="supplychain.warehouse"/> + <reference name="manufacturer">supplychain.manufacturerB/ManufacturerService</reference> + <reference name="logging">supplychain.Logging/LoggingService</reference> + <property name="warehouseID">warehouseB</property> + </component> + + <component name="supplychain.WarehouseC"> + <implementation.composite name="supplychain.warehouse"/> + <reference name="manufacturer">supplychain.manufacturerA/ManufacturerService</reference> + <reference name="logging">supplychain.Logging/LoggingService</reference> + <property name="warehouseID">warehouseC</property> + </component> + + <wire> + <source>supplychain.manufacturerA/callback</source> + <target>supplychain.WarehouseA/WarehouseCallbackService</target> + </wire> + <wire> + <source>supplychain.manufacturerB/callback</source> + <target>supplychain.WarehouseB/WarehouseCallbackService</target> + </wire> + <wire> + <source>supplychain.manufacturerC/callback</source> + <target>supplychain.WarehouseC/WarehouseCallbackService</target> + </wire> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/Retailer.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/Retailer.wsdl new file mode 100644 index 0000000000..39bd1963f2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/Retailer.wsdl @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions name="Retailer" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl" + xmlns:tns="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" + xmlns="http://schemas.xmlsoap.org/wsdl/"> + + <wsdl:import + namespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl" + location="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl" /> + + <wsdl:service name="RetailerService"> + <wsdl:port name="RetailerPort" + binding="tns:RetailerSoapBinding"> + <soap:address + location="http://localhost:9090/axis2/services/Retailer" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/RetailerImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/RetailerImpl.componentType new file mode 100644 index 0000000000..fb381ec9a6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/RetailerImpl.componentType @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <service name="RetailerService"> + <interface.cpp header="Retailer.h"/> + </service> + + <reference name="warehouses" multiplicity="0..n"> + <interface.cpp header="Warehouse.h"/> + </reference> + + <reference name="logging"> + <interface.cpp header="Logging.h"/> + </reference> + +</componentType> +
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/supplychain.retailer.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/supplychain.retailer.composite new file mode 100644 index 0000000000..51a2b96b1b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.retailer/supplychain.retailer.composite @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + name="supplychain.retailer"> + + <service name="RetailerService"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl#wsdl.interface(RetailerPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Retailer.wsdl#wsdl.endpoint(RetailerService/RetailerPort)"/> + <reference>RetailerProcess/RetailerService</reference> + </service> + + <component name="RetailerProcess"> + <implementation.cpp library="retailer" header="RetailerImpl.h"/> + <reference name="warehouses">warehouses</reference> + <reference name="logging">logging</reference> + </component> + + <reference name="warehouses" multiplicity="0..n"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl#wsdl.interface(WarehouseShipmentsPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl#wsdl.endpoint(WarehouseShipmentsService/WarehouseShipmentsPort)"/> + </reference> + + <reference name="logging"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.interface(LoggingFacilityLogPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.endpoint(LoggingFacilityService/LoggingFacilityPort)"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/Warehouse.wsdl b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/Warehouse.wsdl new file mode 100644 index 0000000000..a007f9957b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/Warehouse.wsdl @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<wsdl:definitions name="Warehouse" + xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" + targetNamespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl" + xmlns:tns="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl" + xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> + + <wsdl:import + namespace="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl" + location="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl" /> + + <wsdl:service name="WarehouseService"> + <wsdl:port name="WarehousePort" + binding="tns:WarehouseSoapBinding"> + <soap:address + location="http://localhost:9090/axis2/services/Warehouse" /> + </wsdl:port> + </wsdl:service> +</wsdl:definitions>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/WarehouseCallbackImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/WarehouseCallbackImpl.componentType new file mode 100644 index 0000000000..fbc1edb462 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/WarehouseCallbackImpl.componentType @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <service name="WarehouseCallbackService"> + <interface.cpp header="WarehouseCallback.h"/> + </service> + + <reference name="logging"> + <interface.cpp header="Logging.h"/> + </reference> + + <property name="warehouseID" type="xs:string"/> + +</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/WarehouseImpl.componentType b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/WarehouseImpl.componentType new file mode 100644 index 0000000000..7f63d3b571 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/WarehouseImpl.componentType @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + + +<componentType xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema"> + + <service name="WarehouseService"> + <interface.cpp header="Warehouse.h"/> + </service> + + <reference name="manufacturer"> + <interface.cpp header="Manufacturer.h"/> + </reference> + + <reference name="logging"> + <interface.cpp header="Logging.h"/> + </reference> + + <property name="warehouseID" type="xs:string"/> + +</componentType>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/supplychain.warehouse.composite b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/supplychain.warehouse.composite new file mode 100644 index 0000000000..e44b964eb4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/SupplyChain/supplychain.warehouse/supplychain.warehouse.composite @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + name="supplychain.warehouse"> + + <service name="WarehouseService"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl#wsdl.interface(WarehouseShipmentsPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/Warehouse.wsdl#wsdl.endpoint(WarehouseService/WarehousePort)"/> + <reference>WarehouseProcess/WarehouseService</reference> + </service> + + <service name="WarehouseCallbackService"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.interface(WarehouseCallbackPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.endpoint(WarehouseCallbackService/WarehouseCallbackPort)"/> + <reference>WarehouseCallbackProcess/WarehouseCallbackService</reference> + </service> + + <property name="warehouseID" type="xs:string"/> + + <component name="WarehouseProcess"> + <implementation.cpp library="warehouse" header="WarehouseImpl.h"/> + <reference name="manufacturer">manufacturer</reference> + <reference name="logging">logging</reference> + <property name="warehouseID" source="$warehouseID"/> + </component> + + <component name="WarehouseCallbackProcess"> + <implementation.cpp library="warehouse" header="WarehouseCallbackImpl.h"/> + <reference name="logging">logging</reference> + <property name="warehouseID" source="$warehouseID"/> + </component> + + <reference name="manufacturer"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.interface(ManufacturerPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-10/Manufacturer.wsdl#wsdl.endpoint(ManufacturerService/ManufacturerPort)"/> + </reference> + + <reference name="logging"> + <interface.wsdl interface="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.interface(LoggingFacilityLogPortType)"/> + <binding.ws endpoint="http://www.ws-i.org/SampleApplications/SupplyChainManagement/2002-08/LoggingFacility.wsdl#wsdl.endpoint(LoggingFacilityService/LoggingFacilityPort)"/> + </reference> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/autogen.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/autogen.sh new file mode 100755 index 0000000000..18277601c8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/autogen.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# 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. + +for i in "libtoolize --force" aclocal autoconf autoheader +do + echo -n "Running $i..." + $i || exit 1 + echo 'done.' +done + +echo -n 'Running automake...' +automake --add-missing +echo 'done.' +exit 0 + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/build.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/build.sh new file mode 100755 index 0000000000..c306d2a20d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/build.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# 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. + +./configure.sh +make install + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/configure.ac b/sca-cpp/branches/cpp-contrib/contrib/samples/configure.ac new file mode 100644 index 0000000000..41cd6f4dbe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/configure.ac @@ -0,0 +1,206 @@ +# 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. + +dnl run autogen.sh to generate the configure script. + +AC_PREREQ(2.59) +AC_INIT(tuscany-sca-samples, 1.0-M3) +AC_CANONICAL_SYSTEM +AM_CONFIG_HEADER(config.h) +AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) +AC_PREFIX_DEFAULT(/usr/local/tuscany/sca/samples) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_LN_S +AC_PROG_MAKE_SET +AC_PROG_LIBTOOL + +# Check for running on Darwin +AC_MSG_CHECKING([Checking if running on Darwin]) +UNAME=`uname -s` +if test "x$UNAME" = "xDarwin"; then + AC_DEFINE([IS_DARWIN], [1], [Set to 1 when running on Darwin - Mac OSX]) + AC_MSG_RESULT(yes) + AC_SUBST([libsuffix],[".dylib"]) + is_darwin=true +else + AC_MSG_RESULT(no) + AC_SUBST([libsuffix],[".so"]) + is_darwin=false +fi +AM_CONDITIONAL([DARWIN], [test x$is_darmin = xtrue]) + +# Checks for libraries. + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([inttypes.h stdlib.h string.h sys/time.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_CONST +AC_C_INLINE + +# Checks for library functions. +AC_FUNC_CLOSEDIR_VOID +AC_FUNC_STAT +AC_FUNC_VPRINTF +AC_CHECK_FUNCS([getcwd putenv strdup]) + +# Configure TUSCANY_SCACPP and TUSCANY_SDOCPP +TUSCANY_SCACPP=`echo "$TUSCANY_SCACPP"` +if test "x$TUSCANY_SCACPP" = "x"; then + SCAPWD=`pwd` + AC_SUBST([TUSCANY_SCACPP], ["$SCAPWD/.."]) +fi + +TUSCANY_SDOCPP=`echo "$TUSCANY_SDOCPP"` +if test "x$TUSCANY_SDOCPP" = "x"; then + SCAPWD=`pwd` + AC_SUBST([TUSCANY_SDOCPP], ["$SCAPWD/../../sdo/deploy"]) +fi + +# Configure LIBXML2_INCLUDE and LIBXML2_LIB +LIBXML2_INCLUDE=`echo "$LIBXML2_INCLUDE"` +if test "x$LIBXML2_INCLUDE" = "x"; then + AC_SUBST([LIBXML2_INCLUDE], ["/usr/include/libxml2"]) +fi + +LIBXML2_LIB=`echo "$LIBXML2_LIB"` +if test "x$LIBXML2_LIB" = "x"; then + AC_SUBST([LIBXML2_LIB], ["/usr/lib"]) +fi + +# Configure GCC C++ compile options +AC_SUBST([CXXFLAGS], ["$(CXXFLAGS) -D_DEBUG -O0 -g3 -Wall -std=c++0x -fmessage-length=0"]) + +AC_MSG_CHECKING(whether to build all samples) +AC_ARG_ENABLE(all-samples, [AS_HELP_STRING([--enable-all-samples],[build all samples [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + want_all_samples=false + ;; + *) + AC_MSG_RESULT(yes) + want_all_samples=true + ;; + esac ], +[ AC_MSG_RESULT(no) + want_all_samples=false ] +) +AM_CONDITIONAL([WANT_ALL_SAMPLES], [test x$want_all_samples = xtrue]) + +AC_MSG_CHECKING(whether to build C++ samples) +AC_ARG_ENABLE(cpp, [AS_HELP_STRING([--enable-cpp],[build C++ samples [default=yes]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + want_cpp_samples=false + ;; + *) + AC_MSG_RESULT(yes) + want_cpp_samples=true + ;; + esac ], +[ AC_MSG_RESULT(yes) + want_cpp_samples=true ] +) +AM_CONDITIONAL([WANT_CPP_SAMPLES], [test x$want_cpp_samples = xtrue]) + +AC_MSG_CHECKING(whether to build Python samples) +AC_ARG_ENABLE(python, [AS_HELP_STRING([--enable-python],[build Python samples [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + want_python_samples=false + ;; + *) + AC_MSG_RESULT(yes) + want_python_samples=true + ;; + esac ], +[ AC_MSG_RESULT(no) + want_python_samples=false ] +) +AM_CONDITIONAL([WANT_PYTHON_SAMPLES], [test x$want_python_samples = xtrue]) + +AC_MSG_CHECKING(whether to build Ruby samples) +AC_ARG_ENABLE(ruby, [AS_HELP_STRING([--enable-ruby],[build Ruby samples [default=no]])], +[ case "${enableval}" in + no) + AC_MSG_RESULT(no) + want_ruby_samples=false + ;; + *) + AC_MSG_RESULT(yes) + want_ruby_samples=true + ;; + esac ], +[ AC_MSG_RESULT(no) + want_ruby_samples=false ] +) +AM_CONDITIONAL([WANT_RUBY_SAMPLES], [test x$want_ruby_samples = xtrue]) + +AC_CONFIG_FILES([Makefile + AlertAggregator/Makefile + AlertAggregator/sample.alerter/Makefile + AlertAggregator/sample.display/Makefile + AlertAggregator/httpserver/Makefile + CppCalculator/Makefile + CppCalculator/sample.calculator/Makefile + CppCalculator/sample.calculator.client/Makefile + RubyCalculator/Makefile + RubyCalculator/sample.calculator/Makefile + RubyCalculator/sample.calculator.client/Makefile + PythonCalculator/Makefile + PythonCalculator/sample.calculator/Makefile + PythonCalculator/sample.calculator.client/Makefile + PythonWeatherForecast/Makefile + PythonWeatherForecast/sample.weather/Makefile + PythonWeatherForecast/sample.weather.client/Makefile + RestCalculator/Makefile + RestCalculator/sample.calculator/Makefile + RestCalculator/sample.calculator.restclient/Makefile + RestCalculator/httpserver/Makefile + RestCustomer/Makefile + RestCustomer/sample.customer/Makefile + RestCustomer/sample.customer.restclient/Makefile + RestCustomer/httpserver/Makefile + RestYahoo/Makefile + RestYahoo/sample.yahoo/Makefile + RestYahoo/sample.yahoo.client/Makefile + CppBigBank/Makefile + CppBigBank/bigbank.account/Makefile + CppBigBank/bigbank.client/Makefile + CppBigBank/bigbank.phpwsclient/Makefile + RubyBigBank/Makefile + RubyBigBank/bigbank.account/Makefile + RubyBigBank/bigbank.client/Makefile + RubyBigBank/bigbank.wsclient/Makefile + HttpdBigBank/Makefile + HttpdBigBank/bigbank.account/Makefile + HttpdBigBank/bigbank.accountdata/Makefile + HttpdBigBank/bigbank.wsclient/Makefile + HttpdBigBank/httpserver/Makefile + ]) +AC_OUTPUT diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/runtest.sh b/sca-cpp/branches/cpp-contrib/contrib/samples/runtest.sh new file mode 100755 index 0000000000..1c016a5287 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/runtest.sh @@ -0,0 +1,159 @@ +#!/bin/sh + +# 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. + + +echo "Running CppCalculator client" +cd $TUSCANY_SCACPP/samples/CppCalculator/deploy/sample.calculator.client +r=`./runclient.sh | grep "div(5,2) = 2.5"` +if [ "x$r" == "x" ] +then + echo "CppCalculator client failed" +fi + +echo "Running CppCalculator wsclient" +cd $TUSCANY_SCACPP/samples/CppCalculator/deploy/sample.calculator +(./runwsserver.sh >/dev/null)& +cd $TUSCANY_SCACPP/samples/CppCalculator/deploy/sample.calculator.wsclient +r=`./runwsclient.sh | grep "Result = 2.500e+00"` +killall -q axis2_http_server >/dev/null +if [ "x$r" == "x" ] +then + echo "CppCalculator wsclient failed" +fi + +echo "Running CppBigBank client" +cd $TUSCANY_SCACPP/samples/CppBigBank/deploy/bigbank.client +r=`./runclient.sh | grep "Balance"` +if [ "x$r" == "x" ] +then + echo "CppBigBank client failed" +fi + +echo "Running CppBigBank wsclient" +cd $TUSCANY_SCACPP/samples/CppBigBank/deploy/bigbank.account +(./runwsserver.sh >/dev/null)& +cd $TUSCANY_SCACPP/samples/CppBigBank/deploy/bigbank.wsclient +r=`./runwsclient.sh | grep "</balance>"` +killall -q axis2_http_server >/dev/null +if [ "x$r" == "x" ] +then + echo "CppBigBank wsclient failed" +fi + +echo "Running RubyCalculator client" +cd $TUSCANY_SCACPP/samples/RubyCalculator/deploy/sample.calculator.client +r=`./runclient.sh | grep "^3"` +if [ "x$r" == "x" ] +then + echo "RubyCalculator client failed" +fi + +echo "Running RubyCalculator wsclient" +cd $TUSCANY_SCACPP/samples/RubyCalculator/deploy/sample.calculator +(./runwsserver.sh >/dev/null)& +cd $TUSCANY_SCACPP/samples/RubyCalculator/deploy/sample.calculator.wsclient +r=`./runwsclient.sh | grep "^3.0"` +killall -q axis2_http_server >/dev/null +if [ "x$r" == "x" ] +then + echo "RubyCalculator wsclient failed" +fi + +echo "Running RubyBigBank client" +cd $TUSCANY_SCACPP/samples/RubyBigBank/deploy/bigbank.client +r=`./runclient.sh | grep "Balance:"` +if [ "x$r" == "x" ] +then + echo "RubyBigBank client failed" +fi + +echo "Running RubyBigBank wsclient" +cd $TUSCANY_SCACPP/samples/RubyBigBank/deploy/bigbank.account +(./runwsserver.sh >/dev/null)& +cd $TUSCANY_SCACPP/samples/RubyBigBank/deploy/bigbank.wsclient +r=`./runwsclient.sh | grep "Balance:"` +killall -q axis2_http_server >/dev/null +if [ "x$r" == "x" ] +then + echo "RubyBigBank wsclient failed" +fi + +echo "Running PythonCalculator client" +cd $TUSCANY_SCACPP/samples/PythonCalculator/deploy/sample.calculator.client +r=`./runclient.sh | grep "div ( 5 , 2 ) = 3.0"` +if [ "x$r" == "x" ] +then + echo "PythonCalculator client failed" +fi + +echo "Running PythonCalculator wsclient" +cd $TUSCANY_SCACPP/samples/PythonCalculator/deploy/sample.calculator +(./runwsserver.sh >/dev/null)& +cd $TUSCANY_SCACPP/samples/PythonCalculator/deploy/sample.calculator.wsclient +r=`./runwsclient.sh | grep "div ( 5 , 2 ) = 3.0"` +killall -q axis2_http_server >/dev/null +if [ "x$r" == "x" ] +then + echo "PythonCalculator wsclient failed" +fi + +echo "Running PythonWeatherForecast client" +cd $TUSCANY_SCACPP/samples/PythonWeatherForecast/deploy/sample.weather.client +r=`./runclient.sh | grep "Latitude: 34.090107"` +if [ "x$r" == "x" ] +then + echo "PythonWeatherForecast client failed" +fi + +echo "Running HttpdBigBank wsclient" +cd $TUSCANY_SCACPP/samples/HttpdBigBank/deploy/httpserver +./startserver.sh >/dev/null +cd $TUSCANY_SCACPP/samples/HttpdBigBank/deploy/bigbank.wsclient +r=`./runwsclient.sh | grep "Balance:"` +cd $TUSCANY_SCACPP/samples/HttpdBigBank/deploy/httpserver +./stopserver.sh >/dev/null +if [ "x$r" == "x" ] +then + echo "HttpdBigBank wsclient failed" +fi + +echo "Running RestCalculator restclient" +cd $TUSCANY_SCACPP/samples/RestCalculator/deploy/httpserver +./startserver.sh >/dev/null +cd $TUSCANY_SCACPP/samples/RestCalculator/deploy/sample.calculator.restclient +r=`./runrestclient.sh | grep "^3"` +cd $TUSCANY_SCACPP/samples/RestCalculator/deploy/httpserver +./stopserver.sh >/dev/null +if [ "x$r" == "x" ] +then + echo "RestCalculator restclient failed" +fi + +echo "Running RestCustomer restclient" +cd $TUSCANY_SCACPP/samples/RestCustomer/deploy/httpserver +./startserver.sh >/dev/null +cd $TUSCANY_SCACPP/samples/RestCustomer/deploy/sample.customer.restclient +r=`./runrestclient.sh | grep "Command - Deleted customer 1234"` +cd $TUSCANY_SCACPP/samples/RestCustomer/deploy/httpserver +./stopserver.sh >/dev/null +if [ "x$r" == "x" ] +then + echo "RestCustomer restclient failed" +fi + diff --git a/sca-cpp/branches/cpp-contrib/contrib/samples/scagen.bat b/sca-cpp/branches/cpp-contrib/contrib/samples/scagen.bat new file mode 100644 index 0000000000..169855a0a9 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/samples/scagen.bat @@ -0,0 +1,37 @@ +@echo off +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. + +rem Will copy the correct files from the source tree for packaging and +rem deployment of the SCA Calculator sample. + +setlocal + +if . == .%1 ( +echo source path not specified +goto usage +) +set srcdir=%1 + +%TUSCANY_SCACPP%\extensions\cpp\bin\scagen.bat -dir %srcdir% -output %srcdir% -verbose + +goto end +:usage +echo Usage: scagen <sample-src> +:end + +endlocal diff --git a/sca-cpp/branches/cpp-contrib/contrib/tools/Makefile.am b/sca-cpp/branches/cpp-contrib/contrib/tools/Makefile.am new file mode 100644 index 0000000000..de5c2d1b1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/tools/Makefile.am @@ -0,0 +1,17 @@ +# 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. + diff --git a/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/TuscanyServiceLoader.cpp b/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/TuscanyServiceLoader.cpp new file mode 100644 index 0000000000..2abdc16c28 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/TuscanyServiceLoader.cpp @@ -0,0 +1,478 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> +#include <string> +#include <sstream> +#include <list> + +#include <tuscany/sca/core/SCARuntime.h> +#include <tuscany/sca/core/Exceptions.h> + +#include <tuscany/sca/model/Composite.h> +#include <tuscany/sca/model/CompositeReference.h> +#include <tuscany/sca/model/CompositeService.h> +#include <tuscany/sca/model/Component.h> +#include <tuscany/sca/model/Binding.h> +#include <tuscany/sca/model/Service.h> +#include <tuscany/sca/model/ServiceType.h> +#include <tuscany/sca/model/WSDLDefinition.h> +#include <tuscany/sca/model/WSDLOperation.h> +#include <tuscany/sca/model/WSDLMessagePart.h> + +#include <commonj/sdo/SDORuntimeException.h> + +#include "TuscanyServiceLoader.h" + +namespace tuscany +{ + namespace sca + { + namespace toys + { + + TuscanyServiceLoader::TuscanyServiceLoader( const std::string &installRoot, + const std::string &systemRoot, + const std::string &systemPath, + const std::string &baseURI, + const std::string &defaultComponent, + bool showModel, // defaults false + bool showWsdl ) : // defaults false + tuscanyRuntime_(0), + tuscanyInstallRoot_(installRoot), + tuscanySystemRoot_(systemRoot), + tuscanySystemPath_(systemPath), + tuscanyBaseURI_(baseURI), + tuscanyDefaultComponent_(defaultComponent), + showModel_(showModel), + showWsdl_(showWsdl) + { + } + + TuscanyServiceLoader::~TuscanyServiceLoader() + { + } + + void TuscanyServiceLoader::load( ) + { + try + { + tuscanyRuntime_ = + tuscany::sca::SCARuntime::initializeSharedRuntime( + tuscanyInstallRoot_, + tuscanySystemRoot_, + tuscanySystemPath_, + tuscanyBaseURI_, + tuscanyDefaultComponent_ ); + + tuscany::sca::model::Composite* systemComposite = tuscanyRuntime_->getSystem(); + + // The system composite shouldnt ever have WSDL namespaces defined on it, + // Its basically a container of included composites + + // + // Iterate through the System included composites + // + std::list<std::string> compositeNameList = systemComposite->getIncludedComposites(); + + if( compositeNameList.empty() ) + { + log( "The SCARuntime system composite has no included composites.", DATA_BOTH ); + } + + std::stringstream logMsg; + + std::list<std::string>::const_iterator cNameIter = compositeNameList.begin(); + std::list<std::string>::const_iterator cNameIterEnd = compositeNameList.end(); + + // Iterate through the Composites included in the System Composite + for( ; cNameIter != cNameIterEnd; ++cNameIter ) + { + tuscany::sca::model::Composite *includedComposite = + systemComposite->findIncludedComposite( *cNameIter ); + + if( 0 == includedComposite ) + { + logMsg << "Skipping NULL System Included composite: " << *cNameIter; + log( logMsg, DATA_BOTH ); + + continue; + } + + logMsg << "System Included composite: " << includedComposite->getName(); + log( logMsg, DATA_BOTH ); + + if( showWsdl_ ) + { + log( "WSDL Data:", DATA_WSDL ); + getOperationsFromComposite( includedComposite ); + } + + if( showModel_ ) + { + log( "MODEL Data:", DATA_WSDL ); + getComponentsFromComposite( includedComposite ); + } + + log( "\nServices loaded correctly.\n", DATA_BOTH ); + } + } + catch (const tuscany::sca::TuscanyRuntimeException &tuscanyE) + { + std::cerr << "Tuscany Runtime Exception: " << tuscanyE.getMessageText() << std::endl; + } + catch (const commonj::sdo::SDORuntimeException &sdoE) + { + std::cerr << "SDO Runtime Exception: " << sdoE.getMessageText() << std::endl; + } + catch (const std::exception &stdE) + { + std::cerr << "Standard Exception: " << stdE.what() << std::endl; + } + } + + // private + void TuscanyServiceLoader::getOperationsFromComposite( tuscany::sca::model::Composite *composite ) + { + std::stringstream logMsg; + + std::list<std::string> namespaceList = composite->getWSDLNamespaces(); + if( namespaceList.empty() ) + { + logMsg << "Composite has no WSDLs to process: " << composite->getName(); + log( logMsg, DATA_WSDL ); + + return; + } + + std::list<std::string>::const_iterator nsIter = namespaceList.begin(); + std::list<std::string>::const_iterator nsIterEnd = namespaceList.end(); + + // Iterate through the composite namespaces + for( ; nsIter != nsIterEnd; ++nsIter ) + { + tuscany::sca::model::WSDLDefinition *wsdlDef = composite->findWSDLDefinition( *nsIter ); + if( 0 == wsdlDef ) + { + logMsg << "Skipping NULL WSDLDefinition for WSDL namespace: " << *nsIter; + log( logMsg, DATA_WSDL ); + + continue; + } + + logMsg << "\t WSDL namespace: " << *nsIter; + log( logMsg, DATA_WSDL ); + + std::list<std::string> ptNameList = wsdlDef->getPortTypes(); + if( ptNameList.empty() ) + { + log( "Skipping WSDLDefinition with no PortTypes defined", DATA_WSDL ); + + continue; + } + + std::list<std::string>::const_iterator ptIter = ptNameList.begin(); + std::list<std::string>::const_iterator ptIterEnd = ptNameList.end(); + + // Iterate through the PortTypes in the WSDLDefinition + for( ; ptIter != ptIterEnd; ++ptIter ) + { + logMsg << "\t\t PortType: " << *ptIter; + log( logMsg, DATA_WSDL ); + + std::list<std::string> operNameList = wsdlDef->getOperations( *ptIter ); + if( operNameList.empty() ) + { + log( "Skipping WSDL PortType with no operations defined", DATA_WSDL ); + + continue; + } + + std::list<std::string>::const_iterator operNameIter = operNameList.begin(); + std::list<std::string>::const_iterator operNameIterEnd = operNameList.end(); + + // Iterate through the Operations in the PortType + for( ; operNameIter != operNameIterEnd; ++operNameIter ) + { + const tuscany::sca::model::WSDLOperation &wsdlOper = + wsdlDef->findOperation( *ptIter, *operNameIter ); + + logMsg + << "\t\t\t Operation Info: " + << "\n\t\t\t\t OperationName: " << wsdlOper.getOperationName() + << "\n\t\t\t\t SOAP Action: " << wsdlOper.getSoapAction() + << "\n\t\t\t\t Endpoint: " << wsdlOper.getEndpoint() + << "\n\t\t\t\t SOAP version: " << wsdlOper.getSoapVersion() + << "\n\t\t\t\t Document Style: " << wsdlOper.isDocumentStyle() + << "\n\t\t\t\t Wrapped Style: " << wsdlOper.isWrappedStyle() + << "\n\t\t\t\t In Encoded Style: " << wsdlOper.isInputEncoded() + << "\n\t\t\t\t Out Encoded Style: " << wsdlOper.isOutputEncoded() + << "\n\t\t\t\t InputMsgURI: " << wsdlOper.getInputMessageUri() + << "\n\t\t\t\t InputMsgName: " << wsdlOper.getInputMessageName() + << "\n\t\t\t\t OutputMsgURI: " << wsdlOper.getOutputMessageUri() + << "\n\t\t\t\t OutputMsgName: " << wsdlOper.getOutputMessageName(); + log( logMsg, DATA_WSDL ); + + std::list<std::string> partList = wsdlOper.getInputMessagePartNames(); + std::list<std::string>::const_iterator partListIter = partList.begin(); + std::list<std::string>::const_iterator partListIterEnd = partList.end(); + for( ; partListIter != partListIterEnd; ++partListIter ) + { + tuscany::sca::model::WSDLMessagePart part = + wsdlOper.getInputMessagePart( *partListIter ); + logMsg + << "\t\t\t\t Input Message Part: " + << "\n\t\t\t\t\t Name: " << part.getPartName() + << "\n\t\t\t\t\t Type: " << part.getPartType() + << "\n\t\t\t\t\t URI: " << part.getPartUri(); + log( logMsg, DATA_WSDL ); + } + + partList = wsdlOper.getOutputMessagePartNames(); + partListIter = partList.begin(); + partListIterEnd = partList.end(); + for( ; partListIter != partListIterEnd; ++partListIter ) + { + tuscany::sca::model::WSDLMessagePart part = + wsdlOper.getOutputMessagePart( *partListIter ); + logMsg + << "\t\t\t\t Output Message Part: " + << "\n\t\t\t\t\t Name: " << part.getPartName() + << "\n\t\t\t\t\t Type: " << part.getPartType() + << "\n\t\t\t\t\t URI: " << part.getPartUri(); + log( logMsg, DATA_WSDL ); + } + } + } + } + } + + // private + void TuscanyServiceLoader::getComponentsFromComposite( tuscany::sca::model::Composite *composite ) + { + std::stringstream logMsg; + + std::list<std::string> topLevelComponentList = composite->getComponents(); + if( topLevelComponentList.empty() ) + { + logMsg << "Top level Composite has no Components to process: " << composite->getName(); + log( logMsg, DATA_MODEL ); + + return; + } + + std::list<std::string>::const_iterator tlclIter = topLevelComponentList.begin(); + std::list<std::string>::const_iterator tlclIterEnd = topLevelComponentList.end(); + + // Iterate through the top level composite components + for( ; tlclIter != tlclIterEnd; ++tlclIter ) + { + tuscany::sca::model::Component *topLevelComponent = composite->findComponent( *tlclIter ); + if( 0 == topLevelComponent ) + { + logMsg << "Skipping NULL Component: " << *tlclIter; + log( logMsg, DATA_MODEL ); + + continue; + } + + logMsg << "\t Top Level Component: " << topLevelComponent->getName(); + log( logMsg, DATA_MODEL ); + + // Top level composites will just include lower composites + // Get the actual implementation composite + tuscany::sca::model::Composite *impComposite = + (tuscany::sca::model::Composite*)topLevelComponent->getType(); + if( 0 == impComposite ) + { + logMsg << "Couldn't get implemetation composite for top level component: " << *tlclIter; + log( logMsg, DATA_MODEL ); + + continue; + } + + logMsg << "\t\t Implemetation Composite: " << topLevelComponent->getName(); + log( logMsg, DATA_MODEL ); + + std::list<std::string> componentList = impComposite->getComponents(); + if( componentList.empty() ) + { + log( "\t\t Implemetation Composite has no components", DATA_MODEL ); + + continue; + } + + std::list<std::string>::const_iterator clIter = componentList.begin(); + std::list<std::string>::const_iterator clIterEnd = componentList.end(); + + // Iterate through the components + for( ; clIter != clIterEnd; ++clIter ) + { + + tuscany::sca::model::Component *component = impComposite->findComponent( *clIter ); + if( 0 == component ) + { + logMsg << "Skipping NULL Component: " << *clIter; + log( logMsg, DATA_MODEL ); + + continue; + } + + std::string bindingType; + std::string bindingURI; + std::string componentType = "\t\t\t Component: "; + + tuscany::sca::model::CompositeService *compositeService = + dynamic_cast<tuscany::sca::model::CompositeService*>(component); + if (compositeService) + { + componentType = "\t\t\t Service: "; + tuscany::sca::model::Reference *reference = compositeService->getReference(); + bindingType = reference->getBinding()->getType(); + bindingURI = reference->getBinding()->getURI(); + } + else + { + tuscany::sca::model::CompositeReference *compositeReference = + dynamic_cast<tuscany::sca::model::CompositeReference*>(component); + if (compositeReference) + { + componentType = "\t\t\t Reference: "; + tuscany::sca::model::Service *service = compositeReference->getService(); + bindingType = service->getBinding()->getType(); + bindingURI = service->getBinding()->getURI(); + + } + } + + logMsg << componentType << component->getName(); + log( logMsg, DATA_MODEL ); + logMsg << "\t\t\t\t Component Type: " << component->getType()->getName(); + log( logMsg, DATA_MODEL ); + + if (!bindingType.empty()) + { + logMsg << "\t\t\t\t Binding Type: " << bindingType; + log( logMsg, DATA_MODEL ); + } + if (!bindingURI.empty()) + { + logMsg << "\t\t\t\t Binding URI: " << bindingURI; + log( logMsg, DATA_MODEL ); + } + + const tuscany::sca::model::Component::SERVICE_MAP &serviceMap = component->getServices(); + if( serviceMap.empty() ) + { + + continue; + } + + tuscany::sca::model::Component::SERVICE_MAP::const_iterator smIter = serviceMap.begin(); + tuscany::sca::model::Component::SERVICE_MAP::const_iterator smIterEnd = serviceMap.end(); + + for( ; smIter != smIterEnd; ++smIter ) + { + const tuscany::sca::model::Service *service = smIter->second; + + if( 0 == service ) + { + logMsg << "Skipping NULL Service: " << smIter->second; + log( logMsg, DATA_MODEL ); + + continue; + } + + // A ServiceType defines the characteristics of the Service + tuscany::sca::model::ServiceType *serviceType = service->getType(); + logMsg << "\t\t\t\t Service: " << serviceType->getName(); + log( logMsg, DATA_MODEL ); + } + + const tuscany::sca::model::Component::REFERENCE_MAP &referenceMap = component->getReferences(); + if( referenceMap.empty() ) + { + continue; + } + + tuscany::sca::model::Component::REFERENCE_MAP::const_iterator rmIter = referenceMap.begin(); + tuscany::sca::model::Component::REFERENCE_MAP::const_iterator rmIterEnd = referenceMap.end(); + + for( ; rmIter != rmIterEnd; ++rmIter ) + { + const tuscany::sca::model::Reference *reference = rmIter->second; + + if( 0 == reference ) + { + logMsg << "Skipping NULL Reference: " << rmIter->second; + log( logMsg, DATA_MODEL ); + + continue; + } + + // A ReferenceType defines the characteristics of the Service + logMsg << "\t\t\t\t Reference: " << reference->getType()->getName(); + log( logMsg, DATA_MODEL ); + + } + } + } + } + + // private + void TuscanyServiceLoader::log( std::stringstream &msg, TuscanyServiceLoader::DataType type ) + { + log( msg.str(), type ); + msg.str( "" ); // clear it to be able to use the same one again + } + + // private + void TuscanyServiceLoader::log( const std::string &msg, TuscanyServiceLoader::DataType type ) + { + bool doLog = false; + + if( type == DATA_BOTH ) + { + doLog = true; + } + else if( type == DATA_BOTH && (showModel_ || showWsdl_) ) + { + doLog = true; + } + else if( type == DATA_WSDL && showWsdl_ ) + { + doLog = true; + } + else if( type == DATA_MODEL && showModel_ ) + { + doLog = true; + } + + if( doLog ) + { + std::cout << msg << std::endl; + } + + } + + } // namespace toys + } // namespace sca +} // namespace tuscany diff --git a/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/TuscanyServiceLoader.h b/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/TuscanyServiceLoader.h new file mode 100644 index 0000000000..de35c38119 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/TuscanyServiceLoader.h @@ -0,0 +1,86 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sca_toys_service_loader_h +#define tuscany_sca_toys_service_loader_h + +#include <string> +#include <sstream> + +#include <tuscany/sca/core/SCARuntime.h> +#include <tuscany/sca/model/Composite.h> + + +namespace tuscany +{ + namespace sca + { + namespace toys + { + class TuscanyServiceLoader + { + public: + TuscanyServiceLoader( const std::string &installRoot, + const std::string &systemRoot, + const std::string &systemPath, + const std::string &baseURI, + const std::string &defaultComponentName, + bool showModel = false, + bool showWsdl = false ); + + ~TuscanyServiceLoader(); + + void load(); + + private: + enum DataType + { + DATA_WSDL = 0, + DATA_MODEL, + DATA_BOTH + }; + + TuscanyServiceLoader(); + + void log( std::stringstream &msg, TuscanyServiceLoader::DataType type ); + void log( const std::string &msg, TuscanyServiceLoader::DataType type ); + void getOperationsFromComposite( tuscany::sca::model::Composite *composite ); + void getComponentsFromComposite( tuscany::sca::model::Composite *composite ); + + tuscany::sca::SCARuntime *tuscanyRuntime_; + + bool showModel_; + bool showWsdl_; + std::string tuscanyInstallRoot_; + std::string tuscanySystemRoot_; + std::string tuscanySystemPath_; + std::string tuscanyBaseURI_; + std::string tuscanyDefaultComponent_; + }; + + } // namespace toys + + } // namespace sca + +} // namespace tuscany + +#endif // tuscany_sca_toys_service_loader_h + diff --git a/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/main.cpp b/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/main.cpp new file mode 100644 index 0000000000..7fdde27177 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/contrib/tools/TuscanyDriver/main.cpp @@ -0,0 +1,181 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#include <iostream> +#include <string> + +#include <tuscany/sca/core/Exceptions.h> +#include <commonj/sdo/SDORuntimeException.h> + +#include "TuscanyServiceLoader.h" + +struct InputArgs +{ + std::string installRoot_; + std::string systemRoot_; + std::string systemPath_; + std::string baseURI_; + std::string defaultComponentName_; + bool showWsdl_; + bool showModel_; + + InputArgs() : + showWsdl_(false), + showModel_(false) + {} +}; + +const std::string ARG_INSTALL_ROOT = "-ir"; +const std::string ARG_SYSTEM_ROOT = "-sr"; +const std::string ARG_SYSTEM_PATH = "-sp"; +const std::string ARG_BASE_URI = "-uri"; +const std::string ARG_DEFAULT_COMPONENT = "-dc"; +const std::string ARG_VERBOSE = "-v"; +const std::string ARG_SHOW_MODEL = "-model"; +const std::string ARG_SHOW_WSDL = "-wsdl"; +const std::string ARG_HELP_H = "-h"; +const std::string ARG_HELP_HELP = "-help"; +const std::string ARG_HELP_QMARK = "-?"; + + +void +printUsage() +{ + std::cout + << "\nUsage\ntuscanyDriver\n\t" + << ARG_INSTALL_ROOT << " Mandatory: Installation root where extensions are located: ${TUSCANY_SCACPP}\n\t" + << ARG_SYSTEM_ROOT << " Mandatory: System root where projects are located: ${TUSCANY_SCACPP}/samples\n\t" + << ARG_SYSTEM_PATH << " Optional: System path\n\t" + << ARG_BASE_URI << " Optional: Base URI\n\t" + << ARG_DEFAULT_COMPONENT << " Optional: Default Component name\n\t" + << ARG_SHOW_MODEL << " Optional: Display SCA Model Hierarchy\n\t" + << ARG_SHOW_WSDL << " Optional: Display WSDL information\n\t" + << ARG_VERBOSE << " Optional: Same as specifying both: " + << ARG_SHOW_MODEL << " and " << ARG_SHOW_WSDL + << std::endl; +} + +bool +parseArgs( int argc, char *argv[], InputArgs &input ) +{ + if( argc < 5 ) + { + std::cerr << "\nInvalid number of input arguments: " << argc << std::endl; + printUsage(); + return false; + } + + for( int i = 1; i < argc; i++ ) + { + if( argv[i] == ARG_INSTALL_ROOT ) + { + input.installRoot_ = argv[++i]; + } + else if( argv[i] == ARG_SYSTEM_ROOT ) + { + input.systemRoot_ = argv[++i]; + } + else if( argv[i] == ARG_SYSTEM_PATH ) + { + input.systemPath_ = argv[++i]; + } + else if( argv[i] == ARG_BASE_URI ) + { + input.baseURI_ = argv[++i]; + } + else if( argv[i] == ARG_DEFAULT_COMPONENT ) + { + input.defaultComponentName_ = argv[++i]; + } + else if( argv[i] == ARG_VERBOSE ) + { + input.showWsdl_ = true; + input.showModel_ = true; + } + else if( argv[i] == ARG_SHOW_MODEL ) + { + input.showModel_ = true; + } + else if( argv[i] == ARG_SHOW_WSDL ) + { + input.showWsdl_ = true; + } + else if( argv[i] == ARG_HELP_H || + argv[i] == ARG_HELP_QMARK || + argv[i] == ARG_HELP_HELP ) + { + printUsage(); + return false; + } + else + { + std::cerr << "\nUnrecognized argument: " << argv[i]; + printUsage(); + return false; + } + } + + if( input.installRoot_.empty() ) + { + std::cerr << "\nMissing mandatory argument: Install root " << ARG_INSTALL_ROOT << std::endl; + return false; + } + + if( input.systemRoot_.empty() ) + { + std::cerr << "\nMissing mandatory argument: System root " << ARG_SYSTEM_ROOT << std::endl; + return false; + } + + return true; +} + +int +main(int argc, char* argv[]) +{ + try + { + InputArgs input; + if( ! parseArgs( argc, argv, input ) ) + { + return 1; + } + + tuscany::sca::toys::TuscanyServiceLoader + tuscany( input.installRoot_, + input.systemRoot_, + input.systemPath_, + input.baseURI_, + input.defaultComponentName_, + input.showModel_, + input.showWsdl_ ); + + tuscany.load( ); + } + catch (...) + { + std::cerr << "Caught unknown exception." << std::endl; + return 1; + } + + return 0; +} + diff --git a/sca-cpp/branches/cpp-contrib/doc/Doxyfile.in b/sca-cpp/branches/cpp-contrib/doc/Doxyfile.in new file mode 100644 index 0000000000..ba02d58a2a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/doc/Doxyfile.in @@ -0,0 +1,1541 @@ +# 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. + +# Doxyfile 1.6.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = tuscany-sca + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 1.0-M3 + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = YES + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = YES + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = ../kernel \ + ../modules + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = doxygen + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP) +# there is already a search function so this one should typically +# be disabled. + +SEARCHENGINE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/sca-cpp/branches/cpp-contrib/doc/Makefile.am b/sca-cpp/branches/cpp-contrib/doc/Makefile.am new file mode 100644 index 0000000000..c5f29b0d6b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/doc/Makefile.am @@ -0,0 +1,30 @@ +# 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. + +if WANT_DOXYGEN + +BUILT_SOURCES = doxygen/index.html + +doxygen/index.html: Doxyfile + doxygen + +endif + +datadir=$(prefix)/doc + +clean: + rm -rf doxygen diff --git a/sca-cpp/branches/cpp-contrib/etc/git-exclude b/sca-cpp/branches/cpp-contrib/etc/git-exclude new file mode 100644 index 0000000000..8aa4146c56 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/etc/git-exclude @@ -0,0 +1,90 @@ +# git-ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ + +# Generic ignores +target/ +work/ +tmp/ +build/ +*_build +.project +.cproject +.classpath +*.log +junit*.properties +surefire*.properties +.settings/ +.deployables/ +.wtpmodules/ +.pydevproject +.svn/ +.cvs/ +.dotest/ +*.la +*.lo +*.o +*.in +Makefile +.deps/ +.libs/ +m4/ +*.m4 +config.guess +config.sub +config.status +depcomp +install-sh +ltmain.sh +missing +stamp-h1 +autom4te.cache/ +deploy/ +libtool +configure +config.h +Doxyfile +*.tar +*.tar.gz +*-bin/ +*-src/ +*_Proxy.cpp +*_Proxy.h +*_Wrapper.cpp +*_Wrapper.h +gmon.out +*~ +tags +doxygen +*.pyc +*.class +*.stamp +*.jar +*.prefix + +# Specific ignores +kernel-test +string-test +mem-test +xml-test +xsd-test +atom-test +eval-test +eval-shell +json-test +cache-test +client-test +mcache-test +curl-test +scdl-test +java-test +java-shell +script-test +axiom-test +axis2-test +qpid-test +xmpp-test + diff --git a/sca-cpp/branches/cpp-contrib/etc/httpd-ipcrm b/sca-cpp/branches/cpp-contrib/etc/httpd-ipcrm new file mode 100755 index 0000000000..b457e7385f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/etc/httpd-ipcrm @@ -0,0 +1,23 @@ +#!/bin/sh + +# 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. + +# Remove ipcs created by httpd + +ipcs -s | grep 0x | awk '{ print $2 }' | xargs -i -t ipcrm -s {} + diff --git a/sca-cpp/branches/cpp-contrib/etc/memgrind b/sca-cpp/branches/cpp-contrib/etc/memgrind new file mode 100755 index 0000000000..1a220cd5d2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/etc/memgrind @@ -0,0 +1,23 @@ +#!/bin/sh + +# 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. + +# Run valgrind to analyze memory usage and track memory leaks + +valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes $* 2>&1 | tee memgrind.log + diff --git a/sca-cpp/branches/cpp-contrib/etc/svn-config b/sca-cpp/branches/cpp-contrib/etc/svn-config new file mode 100644 index 0000000000..4f8cb41685 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/etc/svn-config @@ -0,0 +1,136 @@ +### This file configures various client-side behaviors. +### +### The commented-out examples below are intended to demonstrate +### how to use this file. + +### Section for authentication and authorization customizations. +[auth] +### Set store-passwords to 'no' to avoid storing passwords in the +### auth/ area of your config directory. It defaults to 'yes'. +### Note that this option only prevents saving of *new* passwords; +### it doesn't invalidate existing passwords. (To do that, remove +### the cache files by hand as described in the Subversion book.) +# store-passwords = no +### Set store-auth-creds to 'no' to avoid storing any subversion +### credentials in the auth/ area of your config directory. +### It defaults to 'yes'. Note that this option only prevents +### saving of *new* credentials; it doesn't invalidate existing +### caches. (To do that, remove the cache files by hand.) +# store-auth-creds = no + +### Section for configuring external helper applications. +[helpers] +### Set editor to the command used to invoke your text editor. +### This will override the environment variables that Subversion +### examines by default to find this information ($EDITOR, +### et al). +# editor-cmd = editor (vi, emacs, notepad, etc.) +### Set diff-cmd to the absolute path of your 'diff' program. +### This will override the compile-time default, which is to use +### Subversion's internal diff implementation. +# diff-cmd = diff_program (diff, gdiff, etc.) +### Set diff3-cmd to the absolute path of your 'diff3' program. +### This will override the compile-time default, which is to use +### Subversion's internal diff3 implementation. +# diff3-cmd = diff3_program (diff3, gdiff3, etc.) +### Set diff3-has-program-arg to 'true' or 'yes' if your 'diff3' +### program accepts the '--diff-program' option. +# diff3-has-program-arg = [true | false] + +### Section for configuring tunnel agents. +[tunnels] +### Configure svn protocol tunnel schemes here. By default, only +### the 'ssh' scheme is defined. You can define other schemes to +### be used with 'svn+scheme://hostname/path' URLs. A scheme +### definition is simply a command, optionally prefixed by an +### environment variable name which can override the command if it +### is defined. The command (or environment variable) may contain +### arguments, using standard shell quoting for arguments with +### spaces. The command will be invoked as: +### <command> <hostname> svnserve -t +### (If the URL includes a username, then the hostname will be +### passed to the tunnel agent as <user>@<hostname>.) If the +### built-in ssh scheme were not predefined, it could be defined +### as: +# ssh = $SVN_SSH ssh +### If you wanted to define a new 'rsh' scheme, to be used with +### 'svn+rsh:' URLs, you could do so as follows: +# rsh = rsh +### Or, if you wanted to specify a full path and arguments: +# rsh = /path/to/rsh -l myusername +### On Windows, if you are specifying a full path to a command, +### use a forward slash (/) or a paired backslash (\\) as the +### path separator. A single backslash will be treated as an +### escape for the following character. + +### Section for configuring miscelleneous Subversion options. +[miscellany] +### Set global-ignores to a set of whitespace-delimited globs +### which Subversion will ignore in its 'status' output. +# global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store +### Set log-encoding to the default encoding for log messages +# log-encoding = latin1 +### Set use-commit-times to make checkout/update/switch/revert +### put last-committed timestamps on every file touched. +# use-commit-times = yes +### Set no-unlock to prevent 'svn commit' from automatically +### releasing locks on files. +# no-unlock = yes +### Set enable-auto-props to 'yes' to enable automatic properties +### for 'svn add' and 'svn import', it defaults to 'no'. +### Automatic properties are defined in the section 'auto-props'. +enable-auto-props = yes + +### Section for configuring automatic properties. +[auto-props] +### The format of the entries is: +### file-name-pattern = propname[=value][;propname[=value]...] +### The file-name-pattern can contain wildcards (such as '*' and +### '?'). All entries which match will be applied to the file. +### Note that auto-props functionality must be enabled, which +### is typically done by setting the 'enable-auto-props' option. +# *.c = svn:eol-style=native +# *.cpp = svn:eol-style=native +# *.h = svn:eol-style=native +# *.dsp = svn:eol-style=CRLF +# *.dsw = svn:eol-style=CRLF +# *.sh = svn:eol-style=native;svn:executable +# *.txt = svn:eol-style=native +# *.png = svn:mime-type=image/png +# *.jpg = svn:mime-type=image/jpeg +# Makefile = svn:eol-style=native + +*.c = svn:eol-style=native;svn:keywords=Rev Date +*.cpp = svn:eol-style=native;svn:keywords=Rev Date +*.h = svn:eol-style=native;svn:keywords=Rev Date +*.dsp = svn:eol-style=CRLF +*.dsw = svn:eol-style=CRLF +*.sh = svn:eol-style=native;svn:executable;svn:keywords=Rev Date +*.bat = svn:eol-style=native;svn:keywords=Rev Date +*.txt = svn:eol-style=native;svn:keywords=Rev Date +*.png = svn:mime-type=image/png +*.jpg = svn:mime-type=image/jpeg +*.am = svn:eol-style=native;svn:keywords=Rev Date +*.ac = svn:eol-style=native;svn:keywords=Rev Date +*.xml = svn:eol-style=native;svn:keywords=Rev Date +*.xsd = svn:eol-style=native;svn:keywords=Rev Date +*.html = svn:eol-style=native;svn:keywords=Rev Date +*.wsdl = svn:eol-style=native;svn:keywords=Rev Date +*.xsd = svn:eol-style=native;svn:keywords=Rev Date +*.composite = svn:eol-style=native;svn:keywords=Rev Date +*.componentType = svn:eol-style=native;svn:keywords=Rev Date +*.rb = svn:eol-style=native;svn:keywords=Rev Date +*.py = svn:eol-style=native;svn:keywords=Rev Date +*.php = svn:eol-style=native;svn:keywords=Rev Date +*.js = svn:eol-style=native;svn:keywords=Rev Date +*.java = svn:eol-style=native;svn:keywords=Rev Date +*.properties = svn:eol-style=native;svn:keywords=Rev Date +*.jelly = svn:eol-style=native;svn:keywords=Rev Date +*.ipr = svn:eol-style=native +*.iml = svn:eol-style=native +*.project = svn:eol-style=native +*.classpath = svn:eol-style=native +README = svn:eol-style=native;svn:keywords=Rev Date +LICENSE = svn:eol-style=native +NOTICE = svn:eol-style=native + diff --git a/sca-cpp/branches/cpp-contrib/etc/svn-ignore b/sca-cpp/branches/cpp-contrib/etc/svn-ignore new file mode 100644 index 0000000000..ce6760b1fa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/etc/svn-ignore @@ -0,0 +1,52 @@ +configure +Makefile.in +depcomp +config.guess +config.h +config.sub +ltmain.sh +Makefile +config.status +stamp-h1 +config.h.in +libtool +autom4te.cache +missing +aclocal.m4 +install-sh +.deps +*.dat +.libs +tmp +build +.project +.cdtproject +.settings +*_Proxy.cpp +*_Proxy.h +*_Wrapper.cpp +*_Wrapper.h +.pydevproject +*.lib +*.dll +*.exe +*.suo +*.ncb +*.user +*.pdb +Debug +Release +gmon.out +m4 +*.tar.gz +*.pyc +*.log +*-bin +*-src +Doxyfile +*~ +tags +doxygen +*.stamp +*.class +*.jar diff --git a/sca-cpp/branches/cpp-contrib/kernel/Makefile.am b/sca-cpp/branches/cpp-contrib/kernel/Makefile.am new file mode 100644 index 0000000000..cfacbb3662 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/Makefile.am @@ -0,0 +1,42 @@ +# 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. + +noinst_PROGRAMS = string-test kernel-test mem-test parallel-test xml-test xsd-test + +testdir=$(prefix)/test +test_LTLIBRARIES = libdynlib-test.la + +includedir = $(prefix)/include/kernel +include_HEADERS = *.hpp + +string_test_SOURCES = string-test.cpp + +libdynlib_test_la_SOURCES = dynlib-test.cpp + +kernel_test_SOURCES = kernel-test.cpp + +mem_test_SOURCES = mem-test.cpp + +parallel_test_SOURCES = parallel-test.cpp + +xml_test_SOURCES = xml-test.cpp +xml_test_LDFLAGS = -lxml2 + +xsd_test_SOURCES = xsd-test.cpp +xsd_test_LDFLAGS = -lxml2 + +TESTS = string-test kernel-test mem-test parallel-test xml-test diff --git a/sca-cpp/branches/cpp-contrib/kernel/config.hpp b/sca-cpp/branches/cpp-contrib/kernel/config.hpp new file mode 100644 index 0000000000..195612428e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/config.hpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_config_hpp +#define tuscany_config_hpp + +#include "ap_config.h" +#undef PACKAGE_BUGREPORT +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_VERSION + +#include "../config.h" + +/** + * Platform configuration and debug functions. + */ + +namespace tuscany +{ + +#ifdef WANT_MAINTAINER_MODE + +/** + * Add string watch members to important classes to help watch them in a debugger. + */ +#define WANT_MAINTAINER_WATCH + +/** + * Increment / decrement a debug counter. + */ +bool debug_inc(long int& c) { + c++; + return true; +} + +bool debug_dec(long int& c) { + c--; + return true; +} + +#else + +#define debug_inc(c) +#define debug_dec(c) + +#endif + +/** + * Attribute used to mark unused parameters. + */ +#ifndef unused +#define unused __attribute__ ((unused)) +#endif + +} +#endif /* tuscany_config_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/dynlib-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/dynlib-test.cpp new file mode 100644 index 0000000000..419fa29db5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/dynlib-test.cpp @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test library. + */ + +#include "function.hpp" + +namespace tuscany { +namespace test { + + const int cppsquare(int x) { + return x * x; + } + +} +} + +extern "C" { + + const int csquare(const int x) { + return tuscany::test::cppsquare(x); + } + + const tuscany::lambda<int(const int)> csquarel() { + return tuscany::lambda<int(const int)>(tuscany::test::cppsquare); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/kernel/dynlib.hpp b/sca-cpp/branches/cpp-contrib/kernel/dynlib.hpp new file mode 100644 index 0000000000..9f55dc4a49 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/dynlib.hpp @@ -0,0 +1,91 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_dlib_hpp +#define tuscany_dlib_hpp + +/** + * Simple dynamic library access functions. + */ + +#include <dlfcn.h> + +#include "function.hpp" +#include "gc.hpp" +#include "monad.hpp" + +namespace tuscany { + +/** + * OS specific dynamic library file extension. + */ +#ifdef IS_DARWIN +const string dynlibExt(".dylib"); +#else +const string dynlibExt(".so"); +#endif + +/** + * Represents a reference to a dynamic library. + */ +class lib { +public: + lib() : h(NULL), owner(false) { + } + + lib(const string& name) : name(name), h(dlopen(c_str(name), RTLD_NOW)), owner(true) { + if (h == NULL) + h = mkfailure<void*>(string("Could not load library: ") + name + ": " + dlerror()); + } + + lib(const lib& l) : name(l.name), h(l.h), owner(false) { + } + + ~lib() { + if (!owner) + return; + if (!hasContent(h) || content(h) == NULL) + return; + dlclose(content(h)); + } + +private: + template<typename S> friend const failable<lambda<S> > dynlambda(const string& name, const lib& l); + + const string name; + failable<void*> h; + bool owner; +}; + +/** + * Find a lambda function in a dynamic library. + */ +template<typename S> const failable<lambda<S> > dynlambda(const string& name, const lib& l) { + if (!hasContent(l.h)) + return mkfailure<lambda<S> >(reason(l.h)); + const void* s = dlsym(content(l.h), c_str(name)); + if (s == NULL) + return mkfailure<lambda<S> >(string("Could not load symbol: ") + name); + return lambda<S>((S*)s); +} + +} +#endif /* tuscany_dlib_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/element.hpp b/sca-cpp/branches/cpp-contrib/kernel/element.hpp new file mode 100644 index 0000000000..c6aa2c44eb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/element.hpp @@ -0,0 +1,304 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_element_hpp +#define tuscany_element_hpp + +/** + * Functions to help represent data as lists of elements and attributes. + */ + +#include "list.hpp" +#include "value.hpp" + +namespace tuscany +{ + +/** + * Tags used to tag lists of elements and attributes. + */ +const value attribute("attribute"); +const value element("element"); +const string atsign("@"); + +/** + * Returns true if a value is an element. + */ +bool isElement(const value& v) { + if (!isList(v) || isNil(v) || element != car<value>(v)) + return false; + return true; +} + +/** + * Returns true if a value is an attribute. + */ +bool isAttribute(const value& v) { + if (!isList(v) || isNil(v) || attribute != car<value>(v)) + return false; + return true; +} + +/** + * Returns the name of an attribute. + */ +const value attributeName(const list<value>& l) { + return cadr(l); +} + +/** + * Returns the value of an attribute. + */ +const value attributeValue(const list<value>& l) { + return caddr(l); +} + +/** + * Returns the name of an element. + */ +const value elementName(const list<value>& l) { + return cadr(l); +} + +/** + * Returns true if an element has children. + */ +const bool elementHasChildren(const list<value>& l) { + return !isNil(cddr(l)); +} + +/** + * Returns the children of an element. + */ +const list<value> elementChildren(const list<value>& l) { + return cddr(l); +} + +/** + * Returns true if an element has a value. + */ +const value elementHasValue(const list<value>& l) { + const list<value> r = reverse(l); + if (isSymbol(car(r))) + return false; + if(isList(car(r)) && !isNil((list<value>)car(r)) && isSymbol(car<value>(car(r)))) + return false; + return true; +} + +/** + * Returns the value of an element. + */ +const value elementValue(const list<value>& l) { + return car(reverse(l)); +} + +/** + * Convert an element to a value. + */ +const bool elementToValueIsList(const value& v) { + if (!isList(v)) + return false; + const list<value> l = v; + return (isNil(l) || !isSymbol(car(l))); +} + +const value elementToValue(const value& t) { + const list<value> elementsToValues(const list<value>& e); + + // Convert an attribute + if (isTaggedList(t, attribute)) + return mklist<value>(c_str(atsign + attributeName(t)), attributeValue(t)); + + // Convert an element + if (isTaggedList(t, element)) { + + // Convert an element's value + if (elementHasValue(t)) { + + // Convert a single value + if (!elementToValueIsList(elementValue(t))) + return mklist(elementName(t), elementValue(t)); + + // Convert a list value + return cons(elementName(t), mklist<value>(elementsToValues(elementValue(t)))); + } + + // Convert an element's children + return cons(elementName(t), elementsToValues(elementChildren(t))); + } + + // Convert a value + if (!isList(t)) + return t; + return elementsToValues(t); +} + +/** + * Convert a list of elements to a list of values. + */ +const bool elementToValueIsSymbol(const value& v) { + if (!isList(v)) + return false; + const list<value> l = v; + if (isNil(l)) + return false; + if (!isSymbol(car(l))) + return false; + return true; +} + +const list<value> elementToValueGroupValues(const value& v, const list<value>& l) { + if (isNil(l) || !elementToValueIsSymbol(v) || !elementToValueIsSymbol(car(l))) + return cons(v, l); + if (car<value>(car(l)) != car<value>(v)) + return cons(v, l); + if (!elementToValueIsList(cadr<value>(car(l)))) { + const value g = mklist<value>(car<value>(v), mklist<value>(cdr<value>(v), cdr<value>(car(l)))); + return elementToValueGroupValues(g, cdr(l)); + } + const value g = mklist<value>(car<value>(v), cons<value>(cdr<value>(v), (list<value>)cadr<value>(car(l)))); + return elementToValueGroupValues(g, cdr(l)); + +} + +const list<value> elementsToValues(const list<value>& e) { + if (isNil(e)) + return e; + return elementToValueGroupValues(elementToValue(car(e)), elementsToValues(cdr(e))); +} + +/** + * Convert a value to an element. + */ +const value valueToElement(const value& t) { + const list<value> valuesToElements(const list<value>& l); + + // Convert a name value pair + if (isList(t) && !isNil((list<value>)t) && isSymbol(car<value>(t))) { + const value n = car<value>(t); + const value v = cadr<value>(t); + + // Convert a single value to an attribute or an element + if (!isList(v)) { + if (substr(n, 0, 1) == atsign) + return mklist<value>(attribute, substr(n, 1), v); + return mklist(element, n, v); + } + + // Convert a list value + if (isNil((list<value>)v) || !isSymbol(car<value>(v))) + return cons(element, cons(n, mklist<value>(valuesToElements(v)))); + + // Convert a nested name value pair value + return cons(element, cons(n, valuesToElements(cdr<value>(t)))); + } + + // Convert a value + if (!isList(t)) + return t; + return valuesToElements(t); +} + +/** + * Convert a list of values to a list of elements. + */ +const list<value> valuesToElements(const list<value>& l) { + if (isNil(l)) + return l; + return cons<value>(valueToElement(car(l)), valuesToElements(cdr(l))); +} + +/** + * Returns a selector lambda function which can be used to filter + * elements against the given element pattern. + */ +struct selectorLambda { + const list<value> select; + selectorLambda(const list<value>& s) : select(s) { + } + const bool evalSelect(const list<value>& s, const list<value> v) const { + if (isNil(s)) + return true; + if (isNil(v)) + return false; + if (car(s) != car(v)) + return false; + return evalSelect(cdr(s), cdr(v)); + } + const bool operator()(const value& v) const { + if (!isList(v)) + return false; + return evalSelect(select, v); + } +}; + +const lambda<bool(const value&)> selector(const list<value> s) { + return selectorLambda(s); +} + +/** + * Returns the value of the attribute with the given name. + */ +struct filterAttribute { + const value name; + filterAttribute(const value& n) : name(n) { + } + const bool operator()(const value& v) const { + return isAttribute(v) && attributeName((list<value>)v) == name; + } +}; + +const value attributeValue(const value& name, const value& l) { + const list<value> f = filter<value>(filterAttribute(name), list<value>(l)); + if (isNil(f)) + return value(); + return caddr<value>(car(f)); +} + +/** + * Returns child elements with the given name. + */ +struct filterElement { + const value name; + filterElement(const value& n) : name(n) { + } + const bool operator()(const value& v) const { + return isElement(v) && elementName((list<value>)v) == name; + } +}; + +const value elementChildren(const value& name, const value& l) { + return filter<value>(filterElement(name), list<value>(l)); +} + +/** + * Return the child element with the given name. + */ +const value elementChild(const value& name, const value& l) { + const list<value> f = elementChildren(name, l); + if (isNil(f)) + return value(); + return car(f); +} + +} +#endif /* tuscany_element_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/fstream.hpp b/sca-cpp/branches/cpp-contrib/kernel/fstream.hpp new file mode 100644 index 0000000000..f5a9dcd981 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/fstream.hpp @@ -0,0 +1,162 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_fstream_hpp +#define tuscany_fstream_hpp + +/** + * File based streams. + */ + +#include <stdio.h> +#include <stdarg.h> +#include "string.hpp" +#include "stream.hpp" + +namespace tuscany { + +/* + * Output stream backed by a FILE. + */ +class ofstream : public ostream { +public: + ofstream(const string& path) : file(fopen(c_str(path), "wb")), owner(true) { + } + + ofstream(FILE* file) : file(file), owner(false) { + } + + ofstream(const ofstream& os) : file(os.file), owner(false) { + } + + ~ofstream() { + if (!owner) + return; + if (file == NULL) + return; + fclose(file); + } + + ofstream& vprintf(const char* fmt, ...) { + va_list args; + va_start (args, fmt); + vfprintf (file, fmt, args); + va_end (args); + return *this; + } + + ofstream& write(const string& s) { + fwrite(c_str(s), 1, length(s), file); + return *this; + } + + ofstream& flush() { + fflush(file); + return *this; + } + +private: + FILE* file; + bool owner; +}; + +/* + * Input stream backed by a FILE. + */ +class ifstream : public istream { +public: + ifstream(const string& path) : file(fopen(c_str(path), "rb")), owner(true) { + } + + ifstream(FILE* file) : file(file), owner(false) { + } + + ifstream(const ifstream& is) : file(is.file), owner(false) { + } + + ~ifstream() { + if (!owner) + return; + if (file == NULL) + return; + fclose(file); + } + + const int read(void* buf, int size) { + return fread(buf, 1, size, file); + } + + const bool eof() { + return feof(file); + } + + const bool fail() { + return file == NULL; + } + + const int get() { + return fgetc(file); + } + + const int peek() { + int c = fgetc(file); + if (c == -1) + return c; + ungetc(c, file); + return c; + } + +private: + FILE* file; + bool owner; +}; + +/** + * Standard streams. + */ +ofstream cout(stdout); +ofstream cerr(stderr); +ifstream cin(stdin); + +/** + * Debug log stream. + */ +#ifdef WANT_MAINTAINER_MODE + +template<typename V> const bool debug(const V& v, const string& msg) { + cerr << msg << ": " << v << endl; + return true; +} + +const bool debug(const string& msg) { + cerr << msg << endl; + return true; +} + +#else + +#define debug(...) + +#endif + +} + +#endif /* tuscany_fstream_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/function.hpp b/sca-cpp/branches/cpp-contrib/kernel/function.hpp new file mode 100644 index 0000000000..db7318303a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/function.hpp @@ -0,0 +1,238 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_function_hpp +#define tuscany_function_hpp + +/** + * Lambda function type. + */ + +#include <utility> +#include "fstream.hpp" +#include "gc.hpp" +#include "config.hpp" + +namespace tuscany { + +#ifdef WANT_MAINTAINER_MODE + +/** + * Debug counters. + */ +long int countProxies; +long int countFProxies = 0; +long int countCProxies = 0; +long int countLambdas = 0; +long int countELambdas = 0; +long int countCLambdas = 0; +long int countFLambdas = 0; + +bool resetLambdaCounters() { + countLambdas = countELambdas = countCLambdas = countFLambdas = countProxies = countFProxies = countCProxies = 0; + return true; +} + +bool checkLambdaCounters() { + return countLambdas == 0; +} + +bool printLambdaCounters() { + cout << "countLambdas " << countLambdas << endl; + cout << "countELambdas " << countELambdas << endl; + cout << "countFLambdas " << countFLambdas << endl; + cout << "countCLambdas " << countCLambdas << endl; + cout << "countProxies " << countProxies << endl; + cout << "countFProxies " << countFProxies << endl; + cout << "countCProxies " << countCProxies << endl; + return true; +} + +#else + +#define resetLambdaCounters() +#define checkLambdaCounters() true +#define printLambdaCounters() + +#endif + +/** + * Lambda function type. + */ + +template<typename R, typename... P> class Callable { +public: + Callable() { + } + + virtual const int size() const = 0; + + virtual const R operator()(P... p) const = 0; + + virtual ~Callable() { + } + + template<typename F> class Proxy: public Callable { + public: + Proxy(const F& f) : function(f) { + debug_inc(countProxies); + debug_inc(countFProxies); + } + + Proxy(const Proxy& p) : function(p.function) { + debug_inc(countProxies); + debug_inc(countCProxies); + } + + ~Proxy() { + debug_dec(countProxies); + } + + virtual const R operator() (P... p) const { + return function(std::forward<P>(p)...); + } + + virtual const int size() const { + return sizeof(function); + } + + private: + const F function; + }; +}; + +template<typename S> class lambda; + +template<typename R, typename... P> class lambda<R(P...)> { +public: + lambda() : callable(0) { + debug_inc(countLambdas); + debug_inc(countELambdas); + } + + template<typename F> lambda(const F f) { + debug_inc(countLambdas); + debug_inc(countFLambdas); + + typedef typename CallableType::template Proxy<F> ProxyType; + callable = gc_ptr<CallableType>(new (gc_new<ProxyType>()) ProxyType(f)); + } + + lambda(const lambda& l) { + debug_inc(countLambdas); + debug_inc(countCLambdas); + callable = l.callable; + } + + const lambda& operator=(const lambda& l) { + if (this == &l) + return *this; + callable = l.callable; + return *this; + } + + ~lambda() { + debug_dec(countLambdas); + } + + const bool operator==(const lambda& l) const { + if (this == &l) + return true; + return callable == l.callable; + } + + const bool operator!=(const lambda& l) const { + return !this->operator==(l); + } + + const R operator()(P... p) const { + return (*callable)(std::forward<P>(p)...); + } + + template<typename S> friend ostream& operator<<(ostream&, const lambda<S>&); + template<typename S> friend const bool isNil(const lambda<S>& l); + +private: + typedef Callable<R,P...> CallableType; + gc_ptr<CallableType> callable; +}; + +template<typename S> ostream& operator<<(ostream& out, const lambda<S>& l) { + return out << "lambda::" << l.callable; +} + +/** + * Return true if a lambda is nil. + */ +template<typename S> const bool isNil(const lambda<S>& l) { + return ((void*)l.callable) == 0; +} + +/** + * Curry a lambda function. + */ +template<typename R, typename T, typename... P> class curried { +public: + curried(const lambda<R(T, P...)>& f, const T& v): v(v), f(f) { + } + + const R operator()(P... p) const { + return f(v, std::forward<P>(p)...); + } + +private: + const T v; + const lambda<R(T, P...)>f; +}; + +template<typename R, typename T, typename... P> const lambda<R(P...)> curry(const lambda<R(T, P...)>& f, const T& t) { + return curried<R, T, P...>(f, t); +} + +template<typename R, typename T, typename U, typename... P> const lambda<R(P...)> curry(const lambda<R(T, U, P...)>& f, const T& t, const U& u) { + return curry(curry(f, t), u); +} + +template<typename R, typename T, typename U, typename V, typename... P> const lambda<R(P...)> curry(const lambda<R(T, U, V, P...)>& f, const T& t, const U& u, const V& v) { + return curry(curry(curry(f, t), u), v); +} + +/** + * A lambda function that returns the given value. + */ +template<typename T> class returnResult { +public: + returnResult(const T& v) : + v(v) { + } + const T operator()() const { + return v; + } +private: + const T v; +}; + +template<typename T> const lambda<T()> result(const T& v) { + return returnResult<T> (v); +} + +} +#endif /* tuscany_function_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/gc.hpp b/sca-cpp/branches/cpp-contrib/kernel/gc.hpp new file mode 100644 index 0000000000..ca01fdf95f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/gc.hpp @@ -0,0 +1,276 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_gc_hpp +#define tuscany_gc_hpp + +/** + * Garbage collected memory management, using APR memory pools. + */ + +#include <stdlib.h> +#include <apr_general.h> +#include <apr_pools.h> +#include <assert.h> +#include <new> +#include "config.hpp" + +namespace tuscany +{ + +/** + * Pointer to a value. + */ +template<typename T> class gc_ptr { +public: + gc_ptr(T* ptr = NULL) throw() : ptr(ptr) { + } + + ~gc_ptr() throw() { + } + + gc_ptr(const gc_ptr& r) throw() : ptr(r.ptr) { + } + + gc_ptr& operator=(const gc_ptr& r) throw() { + if(this == &r) + return *this; + ptr = r.ptr; + return *this; + } + + const bool operator==(const gc_ptr& r) const throw() { + if (this == &r) + return true; + return ptr == r.ptr; + } + + const bool operator!=(const gc_ptr& r) const throw() { + return !this->operator==(r); + } + + T& operator*() const throw() { + return *ptr; + } + + T* operator->() const throw() { + return ptr; + } + + operator T*() const throw() { + return ptr; + } + + T* ptr; +}; + +/** + * Garbage collected APR memory pool. + */ +class gc_pool { +public: + gc_pool() : apr_pool(NULL) { + } + + gc_pool(apr_pool_t* p) : apr_pool(p) { + } + + gc_pool(const gc_pool& pool) : apr_pool(pool.apr_pool) { + } + + gc_pool& operator=(const gc_pool& pool) { + if (this == &pool) + return *this; + apr_pool = pool.apr_pool; + return *this; + } + +private: + friend apr_pool_t* pool(const gc_pool& pool); + friend class gc_global_pool_t; + friend class gc_scoped_pool; + + apr_pool_t* apr_pool; +}; + +/** + * Return APR pool used by a gc_pool. + */ +apr_pool_t* pool(const gc_pool& pool) { + return pool.apr_pool; +} + +/** + * Destroy a memory pool. + */ +const bool destroy(const gc_pool& p) { + apr_pool_destroy(pool(p)); + return true; +} + +/** + * Initialize APR. + */ +class gc_apr_context_t { +public: + gc_apr_context_t() { + apr_initialize(); + } +} gc_apr_context; + +/** + * Maintain a stack of memory pools. + */ +#ifdef WANT_THREADS +__thread +#endif +apr_pool_t* gc_pool_stack = NULL; + +/** + * Return the current memory pool. + */ +apr_pool_t* gc_current_pool() { + apr_pool_t* apr_pool = gc_pool_stack; + if (apr_pool != NULL) + return apr_pool; + + // Create a parent pool for the current thread + apr_pool_create(&apr_pool, NULL); + assert(apr_pool != NULL); + gc_pool_stack = apr_pool; + return apr_pool; +} + +/** + * Push a pool onto the stack. + */ +apr_pool_t* gc_push_pool(apr_pool_t* pool) { + apr_pool_t* p = gc_pool_stack; + gc_pool_stack = pool; + return p; +} + +/** + * Pop a pool from the stack. + */ +apr_pool_t* gc_pop_pool(apr_pool_t* pool) { + apr_pool_t* p = gc_pool_stack; + gc_pool_stack = pool; + return p; +} + +/** + * A memory pool scope, used to setup a scope in which a particular pool + * will be used for all allocations. + */ +class gc_scoped_pool : public gc_pool { +public: + + gc_scoped_pool() : gc_pool(NULL), prev(gc_current_pool()), owner(true) { + apr_pool_create(&apr_pool, NULL); + assert(apr_pool != NULL); + gc_push_pool(apr_pool); + } + + gc_scoped_pool(apr_pool_t* pool) : gc_pool(pool), prev(gc_current_pool()), owner(false) { + gc_push_pool(apr_pool); + } + + ~gc_scoped_pool() { + if (owner) + apr_pool_destroy(apr_pool); + gc_pop_pool(prev); + } + +private: + gc_scoped_pool(const unused gc_scoped_pool& pool) : gc_pool(pool.apr_pool), prev(NULL), owner(false) { + } + + apr_pool_t* prev; + bool owner; +}; + +/** + * Allocates a pointer to an object allocated from a memory pool and + * register a cleanup callback for it. + */ +template<typename T> apr_status_t gc_pool_cleanup(void* v) { + T* t = static_cast<T*>(v); + t->~T(); + return APR_SUCCESS; +} + +template<typename T> T* gc_new(apr_pool_t* p) { + void* gc_new_ptr = apr_palloc(p, sizeof(T)); + assert(gc_new_ptr != NULL); + apr_pool_cleanup_register(p, gc_new_ptr, gc_pool_cleanup<T>, apr_pool_cleanup_null) ; + return static_cast<T*>(gc_new_ptr); +} + +template<typename T> T* gc_new(const gc_pool& p) { + return gc_new<T>(pool(p)); +} + +template<typename T> T* gc_new() { + return gc_new<T>(gc_current_pool()); +} + +template<typename T> apr_status_t gc_pool_acleanup(void* v) { + int* m = static_cast<int*>(v); + int n = *m; + T* t = (T*)(m + 1); + for (int i = 0; i < n; i++, t++) + t->~T(); + return APR_SUCCESS; +} + +template<typename T> T* gc_anew(apr_pool_t* p, int n) { + int* gc_anew_ptr = static_cast<int*>(apr_palloc(p, sizeof(int) + sizeof(T[n]))); + assert(gc_anew_ptr != NULL); + *gc_anew_ptr = n; + apr_pool_cleanup_register(p, gc_anew_ptr, gc_pool_acleanup<T>, apr_pool_cleanup_null) ; + return (T*)(gc_anew_ptr + 1); +} + +template<typename T> T* gc_anew(const gc_pool& p, int n) { + return gc_anew<T>(pool(p), n); +} + +template<typename T> T* gc_anew(int n) { + return gc_anew<T>(gc_current_pool(), n); +} + +/** + * Allocate an array of chars. + */ +char* gc_cnew(apr_pool_t* p, int n) { + char* gc_cnew_ptr = static_cast<char*>(apr_palloc(p, n)); + assert(gc_cnew_ptr != NULL); + return gc_cnew_ptr; +} + +char* gc_cnew(int n) { + return gc_cnew(gc_current_pool(), n); +} + +} + +#endif /* tuscany_gc_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/kernel-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/kernel-test.cpp new file mode 100644 index 0000000000..44ffe06b7b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/kernel-test.cpp @@ -0,0 +1,594 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test kernel functions. + */ + +#include <assert.h> +#include "string.hpp" +#include "sstream.hpp" +#include "function.hpp" +#include "list.hpp" +#include "tree.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "dynlib.hpp" +#include "perf.hpp" + +namespace tuscany { + +struct inc { + int i; + inc(int i) : + i(i) { + } + const int operator()(const int x) const { + return x + i; + } +}; + +const int square(const int x) { + return x * x; +} + +int mapLambda(lambda<int(const int)> f, int v) { + return f(v); +} + +bool testLambda() { + const lambda<int(const int)> sq(square); + assert(sq(2) == 4); + assert(mapLambda(sq, 2) == 4); + assert(mapLambda(square, 2) == 4); + + const lambda<int(const int)> incf(inc(10)); + assert(incf(1) == 11); + assert(mapLambda(incf, 1) == 11); + assert(mapLambda(inc(10), 1) == 11); + + lambda<int(const int)> l; + l = incf; + assert(l(1) == 11); + l = square; + assert(l(2) == 4); + return true; +} + +bool testLambdaGC() { + resetLambdaCounters(); + { + gc_scoped_pool gc; + testLambda(); + } + assert(checkLambdaCounters()); + return true; +} + +int countElements = 0; + +struct Element { + int i; + + Element() : i(0) { + countElements++; + } + + Element(int i) : i(i) { + countElements++; + } + + Element(const Element& o) : i(o.i) { + countElements++; + } + + ~Element() { + countElements--; + } + + const bool operator==(const Element& o) const { + return o.i == i; + } +}; +ostream& operator<<(ostream& out, const Element& v) { + out << v.i ; + return out; +} + +bool testCons() { + assert(car(cons(2, mklist(3))) == 2); + assert(car(cdr(cons(2, mklist(3)))) == 3); + assert(isNil(cdr(cdr(cons(2, mklist(3)))))); + + assert(cons(Element(1), mklist(Element(2))) == mklist(Element(1), Element(2))); + return true; +} + +bool testListGC() { + resetLambdaCounters(); + resetListCounters(); + countElements = 0; + { + gc_scoped_pool gc; + testCons(); + } + assert(checkLambdaCounters()); + assert(checkListCounters()); + assert(countElements == 0); + return true; +} + +bool testOut() { + ostringstream os1; + os1 << list<int> (); + assert(str(os1) == "()"); + + ostringstream os2; + os2 << mklist(1, 2, 3); + assert(str(os2) == "(1 2 3)"); + return true; +} + +bool testEquals() { + assert(list<int>() == list<int>()); + assert(mklist(1, 2) == mklist(1, 2)); + assert(list<int>() != mklist(1, 2)); + assert(mklist(1, 2, 3) == mklist(1, 2, 3)); + assert(mklist(1, 2) != mklist(1, 2, 3)); + return true; +} + +bool testLength() { + assert(0 == length(list<int>())); + assert(1 == length(mklist(1))); + assert(2 == length(cons(1, mklist(2)))); + return true; +} + +bool testAppend() { + assert(car(append(mklist(1), mklist(2))) == 1); + assert(car(cdr(append(mklist(1), mklist(2)))) == 2); + assert(car(cdr(cdr(append(mklist(1), mklist(2, 3))))) == 3); + assert(isNil(cdr(cdr(cdr(append(mklist(1), mklist(2, 3))))))); + + assert(list<int>() + 1 + 2 + 3 == mklist(1, 2, 3)); + return true; +} + +struct Complex { + int x; + int y; + Complex() { + } + Complex(int x, int y) : + x(x), y(y) { + } +}; +ostream& operator<<(ostream& out, const Complex& v) { + out << "[" << v.x << ":" << v.y << "]"; + return out; +} + +bool testComplex() { + const list<Complex> p = mklist(Complex(1, 2), Complex(3, 4)); + assert(car(p).x == 1); + assert(car(cdr(p)).x == 3); + assert(isNil(cdr(cdr(p)))); + return true; +} + +bool testMap() { + assert(isNil(map<int, int>(square, list<int>()))); + + const list<int> m = map<int, int>(square, mklist(2, 3)); + assert(car(m) == 4); + assert(car(cdr(m)) == 9); + + return true; +} + +const int add(const int x, const int y) { + return x + y; +} + +bool testReduce() { + const lambda<int(const int, const int)> r(add); + assert(reduce(r, 0, mklist(1, 2, 3)) == 6); + return true; +} + +bool isPositive(const int x) { + if(x >= 0) + return true; + else + return false; +} + +bool testFilter() { + assert(car(filter<int>(isPositive, mklist(1, -1, 2, -2))) == 1); + assert(cadr(filter<int>(isPositive, mklist(1, -1, 2, -2))) == 2); + return true; +} + +bool testMember() { + assert(isNil(member(4, mklist(1, 2, 3)))); + assert(car(member(1, mklist(1, 2, 3))) == 1); + assert(car(member(2, mklist(1, 2, 3))) == 2); + assert(car(member(3, mklist(1, 2, 3))) == 3); + return true; +} + +bool testReverse() { + assert(isNil(reverse(list<int>()))); + assert(car(reverse(mklist(1, 2, 3))) == 3); + assert(cadr(reverse(mklist(1, 2, 3))) == 2); + return true; +} + +bool testListRef() { + assert(listRef(mklist(1), 0) == 1); + assert(listRef(mklist(1, 2, 3), 0) == 1); + assert(listRef(mklist(1, 2, 3), 1) == 2); + assert(listRef(mklist(1, 2, 3), 2) == 3); + return true; +} + +bool testAssoc() { + const list<list<string> > l = mklist(mklist<string>("x", "X"), mklist<string>("a", "A"), mklist<string>("y", "Y"), mklist<string>("a", "AA")); + assert(assoc<string>("a", l) == mklist<string>("a", "A")); + assert(isNil(assoc<string>("z", l))); + + const list<list<value> > u = mklist(mklist<value>("x", "X"), mklist<value>("a", "A"), mklist<value>("y", "Y"), mklist<value>("a", "AA")); + assert(assoc<value>("a", u) == mklist<value>("a", "A")); + + const list<value> v = mklist<value>(mklist<value>("x", "X"), mklist<value>("a", "A"), mklist<value>("y", "Y"), mklist<value>("a", "AA")); + assert(assoc<value>("a", v) == mklist<value>("a", "A")); + return true; +} + +bool testZip() { + const list<string> k = mklist<string>("x", "a", "y", "a"); + const list<string> v = mklist<string>("X", "A", "Y", "AA"); + const list<list<string> > z = mklist(k, v); + const list<list<string> > u = mklist(mklist<string>("x", "X"), mklist<string>("a", "A"), mklist<string>("y", "Y"), mklist<string>("a", "AA")); + assert(zip(k, v) == u); + assert(unzip(u) == z); + return true; +} + +bool testTokenize() { + assert(tokenize("/", "aaa/bbb/ccc/ddd") == mklist<string>("aaa", "bbb", "ccc", "ddd")); + assert(tokenize("/", "/bbb/ccc/ddd") == mklist<string>("", "bbb", "ccc", "ddd")); + assert(tokenize("/", "/bbb/ccc/") == mklist<string>("", "bbb", "ccc")); + assert(tokenize("/", "/bbb//ccc/") == mklist<string>("", "bbb", "", "ccc")); + assert(tokenize("/", "abc/def/") == mklist<string>("abc", "def")); + return true; +} + +double testSeqMap(double x) { + return x; +} + +double testSeqReduce(unused double v, double accum) { + return accum + 1.0; +} + +bool testSeq() { + resetLambdaCounters(); + resetListCounters(); + + list<double> s = seq(0.0, 1000.0); + assert(1001 == length(s)); + + assert(1001 == length(map<double, double>(testSeqMap, s))); + + assert(801 == length(member(200.0, s))); + assert(201 == length(member(200.0, reverse(s)))); + + assert(1001 == (reduce<double, double>(testSeqReduce, 0.0, s))); + return true; +} + +value valueSquare(list<value> x) { + return (int)car(x) * (int)car(x); +} + +bool testValue() { + assert(value(true) == value(true)); + assert(value(1) == value(1)); + assert(value("abcd") == value("abcd")); + lambda<value(const list<value>&)> vl(valueSquare); + assert(value(vl) == value(vl)); + assert(value(mklist<value>(1, 2)) == value(mklist<value>(1, 2))); + + const list<value> v = mklist<value>(mklist<value>("x", "X"), mklist<value>("a", "A"), mklist<value>("y", "Y")); + assert(cadr((list<list<value> >)value(v)) == mklist<value>("a", "A")); + + const value pv(gc_ptr<value>(new (gc_new<value>()) value(1))); + assert(*(gc_ptr<value>)pv == value(1)); + + const list<value> lpv = mklist<value>(gc_ptr<value>(new (gc_new<value>()) value(1)), gc_ptr<value>(new (gc_new<value>()) value(2))); + assert(*(gc_ptr<value>)car(lpv) == value(1)); + return true; +} + +bool testValueGC() { + resetLambdaCounters(); + resetListCounters(); + resetValueCounters(); + { + gc_scoped_pool gc; + testValue(); + } + assert(checkValueCounters()); + assert(checkLambdaCounters()); + assert(checkListCounters()); + return true; +} + +bool testTree() { + const list<value> t = mktree<value>("a", list<value>(), list<value>()); + const list<value> ct = constree<value>("d", constree<value>("f", constree<value>("c", constree<value>("e", constree<value>("b", t))))); + const list<value> mt = mktree(mklist<value>("d", "f", "c", "e", "b", "a")); + assert(mt == ct); + const list<value> l = flatten<value>(mt); + assert(length(l) == 6); + assert(car(l) == "a"); + assert(car(reverse(l)) == "f"); + const list<value> bt = mkbtree<value>(l); + assert(car(bt) == "c"); + return true; +} + +const list<value> lta(const string& x) { + return mklist<value>(c_str(x), c_str(x + x)); +} + +bool testTreeAssoc() { + const list<value> t = mktree<value>(lta("a"), list<value>(), list<value>()); + const list<value> at = constree<value>(lta("d"), constree<value>(lta("f"), constree<value>(lta("c"), constree<value>(lta("e"), constree<value>(lta("b"), t))))); + const list<value> l = flatten<value>(at); + assert(length(l) == 6); + assert(car(l) == mklist<value>("a", "aa")); + assert(car(reverse(l)) == mklist<value>("f", "ff")); + const list<value> bt = mkbtree<value>(l); + assert(car(bt) == mklist<value>("c", "cc")); + assert(assoctree<value>("a", bt) == mklist<value>("a", "aa")); + assert(assoctree<value>("b", bt) == mklist<value>("b", "bb")); + assert(assoctree<value>("f", bt) == mklist<value>("f", "ff")); + assert(isNil(assoctree<value>("x", bt))); + return true; +} + +double fib_aux(double n, double a, double b) { + if(n == 0.0) + return a; + return fib_aux(n - 1.0, b, a + b); +} + +double fib(double n) { + return fib_aux(n, 0.0, 1.0); +} + +struct fibMapPerf { + const bool operator()() const { + list<double> s = seq(0.0, 999.0); + list<double> r = map<double, double>(fib, s); + assert(1000 == length(r)); + return true; + } +}; + +struct nestedFibMapPerf { + const lambda<double(const double)> fib; + nestedFibMapPerf(const lambda<double(const double)>& fib) : fib(fib) { + } + const bool operator()() const { + list<double> s = seq(0.0, 999.0); + list<double> r = map<double, double>(fib, s); + assert(1000 == length(r)); + return true; + } +}; + +bool testCppPerf() { + { + const lambda<bool()> fml = fibMapPerf(); + cout << "Fibonacci map test " << (time(fml, 1, 1) / 1000) << " ms" << endl; + } + + { + struct nested { + static double fib(double n) { + struct nested { + static double fib_aux(double n, double a, double b) { + if(n == 0.0) + return a; + return fib_aux(n - 1.0, b, a + b); + } + }; + return nested::fib_aux(n, 0.0, 1.0); + } + }; + + const lambda<bool()> nfml = nestedFibMapPerf(lambda<double(const double)>(nested::fib)); + cout << "Nested Fibonacci map test " << (time(nfml, 1, 1) / 1000) << " ms" << endl; + } + return true; +} + +const id<int> idF(const int v) { + return v * 2; +} + +const id<int> idG(const int v) { + return v * 3; +} + +const id<int> idH(const int v) { + return idF(v) >> idG; +} + +bool testIdMonad() { + const id<int> m(2); + assert(m >> idF == idF(2)); + assert(m >> unit<int>() == m); + assert(m >> idF >> idG == m >> idH); + return true; +} + +const maybe<int> maybeF(const int v) { + return v * 2; +} + +const maybe<int> maybeG(const int v) { + return v * 3; +} + +const maybe<int> maybeH(const int v) { + return maybeF(v) >> maybeG; +} + +bool testMaybeMonad() { + const maybe<int> m(2); + assert(m >> maybeF == maybeF(2)); + assert((m >> just<int>()) == m); + assert(m >> maybeF >> maybeG == m >> maybeH); + + assert(maybe<int>() >> maybeF >> maybeG == maybe<int>()); + return true; +} + +const failable<int> failableF(const int v) { + return v * 2; +} + +const failable<int> failableG(const int v) { + return v * 3; +} + +const failable<int> failableH(const int v) { + return failableF(v) >> failableG; +} + +bool testFailableMonad() { + const failable<int> m(2); + assert(m >> failableF == failableF(2)); + assert((m >> success<int, string>()) == m); + assert(m >> failableF >> failableG == m >> failableH); + + cout << "Failable monad test... " << endl; + failable<int> ooops = mkfailure<int>("test"); + assert(reason(ooops) == "test"); + assert(ooops >> failableF >> failableG == ooops); + return true; +} + +struct tickInc { + const double v; + tickInc(const double v) : v(v) { + } + const scp<int, double> operator()(int s) const { + return scp<int, double>(s + 1, v); + } +}; + +const state<int, double> tick(const double v) { + return transformer<int, double>(tickInc(v)); +} + +const state<int, double> stateF(const double v) { + return result<int, double>(v * 2.0) >> tick; +} + +const state<int, double> stateG(const double v) { + return result<int, double>(v + 5); +} + +const state<int, double> stateH(const double v) { + return stateF(v) >> stateG; +} + +bool testStateMonad() { + const lambda<state<int, double>(const double)> r(result<int, double>); + + state<int, double> m = result<int, double>(2.0); + assert((m >> stateF)(0) == stateF(2.0)(0)); + assert(1 == (int)(m >> stateF)(0)); + assert((m >> r)(0) == m(0)); + assert((m >> stateF >> stateG)(0) == (m >> stateH)(0)); + + return true; +} + +bool testDynLib() { + const lib dl(string(".libs/libdynlib-test") + dynlibExt); + const failable<lambda<int(const int)> > sq(dynlambda<int(const int)>("csquare", dl)); + assert(hasContent(sq)); + lambda<int(const int)> l(content(sq)); + assert(l(2) == 4); + + const failable<lambda<lambda<int(const int)>()> > sql(dynlambda<lambda<int(const int)>()>("csquarel", dl)); + assert(hasContent(sql)); + lambda<lambda<int(const int)>()> ll(content(sql)); + assert(ll()(3) == 9); + return true; +} + +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::testLambda(); + tuscany::testLambdaGC(); + tuscany::testCons(); + tuscany::testListGC(); + tuscany::testOut(); + tuscany::testEquals(); + tuscany::testLength(); + tuscany::testAppend(); + tuscany::testComplex(); + tuscany::testMap(); + tuscany::testReduce(); + tuscany::testFilter(); + tuscany::testMember(); + tuscany::testReverse(); + tuscany::testListRef(); + tuscany::testAssoc(); + tuscany::testZip(); + tuscany::testTokenize(); + tuscany::testSeq(); + tuscany::testValue(); + tuscany::testValueGC(); + tuscany::testTree(); + tuscany::testTreeAssoc(); + tuscany::testCppPerf(); + tuscany::testIdMonad(); + tuscany::testMaybeMonad(); + tuscany::testFailableMonad(); + tuscany::testStateMonad(); + tuscany::testDynLib(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/kernel/list.hpp b/sca-cpp/branches/cpp-contrib/kernel/list.hpp new file mode 100644 index 0000000000..84eba6d82f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/list.hpp @@ -0,0 +1,559 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_list_hpp +#define tuscany_list_hpp + +/** + * Simple list functions. + */ + +#include <assert.h> +#include "string.hpp" +#include "fstream.hpp" +#include "function.hpp" + +namespace tuscany { + +#ifdef WANT_MAINTAINER_MODE + +/** + * Debug utilities. Counters used to track instances of lists, and + * macro used to write the contents of a list in a string, easier to + * watch in a debugger than the list itself. + */ +long countLists = 0; +long countILists = 0; +long countCLists = 0; +long countELists = 0; + +bool resetListCounters() { + countLists = countILists = countCLists = countELists = 0; + return true; +} + +bool checkListCounters() { + return countLists == 0; +} + +bool printListCounters() { + cout << "countLists " << countLists << endl; + cout << "countELists " << countELists << endl; + cout << "countILists " << countILists << endl; + cout << "countCLists " << countCLists << endl; + return true; +} + +#else + +#define resetListCounters() +#define checkListCounters() true +#define printListCounters() + +#endif + +#ifdef WANT_MAINTAINER_WATCH + +#define debug_watchList() do { \ + this->watch = watchList(*this); \ + } while (0) + +#else + +#define debug_watchList(); + +#endif + +/** + * A car/cdr lisp-like pair, base structure to construct lists. + */ + +template<typename T> class list { +public: + + list() { + debug_inc(countLists); + debug_inc(countELists); + debug_watchList(); + } + + list(const T car, const lambda<list<T>()>& cdr) : car(car), cdr(cdr) { + debug_inc(countLists); + debug_inc(countILists); + debug_watchList(); + } + + list(const list& p) : car(p.car), cdr(p.cdr) { + debug_inc(countLists); + debug_inc(countCLists); +#ifdef WANT_MAINTAINER_WATCH + watch = p.watch; +#endif + } + + const list<T>& operator=(const list<T>& p) { + if(this == &p) + return *this; + car = p.car; + cdr = p.cdr; +#ifdef WANT_MAINTAINER_WATCH + watch = p.watch; +#endif + return *this; + } + + ~list() { + debug_dec(countLists); + } + + const bool operator==(const list<T>& p) const { + if(this == &p) + return true; + if(isNil(cdr)) + return isNil(p.cdr); + if(isNil(p.cdr)) + return false; + if(!(car == p.car)) + return false; + if(cdr == p.cdr) + return true; + return cdr() == p.cdr(); + } + + const bool operator<(const list<T>& p) const { + if(this == &p) + return false; + if (isNil(cdr)) + return !isNil(p.cdr); + if (isNil(p.cdr)) + return false; + if (car < p.car) + return true; + if (car != p.car) + return false; + return cdr() < p.cdr(); + } + + const bool operator>(const list<T>& p) const { + if(this == &p) + return false; + if (isNil(cdr)) + return false; + if (isNil(p.cdr)) + return true; + if (car > p.car) + return true; + if (car != p.car) + return false; + return cdr() > p.cdr(); + } + + const bool operator!=(const list<T>& p) const { + return !this->operator==(p); + } + + operator const list<list<T> >() const { + return (list<list<T> >)T(*this); + } + +private: +#ifdef WANT_MAINTAINER_WATCH + template<typename X> friend const string watchList(const list<X>& p); + string watch; +#endif + + template<typename X> friend const bool isNil(const list<X>& p); + template<typename X> friend const X car(const list<X>& p); + template<typename X> friend const list<X> cdr(const list<X>& p); + + T car; + lambda<list<T>()> cdr; +}; + +#ifdef WANT_MAINTAINER_WATCH + +/** + * Debug utility used to write the contents of a list to a string, easier + * to watch than the list itself in a debugger. + */ +template<typename T> const string watchList(const list<T>& p) { + if(isNil(p)) + return "()"; + odebugstream os; + os << "(" << car(p) << " ...)"; + return str(os); +} + +#endif + +/** + * Returns true if the given list is nil. + */ +template<typename T> const bool isNil(const list<T>& p) { + return isNil(p.cdr); +} + +/** + * Write a list to an output stream. + */ +template<typename T> ostream& writeHelper(ostream& out, const list<T>& l) { + if (isNil(l)) + return out; + out << " " << car(l); + return writeHelper(out, cdr(l)); +} + +template<typename T> ostream& operator<<(ostream& out, const list<T>& l) { + if(isNil(l)) + return out << "()"; + out << "(" << car(l); + writeHelper<T>(out, cdr(l)); + return out << ")"; +} + +/** + * Construct a (lazy) list from a value and a lambda function that returns the cdr. + */ +template<typename T> const list<T> cons(const T& car, const lambda<list<T>()>& cdr) { + return list<T> (car, cdr); +} + +/** + * Construct a list from a value and a cdr list. + */ +template<typename T> const list<T> cons(const T& car, const list<T>& cdr) { + return list<T> (car, result(cdr)); +} + +/** + * Cons variations for use with the reduce and reduceRight functions. + */ +template<typename T> const list<T> lcons(const list<T>& cdr, const T& car) { + return cons<T>(car, cdr); +} + +template<typename T> const list<T> rcons(const T& car, const list<T>& cdr) { + return cons<T>(car, cdr); +} + +/** + * Construct a list of one value. + */ +template<typename T> const list<T> mklist(const T& car) { + return list<T> (car, result(list<T> ())); +} + +/** + * Construct a list of two values. + */ +template<typename T> const list<T> mklist(const T& a, const T& b) { + return cons(a, mklist(b)); +} + +/** + * Construct a list of three values. + */ +template<typename T> const list<T> mklist(const T& a, const T& b, const T& c) { + return cons(a, cons(b, mklist(c))); +} + +/** + * Construct a list of four values. + */ +template<typename T> const list<T> mklist(const T& a, const T& b, const T& c, const T& d) { + return cons(a, cons(b, cons(c, mklist(d)))); +} + +/** + * Construct a list of five values. + */ +template<typename T> const list<T> mklist(const T& a, const T& b, const T& c, const T& d, const T& e) { + return cons(a, cons(b, cons(c, cons(d, mklist(e))))); +} + +/** + * Construct a list of six values. + */ +template<typename T> const list<T> mklist(const T& a, const T& b, const T& c, const T& d, const T& e, const T& f) { + return cons(a, cons(b, cons(c, cons(d, cons(e, mklist(f)))))); +} + +/** + * Returns the car of a list. + */ +template<typename T> const T car(const list<T>& p) { + // Abort if trying to access the car of a nil list + assert(!isNil(p.cdr)); + return p.car; +} + +/** + * Returns the cdr of a list. + */ +template<typename T> const list<T> cdr(const list<T>& p) { + return p.cdr(); +} + +/** + * Returns the car of the cdr of a list. + */ +template<typename T> const T cadr(const list<T>& p) { + return car(cdr(p)); +} + +/** + * Returns the car of the cdr of the cdr of a list. + */ +template<typename T> const T caddr(const list<T>& p) { + return car(cdr(cdr(p))); +} + +/** + * Returns the car of the cdr of the cdr of the cdr of a list. + */ +template<typename T> const T cadddr(const list<T>& p) { + return car(cdr(cdr(cdr(p)))); +} + +/** + * Returns the cdr of a cdr of a list. + */ +template<typename T> const list<T> cddr(const list<T>& p) { + return cdr(cdr(p)); +} + +/** + * Returns the cdr of a cdr of the cdr of a list. + */ +template<typename T> const list<T> cdddr(const list<T>& p) { + return cdr(cdr(cdr(p))); +} + +/** + * Returns the length of a list. + */ +template<typename T> struct lengthRef { + const int operator()(const int c, const list<T>& p) { + if(isNil(p)) + return c; + return (*this)(c + 1, cdr(p)); + } +}; + +template<typename T> const int length(const list<T>& p) { + return lengthRef<T> ()(0, p); +} + +/** + * Appends a list and a lambda function returning a list. + */ +template<typename T> struct appendCdr { + const list<T> a; + const lambda<list<T>()> fb; + appendCdr(const list<T>& a, const lambda<list<T>()>& fb) : + a(a), fb(fb) { + } + const list<T> operator()() const { + return append(a, fb); + } +}; + +template<typename T> const list<T> append(const list<T>&a, const lambda<list<T>()>& fb) { + if(isNil(a)) + return fb(); + + return cons<T>(car(a), appendCdr<T> (cdr(a), fb)); +} + +/** + * Appends two lists. + */ +template<typename T> const list<T> append(const list<T>&a, const list<T>& b) { + return append(a, result(b)); +} + +/** + * Append a value to a list. + */ +template<typename T> const list<T> operator+(const list<T>& l, const T& v) { + return append(l, mklist(v)); +} + +template<typename T, typename V> const list<T> operator+(const list<T>& l, const V& v) { + return append(l, mklist<T>(v)); +} + +/** + * Map a lambda function on a list. + */ +template<typename T, typename R> const list<R> map(const lambda<R(const T)>& f, const list<T>& p) { + if(isNil(p)) + return list<R> (); + return cons(f(car(p)), map(f, cdr(p))); +} + +/** + * Run a reduce lambda function on a list. + */ +template<typename T, typename R> struct reduceAccumulate { + const lambda<R(const R&, const T&)> f; + reduceAccumulate(const lambda<R(const R, const T)>& f) : + f(f) { + } + R operator()(const R& acc, const list<T>& p) const { + if(isNil(p)) + return acc; + return (*this)(f(acc, car(p)), cdr(p)); + } +}; + +template<typename T, typename R> const R reduce(const lambda<R(const R, const T)>& f, const R& initial, const list<T>& p) { + return reduceAccumulate<T, R> (f)(initial, p); +} + +template<typename T, typename R> struct reduceRightAccumulate { + const lambda<R(const T&, const R&)> f; + reduceRightAccumulate(const lambda<R(const T, const R)>& f) : + f(f) { + } + R operator()(const list<T>& p, const R& acc) const { + if(isNil(p)) + return acc; + return (*this)(cdr(p), f(car(p), acc)); + } +}; + +template<typename T, typename R> const R reduceRight(const lambda<R(const T, const R)>& f, const R& initial, const list<T>& p) { + return reduceRightAccumulate<T, R> (f)(p, initial); +} + +/** + * Run a filter lambda function on a list. + */ +template<typename T> const list<T> filter(const lambda<bool(const T)>& f, const list<T>& p) { + if(isNil(p)) + return list<T> (); + if(f(car(p))) { + const lambda<list<T>(const lambda<bool(const T)>, const list<T>)> ff(filter<T>); + return cons(car(p), curry(ff, f, cdr(p))); + } + return filter(f, cdr(p)); +} + +/** + * Returns a list pointing to a member of a list. + */ +template<typename T> const list<T> member(const T& t, const list<T>& p) { + if(isNil(p)) + return list<T> (); + if(t == car(p)) + return p; + return member(t, cdr(p)); +} + +/** + * Reverse a list. + */ +template<typename T> const list<T> reverseIter(const list<T>& acc, const list<T>& p) { + if(isNil(p)) + return acc; + return reverseIter(cons(car(p), acc), cdr(p)); +} + +template<typename T> const list<T> reverse(const list<T>& p) { + return reverseIter(list<T> (), p); +} + +template<typename T> const list<T> seq(const T& start, const T& end); + +template<typename T> struct seqGenerate { + const T start; + const T end; + seqGenerate(const T& start, const T&end) : + start(start), end(end) { + } + const list<T> operator()() const { + return seq<T> (start, end); + } +}; + +/** + * Returns a sequence of values between the given bounds. + */ +template<typename T> const list<T> seq(const T& start, const T& end) { + if(start == end) + return mklist(start); + if(start < end) + return cons<T>(start, seqGenerate<T> (start + 1, end)); + return cons<T>(start, seqGenerate<T> (start - 1, end)); +} + +/** + * Returns the i-th element of a list. + */ +template<typename T> const T listRef(const list<T>& l, const int i) { + if (i == 0) + return car(l); + return listRef(cdr(l), i - 1); +} + +/** + * Returns the first pair matching a key from a list of key value pairs. + */ +template<typename T> const list<T> assoc(const T& k, const list<list<T> >& p) { + if(isNil(p)) + return list<T> (); + if(k == car(car(p))) + return car(p); + return assoc(k, cdr(p)); +} + +/** + * Returns a list of lists containing elements from two input lists. + */ +template<typename T> const list<list<T> > zip(const list<T>& a, const list<T>& b) { + if (isNil(a) || isNil(b)) + return list<list<T> >(); + return cons<list<T> >(mklist<T>(car(a), car(b)), zip(cdr(a), cdr(b))); +} + +/** + * Converts a list of key value pairs to a list containing the list of keys and the list of values. + */ +template<typename T> const list<T> unzipKeys(const list<list<T> >& l) { + if (isNil(l)) + return list<T>(); + return cons(car(car(l)), unzipKeys(cdr(l))); +} + +template<typename T> const list<T> unzipValues(const list<list<T> >& l) { + if (isNil(l)) + return list<T>(); + return cons(cadr(car(l)), unzipValues(cdr(l))); +} + +template<typename T> const list<list<T> > unzip(const list<list<T> >& l) { + return mklist<list<T> >(unzipKeys(l), unzipValues(l)); +} + +} + +#endif /* tuscany_list_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/mem-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/mem-test.cpp new file mode 100644 index 0000000000..b1164a5a36 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/mem-test.cpp @@ -0,0 +1,162 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test memory allocation functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "gc.hpp" +#include "function.hpp" +#include "perf.hpp" + +namespace tuscany { + +int countElements = 0; +int maxElements = 0; + +class Element { +public: + Element() : i(0) { + countElements++; + if (countElements > maxElements) + maxElements = countElements; + } + + Element(int i) : i(i) { + countElements++; + if (countElements > maxElements) + maxElements = countElements; + } + + Element(const Element& o) : i(o.i) { + countElements++; + if (countElements > maxElements) + maxElements = countElements; + } + + ~Element() { + countElements--; + } + + const bool operator==(const Element& o) const { + return o.i == i; + } + +private: + friend ostream& operator<<(ostream& out, const Element& v); + + int i; + char c[20]; +}; + +ostream& operator<<(ostream& out, const Element& v) { + out << v.i ; + return out; +} + +bool poolAlloc(Element** p, const int count) { + if (count == 0) + return true; + p[count - 1] = new (gc_new<Element>()) Element(); + return poolAlloc(p, count - 1); +}; + +bool poolFree(Element** p, const int count) { + if (count == 0) + return true; + // Do nothing to free the element, but cycle through them just + // to get a fair comparison with the other memory alloc tests + return poolFree(p, count - 1); +}; + +struct poolAllocPerf { + const int n; + Element** p; + poolAllocPerf(const int n) : n(n), p(new Element*[n]) { + } + const bool operator()() const { + gc_scoped_pool gc; + poolAlloc(p, n); + return true; + } +}; + +bool testPoolAllocPerf() { + const int count = 100000; + const lambda<bool()> pl = poolAllocPerf(count); + maxElements = 0; + cout << "Memory pool alloc test " << (time(pl, 1, 1) / count) << " ms" << endl; + assert(countElements == 0); + assert(maxElements == count); + return true; +} + +bool stdAlloc(Element** p, const int count) { + if (count == 0) + return true; + p[count - 1] = new Element(); + return stdAlloc(p, count - 1); +}; + +bool stdFree(Element** p, const int count) { + if (count == 0) + return true; + delete p[count -1]; + return stdFree(p, count - 1); +}; + +struct stdAllocPerf { + const int n; + Element** p; + stdAllocPerf(const int n) : n(n), p(new Element*[n]) { + } + const bool operator()() const { + stdAlloc(p, n); + stdFree(p, n); + return true; + } +}; + +bool testStdAllocPerf() { + const int count = 100000; + const lambda<bool()> sl = stdAllocPerf(count); + maxElements = 0; + cout << "Memory standard alloc test " << (time(sl, 1, 1) / count) << " ms" << endl; + assert(countElements == 0); + assert(maxElements == count); + return true; +} + +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::testPoolAllocPerf(); + tuscany::testStdAllocPerf(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/kernel/monad.hpp b/sca-cpp/branches/cpp-contrib/kernel/monad.hpp new file mode 100644 index 0000000000..8aa4bc1662 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/monad.hpp @@ -0,0 +1,486 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_monad_hpp +#define tuscany_monad_hpp + +/** + * Simple monad implementations. + */ + +#include "function.hpp" +#include "string.hpp" +#include "stream.hpp" + +namespace tuscany +{ + +/** + * Identity monad. Just wraps a value. + * To get the value in the monad, just cast it to the value type. + */ +template<typename V> class id { +public: + id(const V& v) : v(v) { + } + + const id<V>& operator=(const id<V>& m) { + if(this == &m) + return *this; + v = m.v; + return *this; + } + + const bool operator!=(const id<V>& m) const { + return !this->operator==(m); + } + + const bool operator==(const id<V>& m) const { + if (&m == this) + return true; + return v == m.v; + } + +private: + const V v; + + template<typename X> friend const X content(const id<X>& m); +}; + +/** + * Write an identity monad to a stream. + */ +template<typename V> ostream& operator<<(ostream& out, const id<V>& m) { + out << content(m); + return out; +} + +/** + * Returns the content of an identity monad. + */ +template<typename V> const V content(const id<V>& m) { + return m.v; +} + +/** + * Return an identity monad from a value. + */ +template<typename V> const id<V> mkunit(const V& v) { + return id<V>(v); +} + +template<typename V> const lambda<id<V>(const V)> unit() { + return mkunit<V>; +} + +/** + * Bind a function to an identity monad. Pass the value in the monad to the function. + */ +template<typename R, typename V> const id<R> operator>>(const id<V>& m, const lambda<id<R>(const V)>& f) { + return f(content(m)); +} + +template<typename R, typename V> const id<R> operator>>(const id<V>& m, const id<R> (* const f)(const V)) { + return f(content(m)); +} + +/** + * Maybe monad. Used to represent an optional value, which may be there or not. + * To get the value in the monad, just cast it to the value type. + */ +template<typename V> class maybe { +public: + maybe(const V& v) : hasv(true), v(v) { + } + + maybe() : hasv(false) { + } + + const maybe<V>& operator=(const maybe<V>& m) { + if(this == &m) + return *this; + hasv = m.hasv; + if (hasv) + v = m.v; + return *this; + } + + const bool operator!=(const maybe<V>& m) const { + return !this->operator==(m); + } + + const bool operator==(const maybe<V>& m) const { + if (this == &m) + return true; + if (!hasv) + return !m.hasv; + return m.hasv && v == m.v; + } + +private: + const bool hasv; + V v; + + template<typename X> friend const bool hasContent(const maybe<X>& m); + template<typename X> friend const X content(const maybe<X>& m); +}; + +/** + * Write a maybe monad to a stream. + */ +template<typename V> ostream& operator<<(ostream& out, const maybe<V>& m) { + if (!hasContent(m)) { + out << "nothing"; + return out; + } + out << content(m); + return out; +} + +/** + * Return a maybe monad with a value in it. + */ +template<typename V> const maybe<V> mkjust(const V& v) { + return maybe<V>(v); +} + +template<typename V> const lambda<maybe<V>(const V)> just() { + return mkjust<V>; +} + +/** + * Returns true if a maybe monad contains a content. + */ +template<typename V> const bool hasContent(const maybe<V>& m) { + return m.hasv; +} + +/** + * Returns the content of a maybe monad. + */ +template<typename V> const V content(const maybe<V>& m) { + return m.v; +} + +/** + * Bind a function to a maybe monad. Passes the value in the monad to the function + * if present, or does nothing if there's no value. + */ +template<typename R, typename V> const maybe<R> operator>>(const maybe<V>& m, const lambda<maybe<R>(const V)>& f) { + if (!hasContent(m)) + return m; + return f(content(m)); +} + +template<typename R, typename V> const maybe<R> operator>>(const maybe<V>& m, const maybe<R> (* const f)(const V)) { + if (!hasContent(m)) + return m; + return f(content(m)); +} + +/** + * Failable monad. Used to represent either a success value or a failure. + * To get the value in the monad, just cast it to the value type. + * To get the failure in the monad, cast it to the failure type. + */ +template<typename V, typename F = string> class failable { +public: + failable() : hasv(false) { + } + + failable(const V& v) : hasv(true), v(v) { + } + + failable(const failable<V, F>& m) : hasv(m.hasv), v(m.v), f(m.f) { + } + + const failable<V, F>& operator=(const failable<V, F>& m) { + if (&m == this) + return *this; + hasv = m.hasv; + v = m.v; + f = m.f; + return *this; + } + + const bool operator!=(const failable<V, F>& m) const { + return !this->operator==(m); + } + + const bool operator==(const failable<V, F>& m) const { + if (this == &m) + return true; + if (!hasv) + return !m.hasv && f == m.f; + return m.hasv && v == m.v; + } + +private: + failable(const bool hasv, const F& f) : hasv(hasv), f(f) { + } + + template<typename A, typename B> friend const bool hasContent(const failable<A, B>& m); + template<typename A, typename B> friend const A content(const failable<A, B>& m); + template<typename A, typename B> friend const B reason(const failable<A, B>& m); + template<typename A, typename B> friend const failable<A, B> mkfailure(const B& f); + template<typename A> friend const failable<A, string> mkfailure(); + + bool hasv; + V v; + F f; +}; + +/** + * Write a failable monad to a stream. + */ +template<typename V, typename F> ostream& operator<<(ostream& out, const failable<V, F>& m) { + if (!hasContent(m)) { + out << reason(m); + return out; + } + out << content(m); + return out; +} + +/** + * Returns a failable monad with a success value in it. + */ +template<typename V, typename F> const failable<V, F> mksuccess(const V& v) { + return failable<V, F>(v); +} + +template<typename V, typename F> const lambda<failable<V, F>(const V)> success() { + return mksuccess<V, F>; +} + +/** + * Returns a failable monad with a failure in it. + */ +template<typename V, typename F> const failable<V, F> mkfailure(const F& f) { + debug(f, "failable::mkfailure"); + return failable<V, F>(false, f); +} + +template<typename V> const failable<V> mkfailure(const char* f) { + return mkfailure<V, string>(string(f)); +} + +template<typename V> const failable<V> mkfailure() { + return failable<V, string>(false, string()); +} + +template<typename V, typename F> const lambda<failable<V, F>(const V)> failure() { + return mkfailure<V, F>; +} + +/** + * Returns true if the monad contains a content. + */ +template<typename V, typename F> const bool hasContent(const failable<V, F>& m) { + return m.hasv; +} + +/** + * Returns the content of a failable monad. + */ +template<typename V, typename F> const V content(const failable<V, F>& m) { + return m.v; +} + +/** + * Returns the reason for failure of a failable monad. + */ +template<typename V, typename F> const F reason(const failable<V, F>& m) { + return m.f; +} + +/** + * Bind a function to a failable monad. Passes the success value in the monad to the function + * if present, or does nothing if there's no value and a failure instead. + */ +template<typename R, typename FR, typename V, typename FV> +const failable<R, FR> operator>>(const failable<V, FV>& m, const lambda<failable<R, FR>(const V)>& f) { + if (!hasContent(m)) + return m; + return f(content(m)); +} + +template<typename R, typename FR, typename V, typename FV> +const failable<R, FR> operator>>(const failable<V, FV>& m, const failable<R, FR> (* const f)(const V)) { + if (!hasContent(m)) + return m; + return f(content(m)); +} + +/** + * State + content pair data type used by the state monad. + */ +template<typename S, typename V> class scp { +public: + scp(const S& s, const V& v) : s(s), v(v) { + } + + operator const S() const { + return s; + } + + operator const V() const { + return v; + } + + const scp<S, V>& operator=(const scp<S, V>& p) { + if(this == &p) + return *this; + s = p.s; + v = p.v; + return *this; + } + + const bool operator!=(const scp<S, V>& p) const { + return !this->operator==(p); + } + + const bool operator==(const scp<S, V>& p) const { + if (this == &p) + return true; + return s == p.s && v == p.v; + } + +private: + const S s; + const V v; + + template<typename A, typename B> friend const A scpstate(const scp<A, B>& m); + template<typename A, typename B> friend const B content(const scp<A, B>& m); +}; + +/** + * Returns the state of a state-content pair. + */ +template<typename S, typename V> const S scpstate(const scp<S, V>& m) { + return m.s; +} + +/** + * Returns the content of a state-content pair. + */ +template<typename S, typename V> const S content(const scp<S, V>& m) { + return m.v; +} + +/** + * State monad. Used to represent the combination of a state and a content. + */ +template<typename S, typename V> class state { +public: + state(const lambda<scp<S, V>(const S)>& f) : f(f) { + } + + const scp<S, V> operator()(const S& s) const { + return f(s); + } + + const state<S, V>& operator=(const state<S, V>& m) { + if(this == &m) + return *this; + f = m.f; + return *this; + } + + const bool operator!=(const state<S, V>& m) const { + return !this->operator==(m); + } + + const bool operator==(const state<S, V>& m) const { + if (this == &m) + return true; + return f == m.f; + } + +private: + const lambda<scp<S, V>(const S)> f; +}; + +/** + * Write a state monad to a stream. + */ +template<typename S, typename V> ostream& operator<<(ostream& out, const state<S, V>& m) { + const S s = m; + const V v = m; + out << '(' << s << ' ' << v << ')'; + return out; +} + +/** + * Return a state monad carrying a result content. + */ +template<typename S, typename V> struct returnState { + const V v; + returnState(const V& v) : v(v) { + } + const scp<S, V> operator()(const S& s) const { + return scp<S, V>(s, v); + } +}; + +template<typename S, typename V> const state<S, V> result(const V& v) { + return state<S, V>(returnState<S, V>(v)); +} + +/** + * Return a state monad with a transformer function. + * A transformer function takes a state and returns an scp pair carrying a content and a + * new (transformed) state. + */ +template<typename S, typename V> const state<S, V> transformer(const lambda<scp<S, V>(const S)>& f) { + return state<S, V>(f); +} + +/** + * Bind a function to a state monad. The function takes a content and returns a state + * monad carrying a return content. + */ +template<typename S, typename A, typename B> struct stateBind { + const state<S, A> st; + const lambda<state<S, B>(const A)>f; + + stateBind(const state<S, A>& st, const lambda<state<S, B>(const A)>& f) : st(st), f(f) { + } + + const scp<S, B> operator()(const S& is) const { + const scp<S, A> iscp = st(is); + const state<S, B> m = f((A)iscp); + return m((S)iscp); + } +}; + +template<typename S, typename A, typename B> +const state<S, B> operator>>(const state<S, A>& st, const lambda<state<S, B>(const A)>& f) { + return state<S, B>(stateBind<S, A , B>(st, f)); +} + +template<typename S, typename A, typename B> +const state<S, B> operator>>(const state<S, A>& st, const state<S, B> (* const f)(const A)) { + return state<S, B>(stateBind<S, A , B>(st, f)); +} + +} +#endif /* tuscany_monad_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/parallel-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/parallel-test.cpp new file mode 100644 index 0000000000..2969dd0637 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/parallel-test.cpp @@ -0,0 +1,166 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test parallel functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "perf.hpp" +#include "parallel.hpp" + +namespace tuscany { + +#ifdef WANT_THREADS + +int inci = 0; + +struct incPerf { + incPerf() { + } + const bool operator()() const { + inci = inci + 1; + return true; + } +}; + +int addi = 0; + +struct addAndFetchPerf { + addAndFetchPerf() { + } + const bool operator()() const { + __sync_add_and_fetch(&addi, 1); + return true; + } +}; + +int muxi = 0; + +struct mutexPerf { + pthread_mutex_t* mutex; + mutexPerf(pthread_mutex_t* mutex) : mutex(mutex) { + } + const bool operator()() const { + pthread_mutex_lock(mutex); + muxi = muxi + 1; + pthread_mutex_unlock(mutex); + return true; + } +}; + +__thread int tlsi = 0; + +struct tlsPerf { + tlsPerf() { + } + const bool operator()() const { + tlsi = tlsi + 1; + return true; + } +}; + +bool testAtomicPerf() { + const int count = 100000; + { + const lambda<bool()> l = incPerf(); + cout << "Non-atomic inc test " << time(l, 1000, count) << " ms" << endl; + assert(inci == count + 1000); + } + { + const lambda<bool()> l = addAndFetchPerf(); + cout << "Atomic inc test " << time(l, 1000, count) << " ms" << endl; + assert(addi == count + 1000); + } + { + pthread_mutex_t mutex; + pthread_mutex_init(&mutex, NULL); + const lambda<bool()> l = mutexPerf(&mutex); + cout << "Locked inc test " << time(l, 1000, count) << " ms" << endl; + assert(muxi == count + 1000); + pthread_mutex_destroy(&mutex); + } + { + const lambda<bool()> l = tlsPerf(); + cout << "Thread local inc test " << time(l, 1000, count) << " ms" << endl; + assert(tlsi == count + 1000); + } + return true; +} + +const int mtsquare(const int x) { + for(int i = 0; i < 10000000; i++) + ; + return x * x; +} + +bool checkResults(const list<future<int> > r, int i) { + if (isNil(r)) + return true; + assert(car(r) == i * i); + checkResults(cdr(r), i + 1); + return true; +} + +const list<future<int> > submitSquares(worker& w, const int max, const int i) { + if (i == max) + return list<future<int> >(); + const lambda<int()> func = curry(lambda<int(const int)> (mtsquare), i); + return cons(submit(w, func), submitSquares(w, max, i + 1)); +} + +bool testWorker() { + worker w(20); + { + const lambda<int()> func = curry(lambda<int(const int)> (mtsquare), 2); + assert(submit(w, func) == 4); + } + { + const int max = 20; + const list<future<int> > r(submitSquares(w, max, 0)); + checkResults(r, 0); + } + shutdown(w); + return true; +} + +#endif + +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + +#ifdef WANT_THREADS + tuscany::testAtomicPerf(); + tuscany::testWorker(); +#else + tuscany::cout << "Skipped multi-thread tests" << tuscany::endl; +#endif + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/kernel/parallel.hpp b/sca-cpp/branches/cpp-contrib/kernel/parallel.hpp new file mode 100644 index 0000000000..09cf0df9a3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/parallel.hpp @@ -0,0 +1,319 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_parallel_hpp +#define tuscany_parallel_hpp + +/** + * Simple parallel work execution functions. + */ + +#ifdef WANT_THREADS +#include <pthread.h> +#include <sys/syscall.h> +#include <unistd.h> +#endif + +#include "function.hpp" +#include "list.hpp" + +namespace tuscany { + +#ifdef WANT_THREADS + +/** + * Returns the current thread id. + */ +unsigned int threadId() { + return syscall(__NR_gettid); +} + +/** + * Represents a value which will be know in the future. + */ +template<typename T> class future { + +private: + template<typename X> class futureValue { + public: + futureValue() : hasValue(false) { + pthread_mutex_init(&valueMutex, NULL); + pthread_cond_init(&valueCond, NULL); + } + + futureValue(const futureValue& fv) : valueMutex(fv.valueMutex), valueCond(fv.valueCond), hasValue(fv.hasValue), value(fv.value) { + } + + ~futureValue() { + //pthread_mutex_destroy(&valueMutex); + //pthread_cond_destroy(&valueCond); + } + + bool set(const T& v) { + pthread_mutex_lock(&valueMutex); + if(hasValue) { + pthread_mutex_unlock(&valueMutex); + return false; + } + hasValue = true; + value = v; + pthread_mutex_unlock(&valueMutex); + pthread_cond_broadcast(&valueCond); + return true; + } + + const T get() { + pthread_mutex_lock(&valueMutex); + while(!hasValue) { + pthread_cond_wait(&valueCond, &valueMutex); + } + const T& v = value; + pthread_mutex_unlock(&valueMutex); + return v; + } + + private: + pthread_mutex_t valueMutex; + pthread_cond_t valueCond; + bool hasValue; + X value; + }; + + gc_ptr<futureValue<T> > fvalue; + + template<typename X> friend const X get(const future<X>& f); + template<typename X> friend bool set(const future<X>& f, const X& v); + +public: + future() : fvalue(new (gc_new<futureValue<T> >()) futureValue<T>()) { + } + + ~future() { + } + + future(const future& f) : fvalue(f.fvalue) { + } + + const future& operator=(const future& f) { + if (&f == this) + return *this; + fvalue = f.fvalue; + return *this; + } + + const future& operator=(const T& v) const { + fvalue->set(v); + return *this; + } + + operator const T() const { + return fvalue->get(); + } +}; + +/** + * A bounded thread safe queue. + */ +template<typename T> class wqueue { +public: + wqueue(int max) : max(max), size(0), tail(0), head(0), values(new (gc_anew<T>(max)) T[max]) { + pthread_mutex_init(&mutex, NULL); + pthread_cond_init(&full, NULL); + pthread_cond_init(&empty, NULL); + } + + wqueue(const wqueue& wq) : max(wq.max), size(wq.size), tail(wq.tail), head(wq.head), mutex(wq.mutex), full(wq.full), empty(wq.empty), values(wq.values) { + } + + ~wqueue() { + //pthread_mutex_destroy(&mutex); + //pthread_cond_destroy(&full); + //pthread_cond_destroy(&empty); + } + +private: + const int max; + int size; + int tail; + int head; + pthread_mutex_t mutex; + pthread_cond_t full; + pthread_cond_t empty; + gc_ptr<T> values; + + template<typename X> friend const int enqueue(wqueue<X>& q, const X& v); + template<typename X> friend const X dequeue(wqueue<X>& q); +}; + +/** + * Adds an element to the tail of the queue. + */ +template<typename T> const int enqueue(wqueue<T>&q, const T& v) { + pthread_mutex_lock(&q.mutex); + while(q.size == q.max) + pthread_cond_wait(&q.full, &q.mutex); + q.values[q.tail] = v; + q.tail = (q.tail + 1) % q.max; + q.size++; + pthread_mutex_unlock(&q.mutex); + pthread_cond_broadcast(&q.empty); + return q.size; +} + +/** + * Returns the element at the head of the queue. + */ +template<typename T> const T dequeue(wqueue<T>& q) { + pthread_mutex_lock(&q.mutex); + while(q.size == 0) + pthread_cond_wait(&q.empty, &q.mutex); + const T v = q.values[q.head]; + q.head = (q.head + 1) % q.max; + q.size--; + pthread_mutex_unlock(&q.mutex); + pthread_cond_broadcast(&q.full); + return v; +} + +/** + * The worker thread function. + */ +void *workerThreadFunc(void *arg) { + int ost; + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &ost); + int ot; + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &ot); + + wqueue<lambda<bool()> >* work = reinterpret_cast<wqueue<lambda<bool()> >*>(arg); + while(dequeue(*work)()) + ; + return NULL; +} + +/** + * Returns a list of worker threads. + */ +const list<pthread_t> workerThreads(wqueue<lambda<bool()> >& wqueue, const int count) { + if (count == 0) + return list<pthread_t>(); + pthread_t thread; + pthread_create(&thread, NULL, workerThreadFunc, &wqueue); + return cons(thread, workerThreads(wqueue, count - 1)); +} + +/** + * A worker, implemented with a work queue and a pool of threads. + */ +class worker { +private: + + // The worker holds a reference to a sharedWorker, to avoid non-thread-safe + // copies of the queue and thread pool when a worker is copied + class sharedWorker { + public: + sharedWorker(int max) : work(wqueue<lambda<bool()> >(max)), threads(workerThreads(work, max)) { + } + + wqueue<lambda<bool()> > work; + const list<pthread_t> threads; + }; + +public: + worker(int max) : w(*(new (gc_new<sharedWorker>()) sharedWorker(max))) { + } + + worker(const worker& wk) : w(wk.w) { + } + +private: + sharedWorker& w; + + template<typename X> friend const future<X> submit(worker& w, const lambda<X()>& func); + friend const bool shutdown(worker& w); + friend const bool cancel(worker& w); +}; + +/** + * Function used to wrap work submitted to a worker. + */ +template<typename R> bool submitFunc(const lambda<R()>& func, const future<R>& fut) { + fut = func(); + return true; +} + +/** + * Submits work to a worker. + */ +template<typename R> const future<R> submit(worker& w, const lambda<R()>& func) { + const future<R> fut; + const lambda<bool()> f = curry(lambda<bool(const lambda<R()>, future<R>)>(submitFunc<R>), func, fut); + enqueue(w.w.work, f); + return fut; +} + +/** + * Enqueues shutdown requests. + */ +const bool shutdownEnqueue(const list<pthread_t>& threads, wqueue<lambda<bool()> >& work) { + if (isNil(threads)) + return true; + enqueue(work, result(false)); + return shutdownEnqueue(cdr(threads), work); +} + +/** + * Waits for shut down threads to terminate. + */ +const bool shutdownJoin(const list<pthread_t>& threads) { + if (isNil(threads)) + return true; + pthread_join(car(threads), NULL); + return shutdownJoin(cdr(threads)); +} + +/** + * Shutdown a worker. + */ +const bool shutdown(worker& w) { + shutdownEnqueue(w.w.threads, w.w.work); + shutdownJoin(w.w.threads); + return true; +} + +/** + * Cancel a worker. + */ +const bool cancel(const list<pthread_t>& threads) { + if (isNil(threads)) + return true; + pthread_cancel(car(threads)); + return cancel(cdr(threads)); +} + +const bool cancel(worker& w) { + cancel(w.w.threads); + return true; +} + +#endif + +} +#endif /* tuscany_parallel_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/perf.hpp b/sca-cpp/branches/cpp-contrib/kernel/perf.hpp new file mode 100644 index 0000000000..f5004d015b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/perf.hpp @@ -0,0 +1,68 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_perf_hpp +#define tuscany_perf_hpp + +/** + * Functions to help measure performance. + */ + +#include <sys/time.h> +#include <time.h> + +#include "function.hpp" + +namespace tuscany +{ + +/** + * Measure the time required to perform a function in msec. + */ +struct timeLambda { + const lambda<bool()> f; + timeLambda(const lambda<bool()>& f) : f(f) { + } + bool operator()(const long count) const { + if (count == 0) + return true; + f(); + (*this)(count - 1); + return true; + } +}; + +const double time(const lambda<bool()>& f, const long warmup, const long count) { + const lambda<bool(long)> tl = timeLambda(f); + struct timeval start; + struct timeval end; + + tl(warmup); + gettimeofday(&start, NULL); + tl(count); + gettimeofday(&end, NULL); + + const long t = (end.tv_sec * 1000 + end.tv_usec / 1000) - (start.tv_sec * 1000 + start.tv_usec / 1000); + return (double)t / (double)count; +} + +} +#endif /* tuscany_perf_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/sstream.hpp b/sca-cpp/branches/cpp-contrib/kernel/sstream.hpp new file mode 100644 index 0000000000..f5006606dd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/sstream.hpp @@ -0,0 +1,240 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_sstream_hpp +#define tuscany_sstream_hpp + +/** + * Char buffer based streams. + */ + +#include <stdio.h> +#include <stdarg.h> +#include <memory.h> +#include "string.hpp" +#include "stream.hpp" +#include "list.hpp" + +namespace tuscany { + +/** + * Instrumentable memcpy. + */ +void* stream_memcpy(void* t, const void* s, const size_t n) { + return memcpy(t, s, n); +} + +/** + * Output stream backed by a char buffer. + */ +class ostringstream : public ostream { +public: + ostringstream() : len(0) { + } + + ~ostringstream() { + } + + ostringstream(const ostringstream& os) { + len = os.len; + buf = os.buf; + } + + ostringstream& vprintf(const char* fmt, ...) { + va_list args; + va_start (args, fmt); + string s; + s.len = vsnprintf(NULL, 0, fmt, args); + s.buf = gc_cnew(s.len + 1); + vsnprintf(s.buf, s.len + 1, fmt, args); + buf = cons(s, buf); + len += s.len; + va_end (args); + return *this; + } + + ostringstream& write(const string& s) { + buf = cons(s, buf); + len += s.len; + return *this; + } + + ostringstream& flush() { + return *this; + } + +private: + static const bool strHelper(const list<string> l, char* buf) { + if (isNil(l)) + return true; + const string c = car(l); + char* b = buf - length(c); + memcpy(b, c_str(c), length(c)); + return strHelper(cdr(l), b); + } + + const string str() { + if (isNil(buf)) + return string(); + string s; + s.len = len; + s.buf = gc_cnew(s.len + 1); + strHelper(buf, s.buf + len); + s.buf[s.len] = '\0'; + return s; + } + + friend const string str(ostringstream& os); + + int len; + list<string> buf; +}; + +/** + * Return a string representation of a stream. + */ +const string str(ostringstream& os) { + return os.str(); +} + +/** + * Input stream backed by a char buffer + */ +class istringstream : public istream { +public: + istringstream(const string& s) { + cur = 0; + const int slen = length(s); + len = slen; + buf = c_str(s); + } + + ~istringstream() { + } + + istringstream(const istringstream& is) { + len = is.len; + cur = is.cur; + buf = is.buf; + } + + const int read(void* b, int size) { + const int n = len - cur; + if (n == 0) + return 0; + if (n > size) { + stream_memcpy(b, buf + cur, size); + cur = cur + size; + return size; + } + stream_memcpy(b, buf + cur, n); + cur = cur + n; + return n; + } + + const bool eof() { + return cur == len; + } + + const bool fail() { + return false; + } + + const int get() { + if (eof()) + return -1; + const int c = buf[cur]; + cur += 1; + return c; + } + + const int peek() { + if (eof()) + return -1; + return buf[cur]; + } + +private: + int len; + int cur; + const char* buf; +}; + +/** + * Tokenize a string into a list of strings. + */ +const list<string> tokenize(const char* sep, const string& str) { + struct nested { + static const list<string> tokenize(const char* sep, const string& str, const int start = 0) { + if (start >= length(str)) + return list<string>(); + const int i = find(str, sep, start); + if (i == length(str)) + return mklist(string(substr(str, start))); + return cons(string(substr(str, start, i - start)), tokenize(sep, str, i + 1)); + } + }; + return nested::tokenize(sep, str, 0); +} + +/** + * Returns a lazy list view of an input stream. + */ +struct ilistRead{ + istream &is; + ilistRead(istream& is) : is(is) { + } + const list<string> operator()() { + char buffer[1024]; + const int n = read(is, buffer, sizeof(buffer)); + if (n ==0) + return list<string>(); + return cons(string(buffer, n), (*this)()); + } +}; + +const list<string> streamList(istream& is) { + return ilistRead(is)(); +} + +/** + * Fragment the first element of a list of strings to fit the given max length. + */ +const list<string> fragment(list<string> l, int max) { + const string s = car(l); + if (length(s) <= max) + return l; + return cons(substr(s, 0, max), cons(substr(s, max), cdr(l))); +} + +/** + * Write a list of strings to an output stream. + */ +ostream& write(const list<string>& l, ostream& os) { + if(isNil(l)) + return os; + os << car(l); + return write(cdr(l), os); +} + +} + +#endif /* tuscany_sstream_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/stream.hpp b/sca-cpp/branches/cpp-contrib/kernel/stream.hpp new file mode 100644 index 0000000000..32b754f315 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/stream.hpp @@ -0,0 +1,200 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_stream_hpp +#define tuscany_stream_hpp + +/** + * Basic stream type and functions. + */ + +#include <stdarg.h> +#include "config.hpp" +#include "gc.hpp" +#include "string.hpp" + +namespace tuscany { + +/** + * Base output stream. + */ +class ostream { +public: + virtual ostream& vprintf(const char* fmt, ...) = 0; + virtual ostream& write(const string& s) = 0; + virtual ostream& flush() = 0; +}; + +/** + * Flush a stream. + */ +ostream& flush(ostream& os) { + return os.flush(); +} + +/** + * Write simple values to a stream. + */ +ostream& operator<<(ostream& os, const char* v) { + return os.vprintf("%s", v); +} + +ostream& operator<<(ostream& os, const unsigned char* v) { + return os.vprintf("%s", v); +} + +ostream& operator<<(ostream& os, const char v) { + return os.vprintf("%c", v); +} + +ostream& operator<<(ostream& os, const int v) { + return os.vprintf("%d", v); +} + +ostream& operator<<(ostream& os, const unsigned int v) { + return os.vprintf("%u", v); +} + +ostream& operator<<(ostream& os, const long int v) { + return os.vprintf("%ld", v); +} + +ostream& operator<<(ostream& os, const long unsigned int v) { + return os.vprintf("%lu", v); +} + +ostream& operator<<(ostream& os, const double v) { + return os.vprintf("%g", v); +} + +ostream& operator<<(ostream& os, const void* v) { + return os.vprintf("%p", v); +} + +ostream& operator<<(ostream& os, const string& v) { + return os.write(v); +} + +class stream_endl { +} endl; + +ostream& operator<<(ostream& os, unused const stream_endl e) { + os.vprintf("%s", "\n"); + return os.flush(); +} + +/* + * Input stream. + */ +class istream { +public: + virtual const int read(void* buf, int size) = 0; + virtual const bool eof() = 0; + virtual const bool fail() = 0; + virtual const int get() = 0; + virtual const int peek() = 0; +}; + +/** + * Read from an input stream. + */ +const int read(istream& is, void * buf, int size) { + return is.read(buf, size); +} + +/** + * Return true if the end of an input stream has been reached. + */ +const bool eof(istream& is) { + return is.eof(); +} + +/** + * Return true if an input stream can't be accessed. + */ +const bool fail(istream& is) { + return is.fail(); +} + +/** + * Read a character from a stream. + */ +const int get(istream& is) { + return is.get(); +} + +/** + * Peek a character from a stream. + */ +const int peek(istream& is) { + return is.peek(); +} + +template<typename T> ostream& operator<<(ostream& out, const gc_ptr<T>& p) { + return out << p.ptr; +} + +#ifdef WANT_MAINTAINER_MODE + +/** + * Debug stream implementation with no dependencies on anything else. + */ +class odebugstream : public ostream { +public: + odebugstream() { + } + + odebugstream& vprintf(const char* fmt, ...) { + va_list args; + va_start (args, fmt); + string s; + s.len = vsnprintf(NULL, 0, fmt, args); + s.buf = gc_cnew(s.len + 1); + vsnprintf(s.buf, s.len + 1, fmt, args); + buf = buf + s; + va_end (args); + return *this; + } + + odebugstream& write(const string& s) { + buf = buf + s; + return *this; + } + + odebugstream& flush() { + return *this; + } + +private: + friend const string str(odebugstream& os); + + string buf; +}; + +const string str(odebugstream& os) { + return os.buf; +} + +#endif + +} + +#endif /* tuscany_stream_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/string-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/string-test.cpp new file mode 100644 index 0000000000..323756c7e4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/string-test.cpp @@ -0,0 +1,196 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test string functions. + */ + +#include <assert.h> +#include <string> +#include "sstream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "perf.hpp" + +namespace tuscany { + +bool testCopies() { + resetStringCopyCounters(); + string x("abcd"); + assert(checkStringCopyCounters(1)); + resetStringCopyCounters(); + string y = string("abcd"); + assert(checkStringCopyCounters(1)); + resetStringCopyCounters(); + string z = y; + assert(checkStringCopyCounters(0)); + resetStringCopyCounters(); + const list<string> pl = list<string>() + "abcd" + "efgh"; + printStringCopyCounters(); + resetStringCopyCounters(); + const list<string> cl = cons<string>("efgh", mklist<string>("abcd")); + printStringCopyCounters(); + return true; +} + +bool testString() { + const string s("abcd"); + assert(length(s) == 4); + assert(!strcmp(c_str(s), "abcd")); + + assert(s == "abcd"); + assert(s == string("abcd")); + assert(s != "zbcd"); + + assert(s < "zbcd"); + assert(s < "zbc"); + assert(s < "abzd"); + assert(s < "abcdz"); + + assert(s > "Abcd"); + assert(s > "Abc"); + assert(s > "abCd"); + assert(s > "Abcdz"); + + const string x = "abcd"; + assert(!strcmp(c_str(x), "abcd")); + + const string y = string("abcd"); + assert(!strcmp(c_str(y), "abcd")); + + assert(string("ab") + "cd" == "abcd"); + + assert(find("abcd", "cd") == 2); + assert(find("abcd", "xy") == length("abcd")); + assert(substr("abcdef", 4) == "ef"); + assert(substr("abcdef", 4, 2) == "ef"); + assert(substr("abcdef", 4, 3) == "ef"); + assert(substr("abcdef", 6, 3) == ""); + return true; +} + +bool testStream() { + ostringstream os; + os << "ab" << "cd"; + cout << str(os) << endl; + assert(str(os) == "abcd"); + + ostringstream cs; + cs << "\'"; + assert(str(cs) == "\'"); + cs << '\''; + assert(str(cs) == "\'\'"); + + istringstream is("abcd"); + char b[2]; + assert(read(is, b, 2) == 2); + assert(string("ab") == string(b, 2)); + assert(eof(is) == false); + assert(read(is, b, 2) == 2); + assert(string("cd") == string(b, 2)); + assert(eof(is) == true); + assert(read(is, b, 2) == 0); + return true; +} + +std::string stdAdd(std::string& x, std::string& y) { + return x + y; +} + +string add(string& x, string& y) { + return x + y; +} + +char charBuffer[16384]; + +struct addStrings{ + const int size; + addStrings(const int size) : size(size) { + } + bool operator()() const { + const int sz = size / 4; + string x(charBuffer, sz); + string y(charBuffer, sz); + assert(length(add(x, y)) == sz * 2); + return true; + } +}; + +struct addStdStrings{ + const int size; + addStdStrings(const int size) : size(size) { + } + bool operator()() const { + const int sz = size / 4; + std::string x(charBuffer, sz); + std::string y(charBuffer, sz); + assert(stdAdd(x, y).length() == (unsigned int)(sz * 2)); + return true; + } +}; + +bool testStringPerf() { + memset(charBuffer, 'A', 16384); + charBuffer[16384] = '\0'; + + const int count = 100000; + { + const lambda<bool()> a16 = addStrings(16); + cout << "string test " << time(a16, 5, count) << " ms" << endl; + const lambda<bool()> a32 =addStrings(32); + cout << "string test " << time(a32, 5, count) << " ms" << endl; + const lambda<bool()> a256 =addStrings(256); + cout << "string test " << time(a256, 5, count) << " ms" << endl; + const lambda<bool()> a1024 =addStrings(1024); + cout << "string test " << time(a1024, 5, count) << " ms" << endl; + const lambda<bool()> a4096 =addStrings(4096); + cout << "string test " << time(a4096, 5, count) << " ms" << endl; + } + { + const lambda<bool()> a16 =addStdStrings(16); + cout << "Std string test " << time(a16, 5, count) << " ms" << endl; + const lambda<bool()> a32 =addStdStrings(32); + cout << "Std string test " << time(a32, 5, count) << " ms" << endl; + const lambda<bool()> a256 =addStdStrings(256); + cout << "Std string test " << time(a256, 5, count) << " ms" << endl; + const lambda<bool()> a1024 =addStdStrings(1024); + cout << "Std string test " << time(a1024, 5, count) << " ms" << endl; + const lambda<bool()> a4096 =addStdStrings(4096); + cout << "Std string test " << time(a4096, 5, count) << " ms" << endl; + } + + return true; +} + +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::testCopies(); + tuscany::testString(); + tuscany::testStream(); + tuscany::testStringPerf(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/kernel/string.hpp b/sca-cpp/branches/cpp-contrib/kernel/string.hpp new file mode 100644 index 0000000000..931417e430 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/string.hpp @@ -0,0 +1,291 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_string_hpp +#define tuscany_string_hpp + +/** + * Simple and fast string type backed by a char buffer + */ + +#include <assert.h> +#include <string.h> +#include <memory.h> +#include <stdio.h> +#include "gc.hpp" + +namespace tuscany { + +#ifdef WANT_MAINTAINER_MODE + +/** + * Debug utilities. Counters used to track string copies. + */ +long countStringCopies = 0; + +bool resetStringCopyCounters() { + countStringCopies = 0; + return true; +} + +bool checkStringCopyCounters(long c) { + return countStringCopies == c; +} + +bool printStringCopyCounters() { + printf("countStringCopies %ld\n", countStringCopies); + return true; +} + +#else + +#define resetStringCopyCounters() +#define checkStringCopyCounters(c) true +#define printStringCopyCounters() + +#endif + +/** + * Instrumented memcpy. + */ +void* string_memcpy(void* t, const void* s, const size_t n) { +#ifdef WANT_MAINTAINER_MODE + countStringCopies += 1; +#endif + return memcpy(t, s, n); +} + +char stringEmptyBuffer[1] = { '\0' }; + +/** + * String class. The maximum string size is specified as a template parameter. + */ +class string { +public: + string() : len(0) { + buf = stringEmptyBuffer; + } + + string(const char* s) { + len = strlen(s); + if (len == 0) { + buf = stringEmptyBuffer; + return; + } + buf = gc_cnew(len + 1); + string_memcpy(buf, s, len + 1); + } + + string(const char* s, const int n) { + len = n; + if (len == 0) { + buf = stringEmptyBuffer; + return; + } + buf = gc_cnew(len + 1); + string_memcpy(buf, s, len); + buf[len] = '\0'; + } + + string(const int n, const char c) { + len = n; + if (len == 0) { + buf = stringEmptyBuffer; + return; + } + buf = gc_cnew(len + 1); + memset(buf, c, n); + buf[len] = '\0'; + } + + string(const string& s) { + len = s.len; + buf = s.buf; + } + + const string& operator=(const string& s) { + if (&s == this) + return *this; + len = s.len; + buf = s.buf; + return *this; + } + + const bool operator==(const string& s) const { + if (len != s.len) + return false; + if (buf == s.buf) + return true; + return memcmp(buf, s.buf, len) == 0; + } + + const bool operator!=(const string& s) const { + return !(*this == s); + } + + const bool operator==(const char* s) const { + if (buf == s) + return true; + return strcmp(buf, s) == 0; + } + + const bool operator!=(const char* s) const { + return !(*this == s); + } + + const bool operator<(const string& s) const { + const int n = len < s.len? len : s.len; + const int c = memcmp(buf, s.buf, n); + if (c < 0) + return true; + if (c == 0) + return len < s.len; + return false; + } + + const bool operator>(const string& s) const { + const int n = len < s.len? len : s.len; + int c = memcmp(buf, s.buf, n); + if (c > 0) + return true; + if (c == 0) + return len > s.len; + return false; + } + +private: +#ifdef WANT_MAINTAINER_MODE + friend class odebugstream; +#endif + friend class ostringstream; + friend const string operator+(const string& a, const string& b); + friend const string operator+(const string& a, const char* b); + friend const int length(const string& s); + friend const char* c_str(const string& s); + friend const int find(const string& s1, const char* s2, const int start); + friend const string substr(const string& s, const int pos, const int n); + + int len; + char* buf; +}; + +/** + * Adds two strings. + */ +const string operator+(const string& a, const string& b) { + string s; + s.len = a.len + b.len; + s.buf = gc_cnew(s.len + 1); + string_memcpy(s.buf, a.buf, a.len); + string_memcpy(s.buf + a.len, b.buf, b.len); + s.buf[s.len] = '\0'; + return s; +} + +const string operator+(const string& a, const char* b) { + string s; + const int blen = strlen(b); + s.len = a.len + blen; + s.buf = gc_cnew(s.len + 1); + string_memcpy(s.buf, a.buf, a.len); + string_memcpy(s.buf + a.len, b, blen); + s.buf[s.len] = '\0'; + return s; +} + +/** + * Returns the length of a string. + */ +const int length(const string& s) { + return s.len; +} + +/** + * Returns a string as a C zero terminated string. + */ +const char* c_str(const string& s) { + return s.buf; +} + +/** + * Find the first occurrence of string s2 in s1, starting at the given position. + */ +const int find(const string& s1, const char* s2, const int start) { + if (start >= s1.len) + return s1.len; + const char *f = strstr(s1.buf + start, s2); + if (f == NULL) + return s1.len; + return f - s1.buf; +} + +const int find(const string& s1, const char* s2) { + return find(s1, s2, 0); +} + +const bool contains(const string& s1, const char* s2) { + return find(s1, s2) != length(s1); +} + +/** + * Find the first occurence of any character from a string in a string. + */ +const int find_first_of(const string& s1, const string& s2) { + return strcspn(c_str(s1), c_str(s2)); +} + +/** + * Find the last occurence of a character in a string. + */ +const int find_last(const string& s, const char c) { + const char* cs = c_str(s); + const char* f = strrchr(cs, c); + if (f == NULL) + return length(s); + return f - cs; +} + +/** + * Return a substring of a string. + */ +const string substr(const string& s, const int pos, const int n) { + if (pos >= s.len) + return string(); + if (pos + n > s.len) + return string(s.buf + pos, s.len - pos); + return string(s.buf + pos, n); +} + +const string substr(const string& s, const int pos) { + return substr(s, pos, length(s)); +} + +/** + * Common string constants. + */ + +string trueString("true"); +string falseString("false"); +string emptyString(""); + +} + +#endif /* tuscany_string_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/tree.hpp b/sca-cpp/branches/cpp-contrib/kernel/tree.hpp new file mode 100644 index 0000000000..436385aa1b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/tree.hpp @@ -0,0 +1,125 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_tree_hpp +#define tuscany_tree_hpp + +/** + * Functions to work with trees. + */ + +#include "stream.hpp" +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "monad.hpp" +#include "value.hpp" + +namespace tuscany { + +/** + * Make a tree from a leaf and two branches. + */ +template<typename T> const list<T> mktree(const T& e, const list<T>& left, const list<T>& right) { + return mklist<T>(e, left, right); +} + +/** + * Find a leaf with the given key in a tree. + */ +template<typename T> const list<T> assoctree(const T& k, const list<T>& tree) { + if (isNil(tree)) + return tree; + if (k == car<T>(car(tree))) + return car(tree); + if (k < car<T>(car(tree))) + return assoctree<T>(k, cadr(tree)); + return assoctree<T>(k, caddr(tree)); +} + +/** + * Construct a new tree from a leaf and a tree. + */ +template<typename T> const list<T> constree(const T& e, const list<T>& tree) { + if (isNil(tree)) + return mktree(e, list<T>(), list<T>()); + if (e == car(tree)) + return tree; + if (e < car(tree)) + return mktree<T>(car(tree), constree<T>(e, cadr(tree)), caddr(tree)); + return mktree<T>(car(tree), cadr(tree), constree<T>(e, caddr(tree))); +} + +/** + * Make a tree from an unordered list of leaves. + */ +template<typename T> const list<T> mktree(const list<T>& l) { + if (isNil(l)) + return l; + return constree(car(l), mktree(cdr(l))); +} + +/** + * Convert a tree to an ordered list of leaves. + */ +template<typename T> const list<T> flatten(const list<T>& tree) { + if (isNil(tree)) + return tree; + return append<T>(flatten<T>(cadr(tree)), cons<T>(car(tree), flatten<T>(caddr(tree)))); +} + +/** + * Sort a list. + */ +template<typename T> const list<T> sort(const list<T>& l) { + return flatten(mktree(l)); +} + +/** + * Make a balanced tree from an ordered list of leaves. + */ +template<typename T> const list<T> btreeHelper(const list<T>& elements, const int n) { + if (n == 0) + return cons<T>(list<T>(), elements); + const int leftSize = (n - 1) / 2; { + const list<T> leftResult = btreeHelper<T>(elements, leftSize); { + const list<T> leftTree = car(leftResult); + const list<T> nonLeftElements = cdr(leftResult); + const int rightSize = n - (leftSize + 1); { + const T thisEntry = car(nonLeftElements); + const list<T> rightResult = btreeHelper<T>(cdr(nonLeftElements), rightSize); { + const list<T> rightTree = car(rightResult); + const list<T> remainingElements = cdr(rightResult); { + return cons<T>(mktree<T>(thisEntry, leftTree, rightTree), remainingElements); + } + } + } + } + } +} + +template<typename T> const list<T> mkbtree(const list<T>& elements) { + return car(btreeHelper<T>(elements, length(elements))); +} + +} + +#endif /* tuscany_tree_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/value.hpp b/sca-cpp/branches/cpp-contrib/kernel/value.hpp new file mode 100644 index 0000000000..87d80a3e2a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/value.hpp @@ -0,0 +1,593 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_value_hpp +#define tuscany_value_hpp + +/** + * Generic value type. + */ + +#include <stdlib.h> +#include "string.hpp" +#include "sstream.hpp" +#include "gc.hpp" +#include "function.hpp" +#include "list.hpp" +#include "monad.hpp" + +namespace tuscany +{ + +#ifdef WANT_MAINTAINER_MODE + +/** + * Debug utilities. Counters used to track instances of values, and + * macro used to write the contents of a value in a string, easier to + * watch in a debugger than the value itself. + */ +long int countValues = 0; +long int countEValues = 0; +long int countCValues = 0; +long int countVValues = 0; + +bool resetValueCounters() { + countValues = countEValues = countCValues = countVValues = 0; + return true; +} + +bool checkValueCounters() { + return countValues == 0; +} + +bool printValueCounters() { + cout << "countValues " << countValues << endl; + cout << "countEValues " << countEValues << endl; + cout << "countCValues " << countCValues << endl; + cout << "countVValues " << countVValues << endl; + return true; +} + +#else + +#define resetValueCounters() +#define checkValueCounters() true +#define printValueCounters() + +#endif + +#ifdef WANT_MAINTAINER_WATCH + +#define debug_watchValue() do { \ + this->watch = watchValue(*this); \ + } while (0) + +#else + +#define debug_watchValue() + +#endif + +class value; + +class value { +public: + + enum ValueType { + Undefined, Symbol, String, List, Number, Bool, Lambda, Ptr + }; + + value() : type(value::Undefined) { + debug_inc(countValues); + debug_inc(countEValues); + debug_watchValue(); + } + + value(const value& v) { + debug_inc(countValues); + debug_inc(countCValues); + type = v.type; + switch(type) { + case value::List: + lst() = v.lst(); + case value::Lambda: + func() = v.func(); + case value::Symbol: + str() = v.str(); + case value::String: + str() = v.str(); + case value::Number: + num() = v.num(); + case value::Bool: + boo() = v.boo(); + case value::Ptr: + ptr() = v.ptr(); + default: + break; + } +#ifdef WANT_MAINTAINER_WATCH + watch = v.watch; +#endif + } + + virtual ~value() { + debug_dec(countValues); + } + + value(const lambda<value(const list<value>&)>& func) : type(value::Lambda), data(vdata(func)) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const string& str) : type(value::String), data(vdata(result(str))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const char* str) : type(value::Symbol), data(vdata(result(string(str)))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const list<value>& lst) : type(value::List), data(vdata(result(lst))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const list<list<value> >& l) : type(value::List), data(vdata(result(listOfValues(l)))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const double num) : type(value::Number), data(vdata(result(num))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const int num) : type(value::Number), data(vdata(result((double)num))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const bool boo) : type(value::Bool), data(vdata(result(boo))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const gc_ptr<value> ptr) : type(value::Ptr), data(vdata(result(ptr))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const failable<value>& m) : type(value::List), + data(vdata(result(hasContent(m)? mklist<value>(content(m)) : mklist<value>(value(), reason(m))))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + value(const maybe<value>& m) : type(value::List), + data(vdata(result(hasContent(m)? mklist<value>(content(m)) : list<value>()))) { + debug_inc(countValues); + debug_inc(countVValues); + debug_watchValue(); + } + + const value& operator=(const value& v) { + if(this == &v) + return *this; + type = v.type; + switch(type) { + case value::List: + lst() = v.lst(); + case value::Lambda: + func() = v.func(); + case value::Symbol: + str() = v.str(); + case value::String: + str() = v.str(); + case value::Number: + num() = v.num(); + case value::Bool: + boo() = v.boo(); + case value::Ptr: + ptr() = v.ptr(); + default: + break; + } +#ifdef WANT_MAINTAINER_WATCH + watch = v.watch; +#endif + return *this; + } + + const bool operator!=(const value& v) const { + return !this->operator==(v); + } + + const bool operator==(const value& v) const { + if(this == &v) + return true; + switch(type) { + case value::Undefined: + return true; + case value::List: + return v.type == value::List && lst()() == v.lst()(); + case value::Lambda: + return v.type == value::Lambda && func() == v.func(); + case value::Symbol: + case value::String: + return str()() == (string)v; + case value::Number: + return num()() == (double)v; + case value::Bool: + return boo()() == (bool)v; + case value::Ptr: + return v.type == value::Ptr && ptr()() == v.ptr()(); + default: + return false; + } + } + + const bool operator<(const value& v) const { + if(this == &v) + return false; + switch(type) { + case value::List: + return v.type == value::List && lst()() < v.lst()(); + case value::Symbol: + case value::String: + return str()() < (string)v; + case value::Bool: + return boo()() < (bool)v; + case value::Number: + return num()() < (double)v; + default: + return false; + } + } + + const bool operator>(const value& v) const { + if(this == &v) + return false; + switch(type) { + case value::List: + return v.type == value::List && lst()() > v.lst()(); + case value::Symbol: + case value::String: + return str()() > (string)v; + case value::Bool: + return boo()() > (bool)v; + case value::Number: + return num()() > (double)v; + default: + return false; + } + } + + const value operator()(const list<value>& args) const { + return func()(args); + } + + operator const string() const { + switch(type) { + case value::Symbol: + case value::String: + return str()(); + case value::Number: { + ostringstream os; + os << num()(); + return tuscany::str(os); + } + case value::Bool: + return boo()()? trueString : falseString; + default: + return emptyString; + } + } + + operator const double() const { + switch(type) { + case value::Symbol: + case value::String: + return atof(c_str(str()())); + case value::Number: + return (double)num()(); + case value::Bool: + return boo()()? 1.0 : 0.0; + default: + return 0.0; + } + } + + operator const int() const { + switch(type) { + case value::Symbol: + case value::String: + return atoi(c_str(str()())); + case value::Number: + return (int)num()(); + case value::Bool: + return boo()()? 1 : 0; + default: + return 0; + } + } + + operator const bool() const { + switch(type) { + case value::Symbol: + case value::String: + return str()() == string("true"); + case value::Number: + return (int)num()() != 0; + case value::Bool: + return boo()(); + default: + return 0; + } + } + + operator const gc_ptr<value>() const { + return ptr()(); + } + + operator const list<value>() const { + return lst()(); + } + + operator const list<list<value> >() const { + return listOfListOfValues(lst()()); + } + + operator const lambda<value(const list<value>&)>() const { + return func(); + } + +private: + template<typename T> lambda<T>& vdata() const { + return *reinterpret_cast<lambda<T> *> (const_cast<lambda<char()> *> (&data)); + } + + template<typename T> const lambda<char()>& vdata(const T& v) const { + return *reinterpret_cast<const lambda<char()> *> (&v); + } + + lambda<double()>& num() const { + return vdata<double()> (); + } + + lambda<bool()>& boo() const { + return vdata<bool()> (); + } + + lambda<gc_ptr<value>()>& ptr() const { + return vdata<gc_ptr<value>()> (); + } + + lambda<string()>& str() const { + return vdata<string()> (); + } + + lambda<list<value>()>& lst() const { + return vdata<list<value>()> (); + } + + lambda<value(const list<value>&)>& func() const { + return vdata<value(const list<value>&)> (); + } + + const list<value> listOfValues(const list<list<value> >& l) const { + if (isNil(l)) + return list<value>(); + return cons<value>(car(l), listOfValues(cdr(l))); + } + + const list<list<value> > listOfListOfValues(const list<value>& l) const { + if (isNil(l)) + return list<list<value> >(); + return cons<list<value> >(list<value>(car(l)), listOfListOfValues(cdr(l))); + } + + friend ostream& operator<<(ostream&, const value&); + friend const value::ValueType type(const value& v); + +#ifdef WANT_MAINTAINER_WATCH + friend const string watchValue(const value& v); + string watch; +#endif + + ValueType type; + lambda<char()> data; +}; + +#ifdef WANT_MAINTAINER_WATCH + +/** + * Debug utility used to write the contents of a value to a string, easier + * to watch than the value itself in a debugger. + */ +const string watchValue(const value& v) { + if (v.type == value::List) + return watchList<value>(v); + odebugstream os; + os << v; + return str(os); +} + +#endif + +/** + * Write a value to a stream. + */ +ostream& operator<<(ostream& out, const value& v) { + switch(v.type) { + case value::List: + return out << v.lst()(); + case value::Lambda: + return out << "lambda::" << v.func(); + case value::Symbol: + return out << v.str()(); + case value::String: + return out << '\"' << v.str()() << '\"'; + case value::Number: + return out << v.num()(); + case value::Bool: + if(v.boo()()) + return out << "true"; + else + return out << "false"; + case value::Ptr: { + const gc_ptr<value> p = v.ptr()(); + if (p == gc_ptr<value>(NULL)) + return out << "gc_ptr::null"; + return out << "gc_ptr::" << p; + } + default: + return out << "undefined"; + } +} + +/** + * Returns the type of a value. + */ +const value::ValueType type(const value& v) { + return v.type; +} + +/** + * Returns true if a value is nil. + */ +const bool isNil(const value& v) { + return type(v) == value::Undefined; +} + +/** + * Returns true if a value is a lambda. + */ +const bool isLambda(const value& v) { + return type(v) == value::Lambda; +} + +/** + * Returns true if a value is a string. + */ +const bool isString(const value& v) { + return type(v) == value::String; +} + +/** + * Returns true if a value is a symbol. + */ +const bool isSymbol(const value& v) { + return type(v) == value::Symbol; +} + +/** + * Returns true if a value is a list. + */ +const bool isList(const value& v) { + return type(v) == value::List; +} + +/** + * Returns true if a value is a number. + */ +const bool isNumber(const value& v) { + return type(v) == value::Number; +} + +/** + * Returns true if a value is a boolean. + */ +const bool isBool(const value& v) { + return type(v) == value::Bool; +} + +/** + * Returns true if a value is a pointer. + */ +const bool isPtr(const value& v) { + return type(v) == value::Ptr; +} + +/** + * Returns true if a value is a tagged list. + */ +const bool isTaggedList(const value& exp, value tag) { + if(isList(exp) && !isNil((list<value>)exp)) + return car((list<value>)exp) == tag; + return false; +} + +/** + * Make a list of values from a list of other things. + */ +template<typename T> const list<value> mkvalues(const list<T>& l) { + if (isNil(l)) + return list<value>(); + return cons<value>(car(l), mkvalues(cdr(l))); +} + +/** + * Convert a list of values to a list of other things. + */ +template<typename T> const list<T> convertValues(const list<value>& l) { + if (isNil(l)) + return list<T>(); + return cons<T>(car(l), convertValues<T>(cdr(l))); +} + +/** + * Convert a path string value to a list of values. + */ +const list<string> pathTokens(const char* p) { + if (p == NULL || p[0] == '\0') + return list<string>(); + if (p[0] == '/') + return tokenize("/", p + 1); + return tokenize("/", p); +} + +const list<value> pathValues(const value& p) { + return mkvalues(pathTokens(c_str(p))); +} + +/** + * Convert a path represented as a list of values to a string value. + */ +const value path(const list<value>& p) { + if (isNil(p)) + return ""; + return string("/") + car(p) + path(cdr(p)); +} + +} +#endif /* tuscany_value_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/xml-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/xml-test.cpp new file mode 100644 index 0000000000..c83a65fd92 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/xml-test.cpp @@ -0,0 +1,180 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test XML handling functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "element.hpp" +#include "xml.hpp" + +namespace tuscany { + +const string currencyXML = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<composite xmlns=\"http://docs.oasis-open.org/ns/opencsa/sca/200912\" " +"xmlns:t=\"http://tuscany.apache.org/xmlns/sca/1.1\" " +"targetNamespace=\"http://services\" " +"name=\"currency\">" +"<component name=\"CurrencyConverterWebService\">" +"<implementation.java class=\"services.CurrencyConverterImpl\"/>" +"<service name=\"CurrencyConverter\">" +"<binding.ws/>" +"</service>" +"</component>" +"<component name=\"CurrencyConverterWebService2\">" +"<implementation.java class=\"services.CurrencyConverterImpl2\"/>" +"<service name=\"CurrencyConverter2\">" +"<binding.atom/>" +"</service>" +"<property name=\"currency\">US</property>" +"</component>" +"</composite>" +"\n"; + +const string customerXML = +"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<customer>" +"<name>jdoe</name>" +"<address><city>san francisco</city><state>ca</state></address>" +"<account><id>1234</id><balance>1000</balance></account>" +"<account><id>6789</id><balance>2000</balance></account>" +"<account><id>4567</id><balance>3000</balance></account>" +"</customer>" +"\n"; + + +const bool isName(const value& token) { + return isTaggedList(token, attribute) && attributeName(token) == "name"; +} + +bool testReadXML() { + { + istringstream is(customerXML); + const list<value> c = readXML(streamList(is)); + } + { + istringstream is(currencyXML); + const list<value> c = readXML(streamList(is)); + + const value composite = car(c); + assert(isTaggedList(composite, element)); + assert(elementName(composite) == "composite"); + assert(attributeValue(car(filter<value>(isName, elementChildren(composite)))) == string("currency")); + } + return true; +} + +ostream* xmlWriter(const string& s, ostream* os) { + (*os) << s; + return os; +} + +bool testWriteXML() { + { + istringstream is(customerXML); + const list<value> c = readXML(streamList(is)); + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, c); + assert(str(os) == customerXML); + } + { + istringstream is(currencyXML); + const list<value> c = readXML(streamList(is)); + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, c); + assert(str(os) == currencyXML); + } + return true; +} + +bool testElements() { + { + const list<value> ad = mklist<value>(mklist<value>("city", string("san francisco")), mklist<value>("state", string("ca"))); + const list<value> ac1 = mklist<value>(mklist<value>("id", string("1234")), mklist<value>("balance", 1000)); + const list<value> ac2 = mklist<value>(mklist<value>("id", string("6789")), mklist<value>("balance", 2000)); + const list<value> ac3 = mklist<value>(mklist<value>("id", string("4567")), mklist<value>("balance", 3000)); + { + const list<value> c = mklist<value>(mklist<value>("customer", mklist<value>("name", string("jdoe")), cons<value>("address", ad), mklist<value>("account", mklist<value>(ac1, ac2, ac3)))); + const list<value> e = valuesToElements(c); + const list<value> v = elementsToValues(e); + assert(v == c); + + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, e); + assert(str(os) == customerXML); + } + { + const list<value> c = mklist<value>(mklist<value>("customer", mklist<value>("name", string("jdoe")), cons<value>("address", ad), cons<value>("account", ac1), cons<value>("account", ac2), cons<value>("account", ac3))); + const list<value> e = valuesToElements(c); + const list<value> v = elementsToValues(e); + + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, e); + assert(str(os) == customerXML); + } + } + { + istringstream is(customerXML); + const list<value> c = readXML(streamList(is)); + const list<value> v = elementsToValues(c); + const list<value> e = valuesToElements(v); + ostringstream os; + writeXML<ostream*>(xmlWriter, &os, e); + assert(str(os) == customerXML); + } + return true; +} + +bool testValues() { + { + const list<value> l = mklist<value>(list<value>() + "ns1:echoString" + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (list<value>() + "text" + string("Hello World!"))); + const list<value> e = valuesToElements(l); + const failable<list<string> > lx = writeXML(e); + ostringstream os; + write(content(lx), os); + istringstream is(str(os)); + const list<value> x = readXML(streamList(is)); + const list<value> v = elementsToValues(x); + assert(v == l); + } + return true; +} + +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::testReadXML(); + tuscany::testWriteXML(); + tuscany::testElements(); + tuscany::testValues(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/kernel/xml.hpp b/sca-cpp/branches/cpp-contrib/kernel/xml.hpp new file mode 100644 index 0000000000..fa1701d83a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/xml.hpp @@ -0,0 +1,369 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_xml_hpp +#define tuscany_xml_hpp + +/** + * XML read/write functions. + */ + +#include <libxml/xmlreader.h> +#include <libxml/xmlwriter.h> +#include <libxml/xmlschemas.h> +#include <libxml/globals.h> +#include "string.hpp" +#include "list.hpp" +#include "stream.hpp" +#include "value.hpp" +#include "element.hpp" +#include "monad.hpp" + +namespace tuscany { + +/** + * Initializes the libxml2 library. + */ +class XMLParser { +public: + XMLParser() { + xmlInitParser(); + } +} xmlParser; + +/** + * Encapsulates a libxml2 xmlTextReader and its state. + */ +class XMLReader { +public: + enum TokenType { + None = 0, Element = 1, Attribute = 2, Text = 3, EndElement = 15, Identifier = 100, End = 101 + }; + + XMLReader(xmlTextReaderPtr xml) : xml(xml), tokenType(None), isEmptyElement(false), hasValue(false), hasAttributes(false) { + xmlTextReaderSetParserProp(xml, XML_PARSER_DEFAULTATTRS, 1); + xmlTextReaderSetParserProp(xml, XML_PARSER_SUBST_ENTITIES, 1); + } + + ~XMLReader() { + xmlTextReaderClose(xml); + xmlFreeTextReader(xml); + } + + /** + * Read the next XML token and return its type. + */ + int read() { + if (tokenType == End) + return tokenType; + if (tokenType == Element) { + isEmptyElement = xmlTextReaderIsEmptyElement(xml); + hasAttributes = xmlTextReaderHasAttributes(xml); + return tokenType = Identifier; + } + if (tokenType == Identifier && hasAttributes && xmlTextReaderMoveToFirstAttribute(xml) == 1) + return tokenType = Attribute; + if (tokenType == Attribute && xmlTextReaderMoveToNextAttribute(xml) == 1) + return tokenType = Attribute; + if (isEmptyElement && (tokenType == Identifier || tokenType == Attribute)) + return tokenType = EndElement; + if (!xmlTextReaderRead(xml)) + return tokenType = End; + return tokenType = xmlTextReaderNodeType(xml); + } + + operator xmlTextReaderPtr() const { + return xml; + } + +private: + const xmlTextReaderPtr xml; + int tokenType; + bool isEmptyElement; + bool hasValue; + bool hasAttributes; +}; + +/** + * Constants used to tag XML tokens. + */ +const value endElement("<"); +const value startElement(">"); + +/** + * Read an XML identifier. + */ +const value readIdentifier(XMLReader& reader) { + const char* name = (const char*)xmlTextReaderConstName(reader); + return name; +} + +/** + * Read XML text. + */ +const value readText(XMLReader& reader) { + const char *val = (const char*)xmlTextReaderConstValue(reader); + return string(val); +} + +/** + * Read an XML attribute. + */ +const value readAttribute(XMLReader& reader) { + const char *name = (const char*)xmlTextReaderConstName(reader); + const char *val = (const char*)xmlTextReaderConstValue(reader); + return mklist<value>(attribute, name, string(val)); +} + +/** + * Read an XML token. + */ +const value readToken(XMLReader& reader) { + const int tokenType = reader.read(); + if (tokenType == XMLReader::None || tokenType == XMLReader::End) + return value(); + if (tokenType == XMLReader::Element) + return startElement; + if (tokenType == XMLReader::Identifier) + return readIdentifier(reader); + if (tokenType == XMLReader::Attribute) + return readAttribute(reader); + if (tokenType == XMLReader::Text) + return readText(reader); + if (tokenType == XMLReader::EndElement) + return endElement; + return readToken(reader); +} + +/** + * Read a list of values from XML tokens. + */ +const list<value> readList(const list<value>& listSoFar, XMLReader& reader) { + const value token = readToken(reader); + if(isNil(token) || endElement == token) + return reverse(listSoFar); + if(startElement == token) + return readList(cons<value>(readList(mklist(element), reader), listSoFar), reader); + return readList(cons(token, listSoFar), reader); +} + +/** + * Read a list of values from a libxml2 XML reader. + */ +const list<value> read(XMLReader& reader) { + value nextToken = readToken(reader); + if (startElement == nextToken) + return mklist<value>(readList(mklist(element), reader)); + return list<value>(); +} + +/** + * Context passed to the read callback function. + */ +class XMLReadContext { +public: + XMLReadContext(const list<string>& ilist) : ilist(ilist) { + } + list<string> ilist; +}; + +/** + * Callback function called by libxml2 to read XML. + */ +int readCallback(void *context, char* buffer, int len) { + XMLReadContext& rc = *static_cast<XMLReadContext*>(context); + if (isNil(rc.ilist)) + return 0; + const list<string> f(fragment(rc.ilist, len)); + const string s(car(f)); + rc.ilist = cdr(f); + memcpy(buffer, c_str(s), length(s)); + return length(s); +} + +/** + * Read a list of values from a list of strings representing an XML document. + */ +const list<value> readXML(const list<string>& ilist) { + XMLReadContext cx(ilist); + xmlTextReaderPtr xml = xmlReaderForIO(readCallback, NULL, &cx, NULL, NULL, XML_PARSE_NONET); + if (xml == NULL) + return list<value>(); + XMLReader reader(xml); + return read(reader); +} + +/** + * Default encoding used to write XML documents. + */ +const char* encoding = "UTF-8"; + + +/** + * Write a list of XML element or attribute tokens. + */ +const list<value> expandElementValues(const value& n, const list<value>& l) { + if (isNil(l)) + return l; + return cons<value>(value(cons<value>(element, cons<value>(n, (list<value>)car(l)))), expandElementValues(n, cdr(l))); +} + +const failable<bool> writeList(const list<value>& l, const xmlTextWriterPtr xml) { + if (isNil(l)) + return true; + + // Write an attribute + const value token(car(l)); + if (isTaggedList(token, attribute)) { + if (xmlTextWriterWriteAttribute(xml, (const xmlChar*)c_str(string(attributeName(token))), (const xmlChar*)c_str(string(attributeValue(token)))) < 0) + return mkfailure<bool>("xmlTextWriterWriteAttribute failed"); + + } else if (isTaggedList(token, element)) { + + // Write an element containing a value + if (elementHasValue(token)) { + const value v = elementValue(token); + if (isList(v)) { + + // Write an element per entry in a list of values + const list<value> e = expandElementValues(elementName(token), v); + writeList(e, xml); + + } else { + + // Write an element with a single value + if (xmlTextWriterStartElement(xml, (const xmlChar*)c_str(string(elementName(token)))) < 0) + return mkfailure<bool>("xmlTextWriterStartElement failed"); + + // Write its children + const failable<bool> w = writeList(elementChildren(token), xml); + if (!hasContent(w)) + return w; + + if (xmlTextWriterEndElement(xml) < 0) + return mkfailure<bool>("xmlTextWriterEndElement failed"); + } + } + else { + + // Write an element + if (xmlTextWriterStartElement(xml, (const xmlChar*)c_str(string(elementName(token)))) < 0) + return mkfailure<bool>("xmlTextWriterStartElement failed"); + + // Write its children + const failable<bool> w = writeList(elementChildren(token), xml); + if (!hasContent(w)) + return w; + + if (xmlTextWriterEndElement(xml) < 0) + return mkfailure<bool>("xmlTextWriterEndElement failed"); + } + } else { + + // Write XML text + if (xmlTextWriterWriteString(xml, (const xmlChar*)c_str(string(token))) < 0) + return mkfailure<bool>("xmlTextWriterWriteString failed"); + } + + // Go on + return writeList(cdr(l), xml); +} + +/** + * Write a list of values to a libxml2 XML writer. + */ +const failable<bool> write(const list<value>& l, const xmlTextWriterPtr xml, bool xmlTag) { + if (xmlTag) { + if (xmlTextWriterStartDocument(xml, NULL, encoding, NULL) < 0) + return mkfailure<bool>(string("xmlTextWriterStartDocument failed")); + } + + const failable<bool> w = writeList(l, xml); + if (!hasContent(w)) + return w; + + if (xmlTag) { + if (xmlTextWriterEndDocument(xml) < 0) + return mkfailure<bool>("xmlTextWriterEndDocument failed"); + } + return true; +} + +/** + * Context passed to the write callback function. + */ +template<typename R> class XMLWriteContext { +public: + XMLWriteContext(const lambda<R(const string&, const R)>& reduce, const R& accum) : reduce(reduce), accum(accum) { + } + const lambda<R(const string&, const R)> reduce; + R accum; +}; + +/** + * Callback function called by libxml2 to write XML out. + */ +template<typename R> int writeCallback(void *context, const char* buffer, int len) { + XMLWriteContext<R>& cx = *static_cast<XMLWriteContext<R>*>(context); + cx.accum = cx.reduce(string(buffer, len), cx.accum); + return len; +} + +/** + * Convert a list of values to an XML document. + */ +template<typename R> const failable<R> writeXML(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l, const bool xmlTag) { + XMLWriteContext<R> cx(reduce, initial); + xmlOutputBufferPtr out = xmlOutputBufferCreateIO(writeCallback<R>, NULL, &cx, NULL); + if (out == NULL) + return mkfailure<R>("xmlOutputBufferCreateIO failed"); + xmlTextWriterPtr xml = xmlNewTextWriter(out); + if (xml == NULL) + return mkfailure<R>("xmlNewTextWriter failed"); + + const failable<bool> w = write(l, xml, xmlTag); + xmlFreeTextWriter(xml); + if (!hasContent(w)) { + return mkfailure<R>(reason(w)); + } + return cx.accum; +} + +template<typename R> const failable<R> writeXML(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l) { + return writeXML(reduce, initial, l, true); +} + +/** + * Convert a list of values to a list of strings representing an XML document. + */ +const failable<list<string> > writeXML(const list<value>& l, const bool xmlTag) { + const failable<list<string> > ls = writeXML<list<string> >(rcons<string>, list<string>(), l, xmlTag); + if (!hasContent(ls)) + return ls; + return reverse(list<string>(content(ls))); +} + +const failable<list<string> > writeXML(const list<value>& l) { + return writeXML(l, true); +} + +} +#endif /* tuscany_xml_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/kernel/xsd-test.cpp b/sca-cpp/branches/cpp-contrib/kernel/xsd-test.cpp new file mode 100644 index 0000000000..0fc432c649 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/kernel/xsd-test.cpp @@ -0,0 +1,107 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test validation of a composite file against an SCDL schema. + */ + +#include "string.hpp" +#include "fstream.hpp" +#include <libxml/xmlreader.h> +#include <libxml/xmlschemas.h> + +namespace tuscany { + +bool printNode(xmlTextReaderPtr reader) { + const xmlChar* name = xmlTextReaderConstName(reader); + if(name == NULL) + name = (xmlChar *)"<unknown>"; + const xmlChar* value = xmlTextReaderConstValue(reader); + cout << xmlTextReaderDepth(reader) << " " << xmlTextReaderNodeType(reader) << " " << name << " " + << xmlTextReaderIsEmptyElement(reader) << " " << xmlTextReaderHasValue(reader); + if(value == NULL) + cout << endl; + else + cout << value << endl; + return true; +} + +int xmlRead(void *context, char* buffer, int len) { + return fread(buffer, 1, len, (FILE*)context); +} + +int xmlClose(void *context) { + fclose((FILE*)context); + return 0; +} + +bool readFile(const char*xsdfilename, const char *filename) { + cout << "Loading schemas...\n"; + const xmlDocPtr xsddoc = xmlReadFile(xsdfilename, NULL, XML_PARSE_NONET); + const xmlSchemaParserCtxtPtr xsdctx = xmlSchemaNewDocParserCtxt(xsddoc); + const xmlSchemaPtr xsd = xmlSchemaParse(xsdctx); + const xmlSchemaValidCtxtPtr validctx = xmlSchemaNewValidCtxt(xsd); + + cout << "Reading file...\n"; + FILE* file = fopen(filename, "r"); + if (file != NULL) { + const xmlTextReaderPtr reader = xmlReaderForIO(xmlRead, xmlClose, file, filename, NULL, XML_PARSE_NONET); + xmlTextReaderSetParserProp(reader, XML_PARSER_DEFAULTATTRS, 1); + xmlTextReaderSetParserProp(reader, XML_PARSER_SUBST_ENTITIES, 1); + + if(reader != NULL) { + xmlTextReaderSchemaValidateCtxt(reader, validctx, 0); + + int rc; + while((rc = xmlTextReaderRead(reader)) == 1) { + printNode(reader); + } + if(xmlTextReaderIsValid(reader) != 1) + cout << "Could not validate document" << endl; + xmlFreeTextReader(reader); + if(rc != 0) + cout << "Could not parse document" << endl; + } else + cout << "Could not create parser" << endl; + } else + cout << "Could not open document" << endl; + + xmlSchemaFreeValidCtxt(validctx); + xmlSchemaFree(xsd); + xmlSchemaFreeParserCtxt(xsdctx); + + return true; +} + +} + +int main(int argc, char **argv) { + tuscany::cout << "Testing..." << tuscany::endl; + if(argc != 3) + return 1; + + tuscany::readFile(argv[1], argv[2]); + + xmlCleanupParser(); + + tuscany::cout << "OK" << tuscany::endl; + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/Makefile.am new file mode 100644 index 0000000000..4332bbe7c8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +SUBDIRS = scheme atom json scdl http server python java + +includedir = $(prefix)/include/modules +nobase_include_HEADERS = */*.hpp + diff --git a/sca-cpp/branches/cpp-contrib/modules/atom/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/atom/Makefile.am new file mode 100644 index 0000000000..c39caa34c3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/atom/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +noinst_PROGRAMS = atom-test + +atom_test_SOURCES = atom-test.cpp +atom_test_LDFLAGS = -lxml2 + +TESTS = atom-test diff --git a/sca-cpp/branches/cpp-contrib/modules/atom/atom-test.cpp b/sca-cpp/branches/cpp-contrib/modules/atom/atom-test.cpp new file mode 100644 index 0000000000..560c383a23 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/atom/atom-test.cpp @@ -0,0 +1,192 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test ATOM data conversion functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "atom.hpp" + +namespace tuscany { +namespace atom { + +ostream* writer(const string& s, ostream* os) { + (*os) << s; + return os; +} + +string itemEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<entry xmlns=\"http://www.w3.org/2005/Atom\">" + "<title type=\"text\">item</title>" + "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>" + "<content type=\"application/xml\">" + "<item>" + "<name>Apple</name><price>$2.99</price>" + "</item>" + "</content>" + "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>" + "</entry>\n"); + +string incompleteEntry("<entry xmlns=\"http://www.w3.org/2005/Atom\">" + "<title>item</title><content type=\"text/xml\">" + "<Item xmlns=\"http://services/\">" + "<name xmlns=\"\">Orange</name>" + "<price xmlns=\"\">3.55</price>" + "</Item>" + "</content>" + "</entry>"); + +string completedEntry("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<entry xmlns=\"http://www.w3.org/2005/Atom\">" + "<title type=\"text\">item</title>" + "<id></id>" + "<content type=\"application/xml\">" + "<Item xmlns=\"http://services/\">" + "<name xmlns=\"\">Orange</name>" + "<price xmlns=\"\">3.55</price>" + "</Item>" + "</content><link href=\"\"/>" + "</entry>\n"); + +bool testEntry() { + { + const list<value> i = list<value>() + element + value("item") + + value(list<value>() + element + value("name") + value(string("Apple"))) + + value(list<value>() + element + value("price") + value(string("$2.99"))); + const list<value> a = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + ostringstream os; + writeATOMEntry<ostream*>(writer, &os, a); + assert(str(os) == itemEntry); + } + { + const list<value> a = content(readEntry(mklist(itemEntry))); + ostringstream os; + writeATOMEntry<ostream*>(writer, &os, a); + assert(str(os) == itemEntry); + } + { + const list<value> a = content(readEntry(mklist(incompleteEntry))); + ostringstream os; + writeATOMEntry<ostream*>(writer, &os, a); + assert(str(os) == completedEntry); + } + return true; +} + +string emptyFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<feed xmlns=\"http://www.w3.org/2005/Atom\">" + "<title type=\"text\">Feed</title>" + "<id>1234</id>" + "</feed>\n"); + +string itemFeed("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<feed xmlns=\"http://www.w3.org/2005/Atom\">" + "<title type=\"text\">Feed</title>" + "<id>1234</id>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\">" + "<title type=\"text\">item</title>" + "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b</id>" + "<content type=\"application/xml\">" + "<item>" + "<name>Apple</name><price>$2.99</price>" + "</item>" + "</content>" + "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\"/>" + "</entry>" + "<entry xmlns=\"http://www.w3.org/2005/Atom\">" + "<title type=\"text\">item</title>" + "<id>cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c</id>" + "<content type=\"application/xml\">" + "<item>" + "<name>Orange</name><price>$3.55</price>" + "</item>" + "</content>" + "<link href=\"cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c\"/>" + "</entry>" + "</feed>\n"); + +bool testFeed() { + { + ostringstream os; + writeATOMFeed<ostream*>(writer, &os, mklist<value>("Feed", "1234")); + assert(str(os) == emptyFeed); + } + { + const list<value> a = content(readFeed(mklist(emptyFeed))); + ostringstream os; + writeATOMFeed<ostream*>(writer, &os, a); + assert(str(os) == emptyFeed); + } + { + const list<value> i = list<value>() + + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + + (list<value>() + element + "item" + + (list<value>() + element + "name" + "Apple") + + (list<value>() + element + "price" + "$2.99"))) + + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" + + (list<value>() + element + "item" + + (list<value>() + element + "name" + "Orange") + + (list<value>() + element + "price" + "$3.55"))); + const list<value> a = cons<value>("Feed", cons<value>("1234", i)); + ostringstream os; + writeATOMFeed<ostream*>(writer, &os, a); + assert(str(os) == itemFeed); + } + { + const list<value> i = list<value>() + + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + + valueToElement(list<value>() + "item" + + (list<value>() + "name" + "Apple") + + (list<value>() + "price" + "$2.99"))) + + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" + + valueToElement(list<value>() + "item" + + (list<value>() + "name" + "Orange") + + (list<value>() + "price" + "$3.55"))); + const list<value> a = cons<value>("Feed", cons<value>("1234", i)); + ostringstream os; + writeATOMFeed<ostream*>(writer, &os, a); + assert(str(os) == itemFeed); + } + { + const list<value> a = content(readFeed(mklist(itemFeed))); + ostringstream os; + writeATOMFeed<ostream*>(writer, &os, a); + assert(str(os) == itemFeed); + } + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::atom::testEntry(); + tuscany::atom::testFeed(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/atom/atom.hpp b/sca-cpp/branches/cpp-contrib/modules/atom/atom.hpp new file mode 100644 index 0000000000..4dbf7c7728 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/atom/atom.hpp @@ -0,0 +1,178 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_atom_hpp +#define tuscany_atom_hpp + +/** + * ATOM data conversion functions. + */ + +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "xml.hpp" + +namespace tuscany { +namespace atom { + +/** + * Convert a list of elements to a list of values representing an ATOM entry. + */ +const list<value> entryValues(const list<value>& e) { + const list<value> lt = filter<value>(selector(mklist<value>(element, "title")), e); + const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); + const list<value> li = filter<value>(selector(mklist<value>(element, "id")), e); + const value i = isNil(li)? value(emptyString) : elementValue(car(li)); + const list<value> lc = filter<value>(selector(mklist<value>(element, "content")), e); + return mklist<value>(t, i, cadr(elementChildren(car(lc)))); +} + +/** + * Convert a list of elements to a list of values representing ATOM entries. + */ +const list<value> entriesValues(const list<value>& e) { + if (isNil(e)) + return e; + return cons<value>(entryValues(car(e)), entriesValues(cdr(e))); +} + +/** + * Convert a list of strings to a list of values representing an ATOM entry. + */ +const failable<list<value> > readEntry(const list<string>& ilist) { + const list<value> e = readXML(ilist); + if (isNil(e)) + return mkfailure<list<value> >("Empty entry"); + return entryValues(car(e)); +} + +/** + * Convert a list of values representing an ATOM entry to a value. + */ +const value entryValue(const list<value>& e) { + const list<value> v = elementsToValues(mklist<value>(caddr(e))); + return cons(car(e), mklist<value>(cadr(e), cdr<value>(car(v)))); +} + +/** + * Convert a list of strings to a list of values representing an ATOM feed. + */ +const failable<list<value> > readFeed(const list<string>& ilist) { + const list<value> f = readXML(ilist); + if (isNil(f)) + return mkfailure<list<value> >("Empty feed"); + const list<value> t = filter<value>(selector(mklist<value>(element, "title")), car(f)); + const list<value> i = filter<value>(selector(mklist<value>(element, "id")), car(f)); + const list<value> e = filter<value>(selector(mklist<value>(element, "entry")), car(f)); + if (isNil(e)) + return mklist<value>(elementValue(car(t)), elementValue(car(i))); + return cons<value>(elementValue(car(t)), cons(elementValue(car(i)), entriesValues(e))); +} + +/** + * Convert a list of values representing an ATOM entry to a list of elements. + * The first two values in the list are the entry title and id. + */ +const list<value> entryElement(const list<value>& l) { + return list<value>() + + element + "entry" + (list<value>() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (list<value>() + element + "title" + (list<value>() + attribute + "type" + "text") + car(l)) + + (list<value>() + element + "id" + cadr(l)) + + (list<value>() + element + "content" + (list<value>() + attribute + "type" + "application/xml") + caddr(l)) + + (list<value>() + element + "link" + (list<value>() + attribute + "href" + cadr(l))); +} + +/** + * Convert a list of values representing ATOM entries to a list of elements. + */ +const list<value> entriesElements(const list<value>& l) { + if (isNil(l)) + return l; + return cons<value>(entryElement(car(l)), entriesElements(cdr(l))); +} + +/** + * Convert a list of values representing an ATOM entry to an ATOM entry. + * The first two values in the list are the entry id and title. + */ +template<typename R> const failable<R> writeATOMEntry(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l) { + return writeXML<R>(reduce, initial, mklist<value>(entryElement(l))); +} + +const failable<list<string> > writeATOMEntry(const list<value>& l) { + const failable<list<string> > ls = writeATOMEntry<list<string> >(rcons<string>, list<string>(), l); + if (!hasContent(ls)) + return ls; + return reverse(list<string>(content(ls))); +} + +/** + * Convert a list of values representing an ATOM feed to an ATOM feed. + * The first two values in the list are the feed id and title. + */ +template<typename R> const failable<R> writeATOMFeed(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l) { + const list<value> f = list<value>() + + element + "feed" + (list<value>() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (list<value>() + element + "title" + (list<value>() + attribute + "type" + "text") + car(l)) + + (list<value>() + element + "id" + cadr(l)); + if (isNil(cddr(l))) + return writeXML<R>(reduce, initial, mklist<value>(f)); + const list<value> fe = append(f, entriesElements(cddr(l))); + return writeXML<R>(reduce, initial, mklist<value>(fe)); +} + +/** + * Convert a list of values representing an ATOM feed to a list of strings. + * The first two values in the list are the feed id and title. + */ +const failable<list<string> > writeATOMFeed(const list<value>& l) { + const failable<list<string> > ls = writeATOMFeed<list<string>>(rcons<string>, list<string>(), l); + if (!hasContent(ls)) + return ls; + return reverse(list<string>(content(ls))); +} + +/** + * Convert an ATOM entry containing a value to an ATOM entry containing an item element. + */ +const list<value> entryValuesToElements(const list<value> val) { + return cons(car(val), cons(cadr(val), valuesToElements(mklist<value>(cons<value>("item", (list<value>)caddr(val)))))); +} + +/** + * Convert an ATOM feed containing values to an ATOM feed containing elements. + */ +const list<value> feedValuesToElementsLoop(const list<value> val) { + if (isNil(val)) + return val; + return cons<value>(entryValuesToElements(car(val)), feedValuesToElementsLoop(cdr(val))); +} + +const list<value> feedValuesToElements(const list<value>& val) { + return cons(car<value>(val), cons<value>(cadr<value>(val), feedValuesToElementsLoop(cddr<value>(val)))); +} + +} +} + +#endif /* tuscany_atom_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/http/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/http/Makefile.am new file mode 100644 index 0000000000..b522113423 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/Makefile.am @@ -0,0 +1,31 @@ +# 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. + +noinst_PROGRAMS = curl-test + +INCLUDES = -I${HTTPD_INCLUDE} + +httpdir=$(prefix)/modules/http +http_DATA = httpd.prefix + +curl_test_SOURCES = curl-test.cpp +curl_test_LDFLAGS = -lxml2 -lcurl -lmozjs + +httpd.prefix: $(top_builddir)/config.status + echo ${HTTPD_PREFIX} >httpd.prefix + +TESTS = httpd-test http-test diff --git a/sca-cpp/branches/cpp-contrib/modules/http/conf/mime.types b/sca-cpp/branches/cpp-contrib/modules/http/conf/mime.types new file mode 100644 index 0000000000..4279f51bca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/conf/mime.types @@ -0,0 +1,607 @@ +# 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. + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at <http://www.iana.org/assignments/media-types/>. + +# MIME type Extensions +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomicmail +application/batch-smtp +application/beep+xml +application/cals-1840 +application/cnrp+xml +application/commonground +application/cpl+xml +application/cybercash +application/dca-rft +application/dec-dx +application/dvcs +application/edi-consent +application/edifact +application/edi-x12 +application/eshop +application/font-tdpfr +application/http +application/hyperstudio +application/iges +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipp +application/isup +application/mac-binhex40 hqx +application/mac-compactpro cpt +application/macwriteii +application/marc +application/mathematica +application/mathml+xml mathml +application/msword doc +application/news-message-id +application/news-transmission +application/ocsp-request +application/ocsp-response +application/octet-stream bin dms lha lzh exe class so dll dmg +application/oda oda +application/ogg ogg +application/parityfec +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature +application/pkcs10 +application/pkcs7-mime +application/pkcs7-signature +application/pkix-cert +application/pkix-crl +application/pkixcmp +application/postscript ai eps ps +application/prs.alvestrand.titrax-sheet +application/prs.cww +application/prs.nprend +application/prs.plucker +application/qsig +application/rdf+xml rdf +application/reginfo+xml +application/remote-printing +application/riscos +application/rtf +application/sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog +application/sieve +application/slate +application/smil smi smil +application/srgs gram +application/srgs+xml grxml +application/timestamp-query +application/timestamp-reply +application/tve-trigger +application/vemmi +application/vnd.3gpp.pic-bw-large +application/vnd.3gpp.pic-bw-small +application/vnd.3gpp.pic-bw-var +application/vnd.3gpp.sms +application/vnd.3m.post-it-notes +application/vnd.accpac.simply.aso +application/vnd.accpac.simply.imp +application/vnd.acucobol +application/vnd.acucorp +application/vnd.adobe.xfdf +application/vnd.aether.imp +application/vnd.amiga.ami +application/vnd.anser-web-certificate-issue-initiation +application/vnd.anser-web-funds-transfer-initiation +application/vnd.audiograph +application/vnd.blueice.multipass +application/vnd.bmi +application/vnd.businessobjects +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cinderella +application/vnd.claymore +application/vnd.commerce-battelle +application/vnd.commonspace +application/vnd.contact.cmsg +application/vnd.cosmocaller +application/vnd.criticaltools.wbs+xml +application/vnd.ctc-posml +application/vnd.cups-postscript +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl +application/vnd.cybank +application/vnd.data-vision.rdz +application/vnd.dna +application/vnd.dpgraph +application/vnd.dreamfactory +application/vnd.dxr +application/vnd.ecdis-update +application/vnd.ecowin.chart +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven +application/vnd.epson.esf +application/vnd.epson.msf +application/vnd.epson.quickanime +application/vnd.epson.salt +application/vnd.epson.ssf +application/vnd.ericsson.quickcall +application/vnd.eudora.data +application/vnd.fdf +application/vnd.ffsns +application/vnd.fints +application/vnd.flographit +application/vnd.framemaker +application/vnd.fsc.weblaunch +application/vnd.fujitsu.oasys +application/vnd.fujitsu.oasys2 +application/vnd.fujitsu.oasys3 +application/vnd.fujitsu.oasysgp +application/vnd.fujitsu.oasysprs +application/vnd.fujixerox.ddd +application/vnd.fujixerox.docuworks +application/vnd.fujixerox.docuworks.binder +application/vnd.fut-misnet +application/vnd.grafeq +application/vnd.groove-account +application/vnd.groove-help +application/vnd.groove-identity-message +application/vnd.groove-injector +application/vnd.groove-tool-message +application/vnd.groove-tool-template +application/vnd.groove-vcard +application/vnd.hbci +application/vnd.hhe.lesson-player +application/vnd.hp-hpgl +application/vnd.hp-hpid +application/vnd.hp-hps +application/vnd.hp-pcl +application/vnd.hp-pclxl +application/vnd.httphone +application/vnd.hzn-3d-crossword +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media +application/vnd.ibm.minipay +application/vnd.ibm.modcap +application/vnd.ibm.rights-management +application/vnd.ibm.secure-container +application/vnd.informix-visionary +application/vnd.intercon.formnet +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo +application/vnd.intu.qfx +application/vnd.irepository.package+xml +application/vnd.is-xpr +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jisp +application/vnd.kde.karbon +application/vnd.kde.kchart +application/vnd.kde.kformula +application/vnd.kde.kivio +application/vnd.kde.kontour +application/vnd.kde.kpresenter +application/vnd.kde.kspread +application/vnd.kde.kword +application/vnd.kenameaapp +application/vnd.koan +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop +application/vnd.llamagraphics.life-balance.exchange+xml +application/vnd.lotus-1-2-3 +application/vnd.lotus-approach +application/vnd.lotus-freelance +application/vnd.lotus-notes +application/vnd.lotus-organizer +application/vnd.lotus-screencam +application/vnd.lotus-wordpro +application/vnd.mcd +application/vnd.mediastation.cdkey +application/vnd.meridian-slingshot +application/vnd.micrografx.flo +application/vnd.micrografx.igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf +application/vnd.mobius.dis +application/vnd.mobius.mbk +application/vnd.mobius.mqy +application/vnd.mobius.msl +application/vnd.mobius.plc +application/vnd.mobius.txf +application/vnd.mophun.application +application/vnd.mophun.certificate +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry +application/vnd.ms-asf +application/vnd.ms-excel xls +application/vnd.ms-lrm +application/vnd.ms-powerpoint ppt +application/vnd.ms-project +application/vnd.ms-tnef +application/vnd.ms-works +application/vnd.ms-wpl +application/vnd.mseq +application/vnd.msign +application/vnd.music-niff +application/vnd.musician +application/vnd.netfpx +application/vnd.noblenet-directory +application/vnd.noblenet-sealer +application/vnd.noblenet-web +application/vnd.novadigm.edm +application/vnd.novadigm.edx +application/vnd.novadigm.ext +application/vnd.obn +application/vnd.osa.netdeploy +application/vnd.palm +application/vnd.pg.format +application/vnd.pg.osasli +application/vnd.powerbuilder6 +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.previewsystems.box +application/vnd.publishare-delta-tree +application/vnd.pvi.ptid1 +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.quark.quarkxpress +application/vnd.rapid +application/vnd.s3sms +application/vnd.sealed.net +application/vnd.seemail +application/vnd.shana.informed.formdata +application/vnd.shana.informed.formtemplate +application/vnd.shana.informed.interchange +application/vnd.shana.informed.package +application/vnd.smaf +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.street-stream +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.triscape.mxs +application/vnd.trueapp +application/vnd.truedoc +application/vnd.ufdl +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx +application/vnd.vectorworks +application/vnd.vidsoft.vidconference +application/vnd.visio +application/vnd.visionary +application/vnd.vividence.scriptfile +application/vnd.vsf +application/vnd.wap.sic +application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf +application/vnd.wv.csp+wbxml +application/vnd.xara +application/vnd.xfdl +application/vnd.yamaha.hv-dic +application/vnd.yamaha.hv-script +application/vnd.yamaha.hv-voice +application/vnd.yellowriver-custom-menu +application/voicexml+xml vxml +application/watcherinfo+xml +application/whoispp-query +application/whoispp-response +application/wita +application/wordperfect5.1 +application/x-bcpio bcpio +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip +application/x-hdf hdf +application/x-javascript js +application/x-koan skp skd skt skm +application/x-latex latex +application/x-netcdf nc cdf +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x400-bp +application/xhtml+xml xhtml xht +application/xslt+xml xslt +application/xml xml xsl +application/xml-dtd dtd +application/xml-external-parsed-entity +application/zip zip +audio/32kadpcm +audio/amr +audio/amr-wb +audio/basic au snd +audio/cn +audio/dat12 +audio/dsr-es201108 +audio/dvi4 +audio/evrc +audio/evrc0 +audio/g722 +audio/g.722.1 +audio/g723 +audio/g726-16 +audio/g726-24 +audio/g726-32 +audio/g726-40 +audio/g728 +audio/g729 +audio/g729D +audio/g729E +audio/gsm +audio/gsm-efr +audio/l8 +audio/l16 +audio/l20 +audio/l24 +audio/lpc +audio/midi mid midi kar +audio/mpa +audio/mpa-robust +audio/mp4a-latm +audio/mpeg mpga mp2 mp3 +audio/parityfec +audio/pcma +audio/pcmu +audio/prs.sid +audio/qcelp +audio/red +audio/smv +audio/smv0 +audio/telephone-event +audio/tone +audio/vdvi +audio/vnd.3gpp.iufp +audio/vnd.cisco.nse +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.digital-winds +audio/vnd.everad.plj +audio/vnd.lucent.voice +audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 +audio/vnd.nuera.ecelp7470 +audio/vnd.nuera.ecelp9600 +audio/vnd.octel.sbc +audio/vnd.qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.vmx.cvsd +audio/x-aiff aif aiff aifc +audio/x-alaw-basic +audio/x-mpegurl m3u +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin +application/vnd.rn-realmedia rm +audio/x-wav wav +chemical/x-pdb pdb +chemical/x-xyz xyz +image/bmp bmp +image/cgm cgm +image/g3fax +image/gif gif +image/ief ief +image/jpeg jpeg jpg jpe +image/naplps +image/png png +image/prs.btif +image/prs.pti +image/svg+xml svg +image/t38 +image/tiff tiff tif +image/tiff-fx +image/vnd.cns.inf2 +image/vnd.djvu djvu djv +image/vnd.dwg +image/vnd.dxf +image/vnd.fastbidsheet +image/vnd.fpx +image/vnd.fst +image/vnd.fujixerox.edmics-mmr +image/vnd.fujixerox.edmics-rlc +image/vnd.globalgraphics.pgb +image/vnd.mix +image/vnd.ms-modi +image/vnd.net-fpx +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff +image/x-cmu-raster ras +image/x-icon ico +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +message/delivery-status +message/disposition-notification +message/external-body +message/http +message/news +message/partial +message/rfc822 +message/s-http +message/sip +message/sipfrag +model/iges igs iges +model/mesh msh mesh silo +model/vnd.dwf +model/vnd.flatland.3dml +model/vnd.gdl +model/vnd.gs-gdl +model/vnd.gtw +model/vnd.mts +model/vnd.parasolid.transmit.binary +model/vnd.parasolid.transmit.text +model/vnd.vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message +text/calendar ics ifb +text/css css +text/directory +text/enriched +text/html html htm +text/parityfec +text/plain asc txt +text/prs.lines.tag +text/rfc822-headers +text/richtext rtx +text/rtf rtf +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/uri-list +text/vnd.abc +text/vnd.curl +text/vnd.dmclientscript +text/vnd.fly +text/vnd.fmi.flexstor +text/vnd.in3d.3dml +text/vnd.in3d.spot +text/vnd.iptc.nitf +text/vnd.iptc.newsml +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage +text/vnd.net2phone.commcenter.command +text/vnd.sun.j2me.app-descriptor +text/vnd.wap.si +text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-setext etx +text/xml +text/xml-external-parsed-entity +video/bmpeg +video/bt656 +video/celb +video/dv +video/h261 +video/h263 +video/h263-1998 +video/h263-2000 +video/jpeg +video/mp1s +video/mp2p +video/mp2t +video/mp4v-es +video/mpv +video/mpeg mpeg mpg mpe +video/nv +video/parityfec +video/pointer +video/quicktime qt mov +video/smpte292m +video/vnd.fvt +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.nokia.interleaved-multimedia +video/vnd.objectvideo +video/vnd.vivo +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice diff --git a/sca-cpp/branches/cpp-contrib/modules/http/curl-test.cpp b/sca-cpp/branches/cpp-contrib/modules/http/curl-test.cpp new file mode 100644 index 0000000000..4305d2ac38 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/curl-test.cpp @@ -0,0 +1,88 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test HTTP client functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "perf.hpp" +#include "curl.hpp" + +namespace tuscany { +namespace http { + +ostream* curlWriter(const string& s, ostream* os) { + (*os) << s; + return os; +} + +const bool testGet() { + CURLSession ch; + { + ostringstream os; + const failable<list<ostream*> > r = get<ostream*>(curlWriter, &os, "http://localhost:8090", ch); + assert(hasContent(r)); + assert(contains(str(os), "HTTP/1.1 200 OK")); + assert(contains(str(os), "It works")); + } + { + const failable<value> r = getcontent("http://localhost:8090", ch); + assert(hasContent(r)); + assert(contains(car(reverse(list<value>(content(r)))), "It works")); + } + return true; +} + +struct getLoop { + CURLSession& ch; + getLoop(CURLSession& ch) : ch(ch) { + } + const bool operator()() const { + const failable<value> r = getcontent("http://localhost:8090", ch); + assert(hasContent(r)); + assert(contains(car(reverse(list<value>(content(r)))), "It works")); + return true; + } +}; + +const bool testGetPerf() { + CURLSession ch; + lambda<bool()> gl = getLoop(ch); + cout << "Static GET test " << time(gl, 5, 200) << " ms" << endl; + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::http::testGet(); + tuscany::http::testGetPerf(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/http/curl.hpp b/sca-cpp/branches/cpp-contrib/modules/http/curl.hpp new file mode 100644 index 0000000000..f2c9458f42 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/curl.hpp @@ -0,0 +1,401 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_curl_hpp +#define tuscany_curl_hpp + +/** + * CURL HTTP client functions. + */ + +#include <curl/curl.h> +#include <curl/types.h> +#include <curl/easy.h> +#include "string.hpp" +#include "gc.hpp" +#include "list.hpp" +#include "value.hpp" +#include "element.hpp" +#include "monad.hpp" +#include "parallel.hpp" +#include "../atom/atom.hpp" +#include "../json/json.hpp" + +namespace tuscany { +namespace http { + +/** + * CURL library runtime, one per process. + */ +class CURLRuntime { +public: + CURLRuntime() { + curl_global_init(CURL_GLOBAL_ALL); + } +} curlRuntime; + +/** + * Represents a CURL session handle. + */ +class CURLSession { +public: + CURLSession() : h(curl_easy_init()), owner(true) { + } + + CURLSession(const CURLSession& c) : h(c.h), owner(false) { + } + + ~CURLSession() { + if (!owner) + return; + if (h == NULL) + return; + curl_easy_cleanup(h); + } + +private: + CURL* h; + const bool owner; + + friend CURL* handle(const CURLSession& c); +}; + +/** + * Returns the CURL handle used by a CURL session. + */ +CURL* handle(const CURLSession& c) { + return c.h; +} + +/** + * Context passed to the read callback function. + */ +class CURLReadContext { +public: + CURLReadContext(const list<string>& ilist) : ilist(ilist) { + } + list<string> ilist; +}; + +/** + * Called by CURL to read data to send. + */ +size_t readCallback(void *ptr, size_t size, size_t nmemb, void *data) { + CURLReadContext& rcx = *static_cast<CURLReadContext*>(data); + if (isNil(rcx.ilist)) + return 0; + const list<string> f(fragment(rcx.ilist, size * nmemb)); + const string s = car(f); + rcx.ilist = cdr(f); + memcpy(ptr, c_str(s), length(s)); + return length(s); +} + +/** + * Context passed to CURL write callback function. + */ +template<typename R> class CURLWriteContext { +public: + CURLWriteContext(const lambda<R(const string&, const R)>& reduce, const R& accum) : reduce(reduce), accum(accum) { + } + const lambda<R(const string&, const R)> reduce; + R accum; +}; + +/** + * Called by CURL to write received data. + */ +template<typename R> size_t writeCallback(void *ptr, size_t size, size_t nmemb, void *data) { + CURLWriteContext<R>& wcx = *(static_cast<CURLWriteContext<R>*> (data)); + const size_t realsize = size * nmemb; + wcx.accum = wcx.reduce(string((const char*)ptr, realsize), wcx.accum); + return realsize; +} + +/** + * Apply an HTTP verb to a list containing a list of headers and a list of content, and + * a reduce function used to process the response. + */ +curl_slist* headers(curl_slist* cl, const list<string>& h) { + if (isNil(h)) + return cl; + return headers(curl_slist_append(cl, c_str(string(car(h)))), cdr(h)); +} + +template<typename R> const failable<list<R> > apply(const list<list<string> >& hdr, const lambda<R(const string&, const R)>& reduce, const R& initial, const string& url, const string& verb, const CURLSession& cs) { + + // Init the curl session + CURL* ch = handle(cs); + curl_easy_reset(ch); + curl_easy_setopt(ch, CURLOPT_USERAGENT, "libcurl/1.0"); + + //TODO use HTTP chunking, for now just convert request to a single string + ostringstream os; + write(cadr(hdr), os); + const string s = str(os); + const int sz = length(s); + + // Setup the read, header and write callbacks + CURLReadContext rcx(mklist(s)); + curl_easy_setopt(ch, CURLOPT_READFUNCTION, (size_t (*)(void*, size_t, size_t, void*))readCallback); + curl_easy_setopt(ch, CURLOPT_READDATA, &rcx); + CURLWriteContext<R> hcx(reduce, initial); + curl_easy_setopt(ch, CURLOPT_HEADERFUNCTION, (size_t (*)(void*, size_t, size_t, void*))(writeCallback<R>)); + curl_easy_setopt(ch, CURLOPT_HEADERDATA, &hcx); + CURLWriteContext<R> wcx(reduce, initial); + curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, (size_t (*)(void*, size_t, size_t, void*))(writeCallback<R>)); + curl_easy_setopt(ch, CURLOPT_WRITEDATA, &wcx); + curl_easy_setopt(ch, CURLOPT_TCP_NODELAY, true); + + // Set the request headers + curl_slist* hl = headers(NULL, car(hdr)); + if (hl != NULL) + curl_easy_setopt(ch, CURLOPT_HTTPHEADER, hl); + + // Apply the HTTP verb + curl_easy_setopt(ch, CURLOPT_URL, c_str(url)); + if (verb == "POST") { + curl_easy_setopt(ch, CURLOPT_POST, true); + curl_easy_setopt(ch, CURLOPT_POSTFIELDSIZE, sz); + } else if (verb == "PUT") { + curl_easy_setopt(ch, CURLOPT_UPLOAD, true); + curl_easy_setopt(ch, CURLOPT_INFILESIZE, sz); + } else if (verb == "DELETE") + curl_easy_setopt(ch, CURLOPT_CUSTOMREQUEST, "DELETE"); + const CURLcode rc = curl_easy_perform(ch); + + if (hl != NULL) + curl_slist_free_all(hl); + + // Return the HTTP return code or content + if (rc) + return mkfailure<list<R> >(string(curl_easy_strerror(rc))); + long httprc; + curl_easy_getinfo (ch, CURLINFO_RESPONSE_CODE, &httprc); + if (httprc != 200 && httprc != 201) { + ostringstream es; + es << "HTTP code " << httprc; + return mkfailure<list<R> >(str(es)); + } + return mklist<R>(hcx.accum, wcx.accum); +} + +/** + * Evaluate an expression remotely, at the given URL. + */ +const failable<value> evalExpr(const value& expr, const string& url, const CURLSession& ch) { + debug(url, "http::evalExpr::url"); + debug(expr, "http::evalExpr::input"); + + // Convert expression to a JSON-RPC request + json::JSONContext cx; + const failable<list<string> > jsreq = json::jsonRequest(1, car<value>(expr), cdr<value>(expr), cx); + if (!hasContent(jsreq)) + return mkfailure<value>(reason(jsreq)); + + // POST it to the URL + const list<string> h = mklist<string>("Content-Type: application/json-rpc"); + const failable<list<list<string> > > res = apply<list<string> >(mklist<list<string> >(h, content(jsreq)), rcons<string>, list<string>(), url, "POST", ch); + if (!hasContent(res)) + return mkfailure<value>(reason(res)); + + // Parse and return JSON-RPC result + const failable<value> rval = json::jsonResultValue(cadr<list<string> >(content(res)), cx); + if (!hasContent(rval)) + return mkfailure<value>(reason(rval)); + debug(content(rval), "http::evalExpr::result"); + return content(rval); +} + +/** + * Find and return a header. + */ +const failable<string> header(const char* prefix, const list<string>& h) { + if (isNil(h)) + return mkfailure<string>(string("Couldn't find header: ") + prefix); + const string s = car(h); + if (find(s, prefix) != 0) + return header(prefix, cdr(h)); + const string l(substr(s, length(prefix))); + return substr(l, 0, find_first_of(l, "\r\n")); +} + +/** + * Find and return a location header. + */ +const failable<string> location(const list<string>& h) { + return header("Location: ", h); +} + +/** + * Convert a location to an entry id. + */ +const failable<value> entryId(const failable<string> l) { + if (!hasContent(l)) + return mkfailure<value>(reason(l)); + const string ls(content(l)); + return value(mklist<value>(string(substr(ls, find_last(ls, '/') + 1)))); +} + +/** + * Find and return a content-type header. + */ +const failable<string> contentType(const list<string>& h) { + return header("Content-Type: ", h); +} + +/** + * HTTP GET, return the resource at the given URL. + */ +template<typename R> const failable<list<R> > get(const lambda<R(const string&, const R)>& reduce, const R& initial, const string& url, const CURLSession& ch) { + debug(url, "http::get::url"); + const list<list<string> > req = mklist(list<string>(), list<string>()); + return apply(req, reduce, initial, url, "GET", ch); +} + +/** + * HTTP GET, return a list of values representing the resource at the given URL. + */ +const failable<value> getcontent(const string& url, const CURLSession& ch) { + debug(url, "http::get::url"); + + // Get the contents of the resource at the given URL + const failable<list<list<string> > > res = get<list<string>>(rcons<string>, list<string>(), url, ch); + if (!hasContent(res)) + return mkfailure<value>(reason(res)); + const list<string> ls(reverse(cadr(content(res)))); + + // Return the content as a list of values + const value val(mkvalues(ls)); + debug(val, "http::get::result"); + return val; +} + +/** + * HTTP GET, return a list of values representing the resource at the given URL. + */ +const failable<value> get(const string& url, const CURLSession& ch) { + debug(url, "http::get::url"); + + // Get the contents of the resource at the given URL + const failable<list<list<string> > > res = get<list<string> >(rcons<string>, list<string>(), url, ch); + if (!hasContent(res)) + return mkfailure<value>(reason(res)); + const list<string> ls(reverse(cadr(content(res)))); + + const string ct(content(contentType(car(content(res))))); + if (ct == "application/atom+xml;type=entry") { + const value val(atom::entryValue(content(atom::readEntry(ls)))); + debug(val, "http::get::result"); + return val; + } + + // Return the content as a list of values + const value val(mkvalues(ls)); + debug(val, "http::get::result"); + return val; +} + +/** + * HTTP POST. + */ +const failable<value> post(const value& val, const string& url, const CURLSession& ch) { + + // Convert value to an ATOM entry + const failable<list<string> > entry = atom::writeATOMEntry(atom::entryValuesToElements(val)); + if (!hasContent(entry)) + return mkfailure<value>(reason(entry)); + debug(url, "http::post::url"); + debug(content(entry), "http::post::input"); + + // POST it to the URL + const list<string> h = mklist<string>("Content-Type: application/atom+xml"); + const list<list<string> > req = mklist<list<string> >(h, content(entry)); + const failable<list<list<string> > > res = apply<list<string>>(req, rcons<string>, list<string>(), url, "POST", ch); + if (!hasContent(res)) + return mkfailure<value>(reason(res)); + + // Return the new entry id from the HTTP location header + const failable<value> eid(entryId(location(car(content(res))))); + debug(eid, "http::post::result"); + return eid; +} + +/** + * HTTP PUT. + */ +const failable<value> put(const value& val, const string& url, const CURLSession& ch) { + + // Convert value to an ATOM entry + const failable<list<string> > entry = atom::writeATOMEntry(atom::entryValuesToElements(val)); + if (!hasContent(entry)) + return mkfailure<value>(reason(entry)); + debug(url, "http::put::url"); + debug(content(entry), "http::put::input"); + + // PUT it to the URL + const list<string> h = mklist<string>("Content-Type: application/atom+xml"); + const list<list<string> > req = mklist<list<string> >(h, content(entry)); + const failable<list<list<string> > > res = apply<list<string> >(req, rcons<string>, list<string>(), url, "PUT", ch); + if (!hasContent(res)) + return mkfailure<value>(reason(res)); + + debug(true, "http::put::result"); + return value(true); +} + +/** + * HTTP DELETE. + */ +const failable<value, string> del(const string& url, const CURLSession& ch) { + debug(url, "http::delete::url"); + + const list<list<string> > req = mklist(list<string>(), list<string>()); + const failable<list<list<string> > > res = apply<list<string> >(req, rcons<string>, list<string>(), url, "DELETE", ch); + if (!hasContent(res)) + return mkfailure<value>(reason(res)); + + debug(true, "http::delete::result"); + return value(true); +} + +/** + * HTTP client proxy function. + */ +struct proxy { + proxy(const string& uri) : uri(uri) { + } + + const value operator()(const list<value>& args) const { + CURLSession cs; + failable<value> val = evalExpr(args, uri, cs); + if (!hasContent(val)) + return value(); + return content(val); + } + + const string uri; +}; + +} +} + +#endif /* tuscany_curl_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/http/htdocs/index.html b/sca-cpp/branches/cpp-contrib/modules/http/htdocs/index.html new file mode 100644 index 0000000000..1bfb3e30c2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/htdocs/index.html @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body><h1>It works!</h1></body></html> + diff --git a/sca-cpp/branches/cpp-contrib/modules/http/http-test b/sca-cpp/branches/cpp-contrib/modules/http/http-test new file mode 100755 index 0000000000..9f65b37eec --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/http-test @@ -0,0 +1,32 @@ +#!/bin/sh + +# 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. + +# Setup +./httpd-conf tmp 8090 htdocs +./httpd-start tmp +sleep 2 + +# Test +./curl-test +rc=$? + +# Cleanup +./httpd-stop tmp +sleep 2 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/http/httpd-conf b/sca-cpp/branches/cpp-contrib/modules/http/httpd-conf new file mode 100755 index 0000000000..434040803d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/httpd-conf @@ -0,0 +1,36 @@ +#!/bin/sh + +# 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. + +# Generate a minimal httpd.conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` +port=$2 +htdocs=`readlink -f $3` + +mkdir -p $root +mkdir -p $root/logs +mkdir -p $root/conf +cat >$root/conf/httpd.conf <<EOF +ErrorLog $root/logs/error_log +ServerName http://127.0.0.1:$port +Listen $port +DocumentRoot $htdocs +TypesConfig $here/conf/mime.types +EOF + diff --git a/sca-cpp/branches/cpp-contrib/modules/http/httpd-restart b/sca-cpp/branches/cpp-contrib/modules/http/httpd-restart new file mode 100755 index 0000000000..92f27eb0df --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/httpd-restart @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +# Restart httpd server +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +httpd_prefix=`cat $here/httpd.prefix` +$httpd_prefix/bin/apachectl -k graceful -d $root diff --git a/sca-cpp/branches/cpp-contrib/modules/http/httpd-start b/sca-cpp/branches/cpp-contrib/modules/http/httpd-start new file mode 100755 index 0000000000..91fc5284af --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/httpd-start @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +# Start httpd server +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +httpd_prefix=`cat $here/httpd.prefix` +$httpd_prefix/bin/apachectl -E $root/logs/error_log -k start -d $root diff --git a/sca-cpp/branches/cpp-contrib/modules/http/httpd-stop b/sca-cpp/branches/cpp-contrib/modules/http/httpd-stop new file mode 100755 index 0000000000..7f4fe94629 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/httpd-stop @@ -0,0 +1,25 @@ +#!/bin/sh + +# 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. + +# Stop httpd server +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +httpd_prefix=`cat $here/httpd.prefix` +$httpd_prefix/bin/apachectl -k graceful-stop -d $root diff --git a/sca-cpp/branches/cpp-contrib/modules/http/httpd-test b/sca-cpp/branches/cpp-contrib/modules/http/httpd-test new file mode 100755 index 0000000000..952a58937a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/httpd-test @@ -0,0 +1,38 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +./httpd-conf tmp 8090 htdocs +./httpd-start tmp +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html +diff tmp/index.html htdocs/index.html +rc=$? + +# Cleanup +./httpd-stop tmp +sleep 2 +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/http/httpd.hpp b/sca-cpp/branches/cpp-contrib/modules/http/httpd.hpp new file mode 100644 index 0000000000..bd0e23f76b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/http/httpd.hpp @@ -0,0 +1,396 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_httpd_hpp +#define tuscany_httpd_hpp + +/** + * HTTPD module implementation functions. + */ + +#include "apr_strings.h" +#include "apr_fnmatch.h" +#include "apr_lib.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_script.h" +#include "util_md5.h" +#include "http_config.h" +#include "ap_mpm.h" +#include "mod_core.h" + +#include "string.hpp" +#include "stream.hpp" +#include "list.hpp" +#include "value.hpp" + + +namespace tuscany { +namespace httpd { + +/** + * Returns a server-scoped module configuration. + */ +template<typename C> void* makeServerConf(apr_pool_t *p, server_rec *s) { + return new (gc_new<C>(p)) C(s); +} + +template<typename C> const C& serverConf(const request_rec* r, const module* mod) { + return *(C*)ap_get_module_config(r->server->module_config, mod); +} + +template<typename C> C& serverConf(const server_rec* s, const module* mod) { + return *(C*)ap_get_module_config(s->module_config, mod); +} + +template<typename C> C& serverConf(const cmd_parms *cmd, const module* mod) { + return *(C*)ap_get_module_config(cmd->server->module_config, mod); +} + + +/** + * Return the content type of a request. + */ +const char* optional(const char* s) { + if (s == NULL) + return ""; + return s; +} + +const string contentType(const request_rec* r) { + return optional(apr_table_get(r->headers_in, "Content-Type")); +} + +#ifdef WANT_MAINTAINER_MODE + +/** + * Debug log. + */ +int debugHeader(unused void* r, const char* key, const char* value) { + cerr << " header key: " << key << ", value: " << value << endl; + return 1; +} + +const bool debugRequest(request_rec* r, const string& msg) { + cerr << msg << ":" << endl; + cerr << " protocol: " << optional(r->protocol) << endl; + cerr << " method: " << optional(r->method) << endl; + cerr << " method number: " << r->method_number << endl; + cerr << " content type: " << contentType(r) << endl; + cerr << " content encoding: " << optional(r->content_encoding) << endl; + apr_table_do(debugHeader, r, r->headers_in, NULL); + cerr << " unparsed uri: " << optional(r->unparsed_uri) << endl; + cerr << " uri: " << optional(r->uri) << endl; + cerr << " path info: " << optional(r->path_info) << endl; + cerr << " filename: " << optional(r->filename) << endl; + cerr << " uri tokens: " << pathTokens(r->uri) << endl; + cerr << " args: " << optional(r->args) << endl; + return true; +} + +#define httpdDebugRequest(r, msg) httpd::debugRequest(r, msg) + +#else + +#define httpdDebugRequest(r, msg) + +#endif + +/** + * Return the remaining part of a uri after the given path (aka the path info.) + */ +const list<value> pathInfo(const list<value>& uri, const list<value>& path) { + if (isNil(path)) + return uri; + return pathInfo(cdr(uri), cdr(path)); +} + +/** + * Returns a list of key value pairs from the args in a query string. + */ +const list<value> queryArg(const string& s) { + const list<string> t = tokenize("=", s); + return mklist<value>(c_str(car(t)), cadr(t)); +} + +const list<list<value> > queryArgs(const request_rec* r) { + const char* a = r->args; + if (a == NULL) + return list<list<value> >(); + return map<string, list<value>>(queryArg, tokenize("&", a)); +} + +/** + * Returns a list of param values other than the id and method args from a list + * of key value pairs. + */ +const list<value> queryParams(const list<list<value> >& a) { + if (isNil(a)) + return list<value>(); + const list<value> p = car(a); + if (car(p) == value("id") || car(p) == value("method")) + return queryParams(cdr(a)); + return cons(cadr(p), queryParams(cdr(a))); +} + +/** + * Converts the args received in a POST to a list of key value pairs. + */ +const list<list<value> > postArgs(const list<value>& a) { + if (isNil(a)) + return list<list<value> >(); + const list<value> l = car(a); + return cons(l, postArgs(cdr(a))); +} + +/** + * Setup the HTTP read policy. + */ +const int setupReadPolicy(request_rec* r) { + const int rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK); + if(rc != OK) + return rc; + ap_should_client_block(r); + if(r->read_chunked == true && r->remaining == 0) + r->chunked = true; + //apr_table_setn(r->headers_out, "Connection", "close"); + return OK; +} + +/** + * Read the content of a POST or PUT. + */ +const list<string> read(request_rec* r) { + char b[1024]; + const int n = ap_get_client_block(r, b, sizeof(b)); + if (n <= 0) + return list<string>(); + return cons(string(b, n), read(r)); +} + +/** + * Convert a URI represented as a list to an absolute URL. + */ +const char* url(const list<value>& v, request_rec* r) { + const string u = string(r->uri) + path(v); + return ap_construct_url(r->pool, c_str(u), r); +} + +/** + * Write an HTTP result. + */ +const failable<int> writeResult(const failable<list<string> >& ls, const string& ct, request_rec* r) { + if (!hasContent(ls)) + return mkfailure<int>(reason(ls)); + ostringstream os; + write(content(ls), os); + const string ob(str(os)); + debug(ob, "httpd::result"); + + const string etag(ap_md5(r->pool, (const unsigned char*)c_str(ob))); + const char* match = apr_table_get(r->headers_in, "If-None-Match"); + apr_table_setn(r->headers_out, "ETag", apr_pstrdup(r->pool, c_str(etag))); + if (match != NULL && etag == match) { + r->status = HTTP_NOT_MODIFIED; + return OK; + } + ap_set_content_type(r, apr_pstrdup(r->pool, c_str(ct))); + ap_rputs(c_str(ob), r); + return OK; +} + +/** + * Report request execution status. + */ +const int reportStatus(const failable<int>& rc) { + if (!hasContent(rc)) + return HTTP_INTERNAL_SERVER_ERROR; + return content(rc); +} + +/** + * Construct a redirect URI. + */ +const string redirectURI(const string& file, const string& pi) { + return file + pi; +} + +const string redirectURI(const string& file, const string& pi, const string& args) { + return file + pi + "?" + args; +} + +/** + * Convert a value to an HTTPD request struc + */ +request_rec* request(const value& v) { + return (request_rec*)(long)(double)v; +} + +/** + * Convert an HTTPD request struct to a value + */ +const value requestValue(request_rec* r) { + return value((double)(long)r); +} + +/** + * Update filters in an HTTPD redirect request. + * Similar to httpd/modules/http/http_request.c::update_r_in_filters. + */ +const bool redirectFilters(ap_filter_t* f, request_rec* from, request_rec* to) { + if (f == NULL) + return true; + if (f->r == from) + f->r = to; + return redirectFilters(f->next, from, to); +} + +/** + * Create an HTTPD redirect request. + * Similar to httpd/modules/http/http_request.c::internal_internal_redirect. + */ +extern "C" { + AP_DECLARE(ap_conf_vector_t*) ap_create_request_config(apr_pool_t *p); +} + +const failable<request_rec*, int> internalRedirectRequest(const string& nr_uri, request_rec* r) { + if (ap_is_recursion_limit_exceeded(r)) + return mkfailure<request_rec*, int>(HTTP_INTERNAL_SERVER_ERROR); + + // Create a new request + request_rec* nr = (request_rec*)apr_pcalloc(r->pool, sizeof(request_rec)); + nr->connection = r->connection; + nr->server = r->server; + nr->pool = r->pool; + nr->method = r->method; + nr->method_number = r->method_number; + nr->allowed_methods = ap_make_method_list(nr->pool, 2); + ap_parse_uri(nr, apr_pstrdup(nr->pool, c_str(nr_uri))); + nr->request_config = ap_create_request_config(r->pool); + nr->per_dir_config = r->server->lookup_defaults; + nr->prev = r; + r->next = nr; + + // Run create request hook + ap_run_create_request(nr); + + // Inherit protocol info from the original request + nr->the_request = r->the_request; + nr->allowed = r->allowed; + nr->status = r->status; + nr->assbackwards = r->assbackwards; + nr->header_only = r->header_only; + nr->protocol = r->protocol; + nr->proto_num = r->proto_num; + nr->hostname = r->hostname; + nr->request_time = r->request_time; + nr->main = r->main; + nr->headers_in = r->headers_in; + nr->headers_out = apr_table_make(r->pool, 12); + nr->err_headers_out = r->err_headers_out; + nr->subprocess_env = r->subprocess_env; + nr->notes = apr_table_make(r->pool, 5); + nr->allowed_methods = ap_make_method_list(nr->pool, 2); + nr->htaccess = r->htaccess; + nr->no_cache = r->no_cache; + nr->expecting_100 = r->expecting_100; + nr->no_local_copy = r->no_local_copy; + nr->read_length = r->read_length; + nr->vlist_validator = r->vlist_validator; + + // Setup input and output filters + nr->proto_output_filters = r->proto_output_filters; + nr->proto_input_filters = r->proto_input_filters; + nr->output_filters = nr->proto_output_filters; + nr->input_filters = nr->proto_input_filters; + if (nr->main) + ap_add_output_filter_handle(ap_subreq_core_filter_handle, NULL, nr, nr->connection); + redirectFilters(nr->input_filters, r, nr); + redirectFilters(nr->output_filters, r, nr); + const int rrc = ap_run_post_read_request(nr); + if (rrc != OK && rrc != DECLINED) + return mkfailure<request_rec*, int>(rrc); + + return nr; +} + +/** + * Process an HTTPD internal redirect request. + * Similar to httpd/modules/http/http_request.c::ap_internal_redirect. + */ +extern "C" { + AP_DECLARE(int) ap_invoke_handler(request_rec *r); +} + +const int internalRedirect(request_rec* nr) { + int status = ap_run_quick_handler(nr, 0); + if (status == DECLINED) { + status = ap_process_request_internal(nr); + if (status == OK) + status = ap_invoke_handler(nr); + } + if (status != OK) { + nr->status = status; + return OK; + } + ap_finalize_request_protocol(nr); + return OK; +} + +/** + * Create and process an HTTPD redirect request. + */ +const int internalRedirect(const string& uri, request_rec* r) { + const failable<request_rec*, int> nr = httpd::internalRedirectRequest(uri, r); + if (!hasContent(nr)) + return reason(nr); + return httpd::internalRedirect(content(nr)); +} + +/** + * Put a value in the process user data. + */ +const bool putUserData(const string& k, const void* v, const server_rec* s) { + apr_pool_userdata_set((const void *)v, c_str(k), apr_pool_cleanup_null, s->process->pool); + return true; +} + +/** + * Return a user data value. + */ +const void* userData(const string& k, const server_rec* s) { + void* v = NULL; + apr_pool_userdata_get(&v, c_str(k), s->process->pool); + return v; +} + +} +} + +#endif /* tuscany_httpd_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/java/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/java/Makefile.am new file mode 100644 index 0000000000..5402ab495e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/Makefile.am @@ -0,0 +1,60 @@ +# 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. + +JAVAROOT = $(top_builddir)/modules/java +libdir = $(prefix)/lib + +if WANT_JAVA + +noinst_PROGRAMS = java-test java-shell client-test + +lib_LTLIBRARIES = libmod_tuscany_java.la + +INCLUDES = -I${JAVA_INCLUDE} + +libmod_tuscany_java_la_SOURCES = mod-java.cpp +libmod_tuscany_java_la_LDFLAGS = -lxml2 -lcurl -lmozjs -L${JAVA_LIB} -R${JAVA_LIB} -R${JAVA_LIB}/server -ljava + +java_test_SOURCES = java-test.cpp +java_test_LDFLAGS = -L${JAVA_LIB} -R${JAVA_LIB} -R${JAVA_LIB}/server -ljava + +java_shell_SOURCES = java-shell.cpp +java_shell_LDFLAGS = -L${JAVA_LIB} -R${JAVA_LIB} -R${JAVA_LIB}/server -ljava + +noinst_JAVA = org/apache/tuscany/*.java test/*.java + +jarfile = libmod-tuscany-java-${PACKAGE_VERSION}.jar +jardir = ${libdir} +jar_DATA = ${jarfile} + +${jarfile}: ${noinst_JAVA} + ${JAR} cf $@ org/apache/tuscany/*.class + +CLEANFILES = ${jarfile} org/apache/tuscany/*.class test/*.class + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs + +prefixdir = $(top_builddir)/modules/java +prefix_DATA = java.prefix + +java.prefix: $(top_builddir)/config.status + echo ${JAVA_PREFIX} >java.prefix + +TESTS = java-test server-test + +endif diff --git a/sca-cpp/branches/cpp-contrib/modules/java/client-test.cpp b/sca-cpp/branches/cpp-contrib/modules/java/client-test.cpp new file mode 100644 index 0000000000..d4a4d65ab4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/client-test.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test HTTP client functions. + */ + +#include "stream.hpp" +#include "string.hpp" +#include "../server/client-test.hpp" + +namespace tuscany { +namespace server { + +string testURI = "http://localhost:8090/java"; + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::server::testServer(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/domain-test.composite b/sca-cpp/branches/cpp-contrib/modules/java/domain-test.composite new file mode 100644 index 0000000000..190f2ff5bb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/domain-test.composite @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://domain/test" + name="domain-test"> + + <component name="java-test"> + <implementation.java class="test.ServerImpl"/> + <service name="test"> + <t:binding.http uri="java"/> + </service> + </component> + + <component name="client-test"> + <implementation.java class="test.ClientImpl"/> + <service name="client"> + <t:binding.http uri="client"/> + </service> + <reference name="ref" target="java-test"> + <t:binding.http/> + </reference> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/modules/java/driver.hpp b/sca-cpp/branches/cpp-contrib/modules/java/driver.hpp new file mode 100644 index 0000000000..ddfc057940 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/driver.hpp @@ -0,0 +1,61 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_java_driver_hpp +#define tuscany_java_driver_hpp + +/** + * Java evaluator main driver loop. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "monad.hpp" +#include "../scheme/driver.hpp" +#include "eval.hpp" + +namespace tuscany { +namespace java { + +const value evalDriverLoop(const JavaRuntime& jr, const JavaClass jc, istream& in, ostream& out) { + scheme::promptForInput(scheme::evalInputPrompt, out); + value input = scheme::readValue(in); + if (isNil(input)) + return input; + const failable<value> output = evalClass(jr, input, jc); + scheme::announceOutput(scheme::evalOutputPrompt, out); + scheme::userPrint(content(output), out); + return evalDriverLoop(jr, jc, in, out); +} + +const bool evalDriverRun(const char* name, istream& in, ostream& out) { + scheme::setupDisplay(out); + JavaRuntime javaRuntime; + const failable<JavaClass> jc = readClass(javaRuntime, ".", name); + if (!hasContent(jc)) + return true; + evalDriverLoop(javaRuntime, content(jc), in, out); + return true; +} + +} +} +#endif /* tuscany_java_driver_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/java/eval.hpp b/sca-cpp/branches/cpp-contrib/modules/java/eval.hpp new file mode 100644 index 0000000000..741dda52ca --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/eval.hpp @@ -0,0 +1,527 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_java_eval_hpp +#define tuscany_java_eval_hpp + +/** + * Java component implementation evaluation logic. + */ +#include <jni.h> + +#include "list.hpp" +#include "value.hpp" + +namespace tuscany { +namespace java { + +/** + * Represent a Java VM runtime. + */ +jobject JNICALL nativeInvoke(JNIEnv *env, jobject self, jobject proxy, jobject method, jobjectArray args); + +class JavaRuntime { +public: + JavaRuntime() { + + // Get existing JVM + jsize nvms = 0; + JNI_GetCreatedJavaVMs(&jvm, 1, &nvms); + if (nvms == 0) { + + // Create a new JVM + JavaVMInitArgs args; + args.version = JNI_VERSION_1_6; + args.ignoreUnrecognized = JNI_FALSE; + JavaVMOption options[3]; + args.options = options; + args.nOptions = 0; + + // Configure classpath + const char* envcp = getenv("CLASSPATH"); + const string cp = string("-Djava.class.path=") + (envcp == NULL? "." : envcp); + options[args.nOptions++].optionString = const_cast<char*>(c_str(cp)); + +#ifdef WANT_MAINTAINER_MODE + // Enable assertions + options[args.nOptions++].optionString = const_cast<char*>("-ea"); +#endif + + // Configure Java debugging + const char* jpdaopts = getenv("JPDA_OPTS"); + if (jpdaopts != NULL) { + options[args.nOptions++].optionString = const_cast<char*>(jpdaopts); + } else { + const char* jpdaaddr = getenv("JPDA_ADDRESS"); + if (jpdaaddr != NULL) { + const string jpda = string("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=") + jpdaaddr; + options[args.nOptions++].optionString = const_cast<char*>(c_str(jpda)); + } + } + + // Create the JVM + JNI_CreateJavaVM(&jvm, (void**)&env, &args); + + } else { + + // Just point to existing JVM + jvm->GetEnv((void**)&env, JNI_VERSION_1_6); + } + + // Lookup System classes and methods + classClass = env->FindClass("java/lang/Class"); + methodClass = env->FindClass("java/lang/reflect/Method"); + objectClass = env->FindClass("java/lang/Object"); + doubleClass = env->FindClass("java/lang/Double"); + booleanClass = env->FindClass("java/lang/Boolean"); + stringClass = env->FindClass("java/lang/String"); + objectArrayClass = env->FindClass("[Ljava/lang/Object;"); + iterableClass = env->FindClass("Ljava/lang/Iterable;"); + classForName = env->GetStaticMethodID(classClass, "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"); + doubleValueOf = env->GetStaticMethodID(doubleClass, "valueOf", "(D)Ljava/lang/Double;"); + doubleValue = env->GetMethodID(doubleClass, "doubleValue", "()D"); + booleanValueOf = env->GetStaticMethodID(booleanClass, "valueOf", "(Z)Ljava/lang/Boolean;"); + booleanValue = env->GetMethodID(booleanClass, "booleanValue", "()Z"); + declaredMethods = env->GetMethodID(classClass, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); + methodName = env->GetMethodID(methodClass, "getName", "()Ljava/lang/String;"); + parameterTypes = env->GetMethodID(methodClass, "getParameterTypes", "()[Ljava/lang/Class;"); + + // Lookup Tuscany classes and methods + loaderClass = env->FindClass("org/apache/tuscany/ClassLoader"); + loaderValueOf = env->GetStaticMethodID(loaderClass, "valueOf", "(Ljava/lang/String;)Ljava/lang/ClassLoader;"); + loaderForName = env->GetStaticMethodID(loaderClass, "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"); + invokerClass = env->FindClass("org/apache/tuscany/InvocationHandler"); + invokerValueOf = env->GetStaticMethodID(invokerClass, "valueOf", "(Ljava/lang/Class;J)Ljava/lang/Object;"); + invokerStackTrace = env->GetStaticMethodID(invokerClass, "stackTrace", "(Ljava/lang/Throwable;)Ljava/lang/String;"); + invokerLambda = env->GetFieldID(invokerClass, "lambda", "J"); + iterableUtilClass = env->FindClass("org/apache/tuscany/IterableUtil"); + iterableValueOf = env->GetStaticMethodID(iterableUtilClass, "list", "([Ljava/lang/Object;)Ljava/lang/Iterable;"); + iterableIsNil = env->GetStaticMethodID(iterableUtilClass, "isNil", "(Ljava/lang/Object;)Z"); + iterableCar = env->GetStaticMethodID(iterableUtilClass, "car", "(Ljava/lang/Object;)Ljava/lang/Object;"); + iterableCdr = env->GetStaticMethodID(iterableUtilClass, "cdr", "(Ljava/lang/Object;)Ljava/lang/Iterable;"); + + // Register our native invocation handler function + JNINativeMethod nm; + nm.name = const_cast<char*>("invoke"); + nm.signature = const_cast<char*>("(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;"); + nm.fnPtr = (void*)nativeInvoke; + env->RegisterNatives(invokerClass, &nm, 1); + } + + JavaVM* jvm; + JNIEnv* env; + + jclass classClass; + jclass methodClass; + jclass objectClass; + jclass doubleClass; + jclass booleanClass; + jclass stringClass; + jclass objectArrayClass; + jclass iterableClass; + jmethodID doubleValueOf; + jmethodID doubleValue; + jmethodID booleanValueOf; + jmethodID booleanValue; + jmethodID declaredMethods; + jmethodID methodName; + jmethodID parameterTypes; + jmethodID classForName; + jclass loaderClass; + jmethodID loaderValueOf; + jmethodID loaderForName; + jclass invokerClass; + jmethodID invokerValueOf; + jmethodID invokerStackTrace; + jfieldID invokerLambda; + jclass iterableUtilClass; + jmethodID iterableValueOf; + jmethodID iterableCar; + jmethodID iterableCdr; + jmethodID iterableIsNil; +}; + +/** + * Return the last exception that occurred in a JVM. + */ +string lastException(const JavaRuntime& jr) { + if (!jr.env->ExceptionCheck()) + return "No Exception"; + const jthrowable ex = jr.env->ExceptionOccurred(); + const jstring trace = (jstring)jr.env->CallStaticObjectMethod(jr.invokerClass, jr.invokerStackTrace, ex); + const char* c = jr.env->GetStringUTFChars(trace, NULL); + const string msg(c); + jr.env->ReleaseStringUTFChars(trace, c); + jr.env->ExceptionClear(); + return msg; +} + +/** + * Declare conversion functions. + */ +const jobject valueToJobject(const JavaRuntime& jr, const value& jtype, const value& v); +const value jobjectToValue(const JavaRuntime& jr, const jobject o); +const jobjectArray valuesToJarray(const JavaRuntime& jr, const list<value>& v); +const list<value> jarrayToValues(const JavaRuntime& jr, const jobjectArray o); +const list<value> jiterableToValues(const JavaRuntime& jr, const jobject o); + +/** + * Convert a Java class name to a JNI class name. + */ +const bool jniClassNameHelper(char* to, const char* from) { + if (*from == '\0') { + *to = '\0'; + return true; + } + *to = *from == '.'? '/' : *from; + return jniClassNameHelper(to + 1, from + 1); +} + +const string jniClassName(const string& from) { + char buf[length(from) + 1]; + jniClassNameHelper(buf, c_str(from)); + return string(buf); +} + +/** + * Create a new Java object representing a lambda expression. + */ +class javaLambda { +public: + javaLambda(const JavaRuntime& jr, const value& iface, const lambda<value(const list<value>&)>& func) : jr(jr), iface(iface), func(func) { + } + + const value operator()(const list<value>& expr) const { + if (isNil(expr)) + return func(expr); + const value& op(car(expr)); + if (op == "equals") + return value(cadr(expr) == this); + if (op == "hashCode") + return value((double)(long)this); + if (op == "toString") { + ostringstream os; + os << this; + return value(string("org.apache.tuscany.InvocationHandler@") + (c_str(str(os)) + 2)); + } + return func(expr); + } + + const JavaRuntime& jr; + const value iface; + const lambda<value(const list<value>&)> func; +}; + +/** + * Invocation handler invoke method, dispatches to the lambda function wrapped + * in the invocation handler. + */ +jobject JNICALL nativeInvoke(JNIEnv* env, jobject self, unused jobject proxy, jobject method, jobjectArray args) { + + // Retrieve the lambda function from the invocation handler + jclass clazz = env->GetObjectClass(self); + jfieldID f = env->GetFieldID(clazz, "lambda", "J"); + const javaLambda& jl = *(javaLambda*)(long)env->GetLongField(self, f); + + // Retrieve the function name + const jstring s = (jstring)env->CallObjectMethod(method, jl.jr.methodName); + const char* c = env->GetStringUTFChars(s, NULL); + const value func(c); + env->ReleaseStringUTFChars(s, c); + + // Build the expression to evaluate, either (func, args[0], args[1], args[2]...) + // or just args[0] for the special eval(...) function + const list<value> expr = func == "eval"? (list<value>)car<value>(jarrayToValues(jl.jr, args)) : cons<value>(func, jarrayToValues(jl.jr, args)); + debug(expr, "java::nativeInvoke::expr"); + + // Invoke the lambda function + value result = jl(expr); + debug(result, "java::nativeInvoke::result"); + + // Convert result to a jobject + return valueToJobject(jl.jr, value(), result); +} + +/** + * Convert a lambda function to Java proxy. + */ +const jobject mkJavaLambda(const JavaRuntime& jr, unused const value& iface, const lambda<value(const list<value>&)>& l) { + const gc_ptr<javaLambda> jl = new (gc_new<javaLambda>()) javaLambda(jr, iface, l); + jclass jc = (jclass)(long)(double)iface; + const jobject obj = jr.env->CallStaticObjectMethod(jr.invokerClass, jr.invokerValueOf, jc, (long)(javaLambda*)jl); + return obj; +} + +/** + * Convert a list of values to a Java jobjectArray. + */ +const jobjectArray valuesToJarrayHelper(const JavaRuntime& jr, jobjectArray a, const list<value>& v, const int i) { + if (isNil(v)) + return a; + jr.env->SetObjectArrayElement(a, i, valueToJobject(jr, value(), car(v))); + return valuesToJarrayHelper(jr, a, cdr(v), i + 1); +} + +const jobjectArray valuesToJarray(const JavaRuntime& jr, const list<value>& v) { + jobjectArray a = jr.env->NewObjectArray(length(v), jr.objectClass, NULL); + return valuesToJarrayHelper(jr, a, v, 0); +} + +/** + * Convert a Java jobjectArray to a Java iterable. + */ +const jobject jarrayToJiterable(const JavaRuntime& jr, jobjectArray a) { + return jr.env->CallStaticObjectMethod(jr.iterableClass, jr.iterableValueOf, a); +} + +/** + * Convert a value to a Java jobject. + */ +const jobject valueToJobject(const JavaRuntime& jr, const value& jtype, const value& v) { + switch (type(v)) { + case value::List: + return jarrayToJiterable(jr, valuesToJarray(jr, v)); + case value::Lambda: + return mkJavaLambda(jr, jtype, v); + case value::Symbol: + return jr.env->NewStringUTF(c_str(string("'") + v)); + case value::String: + return jr.env->NewStringUTF(c_str(v)); + case value::Number: + return jr.env->CallStaticObjectMethod(jr.doubleClass, jr.doubleValueOf, (double)v); + case value::Bool: + return jr.env->CallStaticObjectMethod(jr.booleanClass, jr.booleanValueOf, (bool)v); + default: + return NULL; + } +} + +/** + * Convert a list of values to an array of jvalues. + */ +const jvalue* valuesToJvaluesHelper(const JavaRuntime& jr, jvalue* a, const list<value>& types, const list<value>& v) { + if (isNil(v)) + return a; + a->l = valueToJobject(jr, car(types), car(v)); + return valuesToJvaluesHelper(jr, a + 1, cdr(types), cdr(v)); +} + +const jvalue* valuesToJvalues(const JavaRuntime& jr, const list<value>& types, const list<value>& v) { + const int n = length(v); + jvalue* a = new (gc_anew<jvalue>(n)) jvalue[n]; + valuesToJvaluesHelper(jr, a, types, v); + return a; +} + +/** + * Convert a Java jobjectArray to a list of values. + */ +const list<value> jarrayToValuesHelper(const JavaRuntime& jr, jobjectArray a, const int i, const int size) { + if (i == size) + return list<value>(); + return cons(jobjectToValue(jr, jr.env->GetObjectArrayElement(a, i)), jarrayToValuesHelper(jr, a, i + 1, size)); +} + +const list<value> jarrayToValues(const JavaRuntime& jr, jobjectArray o) { + if (o == NULL) + return list<value>(); + return jarrayToValuesHelper(jr, o, 0, jr.env->GetArrayLength(o)); +} + +/** + * Convert a Java Iterable to a list of values. + */ +const list<value> jiterableToValuesHelper(const JavaRuntime& jr, jobject o) { + if ((bool)jr.env->CallStaticBooleanMethod(jr.iterableUtilClass, jr.iterableIsNil, o)) + return list<value>(); + jobject car = jr.env->CallStaticObjectMethod(jr.iterableUtilClass, jr.iterableCar, o); + jobject cdr = jr.env->CallStaticObjectMethod(jr.iterableUtilClass, jr.iterableCdr, o); + return cons(jobjectToValue(jr, car), jiterableToValuesHelper(jr, cdr)); +} + +const list<value> jiterableToValues(const JavaRuntime& jr, jobject o) { + if (o == NULL) + return list<value>(); + return jiterableToValuesHelper(jr, o); +} + +/** + * Lambda function used to represent a Java callable object. + */ +struct javaCallable { + const JavaRuntime& jr; + const jobject obj; + + javaCallable(const JavaRuntime& jr, const jobject obj) : jr(jr), obj(obj) { + } + + const value operator()(const list<value>& args) const { + jobjectArray jargs = valuesToJarray(jr, args); + jobject result = jargs; //CallObject(func, jargs); + return jobjectToValue(jr, result); + } +}; + +/** + * Convert a Java jobject to a value. + */ +const value jobjectToValue(const JavaRuntime& jr, const jobject o) { + if (o == NULL) + return value(); + const jclass clazz = jr.env->GetObjectClass(o); + if ((jr.env->IsSameObject(clazz, jr.stringClass))) { + const char* s = jr.env->GetStringUTFChars((jstring)o, NULL); + if (*s == '\'') { + const value v(s + 1); + jr.env->ReleaseStringUTFChars((jstring)o, s); + return v; + } + const value v = string(s); + jr.env->ReleaseStringUTFChars((jstring)o, s); + return v; + } + if (jr.env->IsSameObject(clazz, jr.booleanClass)) + return value((bool)jr.env->CallBooleanMethod(o, jr.booleanValue)); + if (jr.env->IsSameObject(clazz, jr.doubleClass)) + return value((double)jr.env->CallDoubleMethod(o, jr.doubleValue)); + if (jr.env->IsAssignableFrom(clazz, jr.iterableClass)) + return jiterableToValues(jr, o); + if (jr.env->IsAssignableFrom(clazz, jr.objectArrayClass)) + return jarrayToValues(jr, (jobjectArray)o); + return lambda<value(const list<value>&)>(javaCallable(jr, o)); +} + +/** + * Returns a balanced tree of the methods of a class. + */ +const value parameterTypeToValue(const jobject t) { + return value((double)(long)t); +} + +const list<value> parameterTypesToValues(const JavaRuntime& jr, const jobjectArray t, const int i) { + if (i == 0) + return list<value>(); + return cons<value>(parameterTypeToValue(jr.env->GetObjectArrayElement(t, i - 1)), parameterTypesToValues(jr, t, i - 1)); +} + +const value methodToValue(const JavaRuntime& jr, const jobject m) { + const jobject s = jr.env->CallObjectMethod(m, jr.methodName); + const char* c = jr.env->GetStringUTFChars((jstring)s, NULL); + const string& name = string(c); + jr.env->ReleaseStringUTFChars((jstring)s, c); + + const jmethodID mid = jr.env->FromReflectedMethod(m); + + const jobjectArray t = (jobjectArray)jr.env->CallObjectMethod(m, jr.parameterTypes); + const list<value> types = reverse(parameterTypesToValues(jr, t, jr.env->GetArrayLength(t))); + + return cons<value>(c_str(name), cons<value>((double)(long)mid, types)); +} + +const list<value> methodsToValues(const JavaRuntime& jr, const jobjectArray m, const int i) { + if (i == 0) + return list<value>(); + return cons<value>(methodToValue(jr, jr.env->GetObjectArrayElement(m, i - 1)), methodsToValues(jr, m, i - 1)); +} + +const list<value> methodsToValues(const JavaRuntime& jr, const jclass clazz) { + const jobjectArray m = (jobjectArray)jr.env->CallObjectMethod(clazz, jr.declaredMethods); + return methodsToValues(jr, m, jr.env->GetArrayLength(m)); +} + +/** + * Represents a Java Class. + */ +class JavaClass { +public: + JavaClass() : loader(NULL), clazz(NULL), obj(NULL) { + } + JavaClass(const jobject loader, const jclass clazz, const jobject obj, const list<value> m) : loader(loader), clazz(clazz), obj(obj), m(m) { + } + + const jobject loader; + const jclass clazz; + const jobject obj; + const list<value> m; +}; + +/** + * Read a class. + */ +const failable<JavaClass> readClass(const JavaRuntime& jr, const string& path, const string& name) { + + // Create a class loader from the given path + const jobject jpath = jr.env->NewStringUTF(c_str(path)); + jobject loader = jr.env->CallStaticObjectMethod(jr.loaderClass, jr.loaderValueOf, jpath); + + // Load the class + const jobject jname = jr.env->NewStringUTF(c_str(name)); + const jclass clazz = (jclass)jr.env->CallStaticObjectMethod(jr.loaderClass, jr.loaderForName, jname, JNI_TRUE, loader); + if (clazz == NULL) + return mkfailure<JavaClass>(string("Couldn't load class: ") + name + " : " + lastException(jr)); + + // Create an instance + const jmethodID constr = jr.env->GetMethodID(clazz, "<init>", "()V"); + if (constr == NULL) + return mkfailure<JavaClass>(string("Couldn't find constructor: ") + name + " : " + lastException(jr)); + const jobject obj = jr.env->NewObject(clazz, constr); + if (obj == NULL) + return mkfailure<JavaClass>(string("Couldn't construct object: ") + name + " : " + lastException(jr)); + + return JavaClass(loader, clazz, obj, methodsToValues(jr, clazz)); +} + +/** + * Evaluate an expression against a Java class. + */ +const failable<value> evalClass(const JavaRuntime& jr, const value& expr, const JavaClass jc) { + debug(expr, "java::evalClass::expr"); + + // Lookup the Java function named as the expression operand + const list<value> func = assoc<value>(car<value>(expr), jc.m); + if (isNil(func)) { + + // The start, stop, and restart functions are optional + const value fn = car<value>(expr); + if (fn == "start" || fn == "stop") + return value(lambda<value(const list<value>&)>()); + + return mkfailure<value>(string("Couldn't find function: ") + car<value>(expr) + " : " + lastException(jr)); + } + const jmethodID fid = (jmethodID)(long)(double)cadr(func); + + // Convert args to Java jvalues + const jvalue *args = valuesToJvalues(jr, cddr(func), cdr<value>(expr)); + + // Call the Java function + const jobject result = jr.env->CallObjectMethodA(jc.obj, fid, args); + if (result == NULL) + return mkfailure<value>(string("Function call failed: ") + car<value>(expr) + " : " + lastException(jr)); + + // Convert Java result to a value + const value v = jobjectToValue(jr, result); + debug(v, "java::evalClass::result"); + return v; +} + +} +} +#endif /* tuscany_java_eval_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/java/java-conf b/sca-cpp/branches/cpp-contrib/modules/java/java-conf new file mode 100755 index 0000000000..fb02f7fe57 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/java-conf @@ -0,0 +1,27 @@ +#!/bin/sh + +# 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. + +# Generate a Java server conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +cat >>$root/conf/httpd.conf <<EOF +LoadModule mod_tuscany_eval $here/.libs/libmod_tuscany_java.so +EOF + diff --git a/sca-cpp/branches/cpp-contrib/modules/java/java-shell.cpp b/sca-cpp/branches/cpp-contrib/modules/java/java-shell.cpp new file mode 100644 index 0000000000..51df513990 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/java-shell.cpp @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Java evaluator shell, used for interactive testing of Java classes. + */ + +#include <assert.h> +#include "gc.hpp" +#include "stream.hpp" +#include "string.hpp" +#include "driver.hpp" + +int main(const int argc, char** argv) { + tuscany::gc_scoped_pool pool; + if (argc != 2) { + tuscany::cerr << "Usage: java-shell <class name>" << tuscany::endl; + return 1; + } + tuscany::java::evalDriverRun(argv[1], tuscany::cin, tuscany::cout); + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/java-test.cpp b/sca-cpp/branches/cpp-contrib/modules/java/java-test.cpp new file mode 100644 index 0000000000..f811a4f58d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/java-test.cpp @@ -0,0 +1,138 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test Java evaluator. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "driver.hpp" + +namespace tuscany { +namespace java { + +bool testEvalExpr() { + gc_scoped_pool pool; + JavaRuntime javaRuntime; + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value exp = mklist<value>("mult", 2, 3); + const failable<value> r = evalClass(javaRuntime, exp, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(6)); + } + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value exp = mklist<value>("even", 2); + const failable<value> r = evalClass(javaRuntime, exp, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(true)); + } + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.AdderImpl"); + assert(hasContent(obj)); + const value exp = mklist<value>("add", 2, 3); + const failable<value> r = evalClass(javaRuntime, exp, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(5)); + } + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value exp = mklist<value>("square", mklist<value>(1, 2, 3)); + const failable<value> r = evalClass(javaRuntime, exp, content(obj)); + assert(hasContent(r)); + assert(content(r) == mklist<value>(1, 4, 9)); + } + return true; +} + +const value add(const list<value>& args) { + assert(car(args) == "add"); + const double x = cadr(args); + const double y = caddr(args); + return x + y; +} + +bool testEvalLambda() { + gc_scoped_pool pool; + JavaRuntime javaRuntime; + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value tcel = mklist<value>("add", 3, 4, lambda<value(const list<value>&)>(add)); + const failable<value> r = evalClass(javaRuntime, tcel, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(7)); + } + { + const failable<JavaClass> obj = readClass(javaRuntime, ".", "test.CalcImpl"); + assert(hasContent(obj)); + const value tcel = mklist<value>("addEval", 3, 4, lambda<value(const list<value>&)>(add)); + const failable<value> r = evalClass(javaRuntime, tcel, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(7)); + } + return true; +} + +bool testClassLoader() { + gc_scoped_pool pool; + JavaRuntime javaRuntime; + const failable<JavaClass> obj = readClass(javaRuntime, ".", "org.apache.tuscany.ClassLoader$Test"); + assert(hasContent(obj)); + const value exp = mklist<value>("testClassLoader"); + const failable<value> r = evalClass(javaRuntime, exp, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(true)); + return true; +} + +bool testIterableUtil() { + gc_scoped_pool pool; + JavaRuntime javaRuntime; + const failable<JavaClass> obj = readClass(javaRuntime, ".", "org.apache.tuscany.IterableUtil$Test"); + assert(hasContent(obj)); + const value exp = mklist<value>("testList"); + const failable<value> r = evalClass(javaRuntime, exp, content(obj)); + assert(hasContent(r)); + assert(content(r) == value(true)); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::java::testEvalExpr(); + tuscany::java::testEvalLambda(); + tuscany::java::testClassLoader(); + tuscany::java::testIterableUtil(); + + tuscany::cout << "OK" << tuscany::endl; + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/mod-java.cpp b/sca-cpp/branches/cpp-contrib/modules/java/mod-java.cpp new file mode 100644 index 0000000000..510f9574b0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/mod-java.cpp @@ -0,0 +1,80 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * HTTPD module used to eval Java component implementations. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../server/mod-cpp.hpp" +#include "../server/mod-eval.hpp" +#include "mod-java.hpp" + +namespace tuscany { +namespace server { +namespace modeval { + +/** + * Apply a lifecycle start or restart event. + */ +struct javaLifecycle { + javaLifecycle(java::JavaRuntime& jr) : jr(jr) { + } + const value operator()(const list<value>& params) const { + const value func = car(params); + if (func == "javaRuntime") + return (gc_ptr<value>)(value*)(void*)&jr; + return lambda<value(const list<value>&)>(); + } + java::JavaRuntime& jr; +}; + +const value applyLifecycle(unused const list<value>& params) { + + // Create a Java runtime + java::JavaRuntime& jr = *(new (gc_new<java::JavaRuntime>()) java::JavaRuntime()); + + // Return the function to invoke on subsequent events + return failable<value>(lambda<value(const list<value>&)>(javaLifecycle(jr))); +} + +/** + * Evaluate a Java component implementation and convert it to an applicable + * lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, const lambda<value(const list<value>&)>& lifecycle) { + const string itype(elementName(impl)); + if (contains(itype, ".java")) { + const void* p = (gc_ptr<value>)lifecycle(mklist<value>("javaRuntime")); + return modjava::evalImplementation(path, impl, px, *(java::JavaRuntime*)p); + } + if (contains(itype, ".cpp")) + return modcpp::evalImplementation(path, impl, px); + return mkfailure<lambda<value(const list<value>&)> >(string("Unsupported implementation type: ") + itype); +} + +} +} +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/mod-java.hpp b/sca-cpp/branches/cpp-contrib/modules/java/mod-java.hpp new file mode 100644 index 0000000000..e7da06e930 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/mod-java.hpp @@ -0,0 +1,77 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_modjava_hpp +#define tuscany_modjava_hpp + +/** + * Evaluation functions used by mod-eval to evaluate Java + * component implementations. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "eval.hpp" + +namespace tuscany { +namespace server { +namespace modjava { + +/** + * Apply a Java component implementation function. + */ +struct applyImplementation { + java::JavaClass impl; + const list<value> px; + java::JavaRuntime& jr; + applyImplementation(const java::JavaClass& impl, const list<value>& px, java::JavaRuntime& jr) : impl(impl), px(px), jr(jr) { + } + const value operator()(const list<value>& params) const { + const value expr = append<value>(params, px); + debug(expr, "modeval::java::applyImplementation::input"); + const failable<value> res = java::evalClass(jr, expr, impl); + const value val = !hasContent(res)? mklist<value>(value(), reason(res)) : mklist<value>(content(res)); + debug(val, "modeval::java::applyImplementation::result"); + return val; + } +}; + +/** + * Evaluate a Java component implementation and convert it to an applicable + * lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, java::JavaRuntime& jr) { + const string cn(attributeValue("class", impl)); + const failable<java::JavaClass> jc = java::readClass(jr, path, cn); + if (!hasContent(jc)) + return mkfailure<lambda<value(const list<value>&)> >(reason(jc)); + return lambda<value(const list<value>&)>(applyImplementation(content(jc), px, jr)); +} + +} +} +} + +#endif /* tuscany_modjava_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/ClassLoader.java b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/ClassLoader.java new file mode 100644 index 0000000000..7fb6519472 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/ClassLoader.java @@ -0,0 +1,76 @@ +/* + * 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; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + +/** + * Class loader used to load SCA component implementation classes. + */ +class ClassLoader extends URLClassLoader { + + ClassLoader(final URL... urls) { + super(urls); + } + + /** + * Create a class loader for an SCA contribution path. + */ + static java.lang.ClassLoader valueOf(final String path) throws MalformedURLException { + return new ClassLoader(new File(path).toURI().toURL()); + } + + /** + * Load a class. + */ + static Class<?> forName(final String name, final boolean resolve, final java.lang.ClassLoader loader) throws ClassNotFoundException { + return Class.forName(name, resolve, loader); + } + + /** + * Test the class loader. + */ + static class Test { + Boolean testClassLoader() { + try { + final Class<?> clazz = ClassLoader.forName("test.CalcImpl", true, ClassLoader.valueOf(".")); + assert clazz != null; + } catch(final MalformedURLException e) { + throw new RuntimeException(e); + } catch(final ClassNotFoundException e) { + throw new RuntimeException(e); + } + return true; + } + } + + public static void main(final String[] args) { + System.out.println("Testing..."); + + Test.class.getClassLoader().setDefaultAssertionStatus(true); + new Test().testClassLoader(); + + System.out.println("OK"); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/InvocationHandler.java b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/InvocationHandler.java new file mode 100644 index 0000000000..c5ec6005a1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/InvocationHandler.java @@ -0,0 +1,60 @@ +/* + * 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; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * Proxy Invocation handler used to represent SCA component references. + */ +class InvocationHandler implements java.lang.reflect.InvocationHandler { + final long lambda; + + InvocationHandler(final long lambda) { + this.lambda = lambda; + } + + /** + * Create a proxy for an interface and the lambda function representing + * an SCA component reference. + */ + static Object valueOf(final Class<?> iface, final long lambda) { + return Proxy.newProxyInstance(iface.getClassLoader(), new Class[]{iface}, new InvocationHandler(lambda)); + } + + /** + * Proxy invocation of a C++ function. + */ + @Override + public native Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable; + + /** + * Return the stack trace of an exception. + */ + static String stackTrace(final Throwable e) { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + return sw.toString(); + } +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/IterableUtil.java b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/IterableUtil.java new file mode 100644 index 0000000000..85872cba72 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/IterableUtil.java @@ -0,0 +1,378 @@ +/* + * 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; + +import static java.util.Arrays.*; + +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + +/** + * Utility functions to help work efficiently with iterable lists, inspired from Lisp. + */ +public class IterableUtil { + + /** + * Convert an array or a variable list of arguments to an iterable list. + */ + public static <T> Iterable<T> list(final Object... a) { + return new ArrayIterable<T>(a, 0); + } + + /** + * Convert an iterable list to a java.util.Collection. + */ + @SuppressWarnings("unchecked") + public static <T> Collection<T> collection(final Object l) { + final Collection<T> c = new ArrayList<T>(); + for(final Object x : (Iterable<?>)l) + c.add((T)x); + return c; + } + + /** + * Construct a new list from an element and a list. + */ + public static <T> Iterable<T> cons(final Object car, final Iterable<?> cdr) { + return new PairIterable<T>(car, cdr); + } + + /** + * Return true if a list is nil (empty). + */ + public static boolean isNil(final Object l) { + if(l instanceof BasicIterable<?>) + return ((BasicIterable<?>)l).isNil(); + if(l instanceof Collection<?>) + return ((Collection<?>)l).isEmpty(); + return !((Iterable<?>)l).iterator().hasNext(); + } + + /** + * Return the car (first element) of a list. + */ + @SuppressWarnings("unchecked") + public static <T> T car(final Object l) { + if(l instanceof BasicIterable<?>) + return ((BasicIterable<T>)l).car(); + if(l instanceof List<?>) + return (T)((List<?>)l).get(0); + return (T)((Iterable<?>)l).iterator().next(); + } + + /** + * Return the cdr (rest after the first element) of a list. + */ + @SuppressWarnings("unchecked") + public static <T> Iterable<T> cdr(final Object l) { + if(l instanceof BasicIterable<?>) + return ((BasicIterable<T>)l).cdr(); + if(l instanceof List<?>) + return new ListIterable<T>((List<?>)l, 1); + if(l instanceof Collection<?>) + return new ArrayIterable<T>(((Collection<?>)l).toArray(), 1); + return new Iterable<T>() { + @Override + public Iterator<T> iterator() { + final Iterator<T> i = ((Iterable<T>)l).iterator(); + i.next(); + return i; + } + }; + } + + /** + * Return the car of the cdr of a list. + */ + @SuppressWarnings("unchecked") + public static <T> T cadr(final Object l) { + return (T)car(cdr(l)); + } + + /** + * Return the cdr of the cdr of a list. + */ + public static <T> Iterable<T> cddr(final Object l) { + return cdr(cdr(l)); + } + + /** + * Return the car of the cdr of the cdr of a list. + */ + @SuppressWarnings("unchecked") + public static <T> T caddr(final Object l) { + return (T)car(cddr(l)); + } + + /** + * Return the first pair matching a key from a list of key value pairs. + */ + public static <T> Iterable<T> assoc(final Object k, final Object l) { + if(isNil(l)) + return list(); + if(k.equals(car(car(l)))) + return car(l); + return assoc(k, cdr(l)); + } + + /** + * Internal base implementation class for iterable and immutable lists. + */ + static abstract class BasicIterable<T> extends AbstractList<T> { + abstract T car(); + + abstract Iterable<T> cdr(); + + abstract Boolean isNil(); + + @Override + public int size() { + throw new UnsupportedOperationException(); + } + + @Override + public T get(final int index) { + throw new UnsupportedOperationException(); + } + } + + /** + * Internal implementation of a list backed by an array. + */ + static class ArrayIterable<T> extends BasicIterable<T> { + final Object[] a; + final int start; + + ArrayIterable(final Object[] a, final int start) { + this.a = a; + this.start = start; + } + + @Override + Boolean isNil() { + return this.a.length - this.start == 0; + } + + @SuppressWarnings("unchecked") + @Override + T car() { + return (T)this.a[this.start]; + } + + @Override + BasicIterable<T> cdr() { + return new ArrayIterable<T>(this.a, this.start + 1); + } + + @Override + public Iterator<T> iterator() { + return new Iterator<T>() { + int i = ArrayIterable.this.start; + + @Override + public boolean hasNext() { + return this.i < ArrayIterable.this.a.length; + } + + @SuppressWarnings("unchecked") + @Override + public T next() { + return (T)ArrayIterable.this.a[this.i++]; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + } + + /** + * Internal implementation of a list backed by a java.util.List. + */ + static class ListIterable<T> extends BasicIterable<T> { + final List<?> l; + final int start; + + ListIterable(final List<?> l, final int start) { + this.l = l; + this.start = start; + } + + @Override + Boolean isNil() { + return this.l.size() - this.start == 0; + } + + @SuppressWarnings("unchecked") + @Override + T car() { + return (T)this.l.get(this.start); + } + + @Override + BasicIterable<T> cdr() { + return new ListIterable<T>(this.l, this.start + 1); + } + + @Override + public Iterator<T> iterator() { + return new Iterator<T>() { + int i = ListIterable.this.start; + + @Override + public boolean hasNext() { + return this.i < ListIterable.this.l.size(); + } + + @SuppressWarnings("unchecked") + @Override + public T next() { + return (T)ListIterable.this.l.get(this.i++); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + } + + /** + * Internal implementation of a list backed by an element / iterable pair. + */ + static class PairIterable<T> extends BasicIterable<T> { + final Object car; + final Iterable<?> cdr; + + PairIterable(final Object car, final Iterable<?> cdr) { + this.car = car; + this.cdr = cdr; + } + + @Override + Boolean isNil() { + return false; + } + + @SuppressWarnings("unchecked") + @Override + T car() { + return (T)this.car; + } + + @SuppressWarnings("unchecked") + @Override + Iterable<T> cdr() { + return (Iterable<T>)this.cdr; + } + + @Override + public Iterator<T> iterator() { + return new Iterator<T>() { + boolean carIterator = true; + Iterator<?> cdrIterator = PairIterable.this.cdr.iterator(); + + @Override + public boolean hasNext() { + if(this.carIterator) + return true; + return this.cdrIterator.hasNext(); + } + + @SuppressWarnings("unchecked") + @Override + public T next() { + if(this.carIterator) { + this.carIterator = false; + return (T)PairIterable.this.car; + } + return (T)this.cdrIterator.next(); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + } + + /** + * Test the list functions. + */ + static class Test { + Boolean testList() { + final Iterable<Object> l = list(2, 3, 4); + assert car(l) == Integer.valueOf(2); + assert cadr(l) == Integer.valueOf(3); + assert caddr(l) == Integer.valueOf(4); + + final Iterable<Object> c = cons(0, cons(1, l)); + assert car(c) == Integer.valueOf(0); + assert cadr(c) == Integer.valueOf(1); + assert caddr(c) == Integer.valueOf(2); + assert c.toString().equals("[0, 1, 2, 3, 4]"); + + final Iterable<Object> cl = cons(0, cons(1, new ArrayList<Object>(asList(2, 3, 4)))); + assert car(cl) == Integer.valueOf(0); + assert cadr(cl) == Integer.valueOf(1); + assert caddr(cl) == Integer.valueOf(2); + assert cl.toString().equals("[0, 1, 2, 3, 4]"); + + final List<Object> jl = new ArrayList<Object>(collection(cl)); + assert jl.size() == 5; + assert jl.get(0) == Integer.valueOf(0); + assert jl.get(1) == Integer.valueOf(1); + assert jl.get(2) == Integer.valueOf(2); + + final Iterable<Object> n = list(); + assert isNil(n); + assert n.toString().equals("[]"); + + final Iterable<Object> cn = cons(0, n); + assert !isNil(cn); + assert isNil(cdr(cn)); + assert cn.toString().equals("[0]"); + + final Iterable<Object> al = new ArrayList<Object>(Arrays.asList(1, 2, 3)); + assert car(al) == Integer.valueOf(1); + assert cadr(al) == Integer.valueOf(2); + assert caddr(al) == Integer.valueOf(3); + return true; + } + } + + public static void main(final String[] args) { + System.out.println("Testing..."); + + Test.class.getClassLoader().setDefaultAssertionStatus(true); + new Test().testList(); + + System.out.println("OK"); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/Service.java b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/Service.java new file mode 100644 index 0000000000..a00d5b1b53 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/org/apache/tuscany/Service.java @@ -0,0 +1,53 @@ +/* + * 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; + +/** + * Interface used to represent SCA component references providing both REST + * access to a resource and function application. + */ +public interface Service { + + /** + * Post a new item to a collection of items. + */ + Iterable<String> post(Iterable<String> collection, Iterable<?> item); + + /** + * Return an item. + */ + Iterable<?> get(Iterable<String> id); + + /** + * Update an item. + */ + boolean put(Iterable<String> id, Iterable<?> item); + + /** + * Delete an item. + */ + boolean delete(Iterable<String> id); + + /** + * Evaluate an expression. + */ + <T> T eval(Object... params); + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/server-test b/sca-cpp/branches/cpp-contrib/modules/java/server-test new file mode 100755 index 0000000000..fbd12e5542 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/server-test @@ -0,0 +1,41 @@ +#!/bin/sh + +# 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. + +# Setup +../http/httpd-conf tmp 8090 ../server/htdocs +../server/server-conf tmp +./java-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +export CLASSPATH="`pwd`/libmod-tuscany-java-1.0.jar:`pwd`" + +../http/httpd-start tmp +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +../http/httpd-stop tmp +sleep 2 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/Adder.java b/sca-cpp/branches/cpp-contrib/modules/java/test/Adder.java new file mode 100644 index 0000000000..7236548c41 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/Adder.java @@ -0,0 +1,26 @@ +/* + * 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 test; + +public interface Adder { + + Double add(Double x, Double y); + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/AdderImpl.java b/sca-cpp/branches/cpp-contrib/modules/java/test/AdderImpl.java new file mode 100644 index 0000000000..e607012b78 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/AdderImpl.java @@ -0,0 +1,28 @@ +/* + * 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 test; + +public class AdderImpl { + + public Double add(Double x, Double y) { + return x + y; + } + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/CalcImpl.java b/sca-cpp/branches/cpp-contrib/modules/java/test/CalcImpl.java new file mode 100644 index 0000000000..5bea01a43f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/CalcImpl.java @@ -0,0 +1,52 @@ +/* + * 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 test; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.tuscany.Service; + +public class CalcImpl { + + public Double add(final Double x, final Double y, final Adder adder) { + return adder.add(x, y); + } + + public Double addEval(final Double x, final Double y, final Service adder) { + return adder.eval("add", x, y); + } + + public Double mult(final Double x, final Double y) { + return x * y; + } + + public Boolean even(final Double x) { + return (double)((int)(double)x / 2 * 2) == (double)x; + } + + public Iterable<Double> square(final Iterable<Double> l) { + final List<Double> r = new ArrayList<Double>(); + for(final Double x : l) + r.add(x * x); + return r; + } + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/Client.java b/sca-cpp/branches/cpp-contrib/modules/java/test/Client.java new file mode 100644 index 0000000000..c3bd875fcc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/Client.java @@ -0,0 +1,34 @@ +/* + * 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 test; + +public interface Client { + + String echo(String x); + + Iterable<?> get(Iterable<String> id); + + Iterable<String> post(Iterable<String> collection, Iterable<?> item); + + Boolean put(Iterable<String> id, Iterable<?> item); + + Boolean delete(Iterable<String> id); + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/ClientImpl.java b/sca-cpp/branches/cpp-contrib/modules/java/test/ClientImpl.java new file mode 100644 index 0000000000..ade2ba302e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/ClientImpl.java @@ -0,0 +1,44 @@ +/* + * 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 test; + +public class ClientImpl { + + public String echo(String x, Server server) { + return server.echo(x); + } + + public Iterable<?> get(Iterable<String> id, Server server) { + return server.get(id); + } + + public Iterable<String> post(Iterable<String> collection, Iterable<?> item, Server server) { + return server.post(collection, item); + } + + public Boolean put(Iterable<String> id, Iterable<?> item, Server server) { + return server.put(id, item); + } + + public Boolean delete(Iterable<String> id, Server server) { + return server.delete(id); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/Server.java b/sca-cpp/branches/cpp-contrib/modules/java/test/Server.java new file mode 100644 index 0000000000..3dfe3c84ef --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/Server.java @@ -0,0 +1,34 @@ +/* + * 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 test; + +public interface Server { + + String echo(String x); + + Iterable<?> get(Iterable<String> id); + + Iterable<String> post(Iterable<String> collection, Iterable<?> item); + + Boolean put(Iterable<String> id, Iterable<?> item); + + Boolean delete(Iterable<String> id); + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/test/ServerImpl.java b/sca-cpp/branches/cpp-contrib/modules/java/test/ServerImpl.java new file mode 100644 index 0000000000..05012c22cf --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/test/ServerImpl.java @@ -0,0 +1,51 @@ +/* + * 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 test; + +import static org.apache.tuscany.IterableUtil.*; + +public class ServerImpl { + + public String echo(final String x) { + return x; + } + + public Iterable<?> get(final Iterable<String> id) { + if (isNil(id)) + return list("Sample Feed", "123456789", + list("Item", "111", list(list("'javaClass", "services.Item"), list("'name", "Apple"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 2.99))), + list("Item", "222", list(list("'javaClass", "services.Item"), list("'name", "Orange"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 3.55))), + list("Item", "333", list(list("'javaClass", "services.Item"), list("'name", "Pear"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 1.55)))); + final Iterable<?> entry = list(list("'javaClass", "services.Item"), list("'name", "Apple"), list("'currencyCode", "USD"), list("'currencySymbol", "$"), list("'price", 2.99)); + return list("Item", car(id), entry); + } + + public Iterable<String> post(final Iterable<String> collection, final Iterable<?> item) { + return list("123456789"); + } + + public Boolean put(final Iterable<String> id, final Iterable<?> item) { + return true; + } + + public Boolean delete(final Iterable<String> id) { + return true; + } +} diff --git a/sca-cpp/branches/cpp-contrib/modules/java/wiring-test b/sca-cpp/branches/cpp-contrib/modules/java/wiring-test new file mode 100755 index 0000000000..c0b6cbfd62 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/java/wiring-test @@ -0,0 +1,78 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +../http/httpd-conf tmp 8090 ../server/htdocs +../server/server-conf tmp +./java-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +export CLASSPATH="`pwd`/libmod-tuscany-java-1.0.jar:`pwd`" + +../http/httpd-start tmp +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html +diff tmp/index.html ../server/htdocs/index.html +rc=$? + +# Test ATOMPub +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ >tmp/feed.xml 2>/dev/null + diff tmp/feed.xml ../server/htdocs/feed.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 >tmp/entry.xml 2>/dev/null + diff tmp/entry.xml ../server/htdocs/entry.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ -X POST -H "Content-type: application/atom+xml" --data @../server/htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 -X PUT -H "Content-type: application/atom+xml" --data @../server/htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 -X DELETE 2>/dev/null + rc=$? +fi + +# Test JSON-RPC +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ -X POST -H "Content-type: application/json-rpc" --data @../server/htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null + diff tmp/json-result.txt ../server/htdocs/json-result.txt + rc=$? +fi + +# Cleanup +../http/httpd-stop tmp +sleep 2 +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/json/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/json/Makefile.am new file mode 100644 index 0000000000..5bd435fe99 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/json/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +noinst_PROGRAMS = json-test + +json_test_SOURCES = json-test.cpp +json_test_LDFLAGS = -lmozjs + +TESTS = json-test diff --git a/sca-cpp/branches/cpp-contrib/modules/json/json-test.cpp b/sca-cpp/branches/cpp-contrib/modules/json/json-test.cpp new file mode 100644 index 0000000000..b74f068710 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/json/json-test.cpp @@ -0,0 +1,176 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test JSON data conversion functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "json.hpp" + +namespace tuscany { +namespace json { + +bool testJSEval() { + JSONContext cx; + const string script("(function testJSON(n){ return JSON.parse(JSON.stringify(n)) })(5)"); + jsval rval; + assert(JS_EvaluateScript(cx, cx.getGlobal(), c_str(script), length(script), "testJSON.js", 1, &rval)); + const string r(JS_GetStringBytes(JS_ValueToString(cx, rval))); + assert(r == "5"); + return true; +} + +ostream* jsonWriter(const string& s, ostream* os) { + (*os) << s; + return os; +} + +bool testJSON() { + const JSONContext cx; + + { + const list<value> ad = mklist<value>(mklist<value>(attribute, "city", string("san francisco")), mklist<value>(attribute, "state", string("ca"))); + const list<value> ac = mklist<value>(mklist<value>(element, "id", string("1234")), mklist<value>(attribute, "balance", 1000)); + const list<value> cr = mklist<value>(mklist<value> (attribute, "name", string("jdoe")), cons<value>(element, cons<value>("address", ad)), cons<value>(element, cons<value>("account", ac))); + const list<value> c = mklist<value>(cons<value>(element, cons<value>("customer", cr))); + + ostringstream os; + writeJSON<ostream*>(jsonWriter, &os, c, cx); + assert(str(os) == "{\"customer\":{\"@name\":\"jdoe\",\"address\":{\"@city\":\"san francisco\",\"@state\":\"ca\"},\"account\":{\"id\":\"1234\",\"@balance\":1000}}}"); + } + { + const list<value> phones = mklist<value> (string("408-1234"), string("650-1234")); + const list<value> l = mklist<value> (mklist<value> (element, "phones", phones), mklist<value> (element, "lastName", string("test\ttab")), mklist<value> (attribute, "firstName", string("test1"))); + + ostringstream os; + writeJSON<ostream*>(jsonWriter, &os, l, cx); + assert(str(os) == "{\"phones\":[\"408-1234\",\"650-1234\"],\"lastName\":\"test\\u0009tab\",\"@firstName\":\"test1\"}"); + + istringstream is(str(os)); + const list<string> il = streamList(is); + const list<value> r = content(readJSON(il, cx)); + assert(r == l); + + ostringstream wos; + write(content(writeJSON(r, cx)), wos); + assert(str(wos) == str(os)); + } + { + const list<value> l = mklist<value>(list<value>() + "ns1:echoString" + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (list<value>() + "text" + string("Hello World!"))); + ostringstream wos; + write(content(writeJSON(valuesToElements(l), cx)), wos); + assert(str(wos) == "{\"ns1:echoString\":{\"@xmlns:ns1\":\"http://ws.apache.org/axis2/services/echo\",\"text\":\"Hello World!\"}}"); + + istringstream is(str(wos)); + const list<string> il = streamList(is); + const list<value> r = elementsToValues(content(readJSON(il, cx))); + assert(r == l); + } + return true; +} + +bool testJSONRPC() { + JSONContext cx; + { + const string lm("{\"id\": 1, \"method\": \"system.listMethods\", \"params\": []}"); + const list<value> e = content(readJSON(mklist(lm), cx)); + const list<value> v = elementsToValues(e); + assert(assoc<value>("id", v) == mklist<value>("id", 1)); + assert(assoc<value>("method", v) == mklist<value>("method", string("system.listMethods"))); + assert(assoc<value>("params", v) == mklist<value>("params", list<value>())); + } + { + const string i("{\"id\":3,\"result\":[{\"price\":\"$2.99\",\"name\":\"Apple\"},{\"price\":\"$3.55\",\"name\":\"Orange\"},{\"price\":\"$1.55\",\"name\":\"Pear\"}]}"); + const list<value> e = content(readJSON(mklist(i), cx)); + const string i2("{\"id\":3,\"result\":{\"0\":{\"price\":\"$2.99\",\"name\":\"Apple\"},\"1\":{\"price\":\"$3.55\",\"name\":\"Orange\"},\"2\":{\"price\":\"$1.55\",\"name\":\"Pear\"}}}"); + const list<value> e2 = content(readJSON(mklist(i), cx)); + assert(e == e2); + } + { + const string i("{\"id\":3,\"result\":[{\"price\":\"$2.99\",\"name\":\"Apple\"},{\"price\":\"$3.55\",\"name\":\"Orange\"},{\"price\":\"$1.55\",\"name\":\"Pear\"}]}"); + const list<value> e = content(readJSON(mklist(i), cx)); + ostringstream os; + write(content(writeJSON(e, cx)), os); + assert(str(os) == i); + const list<value> v = elementsToValues(e); + const list<value> r = valuesToElements(v); + assert(r == e); + } + { + const list<value> r = mklist<value>(mklist<value>("id", 1), mklist<value>("result", mklist<value>(string("Service.get"), string("Service.getTotal")))); + const list<value> e = valuesToElements(r); + ostringstream os; + write(content(writeJSON(e, cx)), os); + assert(str(os) == "{\"id\":1,\"result\":[\"Service.get\",\"Service.getTotal\"]}"); + } + { + const string f("{\"id\":1,\"result\":[\"Sample Feed\",\"123456789\",[\"Item\",\"111\",{\"javaClass\":\"services.Item\",\"name\":\"Apple\",\"currencyCode\":\"USD\",\"currencySymbol\":\"$\",\"price\":2.99}],[\"Item\",\"222\",{\"javaClass\":\"services.Item\",\"name\":\"Orange\",\"currencyCode\":\"USD\",\"currencySymbol\":\"$\",\"price\":3.55}],[\"Item\",\"333\",{\"javaClass\":\"services.Item\",\"name\":\"Pear\",\"currencyCode\":\"USD\",\"currencySymbol\":\"$\",\"price\":1.55}]]}"); + const list<value> r = content(readJSON(mklist(f), cx)); + const list<value> v = elementsToValues(r); + const list<value> e = valuesToElements(v); + ostringstream os; + write(content(writeJSON(e, cx)), os); + assert(str(os) == f); + } + { + const list<value> arg = mklist<value>(list<value>() + "ns1:echoString" + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/services/echo")) + (list<value>() + "text" + string("Hello World!"))); + const failable<list<string> > r = jsonRequest(1, "echo", mklist<value>(arg), cx); + ostringstream os; + write(content(r), os); + assert(str(os) == "{\"id\":1,\"method\":\"echo\",\"params\":[{\"ns1:echoString\":{\"@xmlns:ns1\":\"http://ws.apache.org/axis2/services/echo\",\"text\":\"Hello World!\"}}]}"); + + istringstream is(str(os)); + const list<string> il = streamList(is); + const list<value> ir = elementsToValues(content(readJSON(il, cx))); + assert(car<value>(cadr<value>(caddr<value>(ir))) == arg); + } + { + const list<value> res = mklist<value>(list<value>() + "ns1:echoString" + (list<value>() + "@xmlns:ns1" + string("http://ws.apache.org/axis2/c/samples")) + (list<value>() + "text" + string("Hello World!"))); + const failable<list<string> > r = jsonResult(1, res, cx); + ostringstream os; + write(content(r), os); + assert(str(os) == "{\"id\":1,\"result\":{\"ns1:echoString\":{\"@xmlns:ns1\":\"http://ws.apache.org/axis2/c/samples\",\"text\":\"Hello World!\"}}}"); + + istringstream is(str(os)); + const list<string> il = streamList(is); + const list<value> ir = elementsToValues(content(readJSON(il, cx))); + assert(cdr<value>(cadr<value>(ir)) == res); + } + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::json::testJSEval(); + tuscany::json::testJSON(); + tuscany::json::testJSONRPC(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/json/json.hpp b/sca-cpp/branches/cpp-contrib/modules/json/json.hpp new file mode 100644 index 0000000000..1d966d3f67 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/json/json.hpp @@ -0,0 +1,403 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_json_hpp +#define tuscany_json_hpp + +/** + * JSON data conversion functions. + */ + +#define XP_UNIX +#include <jsapi.h> +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "element.hpp" +#include "monad.hpp" + +namespace tuscany { +namespace json { + +/** + * Report JSON errors. + */ +void reportError(unused JSContext *cx, const char *message, JSErrorReport *report) { + cerr << (const char*)(report->filename? report->filename : "<no filename>") << ":" + << (int)report->lineno << ":" << message << endl; +} + +/** + * Encapsulates a JavaScript runtime. Shared by multiple threads in + * a process. + */ +class JSONRuntime { +public: + JSONRuntime() { + // Create JS runtime + rt = JS_NewRuntime(8L * 1024L * 1024L); + if(rt == NULL) + cleanup(); + } + + operator JSRuntime*() const { + return rt; + } +private: + bool cleanup() { + if(rt != NULL) { + JS_DestroyRuntime(rt); + rt = NULL; + } + JS_ShutDown(); + return true; + } + + JSRuntime* rt; +} jsRuntime; + +JSClass jsGlobalClass = { "global", JSCLASS_GLOBAL_FLAGS, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, + JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub, JSCLASS_NO_OPTIONAL_MEMBERS}; + +/** + * Represents a JavaScript context. Create one per thread. + */ +class JSONContext { +public: + JSONContext() { + // Create JS context + cx = JS_NewContext(jsRuntime, 8192); + if(cx == NULL) + return; + JS_SetOptions(cx, JSOPTION_VAROBJFIX); + JS_SetVersion(cx, JSVERSION_DEFAULT); + JS_SetErrorReporter(cx, reportError); + + // Create global JS object + global = JS_NewObject(cx, &jsGlobalClass, NULL, NULL); + if(global == NULL) { + cleanup(); + return; + } + + // Populate global object with the standard globals, like Object and Array + if(!JS_InitStandardClasses(cx, global)) { + cleanup(); + return; + } + } + + ~JSONContext() { + cleanup(); + } + + operator JSContext*() const { + return cx; + } + + JSObject* getGlobal() const { + return global; + } + +private: + bool cleanup() { + if(cx != NULL) { + JS_DestroyContext(cx); + cx = NULL; + } + return true; + } + + JSContext* cx; + JSObject* global; +}; + +/** + * Returns true if a list represents a JS array. + */ +const bool isJSArray(const list<value>& l) { + if(isNil(l)) + return true; + const value v = car(l); + if (isSymbol(v)) + return false; + if(isList(v)) { + if(!isNil((list<value>)v) && isSymbol(car<value>(v))) + return false; + } + return true; +} + +/** + * Converts JS properties to values. + */ +const list<value> jsPropertiesToValues(const list<value>& propertiesSoFar, JSObject* o, JSObject* i, const JSONContext& cx) { + + const value jsValToValue(const jsval& jsv, const JSONContext& cx); + + jsid id; + if(!JS_NextProperty(cx, i, &id) || id == JSVAL_VOID) + return propertiesSoFar; + jsval jsv; + if(!JS_GetPropertyById(cx, o, id, &jsv)) + return propertiesSoFar; + const value val = jsValToValue(jsv, cx); + + jsval idv; + JS_IdToValue(cx, id, &idv); + if(JSVAL_IS_STRING(idv)) { + const string name = JS_GetStringBytes(JSVAL_TO_STRING(idv)); + if (substr(name, 0, 1) == atsign) + return jsPropertiesToValues(cons<value>(mklist<value>(attribute, c_str(substr(name, 1)), val), propertiesSoFar), o, i, cx); + if (isList(val) && !isJSArray(val)) + return jsPropertiesToValues(cons<value>(cons<value>(element, cons<value>(c_str(name), list<value>(val))), propertiesSoFar), o, i, cx); + return jsPropertiesToValues(cons<value> (mklist<value> (element, c_str(name), val), propertiesSoFar), o, i, cx); + } + return jsPropertiesToValues(cons(val, propertiesSoFar), o, i, cx); +} + +/** + * Converts a JS val to a value. + */ +const value jsValToValue(const jsval& jsv, const JSONContext& cx) { + switch(JS_TypeOfValue(cx, jsv)) { + case JSTYPE_STRING: { + return value(string(JS_GetStringBytes(JSVAL_TO_STRING(jsv)))); + } + case JSTYPE_BOOLEAN: { + return value((bool)JSVAL_TO_BOOLEAN(jsv)); + } + case JSTYPE_NUMBER: { + jsdouble jsd; + JS_ValueToNumber(cx, jsv, &jsd); + return value((double)jsd); + } + case JSTYPE_OBJECT: { + JSObject* o = JSVAL_TO_OBJECT(jsv); + JSObject* i = JS_NewPropertyIterator(cx, o); + if(i == NULL) + return value(list<value> ()); + const value pv = jsPropertiesToValues(list<value> (), o, i, cx); + return pv; + } + default: { + return value(); + } + } +} + +/** + * Consumes JSON strings and populates a JS object. + */ +failable<bool> consume(JSONParser* parser, const list<string>& ilist, const JSONContext& cx) { + if (isNil(ilist)) + return true; + JSString* jstr = JS_NewStringCopyZ(cx, c_str(car(ilist))); + if(!JS_ConsumeJSONText(cx, parser, JS_GetStringChars(jstr), JS_GetStringLength(jstr))) + return mkfailure<bool>("JS_ConsumeJSONText failed"); + return consume(parser, cdr(ilist), cx); +} + +/** + * Convert a list of strings representing a JSON document to a list of values. + */ +const failable<list<value> > readJSON(const list<string>& ilist, const JSONContext& cx) { + jsval val; + JSONParser* parser = JS_BeginJSONParse(cx, &val); + if(parser == NULL) + return mkfailure<list<value> >("JS_BeginJSONParse failed"); + + const failable<bool> consumed = consume(parser, ilist, cx); + + if(!JS_FinishJSONParse(cx, parser, JSVAL_NULL)) + return mkfailure<list<value> >("JS_FinishJSONParse failed"); + if(!hasContent(consumed)) + return mkfailure<list<value> >(reason(consumed)); + + return list<value>(jsValToValue(val, cx)); +} + +/** + * Converts a list of values to JS array elements. + */ +JSObject* valuesToJSElements(JSObject* a, const list<value>& l, int i, const JSONContext& cx) { + const jsval valueToJSVal(const value& val, const JSONContext& cx); + if (isNil(l)) + return a; + jsval pv = valueToJSVal(car(l), cx); + JS_SetElement(cx, a, i, &pv); + return valuesToJSElements(a, cdr(l), ++i, cx); +} + +/** + * Converts a value to a JS val. + */ +const jsval valueToJSVal(const value& val, const JSONContext& cx) { + JSObject* valuesToJSProperties(JSObject* o, const list<value>& l, const JSONContext& cx); + + switch(type(val)) { + case value::String: + case value::Symbol: { + return STRING_TO_JSVAL(JS_NewStringCopyZ(cx, c_str((string)val))); + } + case value::Bool: { + return BOOLEAN_TO_JSVAL((bool)val); + } + case value::Number: { + return DOUBLE_TO_JSVAL(JS_NewDouble(cx, (double)val)); + } + case value::List: { + if (isJSArray(val)) + return OBJECT_TO_JSVAL(valuesToJSElements(JS_NewArrayObject(cx, 0, NULL), val, 0, cx)); + return OBJECT_TO_JSVAL(valuesToJSProperties(JS_NewObject(cx, NULL, NULL, NULL), val, cx)); + } + default: { + return JSVAL_VOID; + } + } +} + +/** + * Converts a list of values to JS properties. + */ +JSObject* valuesToJSProperties(JSObject* o, const list<value>& l, const JSONContext& cx) { + if (isNil(l)) + return o; + + // Write an attribute + const value token(car(l)); + + if (isTaggedList(token, attribute)) { + jsval pv = valueToJSVal(attributeValue(token), cx); + JS_SetProperty(cx, o, c_str(atsign + string(attributeName(token))), &pv); + + } else if (isTaggedList(token, element)) { + + // Write the value of an element + if (elementHasValue(token)) { + jsval pv = valueToJSVal(elementValue(token), cx); + JS_SetProperty(cx, o, c_str(string(elementName(token))), &pv); + + } else { + + // Write a parent element + JSObject* child = JS_NewObject(cx, NULL, NULL, NULL); + jsval pv = OBJECT_TO_JSVAL(child); + JS_SetProperty(cx, o, c_str(string(elementName(token))), &pv); + + // Write its children + valuesToJSProperties(child, elementChildren(token), cx); + } + } + + // Go on + return valuesToJSProperties(o, cdr(l), cx); +} + +/** + * Context passed to the JSON write callback function. + */ +template<typename R> class WriteContext { +public: + WriteContext(const lambda<R(const string&, const R)>& reduce, const R& accum, const JSONContext& cx) : cx(cx), reduce(reduce), accum(accum) { + } + const JSONContext& cx; + const lambda<R(const string&, const R)> reduce; + R accum; +}; + +/** + * Called by JS_Stringify to write JSON out. + */ +template<typename R> JSBool writeCallback(const jschar *buf, uint32 len, void *data) { + WriteContext<R>& wcx = *(static_cast<WriteContext<R>*> (data)); + JSString* jstr = JS_NewUCStringCopyN(wcx.cx, buf, len); + wcx.accum = wcx.reduce(string(JS_GetStringBytes(jstr), JS_GetStringLength(jstr)), wcx.accum); + return JS_TRUE; +} + +/** + * Convert a list of values to a JSON document. + */ +template<typename R> const failable<R> writeJSON(const lambda<R(const string&, const R)>& reduce, const R& initial, const list<value>& l, const JSONContext& cx) { + jsval val = OBJECT_TO_JSVAL(valuesToJSProperties(JS_NewObject(cx, NULL, NULL, NULL), l, cx)); + + WriteContext<R> wcx(reduce, initial, cx); + if (!JS_Stringify(cx, &val, NULL, JSVAL_NULL, writeCallback<R>, &wcx)) + return mkfailure<R>("JS_Stringify failed"); + return wcx.accum; +} + +/** + * Convert a list of values to a list of strings representing a JSON document. + */ +const failable<list<string> > writeJSON(const list<value>& l, const JSONContext& cx) { + const failable<list<string> > ls = writeJSON<list<string>>(rcons<string>, list<string>(), l, cx); + if (!hasContent(ls)) + return ls; + return reverse(list<string>(content(ls))); +} + +/** + * Convert a list of function + params to a JSON-RPC request. + */ +const failable<list<string> > jsonRequest(const value& id, const value& func, const value& params, json::JSONContext& cx) { + const list<value> r = mklist<value>(mklist<value>("id", id), mklist<value>("method", string(func)), mklist<value>("params", params)); + return writeJSON(valuesToElements(r), cx); +} + +/** + * Convert a value to a JSON-RPC result. + */ +const failable<list<string> > jsonResult(const value& id, const value& val, JSONContext& cx) { + return writeJSON(valuesToElements(mklist<value>(mklist<value>("id", id), mklist<value>("result", val))), cx); +} + +/** + * Convert a JSON-RPC result to a value. + */ +const failable<value> jsonResultValue(const list<string>& s, JSONContext& cx) { + const failable<list<value> > jsres = json::readJSON(s, cx); + if (!hasContent(jsres)) + return mkfailure<value>(reason(jsres)); + const list<value> rval(cadr<value>(elementsToValues(content(jsres)))); + const value val = cadr(rval); + if (isList(val) && !isJSArray(val)) + return value(mklist<value>(val)); + return val; +} + +/** + * Return a portable function name from a JSON-RPC function name. + * Strip the "system." and "Service." prefixes added by some JSON-RPC clients. + */ +const string funcName(const string& f) { + if (length(f) > 7 && find(f, "system.", 0) == 0) + return c_str(f) + 7; + if (length(f) > 8 && find(f, "Service.", 0) == 0) + return c_str(f) + 8; + return f; +} + +} +} + +#endif /* tuscany_json_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/python/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/python/Makefile.am new file mode 100644 index 0000000000..5d634a446c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/Makefile.am @@ -0,0 +1,45 @@ +# 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. + +datadir=$(prefix)/modules/python +libdir=$(prefix)/lib + +if WANT_PYTHON + +noinst_PROGRAMS = python-test python-shell client-test + +lib_LTLIBRARIES = libmod_tuscany_python.la + +nobase_data_DATA = *.xsd + +INCLUDES = -I${PYTHON_INCLUDE} + +libmod_tuscany_python_la_SOURCES = mod-python.cpp +libmod_tuscany_python_la_LDFLAGS = -lxml2 -lcurl -lmozjs -L${PYTHON_LIB} -R${PYTHON_LIB} -lpython2.6 + +python_test_SOURCES = python-test.cpp +python_test_LDFLAGS = -L${PYTHON_LIB} -R${PYTHON_LIB} -lpython2.6 + +python_shell_SOURCES = python-shell.cpp +python_shell_LDFLAGS = -L${PYTHON_LIB} -R${PYTHON_LIB} -lpython2.6 + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs + +TESTS = python-test server-test + +endif diff --git a/sca-cpp/branches/cpp-contrib/modules/python/client-test.cpp b/sca-cpp/branches/cpp-contrib/modules/python/client-test.cpp new file mode 100644 index 0000000000..b070f6a798 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/client-test.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test HTTP client functions. + */ + +#include "stream.hpp" +#include "string.hpp" +#include "../server/client-test.hpp" + +namespace tuscany { +namespace server { + +string testURI = "http://localhost:8090/python"; + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::server::testServer(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/python/client-test.py b/sca-cpp/branches/cpp-contrib/modules/python/client-test.py new file mode 100644 index 0000000000..47e6cf4bda --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/client-test.py @@ -0,0 +1,35 @@ +# 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. + +# JSON-RPC test case + +def echo(x, ref): + return ref("echo", x) + +# ATOMPub test case + +def get(id, ref): + return ref("get", id) + +def post(collection, item, ref): + return ref("post", collection, item) + +def put(id, item, ref): + return ref("put", id, item) + +def delete(id, ref): + return ref("delete", id) diff --git a/sca-cpp/branches/cpp-contrib/modules/python/domain-test.composite b/sca-cpp/branches/cpp-contrib/modules/python/domain-test.composite new file mode 100644 index 0000000000..c8e92b286e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/domain-test.composite @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://domain/test" + name="domain-test"> + + <component name="python-test"> + <t:implementation.python script="server-test.py"/> + <service name="test"> + <t:binding.http uri="python"/> + </service> + </component> + + <component name="client-test"> + <t:implementation.python script="client-test.py"/> + <service name="client"> + <t:binding.http uri="client"/> + </service> + <reference name="ref" target="python-test"> + <t:binding.http/> + </reference> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/modules/python/driver.hpp b/sca-cpp/branches/cpp-contrib/modules/python/driver.hpp new file mode 100644 index 0000000000..2820201057 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/driver.hpp @@ -0,0 +1,63 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_python_driver_hpp +#define tuscany_python_driver_hpp + +/** + * Python evaluator main driver loop. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "monad.hpp" +#include "../scheme/driver.hpp" +#include "eval.hpp" + +namespace tuscany { +namespace python { + +const value evalDriverLoop(PyObject* script, istream& in, ostream& out) { + scheme::promptForInput(scheme::evalInputPrompt, out); + value input = scheme::readValue(in); + if (isNil(input)) + return input; + const failable<value> output = evalScript(input, script); + scheme::announceOutput(scheme::evalOutputPrompt, out); + scheme::userPrint(content(output), out); + return evalDriverLoop(script, in, out); +} + +const bool evalDriverRun(const char* path, istream& in, ostream& out) { + PythonRuntime py; + scheme::setupDisplay(out); + ifstream is(path); + failable<PyObject*> script = readScript(path, is); + if (!hasContent(script)) + return true; + evalDriverLoop(content(script), in, out); + Py_DECREF(content(script)); + return true; +} + +} +} +#endif /* tuscany_python_driver_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/python/eval.hpp b/sca-cpp/branches/cpp-contrib/modules/python/eval.hpp new file mode 100644 index 0000000000..855804a5ae --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/eval.hpp @@ -0,0 +1,300 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_python_eval_hpp +#define tuscany_python_eval_hpp + +/** + * Python script evaluation logic. + */ +#include <python2.6/Python.h> + +#include "list.hpp" +#include "value.hpp" + +namespace tuscany { +namespace python { + +/** + * Represent a Python runtime. + */ +class PythonRuntime { +public: + PythonRuntime() { + if (Py_IsInitialized()) + return; + Py_InitializeEx(0); + } +}; + +/** + * Return the last python error. + */ +const string lastError() { + if(PyErr_Occurred()) { + PyObject* type; + PyObject* val; + PyObject* trace; + PyErr_Fetch(&type, &val, &trace); + if (type != NULL && val != NULL) { + PyObject* stype = PyObject_Str(type); + PyObject* sval = PyObject_Str(val); + string msg = string() + PyString_AsString(stype) + " : " + PyString_AsString(sval); + Py_DECREF(stype); + Py_DECREF(sval); + Py_DECREF(type); + Py_DECREF(val); + Py_XDECREF(trace); + PyErr_Print(); + return msg; + } + PyErr_Print(); + Py_XDECREF(type); + Py_XDECREF(val); + Py_XDECREF(trace); + PyErr_Print(); + return "Unknown Python error"; + } + return ""; +} + +/** + * Declare conversion functions. + */ +PyObject* valueToPyObject(const value& v); +const value pyObjectToValue(PyObject *o); +PyObject* valuesToPyTuple(const list<value>& v); +const list<value> pyTupleToValues(PyObject* o); + +/** + * Callable python type used to represent a lambda expression. + */ +typedef struct { + PyObject_HEAD + lambda<value(const list<value>&)> func; +} pyLambda; + +void pyLambda_dealloc(PyObject* self) { + PyMem_DEL(self); +} + +PyObject* pyLambda_call(PyObject* self, PyObject* args, unused PyObject* kwds) { + const pyLambda* pyl = (pyLambda*)self; + const value result = pyl->func(pyTupleToValues(args)); + Py_DECREF(args); + PyObject *pyr = valueToPyObject(result); + return pyr; +} + +PyTypeObject pyLambda_type = { + PyObject_HEAD_INIT(0) + 0, + "lambda", + sizeof(pyLambda), + 0, + (destructor)pyLambda_dealloc, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + (ternaryfunc)pyLambda_call, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +}; + +/** + * Create a new python object representing a lambda expression. + */ +PyObject *mkPyLambda(const lambda<value(const list<value>&)>& l) { + pyLambda* pyl = NULL; + pyl = PyObject_NEW(pyLambda, &pyLambda_type); + if (pyl != NULL) + pyl->func = l; + return (PyObject *)pyl; +} + +/** + * Convert a list of values to a python list. + */ + +PyObject* valuesToPyListHelper(PyObject* l, const list<value>& v) { + if (isNil(v)) + return l; + PyList_Append(l, valueToPyObject(car(v))); + return valuesToPyListHelper(l, cdr(v)); +} + +PyObject* valuesToPyTuple(const list<value>& v) { + return PyList_AsTuple(valuesToPyListHelper(PyList_New(0), v)); +} + +/** + * Convert a value to a python object. + */ +PyObject* valueToPyObject(const value& v) { + switch (type(v)) { + case value::List: + return valuesToPyTuple(v); + case value::Lambda: + return mkPyLambda(v); + case value::Symbol: + return PyString_FromString(c_str(string("'") + v)); + case value::String: + return PyString_FromString(c_str(v)); + case value::Number: + return PyFloat_FromDouble((double)v); + case value::Bool: + return (bool)v? Py_True : Py_False; + default: + return Py_None; + } +} + +/** + * Convert a python tuple to a list of values. + */ + +const list<value> pyTupleToValuesHelper(PyObject* o, const int i, const int size) { + if (i == size) + return list<value>(); + return cons(pyObjectToValue(PyTuple_GetItem(o, i)), pyTupleToValuesHelper(o, i + 1, size)); +} + +const list<value> pyTupleToValues(PyObject* o) { + return pyTupleToValuesHelper(o, 0, PyTuple_Size(o)); +} + +/** + * Lambda function used to represent a python callable object. + */ +struct pyCallable { + PyObject* func; + + pyCallable(PyObject* func) : func(func) { + Py_INCREF(func); + } + + ~pyCallable() { + Py_DECREF(func); + } + + const value operator()(const list<value>& args) const { + PyObject* pyargs = valuesToPyTuple(args); + PyObject* result = PyObject_CallObject(func, pyargs); + Py_DECREF(pyargs); + const value v = pyObjectToValue(result); + Py_DECREF(result); + return v; + } +}; + +/** + * Convert a python object to a value. + */ +const value pyObjectToValue(PyObject *o) { + if (PyString_Check(o)) { + const char* s = PyString_AsString(o); + if (*s == '\'') + return value(s + 1); + return value(string(s)); + } + if (PyBool_Check(o)) + return value(o == Py_True); + if (PyInt_Check(o)) + return value((double)PyInt_AsLong(o)); + if (PyLong_Check(o)) + return value((double)PyLong_AsLong(o)); + if (PyFloat_Check(o)) + return value((double)PyFloat_AsDouble(o)); + if (PyTuple_Check(o)) + return pyTupleToValues(o); + if (PyCallable_Check(o)) + return lambda<value(const list<value>&)>(pyCallable(o)); + return value(); +} + +/** + * Evaluate an expression against a script provided as a python object. + */ +const failable<value> evalScript(const value& expr, PyObject* script) { + + // Get the requested function + PyObject* func = PyObject_GetAttrString(script, c_str(car<value>(expr))); + if (func == NULL) { + + // The start, stop, and restart functions are optional + const value fn = car<value>(expr); + if (fn == "start" || fn == "stop") { + PyErr_Clear(); + return value(lambda<value(const list<value>&)>()); + } + + return mkfailure<value>(string("Couldn't find function: ") + car<value>(expr) + " : " + lastError()); + } + if (!PyCallable_Check(func)) { + Py_DECREF(func); + return mkfailure<value>(string("Couldn't find callable function: ") + car<value>(expr)); + } + + // Convert args to python objects + PyObject* args = valuesToPyTuple(cdr<value>(expr)); + + // Call the function + PyObject* result = PyObject_CallObject(func, args); + Py_DECREF(args); + Py_DECREF(func); + if (result == NULL) + return mkfailure<value>(string("Function call failed: ") + car<value>(expr) + " : " + lastError()); + + // Convert python result to a value + const value v = pyObjectToValue(result); + Py_DECREF(result); + return v; +} + +/** + * Read a python script from an input stream. + */ +const failable<PyObject*> readScript(const string& path, istream& is) { + const list<string> ls = streamList(is); + ostringstream os; + write(ls, os); + PyObject* code = Py_CompileStringFlags(c_str(str(os)), c_str(path), Py_file_input, NULL); + if (code == NULL) + return mkfailure<PyObject*>(string("Couldn't compile script: ") + path + " : " + lastError()); + PyObject* mod = PyImport_ExecCodeModule(const_cast<char*>(c_str(path)), code); + if (mod == NULL) + return mkfailure<PyObject*>(string("Couldn't import module: ") + path + " : " + lastError()); + return mod; +} + +/** + * Evaluate an expression against a script provided as an input stream. + */ +const failable<value> evalScript(const value& expr, istream& is) { + failable<PyObject*> script = readScript("script", is); + if (!hasContent(script)) + return mkfailure<value>(reason(script)); + return evalScript(expr, content(script)); +} + +} +} +#endif /* tuscany_python_eval_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/python/mod-python.cpp b/sca-cpp/branches/cpp-contrib/modules/python/mod-python.cpp new file mode 100644 index 0000000000..8561a1fbf4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/mod-python.cpp @@ -0,0 +1,66 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * HTTPD module used to eval Python component implementations. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../server/mod-cpp.hpp" +#include "../server/mod-eval.hpp" +#include "mod-python.hpp" + +namespace tuscany { +namespace server { +namespace modeval { + +/** + * Apply a lifecycle start or restart event. + */ +const value applyLifecycle(unused const list<value>& params) { + + // Create a Python runtime + new (gc_new<python::PythonRuntime>()) python::PythonRuntime(); + + // Return a nil function as we don't need to handle the stop event + return failable<value>(lambda<value(const list<value>&)>()); +} + +/** + * Evaluate a Python component implementation and convert it to an applicable + * lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, unused const lambda<value(const list<value>&)>& lifecycle) { + const string itype(elementName(impl)); + if (contains(itype, ".python")) + return modpython::evalImplementation(path, impl, px); + if (contains(itype, ".cpp")) + return modcpp::evalImplementation(path, impl, px); + return mkfailure<lambda<value(const list<value>&)> >(string("Unsupported implementation type: ") + itype); +} + +} +} +} diff --git a/sca-cpp/branches/cpp-contrib/modules/python/mod-python.hpp b/sca-cpp/branches/cpp-contrib/modules/python/mod-python.hpp new file mode 100644 index 0000000000..d13f2227ab --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/mod-python.hpp @@ -0,0 +1,79 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_modpython_hpp +#define tuscany_modpython_hpp + +/** + * Evaluation functions used by mod-eval to evaluate Python + * component implementations. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "eval.hpp" + +namespace tuscany { +namespace server { +namespace modpython { + +/** + * Apply a Python component implementation function. + */ +struct applyImplementation { + PyObject* impl; + const list<value> px; + applyImplementation(PyObject* impl, const list<value>& px) : impl(impl), px(px) { + } + const value operator()(const list<value>& params) const { + const value expr = append<value>(params, px); + debug(expr, "modeval::python::applyImplementation::input"); + const failable<value> res = python::evalScript(expr, impl); + const value val = !hasContent(res)? mklist<value>(value(), reason(res)) : mklist<value>(content(res)); + debug(val, "modeval::python::applyImplementation::result"); + return val; + } +}; + +/** + * Evaluate a Python component implementation and convert it to an applicable + * lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) { + const string fpath(path + attributeValue("script", impl)); + ifstream is(fpath); + if (fail(is)) + return mkfailure<lambda<value(const list<value>&)> >(string("Could not read implementation: ") + fpath); + const failable<PyObject*> script = python::readScript(fpath, is); + if (!hasContent(script)) + return mkfailure<lambda<value(const list<value>&)> >(reason(script)); + return lambda<value(const list<value>&)>(applyImplementation(content(script), px)); +} + +} +} +} + +#endif /* tuscany_modpython_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/python/python-conf b/sca-cpp/branches/cpp-contrib/modules/python/python-conf new file mode 100755 index 0000000000..9bc99e2bbe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/python-conf @@ -0,0 +1,26 @@ +#!/bin/sh + +# 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. + +# Generate a Python server conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +cat >>$root/conf/httpd.conf <<EOF +LoadModule mod_tuscany_eval $here/.libs/libmod_tuscany_python.so +EOF diff --git a/sca-cpp/branches/cpp-contrib/modules/python/python-shell.cpp b/sca-cpp/branches/cpp-contrib/modules/python/python-shell.cpp new file mode 100644 index 0000000000..89b47b8d44 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/python-shell.cpp @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Python script evaluator shell, used for interactive testing of scripts. + */ + +#include <assert.h> +#include "gc.hpp" +#include "stream.hpp" +#include "string.hpp" +#include "driver.hpp" + +int main(const int argc, char** argv) { + tuscany::gc_scoped_pool pool; + if (argc != 2) { + tuscany::cerr << "Usage: python-shell <script.py>" << tuscany::endl; + return 1; + } + tuscany::python::evalDriverRun(argv[1], tuscany::cin, tuscany::cout); + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/python/python-test.cpp b/sca-cpp/branches/cpp-contrib/modules/python/python-test.cpp new file mode 100644 index 0000000000..c4ffcee57e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/python-test.cpp @@ -0,0 +1,109 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test Python script evaluator. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "driver.hpp" + +namespace tuscany { +namespace python { + +const string testPythonAdd = + "def add(x, y):\n" + " return x + y\n"; + +bool testEvalExpr() { + gc_scoped_pool pool; + PythonRuntime py; + + istringstream is(testPythonAdd); + failable<PyObject*> script = readScript("script", is); + assert(hasContent(script)); + + const value exp = mklist<value>("add", 2, 3); + const failable<value> r = evalScript(exp, content(script)); + assert(hasContent(r)); + assert(content(r) == value(5)); + + return true; +} + +const value mult(const list<value>& args) { + const double x = car(args); + const double y = cadr(args); + return x * y; +} + +const string testReturnLambda( + "def mul(x, y):\n" + " return x * y\n" + "\n" + "def testReturnLambda():\n" + " return mul\n"); + +const string testCallLambda( + "def testCallLambda(l, x, y):\n" + " return l(x, y)\n"); + +bool testEvalLambda() { + gc_scoped_pool pool; + PythonRuntime py; + + const value trl = mklist<value>("testReturnLambda"); + istringstream trlis(testReturnLambda); + const failable<value> trlv = evalScript(trl, trlis); + + assert(hasContent(trlv)); + assert(isLambda(content(trlv))); + const lambda<value(const list<value>&)> trll(content(trlv)); + assert(trll(mklist<value>(2, 3)) == value(6)); + + istringstream tclis(testCallLambda); + const value tcl = mklist<value>("testCallLambda", content(trlv), 2, 3); + const failable<value> tclv = evalScript(tcl, tclis); + assert(hasContent(tclv)); + assert(content(tclv) == value(6)); + + istringstream tcelis(testCallLambda); + const value tcel = mklist<value>("testCallLambda", lambda<value(const list<value>&)>(mult), 3, 4); + const failable<value> tcelv = evalScript(tcel, tcelis); + assert(hasContent(tcelv)); + assert(content(tcelv) == value(12)); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::python::testEvalExpr(); + tuscany::python::testEvalLambda(); + + tuscany::cout << "OK" << tuscany::endl; + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/python/server-test b/sca-cpp/branches/cpp-contrib/modules/python/server-test new file mode 100755 index 0000000000..fe1ff7a486 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/server-test @@ -0,0 +1,39 @@ +#!/bin/sh + +# 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. + +# Setup +../http/httpd-conf tmp 8090 ../server/htdocs +../server/server-conf tmp +./python-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +../http/httpd-start tmp +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +../http/httpd-stop tmp +sleep 2 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/python/server-test.py b/sca-cpp/branches/cpp-contrib/modules/python/server-test.py new file mode 100644 index 0000000000..8e6b79b56a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/server-test.py @@ -0,0 +1,42 @@ +# 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. + +# JSON-RPC test case + +def echo(x): + return x + +# ATOMPub test case + +def get(id): + if id == (): + return ("Sample Feed", "123456789", + ("Item", "111", (("'javaClass", "services.Item"), ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99))), + ("Item", "222", (("'javaClass", "services.Item"), ("'name", "Orange"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 3.55))), + ("Item", "333", (("'javaClass", "services.Item"), ("name", "Pear"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 1.55)))) + + entry = (("'javaClass", "services.Item"), ("'name", "Apple"), ("'currencyCode", "USD"), ("'currencySymbol", "$"), ("'price", 2.99)) + return ("Item", id[0], entry) + +def post(collection, item): + return ("123456789",) + +def put(id, item): + return true + +def delete(id): + return true diff --git a/sca-cpp/branches/cpp-contrib/modules/python/tuscany-sca-1.1-implementation-python.xsd b/sca-cpp/branches/cpp-contrib/modules/python/tuscany-sca-1.1-implementation-python.xsd new file mode 100644 index 0000000000..c811ba6729 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/tuscany-sca-1.1-implementation-python.xsd @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="implementation.python" type="t:PythonImplementation" substitutionGroup="sca:implementation"/> + + <complexType name="PythonImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="script" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/modules/python/wiring-test b/sca-cpp/branches/cpp-contrib/modules/python/wiring-test new file mode 100755 index 0000000000..a3c85838fd --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/python/wiring-test @@ -0,0 +1,76 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +../http/httpd-conf tmp 8090 ../server/htdocs +../server/server-conf tmp +./python-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +../http/httpd-start tmp +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html +diff tmp/index.html ../server/htdocs/index.html +rc=$? + +# Test ATOMPub +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ >tmp/feed.xml 2>/dev/null + diff tmp/feed.xml ../server/htdocs/feed.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 >tmp/entry.xml 2>/dev/null + diff tmp/entry.xml ../server/htdocs/entry.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ -X POST -H "Content-type: application/atom+xml" --data @../server/htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 -X PUT -H "Content-type: application/atom+xml" --data @../server/htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 -X DELETE 2>/dev/null + rc=$? +fi + +# Test JSON-RPC +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ -X POST -H "Content-type: application/json-rpc" --data @../server/htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null + diff tmp/json-result.txt ../server/htdocs/json-result.txt + rc=$? +fi + +# Cleanup +../http/httpd-stop tmp +sleep 2 +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/scdl/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/scdl/Makefile.am new file mode 100644 index 0000000000..afbd35a8a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scdl/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +noinst_PROGRAMS = scdl-test + +scdl_test_SOURCES = scdl-test.cpp +scdl_test_LDFLAGS = -lxml2 + +TESTS = scdl-test diff --git a/sca-cpp/branches/cpp-contrib/modules/scdl/scdl-test.cpp b/sca-cpp/branches/cpp-contrib/modules/scdl/scdl-test.cpp new file mode 100644 index 0000000000..e8ee77eb4e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scdl/scdl-test.cpp @@ -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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test SCDL read functions. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "tree.hpp" +#include "scdl.hpp" + +namespace tuscany { +namespace scdl { + +bool testComposite() { + ifstream is("test.composite"); + const list<value> c = readXML(streamList(is)); + return true; +} + +bool testComponents() { + ifstream is("test.composite"); + const list<value> c = components(readXML(streamList(is))); + assert(length(c) == 4); + + const value store = car(c); + assert(name(store) == string("Store")); + const value impl = implementation(store); + assert(uri(impl) == string("store.html")); + assert(implementationType(impl) == "t:implementation.scheme"); + + const value catalog = named(string("Catalog"), c); + assert(name(catalog) == string("Catalog")); + + const list<value> t = mkbtree(sort(nameToElementAssoc(c))); + assert(assoctree<value>("Catalog", t) == mklist<value>("Catalog" , cadr(c))); + return true; +} + +bool testServices() { + ifstream is("test.composite"); + const list<value> c = components(readXML(streamList(is))); + const value store = car(c); + + assert(length(services(store)) == 1); + const value widget = car(services(store)); + assert(name(widget) == string("Widget")); + + assert(length(bindings(widget)) == 1); + const value binding = car(bindings(widget)); + assert(uri(binding) == string("/store")); + assert(bindingType(binding) == "t:binding.http"); + return true; +} + +bool testReferences() { + ifstream is("test.composite"); + const list<value> c = components(readXML(streamList(is))); + const value store = car(c); + + assert(length(references(store)) == 3); + const value catalog = car(references(store)); + assert(name(catalog) == string("catalog")); + assert(target(catalog) == string("Catalog")); + + assert(length(bindings(catalog)) == 1); + const value binding = car(bindings(catalog)); + assert(uri(binding) == value()); + assert(bindingType(binding) == "t:binding.jsonrpc"); + + const list<value> t = mkbtree(sort(referenceToTargetAssoc(references(store)))); + assert(assoctree<value>("shoppingCart", t) == mklist<value>(string("shoppingCart"), string("ShoppingCart/Cart"))); + return true; +} + +bool testProperties() { + ifstream is("test.composite"); + const list<value> c = components(readXML(streamList(is))); + const value catalog = named(string("Catalog"), c); + + assert(length(properties(catalog)) == 1); + const value currencyCode = car(properties(catalog)); + assert(name(currencyCode) == string("currencyCode")); + assert(propertyValue(currencyCode) == string("USD")); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::scdl::testComposite(); + tuscany::scdl::testComponents(); + tuscany::scdl::testServices(); + tuscany::scdl::testReferences(); + tuscany::scdl::testProperties(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/scdl/scdl.hpp b/sca-cpp/branches/cpp-contrib/modules/scdl/scdl.hpp new file mode 100644 index 0000000000..531144e219 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scdl/scdl.hpp @@ -0,0 +1,178 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_scdl_hpp +#define tuscany_scdl_hpp + +/** + * SCDL read functions. + */ + +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "xml.hpp" + +namespace tuscany { +namespace scdl { + +/** + * Returns a list of components in a composite. + */ +const list<value> components(const value& l) { + const list<value> cs = elementChildren("composite", l); + if (isNil(cs)) + return cs; + return elementChildren("component", car(cs)); +} + +/** + * Returns the name of a component, service or reference. + */ +const value name(const value& l) { + return attributeValue("name", l); +} + +/** + * Convert a list of elements to a name -> element assoc list. + */ +const list<value> nameToElementAssoc(const list<value>& l) { + if (isNil(l)) + return l; + const value e(car(l)); + return cons<value>(mklist<value>(name(e), e), nameToElementAssoc(cdr(l))); +} + +/** + * Returns the scdl declaration with the given name. + */ +struct filterName { + const value n; + filterName(const value& n) : n(n) { + } + const bool operator()(const value& v) const { + return name(v) == n; + } +}; + +const value named(const value& name, const value& l) { + const list<value> c = filter<value>(filterName(name), l); + if (isNil(c)) + return value(); + return car(c); +} + +/** + * Returns the implementation of a component. + */ +const bool filterImplementation(const value& v) { + return isElement(v) && contains(string(cadr<value>(v)), "implementation."); +} + +const value implementation(const value& l) { + const list<value> n = filter<value>(filterImplementation, l); + if (isNil(n)) + return value(); + return car(n); +} + +/** + * Returns the URI of a service, reference or implementation. + */ +const value uri(const value& l) { + return attributeValue("uri", l); +} + +/** + * Returns a list of services in a component. + */ +const list<value> services(const value& l) { + return elementChildren("service", l); +} + +/** + * Returns a list of references in a component. + */ +const list<value> references(const value& l) { + return elementChildren("reference", l); +} + +/** + * Returns the target of a reference. + */ +const value target(const value& l) { + return attributeValue("target", l); +} + +/** + * Convert a list of references to a reference name -> target assoc list. + */ +const list<value> referenceToTargetAssoc(const list<value>& r) { + if (isNil(r)) + return r; + const value ref(car(r)); + return cons<value>(mklist<value>(scdl::name(ref), scdl::target(ref)), referenceToTargetAssoc(cdr(r))); +} + +/** + * Returns a list of bindings in a service or reference. + */ +const bool filterBinding(const value& v) { + return isElement(v) && contains(string(cadr<value>(v)), "binding."); +} + +const list<value> bindings(const value& l) { + return filter<value>(filterBinding, l); +} + +/** + * Returns a list of properties in a component. + */ +const list<value> properties(const value& l) { + return elementChildren("property", l); +} + +/** + * Returns the type of an implementation. + */ +const value implementationType(const value& l) { + return elementName(l); +} + +/** + * Returns the type of a binding. + */ +const value bindingType(const value& l) { + return elementName(l); +} + +/** + * Returns the value of a property. + */ +const value propertyValue(const value& l) { + return elementValue(l); +} + +} +} + +#endif /* tuscany_scdl_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/scdl/test.composite b/sca-cpp/branches/cpp-contrib/modules/scdl/test.composite new file mode 100644 index 0000000000..f6fdba7f5f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scdl/test.composite @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://store" + name="store"> + + <component name="Store"> + <t:implementation.scheme script="store.scm"/> + <service name="Widget"> + <t:binding.http uri="/store"/> + </service> + <reference name="catalog" target="Catalog"> + <t:binding.jsonrpc/> + </reference> + <reference name="shoppingCart" target="ShoppingCart/Cart"> + <t:binding.atom/> + </reference> + <reference name="shoppingTotal" target="ShoppingCart/Total"> + <t:binding.jsonrpc/> + </reference> + </component> + + <component name="Catalog"> + <t:implementation.scheme script="fruits-catalog.scm"/> + <property name="currencyCode">USD</property> + <service name="Catalog"> + <t:binding.jsonrpc/> + </service> + <reference name="currencyConverter" target="CurrencyConverter"/> + </component> + + <component name="ShoppingCart"> + <t:implementation.scheme script="shopping-cart.scm"/> + <service name="Cart"> + <t:binding.atom uri="/ShoppingCart"/> + </service> + <service name="Total"> + <t:binding.jsonrpc/> + </service> + </component> + + <component name="CurrencyConverter"> + <t:implementation.scheme script="currency-converter.scm"/> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/scheme/Makefile.am new file mode 100644 index 0000000000..f9bfe4e392 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/Makefile.am @@ -0,0 +1,27 @@ +# 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. + +noinst_PROGRAMS = eval-test eval-shell + +datadir=$(prefix)/modules/eval +nobase_data_DATA = *.xsd + +eval_test_SOURCES = eval-test.cpp + +eval_shell_SOURCES = eval-shell.cpp + +TESTS = eval-test diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/driver.hpp b/sca-cpp/branches/cpp-contrib/modules/scheme/driver.hpp new file mode 100644 index 0000000000..112c226ed1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/driver.hpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_scheme_driver_hpp +#define tuscany_scheme_driver_hpp + +/** + * Script evaluator main driver loop. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "eval.hpp" + +namespace tuscany { +namespace scheme { + +const string evalOutputPrompt("; "); +const string evalInputPrompt("=> "); + +const bool promptForInput(const string& str, ostream& out) { + out << endl << endl << str; + return true; +} + +const bool announceOutput(const string str, ostream& out) { + out << endl << str; + return true; +} + +const bool userPrint(const value val, ostream& out) { + if(isCompoundProcedure(val)) + writeValue(mklist<value>(compoundProcedureSymbol, procedureParameters(val), procedureBody(val), "<procedure-env>"), out); + writeValue(val, out); + return true; +} + +const value evalDriverLoop(istream& in, ostream& out, Env& env) { + promptForInput(evalInputPrompt, out); + value input = readValue(in); + if (isNil(input)) + return input; + const value output = evalExpr(input, env); + announceOutput(evalOutputPrompt, out); + userPrint(output, out); + return evalDriverLoop(in, out, env); +} + +const bool evalDriverRun(istream& in, ostream& out) { + setupDisplay(out); + Env env = setupEnvironment(); + evalDriverLoop(in, out, env); + return true; +} + +} +} +#endif /* tuscany_scheme_driver_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/environment.hpp b/sca-cpp/branches/cpp-contrib/modules/scheme/environment.hpp new file mode 100644 index 0000000000..bfb415a978 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/environment.hpp @@ -0,0 +1,179 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_scheme_environment_hpp +#define tuscany_scheme_environment_hpp + +/** + * Script evaluator environment implementation. + */ + +#include "string.hpp" +#include "list.hpp" +#include "value.hpp" +#include "primitive.hpp" +#include <string> + +namespace tuscany { +namespace scheme { + +typedef value Frame; +typedef list<value> Env; + +const value trueSymbol("true"); +const value falseSymbol("false"); +const value defineSymbol("define"); +const value setSymbol("set!"); +const value dotSymbol("."); + +const Env theEmptyEnvironment() { + return list<value>(); +} + +const bool isDefinition(const value& exp) { + return isTaggedList(exp, defineSymbol); +} + +const bool isAssignment(const value& exp) { + return isTaggedList(exp, setSymbol); +} + +const bool isVariable(const value& exp) { + return isSymbol(exp); +} + +const Env enclosingEnvironment(const Env& env) { + return cdr(env); +} + +const gc_ptr<Frame> firstFrame(const Env& env) { + return car(env); +} + +list<value> frameVariables(const Frame& frame) { + return car((list<value> )frame); +} + +list<value> frameValues(const Frame& frame) { + return cdr((list<value> )frame); +} + +const bool isDotVariable(const value& var) { + return var == dotSymbol; +} + +const Frame makeBinding(const Frame& frameSoFar, const list<value>& variables, const list<value> values) { + if (isNil(variables)) { + if (!isNil(values)) + logStream() << "Too many arguments supplied " << values << endl; + return frameSoFar; + } + if (isDotVariable(car(variables))) + return makeBinding(frameSoFar, cdr(variables), mklist<value>(values)); + + if (isNil(values)) { + if (!isNil(variables)) + logStream() << "Too few arguments supplied " << variables << endl; + return frameSoFar; + } + + const list<value> vars = cons(car(variables), frameVariables(frameSoFar)); + const list<value> vals = cons(car(values), frameValues(frameSoFar)); + const Frame newFrame = cons(value(vars), vals); + + return makeBinding(newFrame, cdr(variables), cdr(values)); +} + +const gc_ptr<Frame> makeFrame(const list<value>& variables, const list<value> values) { + gc_ptr<Frame> frame = new (gc_new<Frame>()) Frame(); + *frame = value(makeBinding(cons(value(list<value>()), list<value>()), variables, values)); + return frame; +} + +const value definitionVariable(const value& exp) { + const list<value> exps(exp); + if(isSymbol(car(cdr(exps)))) + return car(cdr(exps)); + const list<value> lexps(car(cdr(exps))); + return car(lexps); +} + +const value definitionValue(const value& exp) { + const list<value> exps(exp); + if(isSymbol(car(cdr(exps)))) + return car(cdr(cdr(exps))); + const list<value> lexps(car(cdr(exps))); + return makeLambda(cdr(lexps), cdr(cdr(exps))); +} + +const value assignmentVariable(const value& exp) { + return car(cdr((list<value> )exp)); +} + +const value assignmentValue(const value& exp) { + return car(cdr(cdr((list<value> )exp))); +} + +const Frame addBindingToFrame(const value& var, const value& val, const Frame& frame) { + return cons(value(cons(var, frameVariables(frame))), cons(val, frameValues(frame))); +} + +const bool defineVariable(const value& var, const value& val, Env& env) { + *firstFrame(env) = addBindingToFrame(var, val, *firstFrame(env)); + return true; +} + +const Env extendEnvironment(const list<value>& vars, const list<value>& vals, const Env& baseEnv) { + return cons<value>(makeFrame(vars, vals), baseEnv); +} + +const Env setupEnvironment() { + Env env = extendEnvironment(primitiveProcedureNames(), primitiveProcedureObjects(), theEmptyEnvironment()); + defineVariable(trueSymbol, true, env); + defineVariable(falseSymbol, false, env); + return env; +} + +const value lookupEnvLoop(const value& var, const Env& env); + +const value lookupEnvScan(const value& var, const list<value>& vars, const list<value>& vals, const Env& env) { + if(isNil(vars)) + return lookupEnvLoop(var, enclosingEnvironment(env)); + if(var == car(vars)) + return car(vals); + return lookupEnvScan(var, cdr(vars), cdr(vals), env); +} + +const value lookupEnvLoop(const value& var, const Env& env) { + if(env == theEmptyEnvironment()) { + logStream() << "Unbound variable " << var << endl; + return value(); + } + return lookupEnvScan(var, frameVariables(*firstFrame(env)), frameValues(*firstFrame(env)), env); +} + +const value lookupVariableValue(const value& var, const Env& env) { + return lookupEnvLoop(var, env); +} + +} +} +#endif /* tuscany_scheme_environment_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/eval-shell.cpp b/sca-cpp/branches/cpp-contrib/modules/scheme/eval-shell.cpp new file mode 100644 index 0000000000..4aa67c2375 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/eval-shell.cpp @@ -0,0 +1,36 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Script evaluator shell, used for interactive testing of scripts. + */ + +#include <assert.h> +#include "gc.hpp" +#include "stream.hpp" +#include "string.hpp" +#include "driver.hpp" + +int main() { + tuscany::gc_scoped_pool pool; + tuscany::scheme::evalDriverRun(tuscany::cin, tuscany::cout); + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/eval-test.cpp b/sca-cpp/branches/cpp-contrib/modules/scheme/eval-test.cpp new file mode 100644 index 0000000000..7c4c0c69c4 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/eval-test.cpp @@ -0,0 +1,231 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test script evaluator. + */ + +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "driver.hpp" + +namespace tuscany { +namespace scheme { + +bool testEnv() { + gc_scoped_pool pool; + Env globalEnv = list<value>(); + Env env = extendEnvironment(mklist<value>("a"), mklist<value>(1), globalEnv); + defineVariable("x", env, env); + assert(lookupVariableValue(value("x"), env) == env); + assert(lookupVariableValue("a", env) == value(1)); + return true; +} + +bool testEnvGC() { + resetLambdaCounters(); + resetListCounters(); + resetValueCounters(); + testEnv(); + assert(checkValueCounters()); + assert(checkLambdaCounters()); + assert(checkListCounters()); + return true; +} + +bool testRead() { + istringstream is("abcd"); + assert(readValue(is) == "abcd"); + + istringstream is2("123"); + assert(readValue(is2) == value(123)); + + istringstream is3("(abcd)"); + assert(readValue(is3) == mklist(value("abcd"))); + + istringstream is4("(abcd xyz)"); + assert(readValue(is4) == mklist<value>("abcd", "xyz")); + + istringstream is5("(abcd (xyz tuv))"); + assert(readValue(is5) == mklist<value>("abcd", mklist<value>("xyz", "tuv"))); + + return true; +} + +bool testWrite() { + const list<value> i = list<value>() + + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + + (list<value>() + "item" + + (list<value>() + "name" + "Apple") + + (list<value>() + "price" + "$2.99"))) + + (list<value>() + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" + + (list<value>() + "item" + + (list<value>() + "name" + "Orange") + + (list<value>() + "price" + "$3.55"))); + const list<value> a = cons<value>("Feed", cons<value>("feed-1234", i)); + ostringstream os; + writeValue(a, os); + istringstream is(str(os)); + assert(readValue(is) == a); + return true; +} + +const string testSchemeNumber( + "(define (testNumber) (if (= 1 1) (display \"testNumber ok\") (error \"testNumber\"))) " + "(testNumber)"); + +const string testSchemeString( + "(define (testString) (if (= \"abc\" \"abc\") (display \"testString ok\") (error \"testString\"))) " + "(testString)"); + +const string testSchemeDefinition( + "(define a \"abc\") (define (testDefinition) (if (= a \"abc\") (display \"testDefinition ok\") (error \"testDefinition\"))) " + "(testDefinition)"); + +const string testSchemeIf( + "(define (testIf) (if (= \"abc\" \"abc\") (if (= \"xyz\" \"xyz\") (display \"testIf ok\") (error \"testNestedIf\")) (error \"testIf\"))) " + "(testIf)"); + +const string testSchemeCond( + "(define (testCond) (cond ((= \"abc\" \"abc\") (display \"testCond ok\")) (else (error \"testIf\"))))" + "(testCond)"); + +const string testSchemeBegin( + "(define (testBegin) " + "(begin " + "(define a \"abc\") " + "(if (= a \"abc\") (display \"testBegin1 ok\") (error \"testBegin\")) " + "(define x \"xyz\") " + "(if (= x \"xyz\") (display \"testBegin2 ok\") (error \"testBegin\")) " + ") " + ") " + "(testBegin)"); + +const string testSchemeLambda( + "(define sqrt (lambda (x) (* x x))) " + "(define (testLambda) (if (= 4 (sqrt 2)) (display \"testLambda ok\") (error \"testLambda\"))) " + "(testLambda)"); + +const string testSchemeForward( + "(define (testLambda) (if (= 4 (sqrt 2)) (display \"testForward ok\") (error \"testForward\"))) " + "(define sqrt (lambda (x) (* x x))) " + "(testLambda)"); + +const string evalOutput(const string& scm) { + istringstream is(scm); + ostringstream os; + evalDriverRun(is, os); + return str(os); +} + +bool testEval() { + gc_scoped_pool pool; + assert(contains(evalOutput(testSchemeNumber), "testNumber ok")); + assert(contains(evalOutput(testSchemeString), "testString ok")); + assert(contains(evalOutput(testSchemeDefinition), "testDefinition ok")); + assert(contains(evalOutput(testSchemeIf), "testIf ok")); + assert(contains(evalOutput(testSchemeCond), "testCond ok")); + assert(contains(evalOutput(testSchemeBegin), "testBegin1 ok")); + assert(contains(evalOutput(testSchemeBegin), "testBegin2 ok")); + assert(contains(evalOutput(testSchemeLambda), "testLambda ok")); + assert(contains(evalOutput(testSchemeForward), "testForward ok")); + return true; +} + +bool testEvalExpr() { + gc_scoped_pool pool; + const value exp = mklist<value>("+", 2, 3); + Env env = setupEnvironment(); + const value r = evalExpr(exp, env); + assert(r == value(5)); + return true; +} + +bool testEvalRun() { + gc_scoped_pool pool; + evalDriverRun(cin, cout); + return true; +} + +const value mult(const list<value>& args) { + const double x = car(args); + const double y = cadr(args); + return x * y; +} + +const string testReturnLambda( + "(define (testReturnLambda) * )"); + +const string testCallLambda( + "(define (testCallLambda l x y) (l x y))"); + +bool testEvalLambda() { + gc_scoped_pool pool; + Env env = setupEnvironment(); + + const value trl = mklist<value>("testReturnLambda"); + istringstream trlis(testReturnLambda); + const value trlv = evalScript(trl, trlis, env); + + istringstream tclis(testCallLambda); + const value tcl = cons<value>("testCallLambda", quotedParameters(mklist<value>(trlv, 2, 3))); + const value tclv = evalScript(tcl, tclis, env); + assert(tclv == value(6)); + + istringstream tcelis(testCallLambda); + const value tcel = cons<value>("testCallLambda", quotedParameters(mklist<value>(primitiveProcedure(mult), 3, 4))); + const value tcelv = evalScript(tcel, tcelis, env); + assert(tcelv == value(12)); + return true; +} + +bool testEvalGC() { + resetLambdaCounters(); + resetListCounters(); + resetValueCounters(); + testEval(); + testEvalExpr(); + testEvalLambda(); + assert(checkValueCounters()); + assert(checkLambdaCounters()); + assert(checkListCounters()); + return true; +} + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::scheme::testEnv(); + tuscany::scheme::testEnvGC(); + tuscany::scheme::testRead(); + tuscany::scheme::testWrite(); + tuscany::scheme::testEval(); + tuscany::scheme::testEvalExpr(); + tuscany::scheme::testEvalLambda(); + tuscany::scheme::testEvalGC(); + + tuscany::cout << "OK" << tuscany::endl; + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/eval.hpp b/sca-cpp/branches/cpp-contrib/modules/scheme/eval.hpp new file mode 100644 index 0000000000..34d1a7bc17 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/eval.hpp @@ -0,0 +1,290 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_scheme_eval_hpp +#define tuscany_scheme_eval_hpp + +/** + * Core script evaluation logic. + */ + +#include <string.h> +#include "list.hpp" +#include "value.hpp" +#include "primitive.hpp" +#include "io.hpp" +#include "environment.hpp" + +namespace tuscany { +namespace scheme { + +const value evalExpr(const value& exp, Env& env); + +const value compoundProcedureSymbol("compound-procedure"); +const value procedureSymbol("procedure"); +const value applySymbol("apply"); +const value beginSymbol("begin"); +const value condSymbol("cond"); +const value elseSymbol("else"); +const value ifSymbol("if"); + +const bool isBegin(const value& exp) { + return isTaggedList(exp, beginSymbol); +} + +const list<value> beginActions(const value& exp) { + return cdr((list<value> )exp); +} + +const bool isLambdaExpr(const value& exp) { + return isTaggedList(exp, lambdaSymbol); +} + +const list<value> lambdaParameters(const value& exp) { + return car(cdr((list<value> )exp)); +} + +static list<value> lambdaBody(const value& exp) { + return cdr(cdr((list<value> )exp)); +} + +const value makeProcedure(const list<value>& parameters, const value& body, const Env& env) { + return mklist<value>(procedureSymbol, parameters, body, env); +} + +const bool isApply(const value& exp) { + return isTaggedList(exp, applySymbol); +} + +const bool isApplication(const value& exp) { + return isList(exp); +} + +const value operat(const value& exp) { + return car((list<value> )exp); +} + +const list<value> operands(const value& exp) { + return cdr((list<value> )exp); +} + +const list<value> listOfValues(const list<value> exps, Env& env) { + if(isNil(exps)) + return list<value> (); + return cons(evalExpr(car(exps), env), listOfValues(cdr(exps), env)); +} + +const value applyOperat(const value& exp) { + return cadr((list<value> )exp); +} + +const value applyOperand(const value& exp) { + return caddr((list<value> )exp); +} + +const bool isCompoundProcedure(const value& procedure) { + return isTaggedList(procedure, procedureSymbol); +} + +const list<value> procedureParameters(const value& exp) { + return car(cdr((list<value> )exp)); +} + +const value procedureBody(const value& exp) { + return car(cdr(cdr((list<value> )exp))); +} + +const Env procedureEnvironment(const value& exp) { + return (Env)car(cdr(cdr(cdr((list<value> )exp)))); +} + +const bool isLastExp(const list<value>& seq) { + return isNil(cdr(seq)); +} + +const value firstExp(const list<value>& seq) { + return car(seq); +} + +const list<value> restExp(const list<value>& seq) { + return cdr(seq); +} + +const value makeBegin(const list<value> seq) { + return cons(beginSymbol, seq); +} + +const value evalSequence(const list<value>& exps, Env& env) { + if(isLastExp(exps)) + return evalExpr(firstExp(exps), env); + evalExpr(firstExp(exps), env); + return evalSequence(restExp(exps), env); +} + +const value applyProcedure(const value& procedure, list<value>& arguments) { + if(isPrimitiveProcedure(procedure)) + return applyPrimitiveProcedure(procedure, arguments); + if(isCompoundProcedure(procedure)) { + Env env = extendEnvironment(procedureParameters(procedure), arguments, procedureEnvironment(procedure)); + return evalSequence(procedureBody(procedure), env); + } + logStream() << "Unknown procedure type " << procedure << endl; + return value(); +} + +const value sequenceToExp(const list<value> exps) { + if(isNil(exps)) + return exps; + if(isLastExp(exps)) + return firstExp(exps); + return makeBegin(exps); +} + +const list<value> condClauses(const value& exp) { + return cdr((list<value> )exp); +} + +const value condPredicate(const value& clause) { + return car((list<value> )clause); +} + +const list<value> condActions(const value& clause) { + return cdr((list<value> )clause); +} + +const value ifPredicate(const value& exp) { + return car(cdr((list<value> )exp)); +} + +const value ifConsequent(const value& exp) { + return car(cdr(cdr((list<value> )exp))); +} + +const value ifAlternative(const value& exp) { + if(!isNil(cdr(cdr(cdr((list<value> )exp))))) + return car(cdr(cdr(cdr((list<value> )exp)))); + return false; +} + +const bool isCond(const value& exp) { + return isTaggedList(exp, condSymbol); +} + +const bool isCondElseClause(const value& clause) { + return condPredicate(clause) == elseSymbol; +} + +const bool isIf(const value& exp) { + return isTaggedList(exp, ifSymbol); +} + +const value makeIf(value predicate, value consequent, value alternative) { + return mklist(ifSymbol, predicate, consequent, alternative); +} + +const value expandClauses(const list<value>& clauses) { + if(isNil(clauses)) + return false; + const value first = car(clauses); + const list<value> rest = cdr(clauses); + if(isCondElseClause(first)) { + if(isNil(rest)) + return sequenceToExp(condActions(first)); + logStream() << "else clause isn't last " << clauses << endl; + return value(); + } + return makeIf(condPredicate(first), sequenceToExp(condActions(first)), expandClauses(rest)); +} + +value condToIf(const value& exp) { + return expandClauses(condClauses(exp)); +} + +value evalIf(const value& exp, Env& env) { + if(isTrue(evalExpr(ifPredicate(exp), env))) + return evalExpr(ifConsequent(exp), env); + return evalExpr(ifAlternative(exp), env); +} + +const value evalDefinition(const value& exp, Env& env) { + defineVariable(definitionVariable(exp), evalExpr(definitionValue(exp), env), env); + return definitionVariable(exp); +} + +const value evalExpr(const value& exp, Env& env) { + if(isSelfEvaluating(exp)) + return exp; + if(isQuoted(exp)) + return textOfQuotation(exp); + if(isDefinition(exp)) + return evalDefinition(exp, env); + if(isIf(exp)) + return evalIf(exp, env); + if(isBegin(exp)) + return evalSequence(beginActions(exp), env); + if(isCond(exp)) + return evalExpr(condToIf(exp), env); + if(isLambdaExpr(exp)) + return makeProcedure(lambdaParameters(exp), lambdaBody(exp), env); + if(isVariable(exp)) + return lookupVariableValue(exp, env); + if(isApply(exp)) { + list<value> applyOperandValues = evalExpr(applyOperand(exp), env); + return applyProcedure(evalExpr(applyOperat(exp), env), applyOperandValues); + } + if(isApplication(exp)) { + list<value> operandValues = listOfValues(operands(exp), env); + return applyProcedure(evalExpr(operat(exp), env), operandValues); + } + logStream() << "Unknown expression type " << exp << endl; + return value(); +} + +const list<value> quotedParameters(const list<value>& p) { + if (isNil(p)) + return p; + return cons<value>(mklist<value>(quoteSymbol, car(p)), quotedParameters(cdr(p))); +} + +/** + * Evaluate an expression against a script provided as a list of values. + */ +const value evalScriptLoop(const value& expr, const list<value>& script, scheme::Env& env) { + if (isNil(script)) + return scheme::evalExpr(expr, env); + scheme::evalExpr(car(script), env); + return evalScriptLoop(expr, cdr(script), env); +} + +const value evalScript(const value& expr, const value& script, Env& env) { + return evalScriptLoop(expr, script, env); +} + +/** + * Evaluate an expression against a script provided as an input stream. + */ +const value evalScript(const value& expr, istream& is, Env& env) { + return evalScript(expr, readScript(is), env); +} + +} +} +#endif /* tuscany_scheme_eval_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/io.hpp b/sca-cpp/branches/cpp-contrib/modules/scheme/io.hpp new file mode 100644 index 0000000000..5e5397cfeb --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/io.hpp @@ -0,0 +1,217 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_scheme_io_hpp +#define tuscany_scheme_io_hpp + +/** + * Script evaluator IO functions. + */ + +#include <ctype.h> +#include "stream.hpp" +#include "string.hpp" + +#include "list.hpp" +#include "value.hpp" +#include "primitive.hpp" + +namespace tuscany { +namespace scheme { + +const value rightParenthesis(mklist<value>(")")); +const value leftParenthesis(mklist<value>("(")); +const value comment(mklist<value>(";")); + +const double stringToNumber(const string& str) { + return atof(c_str(str)); +} + +const bool isWhitespace(const char ch) { + return ch != -1 && isspace(ch); +} + +const bool isIdentifierStart(const char ch) { + return ch != -1 && !isspace(ch) && !isdigit(ch); +} + +const bool isIdentifierPart(const char ch) { + return ch != -1 && !isspace(ch) && ch != '(' && ch != ')'; +} + +const bool isDigit(const char ch) { + return isdigit(ch) || ch == '.'; +} + +const bool isLeftParenthesis(const value& token) { + return leftParenthesis == token; +} + +const bool isRightParenthesis(const value& token) { + return rightParenthesis == token; +} + +const char readChar(istream& in) { + if(in.eof()) { + return -1; + } + char c = (char)get(in); + return c; +} + +const char peekChar(istream& in) { + if(eof(in)) + return -1; + char c = (char)peek(in); + return c; +} + +const bool isQuote(const value& token) { + return token == quoteSymbol; +} + +const value skipComment(istream& in); +const value readQuoted(istream& in); +const value readIdentifier(const char chr, istream& in); +const value readString(istream& in); +const value readNumber(const char chr, istream& in); +const value readValue(istream& in); + +const value readToken(istream& in) { + const char firstChar = readChar(in); + if(isWhitespace(firstChar)) + return readToken(in); + if(firstChar == ';') + return skipComment(in); + if(firstChar == '\'') + return readQuoted(in); + if(firstChar == '(') + return leftParenthesis; + if(firstChar == ')') + return rightParenthesis; + if(firstChar == '"') + return readString(in); + if(isIdentifierStart(firstChar)) + return readIdentifier(firstChar, in); + if(isDigit(firstChar)) + return readNumber(firstChar, in); + if(firstChar == -1) + return value(); + logStream() << "Illegal lexical syntax '" << firstChar << "'" << endl; + return readToken(in); +} + +const value skipComment(istream& in) { + const char nextChar = readChar(in); + if (nextChar == '\n') + return readToken(in); + return skipComment(in); +} + +const value readQuoted(istream& in) { + return mklist(quoteSymbol, readValue(in)); +} + +const list<value> readList(const list<value>& listSoFar, istream& in) { + const value token = readToken(in); + if(isNil(token) || isRightParenthesis(token)) + return reverse(listSoFar); + if(isLeftParenthesis(token)) + return readList(cons(value(readList(list<value> (), in)), listSoFar), in); + return readList(cons(token, listSoFar), in); +} + +const string listToString(const list<char>& l) { + if(isNil(l)) + return ""; + const char buf[1] = { car(l) }; + return string(buf, 1) + listToString(cdr(l)); +} + +const list<char> readIdentifierHelper(const list<char>& listSoFar, istream& in) { + const char nextChar = peekChar(in); + if(isIdentifierPart(nextChar)) + return readIdentifierHelper(cons(readChar(in), listSoFar), in); + return reverse(listSoFar); +} + +const value readIdentifier(const char chr, istream& in) { + return c_str(listToString(readIdentifierHelper(mklist(chr), in))); +} + +const list<char> readStringHelper(const list<char>& listSoFar, istream& in) { + const char nextChar = readChar(in); + if(nextChar != -1 && nextChar != '"') + return readStringHelper(cons(nextChar, listSoFar), in); + return reverse(listSoFar); +} + +const value readString(istream& in) { + return listToString(readStringHelper(list<char>(), in)); +} + +const list<char> readNumberHelper(const list<char>& listSoFar, istream& in) { + const char nextChar = peekChar(in); + if(isDigit(nextChar)) + return readNumberHelper(cons(readChar(in), listSoFar), in); + return reverse(listSoFar); +} + +const value readNumber(const char chr, istream& in) { + return stringToNumber(listToString(readNumberHelper(mklist(chr), in))); +} + +const value readValue(istream& in) { + const value nextToken = readToken(in); + if(isLeftParenthesis(nextToken)) + return readList(list<value> (), in); + return nextToken; +} + +const value readValue(const string s) { + istringstream in(s); + const value nextToken = readToken(in); + if(isLeftParenthesis(nextToken)) + return readList(list<value> (), in); + return nextToken; +} + +const bool writeValue(const value& val, ostream& out) { + out << val; + return true; +} + +const string writeValue(const value& val) { + ostringstream out; + out << val; + return str(out); +} + +const value readScript(istream& in) { + const value val = readValue(in); + if (isNil(val)) + return list<value>(); + return cons(val, (list<value>)readScript(in)); +} + +} +} +#endif /* tuscany_scheme_io_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/primitive.hpp b/sca-cpp/branches/cpp-contrib/modules/scheme/primitive.hpp new file mode 100644 index 0000000000..fd5f3e9755 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/primitive.hpp @@ -0,0 +1,285 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_scheme_primitive_hpp +#define tuscany_scheme_primitive_hpp + +/** + * Script evaluator primitive functions. + */ + +#include <apr_general.h> +#include <apr_uuid.h> +#include "stream.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" + +namespace tuscany { +namespace scheme { + +const value primitiveSymbol("primitive"); +const value quoteSymbol("'"); +const value lambdaSymbol("lambda"); + +#ifdef WANT_THREADS +__thread +#endif +ostream* displayOutStream = NULL; + +#ifdef WANT_THREADS +__thread +#endif +ostream* logOutStream = NULL; + +const bool setupDisplay(ostream& out) { + displayOutStream = &out; + return true; +} + +ostream& displayStream() { + if (displayOutStream == NULL) + return cout; + return *displayOutStream; +} + +const bool setupLog(ostream& out) { + logOutStream = &out; + return true; +} + +ostream& logStream() { + if (logOutStream == NULL) + return cerr; + return *logOutStream; +} + +const value carProc(const list<value>& args) { + return car((list<value> )car(args)); +} + +const value cdrProc(const list<value>& args) { + return cdr((list<value> )car(args)); +} + +const value consProc(const list<value>& args) { + return cons(car(args), (list<value> )cadr(args)); +} + +const value listProc(const list<value>& args) { + return args; +} + +const value assocProc(const list<value>& args) { + return assoc(car(args), (list<list<value> >)cadr(args)); +} + +const value nulProc(const list<value>& args) { + const value v(car(args)); + if (isNil(v)) + return true; + if (isList(v)) + return isNil(list<value>(v)); + return false; +} + +const value equalProc(const list<value>& args) { + return (bool)(car(args) == cadr(args)); +} + +const value addProc(const list<value>& args) { + if (isNil(cdr(args))) + return (double)car(args); + return (double)car(args) + (double)cadr(args); +} + +const value subProc(const list<value>& args) { + if (isNil(cdr(args))) + return (double)0 - (double)car(args); + return (double)car(args) - (double)cadr(args); +} + +const value mulProc(const list<value>& args) { + return (double)car(args) * (double)cadr(args); +} + +const value divProc(const list<value>& args) { + return (double)car(args) / (double)cadr(args); +} + +const value displayProc(const list<value>& args) { + if (isNil(args)) { + displayStream() << endl; + return true; + } + displayStream() << car(args); + return displayProc(cdr(args)); +} + +const value logProc(const list<value>& args) { + if (isNil(args)) { + logStream() << endl; + return true; + } + logStream() << car(args); + return logProc(cdr(args)); +} + +const value uuidProc(unused const list<value>& args) { + apr_uuid_t uuid; + apr_uuid_get(&uuid); + char buf[APR_UUID_FORMATTED_LENGTH]; + apr_uuid_format(buf, &uuid); + return string(buf, APR_UUID_FORMATTED_LENGTH); +} + +const value cadrProc(unused const list<value>& args) { + return cadr((list<value> )car(args)); +} + +const value caddrProc(unused const list<value>& args) { + return caddr((list<value> )car(args)); +} + +const value cadddrProc(unused const list<value>& args) { + return cadddr((list<value> )car(args)); +} + +const value cddrProc(unused const list<value>& args) { + return cddr((list<value> )car(args)); +} + +const value cdddrProc(unused const list<value>& args) { + return cdddr((list<value> )car(args)); +} + +const value startProc(unused const list<value>& args) { + return lambda<value(const list<value>&)>(); +} + +const value stopProc(unused const list<value>& args) { + return lambda<value(const list<value>&)>(); +} + +const value applyPrimitiveProcedure(const value& proc, list<value>& args) { + const lambda<value(const list<value>&)> func(cadr((list<value>)proc)); + return func(args); +} + +const bool isPrimitiveProcedure(const value& proc) { + return isTaggedList(proc, primitiveSymbol); +} + +const bool isSelfEvaluating(const value& exp) { + if(isNil(exp)) + return true; + if(isNumber(exp)) + return true; + if(isString(exp)) + return true; + if(isBool(exp)) + return true; + if(isLambda(exp)) + return true; + return false; +} + +const value primitiveImplementation(const list<value>& proc) { + return car(cdr(proc)); +} + +template<typename F> const value primitiveProcedure(const F& f) { + return mklist<value>(primitiveSymbol, (lambda<value(const list<value>&)>)f); +} + +const list<value> primitiveProcedureNames() { + return mklist<value>("car") + + "cdr" + + "cons" + + "list" + + "nul" + + "=" + + "equal?" + + "+" + + "-" + + "*" + + "/" + + "assoc" + + "cadr" + + "caddr" + + "cadddr" + + "cddr" + + "cdddr" + + "display" + + "log" + + "uuid" + + "start" + + "stop"; +} + +const list<value> primitiveProcedureObjects() { + return mklist(primitiveProcedure(carProc)) + + primitiveProcedure(cdrProc) + + primitiveProcedure(consProc) + + primitiveProcedure(listProc) + + primitiveProcedure(nulProc) + + primitiveProcedure(equalProc) + + primitiveProcedure(equalProc) + + primitiveProcedure(addProc) + + primitiveProcedure(subProc) + + primitiveProcedure(mulProc) + + primitiveProcedure(divProc) + + primitiveProcedure(assocProc) + + primitiveProcedure(cadrProc) + + primitiveProcedure(caddrProc) + + primitiveProcedure(cadddrProc) + + primitiveProcedure(cddrProc) + + primitiveProcedure(cdddrProc) + + primitiveProcedure(displayProc) + + primitiveProcedure(logProc) + + primitiveProcedure(uuidProc) + + primitiveProcedure(startProc) + + primitiveProcedure(stopProc); +} + +const bool isFalse(const value& exp) { + return (bool)exp == false; +} + +const bool isTrue(const value& exp) { + return (bool)exp == true; +} + +const bool isQuoted(const value& exp) { + return isTaggedList(exp, quoteSymbol); +} + +const value textOfQuotation(const value& exp) { + return car(cdr((list<value> )exp)); +} + +const value makeLambda(const list<value>& parameters, const list<value>& body) { + return cons(lambdaSymbol, cons<value>(parameters, body)); +} + +} +} +#endif /* tuscany_scheme_primitive_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/scheme/tuscany-sca-1.1-implementation-scheme.xsd b/sca-cpp/branches/cpp-contrib/modules/scheme/tuscany-sca-1.1-implementation-scheme.xsd new file mode 100644 index 0000000000..5b32834832 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/scheme/tuscany-sca-1.1-implementation-scheme.xsd @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="implementation.scheme" type="t:SchemeImplementation" substitutionGroup="sca:implementation"/> + + <complexType name="SchemeImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="script" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/modules/server/Makefile.am b/sca-cpp/branches/cpp-contrib/modules/server/Makefile.am new file mode 100644 index 0000000000..9c18b45dad --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/Makefile.am @@ -0,0 +1,39 @@ +# 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. + +noinst_PROGRAMS = client-test + +libdir=$(prefix)/lib +lib_LTLIBRARIES = libmod_tuscany_eval.la libmod_tuscany_wiring.la + +INCLUDES = -I${HTTPD_INCLUDE} + +libmod_tuscany_eval_la_SOURCES = mod-eval.cpp +libmod_tuscany_eval_la_LDFLAGS = -lxml2 -lcurl -lmozjs + +libmod_tuscany_wiring_la_SOURCES = mod-wiring.cpp +libmod_tuscany_wiring_la_LDFLAGS = -lxml2 -lcurl -lmozjs + +testdir=$(prefix)/test +test_LTLIBRARIES = libimpl-test.la + +libimpl_test_la_SOURCES = impl-test.cpp + +client_test_SOURCES = client-test.cpp +client_test_LDFLAGS = -lxml2 -lcurl -lmozjs + +TESTS = httpd-test server-test wiring-test diff --git a/sca-cpp/branches/cpp-contrib/modules/server/client-test.cpp b/sca-cpp/branches/cpp-contrib/modules/server/client-test.cpp new file mode 100644 index 0000000000..3bc8aa7d10 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/client-test.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test HTTP client functions. + */ + +#include "stream.hpp" +#include "string.hpp" +#include "client-test.hpp" + +namespace tuscany { +namespace server { + +string testURI = "http://localhost:8090/test"; + +} +} + +int main() { + tuscany::cout << "Testing..." << tuscany::endl; + + tuscany::server::testServer(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/modules/server/client-test.hpp b/sca-cpp/branches/cpp-contrib/modules/server/client-test.hpp new file mode 100644 index 0000000000..651a9016b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/client-test.hpp @@ -0,0 +1,346 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test HTTP client functions. + */ + +#include <sys/types.h> +#include <sys/wait.h> +#include <unistd.h> +#include <assert.h> +#include "stream.hpp" +#include "string.hpp" +#include "parallel.hpp" +#include "perf.hpp" +#include "../http/curl.hpp" + +namespace tuscany { +namespace server { + +extern string testURI; + +ostream* curlWriter(const string& s, ostream* os) { + (*os) << s; + return os; +} + +const bool testGet() { + gc_scoped_pool pool; + http::CURLSession ch; + { + ostringstream os; + const failable<list<ostream*> > r = http::get<ostream*>(curlWriter, &os, "http://localhost:8090", ch); + assert(hasContent(r)); + assert(contains(str(os), "HTTP/1.1 200 OK")); + assert(contains(str(os), "It works")); + } + { + const failable<value> r = http::getcontent("http://localhost:8090", ch); + assert(hasContent(r)); + assert(contains(car(reverse(list<value>(content(r)))), "It works")); + } + return true; +} + +struct getLoop { + http::CURLSession ch; + getLoop(http::CURLSession& ch) : ch(ch) { + } + const bool operator()() const { + const failable<value> r = http::getcontent("http://localhost:8090", ch); + assert(hasContent(r)); + assert(contains(car(reverse(list<value>(content(r)))), "It works")); + return true; + } +}; + +const bool testGetPerf() { + gc_scoped_pool pool; + http::CURLSession ch; + const lambda<bool()> gl = getLoop(ch); + cout << "Static GET test " << time(gl, 5, 200) << " ms" << endl; + return true; +} + +const bool testEval() { + gc_scoped_pool pool; + http::CURLSession ch; + const value val = content(http::evalExpr(mklist<value>(string("echo"), string("Hello")), testURI, ch)); + assert(val == string("Hello")); + return true; +} + +struct evalLoop { + const string uri; + http::CURLSession ch; + evalLoop(const string& uri, http::CURLSession& ch) : uri(uri), ch(ch) { + } + const bool operator()() const { + const value val = content(http::evalExpr(mklist<value>(string("echo"), string("Hello")), uri, ch)); + assert(val == string("Hello")); + return true; + } +}; + +const value blob(string(2048, 'A')); +const list<value> blobs = mklist(blob, blob); + +struct blobEvalLoop { + const string uri; + http::CURLSession ch; + blobEvalLoop(const string& uri, http::CURLSession& ch) : uri(uri), ch(ch) { + } + const bool operator()() const { + const value val = content(http::evalExpr(mklist<value>(string("echo"), blobs), uri, ch)); + assert(val == blobs); + return true; + } +}; + +const bool testEvalPerf() { + gc_scoped_pool pool; + http::CURLSession ch; + const lambda<bool()> el = evalLoop(testURI, ch); + cout << "JSON-RPC eval echo test " << time(el, 5, 200) << " ms" << endl; + const lambda<bool()> bel = blobEvalLoop(testURI, ch); + cout << "JSON-RPC eval blob test " << time(bel, 5, 200) << " ms" << endl; + return true; +} + +bool testPost() { + gc_scoped_pool pool; + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); + const list<value> a = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + http::CURLSession ch; + const failable<value> id = http::post(a, testURI, ch); + assert(hasContent(id)); + return true; +} + +struct postLoop { + const string uri; + const value val; + http::CURLSession ch; + postLoop(const string& uri, const value& val, http::CURLSession& ch) : uri(uri), val(val), ch(ch) { + } + const bool operator()() const { + const failable<value> id = http::post(val, uri, ch); + assert(hasContent(id)); + return true; + } +}; + +struct postBlobLoop { + const string uri; + const value val; + http::CURLSession ch; + postBlobLoop(const string& uri, const value& val, http::CURLSession& ch) : uri(uri), val(val), ch(ch) { + } + const bool operator()() const { + gc_scoped_pool pool; + const failable<value> id = http::post(val, uri, ch); + assert(hasContent(id)); + return true; + } +}; + +const bool testPostPerf() { + gc_scoped_pool pool; + http::CURLSession ch; + { + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); + const list<value> val = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + const lambda<bool()> pl = postLoop(testURI, val, ch); + cout << "ATOMPub POST small test " << time(pl, 5, 200) << " ms" << endl; + } + { + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "blob1" + blob) + + (list<value>() + "blob2" + blob) + + (list<value>() + "price" + string("$2.99")); + const list<value> val = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + const lambda<bool()> pl = postBlobLoop(testURI, val, ch); + cout << "ATOMPub POST blob test " << time(pl, 5, 200) << " ms" << endl; + } + return true; +} + +#ifdef WANT_THREADS + +const bool postThread(const string& uri, const int count, const value& val) { + gc_scoped_pool pool; + http::CURLSession ch; + const lambda<bool()> pl = postLoop(uri, val, ch); + time(pl, 0, count); + return true; +} + +const list<future<bool> > startPost(worker& w, const int threads, const lambda<bool()>& l) { + if (threads == 0) + return list<future<bool> >(); + return cons(submit(w, l), startPost(w, threads - 1, l)); +} + +const bool checkPost(const list<future<bool> >& r) { + if (isNil(r)) + return true; + assert(car(r) == true); + return checkPost(cdr(r)); +} + +struct postThreadLoop { + const lambda<bool()> l; + const int threads; + const gc_ptr<worker> w; + postThreadLoop(const lambda<bool()>& l, const int threads) : l(l), threads(threads), w(new (gc_new<worker>()) worker(threads)) { + } + const bool operator()() const { + list<future<bool> > r = startPost(*w, threads, l); + checkPost(r); + return true; + } +}; + +const bool testPostThreadPerf() { + gc_scoped_pool pool; + const int count = 50; + const int threads = 10; + + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); + const value val = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + const lambda<bool()> pl= curry(lambda<bool(const string, const int, const value)>(postThread), testURI, count, val); + const lambda<bool()> ptl = postThreadLoop(pl, threads); + double t = time(ptl, 0, 1) / (threads * count); + cout << "ATOMPub POST thread test " << t << " ms" << endl; + + return true; +} + +#else + +const bool postProc(const string& uri, const int count, const value& val) { + gc_scoped_pool pool; + http::CURLSession ch; + const lambda<bool()> pl = postLoop(uri, val, ch); + time(pl, 0, count); + return true; +} + +const list<pid_t> startPost(const int procs, const lambda<bool()>& l) { + if (procs == 0) + return list<pid_t>(); + pid_t pid = fork(); + if (pid == 0) { + assert(l() == true); + exit(0); + } + return cons(pid, startPost(procs - 1, l)); +} + +const bool checkPost(const list<pid_t>& r) { + if (isNil(r)) + return true; + int status; + waitpid(car(r), &status, 0); + assert(status == 0); + return checkPost(cdr(r)); +} + +struct postForkLoop { + const lambda<bool()> l; + const int procs; + postForkLoop(const lambda<bool()>& l, const int procs) : l(l), procs(procs) { + } + const bool operator()() const { + list<pid_t> r = startPost(procs, l); + checkPost(r); + return true; + } +}; + +const bool testPostForkPerf() { + gc_scoped_pool pool; + const int count = 50; + const int procs = 10; + + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); + const value val = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + + const lambda<bool()> pl= curry(lambda<bool(const string, const int, const value)>(postProc), testURI, count, val); + const lambda<bool()> ptl = postForkLoop(pl, procs); + double t = time(ptl, 0, 1) / (procs * count); + cout << "ATOMPub POST fork test " << t << " ms" << endl; + + return true; +} + +#endif + +const bool testPut() { + gc_scoped_pool pool; + const list<value> i = list<value>() + + (list<value>() + "name" + string("Apple")) + + (list<value>() + "price" + string("$2.99")); + const list<value> a = mklist<value>(string("item"), string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"), i); + http::CURLSession ch; + value rc = content(http::put(a, testURI + "/111", ch)); + assert(rc == value(true)); + return true; +} + +const bool testDel() { + gc_scoped_pool pool; + http::CURLSession ch; + value rc = content(http::del(testURI + "/111", ch)); + assert(rc == value(true)); + return true; +} + +const bool testServer() { + tuscany::server::testGet(); + tuscany::server::testPost(); + tuscany::server::testPut(); + tuscany::server::testDel(); + tuscany::server::testEval(); + tuscany::server::testGetPerf(); + tuscany::server::testPostPerf(); +#ifdef WANT_THREADS + tuscany::server::testPostThreadPerf(); +#else + tuscany::server::testPostForkPerf(); +#endif + tuscany::server::testEvalPerf(); + return true; +} + +} +} diff --git a/sca-cpp/branches/cpp-contrib/modules/server/client-test.scm b/sca-cpp/branches/cpp-contrib/modules/server/client-test.scm new file mode 100644 index 0000000000..47b799d390 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/client-test.scm @@ -0,0 +1,38 @@ +; 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. + +; JSON-RPC test case + +(define (echo x ref) (ref "echo" x)) + +; ATOMPub test case + +(define (get id ref) + (ref "get" id) +) + +(define (post coll entry ref) + (ref "post" coll entry) +) + +(define (put id entry ref) + (ref "put" id entry) +) + +(define (delete id ref) + (ref "delete" id) +) diff --git a/sca-cpp/branches/cpp-contrib/modules/server/cpp-conf b/sca-cpp/branches/cpp-contrib/modules/server/cpp-conf new file mode 100755 index 0000000000..b376585f8c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/cpp-conf @@ -0,0 +1,26 @@ +#!/bin/sh + +# 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. + +# Generate a C++ server conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +cat >>$root/conf/httpd.conf <<EOF +LoadModule mod_tuscany_eval $here/.libs/libmod_tuscany_eval.so +EOF diff --git a/sca-cpp/branches/cpp-contrib/modules/server/domain-test.composite b/sca-cpp/branches/cpp-contrib/modules/server/domain-test.composite new file mode 100644 index 0000000000..ef85bb919b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/domain-test.composite @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://domain/test" + name="domain-test"> + + <component name="scheme-test"> + <t:implementation.scheme script="server-test.scm"/> + <service name="test"> + <t:binding.http uri="test"/> + </service> + </component> + + <component name="cpp-test"> + <implementation.cpp path=".libs" library="libimpl-test"/> + <service name="cpp"> + <t:binding.http uri="cpp"/> + </service> + </component> + + <component name="client-test"> + <t:implementation.scheme script="client-test.scm"/> + <service name="client"> + <t:binding.http uri="client"/> + </service> + <reference name="ref" target="scheme-test"> + <t:binding.http/> + </reference> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/modules/server/htdocs/entry.xml b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/entry.xml new file mode 100644 index 0000000000..86b8a10547 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/entry.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>111</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Apple</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>2.99</price></item></content><link href="111"/></entry> diff --git a/sca-cpp/branches/cpp-contrib/modules/server/htdocs/feed.xml b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/feed.xml new file mode 100644 index 0000000000..5e37de6580 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/feed.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Sample Feed</title><id>123456789</id><entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>111</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Apple</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>2.99</price></item></content><link href="111"/></entry><entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>222</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Orange</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>3.55</price></item></content><link href="222"/></entry><entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><id>333</id><content type="application/xml"><item><javaClass>services.Item</javaClass><name>Pear</name><currencyCode>USD</currencyCode><currencySymbol>$</currencySymbol><price>1.55</price></item></content><link href="333"/></entry></feed> diff --git a/sca-cpp/branches/cpp-contrib/modules/server/htdocs/index.html b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/index.html new file mode 100644 index 0000000000..1bfb3e30c2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/index.html @@ -0,0 +1,21 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body><h1>It works!</h1></body></html> + diff --git a/sca-cpp/branches/cpp-contrib/modules/server/htdocs/json-request.txt b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/json-request.txt new file mode 100644 index 0000000000..b4bd07fc46 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/json-request.txt @@ -0,0 +1 @@ +{"id":1,"method":"echo","params":["Hello"]} diff --git a/sca-cpp/branches/cpp-contrib/modules/server/htdocs/json-result.txt b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/json-result.txt new file mode 100644 index 0000000000..121bf74902 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/htdocs/json-result.txt @@ -0,0 +1 @@ +{"id":1,"result":"Hello"}
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/modules/server/httpd-test b/sca-cpp/branches/cpp-contrib/modules/server/httpd-test new file mode 100755 index 0000000000..86718f96c5 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/httpd-test @@ -0,0 +1,76 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +../http/httpd-conf tmp 8090 htdocs +./server-conf tmp +./scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +../http/httpd-start tmp +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html +diff tmp/index.html htdocs/index.html +rc=$? + +# Test ATOMPub +if [ "$rc" = "0" ]; then + curl http://localhost:8090/test/ >tmp/feed.xml 2>/dev/null + diff tmp/feed.xml htdocs/feed.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/test/111 >tmp/entry.xml 2>/dev/null + diff tmp/entry.xml htdocs/entry.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/test/ -X POST -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/test/111 -X PUT -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/test/111 -X DELETE 2>/dev/null + rc=$? +fi + +# Test JSON-RPC +if [ "$rc" = "0" ]; then + curl http://localhost:8090/test/ -X POST -H "Content-type: application/json-rpc" --data @htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null + diff tmp/json-result.txt htdocs/json-result.txt + rc=$? +fi + +# Cleanup +../http/httpd-stop tmp +sleep 2 +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/server/impl-test.cpp b/sca-cpp/branches/cpp-contrib/modules/server/impl-test.cpp new file mode 100644 index 0000000000..1bd0843745 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/impl-test.cpp @@ -0,0 +1,76 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Test component implementation. + */ + +#include "string.hpp" + +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" + +namespace tuscany { +namespace server { + +const failable<value> get(unused const list<value>& params) { + return value(mklist<value>("text/html", mklist<value>("Hey"))); +} + +const failable<value> post(unused const list<value>& params) { + return value(mklist<value>(string("123456789"))); +} + +const failable<value> put(unused const list<value>& params) { + return value(true); +} + +const failable<value> del(unused const list<value>& params) { + return value(true); +} + +const failable<value> echo(const list<value>& params) { + return value(car(params)); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "get") + return tuscany::server::get(cdr(params)); + if (func == "post") + return tuscany::server::post(cdr(params)); + if (func == "put") + return tuscany::server::put(cdr(params)); + if (func == "delete") + return tuscany::server::del(cdr(params)); + if (func == "echo") + return tuscany::server::echo(cdr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/server/mod-cpp.hpp b/sca-cpp/branches/cpp-contrib/modules/server/mod-cpp.hpp new file mode 100644 index 0000000000..b3828dd7d2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/mod-cpp.hpp @@ -0,0 +1,102 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_modcpp_hpp +#define tuscany_modcpp_hpp + +/** + * Evaluation functions used by mod-eval to evaluate C++ + * component implementations. + */ + +#include "string.hpp" +#include "stream.hpp" + +#include "function.hpp" +#include "list.hpp" +#include "element.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "dynlib.hpp" +#include "../scheme/driver.hpp" + +namespace tuscany { +namespace server { +namespace modcpp { + +/** + * Apply a C++ component implementation function. + */ +const list<value> failableResult(const value& func, const list<value>& v) { + if (isNil(cdr(v))) + return v; + + // Report a failure with an empty reason as 'function not supported' + // Except for the start, and stop functions, which are optional + const value reason = cadr(v); + if (length(reason) == 0) { + if (func == "start" || func == "stop") + return mklist<value>(lambda<value(const list<value>&)>()); + return mklist<value>(value(), string("Function not supported: ") + func); + } + return v; +} + +struct applyImplementation { + const lib ilib; + const lambda<value(const list<value>&)> impl; + const list<value> px; + applyImplementation(const lib& ilib, const lambda<value(const list<value>&)>& impl, const list<value>& px) : ilib(ilib), impl(impl), px(px) { + } + const value operator()(const list<value>& params) const { + debug(params, "modeval::cpp::applyImplementation::input"); + + // Apply the component implementation function + const value val = failableResult(car(params), impl(append(params, px))); + + debug(val, "modeval::cpp::applyImplementation::result"); + return val; + } +}; + +/** + * Evaluate a C++ component implementation and convert it to + * an applicable lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) { + + // Configure the implementation's lambda function + const value ipath(attributeValue("path", impl)); + const value iname(attributeValue("library", impl)); + const string fpath(isNil(ipath)? path + iname : path + ipath + "/" + iname); + const lib ilib(*(new (gc_new<lib>()) lib(fpath + dynlibExt))); + const failable<lambda<value(const list<value>&)> > evalf(dynlambda<value(const list<value>&)>("apply", ilib)); + if (!hasContent(evalf)) + return evalf; + const lambda<value(const list<value>&)> l(applyImplementation(ilib, content(evalf), px)); + return l; +} + +} +} +} + +#endif /* tuscany_modcpp_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/server/mod-eval.cpp b/sca-cpp/branches/cpp-contrib/modules/server/mod-eval.cpp new file mode 100644 index 0000000000..a94ccf5bbe --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/mod-eval.cpp @@ -0,0 +1,62 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * HTTPD module used to eval C++ and Scheme component implementations. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "mod-eval.hpp" +#include "mod-scheme.hpp" +#include "mod-cpp.hpp" + +namespace tuscany { +namespace server { +namespace modeval { + +/** + * Apply a lifecycle start or restart event. + */ +const value applyLifecycle(unused const list<value>& params) { + // Return a nil function as we don't need to handle any subsequent events + return failable<value>(lambda<value(const list<value>&)>()); +} + +/** + * Evaluate a Scheme or C++ component implementation and convert it to an + * applicable lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px, unused const lambda<value(const list<value>&)>& lifecycle) { + const string itype(elementName(impl)); + if (contains(itype, ".scheme")) + return modscheme::evalImplementation(path, impl, px); + if (contains(itype, ".cpp")) + return modcpp::evalImplementation(path, impl, px); + return mkfailure<lambda<value(const list<value>&)> >(string("Unsupported implementation type: ") + itype); +} + +} +} +} diff --git a/sca-cpp/branches/cpp-contrib/modules/server/mod-eval.hpp b/sca-cpp/branches/cpp-contrib/modules/server/mod-eval.hpp new file mode 100644 index 0000000000..f319942f8d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/mod-eval.hpp @@ -0,0 +1,583 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_modeval_hpp +#define tuscany_modeval_hpp + +/** + * HTTPD module used to eval component implementations. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "function.hpp" +#include "list.hpp" +#include "tree.hpp" +#include "value.hpp" +#include "element.hpp" +#include "monad.hpp" +#include "../atom/atom.hpp" +#include "../json/json.hpp" +#include "../scdl/scdl.hpp" +#include "../http/curl.hpp" +#include "../http/httpd.hpp" + +extern "C" { +extern module AP_MODULE_DECLARE_DATA mod_tuscany_eval; +} + +namespace tuscany { +namespace server { +namespace modeval { + +/** + * Server configuration. + */ +class ServerConf { +public: + ServerConf(server_rec* s) : s(s), home(""), wiringServerName(""), contributionPath(""), compositeName("") { + } + + const server_rec* s; + lambda<value(const list<value>&)> lifecycle; + string home; + string wiringServerName; + string contributionPath; + string compositeName; + list<value> implementations; + list<value> implTree; +}; + +/** + * Convert a result represented as a content + failure pair to a + * failable monad. + */ +const failable<value> failableResult(const list<value>& v) { + if (isNil(cdr(v))) + return car(v); + return mkfailure<value>(string(cadr(v))); +} + +/** + * Handle an HTTP GET. + */ +const failable<int> get(request_rec* r, const lambda<value(const list<value>&)>& impl) { + debug(r->uri, "modeval::get::uri"); + + // Inspect the query string + const list<list<value> > args = httpd::queryArgs(r); + const list<value> ia = assoc(value("id"), args); + const list<value> ma = assoc(value("method"), args); + + // Evaluate a JSON-RPC request and return a JSON result + if (!isNil(ia) && !isNil(ma)) { + + // Extract the request id, method and params + const value id = cadr(ia); + const value func = c_str(json::funcName(string(cadr(ma)))); + + // Apply the requested function + const failable<value> val = failableResult(impl(cons(func, httpd::queryParams(args)))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + + // Return JSON result + json::JSONContext cx; + return httpd::writeResult(json::jsonResult(id, content(val), cx), "application/json-rpc", r); + } + + // Evaluate the GET expression + const list<value> path(pathValues(r->uri)); + const failable<value> val = failableResult(impl(cons<value>("get", mklist<value>(cddr(path))))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + const value c = content(val); + + // Write returned content-type / content-list pair + if (isList(cadr<value>(c))) + return httpd::writeResult(convertValues<string>(cadr<value>(c)), car<value>(c), r); + + // Write returned ATOM feed or entry + if (isNil(cddr(path))) + return httpd::writeResult(atom::writeATOMFeed(atom::feedValuesToElements(c)), "application/atom+xml;type=feed", r); + else + return httpd::writeResult(atom::writeATOMEntry(atom::entryValuesToElements(c)), "application/atom+xml;type=entry", r); +} + +/** + * Handle an HTTP POST. + */ +const failable<int> post(request_rec* r, const lambda<value(const list<value>&)>& impl) { + debug(r->uri, "modeval::post::url"); + + // Evaluate a JSON-RPC request and return a JSON result + const string ct = httpd::contentType(r); + if (contains(ct, "application/json-rpc") || contains(ct, "text/plain")) { + + // Read the JSON request + const int rc = httpd::setupReadPolicy(r); + if(rc != OK) + return rc; + const list<string> ls = httpd::read(r); + debug(ls, "modeval::post::input"); + json::JSONContext cx; + const list<value> json = elementsToValues(content(json::readJSON(ls, cx))); + const list<list<value> > args = httpd::postArgs(json); + + // Extract the request id, method and params + const value id = cadr(assoc(value("id"), args)); + const value func = c_str(json::funcName(cadr(assoc(value("method"), args)))); + const list<value> params = (list<value>)cadr(assoc(value("params"), args)); + + // Evaluate the request expression + const failable<value> val = failableResult(impl(cons<value>(func, params))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + + // Return JSON result + return httpd::writeResult(json::jsonResult(id, content(val), cx), "application/json-rpc", r); + } + + // Evaluate an ATOM POST request and return the location of the corresponding created resource + if (contains(ct, "application/atom+xml")) { + + // Read the ATOM entry + const list<value> path(pathValues(r->uri)); + const int rc = httpd::setupReadPolicy(r); + if(rc != OK) + return rc; + const list<string> ls = httpd::read(r); + debug(ls, "modeval::post::input"); + const value entry = atom::entryValue(content(atom::readEntry(ls))); + + // Evaluate the POST expression + const failable<value> val = failableResult(impl(cons<value>("post", mklist<value>(cddr(path), entry)))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + + // Return the created resource location + debug(content(val), "modeval::post::location"); + apr_table_setn(r->headers_out, "Location", apr_pstrdup(r->pool, httpd::url(content(val), r))); + r->status = HTTP_CREATED; + return OK; + } + + // Unknown content type, wrap the HTTP request struct in a value and pass it to + // the component implementation function + const failable<value> val = failableResult(impl(cons<value>("handle", mklist<value>(httpd::requestValue(r))))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + return (int)content(val); +} + +/** + * Handle an HTTP PUT. + */ +const failable<int> put(request_rec* r, const lambda<value(const list<value>&)>& impl) { + debug(r->uri, "modeval::put::url"); + + // Read the ATOM entry + const list<value> path(pathValues(r->uri)); + const int rc = httpd::setupReadPolicy(r); + if(rc != OK) + return rc; + const list<string> ls = httpd::read(r); + debug(ls, "modeval::put::input"); + const value entry = atom::entryValue(content(atom::readEntry(ls))); + + // Evaluate the PUT expression and update the corresponding resource + const failable<value> val = failableResult(impl(cons<value>("put", mklist<value>(cddr(path), entry)))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + if (val == value(false)) + return HTTP_NOT_FOUND; + return OK; +} + +/** + * Handle an HTTP DELETE. + */ +const failable<int> del(request_rec* r, const lambda<value(const list<value>&)>& impl) { + debug(r->uri, "modeval::delete::url"); + + // Evaluate an ATOM delete request + const list<value> path(pathValues(r->uri)); + const failable<value> val = failableResult(impl(cons<value>("delete", mklist<value>(cddr(path))))); + if (!hasContent(val)) + return mkfailure<int>(reason(val)); + if (val == value(false)) + return HTTP_NOT_FOUND; + return OK; +} + +/** + * Translate a component request. + */ +int translate(request_rec *r) { + gc_scoped_pool pool(r->pool); + if (strncmp(r->uri, "/components/", 12) != 0) + return DECLINED; + r->handler = "mod_tuscany_eval"; + return OK; +} + +/** + * HTTP request handler. + */ +int handler(request_rec *r) { + gc_scoped_pool pool(r->pool); + if(strcmp(r->handler, "mod_tuscany_eval")) + return DECLINED; + httpdDebugRequest(r, "modeval::handler::input"); + + // Get the component implementation lambda + const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_eval); + const list<value> path(pathValues(r->uri)); + const list<value> impl(assoctree<value>(cadr(path), sc.implTree)); + if (isNil(impl)) + return HTTP_NOT_FOUND; + + // Handle HTTP method + const lambda<value(const list<value>&)> l(cadr<value>(impl)); + if (r->header_only) + return OK; + if(r->method_number == M_GET) + return httpd::reportStatus(get(r, l)); + if(r->method_number == M_POST) + return httpd::reportStatus(post(r, l)); + if(r->method_number == M_PUT) + return httpd::reportStatus(put(r, l)); + if(r->method_number == M_DELETE) + return httpd::reportStatus(del(r, l)); + return HTTP_NOT_IMPLEMENTED; +} + +/** + * Convert a list of component references to a list of HTTP proxy lambdas. + */ +const value mkrefProxy(const value& ref, const string& base) { + return lambda<value(const list<value>&)>(http::proxy(base + string(scdl::name(ref)))); +} + +const list<value> refProxies(const list<value>& refs, const string& base) { + if (isNil(refs)) + return refs; + return cons(mkrefProxy(car(refs), base), refProxies(cdr(refs), base)); +} + +/** + * Convert a list of component properties to a list of lambda functions that just return + * the property value. + */ +struct propProxy { + const value v; + propProxy(const value& v) : v(v) { + } + const value operator()(unused const list<value>& params) const { + return v; + } +}; + +const value mkpropProxy(const value& prop) { + return lambda<value(const list<value>&)>(propProxy(elementValue(prop))); +} + +const list<value> propProxies(const list<value>& props) { + if (isNil(props)) + return props; + return cons(mkpropProxy(car(props)), propProxies(cdr(props))); +} + +/** + * Evaluate a component and convert it to an applicable lambda function. + */ +const value evalComponent(ServerConf& sc, server_rec& server, const value& comp) { + extern const failable<lambda<value(const list<value>&)> > evalImplementation(const string& cpath, const value& impl, const list<value>& px, const lambda<value(const list<value>&)>& lifecycle); + + const value impl = scdl::implementation(comp); + + // Convert component references to configured proxy lambdas + ostringstream base; + if (sc.wiringServerName == "") + base << (server.server_scheme == NULL? "http" : server.server_scheme) + << "://" << (server.server_hostname == NULL? "localhost" : server.server_hostname) + << ":" << (server.port == 0? 80 : server.port) + << "/references/" << string(scdl::name(comp)) << "/"; + else + base << sc.wiringServerName << "/references/" << string(scdl::name(comp)) << "/"; + const list<value> rpx(refProxies(scdl::references(comp), str(base))); + + // Convert component proxies to configured proxy lambdas + const list<value> ppx(propProxies(scdl::properties(comp))); + + // Evaluate the component implementation and convert it to an applicable lambda function + const failable<lambda<value(const list<value>&)> > cimpl(evalImplementation(sc.contributionPath, impl, append(rpx, ppx), sc.lifecycle)); + if (!hasContent(cimpl)) + return reason(cimpl); + return content(cimpl); +} + +/** + * Return a list of component-name + configured-implementation pairs. + */ +const list<value> componentToImplementationAssoc(ServerConf& sc, server_rec& server, const list<value>& c) { + if (isNil(c)) + return c; + return cons<value>(mklist<value>(scdl::name(car(c)), evalComponent(sc, server, car(c))), componentToImplementationAssoc(sc, server, cdr(c))); +} + +/** + * Read the components declared in a composite. + */ +const failable<list<value> > readComponents(const string& path) { + ifstream is(path); + if (fail(is)) + return mkfailure<list<value> >(string("Could not read composite: ") + path); + return scdl::components(readXML(streamList(is))); +} + +/** + * Apply a list of component implementations to a start or restart lifecycle expression. + * Return the functions returned by the component implementations. + */ +const failable<list<value> > applyLifecycleExpr(const list<value>& impls, const list<value>& expr) { + if (isNil(impls)) + return list<value>(); + + // Evaluate lifecycle expression against a component implementation lambda + const lambda<value(const list<value>&)> l = cadr<value>(car(impls)); + const failable<value> r = failableResult(l(expr)); + if (!hasContent(r)) + return mkfailure<list<value> >(reason(r)); + const lambda<value(const list<value>&)> rl = content(r); + + // Use the returned lambda function, if any, from now on + const lambda<value(const list<value>&)> al = isNil(rl)? l : rl; + + // Continue with the rest of the list + const failable<list<value> > nr = applyLifecycleExpr(cdr(impls), expr); + if (!hasContent(nr)) + return nr; + return cons<value>(mklist<value>(car<value>(car(impls)), value(al)), content(nr)); +} + +/** + * Configure the components declared in the deployed composite. + */ +const failable<bool> confComponents(ServerConf& sc, server_rec& server) { + if (sc.contributionPath == "" || sc.compositeName == "") + return false; + + // Read the components and get their implementation lambda functions + const failable<list<value> > comps = readComponents(sc.contributionPath + sc.compositeName); + if (!hasContent(comps)) + return mkfailure<bool>(reason(comps)); + sc.implementations = componentToImplementationAssoc(sc, server, content(comps)); + debug(sc.implementations, "modeval::confComponents::implementations"); + + // Store the implementation lambda functions in a tree for fast retrieval + sc.implTree = mkbtree(sort(sc.implementations)); + return true; +} + +/** + * Start the components declared in the deployed composite. + */ +const failable<bool> startComponents(ServerConf& sc) { + + // Start the components and record the returned implementation lambda functions + debug(sc.implementations, "modeval::startComponents::start"); + const failable<list<value> > impls = applyLifecycleExpr(sc.implementations, mklist<value>("start")); + if (!hasContent(impls)) + return mkfailure<bool>(reason(impls)); + sc.implementations = content(impls); + debug(sc.implementations, "modeval::startComponents::implementations"); + + // Store the implementation lambda functions in a tree for fast retrieval + sc.implTree = mkbtree(sort(sc.implementations)); + return true; +} + +/** + * Cleanup callback, called when the server is stopped or restarted. + */ +apr_status_t serverCleanup(void* v) { + gc_pool pool; + ServerConf& sc = *(ServerConf*)v; + debug("modeval::serverCleanup"); + + // Stop the component implementations + applyLifecycleExpr(sc.implementations, mklist<value>("stop")); + + // Call the module lifecycle function + if (isNil(sc.lifecycle)) + return APR_SUCCESS; + debug("modeval::serverCleanup::stop"); + sc.lifecycle(mklist<value>("stop")); + + return APR_SUCCESS; +} + +/** + * Called after all the configuration commands have been run. + * Process the server configuration and configure the deployed components. + */ +int postConfig(apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, server_rec *s) { + extern const value applyLifecycle(const list<value>&); + + gc_scoped_pool pool(p); + ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_eval); + + // Count the calls to post config + const string k("tuscany::modeval::postConfig"); + const int count = (int)httpd::userData(k, s); + httpd::putUserData(k, (void*)(count + 1), s); + + // Count == 0, do nothing as post config is always called twice, + // count == 1 is the first start, count > 1 is a restart + if (count == 0) + return OK; + if (count == 1) { + debug("modeval::postConfig::start"); + const failable<value> r = failableResult(applyLifecycle(mklist<value>("start"))); + if (!hasContent(r)) + return -1; + sc.lifecycle = content(r); + } + if (count > 1) { + debug("modeval::postConfig::restart"); + const failable<value> r = failableResult(applyLifecycle(mklist<value>("restart"))); + if (!hasContent(r)) + return -1; + sc.lifecycle = content(r); + } + + // Configure the deployed components + debug(sc.wiringServerName, "modeval::postConfig::wiringServerName"); + debug(sc.contributionPath, "modeval::postConfig::contributionPath"); + debug(sc.compositeName, "modeval::postConfig::compositeName"); + const failable<bool> res = confComponents(sc, *s); + if (!hasContent(res)) { + cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl; + return -1; + } + + // Register a cleanup callback, called when the server is stopped or restarted + apr_pool_pre_cleanup_register(p, (void*)&sc, serverCleanup); + + return OK; +} + +/** + * Child process initialization. + */ +void childInit(apr_pool_t* p, server_rec* s) { + gc_scoped_pool pool(p); + ServerConf* sc = (ServerConf*)ap_get_module_config(s->module_config, &mod_tuscany_eval); + if(sc == NULL) { + cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl; + exit(APEXIT_CHILDFATAL); + } + + // Start the components in the child process + const failable<bool> res = startComponents(*sc); + if (!hasContent(res)) { + cerr << "[Tuscany] Due to one or more errors mod_tuscany_eval loading failed. Causing apache to stop loading." << endl; + exit(APEXIT_CHILDFATAL); + } + + // Register a cleanup callback, called when the child is stopped or restarted + apr_pool_pre_cleanup_register(p, (void*)sc, serverCleanup); +} + +/** + * Configuration commands. + */ +const char* confHome(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval); + sc.home = arg; + return NULL; +} +const char* confWiringServerName(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval); + sc.wiringServerName = arg; + return NULL; +} +const char* confContribution(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval); + sc.contributionPath = arg; + return NULL; +} +const char* confComposite(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_eval); + sc.compositeName = arg; + return NULL; +} + +const char* confEnv(unused cmd_parms *cmd, unused void *c, const char *name, const char *value) { + gc_scoped_pool pool(cmd->pool); + setenv(name, value != NULL? value : "", 1); + return NULL; +} + +/** + * HTTP server module declaration. + */ +const command_rec commands[] = { + AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, "Tuscany home directory"), + AP_INIT_TAKE1("SCAWiringServerName", (const char*(*)())confWiringServerName, NULL, RSRC_CONF, "SCA wiring server name"), + AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, RSRC_CONF, "SCA contribution location"), + AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, RSRC_CONF, "SCA composite location"), + AP_INIT_TAKE12("SetEnv", (const char*(*)())confEnv, NULL, OR_FILEINFO, "Environment variable name and optional value"), + {NULL, NULL, NULL, 0, NO_ARGS, NULL} +}; + + +void registerHooks(unused apr_pool_t *p) { + ap_hook_post_config(postConfig, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(childInit, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_handler(handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_translate_name(translate, NULL, NULL, APR_HOOK_FIRST); +} + +} +} +} + +extern "C" { + +module AP_MODULE_DECLARE_DATA mod_tuscany_eval = { + STANDARD20_MODULE_STUFF, + // dir config and merger + NULL, NULL, + // server config and merger + tuscany::httpd::makeServerConf<tuscany::server::modeval::ServerConf>, NULL, + // commands and hooks + tuscany::server::modeval::commands, tuscany::server::modeval::registerHooks +}; + +} + +#endif diff --git a/sca-cpp/branches/cpp-contrib/modules/server/mod-scheme.hpp b/sca-cpp/branches/cpp-contrib/modules/server/mod-scheme.hpp new file mode 100644 index 0000000000..f5b9554c3f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/mod-scheme.hpp @@ -0,0 +1,89 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +#ifndef tuscany_modscheme_hpp +#define tuscany_modscheme_hpp + +/** + * Evaluation functions used by mod-eval to evaluate Scheme + * component implementations. + */ + +#include "string.hpp" +#include "stream.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../scheme/eval.hpp" + +namespace tuscany { +namespace server { +namespace modscheme { + +/** + * Convert proxy lambdas to evaluator primitive procedures. + */ +const list<value> primitiveProcedures(const list<value>& l) { + if (isNil(l)) + return l; + return cons<value>(mklist<value>(scheme::primitiveSymbol, car(l)), primitiveProcedures(cdr(l))); +} + +/** + * Apply a Scheme component implementation function. + */ +struct applyImplementation { + const value impl; + const list<value> px; + applyImplementation(const value& impl, const list<value>& px) : impl(impl), px(scheme::quotedParameters(primitiveProcedures(px))) { + } + const value operator()(const list<value>& params) const { + const value expr = cons<value>(car(params), append(scheme::quotedParameters(cdr(params)), px)); + debug(expr, "modeval::scheme::applyImplementation::input"); + scheme::Env env = scheme::setupEnvironment(); + const value res = scheme::evalScript(expr, impl, env); + const value val = isNil(res)? mklist<value>(value(), string("Could not evaluate expression")) : mklist<value>(res); + debug(val, "modeval::scheme::applyImplementation::result"); + return val; + } +}; + +/** + * Evaluate a Scheme component implementation and convert it to an + * applicable lambda function. + */ +const failable<lambda<value(const list<value>&)> > evalImplementation(const string& path, const value& impl, const list<value>& px) { + const string fpath(path + attributeValue("script", impl)); + ifstream is(fpath); + if (fail(is)) + return mkfailure<lambda<value(const list<value>&)> >(string("Could not read implementation: ") + fpath); + const value script = scheme::readScript(is); + if (isNil(script)) + return mkfailure<lambda<value(const list<value>&)> >(string("Could not read implementation: ") + fpath); + return lambda<value(const list<value>&)>(applyImplementation(script, px)); +} + +} +} +} + +#endif /* tuscany_modscheme_hpp */ diff --git a/sca-cpp/branches/cpp-contrib/modules/server/mod-wiring.cpp b/sca-cpp/branches/cpp-contrib/modules/server/mod-wiring.cpp new file mode 100644 index 0000000000..c21b0fe254 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/mod-wiring.cpp @@ -0,0 +1,383 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * HTTPD module used to wire component references and route requests to + * target service components. + */ + +#include <sys/stat.h> + +#include "string.hpp" +#include "stream.hpp" +#include "list.hpp" +#include "tree.hpp" +#include "value.hpp" +#include "monad.hpp" +#include "../scdl/scdl.hpp" +#include "../http/httpd.hpp" + +extern "C" { +extern module AP_MODULE_DECLARE_DATA mod_tuscany_wiring; +} + +namespace tuscany { +namespace server { +namespace modwiring { + +/** + * Server configuration. + */ +class ServerConf { +public: + ServerConf(server_rec* s) : s(s), start(false), home(""), wiringServerName(""), contributionPath(""), compositeName("") { + } + const server_rec* s; + bool start; + string home; + string wiringServerName; + string contributionPath; + string compositeName; + list<value> references; + list<value> services; +}; + +/** + * Set to true to wire using mod_proxy, false to wire using HTTP client redirects. + */ +const bool useModProxy = true; + +/** + * Returns true if a URI is absolute. + */ +const bool isAbsolute(const string& uri) { + return contains(uri, "://"); +} + +/** + * Route a /references/component-name/reference-name request, + * to the target of the component reference. + */ +int translateReference(request_rec *r) { + httpdDebugRequest(r, "modwiring::translateReference::input"); + debug(r->uri, "modwiring::translateReference::uri"); + + // Find the requested component + const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_wiring); + const list<value> rpath(pathValues(r->uri)); + const list<value> comp(assoctree(cadr(rpath), sc.references)); + if (isNil(comp)) + return HTTP_NOT_FOUND; + + // Find the requested reference and target configuration + const list<value> ref(assoctree<value>(caddr(rpath), cadr(comp))); + if (isNil(ref)) + return HTTP_NOT_FOUND; + const string target(cadr(ref)); + debug(target, "modwiring::translateReference::target"); + + // Route to an absolute target URI using mod_proxy or an HTTP client redirect + if (isAbsolute(target)) { + if (useModProxy) { + r->filename = apr_pstrdup(r->pool, c_str(string("proxy:") + target)); + r->proxyreq = PROXYREQ_REVERSE; + r->handler = "proxy-server"; + return OK; + } + + r->status = HTTP_MOVED_TEMPORARILY; + apr_table_setn(r->headers_out, "Location", apr_pstrdup(r->pool, c_str(target))); + r->handler = "mod_tuscany_wiring"; + return OK; + } + + // Route to a relative target URI using a local internal redirect + r->filename = apr_pstrdup(r->pool, c_str(string("/redirect:/components/") + target)); + r->handler = "mod_tuscany_wiring"; + return OK; +} + +/** + * Find a leaf matching a request path in a tree of URI paths. + */ +const int matchPath(const list<value>& k, const list<value>& p) { + if (isNil(p)) + return true; + if (isNil(k)) + return false; + if (car(k) != car(p)) + return false; + return matchPath(cdr(k), cdr(p)); +} + +const list<value> assocPath(const value& k, const list<value>& tree) { + if (isNil(tree)) + return tree; + if (matchPath(k, car<value>(car(tree)))) + return car(tree); + if (k < car<value>(car(tree))) + return assocPath(k, cadr(tree)); + return assocPath(k, caddr(tree)); +} + +/** + * Route a service request to the component providing the requested service. + */ +int translateService(request_rec *r) { + httpdDebugRequest(r, "modwiring::translateService::input"); + debug(r->uri, "modwiring::translateService::uri"); + + // Find the requested component + const ServerConf& sc = httpd::serverConf<ServerConf>(r, &mod_tuscany_wiring); + const list<value> p(pathValues(r->uri)); + const list<value> svc(assocPath(p, sc.services)); + if (isNil(svc)) + return DECLINED; + debug(svc, "modwiring::translateService::service"); + + // Build a component-name + path-info URI + const list<value> target(cons<value>(cadr(svc), httpd::pathInfo(p, car(svc)))); + debug(target, "modwiring::translateService::target"); + + // Dispatch to the target component using a local internal redirect + const string tp(path(target)); + debug(tp, "modwiring::translateService::path"); + const string redir(string("/redirect:/components") + tp); + debug(redir, "modwiring::translateService::redirect"); + r->filename = apr_pstrdup(r->pool, c_str(redir)); + r->handler = "mod_tuscany_wiring"; + return OK; +} + +/** + * Translate an HTTP service or reference request and route it + * to the target component. + */ +int translate(request_rec *r) { + gc_scoped_pool pool(r->pool); + if (!strncmp(r->uri, "/components/", 12) != 0) + return DECLINED; + + // Translate a component reference request + if (!strncmp(r->uri, "/references/", 12) != 0) + return translateReference(r); + + // Translate a service request + return translateService(r); +} + +/** + * HTTP request handler, redirect to a target component. + */ +int handler(request_rec *r) { + gc_scoped_pool pool(r->pool); + if(strcmp(r->handler, "mod_tuscany_wiring")) + return DECLINED; + httpdDebugRequest(r, "modwiring::handler::input"); + + // Do an internal redirect + if (r->filename == NULL || strncmp(r->filename, "/redirect:", 10) != 0) + return DECLINED; + debug(r->uri, "modwiring::handler::uri"); + debug(r->filename, "modwiring::handler::filename"); + debug(r->path_info, "modwiring::handler::path info"); + + if (r->args == NULL) + return httpd::internalRedirect(httpd::redirectURI(string(r->filename + 10), string(r->path_info)), r); + return httpd::internalRedirect(httpd::redirectURI(string(r->filename + 10), string(r->path_info), string(r->args)), r); +} + +/** + * Read the components declared in a composite. + */ +const failable<list<value> > readComponents(const string& path) { + ifstream is(path); + if (fail(is)) + return mkfailure<list<value> >(string("Could not read composite: ") + path); + return scdl::components(readXML(streamList(is))); +} + +/** + * Return a list of component-name + references pairs. The references are + * arranged in trees of reference-name + reference-target pairs. + */ +const list<value> componentReferenceToTargetTree(const value& c) { + return mklist<value>(scdl::name(c), mkbtree(sort(scdl::referenceToTargetAssoc(scdl::references(c))))); +} + +const list<value> componentReferenceToTargetAssoc(const list<value>& c) { + if (isNil(c)) + return c; + return cons<value>(componentReferenceToTargetTree(car(c)), componentReferenceToTargetAssoc(cdr(c))); +} + +/** + * Return a list of service-URI-path + component-name pairs. Service-URI-paths are + * represented as lists of URI path fragments. + */ +const list<value> defaultBindingURI(const string& cn, const string& sn) { + return mklist<value>(cn, sn); +} + +const list<value> bindingToComponentAssoc(const string& cn, const string& sn, const list<value>& b) { + if (isNil(b)) + return b; + const value uri(scdl::uri(car(b))); + if (isNil(uri)) + return cons<value>(mklist<value>(defaultBindingURI(cn, sn), cn), bindingToComponentAssoc(cn, sn, cdr(b))); + return cons<value>(mklist<value>(pathValues(c_str(string(uri))), cn), bindingToComponentAssoc(cn, sn, cdr(b))); +} + +const list<value> serviceToComponentAssoc(const string& cn, const list<value>& s) { + if (isNil(s)) + return s; + const string sn(scdl::name(car(s))); + const list<value> btoc(bindingToComponentAssoc(cn, sn, scdl::bindings(car(s)))); + if (isNil(btoc)) + return cons<value>(mklist<value>(defaultBindingURI(cn, sn), cn), serviceToComponentAssoc(cn, cdr(s))); + return append<value>(btoc, serviceToComponentAssoc(cn, cdr(s))); +} + +const list<value> uriToComponentAssoc(const list<value>& c) { + if (isNil(c)) + return c; + return append<value>(serviceToComponentAssoc(scdl::name(car(c)), scdl::services(car(c))), uriToComponentAssoc(cdr(c))); +} + +/** + * Configure the components declared in the server's deployment composite. + */ +const bool confComponents(ServerConf& sc) { + if (sc.contributionPath == "" || sc.compositeName == "") + return true; + + // Read the component configuration and store the references and service URIs + // in trees for fast retrieval later + const failable<list<value> > comps = readComponents(sc.contributionPath + sc.compositeName); + if (!hasContent(comps)) + return true; + const list<value> refs = componentReferenceToTargetAssoc(content(comps)); + debug(refs, "modwiring::confComponents::references"); + sc.references = mkbtree(sort(refs)); + + const list<value> svcs = uriToComponentAssoc(content(comps)); + debug(svcs, "modwiring::confComponents::services"); + sc.services = mkbtree(sort(svcs)); + return true; +} + +/** + * Called after all the configuration commands have been run. + * Process the server configuration and configure the wiring for the deployed components. + */ +int postConfig(unused apr_pool_t *p, unused apr_pool_t *plog, unused apr_pool_t *ptemp, server_rec *s) { + // Count the calls to post config, skip the first one as + // postConfig is always called twice + const string k("tuscany::modwiring::postConfig"); + const int count = (int)httpd::userData(k, s); + httpd::putUserData(k, (void*)(count + 1), s); + if (count == 0) + return OK; + + // Configure the wiring for the deployed components + ServerConf& sc = httpd::serverConf<ServerConf>(s, &mod_tuscany_wiring); + debug(sc.wiringServerName, "modwiring::postConfig::wiringServerName"); + debug(sc.contributionPath, "modwiring::postConfig::contributionPath"); + debug(sc.compositeName, "modwiring::postConfig::compositeName"); + confComponents(sc); + return OK; +} + +/** + * Child process initialization. + */ +void childInit(apr_pool_t* p, server_rec* svr_rec) { + gc_scoped_pool pool(p); + ServerConf *conf = (ServerConf*)ap_get_module_config(svr_rec->module_config, &mod_tuscany_wiring); + if(conf == NULL) { + cerr << "[Tuscany] Due to one or more errors mod_tuscany_wiring loading failed. Causing apache to stop loading." << endl; + exit(APEXIT_CHILDFATAL); + } +} + +/** + * Configuration commands. + */ +const char *confHome(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_wiring); + sc.home = arg; + return NULL; +} +const char *confWiringServerName(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_wiring); + sc.wiringServerName = arg; + return NULL; +} +const char *confContribution(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_wiring); + sc.contributionPath = arg; + return NULL; +} +const char *confComposite(cmd_parms *cmd, unused void *c, const char *arg) { + gc_scoped_pool pool(cmd->pool); + ServerConf& sc = httpd::serverConf<ServerConf>(cmd, &mod_tuscany_wiring); + sc.compositeName = arg; + return NULL; +} + +/** + * HTTP server module declaration. + */ +const command_rec commands[] = { + AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, "Tuscany home directory"), + AP_INIT_TAKE1("SCAWiringServerName", (const char*(*)())confWiringServerName, NULL, RSRC_CONF, "SCA wiring server name"), + AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, RSRC_CONF, "SCA contribution location"), + AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, RSRC_CONF, "SCA composite location"), + {NULL, NULL, NULL, 0, NO_ARGS, NULL} +}; + +void registerHooks(unused apr_pool_t *p) { + ap_hook_post_config(postConfig, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(childInit, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_handler(handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_translate_name(translate, NULL, NULL, APR_HOOK_FIRST); +} + +} +} +} + +extern "C" { + +module AP_MODULE_DECLARE_DATA mod_tuscany_wiring = { + STANDARD20_MODULE_STUFF, + // dir config and merger + NULL, NULL, + // server config and merger + tuscany::httpd::makeServerConf<tuscany::server::modwiring::ServerConf>, NULL, + // commands and hooks + tuscany::server::modwiring::commands, tuscany::server::modwiring::registerHooks +}; + +} diff --git a/sca-cpp/branches/cpp-contrib/modules/server/scheme-conf b/sca-cpp/branches/cpp-contrib/modules/server/scheme-conf new file mode 100755 index 0000000000..248255608e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/scheme-conf @@ -0,0 +1,26 @@ +#!/bin/sh + +# 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. + +# Generate a Scheme server conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +cat >>$root/conf/httpd.conf <<EOF +LoadModule mod_tuscany_eval $here/.libs/libmod_tuscany_eval.so +EOF diff --git a/sca-cpp/branches/cpp-contrib/modules/server/server-conf b/sca-cpp/branches/cpp-contrib/modules/server/server-conf new file mode 100755 index 0000000000..ae175ee2f8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/server-conf @@ -0,0 +1,29 @@ +#!/bin/sh + +# 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. + +# Generate a server conf +here=`readlink -f $0`; here=`dirname $here` +root=`readlink -f $1` + +mkdir -p $root +mkdir -p $root/logs +mkdir -p $root/conf +cat >>$root/conf/httpd.conf <<EOF +LoadModule mod_tuscany_wiring $here/.libs/libmod_tuscany_wiring.so +EOF diff --git a/sca-cpp/branches/cpp-contrib/modules/server/server-test b/sca-cpp/branches/cpp-contrib/modules/server/server-test new file mode 100755 index 0000000000..e1d9932a5d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/server-test @@ -0,0 +1,39 @@ +#!/bin/sh + +# 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. + +# Setup +../http/httpd-conf tmp 8090 htdocs +./server-conf tmp +./scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +../http/httpd-start tmp +sleep 2 + +# Test +./client-test 2>/dev/null +rc=$? + +# Cleanup +../http/httpd-stop tmp +sleep 2 +return $rc diff --git a/sca-cpp/branches/cpp-contrib/modules/server/server-test.scm b/sca-cpp/branches/cpp-contrib/modules/server/server-test.scm new file mode 100644 index 0000000000..5d545ecf8b --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/server-test.scm @@ -0,0 +1,44 @@ +; 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. + +; JSON-RPC test case + +(define (echo x) x) + +; ATOMPub test case + +(define (get id) + (if (nul id) + '("Sample Feed" "123456789" + ("Item" "111" ((javaClass "services.Item") (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99))) + ("Item" "222" ((javaClass "services.Item") (name "Orange") (currencyCode "USD") (currencySymbol "$") (price 3.55))) + ("Item" "333" ((javaClass "services.Item") (name "Pear") (currencyCode "USD") (currencySymbol "$") (price 1.55)))) + + (list "Item" (car id) '((javaClass "services.Item") (name "Apple") (currencyCode "USD") (currencySymbol "$") (price 2.99)))) +) + +(define (post collection item) + '("123456789") +) + +(define (put id item) + true +) + +(define (delete id) + true +) diff --git a/sca-cpp/branches/cpp-contrib/modules/server/wiring-test b/sca-cpp/branches/cpp-contrib/modules/server/wiring-test new file mode 100755 index 0000000000..0deab33d68 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/modules/server/wiring-test @@ -0,0 +1,76 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +../http/httpd-conf tmp 8090 htdocs +./server-conf tmp +./scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite domain-test.composite +EOF + +../http/httpd-start tmp +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/index.html 2>/dev/null >tmp/index.html +diff tmp/index.html htdocs/index.html +rc=$? + +# Test ATOMPub +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ >tmp/feed.xml 2>/dev/null + diff tmp/feed.xml htdocs/feed.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 >tmp/entry.xml 2>/dev/null + diff tmp/entry.xml htdocs/entry.xml + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ -X POST -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 -X PUT -H "Content-type: application/atom+xml" --data @htdocs/entry.xml 2>/dev/null + rc=$? +fi +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/111 -X DELETE 2>/dev/null + rc=$? +fi + +# Test JSON-RPC +if [ "$rc" = "0" ]; then + curl http://localhost:8090/client/ -X POST -H "Content-type: application/json-rpc" --data @htdocs/json-request.txt >tmp/json-result.txt 2>/dev/null + diff tmp/json-result.txt htdocs/json-result.txt + rc=$? +fi + +# Cleanup +../http/httpd-stop tmp +sleep 2 +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/samples/Makefile.am b/sca-cpp/branches/cpp-contrib/samples/Makefile.am new file mode 100644 index 0000000000..de5c2d1b1e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/samples/Makefile.am @@ -0,0 +1,17 @@ +# 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. + diff --git a/sca-cpp/branches/cpp-contrib/samples/README b/sca-cpp/branches/cpp-contrib/samples/README new file mode 100644 index 0000000000..818a2faaf8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/samples/README @@ -0,0 +1,3 @@ +Apache Tuscany SCA Samples +========================== + diff --git a/sca-cpp/branches/cpp-contrib/test/Makefile.am b/sca-cpp/branches/cpp-contrib/test/Makefile.am new file mode 100644 index 0000000000..ee3f0fbdee --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/Makefile.am @@ -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. + +SUBDIRS = store-scheme store-cpp store-python store-java + diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/Makefile.am b/sca-cpp/branches/cpp-contrib/test/store-cpp/Makefile.am new file mode 100644 index 0000000000..59eebf1445 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/Makefile.am @@ -0,0 +1,27 @@ +# 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. + +testdir=$(prefix)/test/store-cpp +test_LTLIBRARIES = libcurrency-converter.la libfruits-catalog.la libshopping-cart.la + +libcurrency_converter_la_SOURCES = currency-converter.cpp + +libfruits_catalog_la_SOURCES = fruits-catalog.cpp + +libshopping_cart_la_SOURCES = shopping-cart.cpp + +TESTS = server-test diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/currency-converter.cpp b/sca-cpp/branches/cpp-contrib/test/store-cpp/currency-converter.cpp new file mode 100644 index 0000000000..5f0702490a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/currency-converter.cpp @@ -0,0 +1,67 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Currency converter component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" + +namespace tuscany { +namespace store { + +/** + * Convert an amount from USD to a currency. + */ +const failable<value> convert(unused const value& from, const value& to, const value& amount) { + if (to == string("EUR")) + return value(0.70 * (double)amount); + return amount; +} + +/** + * Return a currency symbol. + */ +const failable<value> symbol(const value& currency) { + if (currency == string("EUR")) + return value(string("E")); + return value(string("$")); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "convert") + return tuscany::store::convert(cadr(params), caddr(params), cadddr(params)); + if (func == "symbol") + return tuscany::store::symbol(cadr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/fruits-catalog.cpp b/sca-cpp/branches/cpp-contrib/test/store-cpp/fruits-catalog.cpp new file mode 100644 index 0000000000..20f2bd35f7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/fruits-catalog.cpp @@ -0,0 +1,85 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Catalog component implementation. + */ + +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" + +namespace tuscany { +namespace store { + +/** + * Returns the catalog. + */ +struct convert { + const lambda<value(const list<value>&)> converter; + const string currency; + convert(const lambda<value(const list<value>&)>& converter, const string& currency) : converter(converter), currency(currency) { + } + const value operator()(const value& price) const { + return converter(mklist<value>("convert", string("USD"), currency, price)); + } +}; + +const list<value> mkfruit(const string& name, const string& code, const string& symbol, const double price) { + return list<value>() + + mklist<value>("javaClass", string("services.Item")) + mklist<value>("name", name) + mklist<value>("currencyCode", code) + mklist<value>("currencySymbol", symbol) + mklist<value>("price", price); +} + +const failable<value> get(const lambda<value(const list<value>&)> converter, const lambda<value(const list<value>&)> currencyCode) { + const string currency(currencyCode(list<value>())); + const string symbol(converter(mklist<value>("symbol", currency))); + const lambda<value(const value&)> conv(convert(converter, currency)); + + return value(list<value>() + + mkfruit("Apple", currency, symbol, conv(2.99)) + + mkfruit("Orange", currency, symbol, conv(3.55)) + + mkfruit("Pear", currency, symbol, conv(1.55))); +} + +/** + * TODO remove this JSON-RPC specific function. + */ +const failable<value> listMethods(unused const lambda<value(const list<value>&)> converter, unused const lambda<value(const list<value>&)> currencyCode) { + return value(mklist<value>(string("Service.get"))); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "get") + return tuscany::store::get(cadr(params), caddr(params)); + if (func == "listMethods") + return tuscany::store::listMethods(cadr(params), caddr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/.htaccess b/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/.htaccess new file mode 100644 index 0000000000..e2e343b6b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/.htaccess @@ -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. + +DirectoryIndex store.html diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/store.html b/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/store.html new file mode 100644 index 0000000000..21eabca7a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/store.html @@ -0,0 +1,169 @@ +<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+<title>Store</title>
+
+<script type="text/javascript" src="store.js"></script>
+
+<script language="JavaScript">
+
+ //@Reference
+ var catalog = new tuscany.sca.Reference("catalog");
+
+ //@Reference
+ var shoppingCart = new tuscany.sca.Reference("shoppingCart");
+
+ //@Reference
+ var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
+
+ var catalogItems;
+
+ function catalog_getResponse(items,exception) {
+ if(exception){
+ alert(exception.message);
+ return;
+ }
+ var catalog = "";
+
+ for (var i=0; i<items.length; i++) {
+ var item = items[i].name + ' - ' + items[i].price;
+ catalog += '<input name="items" type="checkbox" value="' +
+ item + '">' + item + ' <br>';
+ }
+ document.getElementById('catalog').innerHTML=catalog;
+ catalogItems = items;
+
+ // TEMP
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+
+ function shoppingCart_getResponse(feed) {
+ if (feed != null) {
+ var entries = feed.getElementsByTagName("entry");
+ var list = "";
+ for (var i=0; i<entries.length; i++) {
+ var content = entries[i].getElementsByTagName("content")[0];
+ var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
+ var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
+ list += name + ' - ' + price + ' <br>';
+ }
+ document.getElementById("shoppingCart").innerHTML = list;
+
+ if (entries.length != 0) {
+ try {
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+ }
+ }
+
+ function shoppingTotal_getTotalResponse(total,exception) {
+ if(exception) {
+ alert(exception.message);
+ return;
+ }
+ document.getElementById('total').innerHTML = total;
+ }
+
+ function shoppingCart_postResponse(entry) {
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+
+ function addToCart() {
+ var items = document.catalogForm.items;
+ var j = 0;
+ for (var i=0; i<items.length; i++)
+ if (items[i].checked) {
+ var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><content type="application/xml">' +
+ '<item>' +
+ '<javaClass>' + catalogItems[i].javaClass + '</javaClass>' +
+ '<name>' + catalogItems[i].name + '</name>' +
+ '<currencyCode>' + catalogItems[i].currencyCode + '</currencyCode>' +
+ '<currencySymbol>' + catalogItems[i].currencySymbol + '</currencySymbol>' +
+ '<price>' + catalogItems[i].price + '</price>' +
+ '</item>' +
+ '</content></entry>';
+ shoppingCart.post(entry, shoppingCart_postResponse);
+ items[i].checked = false;
+ }
+ }
+ function checkoutCart() {
+ document.getElementById('store').innerHTML='<h2>' +
+ 'Thanks for Shopping With Us!</h2>'+
+ '<h2>Your Order</h2>'+
+ '<form name="orderForm">'+
+ document.getElementById('shoppingCart').innerHTML+
+ '<br>'+
+ document.getElementById('total').innerHTML+
+ '<br>'+
+ '<br>'+
+ '<input type="submit" value="Continue Shopping">'+
+ '</form>';
+ shoppingCart.del("", null);
+ }
+ function deleteCart() {
+ shoppingCart.del("", null);
+ document.getElementById('shoppingCart').innerHTML = "";
+ document.getElementById('total').innerHTML = "";
+ }
+
+ function init() {
+
+ try {
+ catalog.get(catalog_getResponse);
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+
+</script>
+
+</head>
+
+<body onload="init()">
+<h1>Store</h1>
+ <div id="store">
+ <h2>Catalog</h2>
+ <form name="catalogForm">
+ <div id="catalog" ></div>
+ <br>
+ <input type="button" onClick="addToCart()" value="Add to Cart">
+ </form>
+
+ <br>
+
+ <h2>Your Shopping Cart</h2>
+ <form name="shoppingCartForm">
+ <div id="shoppingCart"></div>
+ <br>
+ <div id="total"></div>
+ <br>
+ <input type="button" onClick="checkoutCart()" value="Checkout">
+ <input type="button" onClick="deleteCart()" value="Empty">
+ <a href="../shoppingCart/">(feed)</a>
+ </form>
+ </div>
+</body>
+</html>
diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/store.js b/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/store.js new file mode 100644 index 0000000000..9cd8eb526d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/htdocs/store.js @@ -0,0 +1,661 @@ + +/* Apache Tuscany SCA Widget header */ + +/* + * 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"); +}; + + +/* + * 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; + } + } + } +} + + + +/* Tuscany Reference/Property injection code */ + +if (!tuscany) { +var tuscany = {}; +} +if (!tuscany.sca) { +tuscany.sca = {}; +} + +tuscany.sca.propertyMap = new String(); +tuscany.sca.Property = function (name) { + return tuscany.sca.propertyMap[name]; +} + +tuscany.sca.referenceMap = new Object(); +tuscany.sca.referenceMap.catalog = new JSONRpcClient("/catalog").Service; +tuscany.sca.referenceMap.shoppingCart = new AtomClient("/shoppingCart"); +tuscany.sca.referenceMap.shoppingTotal = new JSONRpcClient("/total").Service; +tuscany.sca.Reference = function (name) { + return tuscany.sca.referenceMap[name]; +} + +/** End of Apache Tuscany SCA Widget */ + diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/server-test b/sca-cpp/branches/cpp-contrib/test/store-cpp/server-test new file mode 100755 index 0000000000..64315d7d92 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/server-test @@ -0,0 +1,38 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +./start +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/store.html 2>/dev/null >tmp/store.html +diff tmp/store.html htdocs/store.html +rc=$? + +# Cleanup +./stop +sleep 2 + +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/shopping-cart.cpp b/sca-cpp/branches/cpp-contrib/test/store-cpp/shopping-cart.cpp new file mode 100644 index 0000000000..eaad0d3c77 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/shopping-cart.cpp @@ -0,0 +1,152 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Shopping cart component implementation. + */ + +#include <apr_general.h> +#include <apr_uuid.h> +#include "string.hpp" +#include "function.hpp" +#include "list.hpp" +#include "value.hpp" +#include "monad.hpp" + +namespace tuscany { +namespace store { + +const string cartId("1234"); + +/** + * Get the shopping cart from the cache. Return an empty + * cart if not found. + */ +const list<value> getcart(const value& id, const lambda<value(const list<value>&)> cache) { + const value cart = cache(mklist<value>("get", mklist<value>(id))); + if (isNil(cart)) + return value(list<value>()); + return (list<value>)cart; +} + +/** + * Returns a UUID. + */ +const value uuid() { + apr_uuid_t uuid; + apr_uuid_get(&uuid); + char buf[APR_UUID_FORMATTED_LENGTH]; + apr_uuid_format(buf, &uuid); + return string(buf, APR_UUID_FORMATTED_LENGTH); +} + +/** + * Post a new item to the cart. Create a new cart if necessary. + */ +const failable<value> post(unused const list<value>& collection, const value& item, const lambda<value(const list<value>&)> cache) { + const value id(uuid()); + const list<value> newItem(mklist<value>(car<value>(item), id, caddr<value>(item))); + const list<value> cart(cons<value>(newItem, getcart(cartId, cache))); + cache(mklist<value>("put", mklist<value>(cartId), cart)); + return value(mklist<value>(id)); +} + +/** + * Find an item in the cart. + */ +const value find(const value& id, const list<value>& cart) { + if (isNil(cart)) + return cons<value>(string("Item"), mklist<value>("0", list<value>())); + if (id == cadr<value>(car(cart))) + return car(cart); + return find(id, cdr(cart)); +} + +/** + * Return items from the cart. + */ +const failable<value> get(const list<value>& id, const lambda<value(const list<value>&)> cache) { + if (isNil(id)) + return value(append(mklist<value>(string("Your Cart"), cartId), getcart(cartId, cache))); + return find(car(id), getcart(cartId, cache)); +} + +/** + * Delete items from the cart. + */ +const failable<value> del(const list<value>& id, unused const lambda<value(const list<value>&)> cache) { + if (isNil(id)) + return cache(mklist<value>("delete", mklist<value>(cartId))); + return value(true); +} + +/** + * Return the price of an item. + */ +const double price(const list<value>& item) { + return cadr<value>(assoc<value>("price", caddr(item))); +} + +/** + * Sum the prices of a list of items. + */ +const double sum(const list<value>& items) { + if (isNil(items)) + return 0; + return price(car(items)) + sum(cdr(items)); +} + +/** + * Return the total price of the items in the cart. + */ +const failable<value> gettotal(const lambda<value(const list<value>&)> cache) { + const list<value> cart(getcart(cartId, cache)); + return value(sum(cart)); +} + +/** + * TODO remove this JSON-RPC specific function. + */ +const failable<value> listMethods(unused const lambda<value(const list<value>&)> converter) { + return value(mklist<value>(string("Service.gettotal"))); +} + +} +} + +extern "C" { + +const tuscany::value apply(const tuscany::list<tuscany::value>& params) { + const tuscany::value func(car(params)); + if (func == "post") + return tuscany::store::post(cadr(params), caddr(params), cadddr(params)); + if (func == "get") + return tuscany::store::get(cadr(params), caddr(params)); + if (func == "delete") + return tuscany::store::del(cadr(params), caddr(params)); + if (func == "gettotal") + return tuscany::store::gettotal(cadr(params)); + if (func == "listMethods") + return tuscany::store::listMethods(cadr(params)); + return tuscany::mkfailure<tuscany::value>(); +} + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/start b/sca-cpp/branches/cpp-contrib/test/store-cpp/start new file mode 100755 index 0000000000..3c1da356e6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/start @@ -0,0 +1,29 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-conf tmp 8090 htdocs +../../modules/server/server-conf tmp +../../modules/server/cpp-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite store.composite +EOF + +../../components/cache/memcached-start +../../modules/http/httpd-start tmp diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/stop b/sca-cpp/branches/cpp-contrib/test/store-cpp/stop new file mode 100755 index 0000000000..a59273b8ed --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/stop @@ -0,0 +1,21 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-stop tmp +../../components/cache/memcached-stop diff --git a/sca-cpp/branches/cpp-contrib/test/store-cpp/store.composite b/sca-cpp/branches/cpp-contrib/test/store-cpp/store.composite new file mode 100644 index 0000000000..3839a8b816 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-cpp/store.composite @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://store" + name="store"> + + <component name="Catalog"> + <implementation.cpp path=".libs" library="libfruits-catalog"/> + <property name="currencyCode">USD</property> + <service name="Catalog"> + <t:binding.jsonrpc uri="catalog"/> + </service> + <reference name="currencyConverter" target="CurrencyConverter"/> + </component> + + <component name="ShoppingCart"> + <implementation.cpp path=".libs" library="libshopping-cart"/> + <service name="ShoppingCart"> + <t:binding.atom uri="shoppingCart"/> + </service> + <service name="Total"> + <t:binding.jsonrpc uri="total"/> + </service> + <reference name="cache" target="Cache"/> + </component> + + <component name="CurrencyConverter"> + <implementation.cpp path=".libs" library="libcurrency-converter"/> + <service name="CurrencyConverter"> + <t:binding.jsonrpc uri="currencyConverter"/> + </service> + </component> + + <component name="Cache"> + <implementation.cpp path="../../components/cache/.libs" library="libmcache"/> + <service name="Cache"> + <t:binding.atom uri="cache"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/Makefile.am b/sca-cpp/branches/cpp-contrib/test/store-java/Makefile.am new file mode 100644 index 0000000000..80972a0acc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/Makefile.am @@ -0,0 +1,30 @@ +# 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. + +JAVAROOT = ${top_builddir}/test/store-java + +if WANT_JAVA + +AM_JAVACFLAGS = -cp ${top_builddir}/modules/java/libmod-tuscany-java-${PACKAGE_VERSION}.jar:${JAVAROOT} + +noinst_JAVA = store/*.java + +CLEANFILES = store/*.class + +TESTS = server-test + +endif diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/.htaccess b/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/.htaccess new file mode 100644 index 0000000000..e2e343b6b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/.htaccess @@ -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. + +DirectoryIndex store.html diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/store.html b/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/store.html new file mode 100644 index 0000000000..21eabca7a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/store.html @@ -0,0 +1,169 @@ +<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+<title>Store</title>
+
+<script type="text/javascript" src="store.js"></script>
+
+<script language="JavaScript">
+
+ //@Reference
+ var catalog = new tuscany.sca.Reference("catalog");
+
+ //@Reference
+ var shoppingCart = new tuscany.sca.Reference("shoppingCart");
+
+ //@Reference
+ var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
+
+ var catalogItems;
+
+ function catalog_getResponse(items,exception) {
+ if(exception){
+ alert(exception.message);
+ return;
+ }
+ var catalog = "";
+
+ for (var i=0; i<items.length; i++) {
+ var item = items[i].name + ' - ' + items[i].price;
+ catalog += '<input name="items" type="checkbox" value="' +
+ item + '">' + item + ' <br>';
+ }
+ document.getElementById('catalog').innerHTML=catalog;
+ catalogItems = items;
+
+ // TEMP
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+
+ function shoppingCart_getResponse(feed) {
+ if (feed != null) {
+ var entries = feed.getElementsByTagName("entry");
+ var list = "";
+ for (var i=0; i<entries.length; i++) {
+ var content = entries[i].getElementsByTagName("content")[0];
+ var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
+ var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
+ list += name + ' - ' + price + ' <br>';
+ }
+ document.getElementById("shoppingCart").innerHTML = list;
+
+ if (entries.length != 0) {
+ try {
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+ }
+ }
+
+ function shoppingTotal_getTotalResponse(total,exception) {
+ if(exception) {
+ alert(exception.message);
+ return;
+ }
+ document.getElementById('total').innerHTML = total;
+ }
+
+ function shoppingCart_postResponse(entry) {
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+
+ function addToCart() {
+ var items = document.catalogForm.items;
+ var j = 0;
+ for (var i=0; i<items.length; i++)
+ if (items[i].checked) {
+ var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><content type="application/xml">' +
+ '<item>' +
+ '<javaClass>' + catalogItems[i].javaClass + '</javaClass>' +
+ '<name>' + catalogItems[i].name + '</name>' +
+ '<currencyCode>' + catalogItems[i].currencyCode + '</currencyCode>' +
+ '<currencySymbol>' + catalogItems[i].currencySymbol + '</currencySymbol>' +
+ '<price>' + catalogItems[i].price + '</price>' +
+ '</item>' +
+ '</content></entry>';
+ shoppingCart.post(entry, shoppingCart_postResponse);
+ items[i].checked = false;
+ }
+ }
+ function checkoutCart() {
+ document.getElementById('store').innerHTML='<h2>' +
+ 'Thanks for Shopping With Us!</h2>'+
+ '<h2>Your Order</h2>'+
+ '<form name="orderForm">'+
+ document.getElementById('shoppingCart').innerHTML+
+ '<br>'+
+ document.getElementById('total').innerHTML+
+ '<br>'+
+ '<br>'+
+ '<input type="submit" value="Continue Shopping">'+
+ '</form>';
+ shoppingCart.del("", null);
+ }
+ function deleteCart() {
+ shoppingCart.del("", null);
+ document.getElementById('shoppingCart').innerHTML = "";
+ document.getElementById('total').innerHTML = "";
+ }
+
+ function init() {
+
+ try {
+ catalog.get(catalog_getResponse);
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+
+</script>
+
+</head>
+
+<body onload="init()">
+<h1>Store</h1>
+ <div id="store">
+ <h2>Catalog</h2>
+ <form name="catalogForm">
+ <div id="catalog" ></div>
+ <br>
+ <input type="button" onClick="addToCart()" value="Add to Cart">
+ </form>
+
+ <br>
+
+ <h2>Your Shopping Cart</h2>
+ <form name="shoppingCartForm">
+ <div id="shoppingCart"></div>
+ <br>
+ <div id="total"></div>
+ <br>
+ <input type="button" onClick="checkoutCart()" value="Checkout">
+ <input type="button" onClick="deleteCart()" value="Empty">
+ <a href="../shoppingCart/">(feed)</a>
+ </form>
+ </div>
+</body>
+</html>
diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/store.js b/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/store.js new file mode 100644 index 0000000000..9cd8eb526d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/htdocs/store.js @@ -0,0 +1,661 @@ + +/* Apache Tuscany SCA Widget header */ + +/* + * 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"); +}; + + +/* + * 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; + } + } + } +} + + + +/* Tuscany Reference/Property injection code */ + +if (!tuscany) { +var tuscany = {}; +} +if (!tuscany.sca) { +tuscany.sca = {}; +} + +tuscany.sca.propertyMap = new String(); +tuscany.sca.Property = function (name) { + return tuscany.sca.propertyMap[name]; +} + +tuscany.sca.referenceMap = new Object(); +tuscany.sca.referenceMap.catalog = new JSONRpcClient("/catalog").Service; +tuscany.sca.referenceMap.shoppingCart = new AtomClient("/shoppingCart"); +tuscany.sca.referenceMap.shoppingTotal = new JSONRpcClient("/total").Service; +tuscany.sca.Reference = function (name) { + return tuscany.sca.referenceMap[name]; +} + +/** End of Apache Tuscany SCA Widget */ + diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/server-test b/sca-cpp/branches/cpp-contrib/test/store-java/server-test new file mode 100755 index 0000000000..64315d7d92 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/server-test @@ -0,0 +1,38 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +./start +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/store.html 2>/dev/null >tmp/store.html +diff tmp/store.html htdocs/store.html +rc=$? + +# Cleanup +./stop +sleep 2 + +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/start b/sca-cpp/branches/cpp-contrib/test/store-java/start new file mode 100755 index 0000000000..ae2743178a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/start @@ -0,0 +1,31 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-conf tmp 8090 htdocs +../../modules/server/server-conf tmp +../../modules/java/java-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite store.composite +EOF + +export CLASSPATH=`pwd`/../../modules/java/libmod-tuscany-java-1.0.jar:`pwd` + +../../components/cache/memcached-start +../../modules/http/httpd-start tmp diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/stop b/sca-cpp/branches/cpp-contrib/test/store-java/stop new file mode 100755 index 0000000000..79d914e937 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/stop @@ -0,0 +1,23 @@ +#!/bin/sh + +# 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. + +export CLASSPATH=`pwd`/../../modules/java/libmod-tuscany-java-1.0.jar:`pwd` + +../../modules/http/httpd-stop tmp +../../components/cache/memcached-stop diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/store.composite b/sca-cpp/branches/cpp-contrib/test/store-java/store.composite new file mode 100644 index 0000000000..5024d79ee6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/store.composite @@ -0,0 +1,59 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://store" + name="store"> + + <component name="Catalog"> + <implementation.java class="store.FruitsCatalogImpl"/> + <property name="currencyCode">USD</property> + <service name="Catalog"> + <t:binding.jsonrpc uri="catalog"/> + </service> + <reference name="currencyConverter" target="CurrencyConverter"/> + </component> + + <component name="ShoppingCart"> + <implementation.java class="store.ShoppingCartImpl"/> + <service name="ShoppingCart"> + <t:binding.atom uri="shoppingCart"/> + </service> + <service name="Total"> + <t:binding.jsonrpc uri="total"/> + </service> + <reference name="cache" target="Cache"/> + </component> + + <component name="CurrencyConverter"> + <implementation.java class="store.CurrencyConverterImpl"/> + <service name="CurrencyConverter"> + <t:binding.jsonrpc uri="currencyConverter"/> + </service> + </component> + + <component name="Cache"> + <implementation.cpp path="../../components/cache/.libs" library="libmcache"/> + <service name="Cache"> + <t:binding.atom uri="cache"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/store/CurrencyConverter.java b/sca-cpp/branches/cpp-contrib/test/store-java/store/CurrencyConverter.java new file mode 100644 index 0000000000..1ed15a670a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/store/CurrencyConverter.java @@ -0,0 +1,28 @@ +/* + * 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; + +public interface CurrencyConverter { + + Double convert(String from, String to, Double amount); + + String symbol(String currency); + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/store/CurrencyConverterImpl.java b/sca-cpp/branches/cpp-contrib/test/store-java/store/CurrencyConverterImpl.java new file mode 100644 index 0000000000..a6d0fd00b3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/store/CurrencyConverterImpl.java @@ -0,0 +1,45 @@ +/* + * 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; + +/** + * Currency converter component implementation. + */ +public class CurrencyConverterImpl { + + /** + * Convert an amount from USD to a currency. + */ + public Double convert(String from, String to, Double amount) { + if ("EUR".equals(to)) + return amount * 0.70; + return amount; + } + + /** + * Return a currency symbol. + */ + public String symbol(String currency) { + if ("EUR".equals(currency)) + return "E"; + return "$"; + } + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/store/FruitsCatalogImpl.java b/sca-cpp/branches/cpp-contrib/test/store-java/store/FruitsCatalogImpl.java new file mode 100644 index 0000000000..2904bbd8a1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/store/FruitsCatalogImpl.java @@ -0,0 +1,58 @@ +/* + * 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 static org.apache.tuscany.IterableUtil.*; + +import org.apache.tuscany.Service; + +/** + * Catalog component implementation. + */ +public class FruitsCatalogImpl { + + /** + * Returns the catalog. + */ + public Iterable<?> get(final CurrencyConverter converter, final Service currencyCode) { + final String code = currencyCode.eval(); + + class Converter { + Double convert(final Double price) { + return converter.convert(code, "USD", price); + } + } + + final Converter c = new Converter(); + final String symbol = converter.symbol(code); + + return list(list(list("'javaClass", "services.Item"), list("'name", "Apple"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(2.99))), + list(list("'javaClass", "services.Item"), list("'name", "Orange"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(3.55))), + list(list("'javaClass", "services.Item"), list("'name", "Pear"), list("'currencyCode", code), list("'currencySymbol", symbol), list("'price", c.convert(1.55)))); + } + + /** + * TODO remove this JSON-RPC specific function. + */ + public Iterable<?> listMethods(final CurrencyConverter converter, final Service currencyCode) { + return list("Service.get"); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-java/store/ShoppingCartImpl.java b/sca-cpp/branches/cpp-contrib/test/store-java/store/ShoppingCartImpl.java new file mode 100644 index 0000000000..6620cbbbb0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-java/store/ShoppingCartImpl.java @@ -0,0 +1,127 @@ +/* + * 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 static org.apache.tuscany.IterableUtil.*; + +import java.util.UUID; + +import org.apache.tuscany.Service; + +/** + * Shopping cart component implementation. + */ +public class ShoppingCartImpl { + + static String cartId = "1234"; + + /** + * Get the shopping cart from the cache. Return an empty cart if not found. + */ + public Iterable<?> getcart(final String id, final Service cache) { + final Iterable<String> iid = list(id); + final Iterable<?> cart = cache.get(iid); + if(cart == null) + return list(); + return cart; + } + + /** + * Returns a UUID. + */ + String uuid() { + return UUID.randomUUID().toString(); + } + + /** + * Post a new item to the cart. Create a new cart if necessary. + */ + public Iterable<String> post(final Iterable<String> collection, final Iterable<?> item, final Service cache) { + final String id = this.uuid(); + final Iterable<?> newItem = list(car(item), id, caddr(item)); + final Iterable<?> cart = cons(newItem, this.getcart(cartId, cache)); + final Iterable<String> iid = list(cartId); + cache.put(iid, cart); + return list(id); + } + + /** + * Find an item in the cart. + */ + public Iterable<?> find(final String id, final Iterable<?> cart) { + if(isNil(cart)) + return cons("Item", list("0", list())); + if(id.equals(cadr(car(cart)))) + return car(cart); + return this.find(id, cdr(cart)); + } + + /** + * Return items from the cart. + */ + public Iterable<?> get(final Iterable<String> id, final Service cache) { + if(isNil(id)) + return cons("Your Cart", cons(cartId, this.getcart(cartId, cache))); + return this.find((String)car(id), this.getcart(cartId, cache)); + } + + /** + * Delete items from the cart. + */ + public Boolean delete(final Iterable<String> id, final Service cache) { + if(isNil(id)) { + final Iterable<String> iid = list(cartId); + return cache.delete(iid); + } + return true; + } + + /** + * Return the price of an item. + */ + Double price(final Iterable<?> item) { + return Double.valueOf((String)cadr(assoc("'price", caddr(item)))); + } + + /** + * Sum the prices of a list of items. + */ + Double sum(final Iterable<?> items) { + if(isNil(items)) + return 0.0; + return this.price((Iterable<?>)car(items)) + this.sum(cdr(items)); + } + + /** + * Return the total price of the items in the cart. + */ + public Double gettotal(final Service cache) { + final Iterable<?> cart = this.getcart(cartId, cache); + return this.sum(cart); + } + + /** + * TODO remove this JSON-RPC specific function. + */ + public Iterable<?> listMethods(final Service cache) { + return list("Service.gettotal"); + } + +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/Makefile.am b/sca-cpp/branches/cpp-contrib/test/store-python/Makefile.am new file mode 100644 index 0000000000..2bdd776e10 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/Makefile.am @@ -0,0 +1,22 @@ +# 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. + +if WANT_PYTHON + +TESTS = server-test + +endif diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/currency-converter.py b/sca-cpp/branches/cpp-contrib/test/store-python/currency-converter.py new file mode 100644 index 0000000000..2fded8f616 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/currency-converter.py @@ -0,0 +1,29 @@ +# 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. + +# Currency converter implementation + +def convert(fr, to, amount): + if to == "EUR": + return amount * 0.70 + return amount + +def symbol(currency): + if currency == "EUR": + return "E" + return "$" + diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/fruits-catalog.py b/sca-cpp/branches/cpp-contrib/test/store-python/fruits-catalog.py new file mode 100644 index 0000000000..75c18f5f99 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/fruits-catalog.py @@ -0,0 +1,34 @@ +# 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. + +# Catalog implementation + +def get(converter, currencyCode): + code = currencyCode() + def convert(price): + return converter("convert", "USD", code, price) + symbol = converter("symbol", code) + return ( + (("'javaClass", "services.Item"), ("'name", "Apple"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(2.99))), + (("'javaClass", "services.Item"), ("'name", "Orange"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(3.55))), + (("'javaClass", "services.Item"), ("'name", "Pear"), ("'currencyCode", code), ("'currencySymbol", symbol), ("'price", convert(1.55))) + ) + +# TODO remove these JSON-RPC specific functions +def listMethods(converter, currencyCode): + return ("Service.get",) + diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/.htaccess b/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/.htaccess new file mode 100644 index 0000000000..e2e343b6b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/.htaccess @@ -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. + +DirectoryIndex store.html diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/store.html b/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/store.html new file mode 100644 index 0000000000..21eabca7a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/store.html @@ -0,0 +1,169 @@ +<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+<title>Store</title>
+
+<script type="text/javascript" src="store.js"></script>
+
+<script language="JavaScript">
+
+ //@Reference
+ var catalog = new tuscany.sca.Reference("catalog");
+
+ //@Reference
+ var shoppingCart = new tuscany.sca.Reference("shoppingCart");
+
+ //@Reference
+ var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
+
+ var catalogItems;
+
+ function catalog_getResponse(items,exception) {
+ if(exception){
+ alert(exception.message);
+ return;
+ }
+ var catalog = "";
+
+ for (var i=0; i<items.length; i++) {
+ var item = items[i].name + ' - ' + items[i].price;
+ catalog += '<input name="items" type="checkbox" value="' +
+ item + '">' + item + ' <br>';
+ }
+ document.getElementById('catalog').innerHTML=catalog;
+ catalogItems = items;
+
+ // TEMP
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+
+ function shoppingCart_getResponse(feed) {
+ if (feed != null) {
+ var entries = feed.getElementsByTagName("entry");
+ var list = "";
+ for (var i=0; i<entries.length; i++) {
+ var content = entries[i].getElementsByTagName("content")[0];
+ var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
+ var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
+ list += name + ' - ' + price + ' <br>';
+ }
+ document.getElementById("shoppingCart").innerHTML = list;
+
+ if (entries.length != 0) {
+ try {
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+ }
+ }
+
+ function shoppingTotal_getTotalResponse(total,exception) {
+ if(exception) {
+ alert(exception.message);
+ return;
+ }
+ document.getElementById('total').innerHTML = total;
+ }
+
+ function shoppingCart_postResponse(entry) {
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+
+ function addToCart() {
+ var items = document.catalogForm.items;
+ var j = 0;
+ for (var i=0; i<items.length; i++)
+ if (items[i].checked) {
+ var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><content type="application/xml">' +
+ '<item>' +
+ '<javaClass>' + catalogItems[i].javaClass + '</javaClass>' +
+ '<name>' + catalogItems[i].name + '</name>' +
+ '<currencyCode>' + catalogItems[i].currencyCode + '</currencyCode>' +
+ '<currencySymbol>' + catalogItems[i].currencySymbol + '</currencySymbol>' +
+ '<price>' + catalogItems[i].price + '</price>' +
+ '</item>' +
+ '</content></entry>';
+ shoppingCart.post(entry, shoppingCart_postResponse);
+ items[i].checked = false;
+ }
+ }
+ function checkoutCart() {
+ document.getElementById('store').innerHTML='<h2>' +
+ 'Thanks for Shopping With Us!</h2>'+
+ '<h2>Your Order</h2>'+
+ '<form name="orderForm">'+
+ document.getElementById('shoppingCart').innerHTML+
+ '<br>'+
+ document.getElementById('total').innerHTML+
+ '<br>'+
+ '<br>'+
+ '<input type="submit" value="Continue Shopping">'+
+ '</form>';
+ shoppingCart.del("", null);
+ }
+ function deleteCart() {
+ shoppingCart.del("", null);
+ document.getElementById('shoppingCart').innerHTML = "";
+ document.getElementById('total').innerHTML = "";
+ }
+
+ function init() {
+
+ try {
+ catalog.get(catalog_getResponse);
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+
+</script>
+
+</head>
+
+<body onload="init()">
+<h1>Store</h1>
+ <div id="store">
+ <h2>Catalog</h2>
+ <form name="catalogForm">
+ <div id="catalog" ></div>
+ <br>
+ <input type="button" onClick="addToCart()" value="Add to Cart">
+ </form>
+
+ <br>
+
+ <h2>Your Shopping Cart</h2>
+ <form name="shoppingCartForm">
+ <div id="shoppingCart"></div>
+ <br>
+ <div id="total"></div>
+ <br>
+ <input type="button" onClick="checkoutCart()" value="Checkout">
+ <input type="button" onClick="deleteCart()" value="Empty">
+ <a href="../shoppingCart/">(feed)</a>
+ </form>
+ </div>
+</body>
+</html>
diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/store.js b/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/store.js new file mode 100644 index 0000000000..9cd8eb526d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/htdocs/store.js @@ -0,0 +1,661 @@ + +/* Apache Tuscany SCA Widget header */ + +/* + * 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"); +}; + + +/* + * 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; + } + } + } +} + + + +/* Tuscany Reference/Property injection code */ + +if (!tuscany) { +var tuscany = {}; +} +if (!tuscany.sca) { +tuscany.sca = {}; +} + +tuscany.sca.propertyMap = new String(); +tuscany.sca.Property = function (name) { + return tuscany.sca.propertyMap[name]; +} + +tuscany.sca.referenceMap = new Object(); +tuscany.sca.referenceMap.catalog = new JSONRpcClient("/catalog").Service; +tuscany.sca.referenceMap.shoppingCart = new AtomClient("/shoppingCart"); +tuscany.sca.referenceMap.shoppingTotal = new JSONRpcClient("/total").Service; +tuscany.sca.Reference = function (name) { + return tuscany.sca.referenceMap[name]; +} + +/** End of Apache Tuscany SCA Widget */ + diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/server-test b/sca-cpp/branches/cpp-contrib/test/store-python/server-test new file mode 100755 index 0000000000..64315d7d92 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/server-test @@ -0,0 +1,38 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +./start +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/store.html 2>/dev/null >tmp/store.html +diff tmp/store.html htdocs/store.html +rc=$? + +# Cleanup +./stop +sleep 2 + +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/shopping-cart.py b/sca-cpp/branches/cpp-contrib/test/store-python/shopping-cart.py new file mode 100644 index 0000000000..988fe7bea6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/shopping-cart.py @@ -0,0 +1,78 @@ +# 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. + +# Shopping cart implementation +import uuid +import sys + +cartId = "1234" + +# Get the shopping cart from the cache +# Return an empty cart if not found +def getcart(id, cache): + cart = cache("get", (id,)) + if cart is None: + return () + return cart + +# Post a new item to the cart, create a new cart if necessary +def post(collection, item, cache): + id = str(uuid.uuid1()) + cart = ((item[0], id, item[2]),) + getcart(cartId, cache) + cache("put", (cartId,), cart) + return (id,) + + +# Find an item in the cart +def find(id, cart): + if cart == (): + return ("Item", "0", ()) + elif id == cart[0][1]: + return cart[0] + else: + return find(id, cart[1:]) + +# Get items from the cart +def get(id, cache): + if id == (): + return ("Your Cart", cartId) + getcart(cartId, cache) + return find(id[0], getcart(cartId, cache)) + +# Delete items from the cart +def delete(id, cache): + if id == (): + return cache("delete", (cartId,)) + return true + +# Return the price of an item +def price(item): + return float(filter(lambda x: x[0] == "'price", item[2])[0][1]) + +# Sum the prices of a list of items +def sum(items): + if items == (): + return 0 + return price(items[0]) + sum(items[1:]) + +# Return the total price of the items in the cart +def gettotal(cache): + cart = getcart(cartId, cache) + return sum(cart) + +# TODO remove these JSON-RPC specific functions +def listMethods(cache): + return ("Service.gettotal",) diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/start b/sca-cpp/branches/cpp-contrib/test/store-python/start new file mode 100755 index 0000000000..93e1dbe755 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/start @@ -0,0 +1,29 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-conf tmp 8090 htdocs +../../modules/server/server-conf tmp +../../modules/python/python-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite store.composite +EOF + +../../components/cache/memcached-start +../../modules/http/httpd-start tmp diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/stop b/sca-cpp/branches/cpp-contrib/test/store-python/stop new file mode 100755 index 0000000000..a59273b8ed --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/stop @@ -0,0 +1,21 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-stop tmp +../../components/cache/memcached-stop diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/store.composite b/sca-cpp/branches/cpp-contrib/test/store-python/store.composite new file mode 100644 index 0000000000..8dc9950204 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/store.composite @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://store" + name="store"> + + <component name="Store"> + <t:implementation.python script="store.py"/> + <service name="Widget"> + <t:binding.http uri="store"/> + </service> + <reference name="catalog" target="Catalog"/> + <reference name="shoppingCart" target="ShoppingCart/Cart"/> + <reference name="shoppingTotal" target="ShoppingCart/Total"/> + </component> + + <component name="Catalog"> + <t:implementation.python script="fruits-catalog.py"/> + <property name="currencyCode">USD</property> + <service name="Catalog"> + <t:binding.jsonrpc uri="catalog"/> + </service> + <reference name="currencyConverter" target="CurrencyConverter"/> + </component> + + <component name="ShoppingCart"> + <t:implementation.python script="shopping-cart.py"/> + <service name="ShoppingCart"> + <t:binding.atom uri="shoppingCart"/> + </service> + <service name="Total"> + <t:binding.jsonrpc uri="total"/> + </service> + <reference name="cache" target="Cache"/> + </component> + + <component name="CurrencyConverter"> + <t:implementation.python script="currency-converter.py"/> + <service name="CurrencyConverter"> + <t:binding.jsonrpc uri="currencyConverter"/> + </service> + </component> + + <component name="Cache"> + <implementation.cpp path="../../components/cache/.libs" library="libmcache"/> + <service name="Cache"> + <t:binding.atom uri="cache"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/test/store-python/store.py b/sca-cpp/branches/cpp-contrib/test/store-python/store.py new file mode 100644 index 0000000000..35c0f5b2aa --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-python/store.py @@ -0,0 +1,44 @@ +# 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. + +# Store implementation + +def post(item, catalog, shoppingCart, shoppingTotal): + return shoppingCart("post", item) + +def getall(catalog, shoppingCart, shoppingTotal): + return shoppingCart("getall") + +def get(id, catalog, shoppingCart, shoppingTotal): + return shoppingCart("get", id) + +def getcatalog(catalog, shoppingCart, shoppingTotal): + return catalog("get") + +def gettotal(catalog, shoppingCart, shoppingTotal): + return shoppingCart("gettotal") + +def deleteall(catalog, shoppingCart, shoppingTotal): + return shoppingCart("deleteall") + +def delete(id, catalog, shoppingCart, shoppingTotal): + return shoppingCart("delete", id) + +# TODO remove these JSON-RPC specific functions +def listMethods(catalog, shoppingCart, shoppingTotal): + return ("Service.get", "Service.gettotal") + diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/Makefile.am b/sca-cpp/branches/cpp-contrib/test/store-scheme/Makefile.am new file mode 100644 index 0000000000..77cceb8352 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/Makefile.am @@ -0,0 +1,23 @@ +# 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. + +noinst_PROGRAMS = script-test + +script_test_SOURCES = script-test.cpp +script_test_LDFLAGS = -lxml2 -lmozjs + +TESTS = script-test server-test diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/currency-converter.scm b/sca-cpp/branches/cpp-contrib/test/store-scheme/currency-converter.scm new file mode 100644 index 0000000000..fc506c3d73 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/currency-converter.scm @@ -0,0 +1,27 @@ +; 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. + +; Currency converter implementation + +(define (convert from to amount) + (if (equal? to "EUR") (* amount 0.70) amount) +) + +(define (symbol currency) + (if (equal? currency "EUR") "E" "$") +) + diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/fruits-catalog.scm b/sca-cpp/branches/cpp-contrib/test/store-scheme/fruits-catalog.scm new file mode 100644 index 0000000000..d79ff1b677 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/fruits-catalog.scm @@ -0,0 +1,33 @@ +; 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. + +; Catalog implementation + +(define (get converter currencyCode) + (define code (currencyCode)) + (define (convert price) (converter "convert" "USD" code price)) + (define symbol (converter "symbol" code)) + (list + (list (list 'javaClass "services.Item") (list 'name "Apple") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 2.99))) + (list (list 'javaClass "services.Item") (list 'name "Orange") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 3.55))) + (list (list 'javaClass "services.Item") (list 'name "Pear") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price (convert 1.55))) + ) +) + +; TODO remove these JSON-RPC specific functions +(define (listMethods converter currencyCode) (list "Service.get")) + diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/.htaccess b/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/.htaccess new file mode 100644 index 0000000000..e2e343b6b2 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/.htaccess @@ -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. + +DirectoryIndex store.html diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/store.html b/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/store.html new file mode 100644 index 0000000000..21eabca7a7 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/store.html @@ -0,0 +1,169 @@ +<!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+-->
+<html>
+<head>
+<title>Store</title>
+
+<script type="text/javascript" src="store.js"></script>
+
+<script language="JavaScript">
+
+ //@Reference
+ var catalog = new tuscany.sca.Reference("catalog");
+
+ //@Reference
+ var shoppingCart = new tuscany.sca.Reference("shoppingCart");
+
+ //@Reference
+ var shoppingTotal = new tuscany.sca.Reference("shoppingTotal");
+
+ var catalogItems;
+
+ function catalog_getResponse(items,exception) {
+ if(exception){
+ alert(exception.message);
+ return;
+ }
+ var catalog = "";
+
+ for (var i=0; i<items.length; i++) {
+ var item = items[i].name + ' - ' + items[i].price;
+ catalog += '<input name="items" type="checkbox" value="' +
+ item + '">' + item + ' <br>';
+ }
+ document.getElementById('catalog').innerHTML=catalog;
+ catalogItems = items;
+
+ // TEMP
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+
+ function shoppingCart_getResponse(feed) {
+ if (feed != null) {
+ var entries = feed.getElementsByTagName("entry");
+ var list = "";
+ for (var i=0; i<entries.length; i++) {
+ var content = entries[i].getElementsByTagName("content")[0];
+ var name = content.getElementsByTagName("name")[0].firstChild.nodeValue;
+ var price = content.getElementsByTagName("price")[0].firstChild.nodeValue;
+ list += name + ' - ' + price + ' <br>';
+ }
+ document.getElementById("shoppingCart").innerHTML = list;
+
+ if (entries.length != 0) {
+ try {
+ shoppingTotal.gettotal(shoppingTotal_getTotalResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+ }
+ }
+
+ function shoppingTotal_getTotalResponse(total,exception) {
+ if(exception) {
+ alert(exception.message);
+ return;
+ }
+ document.getElementById('total').innerHTML = total;
+ }
+
+ function shoppingCart_postResponse(entry) {
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+
+ function addToCart() {
+ var items = document.catalogForm.items;
+ var j = 0;
+ for (var i=0; i<items.length; i++)
+ if (items[i].checked) {
+ var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title type="text">Item</title><content type="application/xml">' +
+ '<item>' +
+ '<javaClass>' + catalogItems[i].javaClass + '</javaClass>' +
+ '<name>' + catalogItems[i].name + '</name>' +
+ '<currencyCode>' + catalogItems[i].currencyCode + '</currencyCode>' +
+ '<currencySymbol>' + catalogItems[i].currencySymbol + '</currencySymbol>' +
+ '<price>' + catalogItems[i].price + '</price>' +
+ '</item>' +
+ '</content></entry>';
+ shoppingCart.post(entry, shoppingCart_postResponse);
+ items[i].checked = false;
+ }
+ }
+ function checkoutCart() {
+ document.getElementById('store').innerHTML='<h2>' +
+ 'Thanks for Shopping With Us!</h2>'+
+ '<h2>Your Order</h2>'+
+ '<form name="orderForm">'+
+ document.getElementById('shoppingCart').innerHTML+
+ '<br>'+
+ document.getElementById('total').innerHTML+
+ '<br>'+
+ '<br>'+
+ '<input type="submit" value="Continue Shopping">'+
+ '</form>';
+ shoppingCart.del("", null);
+ }
+ function deleteCart() {
+ shoppingCart.del("", null);
+ document.getElementById('shoppingCart').innerHTML = "";
+ document.getElementById('total').innerHTML = "";
+ }
+
+ function init() {
+
+ try {
+ catalog.get(catalog_getResponse);
+ shoppingCart.get("", shoppingCart_getResponse);
+ }
+ catch(e){
+ alert(e);
+ }
+ }
+
+</script>
+
+</head>
+
+<body onload="init()">
+<h1>Store</h1>
+ <div id="store">
+ <h2>Catalog</h2>
+ <form name="catalogForm">
+ <div id="catalog" ></div>
+ <br>
+ <input type="button" onClick="addToCart()" value="Add to Cart">
+ </form>
+
+ <br>
+
+ <h2>Your Shopping Cart</h2>
+ <form name="shoppingCartForm">
+ <div id="shoppingCart"></div>
+ <br>
+ <div id="total"></div>
+ <br>
+ <input type="button" onClick="checkoutCart()" value="Checkout">
+ <input type="button" onClick="deleteCart()" value="Empty">
+ <a href="../shoppingCart/">(feed)</a>
+ </form>
+ </div>
+</body>
+</html>
diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/store.js b/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/store.js new file mode 100644 index 0000000000..9cd8eb526d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/htdocs/store.js @@ -0,0 +1,661 @@ + +/* Apache Tuscany SCA Widget header */ + +/* + * 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"); +}; + + +/* + * 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; + } + } + } +} + + + +/* Tuscany Reference/Property injection code */ + +if (!tuscany) { +var tuscany = {}; +} +if (!tuscany.sca) { +tuscany.sca = {}; +} + +tuscany.sca.propertyMap = new String(); +tuscany.sca.Property = function (name) { + return tuscany.sca.propertyMap[name]; +} + +tuscany.sca.referenceMap = new Object(); +tuscany.sca.referenceMap.catalog = new JSONRpcClient("/catalog").Service; +tuscany.sca.referenceMap.shoppingCart = new AtomClient("/shoppingCart"); +tuscany.sca.referenceMap.shoppingTotal = new JSONRpcClient("/total").Service; +tuscany.sca.Reference = function (name) { + return tuscany.sca.referenceMap[name]; +} + +/** End of Apache Tuscany SCA Widget */ + diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/script-test.cpp b/sca-cpp/branches/cpp-contrib/test/store-scheme/script-test.cpp new file mode 100644 index 0000000000..c8eecb65c3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/script-test.cpp @@ -0,0 +1,96 @@ +/* + * 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. + */ + +/* $Rev$ $Date$ */ + +/** + * Store Test case. + */ + +#include <assert.h> +#include <regex.h> +#include "stream.hpp" +#include "string.hpp" +#include "list.hpp" +#include "xml.hpp" +#include "../../modules/scheme/driver.hpp" +#include "../../modules/json/json.hpp" + +namespace store { + +using namespace tuscany; + +bool testScript() { + gc_scoped_pool pool; + + ifstream is("script-test.scm"); + ostringstream os; + scheme::evalDriverRun(is, os); + assert(contains(str(os), "(\"Sample Feed\" \"")); + assert(contains(str(os), "\" (\"Item\" \"")); + assert(contains(str(os), "\" ((javaClass \"services.Item\") (name \"Orange\") (currencyCode \"USD\") (currencySymbol \"$\") (price 3.55))) (\"Item\" \"")); + assert(contains(str(os), "\" ((javaClass \"services.Item\") (name \"Apple\") (currencyCode \"USD\") (currencySymbol \"$\") (price 2.99))))")); + return true; +} + +bool testEval() { + { + gc_scoped_pool pool; + ifstream is("script-test.scm"); + ostringstream os; + scheme::setupDisplay(os); + scheme::Env globalEnv = scheme::setupEnvironment(); + const value exp(mklist<value>("storeui_service", string("getcatalog"))); + const value val = scheme::evalScript(exp, is, globalEnv); + + ostringstream vs; + vs << val; + assert(contains(str(vs), "(((javaClass \"services.Item\") (name \"Apple\") (currencyCode \"USD\") (currencySymbol \"$\") (price 2.99)) ((javaClass \"services.Item\") (name \"Orange\") (currencyCode \"USD\") (currencySymbol \"$\") (price 3.55)) ((javaClass \"services.Item\") (name \"Pear\") (currencyCode \"USD\") (currencySymbol \"$\") (price 1.55)))")); + } + + { + gc_scoped_pool pool; + ifstream is("script-test.scm"); + ostringstream os; + scheme::setupDisplay(os); + + scheme::Env globalEnv = scheme::setupEnvironment(); + const value exp(mklist<value>("storeui_service", string("gettotal"))); + const value res = scheme::evalScript(exp, is, globalEnv); + + ostringstream rs; + rs << res; + assert(contains(str(rs), "10")); + } + return true; +} + +} + +int main() { + + tuscany::cout << "Testing..." << tuscany::endl; + + store::testScript(); + store::testEval(); + + tuscany::cout << "OK" << tuscany::endl; + + return 0; +} diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/script-test.scm b/sca-cpp/branches/cpp-contrib/test/store-scheme/script-test.scm new file mode 100644 index 0000000000..6db3408794 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/script-test.scm @@ -0,0 +1,140 @@ +; 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. + +; Currency implementation + +(define (currency_convert from to amount) + (if (equal? to "EUR") (* amount 0.70) amount) +) + +(define (currency_symbol currency) + (if (equal? currency "EUR") "E" "$") +) + +(define (currency_impl op args) + (cond + ((equal? op "convert") (apply currency_convert args)) + ((equal? op "symbol") (apply currency_symbol args)) + ) +) + +; Currency composite + +(define (currency_service op . args) (currency_impl op args)) + +; Catalog implementation + +(define (catalog_get converter) + (define (convert price) (converter "convert" "USD" "USD" price)) + + (define code "USD") + (define symbol (converter "symbol" code)) + + (list + (list (list 'javaClass "services.Item") (list 'name "Apple") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price 2.99)) + (list (list 'javaClass "services.Item") (list 'name "Orange") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price 3.55)) + (list (list 'javaClass "services.Item") (list 'name "Pear") (list 'currencyCode code) (list 'currencySymbol symbol) (list 'price 1.55)) + ) +) + +(define (catalog_impl converter op args) + (cond + ((equal? op "get") (apply catalog_get (cons converter args))) + ) +) + +; Catalog composite + +(define (catalog_service op . args) (catalog_impl currency_service op args)) + +; Cart implementation + +(define (cart_post content item) + (cons (cons "Item" (list (uuid) item)) content) +) + +(define (cart_getall content) + (cons "Sample Feed" (cons (uuid) content)) +) + +(define (cart_getentry id) + (define entry (list (list 'name "Apple") (list 'currencyCode "USD") (list 'currencySymbol "$") (list 'price 2.99))) + (cons "Item" (list id entry)) +) + +(define (cart_gettotal) + 10.0 +) + +(define (cart_impl op args) + (cond + ((equal? op "post") (apply cart_post args)) + ((equal? op "getall") (apply cart_getall args)) + ((equal? op "getentry") (apply cart_getentry args)) + ((equal? op "gettotal") (apply cart_gettotal args)) + ) +) + +; Store UI implementation + +(define (storeui_post cart content item) + (cart "post" content item) +) + +(define (storeui_getcart cart content) + (cart "getall" content) +) + +(define (storeui_getentry cart id) + (cart "getentry" id) +) + +(define (storeui_getcatalog catalog) + (catalog "get") +) + +(define (storeui_gettotal cart) + (cart "gettotal") +) + +(define (storeui_impl cart catalog op args) + (cond + ((equal? op "post") (apply storeui_post (cons cart args))) + ((equal? op "getall") (apply storeui_getcart (cons cart args))) + ((equal? op "getentry") (apply storeui_getentry (cons cart args))) + ((equal? op "getcatalog") (apply storeui_getcatalog (cons catalog args))) + ((equal? op "gettotal") (apply storeui_gettotal (cons cart args))) + ) +) + +; Store UI composite + +(define (cart_service op . args) (cart_impl op args)) + +(define (storeui_service op . args) (storeui_impl cart_service catalog_service op args)) + +; Store UI test case + +(define catalog (storeui_service "getcatalog")) +(define empty (list)) +(define apple (car catalog)) +(define orange (car (cdr catalog))) +(define added1 (storeui_service "post" empty apple)) +(define added2 (storeui_service "post" added1 orange)) +(display (storeui_service "getall" added2)) +(display (storeui_service "gettotal")) + diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/server-test b/sca-cpp/branches/cpp-contrib/test/store-scheme/server-test new file mode 100755 index 0000000000..64315d7d92 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/server-test @@ -0,0 +1,38 @@ +#!/bin/sh + +# 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. + +echo "Testing..." + +# Setup +./start +sleep 2 + +# Test HTTP GET +curl http://localhost:8090/store.html 2>/dev/null >tmp/store.html +diff tmp/store.html htdocs/store.html +rc=$? + +# Cleanup +./stop +sleep 2 + +if [ "$rc" = "0" ]; then + echo "OK" +fi +return $rc diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/shopping-cart.scm b/sca-cpp/branches/cpp-contrib/test/store-scheme/shopping-cart.scm new file mode 100644 index 0000000000..484044d420 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/shopping-cart.scm @@ -0,0 +1,84 @@ +; 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. + +; Shopping cart implementation + +(define cartId "1234") + +; Get the shopping cart from the cache +; Return an empty cart if not found +(define (getcart id cache) + (define cart (cache "get" (list id))) + (if (nul cart) + (list) + cart) +) + +; Post a new item to the cart, create a new cart if necessary +(define (post collection item cache) + (define id (uuid)) + (define newItem (list (car item) id (caddr item))) + (define cart (cons newItem (getcart cartId cache))) + (cache "put" (list cartId) cart) + (list id) +) + +; Find an item in the cart +(define (find id cart) + (if (nul cart) + (cons "Item" (list "0" (list))) + (if (= id (cadr (car cart))) + (car cart) + (find id (cdr cart)))) +) + +; Get items from the cart +(define (get id cache) + (if (nul id) + (cons "Your Cart" (cons cartId (getcart cartId cache))) + (find (car id) (getcart cartId cache)) + ) +) + +; Delete items from the cart +(define (delete id cache) + (if (nul id) + (cache "delete" (list cartId)) + true + ) +) + +; Return the price of an item +(define (price item) + (cadr (assoc 'price (caddr item))) +) + +; Sum the prices of a list of items +(define (sum items) + (if (nul items) + 0 + (+ (price (car items)) (sum (cdr items)))) +) + +; Return the total price of the items in the cart +(define (gettotal cache) + (define cart (getcart cartId cache)) + (sum cart) +) + +; TODO remove these JSON-RPC specific functions +(define (listMethods cache) (list "Service.gettotal")) diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/start b/sca-cpp/branches/cpp-contrib/test/store-scheme/start new file mode 100755 index 0000000000..db8e19c4cc --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/start @@ -0,0 +1,29 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-conf tmp 8090 htdocs +../../modules/server/server-conf tmp +../../modules/server/scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite store.composite +EOF + +../../components/cache/memcached-start +../../modules/http/httpd-start tmp diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/stop b/sca-cpp/branches/cpp-contrib/test/store-scheme/stop new file mode 100755 index 0000000000..a59273b8ed --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/stop @@ -0,0 +1,21 @@ +#!/bin/sh + +# 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. + +../../modules/http/httpd-stop tmp +../../components/cache/memcached-stop diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/store.composite b/sca-cpp/branches/cpp-contrib/test/store-scheme/store.composite new file mode 100644 index 0000000000..94e066acad --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/store.composite @@ -0,0 +1,69 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://store" + name="store"> + + <component name="Store"> + <t:implementation.scheme script="store.scm"/> + <service name="Widget"> + <t:binding.http uri="store"/> + </service> + <reference name="catalog" target="Catalog"/> + <reference name="shoppingCart" target="ShoppingCart/Cart"/> + <reference name="shoppingTotal" target="ShoppingCart/Total"/> + </component> + + <component name="Catalog"> + <t:implementation.scheme script="fruits-catalog.scm"/> + <property name="currencyCode">USD</property> + <service name="Catalog"> + <t:binding.jsonrpc uri="catalog"/> + </service> + <reference name="currencyConverter" target="CurrencyConverter"/> + </component> + + <component name="ShoppingCart"> + <t:implementation.scheme script="shopping-cart.scm"/> + <service name="ShoppingCart"> + <t:binding.atom uri="shoppingCart"/> + </service> + <service name="Total"> + <t:binding.jsonrpc uri="total"/> + </service> + <reference name="cache" target="Cache"/> + </component> + + <component name="CurrencyConverter"> + <t:implementation.scheme script="currency-converter.scm"/> + <service name="CurrencyConverter"> + <t:binding.jsonrpc uri="currencyConverter"/> + </service> + </component> + + <component name="Cache"> + <implementation.cpp path="../../components/cache/.libs" library="libmcache"/> + <service name="Cache"> + <t:binding.atom uri="cache"/> + </service> + </component> + +</composite> diff --git a/sca-cpp/branches/cpp-contrib/test/store-scheme/store.scm b/sca-cpp/branches/cpp-contrib/test/store-scheme/store.scm new file mode 100644 index 0000000000..d851dc7ed6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/test/store-scheme/store.scm @@ -0,0 +1,50 @@ +; 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. + +; Store implementation + +(define (post item catalog shoppingCart shoppingTotal) + (shoppingCart "post" item) +) + +(define (getall catalog shoppingCart shoppingTotal) + (shoppingCart "getall") +) + +(define (get id catalog shoppingCart shoppingTotal) + (shoppingCart "get" id) +) + +(define (getcatalog catalog shoppingCart shoppingTotal) + (catalog "get") +) + +(define (gettotal catalog shoppingCart shoppingTotal) + (shoppingCart "gettotal") +) + +(define (deleteall catalog shoppingCart shoppingTotal) + (shoppingCart "deleteall") +) + +(define (delete id catalog shoppingCart shoppingTotal) + (shoppingCart "delete" id) +) + +; TODO remove these JSON-RPC specific functions +(define (listMethods catalog shoppingCart shoppingTotal) (list "Service.getcatalog" "Service.gettotal")) + diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/XMLSchema.dtd b/sca-cpp/branches/cpp-contrib/xsd/external/XMLSchema.dtd new file mode 100644 index 0000000000..e8e8f7625a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/XMLSchema.dtd @@ -0,0 +1,402 @@ +<!-- DTD for XML Schemas: Part 1: Structures + Public Identifier: "-//W3C//DTD XMLSCHEMA 200102//EN" + Official Location: http://www.w3.org/2001/XMLSchema.dtd --> +<!-- $Id: XMLSchema.dtd,v 1.31 2001/10/24 15:50:16 ht Exp $ --> +<!-- Note this DTD is NOT normative, or even definitive. --> <!--d--> +<!-- prose copy in the structures REC is the definitive version --> <!--d--> +<!-- (which shouldn't differ from this one except for this --> <!--d--> +<!-- comment and entity expansions, but just in case) --> <!--d--> +<!-- With the exception of cases with multiple namespace + prefixes for the XML Schema namespace, any XML document which is + not valid per this DTD given redefinitions in its internal subset of the + 'p' and 's' parameter entities below appropriate to its namespace + declaration of the XML Schema namespace is almost certainly not + a valid schema. --> + +<!-- The simpleType element and its constituent parts + are defined in XML Schema: Part 2: Datatypes --> +<!ENTITY % xs-datatypes PUBLIC 'datatypes' 'datatypes.dtd' > + +<!ENTITY % p 'xs:'> <!-- can be overriden in the internal subset of a + schema document to establish a different + namespace prefix --> +<!ENTITY % s ':xs'> <!-- if %p is defined (e.g. as foo:) then you must + also define %s as the suffix for the appropriate + namespace declaration (e.g. :foo) --> +<!ENTITY % nds 'xmlns%s;'> + +<!-- Define all the element names, with optional prefix --> +<!ENTITY % schema "%p;schema"> +<!ENTITY % complexType "%p;complexType"> +<!ENTITY % complexContent "%p;complexContent"> +<!ENTITY % simpleContent "%p;simpleContent"> +<!ENTITY % extension "%p;extension"> +<!ENTITY % element "%p;element"> +<!ENTITY % unique "%p;unique"> +<!ENTITY % key "%p;key"> +<!ENTITY % keyref "%p;keyref"> +<!ENTITY % selector "%p;selector"> +<!ENTITY % field "%p;field"> +<!ENTITY % group "%p;group"> +<!ENTITY % all "%p;all"> +<!ENTITY % choice "%p;choice"> +<!ENTITY % sequence "%p;sequence"> +<!ENTITY % any "%p;any"> +<!ENTITY % anyAttribute "%p;anyAttribute"> +<!ENTITY % attribute "%p;attribute"> +<!ENTITY % attributeGroup "%p;attributeGroup"> +<!ENTITY % include "%p;include"> +<!ENTITY % import "%p;import"> +<!ENTITY % redefine "%p;redefine"> +<!ENTITY % notation "%p;notation"> + +<!-- annotation elements --> +<!ENTITY % annotation "%p;annotation"> +<!ENTITY % appinfo "%p;appinfo"> +<!ENTITY % documentation "%p;documentation"> + +<!-- Customisation entities for the ATTLIST of each element type. + Define one of these if your schema takes advantage of the + anyAttribute='##other' in the schema for schemas --> + +<!ENTITY % schemaAttrs ''> +<!ENTITY % complexTypeAttrs ''> +<!ENTITY % complexContentAttrs ''> +<!ENTITY % simpleContentAttrs ''> +<!ENTITY % extensionAttrs ''> +<!ENTITY % elementAttrs ''> +<!ENTITY % groupAttrs ''> +<!ENTITY % allAttrs ''> +<!ENTITY % choiceAttrs ''> +<!ENTITY % sequenceAttrs ''> +<!ENTITY % anyAttrs ''> +<!ENTITY % anyAttributeAttrs ''> +<!ENTITY % attributeAttrs ''> +<!ENTITY % attributeGroupAttrs ''> +<!ENTITY % uniqueAttrs ''> +<!ENTITY % keyAttrs ''> +<!ENTITY % keyrefAttrs ''> +<!ENTITY % selectorAttrs ''> +<!ENTITY % fieldAttrs ''> +<!ENTITY % includeAttrs ''> +<!ENTITY % importAttrs ''> +<!ENTITY % redefineAttrs ''> +<!ENTITY % notationAttrs ''> +<!ENTITY % annotationAttrs ''> +<!ENTITY % appinfoAttrs ''> +<!ENTITY % documentationAttrs ''> + +<!ENTITY % complexDerivationSet "CDATA"> + <!-- #all or space-separated list drawn from derivationChoice --> +<!ENTITY % blockSet "CDATA"> + <!-- #all or space-separated list drawn from + derivationChoice + 'substitution' --> + +<!ENTITY % mgs '%all; | %choice; | %sequence;'> +<!ENTITY % cs '%choice; | %sequence;'> +<!ENTITY % formValues '(qualified|unqualified)'> + + +<!ENTITY % attrDecls '((%attribute;| %attributeGroup;)*,(%anyAttribute;)?)'> + +<!ENTITY % particleAndAttrs '((%mgs; | %group;)?, %attrDecls;)'> + +<!-- This is used in part2 --> +<!ENTITY % restriction1 '((%mgs; | %group;)?)'> + +%xs-datatypes; + +<!-- the duplication below is to produce an unambiguous content model + which allows annotation everywhere --> +<!ELEMENT %schema; ((%include; | %import; | %redefine; | %annotation;)*, + ((%simpleType; | %complexType; + | %element; | %attribute; + | %attributeGroup; | %group; + | %notation; ), + (%annotation;)*)* )> +<!ATTLIST %schema; + targetNamespace %URIref; #IMPLIED + version CDATA #IMPLIED + %nds; %URIref; #FIXED 'http://www.w3.org/2001/XMLSchema' + xmlns CDATA #IMPLIED + finalDefault %complexDerivationSet; '' + blockDefault %blockSet; '' + id ID #IMPLIED + elementFormDefault %formValues; 'unqualified' + attributeFormDefault %formValues; 'unqualified' + xml:lang CDATA #IMPLIED + %schemaAttrs;> +<!-- Note the xmlns declaration is NOT in the Schema for Schemas, + because at the Infoset level where schemas operate, + xmlns(:prefix) is NOT an attribute! --> +<!-- The declaration of xmlns is a convenience for schema authors --> + +<!-- The id attribute here and below is for use in external references + from non-schemas using simple fragment identifiers. + It is NOT used for schema-to-schema reference, internal or + external. --> + +<!-- a type is a named content type specification which allows attribute + declarations--> +<!-- --> + +<!ELEMENT %complexType; ((%annotation;)?, + (%simpleContent;|%complexContent;| + %particleAndAttrs;))> + +<!ATTLIST %complexType; + name %NCName; #IMPLIED + id ID #IMPLIED + abstract %boolean; #IMPLIED + final %complexDerivationSet; #IMPLIED + block %complexDerivationSet; #IMPLIED + mixed (true|false) 'false' + %complexTypeAttrs;> + +<!-- particleAndAttrs is shorthand for a root type --> +<!-- mixed is disallowed if simpleContent, overriden if complexContent + has one too. --> + +<!-- If anyAttribute appears in one or more referenced attributeGroups + and/or explicitly, the intersection of the permissions is used --> + +<!ELEMENT %complexContent; ((%annotation;)?, (%restriction;|%extension;))> +<!ATTLIST %complexContent; + mixed (true|false) #IMPLIED + id ID #IMPLIED + %complexContentAttrs;> + +<!-- restriction should use the branch defined above, not the simple + one from part2; extension should use the full model --> + +<!ELEMENT %simpleContent; ((%annotation;)?, (%restriction;|%extension;))> +<!ATTLIST %simpleContent; + id ID #IMPLIED + %simpleContentAttrs;> + +<!-- restriction should use the simple branch from part2, not the + one defined above; extension should have no particle --> + +<!ELEMENT %extension; ((%annotation;)?, (%particleAndAttrs;))> +<!ATTLIST %extension; + base %QName; #REQUIRED + id ID #IMPLIED + %extensionAttrs;> + +<!-- an element is declared by either: + a name and a type (either nested or referenced via the type attribute) + or a ref to an existing element declaration --> + +<!ELEMENT %element; ((%annotation;)?, (%complexType;| %simpleType;)?, + (%unique; | %key; | %keyref;)*)> +<!-- simpleType or complexType only if no type|ref attribute --> +<!-- ref not allowed at top level --> +<!ATTLIST %element; + name %NCName; #IMPLIED + id ID #IMPLIED + ref %QName; #IMPLIED + type %QName; #IMPLIED + minOccurs %nonNegativeInteger; #IMPLIED + maxOccurs CDATA #IMPLIED + nillable %boolean; #IMPLIED + substitutionGroup %QName; #IMPLIED + abstract %boolean; #IMPLIED + final %complexDerivationSet; #IMPLIED + block %blockSet; #IMPLIED + default CDATA #IMPLIED + fixed CDATA #IMPLIED + form %formValues; #IMPLIED + %elementAttrs;> +<!-- type and ref are mutually exclusive. + name and ref are mutually exclusive, one is required --> +<!-- In the absence of type AND ref, type defaults to type of + substitutionGroup, if any, else the ur-type, i.e. unconstrained --> +<!-- default and fixed are mutually exclusive --> + +<!ELEMENT %group; ((%annotation;)?,(%mgs;)?)> +<!ATTLIST %group; + name %NCName; #IMPLIED + ref %QName; #IMPLIED + minOccurs %nonNegativeInteger; #IMPLIED + maxOccurs CDATA #IMPLIED + id ID #IMPLIED + %groupAttrs;> + +<!ELEMENT %all; ((%annotation;)?, (%element;)*)> +<!ATTLIST %all; + minOccurs (1) #IMPLIED + maxOccurs (1) #IMPLIED + id ID #IMPLIED + %allAttrs;> + +<!ELEMENT %choice; ((%annotation;)?, (%element;| %group;| %cs; | %any;)*)> +<!ATTLIST %choice; + minOccurs %nonNegativeInteger; #IMPLIED + maxOccurs CDATA #IMPLIED + id ID #IMPLIED + %choiceAttrs;> + +<!ELEMENT %sequence; ((%annotation;)?, (%element;| %group;| %cs; | %any;)*)> +<!ATTLIST %sequence; + minOccurs %nonNegativeInteger; #IMPLIED + maxOccurs CDATA #IMPLIED + id ID #IMPLIED + %sequenceAttrs;> + +<!-- an anonymous grouping in a model, or + a top-level named group definition, or a reference to same --> + +<!-- Note that if order is 'all', group is not allowed inside. + If order is 'all' THIS group must be alone (or referenced alone) at + the top level of a content model --> +<!-- If order is 'all', minOccurs==maxOccurs==1 on element/any inside --> +<!-- Should allow minOccurs=0 inside order='all' . . . --> + +<!ELEMENT %any; (%annotation;)?> +<!ATTLIST %any; + namespace CDATA '##any' + processContents (skip|lax|strict) 'strict' + minOccurs %nonNegativeInteger; '1' + maxOccurs CDATA '1' + id ID #IMPLIED + %anyAttrs;> + +<!-- namespace is interpreted as follows: + ##any - - any non-conflicting WFXML at all + + ##other - - any non-conflicting WFXML from namespace other + than targetNamespace + + ##local - - any unqualified non-conflicting WFXML/attribute + one or - - any non-conflicting WFXML from + more URI the listed namespaces + references + + ##targetNamespace ##local may appear in the above list, + with the obvious meaning --> + +<!ELEMENT %anyAttribute; (%annotation;)?> +<!ATTLIST %anyAttribute; + namespace CDATA '##any' + processContents (skip|lax|strict) 'strict' + id ID #IMPLIED + %anyAttributeAttrs;> +<!-- namespace is interpreted as for 'any' above --> + +<!-- simpleType only if no type|ref attribute --> +<!-- ref not allowed at top level, name iff at top level --> +<!ELEMENT %attribute; ((%annotation;)?, (%simpleType;)?)> +<!ATTLIST %attribute; + name %NCName; #IMPLIED + id ID #IMPLIED + ref %QName; #IMPLIED + type %QName; #IMPLIED + use (prohibited|optional|required) #IMPLIED + default CDATA #IMPLIED + fixed CDATA #IMPLIED + form %formValues; #IMPLIED + %attributeAttrs;> +<!-- type and ref are mutually exclusive. + name and ref are mutually exclusive, one is required --> +<!-- default for use is optional when nested, none otherwise --> +<!-- default and fixed are mutually exclusive --> +<!-- type attr and simpleType content are mutually exclusive --> + +<!-- an attributeGroup is a named collection of attribute decls, or a + reference thereto --> +<!ELEMENT %attributeGroup; ((%annotation;)?, + (%attribute; | %attributeGroup;)*, + (%anyAttribute;)?) > +<!ATTLIST %attributeGroup; + name %NCName; #IMPLIED + id ID #IMPLIED + ref %QName; #IMPLIED + %attributeGroupAttrs;> + +<!-- ref iff no content, no name. ref iff not top level --> + +<!-- better reference mechanisms --> +<!ELEMENT %unique; ((%annotation;)?, %selector;, (%field;)+)> +<!ATTLIST %unique; + name %NCName; #REQUIRED + id ID #IMPLIED + %uniqueAttrs;> + +<!ELEMENT %key; ((%annotation;)?, %selector;, (%field;)+)> +<!ATTLIST %key; + name %NCName; #REQUIRED + id ID #IMPLIED + %keyAttrs;> + +<!ELEMENT %keyref; ((%annotation;)?, %selector;, (%field;)+)> +<!ATTLIST %keyref; + name %NCName; #REQUIRED + refer %QName; #REQUIRED + id ID #IMPLIED + %keyrefAttrs;> + +<!ELEMENT %selector; ((%annotation;)?)> +<!ATTLIST %selector; + xpath %XPathExpr; #REQUIRED + id ID #IMPLIED + %selectorAttrs;> +<!ELEMENT %field; ((%annotation;)?)> +<!ATTLIST %field; + xpath %XPathExpr; #REQUIRED + id ID #IMPLIED + %fieldAttrs;> + +<!-- Schema combination mechanisms --> +<!ELEMENT %include; (%annotation;)?> +<!ATTLIST %include; + schemaLocation %URIref; #REQUIRED + id ID #IMPLIED + %includeAttrs;> + +<!ELEMENT %import; (%annotation;)?> +<!ATTLIST %import; + namespace %URIref; #IMPLIED + schemaLocation %URIref; #IMPLIED + id ID #IMPLIED + %importAttrs;> + +<!ELEMENT %redefine; (%annotation; | %simpleType; | %complexType; | + %attributeGroup; | %group;)*> +<!ATTLIST %redefine; + schemaLocation %URIref; #REQUIRED + id ID #IMPLIED + %redefineAttrs;> + +<!ELEMENT %notation; (%annotation;)?> +<!ATTLIST %notation; + name %NCName; #REQUIRED + id ID #IMPLIED + public CDATA #REQUIRED + system %URIref; #IMPLIED + %notationAttrs;> + +<!-- Annotation is either application information or documentation --> +<!-- By having these here they are available for datatypes as well + as all the structures elements --> + +<!ELEMENT %annotation; (%appinfo; | %documentation;)*> +<!ATTLIST %annotation; %annotationAttrs;> + +<!-- User must define annotation elements in internal subset for this + to work --> +<!ELEMENT %appinfo; ANY> <!-- too restrictive --> +<!ATTLIST %appinfo; + source %URIref; #IMPLIED + id ID #IMPLIED + %appinfoAttrs;> +<!ELEMENT %documentation; ANY> <!-- too restrictive --> +<!ATTLIST %documentation; + source %URIref; #IMPLIED + id ID #IMPLIED + xml:lang CDATA #IMPLIED + %documentationAttrs;> + +<!NOTATION XMLSchemaStructures PUBLIC + 'structures' 'http://www.w3.org/2001/XMLSchema.xsd' > +<!NOTATION XML PUBLIC + 'REC-xml-1998-0210' 'http://www.w3.org/TR/1998/REC-xml-19980210' > diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/datatypes.dtd b/sca-cpp/branches/cpp-contrib/xsd/external/datatypes.dtd new file mode 100644 index 0000000000..685e89a57e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/datatypes.dtd @@ -0,0 +1,204 @@ +<!--
+ DTD for XML Schemas: Part 2: Datatypes
+ $Id: datatypes.dtd,v 1.23 2001/03/16 17:36:30 ht Exp $
+ Note this DTD is NOT normative, or even definitive. - - the
+ prose copy in the datatypes REC is the definitive version
+ (which shouldn't differ from this one except for this comment
+ and entity expansions, but just in case)
+ -->
+
+<!--
+ This DTD cannot be used on its own, it is intended
+ only for incorporation in XMLSchema.dtd, q.v.
+ -->
+
+<!-- Define all the element names, with optional prefix -->
+<!ENTITY % simpleType "%p;simpleType">
+<!ENTITY % restriction "%p;restriction">
+<!ENTITY % list "%p;list">
+<!ENTITY % union "%p;union">
+<!ENTITY % maxExclusive "%p;maxExclusive">
+<!ENTITY % minExclusive "%p;minExclusive">
+<!ENTITY % maxInclusive "%p;maxInclusive">
+<!ENTITY % minInclusive "%p;minInclusive">
+<!ENTITY % totalDigits "%p;totalDigits">
+<!ENTITY % fractionDigits "%p;fractionDigits">
+<!ENTITY % length "%p;length">
+<!ENTITY % minLength "%p;minLength">
+<!ENTITY % maxLength "%p;maxLength">
+<!ENTITY % enumeration "%p;enumeration">
+<!ENTITY % whiteSpace "%p;whiteSpace">
+<!ENTITY % pattern "%p;pattern">
+
+<!--
+ Customisation entities for the ATTLIST of each element
+ type. Define one of these if your schema takes advantage
+ of the anyAttribute='##other' in the schema for schemas
+ -->
+
+<!ENTITY % simpleTypeAttrs "">
+<!ENTITY % restrictionAttrs "">
+<!ENTITY % listAttrs "">
+<!ENTITY % unionAttrs "">
+<!ENTITY % maxExclusiveAttrs "">
+<!ENTITY % minExclusiveAttrs "">
+<!ENTITY % maxInclusiveAttrs "">
+<!ENTITY % minInclusiveAttrs "">
+<!ENTITY % totalDigitsAttrs "">
+<!ENTITY % fractionDigitsAttrs "">
+<!ENTITY % lengthAttrs "">
+<!ENTITY % minLengthAttrs "">
+<!ENTITY % maxLengthAttrs "">
+<!ENTITY % enumerationAttrs "">
+<!ENTITY % whiteSpaceAttrs "">
+<!ENTITY % patternAttrs "">
+
+<!-- Define some entities for informative use as attribute
+ types -->
+<!ENTITY % URIref "CDATA">
+<!ENTITY % XPathExpr "CDATA">
+<!ENTITY % QName "NMTOKEN">
+<!ENTITY % QNames "NMTOKENS">
+<!ENTITY % NCName "NMTOKEN">
+<!ENTITY % nonNegativeInteger "NMTOKEN">
+<!ENTITY % boolean "(true|false)">
+<!ENTITY % simpleDerivationSet "CDATA">
+<!--
+ #all or space-separated list drawn from derivationChoice
+ -->
+
+<!--
+ Note that the use of 'facet' below is less restrictive
+ than is really intended: There should in fact be no
+ more than one of each of minInclusive, minExclusive,
+ maxInclusive, maxExclusive, totalDigits, fractionDigits,
+ length, maxLength, minLength within datatype,
+ and the min- and max- variants of Inclusive and Exclusive
+ are mutually exclusive. On the other hand, pattern and
+ enumeration may repeat.
+ -->
+<!ENTITY % minBound "(%minInclusive; | %minExclusive;)">
+<!ENTITY % maxBound "(%maxInclusive; | %maxExclusive;)">
+<!ENTITY % bounds "%minBound; | %maxBound;">
+<!ENTITY % numeric "%totalDigits; | %fractionDigits;">
+<!ENTITY % ordered "%bounds; | %numeric;">
+<!ENTITY % unordered
+ "%pattern; | %enumeration; | %whiteSpace; | %length; |
+ %maxLength; | %minLength;">
+<!ENTITY % facet "%ordered; | %unordered;">
+<!ENTITY % facetAttr
+ "value CDATA #REQUIRED
+ id ID #IMPLIED">
+<!ENTITY % fixedAttr "fixed %boolean; #IMPLIED">
+<!ENTITY % facetModel "(%annotation;)?">
+<!ELEMENT %simpleType;
+ ((%annotation;)?, (%restriction; | %list; | %union;))>
+<!ATTLIST %simpleType;
+ name %NCName; #IMPLIED
+ final %simpleDerivationSet; #IMPLIED
+ id ID #IMPLIED
+ %simpleTypeAttrs;>
+<!-- name is required at top level -->
+<!ELEMENT %restriction; ((%annotation;)?,
+ (%restriction1; |
+ ((%simpleType;)?,(%facet;)*)),
+ (%attrDecls;))>
+<!ATTLIST %restriction;
+ base %QName; #IMPLIED
+ id ID #IMPLIED
+ %restrictionAttrs;>
+<!--
+ base and simpleType child are mutually exclusive,
+ one is required.
+
+ restriction is shared between simpleType and
+ simpleContent and complexContent (in XMLSchema.xsd).
+ restriction1 is for the latter cases, when this
+ is restricting a complex type, as is attrDecls.
+ -->
+<!ELEMENT %list; ((%annotation;)?,(%simpleType;)?)>
+<!ATTLIST %list;
+ itemType %QName; #IMPLIED
+ id ID #IMPLIED
+ %listAttrs;>
+<!--
+ itemType and simpleType child are mutually exclusive,
+ one is required
+ -->
+<!ELEMENT %union; ((%annotation;)?,(%simpleType;)*)>
+<!ATTLIST %union;
+ id ID #IMPLIED
+ memberTypes %QNames; #IMPLIED
+ %unionAttrs;>
+<!--
+ At least one item in memberTypes or one simpleType
+ child is required
+ -->
+
+<!ELEMENT %maxExclusive; %facetModel;>
+<!ATTLIST %maxExclusive;
+ %facetAttr;
+ %fixedAttr;
+ %maxExclusiveAttrs;>
+<!ELEMENT %minExclusive; %facetModel;>
+<!ATTLIST %minExclusive;
+ %facetAttr;
+ %fixedAttr;
+ %minExclusiveAttrs;>
+
+<!ELEMENT %maxInclusive; %facetModel;>
+<!ATTLIST %maxInclusive;
+ %facetAttr;
+ %fixedAttr;
+ %maxInclusiveAttrs;>
+<!ELEMENT %minInclusive; %facetModel;>
+<!ATTLIST %minInclusive;
+ %facetAttr;
+ %fixedAttr;
+ %minInclusiveAttrs;>
+
+<!ELEMENT %totalDigits; %facetModel;>
+<!ATTLIST %totalDigits;
+ %facetAttr;
+ %fixedAttr;
+ %totalDigitsAttrs;>
+<!ELEMENT %fractionDigits; %facetModel;>
+<!ATTLIST %fractionDigits;
+ %facetAttr;
+ %fixedAttr;
+ %fractionDigitsAttrs;>
+
+<!ELEMENT %length; %facetModel;>
+<!ATTLIST %length;
+ %facetAttr;
+ %fixedAttr;
+ %lengthAttrs;>
+<!ELEMENT %minLength; %facetModel;>
+<!ATTLIST %minLength;
+ %facetAttr;
+ %fixedAttr;
+ %minLengthAttrs;>
+<!ELEMENT %maxLength; %facetModel;>
+<!ATTLIST %maxLength;
+ %facetAttr;
+ %fixedAttr;
+ %maxLengthAttrs;>
+
+<!-- This one can be repeated -->
+<!ELEMENT %enumeration; %facetModel;>
+<!ATTLIST %enumeration;
+ %facetAttr;
+ %enumerationAttrs;>
+
+<!ELEMENT %whiteSpace; %facetModel;>
+<!ATTLIST %whiteSpace;
+ %facetAttr;
+ %fixedAttr;
+ %whiteSpaceAttrs;>
+
+<!-- This one can be repeated -->
+<!ELEMENT %pattern; %facetModel;>
+<!ATTLIST %pattern;
+ %facetAttr;
+ %patternAttrs;>
+
diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/oasis-200401-wss-wssecurity-secext-1.0.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/oasis-200401-wss-wssecurity-secext-1.0.xsd new file mode 100644 index 0000000000..641798b17f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/oasis-200401-wss-wssecurity-secext-1.0.xsd @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS's procedures with respect to rights in OASIS specifications can be found at the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification, can be obtained from the OASIS Executive Director. +OASIS invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology that may be required to implement this specification. Please address the information to the OASIS Executive Director. +Copyright © OASIS Open 2002-2004. All Rights Reserved. +This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself does not be modified in any way, such as by removing the copyright notice or references to OASIS, except as needed for the purpose of developing OASIS specifications, in which case the procedures for copyrights defined in the OASIS Intellectual Property Rights document must be followed, or as required to translate it into languages other than English. +The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. +This document and the information contained herein is provided on an “AS IS†basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +--> +<xsd:schema targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all" version="0.2"> + <xsd:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" schemaLocation="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"/> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> + <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"/> + <xsd:complexType name="AttributedString"> + <xsd:annotation> + <xsd:documentation>This type represents an element with arbitrary attributes.</xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attribute ref="wsu:Id"/> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="PasswordString"> + <xsd:annotation> + <xsd:documentation>This type is used for password elements per Section 4.1.</xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="wsse:AttributedString"> + <xsd:attribute name="Type" type="xsd:anyURI"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="EncodedString"> + <xsd:annotation> + <xsd:documentation>This type is used for elements containing stringified binary data.</xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="wsse:AttributedString"> + <xsd:attribute name="EncodingType" type="xsd:anyURI"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="UsernameTokenType"> + <xsd:annotation> + <xsd:documentation>This type represents a username token per Section 4.1</xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element name="Username" type="wsse:AttributedString"/> + <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xsd:sequence> + <xsd:attribute ref="wsu:Id"/> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:complexType> + <xsd:complexType name="BinarySecurityTokenType"> + <xsd:annotation> + <xsd:documentation>A security token that is encoded in binary</xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="wsse:EncodedString"> + <xsd:attribute name="ValueType" type="xsd:anyURI"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="KeyIdentifierType"> + <xsd:annotation> + <xsd:documentation>A security token key identifier</xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="wsse:EncodedString"> + <xsd:attribute name="ValueType" type="xsd:anyURI"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:simpleType name="tUsage"> + <xsd:annotation> + <xsd:documentation>Typedef to allow a list of usages (as URIs).</xsd:documentation> + </xsd:annotation> + <xsd:list itemType="xsd:anyURI"/> + </xsd:simpleType> + <xsd:attribute name="Usage" type="tUsage"> + <xsd:annotation> + <xsd:documentation>This global attribute is used to indicate the usage of a referenced or indicated token within the containing context</xsd:documentation> + </xsd:annotation> + </xsd:attribute> + <xsd:complexType name="ReferenceType"> + <xsd:annotation> + <xsd:documentation>This type represents a reference to an external security token.</xsd:documentation> + </xsd:annotation> + <xsd:attribute name="URI" type="xsd:anyURI"/> + <xsd:attribute name="ValueType" type="xsd:anyURI"/> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:complexType> + <xsd:complexType name="EmbeddedType"> + <xsd:annotation> + <xsd:documentation>This type represents a reference to an embedded security token.</xsd:documentation> + </xsd:annotation> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:any processContents="lax"/> + </xsd:choice> + <xsd:attribute name="ValueType" type="xsd:anyURI"/> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:complexType> + <xsd:complexType name="SecurityTokenReferenceType"> + <xsd:annotation> + <xsd:documentation>This type is used reference a security token.</xsd:documentation> + </xsd:annotation> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:any processContents="lax"/> + </xsd:choice> + <xsd:attribute ref="wsu:Id"/> + <xsd:attribute ref="wsse:Usage"/> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:complexType> + <xsd:complexType name="SecurityHeaderType"> + <xsd:annotation> + <xsd:documentation>This complexType defines header block to use for security-relevant data directed at a specific SOAP actor.</xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"> + <xsd:annotation> + <xsd:documentation>The use of "any" is to allow extensibility and different forms of security data.</xsd:documentation> + </xsd:annotation> + </xsd:any> + </xsd:sequence> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:complexType> + <xsd:complexType name="TransformationParametersType"> + <xsd:annotation> + <xsd:documentation>This complexType defines a container for elements to be specified from any namespace as properties/parameters of a DSIG transformation.</xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"> + <xsd:annotation> + <xsd:documentation>The use of "any" is to allow extensibility from any namespace.</xsd:documentation> + </xsd:annotation> + </xsd:any> + </xsd:sequence> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:complexType> + <xsd:element name="UsernameToken" type="wsse:UsernameTokenType"> + <xsd:annotation> + <xsd:documentation>This element defines the wsse:UsernameToken element per Section 4.1.</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="BinarySecurityToken" type="wsse:BinarySecurityTokenType"> + <xsd:annotation> + <xsd:documentation>This element defines the wsse:BinarySecurityToken element per Section 4.2.</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="Reference" type="wsse:ReferenceType"> + <xsd:annotation> + <xsd:documentation>This element defines a security token reference</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="Embedded" type="wsse:EmbeddedType"> + <xsd:annotation> + <xsd:documentation>This element defines a security token embedded reference</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="KeyIdentifier" type="wsse:KeyIdentifierType"> + <xsd:annotation> + <xsd:documentation>This element defines a key identifier reference</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="SecurityTokenReference" type="wsse:SecurityTokenReferenceType"> + <xsd:annotation> + <xsd:documentation>This element defines the wsse:SecurityTokenReference per Section 4.3.</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="Security" type="wsse:SecurityHeaderType"> + <xsd:annotation> + <xsd:documentation>This element defines the wsse:Security SOAP header element per Section 4.</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="TransformationParameters" type="wsse:TransformationParametersType"> + <xsd:annotation> + <xsd:documentation>This element contains properties for transformations from any namespace, including DSIG.</xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="Password" type="wsse:PasswordString"/> + <xsd:element name="Nonce" type="wsse:EncodedString"/> + <xsd:simpleType name="FaultcodeEnum"> + <xsd:restriction base="xsd:QName"> + <xsd:enumeration value="wsse:UnsupportedSecurityToken"/> + <xsd:enumeration value="wsse:UnsupportedAlgorithm"/> + <xsd:enumeration value="wsse:InvalidSecurity"/> + <xsd:enumeration value="wsse:InvalidSecurityToken"/> + <xsd:enumeration value="wsse:FailedAuthentication"/> + <xsd:enumeration value="wsse:FailedCheck"/> + <xsd:enumeration value="wsse:SecurityTokenUnavailable"/> + </xsd:restriction> + </xsd:simpleType> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/oasis-200401-wss-wssecurity-utility-1.0.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/oasis-200401-wss-wssecurity-utility-1.0.xsd new file mode 100644 index 0000000000..f8d74e9c6e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/oasis-200401-wss-wssecurity-utility-1.0.xsd @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +OASIS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on OASIS's procedures with respect to rights in OASIS specifications can be found at the OASIS website. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementors or users of this specification, can be obtained from the OASIS Executive Director. +OASIS invites any interested party to bring to its attention any copyrights, patents or patent applications, or other proprietary rights which may cover technology that may be required to implement this specification. Please address the information to the OASIS Executive Director. +Copyright © OASIS Open 2002-2004. All Rights Reserved. +This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself does not be modified in any way, such as by removing the copyright notice or references to OASIS, except as needed for the purpose of developing OASIS specifications, in which case the procedures for copyrights defined in the OASIS Intellectual Property Rights document must be followed, or as required to translate it into languages other than English. +The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns. +This document and the information contained herein is provided on an “AS IS†basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. +--> +<xsd:schema targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" + + + +xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" +elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.1"> + <!-- // Fault Codes /////////////////////////////////////////// --> + <xsd:simpleType name="tTimestampFault"> + <xsd:annotation> + <xsd:documentation> +This type defines the fault code value for Timestamp message expiration. + </xsd:documentation> + </xsd:annotation> + <xsd:restriction base="xsd:QName"> + <xsd:enumeration value="wsu:MessageExpired"/> + </xsd:restriction> + </xsd:simpleType> + <!-- // Global attributes //////////////////////////////////// --> + <xsd:attribute name="Id" type="xsd:ID"> + <xsd:annotation> + <xsd:documentation> +This global attribute supports annotating arbitrary elements with an ID. + </xsd:documentation> + </xsd:annotation> + </xsd:attribute> + <xsd:attributeGroup name="commonAtts"> + <xsd:annotation> + <xsd:documentation> +Convenience attribute group used to simplify this schema. + </xsd:documentation> + </xsd:annotation> + <xsd:attribute ref="wsu:Id" use="optional"/> + <xsd:anyAttribute namespace="##other" processContents="lax"/> + </xsd:attributeGroup> + <!-- // Utility types //////////////////////////////////////// --> + <xsd:complexType name="AttributedDateTime"> + <xsd:annotation> + <xsd:documentation> +This type is for elements whose [children] is a psuedo-dateTime and can have arbitrary attributes. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="xsd:string"> + <xsd:attributeGroup ref="wsu:commonAtts"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <xsd:complexType name="AttributedURI"> + <xsd:annotation> + <xsd:documentation> +This type is for elements whose [children] is an anyURI and can have arbitrary attributes. + </xsd:documentation> + </xsd:annotation> + <xsd:simpleContent> + <xsd:extension base="xsd:anyURI"> + <xsd:attributeGroup ref="wsu:commonAtts"/> + </xsd:extension> + </xsd:simpleContent> + </xsd:complexType> + <!-- // Timestamp header components /////////////////////////// --> + <xsd:complexType name="TimestampType"> + <xsd:annotation> + <xsd:documentation> +This complex type ties together the timestamp related elements into a composite type. + </xsd:documentation> + </xsd:annotation> + <xsd:sequence> + <xsd:element ref="wsu:Created" minOccurs="0"/> + <xsd:element ref="wsu:Expires" minOccurs="0"/> + <xsd:choice minOccurs="0" maxOccurs="unbounded"> + <xsd:any namespace="##other" processContents="lax"/> + </xsd:choice> + </xsd:sequence> + <xsd:attributeGroup ref="wsu:commonAtts"/> + </xsd:complexType> + <xsd:element name="Timestamp" type="wsu:TimestampType"> + <xsd:annotation> + <xsd:documentation> +This element allows Timestamps to be applied anywhere element wildcards are present, +including as a SOAP header. + </xsd:documentation> + </xsd:annotation> + </xsd:element> + <!-- global element decls to allow individual elements to appear anywhere --> + <xsd:element name="Expires" type="wsu:AttributedDateTime"> + <xsd:annotation> + <xsd:documentation> +This element allows an expiration time to be applied anywhere element wildcards are present. + </xsd:documentation> + </xsd:annotation> + </xsd:element> + <xsd:element name="Created" type="wsu:AttributedDateTime"> + <xsd:annotation> + <xsd:documentation> +This element allows a creation time to be applied anywhere element wildcards are present. + </xsd:documentation> + </xsd:annotation> + </xsd:element> +</xsd:schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/ws-addr.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/ws-addr.xsd new file mode 100644 index 0000000000..f6fc9c53b0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/ws-addr.xsd @@ -0,0 +1,137 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + W3C XML Schema defined in the Web Services Addressing 1.0 specification + http://www.w3.org/TR/ws-addr-core + + Copyright © 2005 World Wide Web Consortium, + + (Massachusetts Institute of Technology, European Research Consortium for + Informatics and Mathematics, Keio University). All Rights Reserved. This + work is distributed under the W3C® Software License [1] in the hope that + it will be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + + $Id: ws-addr.xsd,v 1.2 2008/07/23 13:38:16 plehegar Exp $ +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2005/08/addressing" targetNamespace="http://www.w3.org/2005/08/addressing" blockDefault="#all" elementFormDefault="qualified" finalDefault="" attributeFormDefault="unqualified"> + + <!-- Constructs from the WS-Addressing Core --> + + <xs:element name="EndpointReference" type="tns:EndpointReferenceType"/> + <xs:complexType name="EndpointReferenceType" mixed="false"> + <xs:sequence> + <xs:element name="Address" type="tns:AttributedURIType"/> + <xs:element ref="tns:ReferenceParameters" minOccurs="0"/> + <xs:element ref="tns:Metadata" minOccurs="0"/> + <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + + <xs:element name="ReferenceParameters" type="tns:ReferenceParametersType"/> + <xs:complexType name="ReferenceParametersType" mixed="false"> + <xs:sequence> + <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + + <xs:element name="Metadata" type="tns:MetadataType"/> + <xs:complexType name="MetadataType" mixed="false"> + <xs:sequence> + <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + + <xs:element name="MessageID" type="tns:AttributedURIType"/> + <xs:element name="RelatesTo" type="tns:RelatesToType"/> + <xs:complexType name="RelatesToType" mixed="false"> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:attribute name="RelationshipType" type="tns:RelationshipTypeOpenEnum" use="optional" default="http://www.w3.org/2005/08/addressing/reply"/> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:simpleType name="RelationshipTypeOpenEnum"> + <xs:union memberTypes="tns:RelationshipType xs:anyURI"/> + </xs:simpleType> + + <xs:simpleType name="RelationshipType"> + <xs:restriction base="xs:anyURI"> + <xs:enumeration value="http://www.w3.org/2005/08/addressing/reply"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="ReplyTo" type="tns:EndpointReferenceType"/> + <xs:element name="From" type="tns:EndpointReferenceType"/> + <xs:element name="FaultTo" type="tns:EndpointReferenceType"/> + <xs:element name="To" type="tns:AttributedURIType"/> + <xs:element name="Action" type="tns:AttributedURIType"/> + + <xs:complexType name="AttributedURIType" mixed="false"> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <!-- Constructs from the WS-Addressing SOAP binding --> + + <xs:attribute name="IsReferenceParameter" type="xs:boolean"/> + + <xs:simpleType name="FaultCodesOpenEnumType"> + <xs:union memberTypes="tns:FaultCodesType xs:QName"/> + </xs:simpleType> + + <xs:simpleType name="FaultCodesType"> + <xs:restriction base="xs:QName"> + <xs:enumeration value="tns:InvalidAddressingHeader"/> + <xs:enumeration value="tns:InvalidAddress"/> + <xs:enumeration value="tns:InvalidEPR"/> + <xs:enumeration value="tns:InvalidCardinality"/> + <xs:enumeration value="tns:MissingAddressInEPR"/> + <xs:enumeration value="tns:DuplicateMessageID"/> + <xs:enumeration value="tns:ActionMismatch"/> + <xs:enumeration value="tns:MessageAddressingHeaderRequired"/> + <xs:enumeration value="tns:DestinationUnreachable"/> + <xs:enumeration value="tns:ActionNotSupported"/> + <xs:enumeration value="tns:EndpointUnavailable"/> + </xs:restriction> + </xs:simpleType> + + <xs:element name="RetryAfter" type="tns:AttributedUnsignedLongType"/> + <xs:complexType name="AttributedUnsignedLongType" mixed="false"> + <xs:simpleContent> + <xs:extension base="xs:unsignedLong"> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:element name="ProblemHeaderQName" type="tns:AttributedQNameType"/> + <xs:complexType name="AttributedQNameType" mixed="false"> + <xs:simpleContent> + <xs:extension base="xs:QName"> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + + <xs:element name="ProblemIRI" type="tns:AttributedURIType"/> + + <xs:element name="ProblemAction" type="tns:ProblemActionType"/> + <xs:complexType name="ProblemActionType" mixed="false"> + <xs:sequence> + <xs:element ref="tns:Action" minOccurs="0"/> + <xs:element name="SoapAction" minOccurs="0" type="xs:anyURI"/> + </xs:sequence> + <xs:anyAttribute namespace="##other" processContents="lax"/> + </xs:complexType> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/ws-policy.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/ws-policy.xsd new file mode 100644 index 0000000000..c43e5814ed --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/ws-policy.xsd @@ -0,0 +1,141 @@ +<?xml version='1.0' encoding='utf-8' ?> +<!-- + + W3C XML Schema defined in the Web Services Policy 1.5 + Framework specification + + http://www.w3.org/TR/ws-policy-framework + + Copyright © 2006 World Wide Web Consortium, + + (Massachusetts Institute of Technology, European Research Consortium for + Informatics and Mathematics, Keio University). All Rights Reserved. This + work is distributed under the W3C® Software License [1] in the hope that + it will be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + + $Id: ws-policy.xsd,v 1.2 2007/02/14 16:38:37 fsasaki Exp $ +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" + xmlns:tns="http://www.w3.org/ns/ws-policy" + xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" + xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" + targetNamespace="http://www.w3.org/ns/ws-policy" blockDefault="#all" + elementFormDefault="qualified"> + + <xs:import + namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" + schemaLocation="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" /> + + <xs:import + namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" + schemaLocation="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" /> + + <xs:import + namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/xml.xsd" /> + + <!-- Constructs from the Web Services Policy 1.5 Framework --> + + <xs:element name="Policy" > + <xs:complexType> + + <xs:complexContent> + <xs:extension base="tns:OperatorContentType" > + <xs:attribute name="Name" type="xs:anyURI" /> + <xs:anyAttribute namespace="##any" processContents="lax" /> + </xs:extension> + </xs:complexContent> + </xs:complexType> + </xs:element> + + <xs:element name="All" type="tns:OperatorContentType" /> + <xs:element name="ExactlyOne" type="tns:OperatorContentType" /> + + <xs:complexType name="OperatorContentType" > + <xs:sequence> + <xs:choice minOccurs="0" maxOccurs="unbounded" > + <xs:element ref="tns:Policy" /> + <xs:element ref="tns:All" /> + <xs:element ref="tns:ExactlyOne" /> + + <xs:element ref="tns:PolicyReference" /> + <xs:any namespace="##other" processContents="lax" /> + </xs:choice> + </xs:sequence> + </xs:complexType> + + <xs:element name="PolicyReference" > + <xs:complexType> + <xs:sequence> + <xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="URI" type="xs:anyURI" use="required" /> + + <xs:attribute name="Digest" type="xs:base64Binary" /> + <xs:attribute name="DigestAlgorithm" + type="xs:anyURI" + default="http://www.w3.org/ns/ws-policy/Sha1Exc" + /> + <xs:anyAttribute namespace="##any" processContents="lax" /> + </xs:complexType> + </xs:element> + + <xs:attribute name="Optional" type="xs:boolean" default="false" /> + <xs:attribute name="Ignorable" type="xs:boolean" default="false" /> + + <!-- Constructs from the Web Services Policy 1.5 Attachment --> + + <xs:attribute name="PolicyURIs" > + <xs:simpleType> + <xs:list itemType="xs:anyURI" /> + </xs:simpleType> + </xs:attribute> + + <xs:element name="PolicyAttachment" > + <xs:complexType> + <xs:sequence> + + <xs:element ref="tns:AppliesTo" /> + <xs:choice maxOccurs="unbounded" > + <xs:element ref="tns:Policy" /> + <xs:element ref="tns:PolicyReference" /> + </xs:choice> + <!-- omitted only because it causes the content model to be non-determistic + <xs:element ref="wsse:Security" minOccurs="0" /> +--> + <xs:any namespace="##other" + processContents="lax" + minOccurs="0" + maxOccurs="unbounded" /> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax" /> + + </xs:complexType> + </xs:element> + + <xs:element name="AppliesTo" > + <xs:complexType> + <xs:sequence> + <xs:any namespace="##any" + processContents="lax" + maxOccurs="unbounded" /> + </xs:sequence> + <xs:anyAttribute namespace="##any" processContents="lax" /> + + </xs:complexType> + </xs:element> + + <xs:element name="URI"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:anyURI"> + <xs:anyAttribute namespace="##any" processContents="lax" /> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/wsdli.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/wsdli.xsd new file mode 100644 index 0000000000..24e0b5a975 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/wsdli.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"> +<!-- + W3C XML Schema defined in the Web Services Description (WSDL) + Version 2.0 specification + http://www.w3.org/TR/wsdl20 + + Copyright © 2007 World Wide Web Consortium, + + (Massachusetts Institute of Technology, European Research Consortium for + Informatics and Mathematics, Keio University). All Rights Reserved. This + work is distributed under the W3C® Software License [1] in the hope that + it will be useful, but WITHOUT ANY WARRANTY; without even the implied + warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 + + $Id: wsdl20-instance.xsd,v 1.1 2007/06/19 15:59:38 plehegar Exp $ +--> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdli="http://www.w3.org/ns/wsdl-instance" targetNamespace="http://www.w3.org/ns/wsdl-instance" elementFormDefault="qualified" finalDefault="" blockDefault="" attributeFormDefault="unqualified"> + + <xs:attribute name="wsdlLocation"> + <xs:annotation> + <xs:documentation> + This attribute can be used to provide some hints on where + additional WSDL information for a given namespace can be + found in order to help with QName resolution + </xs:documentation> + </xs:annotation> + <xs:simpleType> + <xs:list itemType="xs:anyURI"/> + </xs:simpleType> + </xs:attribute> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/xml.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/xml.xsd new file mode 100644 index 0000000000..ac4b0ec8e6 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/xml.xsd @@ -0,0 +1,117 @@ +<?xml version='1.0'?> +<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" > +<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en"> + + <xs:annotation> + <xs:documentation> + See http://www.w3.org/XML/1998/namespace.html and + http://www.w3.org/TR/REC-xml for information about this namespace. + + This schema document describes the XML namespace, in a form + suitable for import by other schema documents. + + Note that local names in this namespace are intended to be defined + only by the World Wide Web Consortium or its subgroups. The + following names are currently defined in this namespace and should + not be used with conflicting semantics by any Working Group, + specification, or document instance: + + base (as an attribute name): denotes an attribute whose value + provides a URI to be used as the base for interpreting any + relative URIs in the scope of the element on which it + appears; its value is inherited. This name is reserved + by virtue of its definition in the XML Base specification. + + lang (as an attribute name): denotes an attribute whose value + is a language code for the natural language of the content of + any element; its value is inherited. This name is reserved + by virtue of its definition in the XML specification. + + space (as an attribute name): denotes an attribute whose + value is a keyword indicating what whitespace processing + discipline is intended for the content of the element; its + value is inherited. This name is reserved by virtue of its + definition in the XML specification. + + Father (in any context at all): denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and + XML Coordination groups: + + In appreciation for his vision, leadership and dedication + the W3C XML Plenary on this 10th day of February, 2000 + reserves for Jon Bosak in perpetuity the XML name + xml:Father + </xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation>This schema defines attributes and an attribute group + suitable for use by + schemas wishing to allow xml:base, xml:lang or xml:space attributes + on elements they define. + + To enable this, such a schema must import this schema + for the XML namespace, e.g. as follows: + <schema . . .> + . . . + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/03/xml.xsd"/> + + Subsequently, qualified reference to any of the attributes + or the group defined below will have the desired effect, e.g. + + <type . . .> + . . . + <attributeGroup ref="xml:specialAttrs"/> + + will define a type which will schema-validate an instance + element with any of those attributes</xs:documentation> + </xs:annotation> + + <xs:annotation> + <xs:documentation>In keeping with the XML Schema WG's standard versioning + policy, this schema document will persist at + http://www.w3.org/2001/03/xml.xsd. + At the date of issue it can also be found at + http://www.w3.org/2001/xml.xsd. + The schema document at that URI may however change in the future, + in order to remain compatible with the latest version of XML Schema + itself. In other words, if the XML Schema namespace changes, the version + of this document at + http://www.w3.org/2001/xml.xsd will change + accordingly; the version at + http://www.w3.org/2001/03/xml.xsd will not change. + </xs:documentation> + </xs:annotation> + + <xs:attribute name="lang" type="xs:language"> + <xs:annotation> + <xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter + codes as the enumerated possible values . . .</xs:documentation> + </xs:annotation> + </xs:attribute> + + <xs:attribute name="space" default="preserve"> + <xs:simpleType> + <xs:restriction base="xs:NCName"> + <xs:enumeration value="default"/> + <xs:enumeration value="preserve"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + + <xs:attribute name="base" type="xs:anyURI"> + <xs:annotation> + <xs:documentation>See http://www.w3.org/TR/xmlbase/ for + information about this attribute.</xs:documentation> + </xs:annotation> + </xs:attribute> + + <xs:attributeGroup name="specialAttrs"> + <xs:attribute ref="xml:base"/> + <xs:attribute ref="xml:lang"/> + <xs:attribute ref="xml:space"/> + </xs:attributeGroup> + +</xs:schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/external/xmldsig-core-schema.xsd b/sca-cpp/branches/cpp-contrib/xsd/external/xmldsig-core-schema.xsd new file mode 100644 index 0000000000..2a767e42ea --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/external/xmldsig-core-schema.xsd @@ -0,0 +1,318 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE schema + PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd" + [ + <!ATTLIST schema + xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#"> + <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'> + <!ENTITY % p ''> + <!ENTITY % s ''> + ]> + +<!-- Schema for XML Signatures + http://www.w3.org/2000/09/xmldsig# + $Revision: 796166 $ on $Date: 2009-07-21 00:03:47 -0700 (Tue, 21 Jul 2009) $ by $Author: reagle $ + + Copyright 2001 The Internet Society and W3C (Massachusetts Institute + of Technology, Institut National de Recherche en Informatique et en + Automatique, Keio University). All Rights Reserved. + http://www.w3.org/Consortium/Legal/ + + This document is governed by the W3C Software License [1] as described + in the FAQ [2]. + + [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720 + [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD +--> + + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:ds="http://www.w3.org/2000/09/xmldsig#" + targetNamespace="http://www.w3.org/2000/09/xmldsig#" + version="0.1" elementFormDefault="qualified"> + +<!-- Basic Types Defined for Signatures --> + +<simpleType name="CryptoBinary"> + <restriction base="base64Binary"> + </restriction> +</simpleType> + +<!-- Start Signature --> + +<element name="Signature" type="ds:SignatureType"/> +<complexType name="SignatureType"> + <sequence> + <element ref="ds:SignedInfo"/> + <element ref="ds:SignatureValue"/> + <element ref="ds:KeyInfo" minOccurs="0"/> + <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="Id" type="ID" use="optional"/> +</complexType> + + <element name="SignatureValue" type="ds:SignatureValueType"/> + <complexType name="SignatureValueType"> + <simpleContent> + <extension base="base64Binary"> + <attribute name="Id" type="ID" use="optional"/> + </extension> + </simpleContent> + </complexType> + +<!-- Start SignedInfo --> + +<element name="SignedInfo" type="ds:SignedInfoType"/> +<complexType name="SignedInfoType"> + <sequence> + <element ref="ds:CanonicalizationMethod"/> + <element ref="ds:SignatureMethod"/> + <element ref="ds:Reference" maxOccurs="unbounded"/> + </sequence> + <attribute name="Id" type="ID" use="optional"/> +</complexType> + + <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/> + <complexType name="CanonicalizationMethodType" mixed="true"> + <sequence> + <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/> + <!-- (0,unbounded) elements from (1,1) namespace --> + </sequence> + <attribute name="Algorithm" type="anyURI" use="required"/> + </complexType> + + <element name="SignatureMethod" type="ds:SignatureMethodType"/> + <complexType name="SignatureMethodType" mixed="true"> + <sequence> + <element name="HMACOutputLength" minOccurs="0" type="ds:HMACOutputLengthType"/> + <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> + <!-- (0,unbounded) elements from (1,1) external namespace --> + </sequence> + <attribute name="Algorithm" type="anyURI" use="required"/> + </complexType> + +<!-- Start Reference --> + +<element name="Reference" type="ds:ReferenceType"/> +<complexType name="ReferenceType"> + <sequence> + <element ref="ds:Transforms" minOccurs="0"/> + <element ref="ds:DigestMethod"/> + <element ref="ds:DigestValue"/> + </sequence> + <attribute name="Id" type="ID" use="optional"/> + <attribute name="URI" type="anyURI" use="optional"/> + <attribute name="Type" type="anyURI" use="optional"/> +</complexType> + + <element name="Transforms" type="ds:TransformsType"/> + <complexType name="TransformsType"> + <sequence> + <element ref="ds:Transform" maxOccurs="unbounded"/> + </sequence> + </complexType> + + <element name="Transform" type="ds:TransformType"/> + <complexType name="TransformType" mixed="true"> + <choice minOccurs="0" maxOccurs="unbounded"> + <any namespace="##other" processContents="lax"/> + <!-- (1,1) elements from (0,unbounded) namespaces --> + <element name="XPath" type="string"/> + </choice> + <attribute name="Algorithm" type="anyURI" use="required"/> + </complexType> + +<!-- End Reference --> + +<element name="DigestMethod" type="ds:DigestMethodType"/> +<complexType name="DigestMethodType" mixed="true"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="Algorithm" type="anyURI" use="required"/> +</complexType> + +<element name="DigestValue" type="ds:DigestValueType"/> +<simpleType name="DigestValueType"> + <restriction base="base64Binary"/> +</simpleType> + +<!-- End SignedInfo --> + +<!-- Start KeyInfo --> + +<element name="KeyInfo" type="ds:KeyInfoType"/> +<complexType name="KeyInfoType" mixed="true"> + <choice maxOccurs="unbounded"> + <element ref="ds:KeyName"/> + <element ref="ds:KeyValue"/> + <element ref="ds:RetrievalMethod"/> + <element ref="ds:X509Data"/> + <element ref="ds:PGPData"/> + <element ref="ds:SPKIData"/> + <element ref="ds:MgmtData"/> + <any processContents="lax" namespace="##other"/> + <!-- (1,1) elements from (0,unbounded) namespaces --> + </choice> + <attribute name="Id" type="ID" use="optional"/> +</complexType> + + <element name="KeyName" type="string"/> + <element name="MgmtData" type="string"/> + + <element name="KeyValue" type="ds:KeyValueType"/> + <complexType name="KeyValueType" mixed="true"> + <choice> + <element ref="ds:DSAKeyValue"/> + <element ref="ds:RSAKeyValue"/> + <any namespace="##other" processContents="lax"/> + </choice> + </complexType> + + <element name="RetrievalMethod" type="ds:RetrievalMethodType"/> + <complexType name="RetrievalMethodType"> + <sequence> + <element ref="ds:Transforms" minOccurs="0"/> + </sequence> + <attribute name="URI" type="anyURI"/> + <attribute name="Type" type="anyURI" use="optional"/> + </complexType> + +<!-- Start X509Data --> + +<element name="X509Data" type="ds:X509DataType"/> +<complexType name="X509DataType"> + <sequence maxOccurs="unbounded"> + <choice> + <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/> + <element name="X509SKI" type="base64Binary"/> + <element name="X509SubjectName" type="string"/> + <element name="X509Certificate" type="base64Binary"/> + <element name="X509CRL" type="base64Binary"/> + <any namespace="##other" processContents="lax"/> + </choice> + </sequence> +</complexType> + +<complexType name="X509IssuerSerialType"> + <sequence> + <element name="X509IssuerName" type="string"/> + <element name="X509SerialNumber" type="integer"/> + </sequence> +</complexType> + +<!-- End X509Data --> + +<!-- Begin PGPData --> + +<element name="PGPData" type="ds:PGPDataType"/> +<complexType name="PGPDataType"> + <choice> + <sequence> + <element name="PGPKeyID" type="base64Binary"/> + <element name="PGPKeyPacket" type="base64Binary" minOccurs="0"/> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <sequence> + <element name="PGPKeyPacket" type="base64Binary"/> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + </choice> +</complexType> + +<!-- End PGPData --> + +<!-- Begin SPKIData --> + +<element name="SPKIData" type="ds:SPKIDataType"/> +<complexType name="SPKIDataType"> + <sequence maxOccurs="unbounded"> + <element name="SPKISexp" type="base64Binary"/> + <any namespace="##other" processContents="lax" minOccurs="0"/> + </sequence> +</complexType> + +<!-- End SPKIData --> + +<!-- End KeyInfo --> + +<!-- Start Object (Manifest, SignatureProperty) --> + +<element name="Object" type="ds:ObjectType"/> +<complexType name="ObjectType" mixed="true"> + <sequence minOccurs="0" maxOccurs="unbounded"> + <any namespace="##any" processContents="lax"/> + </sequence> + <attribute name="Id" type="ID" use="optional"/> + <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet --> + <attribute name="Encoding" type="anyURI" use="optional"/> +</complexType> + +<element name="Manifest" type="ds:ManifestType"/> +<complexType name="ManifestType"> + <sequence> + <element ref="ds:Reference" maxOccurs="unbounded"/> + </sequence> + <attribute name="Id" type="ID" use="optional"/> +</complexType> + +<element name="SignatureProperties" type="ds:SignaturePropertiesType"/> +<complexType name="SignaturePropertiesType"> + <sequence> + <element ref="ds:SignatureProperty" maxOccurs="unbounded"/> + </sequence> + <attribute name="Id" type="ID" use="optional"/> +</complexType> + + <element name="SignatureProperty" type="ds:SignaturePropertyType"/> + <complexType name="SignaturePropertyType" mixed="true"> + <choice maxOccurs="unbounded"> + <any namespace="##other" processContents="lax"/> + <!-- (1,1) elements from (1,unbounded) namespaces --> + </choice> + <attribute name="Target" type="anyURI" use="required"/> + <attribute name="Id" type="ID" use="optional"/> + </complexType> + +<!-- End Object (Manifest, SignatureProperty) --> + +<!-- Start Algorithm Parameters --> + +<simpleType name="HMACOutputLengthType"> + <restriction base="integer"/> +</simpleType> + +<!-- Start KeyValue Element-types --> + +<element name="DSAKeyValue" type="ds:DSAKeyValueType"/> +<complexType name="DSAKeyValueType"> + <sequence> + <sequence minOccurs="0"> + <element name="P" type="ds:CryptoBinary"/> + <element name="Q" type="ds:CryptoBinary"/> + </sequence> + <element name="G" type="ds:CryptoBinary" minOccurs="0"/> + <element name="Y" type="ds:CryptoBinary"/> + <element name="J" type="ds:CryptoBinary" minOccurs="0"/> + <sequence minOccurs="0"> + <element name="Seed" type="ds:CryptoBinary"/> + <element name="PgenCounter" type="ds:CryptoBinary"/> + </sequence> + </sequence> +</complexType> + +<element name="RSAKeyValue" type="ds:RSAKeyValueType"/> +<complexType name="RSAKeyValueType"> + <sequence> + <element name="Modulus" type="ds:CryptoBinary"/> + <element name="Exponent" type="ds:CryptoBinary"/> + </sequence> +</complexType> + +<!-- End KeyValue Element-types --> + +<!-- End Signature --> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-1.1-cd04.xsd new file mode 100644 index 0000000000..224c1254b3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-1.1-cd04.xsd @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <include schemaLocation="sca-interface-java-1.1-cd04.xsd"/> + <include schemaLocation="sca-interface-wsdl-1.1-cd04.xsd"/> + <include schemaLocation="sca-interface-cpp-1.1-cd04.xsd"/> + <include schemaLocation="sca-interface-c-1.1-cd04.xsd"/> + + <include schemaLocation="sca-implementation-java-1.1-cd03.xsd"/> + <include schemaLocation="sca-implementation-composite-1.1-cd04.xsd"/> + <include schemaLocation="sca-implementation-cpp-1.1-cd04.xsd"/> + <include schemaLocation="sca-implementation-c-1.1-cd04.xsd"/> + <include schemaLocation="sca-implementation-bpel-1.1-cd03.xsd"/> + <include schemaLocation="sca-implementation-spring-1.1-cd01.xsd"/> + + <include schemaLocation="sca-binding-ws-1.1-cd04.xsd"/> + <include schemaLocation="sca-binding-ws-callback-1.1-cd04.xsd"/> <!-- New --> + <include schemaLocation="sca-binding-jms-1.1-cd04.xsd"/> + <include schemaLocation="sca-binding-jca-1.1-cd04.xsd"/> + <include schemaLocation="sca-binding-sca-1.1-cd04.xsd"/> + <include schemaLocation="sca-binding-ejb-1.1-cd01.xsd"/> + + <include schemaLocation="sca-definitions-1.1-cd04.xsd"/> + <include schemaLocation="sca-policy-1.1-cd04.xsd"/> + + <include schemaLocation="sca-contribution-1.1-cd04.xsd"/> + <include schemaLocation="sca-contribution-cpp-1.1-cd04.xsd"/> + <include schemaLocation="sca-contribution-c-1.1-cd04.xsd"/> + <include schemaLocation="sca-contribution-java-1.1-cd02.xsd"/> + + <include schemaLocation="sca-jee-1.1-wd03.xsd"/> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ejb-1.1-cd01.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ejb-1.1-cd01.xsd new file mode 100644 index 0000000000..b8556f3632 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ejb-1.1-cd01.xsd @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. OASIS trademark, + IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd" /> + + <element name="binding.ejb" type="sca:EJBSessionBeanBinding" + substitutionGroup="sca:binding" /> + + <simpleType name="VersionValue"> + <restriction base="string"> + <enumeration value="EJB2" /> + <enumeration value="EJB3" /> + </restriction> + </simpleType> + + <complexType name="EJBSessionBeanBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="homeInterface" type="NCName" use="optional" /> + <attribute name="ejb-link-name" type="string" use="optional" /> + <attribute name="ejb-version" type="sca:VersionValue" use="optional" + default="EJB3" /> + </extension> + </complexContent> + </complexType> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-binding-jca-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-jca-1.1-cd04.xsd new file mode 100644 index 0000000000..5fd3f9d687 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-jca-1.1-cd04.xsd @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <complexType name="JCABinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <element name="outboundConnection" + type="sca:JCAOutboundConnection" minOccurs="0" /> + <element name="inboundConnection" + type="sca:JCAInboundConnection" minOccurs="0" /> + <element name="outboundInteraction" + type="sca:JCAOutboundInteraction" minOccurs="0" /> + <element name="inboundInteraction" + type="sca:JCAInboundInteraction" minOccurs="0" /> + <element name="property" type="sca:Property" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="connectionInfo" type="anyURI" use="optional" /> + <attribute name="initialContextFactory" type="anyURI" + use="optional"/> + <attribute name="jndiURL" type="anyURI" use="optional"/> + </extension> + </complexContent> + </complexType> + + <simpleType name="JCACreateResource"> + <restriction base="string"> + <enumeration value="always" /> + <enumeration value="never" /> + <enumeration value="ifNotExist" /> + </restriction> + </simpleType> + <simpleType name="ResAuth"> + <restriction base="string"> + <enumeration value="container" /> + <enumeration value="application" /> + </restriction> + </simpleType> + <complexType name="JCAOutboundConnection"> + <sequence> + <element name="resourceAdapter" type="sca:ResourceAdapter" + minOccurs="0" /> + <element name="connection" type="sca:Connection" /> + <element name="resAuth" type="sca:ResAuth" minOccurs="0" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="managed" type="boolean" use="optional" + default="true" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="JCAInboundConnection"> + <sequence> + <element name="resourceAdapter" type="sca:ResourceAdapter" /> + <element name="activationSpec" type="sca:ActivationSpec" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="JCAOutboundInteraction"> + <sequence> + <element name="connectionSpec" type="sca:ConnectionSpec" + minOccurs="0" /> + <element name="interactionSpec" type="sca:InteractionSpec" + minOccurs="0" /> + <element name="operation" type="sca:Operation" minOccurs="0" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="JCAInboundInteraction"> + <sequence> + <element name="listener" type="string" minOccurs="0" /> + <element name="inboundOperation" type="sca:InboundOperation" + minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="ResourceAdapter"> + <sequence> + <element name="property" type="sca:Property" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NMTOKEN" use="optional" /> + <attribute name="type" type="NMTOKEN" use="required" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="Connection"> + <sequence> + <element name="property" type="sca:Property" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NMTOKEN" use="optional" /> + <attribute name="type" type="NMTOKEN" use="required" /> + <attribute name="create" type="sca:JCACreateResource" use="optional" + default="ifNotExist" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="ActivationSpec"> + <sequence> + <element name="property" type="sca:Property" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NMTOKEN" use="optional" /> + <attribute name="type" type="NMTOKEN" use="required" /> + <attribute name="create" type="sca:JCACreateResource" use="optional" + default="ifNotExist"/> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="Operation"> + <sequence> + <element name="interactionSpec" type="sca:InteractionSpec" + minOccurs="0" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NMTOKEN" use="required" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="InboundOperation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NMTOKEN" use="required" /> + <attribute name="nativeOperation" type="string" use="required" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="ConnectionSpec"> + <sequence> + <element name="property" type="sca:Property" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="type" type="NMTOKEN" use="required" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + <complexType name="InteractionSpec"> + <sequence> + <element name="property" type="sca:Property" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="type" type="NMTOKEN" use="required" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + + <element name="binding.jca" type="sca:JCABinding" + substitutionGroup="sca:binding" /> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-binding-jms-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-jms-1.1-cd04.xsd new file mode 100644 index 0000000000..e1838dddf0 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-jms-1.1-cd04.xsd @@ -0,0 +1,183 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <complexType name="JMSBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <element name="destination" type="sca:JMSDestination" + minOccurs="0"/> + <choice minOccurs="0" maxOccurs="1"> + <element name="connectionFactory" + type="sca:JMSConnectionFactory"/> + <element name="activationSpec" type="sca:JMSActivationSpec"/> + </choice> + <element name="response" type="sca:JMSResponse" minOccurs="0"/> + <element name="headers" type="sca:JMSHeaders" minOccurs="0"/> + <element name="messageSelection" type="sca:JMSMessageSelection" + minOccurs="0"/> + <element name="resourceAdapter" type="sca:JMSResourceAdapter" + minOccurs="0"/> + <element name="operationProperties" + type="sca:JMSOperationProperties" + minOccurs="0" maxOccurs="unbounded"/> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="correlationScheme" type="QName" + default="sca:messageId"/> + <attribute name="initialContextFactory" type="anyURI"/> + <attribute name="jndiURL" type="anyURI"/> + <attribute name="requestConnection" type="QName"/> + <attribute name="responseConnection" type="QName"/> + <attribute name="operationProperties" type="QName"/> + </extension> + </complexContent> + </complexType> + + <simpleType name="JMSCreateResource"> + <restriction base="string"> + <enumeration value="always"/> + <enumeration value="never"/> + <enumeration value="ifNotExist"/> + </restriction> + </simpleType> + + <complexType name="JMSDestination"> + <sequence> + <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="jndiName" type="anyURI" use="required"/> + <attribute name="type" use="optional" default="queue"> + <simpleType> + <restriction base="string"> + <enumeration value="queue"/> + <enumeration value="topic"/> + </restriction> + </simpleType> + </attribute> + <attribute name="create" type="sca:JMSCreateResource" + use="optional" default="ifNotExist"/> + </complexType> + + <complexType name="JMSConnectionFactory"> + <sequence> <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="jndiName" type="anyURI" use="required"/> + <attribute name="create" type="sca:JMSCreateResource" + use="optional" default="ifNotExist"/> + </complexType> + + <complexType name="JMSActivationSpec"> + <sequence> + <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="jndiName" type="anyURI" use="required"/> + <attribute name="create" type="sca:JMSCreateResource" + use="optional" default="ifNotExist"/> + </complexType> + + <complexType name="JMSResponse"> + <sequence> + <element name="wireFormat" type="sca:WireFormatType" minOccurs="0"/> + <element name="destination" type="sca:JMSDestination" minOccurs="0"/> + <choice minOccurs="0"> + <element name="connectionFactory" type="sca:JMSConnectionFactory"/> + <element name="activationSpec" type="sca:JMSActivationSpec"/> + </choice> + + <!-- TUSCANY-3297 --> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + + </sequence> + </complexType> + + <complexType name="JMSHeaders"> + <sequence> + <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="type" type="string"/> + <attribute name="deliveryMode"> + <simpleType> + <restriction base="string"> + <enumeration value="persistent"/> + <enumeration value="nonpersistent"/> + </restriction> + </simpleType> + </attribute> + <attribute name="timeToLive" type="long"/> + <attribute name="priority"> + <simpleType> + <restriction base="string"> + <enumeration value="0"/> + <enumeration value="1"/> + <enumeration value="2"/> + <enumeration value="3"/> + <enumeration value="4"/> + <enumeration value="5"/> + <enumeration value="6"/> + <enumeration value="7"/> + <enumeration value="8"/> + <enumeration value="9"/> + </restriction> + </simpleType> + </attribute> + </complexType> + + <complexType name="JMSMessageSelection"> + <sequence> + <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="selector" type="string"/> + </complexType> + + <complexType name="JMSResourceAdapter"> + <sequence> + <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="string" use="required"/> + </complexType> + + <complexType name="JMSOperationProperties"> + <sequence> + <element name="property" type="sca:BindingProperty" + minOccurs="0" maxOccurs="unbounded"/> + <element name="headers" type="sca:JMSHeaders"/> + </sequence> + <attribute name="name" type="string" use="required"/> + <attribute name="nativeOperation" type="string"/> + </complexType> + + <complexType name="BindingProperty"> + <simpleContent> + <extension base="string"> + <attribute name="name" type="NMTOKEN"/> + <attribute name="type" type="string" use="optional" + default="xs:string"/> + </extension> + </simpleContent> + </complexType> + + <element name="binding.jms" type="sca:JMSBinding" + substitutionGroup="sca:binding"/> + + <element name="wireFormat.jmsDefault" type="sca:WireFormatType" + substitutionGroup="sca:wireFormat"/> + + <element name="operationSelector.jmsDefault" type="sca:OperationSelectorType" + substitutionGroup="sca:operationSelector"/> +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-binding-sca-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-sca-1.1-cd04.xsd new file mode 100644 index 0000000000..d607d8730f --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-sca-1.1-cd04.xsd @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <!-- SCA Binding --> + <element name="binding.sca" type="sca:SCABinding" + substitutionGroup="sca:binding"/> + <complexType name="SCABinding"> + <complexContent> + <extension base="sca:Binding"/> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ws-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ws-1.1-cd04.xsd new file mode 100644 index 0000000000..8e5a72b493 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ws-1.1-cd04.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:wsdli="http://www.w3.org/ns/wsdl-instance" + xmlns:wsa="http://www.w3.org/2005/08/addressing" + elementFormDefault="qualified"> + + <import namespace="http://www.w3.org/ns/wsdl-instance" + schemaLocation="http://www.w3.org/2007/05/wsdl/wsdl20-instance.xsd"/> + <import namespace="http://www.w3.org/2005/08/addressing" + schemaLocation="http://www.w3.org/2006/03/addressing/ws-addr.xsd"/> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <element name="binding.ws" type="sca:WebServiceBinding" + substitutionGroup="sca:binding"/> + + <complexType name="WebServiceBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <element name="endpointReference" type="wsa:EndpointReferenceType" + minOccurs="0" maxOccurs="unbounded"/> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="wsdlElement" type="anyURI" use="optional"/> + <attribute ref="wsdli:wsdlLocation" use="optional"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ws-callback-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ws-callback-1.1-cd04.xsd new file mode 100644 index 0000000000..874e36bab8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-binding-ws-callback-1.1-cd04.xsd @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) Copyright OASIS 2005, 2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply --> + +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <element name="WSCallback"> + <complexType> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + </element> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-1.1-cd04.xsd new file mode 100644 index 0000000000..f17675a8b1 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-1.1-cd04.xsd @@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <!-- Contribution --> + <element name="contribution" type="sca:ContributionType"/> + <complexType name="ContributionType"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <element name="deployable" type="sca:DeployableType" + minOccurs="0" maxOccurs="unbounded"/> + <element ref="sca:importBase" minOccurs="0" + maxOccurs="unbounded"/> + <element ref="sca:exportBase" minOccurs="0" + maxOccurs="unbounded"/> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + </extension> + </complexContent> + </complexType> + + <!-- Deployable --> + <complexType name="DeployableType"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="composite" type="QName" use="required"/> + </extension> + </complexContent> + </complexType> + + <!-- Import --> + <element name="importBase" type="sca:Import" abstract="true" /> + <complexType name="Import" abstract="true"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + </extension> + </complexContent> + </complexType> + + <element name="import" type="sca:ImportType" + substitutionGroup="sca:importBase"/> + <complexType name="ImportType"> + <complexContent> + <extension base="sca:Import"> + <attribute name="namespace" type="string" use="required"/> + <attribute name="location" type="anyURI" use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Export --> + <element name="exportBase" type="sca:Export" abstract="true" /> + <complexType name="Export" abstract="true"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + </extension> + </complexContent> + </complexType> + + <element name="export" type="sca:ExportType" + substitutionGroup="sca:exportBase"/> + <complexType name="ExportType"> + <complexContent> + <extension base="sca:Export"> + <attribute name="namespace" type="string" use="required"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-c-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-c-1.1-cd04.xsd new file mode 100644 index 0000000000..f765eaae85 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-c-1.1-cd04.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2007,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-contribution-1.1-cd04.xsd" /> + + <element name="export.c" type="sca:CExport" + substitutionGroup="sca:exportBase" /> + + <complexType name="CExport"> + <complexContent> + <extension base="sca:Export"> + <attribute name="name" type="QName" use="required" /> + <attribute name="path" type="string" use="optional" /> + </extension> + </complexContent> + </complexType> + + <element name="import.c" type="sca:CImport" + substitutionGroup="sca:importBase" /> + + <complexType name="CImport"> + <complexContent> + <extension base="sca:Import"> + <attribute name="name" type="QName" use="required" /> + <attribute name="location" type="string" use="required" /> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-cpp-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-cpp-1.1-cd04.xsd new file mode 100644 index 0000000000..f98c6dc040 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-cpp-1.1-cd04.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2006,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-contribution-1.1-cd04.xsd" /> + + <element name="export.cpp" type="sca:CPPExport" + substitutionGroup="sca:exportBase" /> + + <complexType name="CPPExport"> + <complexContent> + <extension base="sca:Export"> + <attribute name="name" type="QName" use="required" /> + <attribute name="path" type="string" use="optional" /> + </extension> + </complexContent> + </complexType> + + <element name="import.cpp" type="sca:CPPImport" + substitutionGroup="sca:importBase" /> + + <complexType name="CPPImport"> + <complexContent> + <extension base="sca:Import"> + <attribute name="name" type="QName" use="required" /> + <attribute name="location" type="string" use="required" /> + </extension> + </complexContent> + </complexType> + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-java-1.1-cd02.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-java-1.1-cd02.xsd new file mode 100644 index 0000000000..7bad3bfc2a --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-contribution-java-1.1-cd02.xsd @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-contribution-1.1-cd04.xsd"/> + + <!-- Import.java --> + <element name="import.java" type="sca:JavaImportType" + substitutionGroup="sca:importBase" /> + <complexType name="JavaImportType"> + <complexContent> + <extension base="sca:Import"> + <attribute name="package" type="string" use="required"/> + <attribute name="location" type="anyURI" use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Export.java --> + <element name="export.java" type="sca:JavaExportType" + substitutionGroup="sca:exportBase" /> + <complexType name="JavaExportType"> + <complexContent> + <extension base="sca:Export"> + <attribute name="package" type="string" use="required"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-core-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-core-1.1-cd04.xsd new file mode 100644 index 0000000000..158daff214 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-core-1.1-cd04.xsd @@ -0,0 +1,534 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <import namespace="http://www.w3.org/XML/1998/namespace" + schemaLocation="http://www.w3.org/2001/xml.xsd"/> + + <!-- Common extension base for SCA definitions --> + <complexType name="CommonExtensionBase"> + <sequence> + <element ref="sca:documentation" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <element name="documentation" type="sca:Documentation"/> + <complexType name="Documentation" mixed="true"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute ref="xml:lang"/> + </complexType> + + <!-- Component Type --> + <element name="componentType" type="sca:ComponentType"/> + <complexType name="ComponentType"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <!-- Comment out the sca:implementation to workaround http://www.mail-archive.com/dev@tuscany.apache.org/msg08924.html. --> + <!-- + <element ref="sca:implementation" minOccurs="0"/> + --> + <choice minOccurs="0" maxOccurs="unbounded"> + <element name="service" type="sca:ComponentService"/> + <element name="reference" + type="sca:ComponentTypeReference"/> + <element name="property" type="sca:Property"/> + </choice> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="constrainingType" type="QName" use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Composite --> + <element name="composite" type="sca:Composite"/> + <complexType name="Composite"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <element ref="sca:include" minOccurs="0" + maxOccurs="unbounded"/> + <choice minOccurs="0" maxOccurs="unbounded"> + <element name="service" type="sca:Service"/> + <element name="property" type="sca:Property"/> + <element name="component" type="sca:Component"/> + <element name="reference" type="sca:Reference"/> + <element name="wire" type="sca:Wire"/> + </choice> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="targetNamespace" type="anyURI" use="required"/> + <attribute name="local" type="boolean" use="optional" + default="false"/> + <attribute name="autowire" type="boolean" use="optional" + default="false"/> + <attribute name="constrainingType" type="QName" use="optional"/> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Contract base type for Service, Reference --> + <complexType name="Contract" abstract="true"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <element ref="sca:interface" minOccurs="0" maxOccurs="1" /> + <element ref="sca:binding" minOccurs="0" + maxOccurs="unbounded" /> + <element ref="sca:callback" minOccurs="0" maxOccurs="1" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <attribute name="requires" type="sca:listOfQNames" + use="optional" /> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Service --> + <complexType name="Service"> + <complexContent> + <extension base="sca:Contract"> + <attribute name="promote" type="anyURI" use="required"/> + </extension> + </complexContent> + </complexType> + + <!-- Interface --> + <element name="interface" type="sca:Interface" abstract="true"/> + <complexType name="Interface" abstract="true"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <attribute name="remotable" type="boolean" use="optional"/> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Reference --> + <complexType name="Reference"> + <complexContent> + <extension base="sca:Contract"> + <attribute name="autowire" type="boolean" use="optional"/> + <attribute name="target" type="sca:listOfAnyURIs" + use="optional"/> + <attribute name="wiredByImpl" type="boolean" use="optional" + default="false"/> + <attribute name="multiplicity" type="sca:Multiplicity" + use="optional" default="1..1"/> + <attribute name="promote" type="sca:listOfAnyURIs" + use="required"/> + </extension> + </complexContent> + </complexType> + + <!-- Property --> + <complexType name="SCAPropertyBase" mixed="true"> + <sequence> + <any namespace="##any" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + <!-- NOT an extension point; This any exists to accept + the element-based or complex type property + i.e. no element-based extension point under "sca:property" --> + </sequence> + <!-- mixed="true" to handle simple type --> + <attribute name="requires" type="sca:listOfQNames" use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" use="optional"/> + </complexType> + + <complexType name="Property" mixed="true"> + <complexContent mixed="true"> + <extension base="sca:SCAPropertyBase"> + <attribute name="name" type="NCName" use="required"/> + <attribute name="type" type="QName" use="optional"/> + <attribute name="element" type="QName" use="optional"/> + <attribute name="many" type="boolean" use="optional" + default="false"/> + <attribute name="mustSupply" type="boolean" use="optional" + default="false"/> + <anyAttribute namespace="##other" processContents="lax"/> + </extension> + <!-- extension defines the place to hold default value --> + <!-- an extension point ; attribute-based only --> + </complexContent> + </complexType> + + <!-- ConstrainingProperty is equivalent to the Property type but removes + the capability to contain a value --> + <complexType name="ConstrainingProperty" mixed="true"> + <complexContent mixed="true"> + <restriction base="sca:Property"> + <attribute name="name" type="NCName" use="required"/> + <attribute name="type" type="QName" use="optional"/> + <attribute name="element" type="QName" use="optional"/> + <attribute name="many" type="boolean" use="optional" + default="false"/> + <attribute name="mustSupply" type="boolean" use="optional" + default="false"/> + <anyAttribute namespace="##other" processContents="lax"/> + </restriction> + </complexContent> + </complexType> + + <complexType name="PropertyValue" mixed="true"> + <complexContent mixed="true"> + <extension base="sca:SCAPropertyBase"> + <attribute name="name" type="NCName" use="required"/> + <attribute name="type" type="QName" use="optional"/> + <attribute name="element" type="QName" use="optional"/> + <attribute name="many" type="boolean" use="optional" + default="false"/> + <attribute name="source" type="string" use="optional"/> + <attribute name="file" type="anyURI" use="optional"/> + <attribute name="value" type="string" use="optional"/> + <anyAttribute namespace="##other" processContents="lax"/> + </extension> + <!-- an extension point ; attribute-based only --> + </complexContent> + </complexType> + + <!-- Binding --> + <element name="binding" type="sca:Binding" abstract="true"/> + <complexType name="Binding" abstract="true"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <element ref="sca:wireFormat" minOccurs="0" maxOccurs="1" /> + <element ref="sca:operationSelector" minOccurs="0" + maxOccurs="1" /> + </sequence> + <attribute name="uri" type="anyURI" use="optional"/> + <attribute name="name" type="NCName" use="optional"/> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Binding Type --> + <element name="bindingType" type="sca:BindingType"/> + <complexType name="BindingType"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="type" type="QName" use="required"/> + <attribute name="alwaysProvides" type="sca:listOfQNames" + use="optional"/> + <attribute name="mayProvide" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- WireFormat Type --> + <element name="wireFormat" type="sca:WireFormatType" abstract="true"/> + <complexType name="WireFormatType" abstract="true"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <!-- OperationSelector Type --> + <element name="operationSelector" type="sca:OperationSelectorType" abstract="true"/> + <complexType name="OperationSelectorType" abstract="true"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <!-- Callback --> + <element name="callback" type="sca:Callback"/> + <complexType name="Callback"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <choice minOccurs="0" maxOccurs="unbounded"> + <element ref="sca:binding"/> + <any namespace="##other" processContents="lax"/> + </choice> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Component --> + <complexType name="Component"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <!-- Set minOccurs="1" instead of "0" to workaround http://www.mail-archive.com/dev@tuscany.apache.org/msg08924.html. --> + <element ref="sca:implementation" minOccurs="1"/> + <choice minOccurs="0" maxOccurs="unbounded"> + <element name="service" type="sca:ComponentService"/> + <element name="reference" type="sca:ComponentReference"/> + <element name="property" type="sca:PropertyValue"/> + </choice> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="autowire" type="boolean" use="optional"/> + <attribute name="constrainingType" type="QName" use="optional"/> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Component Service --> + <complexType name="ComponentService"> + <complexContent> + <extension base="sca:Contract"> + </extension> + </complexContent> + </complexType> + + <!-- Constraining Service --> + <complexType name="ConstrainingService"> + <complexContent> + <restriction base="sca:ComponentService"> + <sequence> + <element ref="sca:interface" minOccurs="0" maxOccurs="1" /> + <element ref="sca:callback" minOccurs="0" maxOccurs="1" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + </restriction> + </complexContent> + </complexType> + + + <!-- Component Reference --> + <complexType name="ComponentReference"> + <complexContent> + <extension base="sca:Contract"> + <attribute name="autowire" type="boolean" use="optional"/> + <attribute name="target" type="sca:listOfAnyURIs" + use="optional"/> + <attribute name="wiredByImpl" type="boolean" use="optional" + default="false"/> + <attribute name="multiplicity" type="sca:Multiplicity" + use="optional" default="1..1"/> + <attribute name="nonOverridable" type="boolean" use="optional" + default="false"/> + </extension> + </complexContent> + </complexType> + + <!-- Constraining Reference --> + <complexType name="ConstrainingReference"> + <complexContent> + <restriction base="sca:ComponentReference"> + <sequence> + <element ref="sca:interface" minOccurs="0" maxOccurs="1" /> + <element ref="sca:callback" minOccurs="0" maxOccurs="1" /> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded" /> + </sequence> + <attribute name="name" type="NCName" use="required" /> + <attribute name="autowire" type="boolean" use="optional"/> + <attribute name="wiredByImpl" type="boolean" use="optional" + default="false"/> + <attribute name="multiplicity" type="sca:Multiplicity" + use="optional" default="1..1"/> + </restriction> + </complexContent> + </complexType> + + <!-- Component Type Reference --> + <complexType name="ComponentTypeReference"> + <complexContent> + <restriction base="sca:ComponentReference"> + <sequence> + <element ref="sca:documentation" minOccurs="0" + maxOccurs="unbounded"/> + <element ref="sca:interface" minOccurs="0"/> + <element ref="sca:binding" minOccurs="0" + maxOccurs="unbounded"/> + <element ref="sca:callback" minOccurs="0"/> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="autowire" type="boolean" use="optional"/> + <attribute name="wiredByImpl" type="boolean" use="optional" + default="false"/> + <attribute name="multiplicity" type="sca:Multiplicity" + use="optional" default="1..1"/> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + <anyAttribute namespace="##other" processContents="lax"/> + </restriction> + </complexContent> + </complexType> + + + <!-- Implementation --> + <element name="implementation" type="sca:Implementation" abstract="true"/> + <complexType name="Implementation" abstract="true"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="policySets" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Implementation Type --> + <element name="implementationType" type="sca:ImplementationType"/> + <complexType name="ImplementationType"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="type" type="QName" use="required"/> + <attribute name="alwaysProvides" type="sca:listOfQNames" + use="optional"/> + <attribute name="mayProvide" type="sca:listOfQNames" + use="optional"/> + </extension> + </complexContent> + </complexType> + + <!-- Wire --> + <complexType name="Wire"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="source" type="anyURI" use="required"/> + <attribute name="target" type="anyURI" use="required"/> + <attribute name="replace" type="boolean" use="optional" + default="false"/> + </extension> + </complexContent> + </complexType> + + <!-- Include --> + <element name="include" type="sca:Include"/> + <complexType name="Include"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <attribute name="name" type="QName"/> + </extension> + </complexContent> + </complexType> + + <!-- Constraining Type --> + <element name="constrainingType" type="sca:ConstrainingType"/> + <complexType name="ConstrainingType"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <sequence> + <choice minOccurs="0" maxOccurs="unbounded"> + <element name="service" type="sca:ConstrainingService"/> + <element name="reference" + type="sca:ConstrainingReference"/> + <element name="property" type="sca:ConstrainingProperty"/> + </choice> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="targetNamespace" type="anyURI"/> + </extension> + </complexContent> + </complexType> + + <!-- Intents within WSDL documents --> + <attribute name="requires" type="sca:listOfQNames"/> + + <!-- Global attribute definition for @callback to mark a WSDL port type + as having a callback interface defined in terms of a second port + type. --> + <attribute name="callback" type="anyURI"/> + + <!-- Value type definition for property values --> + <element name="value" type="sca:ValueType"/> + <complexType name="ValueType" mixed="true"> + <sequence> + <any namespace="##any" processContents="lax" minOccurs="0" maxOccurs='unbounded'/> + </sequence> + <!-- mixed="true" to handle simple type --> + <anyAttribute namespace="##any" processContents="lax"/> + </complexType> + + <!-- Miscellaneous simple type definitions --> + <simpleType name="Multiplicity"> + <restriction base="string"> + <enumeration value="0..1"/> + <enumeration value="1..1"/> + <enumeration value="0..n"/> + <enumeration value="1..n"/> + </restriction> + </simpleType> + + <simpleType name="OverrideOptions"> + <restriction base="string"> + <enumeration value="no"/> + <enumeration value="may"/> + <enumeration value="must"/> + </restriction> + </simpleType> + + <simpleType name="listOfQNames"> + <list itemType="QName"/> + </simpleType> + + <simpleType name="listOfAnyURIs"> + <list itemType="anyURI"/> + </simpleType> + + <simpleType name="CreateResource"> + <restriction base="string"> + <enumeration value="always" /> + <enumeration value="never" /> + <enumeration value="ifnotexist" /> + </restriction> + </simpleType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-definitions-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-definitions-1.1-cd04.xsd new file mode 100644 index 0000000000..ef22e1dd3e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-definitions-1.1-cd04.xsd @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + <include schemaLocation="sca-policy-1.1-cd04.xsd"/> + + <!-- Definitions --> + <element name="definitions" type="sca:tDefinitions"/> + <complexType name="tDefinitions"> + <complexContent> + <extension base="sca:CommonExtensionBase"> + <choice minOccurs="0" maxOccurs="unbounded"> + <element ref="sca:intent"/> + <element ref="sca:policySet"/> + <element ref="sca:binding"/> + <element ref="sca:bindingType"/> + <element ref="sca:implementationType"/> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </choice> + <attribute name="targetNamespace" type="anyURI" use="required"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-bpel-1.1-cd03.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-bpel-1.1-cd03.xsd new file mode 100644 index 0000000000..0d5b747253 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-bpel-1.1-cd03.xsd @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved.
+ OASIS trademark, IPR and other policies apply. -->
+<schema
+ targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified">
+
+ <!-- SCA-Assembly XML Schema -->
+ <include schemaLocation="sca-core-1.1-cd04.xsd" />
+
+ <!-- SCA-BPEL Component Implementation Type -->
+ <element name="implementation.bpel"
+ type="sca:BPELImplementation" substitutionGroup="sca:implementation" />
+
+ <complexType name="BPELImplementation">
+ <complexContent>
+ <extension base="sca:Implementation">
+ <sequence>
+ <any namespace="##other" processContents="lax"
+ minOccurs="0" maxOccurs="unbounded" />
+ </sequence>
+ <attribute name="process" type="QName" use="required" />
+ <anyAttribute namespace="##other" processContents="lax" />
+ </extension>
+ </complexContent>
+ </complexType>
+
+</schema>
+
diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-c-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-c-1.1-cd04.xsd new file mode 100644 index 0000000000..e408f727f8 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-c-1.1-cd04.xsd @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2007,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd" /> + + <element name="implementation.c" type="sca:CImplementation" + substitutionGroup="sca:implementation" /> + + <complexType name="CImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <element name="operation" + type="sca:CImplementationFunction" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="module" type="NCName" use="required" /> + <attribute name="path" type="string" use="optional" /> + <attribute name="library" type="boolean" use="optional" /> + <attribute name="componentType" type="string" use="required" /> + <attribute name="scope" type="sca:CImplementationScope" + use="optional" /> + <attribute name="eagerInit" type="boolean" + use="optional" /> + <attribute name="init" type="boolean" use="optional" /> + <attribute name="destoy" type="boolean" use="optional" /> + <attribute name="allowsPassByReference" type="boolean" + use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <simpleType name="CImplementationScope"> + <restriction base="string"> + <enumeration value="stateless" /> + <enumeration value="composite" /> + </restriction> + </simpleType> + + <complexType name="CImplementationFunction"> + <attribute name="name" type="NCName" use="required" /> + <attribute name="allowsPassByReference" type="boolean" + use="optional" /> + <attribute name="init" type="boolean" use="optional" /> + <attribute name="destoy" type="boolean" use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-composite-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-composite-1.1-cd04.xsd new file mode 100644 index 0000000000..c0517b0a32 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-composite-1.1-cd04.xsd @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <!-- Composite Implementation --> + <element name="implementation.composite" type="sca:SCAImplementation" + substitutionGroup="sca:implementation"/> + <complexType name="SCAImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="QName" use="required"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-cpp-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-cpp-1.1-cd04.xsd new file mode 100644 index 0000000000..b71eda300d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-cpp-1.1-cd04.xsd @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2006,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd" /> + + <element name="implementation.cpp" type="sca:CPPImplementation" + substitutionGroup="sca:implementation" /> + <complexType name="CPPImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <element name="function" + type="sca:CPPImplementationFunction" minOccurs="0" + maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="library" type="NCName" use="required" /> + <attribute name="header" type="NCName" use="required" /> + <attribute name="path" type="string" use="optional" /> + <attribute name="class" type="Name" use="optional" /> + <attribute name="componentType" type="string" + use="optional" /> + <attribute name="scope" + type="sca:CPPImplementationScope" use="optional" /> + <attribute name="eagerInit" type="boolean" + use="optional" /> + <attribute name="allowsPassByReference" type="boolean" + use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <simpleType name="CPPImplementationScope"> + <restriction base="string"> + <enumeration value="stateless" /> + <enumeration value="composite" /> + </restriction> + </simpleType> + + <complexType name="CPPImplementationFunction"> + <attribute name="name" type="NCName" use="required" /> + <attribute name="allowsPassByReference" type="boolean" + use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-java-1.1-cd03.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-java-1.1-cd03.xsd new file mode 100644 index 0000000000..aac845ff59 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-java-1.1-cd03.xsd @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <!-- Java Implementation --> + <element name="implementation.java" type="sca:JavaImplementation" + substitutionGroup="sca:implementation"/> + <complexType name="JavaImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="class" type="NCName" use="required"/> + <anyAttribute namespace="##other" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-spring-1.1-cd01.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-spring-1.1-cd01.xsd new file mode 100644 index 0000000000..cce7738dff --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-implementation-spring-1.1-cd01.xsd @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + <element name="implementation.spring" type="sca:SpringImplementation" substitutionGroup="sca:implementation"/> + <complexType name="SpringImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="location" type="anyURI" use="required"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-interface-c-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-c-1.1-cd04.xsd new file mode 100644 index 0000000000..d5bff5d542 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-c-1.1-cd04.xsd @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2007,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd" /> + + <element name="interface.c" type="sca:CInterface" + substitutionGroup="sca:interface" /> + + <complexType name="CInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <element name="function" type="sca:CFunction" + minOccurs="0" maxOccurs="unbounded" /> + <element name="callbackFunction" + type="sca:CFunction" minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="header" type="string" use="required" /> + <attribute name="callbackHeader" type="string" + use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <complexType name="CFunction"> + <attribute name="name" type="NCName" use="required" /> + <attribute name="requires" type="sca:listOfQNames" + use="optional" /> + <attribute name="oneWay" type="boolean" use="optional" /> + <attribute name="input" type="NCName" use="optional" /> + <attribute name="output" type="NCName" use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-interface-cpp-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-cpp-1.1-cd04.xsd new file mode 100644 index 0000000000..e3e3c9369e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-cpp-1.1-cd04.xsd @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2006,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd" /> + + <element name="interface.cpp" type="sca:CPPInterface" + substitutionGroup="sca:interface" /> + + <complexType name="CPPInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <element name="function" type="sca:CPPFunction" + minOccurs="0" maxOccurs="unbounded" /> + <element name="callbackFunction" + type="sca:CPPFunction" minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded" /> + </sequence> + <attribute name="header" type="string" use="required" /> + <attribute name="class" type="Name" use="required" /> + <attribute name="callbackHeader" type="string" + use="optional" /> + <attribute name="callbackClass" type="Name" + use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </extension> + </complexContent> + </complexType> + + <complexType name="CPPFunction"> + <attribute name="name" type="NCName" use="required" /> + <attribute name="requires" type="sca:listOfQNames" + use="optional" /> + <attribute name="oneWay" type="boolean" use="optional" /> + <anyAttribute namespace="##other" processContents="lax" /> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-interface-java-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-java-1.1-cd04.xsd new file mode 100644 index 0000000000..7d3a536b8c --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-java-1.1-cd04.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <!-- Java Interface --> + <element name="interface.java" type="sca:JavaInterface" + substitutionGroup="sca:interface"/> + <complexType name="JavaInterface"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="interface" type="NCName" use="required"/> + <attribute name="callbackInterface" type="NCName" + use="optional"/> + <anyAttribute namespace="##other" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-interface-wsdl-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-wsdl-1.1-cd04.xsd new file mode 100644 index 0000000000..3f0be7dc6d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-interface-wsdl-1.1-cd04.xsd @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + + <!-- WSDL Interface --> + <element name="interface.wsdl" type="sca:WSDLPortType" + substitutionGroup="sca:interface"/> + <complexType name="WSDLPortType"> + <complexContent> + <extension base="sca:Interface"> + <sequence> + <any namespace="##other" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <attribute name="interface" type="anyURI" use="required"/> + <attribute name="callbackInterface" type="anyURI" + use="optional"/> + <anyAttribute namespace="##other" processContents="lax"/> + </extension> + </complexContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-jee-1.1-wd03.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-jee-1.1-wd03.xsd new file mode 100644 index 0000000000..18daa8c926 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-jee-1.1-wd03.xsd @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. OASIS trademark, IPR and other policies apply. -->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+ xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912"
+ elementFormDefault="qualified">
+
+ <include schemaLocation="sca-core-1.1-cd04.xsd"/>
+
+ <element name="implementation.ejb" type="sca:EJBImplementation"
+ substitutionGroup="sca:implementation"/>
+ <complexType name="EJBImplementation">
+ <complexContent>
+ <extension base="sca:Implementation">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="ejb-link" type="string" use="required"/>
+ <anyAttribute namespace="##other" processContents="lax"/>
+ </extension>
+ </complexContent>
+ </complexType>
+ <element name="implementation.web" type="sca:WebImplementation"
+ substitutionGroup="sca:implementation"/>
+ <complexType name="WebImplementation">
+ <complexContent>
+ <extension base="sca:Implementation">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="web-uri" type="string" use="required"/>
+ <anyAttribute namespace="##other" processContents="lax"/>
+ </extension>
+ </complexContent>
+ </complexType>
+ <element name="implementation.jee" type="sca:JEEImplementation"
+ substitutionGroup="sca:implementation"/>
+ <complexType name="JEEImplementation">
+ <complexContent>
+ <extension base="sca:Implementation">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0"
+ maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="archive" type="string" use="required"/>
+ <anyAttribute namespace="##other" processContents="lax"/>
+ </extension>
+ </complexContent>
+ </complexType>
+</schema>
diff --git a/sca-cpp/branches/cpp-contrib/xsd/sca-policy-1.1-cd04.xsd b/sca-cpp/branches/cpp-contrib/xsd/sca-policy-1.1-cd04.xsd new file mode 100644 index 0000000000..372e8c24b3 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/sca-policy-1.1-cd04.xsd @@ -0,0 +1,104 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + OASIS trademark, IPR and other policies apply. --> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" + elementFormDefault="qualified"> + + <include schemaLocation="sca-core-1.1-cd04.xsd"/> + <import namespace="http://www.w3.org/ns/ws-policy" + schemaLocation="http://www.w3.org/2007/02/ws-policy.xsd"/> + + <element name="intent" type="sca:Intent"/> + <complexType name="Intent"> + <sequence> + <element name="description" type="string" minOccurs="0" + maxOccurs="1" /> + <element name="qualifier" type="sca:IntentQualifier" + minOccurs="0" maxOccurs="unbounded" /> + <any namespace="##other" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="constrains" type="sca:listOfQNames" + use="optional"/> + <attribute name="requires" type="sca:listOfQNames" + use="optional"/> + <attribute name="excludes" type="sca:listOfQNames" + use="optional"/> + <attribute name="mutuallyExclusive" type="boolean" + use="optional" default="false"/> + <attribute name="intentType" + type="sca:InteractionOrImplementation" + use="optional" default="interaction"/> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <complexType name="IntentQualifier"> + <sequence> + <element name="description" type="string" minOccurs="0" + maxOccurs="1" /> + </sequence> + <attribute name="name" type="NCName" use="required"/> + <attribute name="default" type="boolean" use="optional" + default="false"/> + </complexType> + + <element name="policySet" type="sca:PolicySet"/> + <complexType name="PolicySet"> + <choice minOccurs="0" maxOccurs="unbounded"> + <element name="policySetReference" + type="sca:PolicySetReference"/> + <element name="intentMap" type="sca:IntentMap"/> + <any namespace="##other" processContents="lax"/> + </choice> + <attribute name="name" type="NCName" use="required"/> + <attribute name="provides" type="sca:listOfQNames"/> + <attribute name="appliesTo" type="string" use="optional"/> + <attribute name="attachTo" type="string" use="optional"/> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <element name="policySetAttachment" + type="sca:PolicySetAttachment"/> + <complexType name="PolicySetAttachment"> + <attribute name="name" type="QName" use="required"/> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <complexType name="PolicySetReference"> + <attribute name="name" type="QName" use="required"/> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <complexType name="IntentMap"> + <choice minOccurs="1" maxOccurs="unbounded"> + <element name="qualifier" type="sca:Qualifier"/> + <any namespace="##other" processContents="lax"/> + </choice> + <attribute name="provides" type="QName" use="required"/> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <complexType name="Qualifier"> + <sequence minOccurs="0" maxOccurs="unbounded"> + <any namespace="##other" processContents="lax"/> + </sequence> + <attribute name="name" type="string" use="required"/> + <anyAttribute namespace="##other" processContents="lax"/> + </complexType> + + <simpleType name="listOfNCNames"> + <list itemType="NCName"/> + </simpleType> + + <simpleType name="InteractionOrImplementation"> + <restriction base="string"> + <enumeration value="interaction"/> + <enumeration value="implementation"/> + </restriction> + </simpleType> + +</schema>
\ No newline at end of file diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-dwr.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-dwr.xsd new file mode 100644 index 0000000000..a41087d6ec --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-dwr.xsd @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="binding.dwr" type="t:DWRBinding"/> + + <complexType name="DWRBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-http.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-http.xsd new file mode 100644 index 0000000000..ff0ecd1414 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-http.xsd @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="binding.http" type="t:HTTPBinding"/> + + <complexType name="HTTPBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-jsonrpc.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-jsonrpc.xsd new file mode 100644 index 0000000000..2fb4587862 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-jsonrpc.xsd @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="binding.jsonrpc" type="t:JSONRPCBinding"/> + + <complexType name="JSONRPCBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-rmi.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-rmi.xsd new file mode 100644 index 0000000000..a3477c4a34 --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-binding-rmi.xsd @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="binding.rmi" type="t:RMIBinding"/> + + <complexType name="RMIBinding"> + <complexContent> + <extension base="sca:Binding"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" minOccurs="0" + maxOccurs="unbounded"/> + </sequence> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-implementation-osgi.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-implementation-osgi.xsd new file mode 100644 index 0000000000..ab445dfe9e --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-implementation-osgi.xsd @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="implementation.osgi" type="t:OSGiImplementation" substitutionGroup="sca:implementation"/> + + <complexType name="OSGiImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="bundleSymbolicName" type="string" use="required"/> + <attribute name="bundleVersion" type="string" use="optional"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> + <element name="osgi.property" type="t:OSGiProperty"/> + <complexType name="OSGiProperty"> + <simpleContent> + <extension base="string"> + <attribute name="name" type="NCName" use="required"/> + <attribute name="value" type="string" use="optional"/> + </extension> + </simpleContent> + </complexType> + +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-implementation-widget.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-implementation-widget.xsd new file mode 100644 index 0000000000..21d6fa377d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1-implementation-widget.xsd @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1" + xmlns:sca="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + elementFormDefault="qualified"> + + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <element name="implementation.widget" type="t:WidgetImplementation" substitutionGroup="sca:implementation"/> + + <complexType name="WidgetImplementation"> + <complexContent> + <extension base="sca:Implementation"> + <sequence> + <any namespace="##targetNamespace" processContents="lax" + minOccurs="0" maxOccurs="unbounded"/> + </sequence> + <attribute name="location" type="anyURI" use="required"/> + <anyAttribute namespace="##any" processContents="lax"/> + </extension> + </complexContent> + </complexType> +</schema> diff --git a/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1.xsd b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1.xsd new file mode 100644 index 0000000000..4a1a1e000d --- /dev/null +++ b/sca-cpp/branches/cpp-contrib/xsd/tuscany-sca-1.1.xsd @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<schema xmlns="http://www.w3.org/2001/XMLSchema" + targetNamespace="http://tuscany.apache.org/xmlns/sca/1.1"> + +<!-- + <import namespace="http://www.w3.org/ns/wsdl-instance" schemaLocation="wsdli.xsd"/> +--> + <import namespace="http://docs.oasis-open.org/ns/opencsa/sca/200912" schemaLocation="sca-1.1-cd04.xsd"/> + + <include schemaLocation="tuscany-sca-1.1-binding-dwr.xsd"/> + <include schemaLocation="tuscany-sca-1.1-binding-http.xsd"/> + <include schemaLocation="tuscany-sca-1.1-binding-jsonrpc.xsd"/> + <include schemaLocation="tuscany-sca-1.1-binding-rmi.xsd"/> + + <include schemaLocation="tuscany-sca-1.1-implementation-osgi.xsd"/> + <include schemaLocation="tuscany-sca-1.1-implementation-widget.xsd"/> +</schema>
\ No newline at end of file |