Starting porting RSS binding to 2.x in support of Travel Sample scenario
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@926224 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6531329fb4
commit
64ca38e5cb
20 changed files with 1645 additions and 0 deletions
205
sca-java-2.x/trunk/modules/binding-rss-runtime/LICENSE
Normal file
205
sca-java-2.x/trunk/modules/binding-rss-runtime/LICENSE
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
|
6
sca-java-2.x/trunk/modules/binding-rss-runtime/NOTICE
Normal file
6
sca-java-2.x/trunk/modules/binding-rss-runtime/NOTICE
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
${pom.name}
|
||||||
|
Copyright (c) 2005 - 2009 The Apache Software Foundation
|
||||||
|
|
||||||
|
This product includes software developed by
|
||||||
|
The Apache Software Foundation (http://www.apache.org/).
|
||||||
|
|
171
sca-java-2.x/trunk/modules/binding-rss-runtime/pom.xml
Normal file
171
sca-java-2.x/trunk/modules/binding-rss-runtime/pom.xml
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
-->
|
||||||
|
<project>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-modules</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>tuscany-binding-rss-rome</artifactId>
|
||||||
|
<name>Apache Tuscany SCA RSS Feed Binding Extension</name>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-assembly</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-binding-rss</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-interface-java</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-data-api</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-core-spi</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-databinding</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-host-http</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-httpclient</groupId>
|
||||||
|
<artifactId>commons-httpclient</artifactId>
|
||||||
|
<version>3.1</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>rome</groupId>
|
||||||
|
<artifactId>rome</artifactId>
|
||||||
|
<version>0.9</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>servlet-api</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-host-jetty</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-implementation-java-runtime</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.tuscany.sca</groupId>
|
||||||
|
<artifactId>tuscany-host-embedded</artifactId>
|
||||||
|
<version>1.7-SNAPSHOT</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.5</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>1.3</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<version>1.1.1</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>servlet-api</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>avalon-framework</groupId>
|
||||||
|
<artifactId>avalon-framework</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.felix</groupId>
|
||||||
|
<artifactId>maven-bundle-plugin</artifactId>
|
||||||
|
|
||||||
|
<configuration>
|
||||||
|
<instructions>
|
||||||
|
<Bundle-Version>${tuscany.version}</Bundle-Version>
|
||||||
|
<Bundle-SymbolicName>org.apache.tuscany.sca.binding.rss.rome</Bundle-SymbolicName>
|
||||||
|
<Bundle-Description>${pom.name}</Bundle-Description>
|
||||||
|
<Export-Package>org.apache.tuscany.sca.binding.rss*</Export-Package>
|
||||||
|
</instructions>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.tuscany.sca.binding.rss.collection;
|
||||||
|
|
||||||
|
import org.osoa.sca.annotations.Remotable;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntry;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeed;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to a collection of resources using RSS.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
@Remotable
|
||||||
|
public interface Collection {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an RSS feed for a collection of resources.
|
||||||
|
*
|
||||||
|
* @return the RSS feed
|
||||||
|
*/
|
||||||
|
SyndFeed getFeed();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an RSS feed for a collection of resources resulting from a query.
|
||||||
|
*
|
||||||
|
* @param queryString the query string
|
||||||
|
* @return the RSS feed
|
||||||
|
*/
|
||||||
|
SyndFeed query(String queryString);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves an RSS entry.
|
||||||
|
*
|
||||||
|
* @param id The entry ID
|
||||||
|
* @return The requested entry
|
||||||
|
* @throws NotFoundException No entry found with the given ID
|
||||||
|
*/
|
||||||
|
SyndEntry get(String id) throws NotFoundException;
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.tuscany.sca.binding.rss.collection;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.osoa.sca.annotations.Remotable;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.atom.Entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to a collection of resources using Atom.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
@Remotable
|
||||||
|
public interface MediaCollection extends Collection {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new media entry
|
||||||
|
*
|
||||||
|
* @param title
|
||||||
|
* @param slug
|
||||||
|
* @param contentType
|
||||||
|
* @param media
|
||||||
|
*/
|
||||||
|
Entry postMedia(String title, String slug, String contentType, InputStream media);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update a media entry.
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @param contentType
|
||||||
|
* @param media
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void putMedia(String id, String contentType, InputStream media) throws NotFoundException;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss.collection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates that a resource could not be found.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
public class NotFoundException extends Exception {
|
||||||
|
private static final long serialVersionUID = -5046027674128627383L;
|
||||||
|
|
||||||
|
public NotFoundException() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotFoundException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotFoundException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public NotFoundException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.tuscany.sca.binding.rss.provider;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.invocation.DataExchangeSemantics;
|
||||||
|
import org.apache.tuscany.sca.invocation.Invoker;
|
||||||
|
import org.apache.tuscany.sca.invocation.Message;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeed;
|
||||||
|
import com.sun.syndication.io.FeedException;
|
||||||
|
import com.sun.syndication.io.SyndFeedInput;
|
||||||
|
import com.sun.syndication.io.XmlReader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoker for the RSS binding.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
class RSSBindingInvoker implements Invoker , DataExchangeSemantics {
|
||||||
|
private static final Logger logger = Logger.getLogger(RSSBindingInvoker.class.getName());
|
||||||
|
|
||||||
|
private String uri;
|
||||||
|
|
||||||
|
RSSBindingInvoker(String uri, String feedType) {
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Message invoke(Message msg) {
|
||||||
|
try {
|
||||||
|
logger.fine("invoke " + uri);
|
||||||
|
|
||||||
|
// Read an RSS feed into a Synd feed
|
||||||
|
SyndFeedInput input = new SyndFeedInput();
|
||||||
|
SyndFeed feed = input.build(new XmlReader(new URL(uri)));
|
||||||
|
|
||||||
|
//FIXME Support conversion to data-api entries
|
||||||
|
|
||||||
|
msg.setBody(feed);
|
||||||
|
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
msg.setFaultBody(e);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
msg.setFaultBody(e);
|
||||||
|
} catch (FeedException e) {
|
||||||
|
msg.setFaultBody(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
msg.setFaultBody(e);
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean allowsPassByReference() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,397 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package org.apache.tuscany.sca.binding.rss.provider;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServlet;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.apache.tuscany.sca.data.collection.Item;
|
||||||
|
import org.apache.tuscany.sca.databinding.Mediator;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.DataType;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.Operation;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.util.XMLType;
|
||||||
|
import org.apache.tuscany.sca.invocation.InvocationChain;
|
||||||
|
import org.apache.tuscany.sca.invocation.Invoker;
|
||||||
|
import org.apache.tuscany.sca.invocation.Message;
|
||||||
|
import org.apache.tuscany.sca.invocation.MessageFactory;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeWire;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.synd.SyndContent;
|
||||||
|
import com.sun.syndication.feed.synd.SyndContentImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntry;
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntryImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeed;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeedImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndLink;
|
||||||
|
import com.sun.syndication.feed.synd.SyndLinkImpl;
|
||||||
|
import com.sun.syndication.io.FeedException;
|
||||||
|
import com.sun.syndication.io.SyndFeedOutput;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An RSS binding listener, implemented as a Servlet and
|
||||||
|
* registered in a Servlet host provided by the SCA hosting runtime.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
class RSSBindingListenerServlet extends HttpServlet {
|
||||||
|
private static final Logger logger = Logger.getLogger(RSSBindingListenerServlet.class.getName());
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private RuntimeWire wire;
|
||||||
|
private Invoker getFeedInvoker;
|
||||||
|
private Invoker getAllInvoker;
|
||||||
|
private Invoker queryInvoker;
|
||||||
|
private MessageFactory messageFactory;
|
||||||
|
private Mediator mediator;
|
||||||
|
private DataType<?> itemClassType;
|
||||||
|
private DataType<?> itemXMLType;
|
||||||
|
private boolean supportsFeedEntries;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new binding listener.
|
||||||
|
*
|
||||||
|
* @param wire
|
||||||
|
* @param messageFactory
|
||||||
|
*/
|
||||||
|
RSSBindingListenerServlet(RuntimeWire wire, MessageFactory messageFactory, Mediator mediator) {
|
||||||
|
this.wire = wire;
|
||||||
|
this.messageFactory = messageFactory;
|
||||||
|
this.mediator = mediator;
|
||||||
|
|
||||||
|
// Get the invokers for the supported operations
|
||||||
|
Operation getOperation = null;
|
||||||
|
for (InvocationChain invocationChain : this.wire.getInvocationChains()) {
|
||||||
|
invocationChain.setAllowsPassByReference(true);
|
||||||
|
Operation operation = invocationChain.getTargetOperation();
|
||||||
|
String operationName = operation.getName();
|
||||||
|
if (operationName.equals("getFeed")) {
|
||||||
|
getFeedInvoker = invocationChain.getHeadInvoker();
|
||||||
|
} else if (operationName.equals("getAll")) {
|
||||||
|
getAllInvoker = invocationChain.getHeadInvoker();
|
||||||
|
} else if (operationName.equals("query")) {
|
||||||
|
queryInvoker = invocationChain.getHeadInvoker();
|
||||||
|
} else if (operationName.equals("get")) {
|
||||||
|
getOperation = operation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine the collection item type
|
||||||
|
if (getOperation != null) {
|
||||||
|
itemXMLType = new DataTypeImpl<Class<?>>(String.class.getName(), String.class, String.class);
|
||||||
|
Class<?> itemClass = getOperation.getOutputType().getPhysical();
|
||||||
|
if (itemClass == SyndEntry.class) {
|
||||||
|
supportsFeedEntries = true;
|
||||||
|
}
|
||||||
|
DataType<XMLType> outputType = getOperation.getOutputType();
|
||||||
|
QName qname = outputType.getLogical().getElementName();
|
||||||
|
qname = new QName(qname.getNamespaceURI(), itemClass.getSimpleName());
|
||||||
|
itemClassType = new DataTypeImpl<XMLType>("java:complexType", itemClass, new XMLType(qname, null));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||||
|
|
||||||
|
// No authentication required for a get request
|
||||||
|
|
||||||
|
// Get the request path
|
||||||
|
String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
|
||||||
|
|
||||||
|
logger.fine("get " + request.getRequestURI());
|
||||||
|
|
||||||
|
// Handle an RSS request
|
||||||
|
if (path == null || path.length() == 0 || path.equals("/")) {
|
||||||
|
|
||||||
|
// Return an RSS feed containing the entries in the collection
|
||||||
|
SyndFeed feed = null;
|
||||||
|
if (supportsFeedEntries) {
|
||||||
|
|
||||||
|
// The service implementation supports feed entries, invoke its getFeed operation
|
||||||
|
Message requestMessage = messageFactory.createMessage();
|
||||||
|
Message responseMessage = getFeedInvoker.invoke(requestMessage);
|
||||||
|
if (responseMessage.isFault()) {
|
||||||
|
throw new ServletException((Throwable)responseMessage.getBody());
|
||||||
|
}
|
||||||
|
feed = (SyndFeed)responseMessage.getBody();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// The service implementation does not support feed entries, invoke its
|
||||||
|
// getAll operation to get the data item collection. then create feed entries
|
||||||
|
// from the data items
|
||||||
|
Message requestMessage = messageFactory.createMessage();
|
||||||
|
Message responseMessage;
|
||||||
|
if (request.getQueryString() != null) {
|
||||||
|
requestMessage.setBody(new Object[] {request.getQueryString()});
|
||||||
|
responseMessage = queryInvoker.invoke(requestMessage);
|
||||||
|
} else {
|
||||||
|
responseMessage = getAllInvoker.invoke(requestMessage);
|
||||||
|
}
|
||||||
|
if (responseMessage.isFault()) {
|
||||||
|
throw new ServletException((Throwable)responseMessage.getBody());
|
||||||
|
}
|
||||||
|
org.apache.tuscany.sca.data.collection.Entry<Object, Object>[] collection =
|
||||||
|
(org.apache.tuscany.sca.data.collection.Entry<Object, Object>[])responseMessage.getBody();
|
||||||
|
if (collection != null) {
|
||||||
|
// Create the feed
|
||||||
|
feed = new SyndFeedImpl();
|
||||||
|
feed.setTitle("Feed");
|
||||||
|
feed.setDescription("Feed description");
|
||||||
|
|
||||||
|
for (org.apache.tuscany.sca.data.collection.Entry<Object, Object> entry: collection) {
|
||||||
|
SyndEntry feedEntry = createFeedEntry(entry);
|
||||||
|
feed.getEntries().add(feedEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert to an RSS feed
|
||||||
|
if (feed != null) {
|
||||||
|
response.setContentType("application/rss+xml; charset=utf-8");
|
||||||
|
feed.setFeedType("rss_2.0");
|
||||||
|
feed.setLink(path);
|
||||||
|
SyndFeedOutput syndOutput = new SyndFeedOutput();
|
||||||
|
try {
|
||||||
|
syndOutput.output(feed, getWriter(response));
|
||||||
|
} catch (FeedException e) {
|
||||||
|
throw new ServletException(e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
response.sendError(HttpServletResponse.SC_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an RSS entry from a data collection entry.
|
||||||
|
* @param entry
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private SyndEntry createFeedEntry(org.apache.tuscany.sca.data.collection.Entry<Object, Object> entry) {
|
||||||
|
Object key = entry.getKey();
|
||||||
|
Object data = entry.getData();
|
||||||
|
if (data instanceof Item) {
|
||||||
|
Item item = (Item)data;
|
||||||
|
|
||||||
|
SyndEntry feedEntry = new SyndEntryImpl();
|
||||||
|
feedEntry.setUri(key.toString());
|
||||||
|
feedEntry.setTitle(item.getTitle());
|
||||||
|
|
||||||
|
String value = item.getContents();
|
||||||
|
if (value != null) {
|
||||||
|
SyndContent content = new SyndContentImpl();
|
||||||
|
content.setType("text/xml");
|
||||||
|
content.setValue(value);
|
||||||
|
List<SyndContent> contents = new ArrayList<SyndContent>();
|
||||||
|
contents.add(content);
|
||||||
|
feedEntry.setContents(contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
String href = item.getLink();
|
||||||
|
if (href == null) {
|
||||||
|
href = key.toString();
|
||||||
|
}
|
||||||
|
SyndLink link = new SyndLinkImpl();
|
||||||
|
link.setRel("edit");
|
||||||
|
link.setHref(href);
|
||||||
|
feedEntry.getLinks().add(link);
|
||||||
|
link = new SyndLinkImpl();
|
||||||
|
link.setRel("alternate");
|
||||||
|
link.setHref(href);
|
||||||
|
feedEntry.getLinks().add(link);
|
||||||
|
feedEntry.setLink(href);
|
||||||
|
|
||||||
|
Date date = item.getDate();
|
||||||
|
if (date == null) {
|
||||||
|
date = new Date();
|
||||||
|
}
|
||||||
|
feedEntry.setPublishedDate(date);
|
||||||
|
return feedEntry;
|
||||||
|
|
||||||
|
} else if (data != null) {
|
||||||
|
SyndEntry feedEntry = new SyndEntryImpl();
|
||||||
|
feedEntry.setUri(key.toString());
|
||||||
|
feedEntry.setTitle("item");
|
||||||
|
|
||||||
|
// Convert the item to XML
|
||||||
|
String value = mediator.mediate(data, itemClassType, itemXMLType, null).toString();
|
||||||
|
|
||||||
|
SyndContent content = new SyndContentImpl();
|
||||||
|
content.setType("text/xml");
|
||||||
|
content.setValue(value);
|
||||||
|
List<SyndContent> contents = new ArrayList<SyndContent>();
|
||||||
|
contents.add(content);
|
||||||
|
feedEntry.setContents(contents);
|
||||||
|
|
||||||
|
SyndLink link = new SyndLinkImpl();
|
||||||
|
link.setRel("edit");
|
||||||
|
link.setHref(key.toString());
|
||||||
|
feedEntry.getLinks().add(link);
|
||||||
|
link = new SyndLinkImpl();
|
||||||
|
link.setRel("alternate");
|
||||||
|
link.setHref(key.toString());
|
||||||
|
feedEntry.getLinks().add(link);
|
||||||
|
|
||||||
|
feedEntry.setPublishedDate(new Date());
|
||||||
|
return feedEntry;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a data collection entry from an RSS entry.
|
||||||
|
* @param feedEntry
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private org.apache.tuscany.sca.data.collection.Entry<Object, Object> createEntry(SyndEntry feedEntry) {
|
||||||
|
if (feedEntry != null) {
|
||||||
|
if (itemClassType.getPhysical() == Item.class) {
|
||||||
|
String key = feedEntry.getUri();
|
||||||
|
|
||||||
|
Item item = new Item();
|
||||||
|
item.setTitle(feedEntry.getTitle());
|
||||||
|
|
||||||
|
List<?> contents = feedEntry.getContents();
|
||||||
|
if (!contents.isEmpty()) {
|
||||||
|
SyndContent content = (SyndContent)contents.get(0);
|
||||||
|
String value = content.getValue();
|
||||||
|
item.setContents(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Object l : feedEntry.getLinks()) {
|
||||||
|
SyndLink link = (SyndLink)l;
|
||||||
|
if (link.getRel() == null || "edit".equals(link.getRel())) {
|
||||||
|
String href = link.getHref();
|
||||||
|
if (href.startsWith("null/")) {
|
||||||
|
href = href.substring(5);
|
||||||
|
}
|
||||||
|
item.setLink(href);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.setDate(feedEntry.getPublishedDate());
|
||||||
|
|
||||||
|
return new org.apache.tuscany.sca.data.collection.Entry<Object, Object>(key, item);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
String key = feedEntry.getUri();
|
||||||
|
|
||||||
|
// Create the item from XML
|
||||||
|
List<?> contents = feedEntry.getContents();
|
||||||
|
if (contents.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
SyndContent content = (SyndContent)contents.get(0);
|
||||||
|
String value = content.getValue();
|
||||||
|
Object data = mediator.mediate(value, itemXMLType, itemClassType, null);
|
||||||
|
|
||||||
|
return new org.apache.tuscany.sca.data.collection.Entry<Object, Object>(key, data);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Writer getWriter(HttpServletResponse response) throws UnsupportedEncodingException, IOException {
|
||||||
|
Writer writer = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
|
||||||
|
return writer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process the authorization header
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @return
|
||||||
|
* @throws ServletException
|
||||||
|
*/
|
||||||
|
private String processAuthorizationHeader(HttpServletRequest request) throws ServletException {
|
||||||
|
try {
|
||||||
|
String authorization = request.getHeader("Authorization");
|
||||||
|
if (authorization != null) {
|
||||||
|
StringTokenizer tokens = new StringTokenizer(authorization);
|
||||||
|
if (tokens.hasMoreTokens()) {
|
||||||
|
String basic = tokens.nextToken();
|
||||||
|
if (basic.equalsIgnoreCase("Basic")) {
|
||||||
|
String credentials = tokens.nextToken();
|
||||||
|
String userAndPassword = new String(Base64.decodeBase64(credentials.getBytes()));
|
||||||
|
int colon = userAndPassword.indexOf(":");
|
||||||
|
if (colon != -1) {
|
||||||
|
String user = userAndPassword.substring(0, colon);
|
||||||
|
String password = userAndPassword.substring(colon + 1);
|
||||||
|
|
||||||
|
// Authenticate the User.
|
||||||
|
if (authenticate(user, password)) {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new ServletException(e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authenticate a user.
|
||||||
|
*
|
||||||
|
* @param user
|
||||||
|
* @param password
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean authenticate(String user, String password) {
|
||||||
|
|
||||||
|
// TODO Handle this using SCA security policies
|
||||||
|
//FIXME Why are we using endsWith instead of equals here??
|
||||||
|
return ("admin".endsWith(user) && "admin".equals(password));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reject an unauthorized request.
|
||||||
|
*
|
||||||
|
* @param response
|
||||||
|
*/
|
||||||
|
private void unauthorized(HttpServletResponse response) throws IOException {
|
||||||
|
response.setHeader("WWW-Authenticate", "BASIC realm=\"Tuscany\"");
|
||||||
|
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss.provider;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.binding.rss.RSSBinding;
|
||||||
|
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
|
||||||
|
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
|
||||||
|
import org.apache.tuscany.sca.core.UtilityExtensionPoint;
|
||||||
|
import org.apache.tuscany.sca.databinding.Mediator;
|
||||||
|
import org.apache.tuscany.sca.host.http.ServletHost;
|
||||||
|
import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint;
|
||||||
|
import org.apache.tuscany.sca.invocation.MessageFactory;
|
||||||
|
import org.apache.tuscany.sca.provider.BindingProviderFactory;
|
||||||
|
import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
|
||||||
|
import org.apache.tuscany.sca.provider.ServiceBindingProvider;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponent;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponentService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of the RSS binding provider factory.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
public class RSSBindingProviderFactory implements BindingProviderFactory<RSSBinding> {
|
||||||
|
|
||||||
|
private MessageFactory messageFactory;
|
||||||
|
private Mediator mediator;
|
||||||
|
private ServletHost servletHost;
|
||||||
|
|
||||||
|
public RSSBindingProviderFactory(ExtensionPointRegistry extensionPoints) {
|
||||||
|
ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class);
|
||||||
|
this.servletHost = servletHosts.getServletHosts().get(0);
|
||||||
|
ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
|
||||||
|
this.messageFactory = modelFactories.getFactory(MessageFactory.class);
|
||||||
|
this.mediator = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class).getUtility(Mediator.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component,
|
||||||
|
RuntimeComponentReference reference,
|
||||||
|
RSSBinding binding) {
|
||||||
|
return new RSSReferenceBindingProvider(component, reference, binding);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component,
|
||||||
|
RuntimeComponentService service,
|
||||||
|
RSSBinding binding) {
|
||||||
|
return new RSSServiceBindingProvider(component, service, binding, servletHost, messageFactory, mediator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<RSSBinding> getModelType() {
|
||||||
|
return RSSBinding.class;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss.provider;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.binding.rss.RSSBinding;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.Operation;
|
||||||
|
import org.apache.tuscany.sca.invocation.Invoker;
|
||||||
|
import org.apache.tuscany.sca.provider.ReferenceBindingProvider;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponent;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponentReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of the RSS binding provider.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
class RSSReferenceBindingProvider implements ReferenceBindingProvider {
|
||||||
|
|
||||||
|
private RuntimeComponentReference reference;
|
||||||
|
private RSSBinding binding;
|
||||||
|
|
||||||
|
RSSReferenceBindingProvider(RuntimeComponent component,
|
||||||
|
RuntimeComponentReference reference,
|
||||||
|
RSSBinding binding) {
|
||||||
|
this.reference = reference;
|
||||||
|
this.binding = binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Invoker createInvoker(Operation operation) {
|
||||||
|
return new RSSBindingInvoker(binding.getURI(), "rss_2.0");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportsOneWayInvocation() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InterfaceContract getBindingInterfaceContract() {
|
||||||
|
return reference.getInterfaceContract();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss.provider;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.binding.rss.RSSBinding;
|
||||||
|
import org.apache.tuscany.sca.databinding.Mediator;
|
||||||
|
import org.apache.tuscany.sca.host.http.ServletHost;
|
||||||
|
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
|
||||||
|
import org.apache.tuscany.sca.invocation.MessageFactory;
|
||||||
|
import org.apache.tuscany.sca.provider.ServiceBindingProvider;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponent;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeComponentService;
|
||||||
|
import org.apache.tuscany.sca.runtime.RuntimeWire;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of the RSS binding provider.
|
||||||
|
*
|
||||||
|
* @version $Rev$ $Date$
|
||||||
|
*/
|
||||||
|
class RSSServiceBindingProvider implements ServiceBindingProvider {
|
||||||
|
|
||||||
|
private RuntimeComponentService service;
|
||||||
|
private RSSBinding binding;
|
||||||
|
private ServletHost servletHost;
|
||||||
|
private MessageFactory messageFactory;
|
||||||
|
private String servletMapping;
|
||||||
|
private Mediator mediator;
|
||||||
|
|
||||||
|
RSSServiceBindingProvider(RuntimeComponent component,
|
||||||
|
RuntimeComponentService service,
|
||||||
|
RSSBinding binding,
|
||||||
|
ServletHost servletHost,
|
||||||
|
MessageFactory messageFactory,
|
||||||
|
Mediator mediator) {
|
||||||
|
this.service = service;
|
||||||
|
this.binding = binding;
|
||||||
|
this.servletHost = servletHost;
|
||||||
|
this.messageFactory = messageFactory;
|
||||||
|
this.mediator = mediator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InterfaceContract getBindingInterfaceContract() {
|
||||||
|
return service.getInterfaceContract();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean supportsOneWayInvocation() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
RuntimeComponentService componentService = (RuntimeComponentService)service;
|
||||||
|
RuntimeWire wire = componentService.getRuntimeWire(binding);
|
||||||
|
|
||||||
|
RSSBindingListenerServlet servlet =
|
||||||
|
new RSSBindingListenerServlet(wire, messageFactory, mediator);
|
||||||
|
|
||||||
|
servletMapping = binding.getURI();
|
||||||
|
servletHost.addServletMapping(servletMapping, servlet);
|
||||||
|
|
||||||
|
// Save the actual binding URI in the binding
|
||||||
|
binding.setURI(servletHost.getURLMapping(binding.getURI()).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
servletHost.removeServletMapping(servletMapping);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
# Implementation class for the binding extension
|
||||||
|
org.apache.tuscany.sca.binding.rss.provider.RSSBindingProviderFactory;model=org.apache.tuscany.sca.binding.rss.RSSBinding
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.host.embedded.SCADomain;
|
||||||
|
|
||||||
|
public class Consumer {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/feed/Consumer.composite");
|
||||||
|
|
||||||
|
CustomerClient testService = scaDomain.getService(CustomerClient.class, "CustomerClient");
|
||||||
|
testService.testCustomerCollection();
|
||||||
|
|
||||||
|
scaDomain.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss;
|
||||||
|
|
||||||
|
public interface CustomerClient {
|
||||||
|
|
||||||
|
void testCustomerCollection() throws Exception;
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.binding.rss.collection.Collection;
|
||||||
|
import org.osoa.sca.annotations.Reference;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntry;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeed;
|
||||||
|
|
||||||
|
|
||||||
|
public class CustomerClientImpl implements CustomerClient {
|
||||||
|
|
||||||
|
@Reference
|
||||||
|
public Collection resourceCollection;
|
||||||
|
|
||||||
|
public void testCustomerCollection() throws Exception {
|
||||||
|
|
||||||
|
System.out.println(">>> get collection");
|
||||||
|
SyndFeed feed = resourceCollection.getFeed();
|
||||||
|
System.out.println("<<< get collection");
|
||||||
|
for (Object o : feed.getEntries()) {
|
||||||
|
SyndEntry e = (SyndEntry)o;
|
||||||
|
System.out.println("id = " + e.getUri() + " entry = " + e.getTitle());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.binding.rss.collection.Collection;
|
||||||
|
import org.apache.tuscany.sca.binding.rss.collection.NotFoundException;
|
||||||
|
import org.osoa.sca.annotations.Scope;
|
||||||
|
|
||||||
|
import com.sun.syndication.feed.synd.SyndContent;
|
||||||
|
import com.sun.syndication.feed.synd.SyndContentImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntry;
|
||||||
|
import com.sun.syndication.feed.synd.SyndEntryImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeed;
|
||||||
|
import com.sun.syndication.feed.synd.SyndFeedImpl;
|
||||||
|
import com.sun.syndication.feed.synd.SyndLink;
|
||||||
|
import com.sun.syndication.feed.synd.SyndLinkImpl;
|
||||||
|
|
||||||
|
@Scope("COMPOSITE")
|
||||||
|
public class CustomerCollectionImpl implements Collection {
|
||||||
|
|
||||||
|
private Map<String, SyndEntry> entries = new HashMap<String, SyndEntry>();
|
||||||
|
|
||||||
|
public CustomerCollectionImpl() {
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
String id = "urn:uuid:customer-" + UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
SyndEntry entry = new SyndEntryImpl();
|
||||||
|
entry.setTitle("customer " + "Jane Doe_" + String.valueOf(i));
|
||||||
|
entry.setUri(id);
|
||||||
|
|
||||||
|
SyndContent content = new SyndContentImpl();
|
||||||
|
content.setValue("Jane Doe_" + String.valueOf(i));
|
||||||
|
content.setType("text");
|
||||||
|
entry.setContents(Collections.singletonList(content));
|
||||||
|
|
||||||
|
List<SyndLink> links = new ArrayList<SyndLink>();
|
||||||
|
SyndLink link = new SyndLinkImpl();
|
||||||
|
link.setRel("edit");
|
||||||
|
link.setHref("" + id);
|
||||||
|
links.add(link);
|
||||||
|
entry.setLinks(links);
|
||||||
|
|
||||||
|
links = new ArrayList<SyndLink>();
|
||||||
|
link = new SyndLinkImpl();
|
||||||
|
link.setRel("alternate");
|
||||||
|
link.setHref("" + id);
|
||||||
|
links.add(link);
|
||||||
|
entry.setLinks(links);
|
||||||
|
|
||||||
|
entry.setPublishedDate(new Date());
|
||||||
|
|
||||||
|
entries.put(id, entry);
|
||||||
|
System.out.println(">>> id=" + id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public SyndFeed getFeed() {
|
||||||
|
System.out.println(">>> CustomerCollectionImpl.getFeed");
|
||||||
|
|
||||||
|
SyndFeed feed = new SyndFeedImpl();
|
||||||
|
feed.setTitle("customers");
|
||||||
|
feed.setDescription("This is a sample feed");
|
||||||
|
feed.getEntries().addAll(entries.values());
|
||||||
|
return feed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SyndFeed query(String queryString) {
|
||||||
|
System.out.println(">>> CustomerCollectionImpl.query");
|
||||||
|
|
||||||
|
SyndFeed feed = new SyndFeedImpl();
|
||||||
|
feed.setTitle("customers");
|
||||||
|
feed.setDescription("This is a sample feed");
|
||||||
|
feed.getEntries().addAll(entries.values());
|
||||||
|
return feed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public SyndEntry get(String id) throws NotFoundException {
|
||||||
|
final SyndEntry entry = entries.get(id);
|
||||||
|
if (id == null) {
|
||||||
|
throw new NotFoundException("No entry found with ID " + id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.host.embedded.SCADomain;
|
||||||
|
|
||||||
|
public class Provider {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
SCADomain scaDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/feed/Provider.composite");
|
||||||
|
System.out.println("Provider.composite ready...");
|
||||||
|
|
||||||
|
try {
|
||||||
|
System.in.read();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
scaDomain.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.tuscany.sca.binding.rss;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
|
||||||
|
import org.apache.tuscany.sca.host.embedded.SCADomain;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic test case that will get the feed entries from an RSS feed.
|
||||||
|
*/
|
||||||
|
public class RSSGetTestCase {
|
||||||
|
protected static SCADomain scaConsumerDomain;
|
||||||
|
protected static SCADomain scaProviderDomain;
|
||||||
|
protected static CustomerClient testService;
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void init() throws Exception {
|
||||||
|
System.out.println(">>>RSSGetTestCase.init entry");
|
||||||
|
scaProviderDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/rss/Provider.composite");
|
||||||
|
scaConsumerDomain = SCADomain.newInstance("org/apache/tuscany/sca/binding/rss/Consumer.composite");
|
||||||
|
testService = scaConsumerDomain.getService(CustomerClient.class, "CustomerClient");
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void destroy() throws Exception {
|
||||||
|
// System.out.println(">>>RSSGetTestCase.destroy entry");
|
||||||
|
if (scaConsumerDomain != null) {
|
||||||
|
scaConsumerDomain.close();
|
||||||
|
}
|
||||||
|
if (scaProviderDomain != null) {
|
||||||
|
scaProviderDomain.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPrelim() throws Exception {
|
||||||
|
Assert.assertNotNull(scaProviderDomain);
|
||||||
|
Assert.assertNotNull(scaConsumerDomain);
|
||||||
|
Assert.assertNotNull(testService);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRSSGet() throws Exception {
|
||||||
|
testService.testCustomerCollection();
|
||||||
|
}
|
||||||
|
}
|
|
@ -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://www.osoa.org/xmlns/sca/1.0"
|
||||||
|
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
|
||||||
|
targetNamespace="http://customer"
|
||||||
|
name="Consumer">
|
||||||
|
|
||||||
|
<component name="CustomerClient">
|
||||||
|
<implementation.java class="org.apache.tuscany.sca.binding.rss.CustomerClientImpl"/>
|
||||||
|
<reference name="resourceCollection">
|
||||||
|
<tuscany:binding.rss uri="http://localhost:8084/customer"/>
|
||||||
|
</reference>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
</composite>
|
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
-->
|
||||||
|
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
|
||||||
|
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
|
||||||
|
targetNamespace = "http://customer"
|
||||||
|
name="Provider">
|
||||||
|
|
||||||
|
<service name="customer" promote="CustomerCollection">
|
||||||
|
<tuscany:binding.rss uri = "http://localhost:8084/customer"/>
|
||||||
|
</service>
|
||||||
|
|
||||||
|
<component name="CustomerCollection">
|
||||||
|
<implementation.java class="org.apache.tuscany.sca.binding.rss.CustomerCollectionImpl"/>
|
||||||
|
</component>
|
||||||
|
|
||||||
|
</composite>
|
Loading…
Add table
Reference in a new issue