Copy trunk into gcc-4.4 branch before porting to gcc-4.5.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@935127 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
45629fcf8a
commit
5e5a4c9daa
380 changed files with 39773 additions and 0 deletions
5
sca-cpp/branches/gcc-4.4/AUTHORS
Normal file
5
sca-cpp/branches/gcc-4.4/AUTHORS
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
Apache Tuscany SCA Runtime
|
||||||
|
==========================
|
||||||
|
|
||||||
|
The Apache Software Foundation (http://www.apache.org/)
|
||||||
|
|
||||||
203
sca-cpp/branches/gcc-4.4/COPYING
Normal file
203
sca-cpp/branches/gcc-4.4/COPYING
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
12
sca-cpp/branches/gcc-4.4/ChangeLog
Normal file
12
sca-cpp/branches/gcc-4.4/ChangeLog
Normal file
|
|
@ -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
|
||||||
|
|
||||||
284
sca-cpp/branches/gcc-4.4/INSTALL
Normal file
284
sca-cpp/branches/gcc-4.4/INSTALL
Normal file
|
|
@ -0,0 +1,284 @@
|
||||||
|
Apache Tuscany SCA Runtime
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Automated installation from scratch on Ubuntu 9.10
|
||||||
|
==================================================
|
||||||
|
|
||||||
|
Tuscany provides an automated install script for Ubuntu 9.10. You can start
|
||||||
|
with a fresh Ubuntu Server 9.10 system, the ubuntu-install script takes care
|
||||||
|
of all the download, build and installation steps for you.
|
||||||
|
|
||||||
|
The required system tools and libraries are downloaded and installed using
|
||||||
|
apt-get. The Tuscany project and its dependencies (Apache HTTPD server, Apache
|
||||||
|
Axis2/C etc) are downloaded, built and installed in the current directory.
|
||||||
|
|
||||||
|
To run the automated installation:
|
||||||
|
mkdir tuscany
|
||||||
|
cd tuscany
|
||||||
|
wget http://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/ubuntu/ubuntu-install
|
||||||
|
chmod +x ./ubuntu-install
|
||||||
|
./ubuntu-install
|
||||||
|
|
||||||
|
The script will display each command as it's executed.
|
||||||
|
|
||||||
|
That's all you need to do to build and install the Tuscany SCA runtime on
|
||||||
|
Ubuntu 9.10.
|
||||||
|
|
||||||
|
|
||||||
|
For manual build and install steps on other systems or if you need to customize
|
||||||
|
your installation, read on...
|
||||||
|
|
||||||
|
|
||||||
|
Building
|
||||||
|
========
|
||||||
|
|
||||||
|
The Tuscany SCA Linux build uses the GNU Autotools tool chain.
|
||||||
|
|
||||||
|
First install the following development tools:
|
||||||
|
autoconf-2.64
|
||||||
|
automake-1.11
|
||||||
|
g++-4.4.1
|
||||||
|
libtool-2.2.6
|
||||||
|
doxygen-1.6.1
|
||||||
|
|
||||||
|
Install the following binaries:
|
||||||
|
curl-7-19-5
|
||||||
|
|
||||||
|
|
||||||
|
Then install the following development dependencies:
|
||||||
|
|
||||||
|
Apache HTTP server and APR:
|
||||||
|
httpd-2.2-15 (http://httpd.apache.org/)
|
||||||
|
with included libapr and libaprutil
|
||||||
|
built with OpenSSL libssl-0.9.8g
|
||||||
|
|
||||||
|
Memcached:
|
||||||
|
memcached-1.4.4 (http://memcached.org/)
|
||||||
|
built with libevent-1.4.11
|
||||||
|
|
||||||
|
XML:
|
||||||
|
libxml2-2.7.7 (http://xmlsoft.org/)
|
||||||
|
|
||||||
|
CURL:
|
||||||
|
libcurl4-openssl-7.19.5
|
||||||
|
|
||||||
|
JSON:
|
||||||
|
Mozilla TraceMonkey libmozjs (https://wiki.mozilla.org/JavaScript:TraceMonkey)
|
||||||
|
also included in xulrunner-1.9.1.8
|
||||||
|
|
||||||
|
Key/value store:
|
||||||
|
tinycdb-0.77 (http://www.corpit.ru/mjt/tinycdb.html)
|
||||||
|
|
||||||
|
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/)
|
||||||
|
built with libuuid-2.16, libboost-1.38.1, libboost-program-options-1.38.1 and
|
||||||
|
libboost-filesystem-1.38.1
|
||||||
|
|
||||||
|
Python:
|
||||||
|
Python 2.6.4 (http://www.python.org/)
|
||||||
|
Google AppEngine 1.3.2 (http://code.google.com/appengine/)
|
||||||
|
|
||||||
|
Java:
|
||||||
|
a Java 5+ JDK (http://openjdk.java.net/, http://harmony.apache.org/)
|
||||||
|
|
||||||
|
XMPP Chat:
|
||||||
|
Apache Vysper 0.5 (http://mina.apache.org/)
|
||||||
|
|
||||||
|
Libstrophe (http://code.stanziq.com/cgit/strophe/libstrophe/)
|
||||||
|
build it from source at git://code.stanziq.com//libstrophe
|
||||||
|
requires libcheck-0.9.6
|
||||||
|
|
||||||
|
SQL Database:
|
||||||
|
postgresql-9.0 (http://www.postgresql.org/)
|
||||||
|
|
||||||
|
|
||||||
|
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 and optionally Apache
|
||||||
|
Vysper if you want to run the tests with a local Vysper XMPP server):
|
||||||
|
--enable-chat
|
||||||
|
|
||||||
|
To build the SQL Database utility component (requires PostgreSQL):
|
||||||
|
--enable-sqldb
|
||||||
|
|
||||||
|
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-memcached=$HOME/memcached-1.4.4-bin \
|
||||||
|
--with-tinycdb=$HOME/tinycdb-0.77-bin \
|
||||||
|
--with-curl=$HOME/curl-7.19.5-bin --with-libxml2=/usr \
|
||||||
|
--with-js-include=/usr/include/xulrunner-1.9.1.8/unstable \
|
||||||
|
--with-js-lib=/usr/lib/xulrunner-1.9.1.8 \
|
||||||
|
--enable-threads \
|
||||||
|
--enable-python --with-python=/usr \
|
||||||
|
--enable-gae --with-gae=$HOME/google_appengine \
|
||||||
|
--enable-java --with-java=/usr/lib/jvm/default-java \
|
||||||
|
--enable-webservice --with-axis2c=$HOME/axis2c-1.6.0-bin \
|
||||||
|
--with-libxml2=$HOME/libxml2-2.7.7-bin \
|
||||||
|
--enable-queue --with-qpidc=$HOME/qpidc-0.6-bin \
|
||||||
|
--enable-chat --with-libstrophe=$HOME/libstrophe-bin \
|
||||||
|
--with-vysper=$HOME/vysper-0.5 \
|
||||||
|
--enable-sqldb --with-pgsql=$HOME/postgresql-9.0-bin \
|
||||||
|
--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):
|
||||||
|
wget http://www.apache.org/dist/httpd/httpd-2.2.15.tar.gz
|
||||||
|
tar xzf httpd-2.2.15.tar.gz
|
||||||
|
cd httpd-2.2.15
|
||||||
|
./configure --enable-ssl --enable-proxy --enable-rewrite --with-included-apr \
|
||||||
|
--with-mpm=prefork --prefix=$HOME/httpd-2.2.15-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
export PATH=$HOME/httpd-2-2.15-bin/bin:$PATH
|
||||||
|
|
||||||
|
Memcached:
|
||||||
|
wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
|
||||||
|
tar xzf memcached-1.4.4.tar.gz
|
||||||
|
cd memcached-1.4.4
|
||||||
|
./configure --prefix=$HOME/memcached-1.4.4-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
TinyCDB:
|
||||||
|
wget http://www.corpit.ru/mjt/tinycdb/tinycdb_0.77.tar.gz
|
||||||
|
tar xzf tinycdb_0.77.tar.gz
|
||||||
|
cd tinycdb-0.77
|
||||||
|
make
|
||||||
|
make prefix=$HOME/tinycdb-0.77-bin install
|
||||||
|
|
||||||
|
CURL:
|
||||||
|
wget http://curl.haxx.se/download/curl-7.19.5.tar.gz
|
||||||
|
tar xzf curl-7.19.5.tar.gz
|
||||||
|
cd curl-7.19.5
|
||||||
|
./configure --prefix=$HOME/curl-7.19.5-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
Libxml2:
|
||||||
|
wget ftp://xmlsoft.org/libxml2/libxml2-sources-2.7.7.tar.gz
|
||||||
|
tar xzf libxml2-sources-2.7.7.tar.gz
|
||||||
|
cd libxml2-2.7.7
|
||||||
|
./configure --prefix=$HOME/libxml2-2.7.7-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
TraceMonkey:
|
||||||
|
wget http://hg.mozilla.org/tracemonkey/archive/e4364736e170.tar.gz
|
||||||
|
tar xzf tracemonkey-e4364736e170.tar.gz
|
||||||
|
cd tracemonkey-e4364736e170/js/src
|
||||||
|
autoconf2.13
|
||||||
|
./configure --prefix=$HOME/tracemonkey-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
Apache Axis2/C:
|
||||||
|
wget http://www.apache.org/dist/ws/axis2-c/1_6_0/axis2c-src-1.6.0.tar.gz
|
||||||
|
tar xzf axis2c-src-1.6.0.tar.gz
|
||||||
|
cd axis2c-src-1.6.0
|
||||||
|
./configure --enable-libxml2 --enable-openssl \
|
||||||
|
--with-apache2=$HOME/httpd-2.2.15-bin/include --prefix=$HOME/axis2c-1.6.0-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
export AXIS2C_HOME=$HOME/axis2c-1.6.0-bin
|
||||||
|
|
||||||
|
Apache Qpid/C++:
|
||||||
|
wget http://www.apache.org/dist/qpid/0.6/qpid-cpp-0.6.tar.gz
|
||||||
|
tar xzf qpid-cpp-0.6.tar.gz
|
||||||
|
cd qpidc-0.6
|
||||||
|
./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
|
||||||
|
cd ..
|
||||||
|
mkdir -p libstrophe-bin/include
|
||||||
|
cp libstrophe/*.h libstrophe-bin/include
|
||||||
|
cp libstrophe/src/*.h libstrophe-bin/include
|
||||||
|
|
||||||
|
PostgreSQL:
|
||||||
|
wget http://wwwmaster.postgresql.org/download/mirrors-ftp/source/9.0alpha5/postgresql-9.0alpha5.tar.gz
|
||||||
|
tar xzf postgresql-9.0alpha5.tar.gz
|
||||||
|
cd postgresql-9.0alpha5
|
||||||
|
./configure --prefix=$HOME/postgresql-9.0-bin
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
323
sca-cpp/branches/gcc-4.4/LICENSE
Normal file
323
sca-cpp/branches/gcc-4.4/LICENSE
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
|
||||||
45
sca-cpp/branches/gcc-4.4/Makefile.am
Normal file
45
sca-cpp/branches/gcc-4.4/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
|
SUBDIRS = kernel modules components test doc samples
|
||||||
|
|
||||||
|
datadir=$(prefix)
|
||||||
|
data_DATA = INSTALL README LICENSE COPYING NOTICE
|
||||||
|
nobase_data_DATA = xsd/*.xsd xsd/external/*.xsd xsd/external/*.dtd
|
||||||
|
|
||||||
|
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)/test
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
13
sca-cpp/branches/gcc-4.4/NEWS
Normal file
13
sca-cpp/branches/gcc-4.4/NEWS
Normal file
|
|
@ -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
|
||||||
|
|
||||||
42
sca-cpp/branches/gcc-4.4/NOTICE
Normal file
42
sca-cpp/branches/gcc-4.4/NOTICE
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
81
sca-cpp/branches/gcc-4.4/README
Normal file
81
sca-cpp/branches/gcc-4.4/README
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
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
|
||||||
|
| | |-- json JSON-RPC encoding
|
||||||
|
| | |-- http HTTP protocol
|
||||||
|
| | |-- java Support for Java components
|
||||||
|
| | |-- python Support for Python components
|
||||||
|
| | |-- scheme Support for Scheme components
|
||||||
|
| | |-- server Apache HTTPD server integration
|
||||||
|
| | |-- wsgi Python WSGI server integration
|
||||||
|
| |
|
||||||
|
| |-- components Useful SCA components
|
||||||
|
| | |-- cache Key/value memory cache
|
||||||
|
| | |-- chat XMPP chat
|
||||||
|
| | |-- log Logger
|
||||||
|
| | |-- queue AMQP message queue
|
||||||
|
| | |-- sqldb SQL database
|
||||||
|
| | |-- store Key/value persistent store
|
||||||
|
| | |-- webservice Web service gateway
|
||||||
|
| |
|
||||||
|
| |-- test Integration tests
|
||||||
|
| |
|
||||||
|
| |-- samples Sample Applications
|
||||||
|
| |
|
||||||
|
| |-- ubuntu Automated install on Ubuntu 9.10
|
||||||
|
|
|
||||||
|
|-- 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
|
||||||
|
|
||||||
31
sca-cpp/branches/gcc-4.4/bootstrap
Executable file
31
sca-cpp/branches/gcc-4.4/bootstrap
Executable file
|
|
@ -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
|
||||||
|
|
||||||
22
sca-cpp/branches/gcc-4.4/components/Makefile.am
Normal file
22
sca-cpp/branches/gcc-4.4/components/Makefile.am
Normal file
|
|
@ -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 = cache chat log queue sqldb store webservice
|
||||||
|
|
||||||
|
includedir = $(prefix)/include/components
|
||||||
|
nobase_include_HEADERS = */*.hpp
|
||||||
|
|
||||||
35
sca-cpp/branches/gcc-4.4/components/cache/Makefile.am
vendored
Normal file
35
sca-cpp/branches/gcc-4.4/components/cache/Makefile.am
vendored
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
comp_SCRIPTS = memcached-start memcached-stop
|
||||||
|
compdir=$(prefix)/components/cache
|
||||||
|
|
||||||
|
comp_DATA = memcached.prefix
|
||||||
|
memcached.prefix: $(top_builddir)/config.status
|
||||||
|
echo ${MEMCACHED_PREFIX} >memcached.prefix
|
||||||
|
|
||||||
|
comp_LTLIBRARIES = libmemcache.la
|
||||||
|
libmemcache_la_SOURCES = memcache.cpp
|
||||||
|
|
||||||
|
memcache_test_SOURCES = memcache-test.cpp
|
||||||
|
memcache_test_LDFLAGS = -lxml2
|
||||||
|
|
||||||
|
client_test_SOURCES = client-test.cpp
|
||||||
|
client_test_LDFLAGS = -lxml2 -lcurl -lmozjs
|
||||||
|
|
||||||
|
noinst_PROGRAMS = memcache-test client-test
|
||||||
|
TESTS = memcached-test server-test
|
||||||
130
sca-cpp/branches/gcc-4.4/components/cache/client-test.cpp
vendored
Normal file
130
sca-cpp/branches/gcc-4.4/components/cache/client-test.cpp
vendored
Normal file
|
|
@ -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/memcache");
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
82
sca-cpp/branches/gcc-4.4/components/cache/memcache-test.cpp
vendored
Normal file
82
sca-cpp/branches/gcc-4.4/components/cache/memcache-test.cpp
vendored
Normal file
|
|
@ -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 "memcache.hpp"
|
||||||
|
|
||||||
|
namespace tuscany {
|
||||||
|
namespace memcache {
|
||||||
|
|
||||||
|
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::memcache::testMemCached();
|
||||||
|
tuscany::memcache::testGetPerf();
|
||||||
|
|
||||||
|
tuscany::cout << "OK" << tuscany::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
32
sca-cpp/branches/gcc-4.4/components/cache/memcache.composite
vendored
Normal file
32
sca-cpp/branches/gcc-4.4/components/cache/memcache.composite
vendored
Normal file
|
|
@ -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="memcache">
|
||||||
|
|
||||||
|
<component name="memcache">
|
||||||
|
<implementation.cpp path=".libs" library="libmemcache"/>
|
||||||
|
<service name="memcache">
|
||||||
|
<t:binding.http uri="memcache"/>
|
||||||
|
</service>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
</composite>
|
||||||
133
sca-cpp/branches/gcc-4.4/components/cache/memcache.cpp
vendored
Normal file
133
sca-cpp/branches/gcc-4.4/components/cache/memcache.cpp
vendored
Normal file
|
|
@ -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 "memcache.hpp"
|
||||||
|
|
||||||
|
namespace tuscany {
|
||||||
|
namespace cache {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an item from the cache.
|
||||||
|
*/
|
||||||
|
const failable<value> get(const list<value>& params, memcache::MemCached& ch) {
|
||||||
|
return memcache::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, memcache::MemCached& ch) {
|
||||||
|
const value id = append<value>(car(params), mklist(uuidValue()));
|
||||||
|
const failable<bool> val = memcache::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, memcache::MemCached& ch) {
|
||||||
|
const failable<bool> val = memcache::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, memcache::MemCached& ch) {
|
||||||
|
const failable<bool> val = memcache::del(car(params), ch);
|
||||||
|
if (!hasContent(val))
|
||||||
|
return mkfailure<value>(reason(val));
|
||||||
|
return value(content(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component implementation lambda function.
|
||||||
|
*/
|
||||||
|
class applyCache {
|
||||||
|
public:
|
||||||
|
applyCache(memcache::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:
|
||||||
|
memcache::MemCached& ch;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the component.
|
||||||
|
*/
|
||||||
|
const failable<value> start(unused const list<value>& params) {
|
||||||
|
// Connect to memcached
|
||||||
|
memcache::MemCached& ch = *(new (gc_new<memcache::MemCached>()) memcache::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::cache::start(cdr(params));
|
||||||
|
return tuscany::mkfailure<tuscany::value>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
175
sca-cpp/branches/gcc-4.4/components/cache/memcache.hpp
vendored
Normal file
175
sca-cpp/branches/gcc-4.4/components/cache/memcache.hpp
vendored
Normal file
|
|
@ -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_memcache_hpp
|
||||||
|
#define tuscany_memcache_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 memcache {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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, "memcache::post::key");
|
||||||
|
debug(val, "memcache::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, "memcache::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, "memcache::put::key");
|
||||||
|
debug(val, "memcache::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 set entry");
|
||||||
|
|
||||||
|
debug(true, "memcache::put::result");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an item from the cache.
|
||||||
|
*/
|
||||||
|
const failable<value> get(const value& key, const MemCached& cache) {
|
||||||
|
debug(key, "memcache::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, "memcache::get::result");
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete an item from the cache
|
||||||
|
*/
|
||||||
|
const failable<bool> del(const value& key, const MemCached& cache) {
|
||||||
|
debug(key, "memcache::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, "memcache::delete::result");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* tuscany_memcache_hpp */
|
||||||
25
sca-cpp/branches/gcc-4.4/components/cache/memcached-start
vendored
Executable file
25
sca-cpp/branches/gcc-4.4/components/cache/memcached-start
vendored
Executable file
|
|
@ -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 memcached
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
|
||||||
|
memcached_prefix=`cat $here/memcached.prefix`
|
||||||
|
$memcached_prefix/bin/memcached -d -l 127.0.0.1 -m 4 -p 11211
|
||||||
|
|
||||||
26
sca-cpp/branches/gcc-4.4/components/cache/memcached-stop
vendored
Executable file
26
sca-cpp/branches/gcc-4.4/components/cache/memcached-stop
vendored
Executable file
|
|
@ -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 memcached
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
|
||||||
|
memcached_prefix=`cat $here/memcached.prefix`
|
||||||
|
mc="$memcached_prefix/bin/memcached -d -l 127.0.0.1 -m 4 -p 11211"
|
||||||
|
|
||||||
|
kill `ps -ef | grep -v grep | grep "${mc}" | awk '{ print $2 }'`
|
||||||
30
sca-cpp/branches/gcc-4.4/components/cache/memcached-test
vendored
Executable file
30
sca-cpp/branches/gcc-4.4/components/cache/memcached-test
vendored
Executable file
|
|
@ -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
|
||||||
|
./memcache-test 2>/dev/null
|
||||||
|
rc=$?
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
./memcached-stop
|
||||||
|
return $rc
|
||||||
41
sca-cpp/branches/gcc-4.4/components/cache/server-test
vendored
Executable file
41
sca-cpp/branches/gcc-4.4/components/cache/server-test
vendored
Executable file
|
|
@ -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 localhost 8090 ../../modules/http/htdocs
|
||||||
|
../../modules/server/server-conf tmp
|
||||||
|
../../modules/server/scheme-conf tmp
|
||||||
|
cat >>tmp/conf/httpd.conf <<EOF
|
||||||
|
SCAContribution `pwd`/
|
||||||
|
SCAComposite memcache.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
|
||||||
54
sca-cpp/branches/gcc-4.4/components/chat/Makefile.am
Normal file
54
sca-cpp/branches/gcc-4.4/components/chat/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
JAVAROOT = $(top_builddir)/components/chat
|
||||||
|
|
||||||
|
if WANT_CHAT
|
||||||
|
|
||||||
|
INCLUDES = -I${LIBSTROPHE_INCLUDE}
|
||||||
|
|
||||||
|
comp_SCRIPTS = vysper-start vysper-stop vysper-classpath
|
||||||
|
compdir=$(prefix)/components/chat
|
||||||
|
|
||||||
|
comp_DATA = vysper.prefix
|
||||||
|
vysper.prefix: $(top_builddir)/config.status
|
||||||
|
echo ${VYSPER_PREFIX} >vysper.prefix
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
noinst_PROGRAMS = xmpp-test client-test
|
||||||
|
|
||||||
|
if WANT_VYSPER
|
||||||
|
|
||||||
|
AM_JAVACFLAGS = -cp `${top_builddir}/components/chat/vysper-classpath ${VYSPER_PREFIX}`${JAVAROOT}
|
||||||
|
|
||||||
|
noinst_JAVA = test/*.java
|
||||||
|
|
||||||
|
CLEANFILES = test/*.class
|
||||||
|
|
||||||
|
TESTS = echo-test
|
||||||
|
endif
|
||||||
|
|
||||||
|
endif
|
||||||
52
sca-cpp/branches/gcc-4.4/components/chat/chat.composite
Normal file
52
sca-cpp/branches/gcc-4.4/components/chat/chat.composite
Normal file
|
|
@ -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>
|
||||||
162
sca-cpp/branches/gcc-4.4/components/chat/chatter.cpp
Normal file
162
sca-cpp/branches/gcc-4.4/components/chat/chatter.cpp
Normal file
|
|
@ -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>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
111
sca-cpp/branches/gcc-4.4/components/chat/client-test.cpp
Normal file
111
sca-cpp/branches/gcc-4.4/components/chat/client-test.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
31
sca-cpp/branches/gcc-4.4/components/chat/echo-test
Executable file
31
sca-cpp/branches/gcc-4.4/components/chat/echo-test
Executable file
|
|
@ -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
|
||||||
|
./vysper-start
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
# Test
|
||||||
|
./xmpp-test 2>/dev/null
|
||||||
|
rc=$?
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
./vysper-stop
|
||||||
|
sleep 1
|
||||||
|
return $rc
|
||||||
39
sca-cpp/branches/gcc-4.4/components/chat/server-test
Executable file
39
sca-cpp/branches/gcc-4.4/components/chat/server-test
Executable file
|
|
@ -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 localhost 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
|
||||||
20
sca-cpp/branches/gcc-4.4/components/chat/server-test.scm
Normal file
20
sca-cpp/branches/gcc-4.4/components/chat/server-test.scm
Normal file
|
|
@ -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))
|
||||||
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A test XMPP server, using Apache Vysper.
|
||||||
|
*/
|
||||||
|
import static java.lang.System.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import org.apache.vysper.mina.TCPEndpoint;
|
||||||
|
import org.apache.vysper.stanzasession.StanzaSessionFactory;
|
||||||
|
import org.apache.vysper.storage.StorageProviderRegistry;
|
||||||
|
import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
|
||||||
|
import org.apache.vysper.xmpp.authorization.AccountManagement;
|
||||||
|
import org.apache.vysper.xmpp.modules.extension.xep0049_privatedata.PrivateDataModule;
|
||||||
|
import org.apache.vysper.xmpp.modules.extension.xep0054_vcardtemp.VcardTempModule;
|
||||||
|
import org.apache.vysper.xmpp.modules.extension.xep0092_software_version.SoftwareVersionModule;
|
||||||
|
import org.apache.vysper.xmpp.modules.extension.xep0119_xmppping.XmppPingModule;
|
||||||
|
import org.apache.vysper.xmpp.modules.extension.xep0202_entity_time.EntityTimeModule;
|
||||||
|
import org.apache.vysper.xmpp.server.XMPPServer;
|
||||||
|
|
||||||
|
class TestVysperServer {
|
||||||
|
public static void main(final String args[]) throws Exception {
|
||||||
|
out.println("Starting test Vysper server...");
|
||||||
|
|
||||||
|
// Add the XMPP users used by the xmpp-test and server-test test cases
|
||||||
|
// If you're using your own XMPP server you need to add these users manually
|
||||||
|
final StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();
|
||||||
|
final AccountManagement accountManagement = (AccountManagement)providerRegistry.retrieve(AccountManagement.class);
|
||||||
|
accountManagement.addUser("sca1@localhost", "sca1");
|
||||||
|
accountManagement.addUser("sca2@localhost", "sca2");
|
||||||
|
accountManagement.addUser("sca3@localhost", "sca3");
|
||||||
|
|
||||||
|
// Create and start XMPP server for domain: localhost
|
||||||
|
final XMPPServer server = new org.apache.vysper.xmpp.server.XMPPServer("localhost");
|
||||||
|
server.addEndpoint(new TCPEndpoint());
|
||||||
|
server.addEndpoint(new StanzaSessionFactory());
|
||||||
|
server.setStorageProviderRegistry(providerRegistry);
|
||||||
|
final File cert = new File(TestVysperServer.class.getClassLoader().getResource("bogus_mina_tls.cert").getPath());
|
||||||
|
server.setTLSCertificateInfo(cert, "boguspw");
|
||||||
|
server.start();
|
||||||
|
server.addModule(new SoftwareVersionModule());
|
||||||
|
server.addModule(new EntityTimeModule());
|
||||||
|
server.addModule(new VcardTempModule());
|
||||||
|
server.addModule(new XmppPingModule());
|
||||||
|
server.addModule(new PrivateDataModule());
|
||||||
|
out.println("Test Vysper server started...");
|
||||||
|
|
||||||
|
// Wait forever
|
||||||
|
final Object lock = new Object();
|
||||||
|
synchronized(lock) {
|
||||||
|
lock.wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("Stopping test Vysper server...");
|
||||||
|
server.stop();
|
||||||
|
out.println("Test Vysper server stopped.");
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
29
sca-cpp/branches/gcc-4.4/components/chat/vysper-classpath
Executable file
29
sca-cpp/branches/gcc-4.4/components/chat/vysper-classpath
Executable file
|
|
@ -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.
|
||||||
|
|
||||||
|
# Compute a classpath for running a Vysper server
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
|
||||||
|
if [ "$1" = "" ]; then
|
||||||
|
vysper_prefix=`cat $here/vysper.prefix`
|
||||||
|
else
|
||||||
|
vysper_prefix=$1
|
||||||
|
fi
|
||||||
|
jars=`find $vysper_prefix/lib -name "*.jar" | awk '{ printf "%s:", $1 }'`
|
||||||
|
echo "$vysper_prefix/config:$jars"
|
||||||
25
sca-cpp/branches/gcc-4.4/components/chat/vysper-start
Executable file
25
sca-cpp/branches/gcc-4.4/components/chat/vysper-start
Executable file
|
|
@ -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 Vysper test XMPP server
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
|
||||||
|
java_prefix=`cat $here/../../modules/java/java.prefix`
|
||||||
|
mkdir -p $here/tmp/logs
|
||||||
|
${java_prefix}/jre/bin/java -cp `$here/vysper-classpath`$here test.TestVysperServer 2>&1 1>>$here/tmp/logs/vysper.log &
|
||||||
25
sca-cpp/branches/gcc-4.4/components/chat/vysper-stop
Executable file
25
sca-cpp/branches/gcc-4.4/components/chat/vysper-stop
Executable file
|
|
@ -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 Vysper test XMPP server
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
|
||||||
|
java_prefix=`cat $here/../../modules/java/java.prefix`
|
||||||
|
kill `ps -ef | grep -v grep | grep "${java_prefix}/jre/bin/java" | grep "vysper" | awk '{ print $2 }'`
|
||||||
|
|
||||||
103
sca-cpp/branches/gcc-4.4/components/chat/xmpp-test.cpp
Normal file
103
sca-cpp/branches/gcc-4.4/components/chat/xmpp-test.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
330
sca-cpp/branches/gcc-4.4/components/chat/xmpp.hpp
Normal file
330
sca-cpp/branches/gcc-4.4/components/chat/xmpp.hpp
Normal file
|
|
@ -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 */
|
||||||
17
sca-cpp/branches/gcc-4.4/components/log/Makefile.am
Normal file
17
sca-cpp/branches/gcc-4.4/components/log/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
33
sca-cpp/branches/gcc-4.4/components/log/log.composite
Normal file
33
sca-cpp/branches/gcc-4.4/components/log/log.composite
Normal file
|
|
@ -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>
|
||||||
46
sca-cpp/branches/gcc-4.4/components/queue/Makefile.am
Normal file
46
sca-cpp/branches/gcc-4.4/components/queue/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
if WANT_QUEUE
|
||||||
|
|
||||||
|
INCLUDES = -I${QPIDC_INCLUDE}
|
||||||
|
|
||||||
|
comp_SCRIPTS = qpidd-start qpidd-stop
|
||||||
|
compdir=$(prefix)/components/queue
|
||||||
|
|
||||||
|
comp_DATA = qpidc.prefix
|
||||||
|
qpidc.prefix: $(top_builddir)/config.status
|
||||||
|
echo ${QPIDC_PREFIX} >qpidc.prefix
|
||||||
|
|
||||||
|
comp_LTLIBRARIES = libqueue-sender.la libqueue-listener.la
|
||||||
|
|
||||||
|
libqueue_sender_la_SOURCES = queue-sender.cpp
|
||||||
|
libqueue_sender_la_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient -lqpidcommon
|
||||||
|
|
||||||
|
libqueue_listener_la_SOURCES = queue-listener.cpp
|
||||||
|
libqueue_listener_la_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient -lqpidcommon
|
||||||
|
|
||||||
|
qpid_test_SOURCES = qpid-test.cpp
|
||||||
|
qpid_test_LDFLAGS = -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient -lqpidcommon
|
||||||
|
|
||||||
|
client_test_SOURCES = client-test.cpp
|
||||||
|
client_test_LDFLAGS = -lxml2 -lcurl -lmozjs -L${QPIDC_LIB} -R${QPIDC_LIB} -lqpidclient -lqpidcommon
|
||||||
|
|
||||||
|
noinst_PROGRAMS = qpid-test client-test
|
||||||
|
TESTS = send-test server-test
|
||||||
|
|
||||||
|
endif
|
||||||
99
sca-cpp/branches/gcc-4.4/components/queue/client-test.cpp
Normal file
99
sca-cpp/branches/gcc-4.4/components/queue/client-test.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
97
sca-cpp/branches/gcc-4.4/components/queue/qpid-test.cpp
Normal file
97
sca-cpp/branches/gcc-4.4/components/queue/qpid-test.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
260
sca-cpp/branches/gcc-4.4/components/queue/qpid.hpp
Normal file
260
sca-cpp/branches/gcc-4.4/components/queue/qpid.hpp
Normal file
|
|
@ -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_qpid_hpp
|
||||||
|
#define tuscany_qpid_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 */
|
||||||
24
sca-cpp/branches/gcc-4.4/components/queue/qpidd-start
Executable file
24
sca-cpp/branches/gcc-4.4/components/queue/qpidd-start
Executable file
|
|
@ -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 &
|
||||||
26
sca-cpp/branches/gcc-4.4/components/queue/qpidd-stop
Executable file
26
sca-cpp/branches/gcc-4.4/components/queue/qpidd-stop
Executable file
|
|
@ -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 -ef | grep -v grep | grep "${qpidd}" | awk '{ print $2 }'`
|
||||||
158
sca-cpp/branches/gcc-4.4/components/queue/queue-listener.cpp
Normal file
158
sca-cpp/branches/gcc-4.4/components/queue/queue-listener.cpp
Normal file
|
|
@ -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>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
72
sca-cpp/branches/gcc-4.4/components/queue/queue-sender.cpp
Normal file
72
sca-cpp/branches/gcc-4.4/components/queue/queue-sender.cpp
Normal file
|
|
@ -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>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
56
sca-cpp/branches/gcc-4.4/components/queue/queue.composite
Normal file
56
sca-cpp/branches/gcc-4.4/components/queue/queue.composite
Normal file
|
|
@ -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>
|
||||||
31
sca-cpp/branches/gcc-4.4/components/queue/send-test
Executable file
31
sca-cpp/branches/gcc-4.4/components/queue/send-test
Executable file
|
|
@ -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
|
||||||
43
sca-cpp/branches/gcc-4.4/components/queue/server-test
Executable file
43
sca-cpp/branches/gcc-4.4/components/queue/server-test
Executable file
|
|
@ -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 localhost 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
|
||||||
20
sca-cpp/branches/gcc-4.4/components/queue/server-test.scm
Normal file
20
sca-cpp/branches/gcc-4.4/components/queue/server-test.scm
Normal file
|
|
@ -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))
|
||||||
43
sca-cpp/branches/gcc-4.4/components/sqldb/Makefile.am
Normal file
43
sca-cpp/branches/gcc-4.4/components/sqldb/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
if WANT_SQLDB
|
||||||
|
|
||||||
|
INCLUDES = -I${PGSQL_INCLUDE}
|
||||||
|
|
||||||
|
#comp_SCRIPTS = pgsql-start pgsql-stop
|
||||||
|
compdir=$(prefix)/components/sqldb
|
||||||
|
|
||||||
|
comp_DATA = pgsql.prefix
|
||||||
|
pgsql.prefix: $(top_builddir)/config.status
|
||||||
|
echo ${PGSQL_PREFIX} >pgsql.prefix
|
||||||
|
|
||||||
|
comp_LTLIBRARIES = libsqldb.la
|
||||||
|
|
||||||
|
libsqldb_la_SOURCES = sqldb.cpp
|
||||||
|
libsqldb_la_LDFLAGS = -L${PGSQL_LIB} -R${PGSQL_LIB} -lpq
|
||||||
|
|
||||||
|
pgsql_test_SOURCES = pgsql-test.cpp
|
||||||
|
pgsql_test_LDFLAGS = -L${PGSQL_LIB} -R${PGSQL_LIB} -lpq
|
||||||
|
|
||||||
|
client_test_SOURCES = client-test.cpp
|
||||||
|
client_test_LDFLAGS = -lxml2 -lcurl -lmozjs
|
||||||
|
|
||||||
|
noinst_PROGRAMS = pgsql-test client-test
|
||||||
|
TESTS = sqldb-test server-test
|
||||||
|
|
||||||
|
endif
|
||||||
130
sca-cpp/branches/gcc-4.4/components/sqldb/client-test.cpp
Normal file
130
sca-cpp/branches/gcc-4.4/components/sqldb/client-test.cpp
Normal file
|
|
@ -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 SQLDB 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 sqldb {
|
||||||
|
|
||||||
|
const string uri("http://localhost:8090/sqldb");
|
||||||
|
|
||||||
|
bool testSqlDb() {
|
||||||
|
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 << "Sqldb get test " << time(gl, 5, 200) << " ms" << endl;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
tuscany::cout << "Testing..." << tuscany::endl;
|
||||||
|
|
||||||
|
tuscany::sqldb::testSqlDb();
|
||||||
|
tuscany::sqldb::testGetPerf();
|
||||||
|
|
||||||
|
tuscany::cout << "OK" << tuscany::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
25
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql
Executable file
25
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql
Executable file
|
|
@ -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.
|
||||||
|
|
||||||
|
# Run SQL command
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
pgsql_prefix=`cat $here/pgsql.prefix`
|
||||||
|
|
||||||
|
$pgsql_prefix/bin/psql -c "$1" db
|
||||||
|
|
||||||
37
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql-start
Executable file
37
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql-start
Executable file
|
|
@ -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.
|
||||||
|
|
||||||
|
# Start postgresql
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
root=`readlink -f $1`
|
||||||
|
|
||||||
|
pgsql_prefix=`cat $here/pgsql.prefix`
|
||||||
|
mkdir -p $root/sqldb
|
||||||
|
mkdir -p $root/logs
|
||||||
|
if [ ! -f $root/sqldb/postgresql.conf ]; then
|
||||||
|
$pgsql_prefix/bin/pg_ctl init -D $root/sqldb 1>/dev/null 2>&1
|
||||||
|
createdb="true"
|
||||||
|
fi
|
||||||
|
|
||||||
|
$pgsql_prefix/bin/pg_ctl start -D $root/sqldb -l $root/logs/postgresql 1>/dev/null 2>&1
|
||||||
|
sleep 2
|
||||||
|
if [ "$createdb" = "true" ]; then
|
||||||
|
$pgsql_prefix/bin/createdb db 1>/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
28
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql-stop
Executable file
28
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql-stop
Executable file
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/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 postgresql
|
||||||
|
here=`readlink -f $0`; here=`dirname $here`
|
||||||
|
root=`readlink -f $1`
|
||||||
|
|
||||||
|
pgsql_prefix=`cat $here/pgsql.prefix`
|
||||||
|
mkdir -p $root/sqldb
|
||||||
|
mkdir -p $root/logs
|
||||||
|
$pgsql_prefix/bin/pg_ctl stop -D $root/sqldb 1>/dev/null 2>&1
|
||||||
|
|
||||||
82
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql-test.cpp
Normal file
82
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql-test.cpp
Normal file
|
|
@ -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 PostgreSQL access functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include "stream.hpp"
|
||||||
|
#include "string.hpp"
|
||||||
|
#include "perf.hpp"
|
||||||
|
#include "pgsql.hpp"
|
||||||
|
|
||||||
|
namespace tuscany {
|
||||||
|
namespace pgsql {
|
||||||
|
|
||||||
|
bool testPGSql() {
|
||||||
|
PGSql pg("dbname=db", "test");
|
||||||
|
const value k = mklist<value>("a");
|
||||||
|
|
||||||
|
assert(hasContent(post(k, string("AAA"), pg)));
|
||||||
|
assert((get(k, pg)) == value(string("AAA")));
|
||||||
|
assert(hasContent(put(k, string("aaa"), pg)));
|
||||||
|
assert((get(k, pg)) == value(string("aaa")));
|
||||||
|
assert(hasContent(del(k, pg)));
|
||||||
|
assert(!hasContent(get(k, pg)));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct getLoop {
|
||||||
|
const value k;
|
||||||
|
PGSql& pg;
|
||||||
|
getLoop(const value& k, PGSql& pg) : k(k), pg(pg) {
|
||||||
|
}
|
||||||
|
const bool operator()() const {
|
||||||
|
assert((get(k, pg)) == value(string("CCC")));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool testGetPerf() {
|
||||||
|
const value k = mklist<value>("c");
|
||||||
|
PGSql pg("dbname=db", "test");
|
||||||
|
assert(hasContent(post(k, string("CCC"), pg)));
|
||||||
|
|
||||||
|
const lambda<bool()> gl = getLoop(k, pg);
|
||||||
|
cout << "PGSql get test " << time(gl, 5, 200) << " ms" << endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
tuscany::cout << "Testing..." << tuscany::endl;
|
||||||
|
|
||||||
|
tuscany::pgsql::testPGSql();
|
||||||
|
tuscany::pgsql::testGetPerf();
|
||||||
|
|
||||||
|
tuscany::cout << "OK" << tuscany::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
227
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql.hpp
Normal file
227
sca-cpp/branches/gcc-4.4/components/sqldb/pgsql.hpp
Normal file
|
|
@ -0,0 +1,227 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR 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_pgsql_hpp
|
||||||
|
#define tuscany_pgsql_hpp
|
||||||
|
|
||||||
|
#include <libpq-fe.h>
|
||||||
|
|
||||||
|
#include "string.hpp"
|
||||||
|
#include "list.hpp"
|
||||||
|
#include "value.hpp"
|
||||||
|
#include "monad.hpp"
|
||||||
|
#include "../../modules/scheme/eval.hpp"
|
||||||
|
|
||||||
|
namespace tuscany {
|
||||||
|
namespace pgsql {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return and clear a Postgres result failure.
|
||||||
|
*/
|
||||||
|
const string pgfailure(PGresult* r) {
|
||||||
|
const string e = PQresultErrorMessage(r);
|
||||||
|
PQclear(r);
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a PGSql connection.
|
||||||
|
*/
|
||||||
|
class PGSql {
|
||||||
|
public:
|
||||||
|
PGSql() : owner(false) {
|
||||||
|
}
|
||||||
|
|
||||||
|
PGSql(const string& conninfo, const string& table) : owner(true), conninfo(conninfo), table(table) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
PGSql(const PGSql& c) : owner(false) {
|
||||||
|
conninfo = c.conninfo;
|
||||||
|
conn = c.conn;
|
||||||
|
table = c.table;
|
||||||
|
}
|
||||||
|
|
||||||
|
~PGSql() {
|
||||||
|
if (!owner)
|
||||||
|
return;
|
||||||
|
PQfinish(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool owner;
|
||||||
|
PGconn *conn;
|
||||||
|
string conninfo;
|
||||||
|
string table;
|
||||||
|
|
||||||
|
friend const failable<bool> post(const value& key, const value& val, const PGSql& pgsql);
|
||||||
|
friend const failable<bool> put(const value& key, const value& val, const PGSql& pgsql);
|
||||||
|
friend const failable<value> get(const value& key, const PGSql& pgsql);
|
||||||
|
friend const failable<bool> del(const value& key, const PGSql& pgsql);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the database connection
|
||||||
|
*/
|
||||||
|
const failable<bool> init() {
|
||||||
|
conn = PQconnectdb(c_str(conninfo));
|
||||||
|
if (PQstatus(conn) != CONNECTION_OK)
|
||||||
|
return mkfailure<bool>(string("Could not connect to database: ") + PQerrorMessage(conn));
|
||||||
|
|
||||||
|
// Find the name of the first column in the target table
|
||||||
|
// Assume that's the key we need to use
|
||||||
|
string ks = string("select a.attname from pg_attribute a, pg_class c where a.attrelid = c.relfilenode and c.relname = '") + table + string("' and a.attnum in (1, 2) order by a.attnum;");
|
||||||
|
PGresult* kr = PQexec(conn, c_str(ks));
|
||||||
|
if (PQresultStatus(kr) != PGRES_TUPLES_OK)
|
||||||
|
return mkfailure<bool>(string("Could not execute column select statement: ") + pgfailure(kr));
|
||||||
|
if (PQntuples(kr) != 2) {
|
||||||
|
PQclear(kr);
|
||||||
|
return mkfailure<bool>(string("Could not find table key and value column names"));
|
||||||
|
}
|
||||||
|
const string kname = PQgetvalue(kr, 0, 0);
|
||||||
|
const string vname = PQgetvalue(kr, 1, 0);
|
||||||
|
PQclear(kr);
|
||||||
|
|
||||||
|
// Prepare the post, put, get and delete statements
|
||||||
|
{
|
||||||
|
PGresult* r = PQprepare(conn, "post", c_str(string("insert into ") + table + string(" values($1, $2);")), 2, NULL);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not prepare post SQL statement: ") + pgfailure(r));
|
||||||
|
PQclear(r);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
PGresult* r = PQprepare(conn, "put", c_str(string("update ") + table + string(" set ") + vname + string(" = $2 where ") + kname + string(" = $1;")), 2, NULL);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not prepare put SQL statement: ") + pgfailure(r));
|
||||||
|
PQclear(r);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
PGresult* r = PQprepare(conn, "get", c_str(string("select * from ") + table + string(" where ") + kname + string(" = $1;")), 1, NULL);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not prepare get SQL statement: ") + pgfailure(r));
|
||||||
|
PQclear(r);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
PGresult* r = PQprepare(conn, "delete", c_str(string("delete from ") + table + string(" where ") + kname + string(" = $1;")), 1, NULL);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not prepare delete SQL statement: ") + pgfailure(r));
|
||||||
|
PQclear(r);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post a new item to the database.
|
||||||
|
*/
|
||||||
|
const failable<bool> post(const value& key, const value& val, const PGSql& pgsql) {
|
||||||
|
debug(key, "pgsql::post::key");
|
||||||
|
debug(val, "pgsql::post::value");
|
||||||
|
debug(pgsql.table, "pgsql::post::table");
|
||||||
|
|
||||||
|
const string ks(scheme::writeValue(key));
|
||||||
|
const string vs(scheme::writeValue(val));
|
||||||
|
const char* params[2] = { c_str(ks), c_str(vs) };
|
||||||
|
PGresult* r = PQexecPrepared(pgsql.conn, "post", 2, params, NULL, NULL, 0);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not execute post SQL statement: ") + pgfailure(r));
|
||||||
|
PQclear(r);
|
||||||
|
|
||||||
|
debug(true, "pgsql::post::result");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update an item in the database. If the item doesn't exist it is added.
|
||||||
|
*/
|
||||||
|
const failable<bool> put(const value& key, const value& val, const PGSql& pgsql) {
|
||||||
|
debug(key, "pgsql::put::key");
|
||||||
|
debug(val, "pgsql::put::value");
|
||||||
|
debug(pgsql.table, "pgsql::put::table");
|
||||||
|
|
||||||
|
const string ks(scheme::writeValue(key));
|
||||||
|
const string vs(scheme::writeValue(val));
|
||||||
|
const char* params[2] = { c_str(ks), c_str(vs) };
|
||||||
|
PGresult* r = PQexecPrepared(pgsql.conn, "put", 2, params, NULL, NULL, 0);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not execute put SQL statement: ") + pgfailure(r));
|
||||||
|
const string t = PQcmdTuples(r);
|
||||||
|
if (t != "0") {
|
||||||
|
PQclear(r);
|
||||||
|
debug(true, "pgsql::put::result");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
PQclear(r);
|
||||||
|
|
||||||
|
PGresult* pr = PQexecPrepared(pgsql.conn, "post", 2, params, NULL, NULL, 0);
|
||||||
|
if (PQresultStatus(pr) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not execute post SQL statement: ") + pgfailure(pr));
|
||||||
|
PQclear(pr);
|
||||||
|
|
||||||
|
debug(true, "pgsql::put::result");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an item from the database.
|
||||||
|
*/
|
||||||
|
const failable<value> get(const value& key, const PGSql& pgsql) {
|
||||||
|
debug(key, "pgsql::get::key");
|
||||||
|
debug(pgsql.table, "pgsql::get::table");
|
||||||
|
|
||||||
|
const string ks(scheme::writeValue(key));
|
||||||
|
const char* params[1] = { c_str(ks) };
|
||||||
|
PGresult* r = PQexecPrepared(pgsql.conn, "get", 1, params, NULL, NULL, 0);
|
||||||
|
if (PQresultStatus(r) != PGRES_TUPLES_OK)
|
||||||
|
return mkfailure<value>(string("Could not execute get SQL statement: ") + pgfailure(r));
|
||||||
|
if (PQntuples(r) < 1) {
|
||||||
|
PQclear(r);
|
||||||
|
return mkfailure<value>(string("Could not get entry: ") + PQerrorMessage(pgsql.conn));
|
||||||
|
}
|
||||||
|
const char* data = PQgetvalue(r, 0, 1);
|
||||||
|
const value val(scheme::readValue(string(data)));
|
||||||
|
PQclear(r);
|
||||||
|
|
||||||
|
debug(val, "pgsql::get::result");
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete an item from the database
|
||||||
|
*/
|
||||||
|
const failable<bool> del(const value& key, const PGSql& pgsql) {
|
||||||
|
debug(key, "pgsql::delete::key");
|
||||||
|
debug(pgsql.table, "pgsql::delete::table");
|
||||||
|
|
||||||
|
const string ks(scheme::writeValue(key));
|
||||||
|
const char* params[1] = { c_str(ks) };
|
||||||
|
PGresult* r = PQexecPrepared(pgsql.conn, "delete", 1, params, NULL, NULL, 0);
|
||||||
|
if (PQresultStatus(r) != PGRES_COMMAND_OK)
|
||||||
|
return mkfailure<bool>(string("Could not execute delete SQL statement: ") + pgfailure(r));
|
||||||
|
PQclear(r);
|
||||||
|
|
||||||
|
debug(true, "pgsql::delete::result");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* tuscany_pgsql_hpp */
|
||||||
43
sca-cpp/branches/gcc-4.4/components/sqldb/server-test
Executable file
43
sca-cpp/branches/gcc-4.4/components/sqldb/server-test
Executable file
|
|
@ -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 localhost 8090 ../../modules/http/htdocs
|
||||||
|
../../modules/server/server-conf tmp
|
||||||
|
../../modules/server/scheme-conf tmp
|
||||||
|
cat >>tmp/conf/httpd.conf <<EOF
|
||||||
|
SCAContribution `pwd`/
|
||||||
|
SCAComposite sqldb.composite
|
||||||
|
EOF
|
||||||
|
|
||||||
|
./pgsql-start tmp
|
||||||
|
./pgsql "drop table test;" 1>/dev/null 2>&1
|
||||||
|
./pgsql "create table test(key text, value text);" 1>/dev/null 2>&1
|
||||||
|
../../modules/http/httpd-start tmp
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Test
|
||||||
|
./client-test 2>/dev/null
|
||||||
|
rc=$?
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
../../modules/http/httpd-stop tmp
|
||||||
|
./pgsql-stop tmp
|
||||||
|
sleep 2
|
||||||
|
return $rc
|
||||||
31
sca-cpp/branches/gcc-4.4/components/sqldb/sqldb-test
Executable file
31
sca-cpp/branches/gcc-4.4/components/sqldb/sqldb-test
Executable file
|
|
@ -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
|
||||||
|
./pgsql-start tmp
|
||||||
|
./pgsql "drop table test;" 1>/dev/null 2>&1
|
||||||
|
./pgsql "create table test(key text, value text);" 1>/dev/null 2>&1
|
||||||
|
|
||||||
|
# Test
|
||||||
|
./pgsql-test 2>/dev/null
|
||||||
|
rc=$?
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
./pgsql-stop tmp
|
||||||
|
return $rc
|
||||||
34
sca-cpp/branches/gcc-4.4/components/sqldb/sqldb.composite
Normal file
34
sca-cpp/branches/gcc-4.4/components/sqldb/sqldb.composite
Normal file
|
|
@ -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://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="sqldb">
|
||||||
|
|
||||||
|
<component name="sqldb">
|
||||||
|
<implementation.cpp path=".libs" library="libsqldb"/>
|
||||||
|
<property name="conninfo">dbname=db</property>
|
||||||
|
<property name="table">test</property>
|
||||||
|
<service name="sqldb">
|
||||||
|
<t:binding.http uri="sqldb"/>
|
||||||
|
</service>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
</composite>
|
||||||
135
sca-cpp/branches/gcc-4.4/components/sqldb/sqldb.cpp
Normal file
135
sca-cpp/branches/gcc-4.4/components/sqldb/sqldb.cpp
Normal file
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Rev$ $Date$ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PostgreSQL-based database component implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <apr_uuid.h>
|
||||||
|
|
||||||
|
#include "string.hpp"
|
||||||
|
|
||||||
|
#include "function.hpp"
|
||||||
|
#include "list.hpp"
|
||||||
|
#include "value.hpp"
|
||||||
|
#include "monad.hpp"
|
||||||
|
#include "pgsql.hpp"
|
||||||
|
|
||||||
|
namespace tuscany {
|
||||||
|
namespace sqldb {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an item from the database.
|
||||||
|
*/
|
||||||
|
const failable<value> get(const list<value>& params, pgsql::PGSql& pg) {
|
||||||
|
return pgsql::get(car(params), pg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post an item to the database.
|
||||||
|
*/
|
||||||
|
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, pgsql::PGSql& pg) {
|
||||||
|
const value id = append<value>(car(params), mklist(uuidValue()));
|
||||||
|
const failable<bool> val = pgsql::post(id, cadr(params), pg);
|
||||||
|
if (!hasContent(val))
|
||||||
|
return mkfailure<value>(reason(val));
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put an item into the database.
|
||||||
|
*/
|
||||||
|
const failable<value> put(const list<value>& params, pgsql::PGSql& pg) {
|
||||||
|
const failable<bool> val = pgsql::put(car(params), cadr(params), pg);
|
||||||
|
if (!hasContent(val))
|
||||||
|
return mkfailure<value>(reason(val));
|
||||||
|
return value(content(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete an item from the database.
|
||||||
|
*/
|
||||||
|
const failable<value> del(const list<value>& params, pgsql::PGSql& pg) {
|
||||||
|
const failable<bool> val = pgsql::del(car(params), pg);
|
||||||
|
if (!hasContent(val))
|
||||||
|
return mkfailure<value>(reason(val));
|
||||||
|
return value(content(val));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component implementation lambda function.
|
||||||
|
*/
|
||||||
|
class applySqldb {
|
||||||
|
public:
|
||||||
|
applySqldb(pgsql::PGSql& pg) : pg(pg) {
|
||||||
|
}
|
||||||
|
|
||||||
|
const value operator()(const list<value>& params) const {
|
||||||
|
const value func(car(params));
|
||||||
|
if (func == "get")
|
||||||
|
return get(cdr(params), pg);
|
||||||
|
if (func == "post")
|
||||||
|
return post(cdr(params), pg);
|
||||||
|
if (func == "put")
|
||||||
|
return put(cdr(params), pg);
|
||||||
|
if (func == "delete")
|
||||||
|
return del(cdr(params), pg);
|
||||||
|
return tuscany::mkfailure<tuscany::value>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
pgsql::PGSql& pg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the component.
|
||||||
|
*/
|
||||||
|
const failable<value> start(unused const list<value>& params) {
|
||||||
|
// Connect to the configured database and table
|
||||||
|
const value conninfo = ((lambda<value(list<value>)>)car(params))(list<value>());
|
||||||
|
const value table = ((lambda<value(list<value>)>)cadr(params))(list<value>());
|
||||||
|
pgsql::PGSql& pg = *(new (gc_new<pgsql::PGSql>()) pgsql::PGSql(conninfo, table));
|
||||||
|
|
||||||
|
// Return the component implementation lambda function
|
||||||
|
return value(lambda<value(const list<value>&)>(applySqldb(pg)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
const tuscany::value apply(const tuscany::list<tuscany::value>& params) {
|
||||||
|
const tuscany::value func(car(params));
|
||||||
|
if (func == "start")
|
||||||
|
return tuscany::sqldb::start(cdr(params));
|
||||||
|
return tuscany::mkfailure<tuscany::value>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
20
sca-cpp/branches/gcc-4.4/components/store/Makefile.am
Normal file
20
sca-cpp/branches/gcc-4.4/components/store/Makefile.am
Normal file
|
|
@ -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_NOSQLDB
|
||||||
|
|
||||||
|
endif
|
||||||
32
sca-cpp/branches/gcc-4.4/components/store/store.composite
Normal file
32
sca-cpp/branches/gcc-4.4/components/store/store.composite
Normal file
|
|
@ -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>
|
||||||
53
sca-cpp/branches/gcc-4.4/components/webservice/Makefile.am
Normal file
53
sca-cpp/branches/gcc-4.4/components/webservice/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
if WANT_WEBSERVICE
|
||||||
|
|
||||||
|
INCLUDES = -I${AXIS2C_INCLUDE}
|
||||||
|
|
||||||
|
comp_DATA = axis2c.prefix
|
||||||
|
compdir=$(prefix)/components/webservice
|
||||||
|
axis2c.prefix: $(top_builddir)/config.status
|
||||||
|
echo ${AXIS2C_PREFIX} >axis2c.prefix
|
||||||
|
|
||||||
|
comp_LTLIBRARIES = libwebservice-client.la libwebservice-listener.la libaxis2-dispatcher.la libaxis2-service.la
|
||||||
|
|
||||||
|
libwebservice_client_la_SOURCES = webservice-client.cpp
|
||||||
|
libwebservice_client_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
libwebservice_listener_la_SOURCES = webservice-listener.cpp
|
||||||
|
libwebservice_listener_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
libaxis2_dispatcher_la_SOURCES = axis2-dispatcher.cpp
|
||||||
|
libaxis2_dispatcher_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
libaxis2_service_la_SOURCES = axis2-service.cpp
|
||||||
|
libaxis2_service_la_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
axiom_test_SOURCES = axiom-test.cpp
|
||||||
|
axiom_test_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
axis2_test_SOURCES = axis2-test.cpp
|
||||||
|
axis2_test_LDFLAGS = -lxml2 -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
client_test_SOURCES = client-test.cpp
|
||||||
|
client_test_LDFLAGS = -lxml2 -lcurl -lmozjs -L${AXIS2C_LIB} -R${AXIS2C_LIB} -laxis2_engine -laxis2_axiom -laxutil
|
||||||
|
|
||||||
|
noinst_PROGRAMS = axiom-test axis2-test client-test
|
||||||
|
TESTS = axiom-test echo-test server-test
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
55
sca-cpp/branches/gcc-4.4/components/webservice/axis2-conf
Executable file
55
sca-cpp/branches/gcc-4.4/components/webservice/axis2-conf
Executable file
|
|
@ -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.
|
||||||
|
|
||||||
|
# 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
|
||||||
|
# Support for Web Services
|
||||||
|
SCASetEnv 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
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
151
sca-cpp/branches/gcc-4.4/components/webservice/axis2-service.cpp
Normal file
151
sca-cpp/branches/gcc-4.4/components/webservice/axis2-service.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
194
sca-cpp/branches/gcc-4.4/components/webservice/axis2.hpp
Normal file
194
sca-cpp/branches/gcc-4.4/components/webservice/axis2.hpp
Normal file
|
|
@ -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 */
|
||||||
148
sca-cpp/branches/gcc-4.4/components/webservice/axis2.xml
Normal file
148
sca-cpp/branches/gcc-4.4/components/webservice/axis2.xml
Normal file
|
|
@ -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>
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
37
sca-cpp/branches/gcc-4.4/components/webservice/echo-test
Executable file
37
sca-cpp/branches/gcc-4.4/components/webservice/echo-test
Executable file
|
|
@ -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
|
||||||
25
sca-cpp/branches/gcc-4.4/components/webservice/module.xml
Normal file
25
sca-cpp/branches/gcc-4.4/components/webservice/module.xml
Normal file
|
|
@ -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>
|
||||||
49
sca-cpp/branches/gcc-4.4/components/webservice/server-test
Executable file
49
sca-cpp/branches/gcc-4.4/components/webservice/server-test
Executable file
|
|
@ -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 localhost 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
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
25
sca-cpp/branches/gcc-4.4/components/webservice/services.xml
Normal file
25
sca-cpp/branches/gcc-4.4/components/webservice/services.xml
Normal file
|
|
@ -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>
|
||||||
|
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
712
sca-cpp/branches/gcc-4.4/configure.ac
Normal file
712
sca-cpp/branches/gcc-4.4/configure.ac
Normal file
|
|
@ -0,0 +1,712 @@
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT 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)
|
||||||
|
|
||||||
|
# Use GCC 4.5 if available
|
||||||
|
if test -x "/usr/bin/gcc-4.5"; then
|
||||||
|
CXX=/usr/bin/g++-4.5
|
||||||
|
CPP=/usr/bin/cpp-4.5
|
||||||
|
CC=/usr/bin/gcc-4.5
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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 CURL.
|
||||||
|
AC_MSG_CHECKING([for curl])
|
||||||
|
AC_ARG_WITH([curl], [AC_HELP_STRING([--with-curl=PATH], [path to installed curl [default=/usr]])], [
|
||||||
|
CURL_PREFIX="${withval}"
|
||||||
|
LIBCURL_INCLUDE="${withval}/include"
|
||||||
|
LIBCURL_LIB="${withval}/lib"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
CURL_PREFIX="/usr"
|
||||||
|
LIBCURL_INCLUDE="/usr/include"
|
||||||
|
LIBCURL_LIB="/usr/lib"
|
||||||
|
AC_MSG_RESULT(/usr)
|
||||||
|
])
|
||||||
|
AC_SUBST(CURL_PREFIX)
|
||||||
|
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])
|
||||||
|
xulrunner=`ls /usr/include | grep "xulrunner" | tail -1`
|
||||||
|
if test "$xulrunner" = ""; then
|
||||||
|
xulrunner="xulrunner-1.9.1.8"
|
||||||
|
fi
|
||||||
|
AC_ARG_WITH([js-include], [AC_HELP_STRING([--with-js-include=PATH], [path to installed SpiderMonkey include dir
|
||||||
|
[default=/usr/include/$xulrunner/unstable]])], [
|
||||||
|
JS_INCLUDE="${withval}"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
JS_INCLUDE="/usr/include/$xulrunner/unstable"
|
||||||
|
AC_MSG_RESULT(/usr/include/$xulrunner/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]])], [
|
||||||
|
JS_LIB="${withval}"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
JS_LIB="/usr/lib/$xulrunner"
|
||||||
|
AC_MSG_RESULT(/usr/lib/$xulrunner)
|
||||||
|
])
|
||||||
|
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 path to memcached.
|
||||||
|
AC_MSG_CHECKING([for memcached])
|
||||||
|
AC_ARG_WITH([memcached], [AC_HELP_STRING([--with-memcached=PATH], [path to installed memcached [default=/usr]])], [
|
||||||
|
MEMCACHED_PREFIX="${withval}"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
MEMCACHED_PREFIX="/usr"
|
||||||
|
AC_MSG_RESULT(/usr)
|
||||||
|
])
|
||||||
|
AC_SUBST(MEMCACHED_PREFIX)
|
||||||
|
|
||||||
|
# Configure path to tinycdb.
|
||||||
|
AC_MSG_CHECKING([for tinycdb])
|
||||||
|
AC_ARG_WITH([tinycdb], [AC_HELP_STRING([--with-tinycdb=PATH], [path to installed tinycdb [default=/usr]])], [
|
||||||
|
TINYCDB_PREFIX="${withval}"
|
||||||
|
TINYCDB_INCLUDE="${withval}/include"
|
||||||
|
TINYCDB_LIB="${withval}/lib"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
TINYCDB_PREFIX="/usr"
|
||||||
|
TINYCDB_INCLUDE="/usr/include"
|
||||||
|
TINYCDB_LIB="/usr/lib"
|
||||||
|
AC_MSG_RESULT(/usr)
|
||||||
|
])
|
||||||
|
AC_SUBST(TINYCDB_PREFIX)
|
||||||
|
AC_SUBST(TINYCDB_INCLUDE)
|
||||||
|
AC_SUBST(TINYCDB_LIB)
|
||||||
|
|
||||||
|
# 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} -ldl -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_PREFIX="${withval}"
|
||||||
|
PYTHON_INCLUDE="${withval}/include"
|
||||||
|
PYTHON_LIB="${withval}/lib"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
PYTHON_PREFIX="/usr"
|
||||||
|
PYTHON_INCLUDE="/usr/include"
|
||||||
|
PYTHON_LIB="/usr/lib"
|
||||||
|
AC_MSG_RESULT(/usr)
|
||||||
|
])
|
||||||
|
AC_SUBST(PYTHON_PREFIX)
|
||||||
|
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"
|
||||||
|
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"
|
||||||
|
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(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
|
||||||
|
# Detect most common Java VMs
|
||||||
|
if test -f "${JAVA_PREFIX}/jre/lib/i386/libjava.so"; then
|
||||||
|
if test -f "${JAVA_PREFIX}/jre/lib/i386/server/libjvm.so"; then
|
||||||
|
# Server VM
|
||||||
|
AC_MSG_NOTICE([checking for server Java VM])
|
||||||
|
JAVA_CHECK_LIB="-L${JAVA_PREFIX}/jre/lib/i386 -R${JAVA_PREFIX}/jre/lib/i386 -L${JAVA_PREFIX}/jre/lib/i386/server -R${JAVA_PREFIX}/jre/lib/i386/server"
|
||||||
|
LIBS="${JAVA_CHECK_LIB} ${default_LIBS}"
|
||||||
|
AC_CHECK_LIB([java], [JNI_CreateJavaVM], [JAVA_LDFLAGS="${JAVA_CHECK_LIB} -ljava -ljvm -lverify"], [], [-ljvm -lverify])
|
||||||
|
if test "${JAVA_LDFLAGS}" != ""; then
|
||||||
|
AC_DEFINE([JAVA_SERVER_VM], 1, [Server Java VM])
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -f "${JAVA_PREFIX}/jre/lib/i386/j9vm/libjvm.so"; then
|
||||||
|
# J9 VM
|
||||||
|
AC_MSG_NOTICE([checking for J9 Java VM])
|
||||||
|
JAVA_CHECK_LIB="-L${JAVA_PREFIX}/jre/lib/i386 -R${JAVA_PREFIX}/jre/lib/i386 -L${JAVA_PREFIX}/jre/lib/i386/j9vm -R${JAVA_PREFIX}/jre/lib/i386/j9vm"
|
||||||
|
LIBS="${JAVA_CHECK_LIB} ${default_LIBS}"
|
||||||
|
AC_CHECK_LIB([java], [JNI_CreateJavaVM], [JAVA_LDFLAGS="${JAVA_CHECK_LIB} -ljava -ljvm -ljsig"], [], [-ljvm -ljsig])
|
||||||
|
if test "${JAVA_LDFLAGS}" != ""; then
|
||||||
|
AC_DEFINE([JAVA_J9_VM], 1, [J9 Java VM])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if test -f "${JAVA_PREFIX}/jre/bin/default/libharmonyvm.so"; then
|
||||||
|
# Apache Harmony VM
|
||||||
|
AC_MSG_NOTICE([checking for Apache Harmony Java VM])
|
||||||
|
JAVA_CHECK_LIB="-L${JAVA_PREFIX}/jre/bin -R${JAVA_PREFIX}/jre/bin -L${JAVA_PREFIX}/jre/bin/default -R${JAVA_PREFIX}/jre/bin/default"
|
||||||
|
LIBS="${JAVA_CHECK_LIB} ${default_LIBS}"
|
||||||
|
AC_CHECK_LIB([harmonyvm], [JNI_CreateJavaVM], [JAVA_LDFLAGS="${JAVA_CHECK_LIB} -lharmonyvm -lhythr -licuuc -lch ${JAVA_PREFIX}/jre/bin/default/libicudata.so.34"], [], [-lhythr -licuuc -lch ${JAVA_PREFIX}/jre/bin/default/libicudata.so.34])
|
||||||
|
if test "${JAVA_LDFLAGS}" != ""; then
|
||||||
|
AC_DEFINE([JAVA_HARMONY_VM], 1, [Apache Harmony Java VM])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "${JAVA_LDFLAGS}" = ""; then
|
||||||
|
AC_MSG_ERROR([couldn't find a suitable Java JNI library, use --with-java=PATH])
|
||||||
|
fi
|
||||||
|
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)
|
||||||
|
JAVA_LDFLAGS=""
|
||||||
|
fi
|
||||||
|
AC_SUBST(JAVA_LDFLAGS)
|
||||||
|
|
||||||
|
# Configure path to Google AppEngine SDK.
|
||||||
|
AC_MSG_CHECKING([for gae])
|
||||||
|
AC_ARG_WITH([gae], [AC_HELP_STRING([--with-gae=PATH], [path to installed Google AppEngine 1.3.2 [default=$HOME/google_appengine]])], [
|
||||||
|
GAE_PREFIX="${withval}"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
GAE_PREFIX="$HOME/google_appengine"
|
||||||
|
AC_MSG_RESULT($HOME/google_appengine)
|
||||||
|
])
|
||||||
|
AC_SUBST(GAE_PREFIX)
|
||||||
|
|
||||||
|
# Enable support for Google AppEngine.
|
||||||
|
AC_MSG_CHECKING([whether to enable Google AppEngine support])
|
||||||
|
AC_ARG_ENABLE(gae, [AS_HELP_STRING([--enable-gae], [enable Google AppEngine support [default=no]])],
|
||||||
|
[ case "${enableval}" in
|
||||||
|
no)
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
want_gae=true
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
[ AC_MSG_RESULT(no)])
|
||||||
|
if test "${want_gae}" = "true"; then
|
||||||
|
AM_CONDITIONAL([WANT_GAE], true)
|
||||||
|
AC_DEFINE([WANT_GAE], 1, [enable Google AppEngine support])
|
||||||
|
else
|
||||||
|
AM_CONDITIONAL([WANT_GAE], false)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure path to Java includes and lib.
|
||||||
|
# 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 NoSQL database component.
|
||||||
|
AC_MSG_CHECKING([whether to enable the NoSQL database component])
|
||||||
|
AC_ARG_ENABLE(nosqldb, [AS_HELP_STRING([--enable-nosqldb], [enable NoSQL database component [default=no]])],
|
||||||
|
[ case "${enableval}" in
|
||||||
|
no)
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
want_nosqldb=true
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
[ AC_MSG_RESULT(no)])
|
||||||
|
if test "${want_nosqldb}" = "true"; then
|
||||||
|
AM_CONDITIONAL([WANT_NOSQLDB], true)
|
||||||
|
AC_DEFINE([WANT_NOSQLDB], 1, [enable NoSQL database component])
|
||||||
|
else
|
||||||
|
AM_CONDITIONAL([WANT_NOSQLDB], false)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure path to PostgreSQL.
|
||||||
|
AC_MSG_CHECKING([for pgsql])
|
||||||
|
AC_ARG_WITH([pgsql], [AC_HELP_STRING([--with-pgsql=PATH], [path to installed PostgreSQL [default=/usr/local/pgsql]])], [
|
||||||
|
PGSQL_PREFIX="${withval}"
|
||||||
|
PGSQL_INCLUDE="${withval}/include"
|
||||||
|
PGSQL_LIB="${withval}/lib"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
PGSQL_PREFIX="/usr/local/pgsql"
|
||||||
|
PGSQL_INCLUDE="/usr/local/pgsql/include"
|
||||||
|
PGSQL_LIB="/usr/local/pgsql/lib"
|
||||||
|
AC_MSG_RESULT(/usr/local)
|
||||||
|
])
|
||||||
|
AC_SUBST(PGSQL_PREFIX)
|
||||||
|
AC_SUBST(PGSQL_INCLUDE)
|
||||||
|
AC_SUBST(PGSQL_LIB)
|
||||||
|
|
||||||
|
# Enable SQL Database component.
|
||||||
|
AC_MSG_CHECKING([whether to enable the SQL Database component])
|
||||||
|
AC_ARG_ENABLE(sqldb, [AS_HELP_STRING([--enable-sqldb], [enable SQL Database component [default=no]])],
|
||||||
|
[ case "${enableval}" in
|
||||||
|
no)
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
want_sqldb=true
|
||||||
|
;;
|
||||||
|
esac ],
|
||||||
|
[ AC_MSG_RESULT(no)])
|
||||||
|
if test "${want_sqldb}" = "true"; then
|
||||||
|
AM_CONDITIONAL([WANT_SQLDB], true)
|
||||||
|
AC_DEFINE([WANT_SQLDB], 1, [enable SQL Database component])
|
||||||
|
else
|
||||||
|
AM_CONDITIONAL([WANT_SQLDB], false)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure path to Apache Qpid/C++.
|
||||||
|
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 [default=${HOME}/libstrophe-bin]])], [
|
||||||
|
LIBSTROPHE_INCLUDE="${withval}/include"
|
||||||
|
LIBSTROPHE_LIB="${withval}/lib"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
LIBSTROPHE_INCLUDE="${HOME}/libstrophe-bin/include"
|
||||||
|
LIBSTROPHE_LIB="${HOME}/libstrophe-bin/lib"
|
||||||
|
AC_MSG_RESULT(${HOME}/libstrophe-bin)
|
||||||
|
])
|
||||||
|
AC_SUBST(LIBSTROPHE_INCLUDE)
|
||||||
|
AC_SUBST(LIBSTROPHE_LIB)
|
||||||
|
|
||||||
|
# Configure path to Vysper
|
||||||
|
AC_MSG_CHECKING([for vysper])
|
||||||
|
AC_ARG_WITH([vysper], [AC_HELP_STRING([--with-vysper=PATH], [path to Apache Vysper [default=${HOME}/vysper-1.0.0]])], [
|
||||||
|
VYSPER_PREFIX="${withval}"
|
||||||
|
AC_MSG_RESULT("${withval}")
|
||||||
|
], [
|
||||||
|
VYSPER_PREFIX="${HOME}/vysper-1.0.0"
|
||||||
|
AC_MSG_RESULT(${HOME}/vysper-1.0.0)
|
||||||
|
])
|
||||||
|
AC_SUBST(VYSPER_PREFIX)
|
||||||
|
|
||||||
|
# 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])
|
||||||
|
|
||||||
|
# Check for Vysper
|
||||||
|
AC_CHECK_FILE([${VYSPER_PREFIX}/lib/vysper-core-0.5.jar], [want_vysper=true], [])
|
||||||
|
if test "${want_vysper}" = "true"; then
|
||||||
|
AM_CONDITIONAL([WANT_VYSPER], true)
|
||||||
|
else
|
||||||
|
AM_CONDITIONAL([WANT_VYSPER], false)
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
AM_CONDITIONAL([WANT_CHAT], false)
|
||||||
|
AM_CONDITIONAL([WANT_VYSPER], 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
|
||||||
|
modules/wsgi/Makefile
|
||||||
|
components/Makefile
|
||||||
|
components/cache/Makefile
|
||||||
|
components/log/Makefile
|
||||||
|
components/chat/Makefile
|
||||||
|
components/queue/Makefile
|
||||||
|
components/sqldb/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
|
||||||
|
test/store-gae/Makefile
|
||||||
|
test/store-sql/Makefile
|
||||||
|
doc/Makefile
|
||||||
|
doc/Doxyfile
|
||||||
|
])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
1541
sca-cpp/branches/gcc-4.4/doc/Doxyfile.in
Normal file
1541
sca-cpp/branches/gcc-4.4/doc/Doxyfile.in
Normal file
File diff suppressed because it is too large
Load diff
30
sca-cpp/branches/gcc-4.4/doc/Makefile.am
Normal file
30
sca-cpp/branches/gcc-4.4/doc/Makefile.am
Normal file
|
|
@ -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
|
||||||
99
sca-cpp/branches/gcc-4.4/etc/git-exclude
Normal file
99
sca-cpp/branches/gcc-4.4/etc/git-exclude
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
# 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
|
||||||
|
.buildpath
|
||||||
|
.svn/
|
||||||
|
.cvs/
|
||||||
|
.dotest/
|
||||||
|
*.la
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.in
|
||||||
|
*.so
|
||||||
|
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
|
||||||
|
index.yaml
|
||||||
|
core
|
||||||
|
|
||||||
|
# Specific ignores
|
||||||
|
kernel-test
|
||||||
|
string-test
|
||||||
|
mem-test
|
||||||
|
hash-test
|
||||||
|
parallel-test
|
||||||
|
xml-test
|
||||||
|
xsd-test
|
||||||
|
atom-test
|
||||||
|
eval-test
|
||||||
|
eval-shell
|
||||||
|
json-test
|
||||||
|
client-test
|
||||||
|
memcache-test
|
||||||
|
curl-test
|
||||||
|
scdl-test
|
||||||
|
python-test
|
||||||
|
python-shell
|
||||||
|
jni-test
|
||||||
|
java-test
|
||||||
|
java-shell
|
||||||
|
script-test
|
||||||
|
axiom-test
|
||||||
|
axis2-test
|
||||||
|
qpid-test
|
||||||
|
xmpp-test
|
||||||
|
pgsql-test
|
||||||
|
|
||||||
23
sca-cpp/branches/gcc-4.4/etc/httpd-ipcrm
Executable file
23
sca-cpp/branches/gcc-4.4/etc/httpd-ipcrm
Executable file
|
|
@ -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 {}
|
||||||
|
|
||||||
23
sca-cpp/branches/gcc-4.4/etc/memgrind
Executable file
23
sca-cpp/branches/gcc-4.4/etc/memgrind
Executable file
|
|
@ -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
|
||||||
|
|
||||||
136
sca-cpp/branches/gcc-4.4/etc/svn-config
Normal file
136
sca-cpp/branches/gcc-4.4/etc/svn-config
Normal file
|
|
@ -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
|
||||||
|
|
||||||
55
sca-cpp/branches/gcc-4.4/etc/svn-ignore
Normal file
55
sca-cpp/branches/gcc-4.4/etc/svn-ignore
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
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
|
||||||
|
.buildpath
|
||||||
|
*.lib
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.suo
|
||||||
|
*.ncb
|
||||||
|
*.user
|
||||||
|
*.pdb
|
||||||
|
Debug
|
||||||
|
Release
|
||||||
|
gmon.out
|
||||||
|
m4
|
||||||
|
*.tar.gz
|
||||||
|
*.pyc
|
||||||
|
*.log
|
||||||
|
*-bin
|
||||||
|
*-src
|
||||||
|
Doxyfile
|
||||||
|
*~
|
||||||
|
tags
|
||||||
|
doxygen
|
||||||
|
*.stamp
|
||||||
|
*.class
|
||||||
|
*.jar
|
||||||
|
*.prefix
|
||||||
|
target
|
||||||
45
sca-cpp/branches/gcc-4.4/kernel/Makefile.am
Normal file
45
sca-cpp/branches/gcc-4.4/kernel/Makefile.am
Normal file
|
|
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
includedir = $(prefix)/include/kernel
|
||||||
|
include_HEADERS = *.hpp
|
||||||
|
|
||||||
|
string_test_SOURCES = string-test.cpp
|
||||||
|
|
||||||
|
test_LTLIBRARIES = libdynlib-test.la
|
||||||
|
testdir = $(prefix)/test
|
||||||
|
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
|
||||||
|
|
||||||
|
hash_test_SOURCES = hash-test.cpp
|
||||||
|
|
||||||
|
noinst_PROGRAMS = string-test kernel-test hash-test mem-test parallel-test xml-test xsd-test
|
||||||
|
TESTS = string-test kernel-test hash-test mem-test parallel-test xml-test
|
||||||
|
|
||||||
76
sca-cpp/branches/gcc-4.4/kernel/config.hpp
Normal file
76
sca-cpp/branches/gcc-4.4/kernel/config.hpp
Normal file
|
|
@ -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 */
|
||||||
48
sca-cpp/branches/gcc-4.4/kernel/dynlib-test.cpp
Normal file
48
sca-cpp/branches/gcc-4.4/kernel/dynlib-test.cpp
Normal file
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
91
sca-cpp/branches/gcc-4.4/kernel/dynlib.hpp
Normal file
91
sca-cpp/branches/gcc-4.4/kernel/dynlib.hpp
Normal file
|
|
@ -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 */
|
||||||
304
sca-cpp/branches/gcc-4.4/kernel/element.hpp
Normal file
304
sca-cpp/branches/gcc-4.4/kernel/element.hpp
Normal file
|
|
@ -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 */
|
||||||
162
sca-cpp/branches/gcc-4.4/kernel/fstream.hpp
Normal file
162
sca-cpp/branches/gcc-4.4/kernel/fstream.hpp
Normal file
|
|
@ -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 */
|
||||||
238
sca-cpp/branches/gcc-4.4/kernel/function.hpp
Normal file
238
sca-cpp/branches/gcc-4.4/kernel/function.hpp
Normal file
|
|
@ -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 */
|
||||||
276
sca-cpp/branches/gcc-4.4/kernel/gc.hpp
Normal file
276
sca-cpp/branches/gcc-4.4/kernel/gc.hpp
Normal file
|
|
@ -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 */
|
||||||
135
sca-cpp/branches/gcc-4.4/kernel/hash-test.cpp
Normal file
135
sca-cpp/branches/gcc-4.4/kernel/hash-test.cpp
Normal file
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Rev$ $Date$ */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test hash functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include "string.hpp"
|
||||||
|
#include "hash.hpp"
|
||||||
|
#include "perf.hpp"
|
||||||
|
|
||||||
|
namespace tuscany {
|
||||||
|
|
||||||
|
bool testCrc32hash() {
|
||||||
|
const string key("This is a test key");
|
||||||
|
unsigned int h = crc32hash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool testTimes33hash() {
|
||||||
|
const string key("This is a test key");
|
||||||
|
unsigned int h = times33hash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool testMurmurhash() {
|
||||||
|
const string key("This is a test key");
|
||||||
|
unsigned int h = murmurhash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool testPortablemurmurhash() {
|
||||||
|
const string key("This is a test key");
|
||||||
|
unsigned int h = portablemurmurhash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct crc32hashTest {
|
||||||
|
const string key;
|
||||||
|
crc32hashTest(const string& key) : key(key) {
|
||||||
|
}
|
||||||
|
bool operator()() const {
|
||||||
|
unsigned int h = crc32hash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct times33hashTest {
|
||||||
|
const string key;
|
||||||
|
times33hashTest(const string& key) : key(key) {
|
||||||
|
}
|
||||||
|
bool operator()() const {
|
||||||
|
unsigned int h = times33hash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct murmurhashTest {
|
||||||
|
const string key;
|
||||||
|
murmurhashTest(const string& key) : key(key) {
|
||||||
|
}
|
||||||
|
bool operator()() const {
|
||||||
|
unsigned int h = murmurhash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct portablemurmurhashTest {
|
||||||
|
const string key;
|
||||||
|
portablemurmurhashTest(const string& key) : key(key) {
|
||||||
|
}
|
||||||
|
bool operator()() const {
|
||||||
|
unsigned int h = portablemurmurhash(c_str(key), length(key));
|
||||||
|
assert(h != 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool testHashPerf() {
|
||||||
|
const string key("This is a test key");
|
||||||
|
const int count = 100000;
|
||||||
|
|
||||||
|
const lambda<bool()> crc32 = crc32hashTest(key);
|
||||||
|
cout << "crc32hash test " << time(crc32, 5, count) << " ms" << endl;
|
||||||
|
const lambda<bool()> times33 = times33hashTest(key);
|
||||||
|
cout << "times33hash test " << time(times33, 5, count) << " ms" << endl;
|
||||||
|
const lambda<bool()> murmur = murmurhashTest(key);
|
||||||
|
cout << "murmurhash test " << time(murmur, 5, count) << " ms" << endl;
|
||||||
|
const lambda<bool()> portablemurmur = portablemurmurhashTest(key);
|
||||||
|
cout << "portable murmurhash test " << time(portablemurmur, 5, count) << " ms" << endl;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
tuscany::cout << "Testing..." << tuscany::endl;
|
||||||
|
|
||||||
|
tuscany::testCrc32hash();
|
||||||
|
tuscany::testTimes33hash();
|
||||||
|
tuscany::testMurmurhash();
|
||||||
|
tuscany::testPortablemurmurhash();
|
||||||
|
tuscany::testHashPerf();
|
||||||
|
|
||||||
|
tuscany::cout << "OK" << tuscany::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
207
sca-cpp/branches/gcc-4.4/kernel/hash.hpp
Normal file
207
sca-cpp/branches/gcc-4.4/kernel/hash.hpp
Normal file
|
|
@ -0,0 +1,207 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR 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_hash_hpp
|
||||||
|
#define tuscany_hash_hpp
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fast hash functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <apr_hash.h>
|
||||||
|
#include <apr_memcache.h>
|
||||||
|
|
||||||
|
namespace tuscany
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apache apr-util CRC32 hash function.
|
||||||
|
*
|
||||||
|
* See srclib/apr-util/memcache/apr_memcache.c from the Apache HTTPD
|
||||||
|
* source tree. Reproducing the comments from apr_memcache.c here:
|
||||||
|
*
|
||||||
|
* The crc32 functions and data were originally written by Spencer
|
||||||
|
* Garrett <srg@quick.com> and were gleaned from the PostgreSQL source
|
||||||
|
* tree at contrib/ltree/crc32.[ch] and from FreeBSD at
|
||||||
|
* src/usr.bin/cksum/crc32.c.
|
||||||
|
*/
|
||||||
|
const unsigned int crc32hash(const char* data, const unsigned int len) {
|
||||||
|
return apr_memcache_hash_default(NULL, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apache apr tables default hash function.
|
||||||
|
*
|
||||||
|
* See srclib/apr/tables/apr_hash.c from the Apache HTTPD source tree.
|
||||||
|
* Reproducing the comments from apr_hash.c here:
|
||||||
|
*
|
||||||
|
* This is the popular `times 33' hash algorithm which is used by
|
||||||
|
* perl and also appears in Berkeley DB. This is one of the best
|
||||||
|
* known hash functions for strings because it is both computed
|
||||||
|
* very fast and distributes very well.
|
||||||
|
*
|
||||||
|
* The originator may be Dan Bernstein but the code in Berkeley DB
|
||||||
|
* cites Chris Torek as the source. The best citation I have found
|
||||||
|
* is "Chris Torek, Hash function for text in C, Usenet message
|
||||||
|
* <27038@mimsy.umd.edu> in comp.lang.c , October, 1990." in Rich
|
||||||
|
* Salz's USENIX 1992 paper about INN which can be found at
|
||||||
|
* <http://citeseer.nj.nec.com/salz92internetnews.html>.
|
||||||
|
*
|
||||||
|
* The magic of number 33, i.e. why it works better than many other
|
||||||
|
* constants, prime or not, has never been adequately explained by
|
||||||
|
* anyone. So I try an explanation: if one experimentally tests all
|
||||||
|
* multipliers between 1 and 256 (as I did while writing a low-level
|
||||||
|
* data structure library some time ago) one detects that even
|
||||||
|
* numbers are not useable at all. The remaining 128 odd numbers
|
||||||
|
* (except for the number 1) work more or less all equally well.
|
||||||
|
* They all distribute in an acceptable way and this way fill a hash
|
||||||
|
* table with an average percent of approx. 86%.
|
||||||
|
*
|
||||||
|
* If one compares the chi^2 values of the variants (see
|
||||||
|
* Bob Jenkins ``Hashing Frequently Asked Questions'' at
|
||||||
|
* http://burtleburtle.net/bob/hash/hashfaq.html for a description
|
||||||
|
* of chi^2), the number 33 not even has the best value. But the
|
||||||
|
* number 33 and a few other equally good numbers like 17, 31, 63,
|
||||||
|
* 127 and 129 have nevertheless a great advantage to the remaining
|
||||||
|
* numbers in the large set of possible multipliers: their multiply
|
||||||
|
* operation can be replaced by a faster operation based on just one
|
||||||
|
* shift plus either a single addition or subtraction operation. And
|
||||||
|
* because a hash function has to both distribute good _and_ has to
|
||||||
|
* be very fast to compute, those few numbers should be preferred.
|
||||||
|
*
|
||||||
|
* -- Ralf S. Engelschall <rse@engelschall.com>
|
||||||
|
*/
|
||||||
|
const unsigned int times33hash(const char* data, const unsigned int len) {
|
||||||
|
apr_ssize_t l = len;
|
||||||
|
return apr_hashfunc_default(data, &l);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A very fast, non-cryptographic hash suitable for general hash-based
|
||||||
|
* lookup. See http://murmurhash.googlepages.com/ for more details.
|
||||||
|
*
|
||||||
|
* Original code by Austin Appleby, released to the public domain and under
|
||||||
|
* the MIT license.
|
||||||
|
*
|
||||||
|
* Compiles down to ~52 instructions on x86.
|
||||||
|
* Passes chi^2 tests for practically all keysets & bucket sizes.
|
||||||
|
* Excellent avalanche behavior. Maximum bias is under 0.5%.
|
||||||
|
* Passes Bob Jenkin's frog.c torture-test. No collisions possible for 4 byte
|
||||||
|
* keys, no small 1 to 7 bit differentials.
|
||||||
|
*/
|
||||||
|
const unsigned int murmurhash(const char* key, const unsigned int klen) {
|
||||||
|
unsigned int len = klen;
|
||||||
|
const unsigned int seed = 0;
|
||||||
|
|
||||||
|
// 'm' and 'r' are mixing constants generated offline.
|
||||||
|
// They're not really 'magic', they just happen to work well.
|
||||||
|
const unsigned int m = 0x5bd1e995;
|
||||||
|
const int r = 24;
|
||||||
|
|
||||||
|
// Initialize the hash to a 'random' value
|
||||||
|
unsigned int h = seed ^ len;
|
||||||
|
|
||||||
|
// Mix 4 bytes at a time into the hash
|
||||||
|
const unsigned char* data = (const unsigned char*)key;
|
||||||
|
while(len >= 4) {
|
||||||
|
unsigned int k = *(unsigned int*)data;
|
||||||
|
k *= m;
|
||||||
|
k ^= k >> r;
|
||||||
|
k *= m;
|
||||||
|
h *= m;
|
||||||
|
h ^= k;
|
||||||
|
data += 4;
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the last few bytes of the input array
|
||||||
|
switch(len) {
|
||||||
|
case 3: h ^= data[2] << 16;
|
||||||
|
case 2: h ^= data[1] << 8;
|
||||||
|
case 1: h ^= data[0];
|
||||||
|
h *= m;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Do a few final mixes of the hash to ensure the last few
|
||||||
|
// bytes are well-incorporated.
|
||||||
|
h ^= h >> 13;
|
||||||
|
h *= m;
|
||||||
|
h ^= h >> 15;
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An endian and alignment neutral, but half the speed, version of
|
||||||
|
* the murmur hash.
|
||||||
|
*/
|
||||||
|
const unsigned int portablemurmurhash(const char* key, const unsigned int klen) {
|
||||||
|
unsigned int len = klen;
|
||||||
|
const unsigned int seed = 0;
|
||||||
|
|
||||||
|
// 'm' and 'r' are mixing constants generated offline.
|
||||||
|
// They're not really 'magic', they just happen to work well.
|
||||||
|
const unsigned int m = 0x5bd1e995;
|
||||||
|
const int r = 24;
|
||||||
|
|
||||||
|
// Initialize the hash to a 'random' value
|
||||||
|
unsigned int h = seed ^ len;
|
||||||
|
|
||||||
|
// Mix 4 bytes at a time into the hash
|
||||||
|
const unsigned char* data = (const unsigned char *)key;
|
||||||
|
while(len >= 4) {
|
||||||
|
unsigned int k;
|
||||||
|
k = data[0];
|
||||||
|
k |= data[1] << 8;
|
||||||
|
k |= data[2] << 16;
|
||||||
|
k |= data[3] << 24;
|
||||||
|
k *= m;
|
||||||
|
k ^= k >> r;
|
||||||
|
k *= m;
|
||||||
|
h *= m;
|
||||||
|
h ^= k;
|
||||||
|
data += 4;
|
||||||
|
len -= 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle the last few bytes of the input array
|
||||||
|
switch(len) {
|
||||||
|
case 3: h ^= data[2] << 16;
|
||||||
|
case 2: h ^= data[1] << 8;
|
||||||
|
case 1: h ^= data[0];
|
||||||
|
h *= m;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Do a few final mixes of the hash to ensure the last few
|
||||||
|
// bytes are well-incorporated.
|
||||||
|
h ^= h >> 13;
|
||||||
|
h *= m;
|
||||||
|
h ^= h >> 15;
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned int hashselect(const unsigned int hash, const unsigned int max) {
|
||||||
|
return hash % max;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif /* tuscany_hash_hpp */
|
||||||
594
sca-cpp/branches/gcc-4.4/kernel/kernel-test.cpp
Normal file
594
sca-cpp/branches/gcc-4.4/kernel/kernel-test.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
559
sca-cpp/branches/gcc-4.4/kernel/list.hpp
Normal file
559
sca-cpp/branches/gcc-4.4/kernel/list.hpp
Normal file
|
|
@ -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 */
|
||||||
162
sca-cpp/branches/gcc-4.4/kernel/mem-test.cpp
Normal file
162
sca-cpp/branches/gcc-4.4/kernel/mem-test.cpp
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
486
sca-cpp/branches/gcc-4.4/kernel/monad.hpp
Normal file
486
sca-cpp/branches/gcc-4.4/kernel/monad.hpp
Normal file
|
|
@ -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 */
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue