Starting to work on porting binding-http-runtime from 1.x branch
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@784561 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8f058e3242
commit
f7cdb52f0e
22 changed files with 3169 additions and 0 deletions
205
java/sca/modules/binding-http-runtime/LICENSE
Normal file
205
java/sca/modules/binding-http-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
java/sca/modules/binding-http-runtime/NOTICE
Normal file
6
java/sca/modules/binding-http-runtime/NOTICE
Normal file
|
@ -0,0 +1,6 @@
|
|||
${pom.name}
|
||||
Copyright (c) 2005 - 2008 The Apache Software Foundation
|
||||
|
||||
This product includes software developed by
|
||||
The Apache Software Foundation (http://www.apache.org/).
|
||||
|
120
java/sca/modules/binding-http-runtime/pom.xml
Normal file
120
java/sca/modules/binding-http-runtime/pom.xml
Normal file
|
@ -0,0 +1,120 @@
|
|||
<?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.6-SNAPSHOT</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>tuscany-binding-http-runtime</artifactId>
|
||||
<name>Apache Tuscany SCA HTTP Binding Runtime</name>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-binding-http</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-policy-security-http</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-core-spi</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-host-http</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
<version>2.5</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-host-embedded</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-host-jetty</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-implementation-resource-runtime</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tuscany.sca</groupId>
|
||||
<artifactId>tuscany-implementation-java-runtime</artifactId>
|
||||
<version>1.6-SNAPSHOT</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.5</version>
|
||||
<scope>test</scope>
|
||||
</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.http.runtime</Bundle-SymbolicName>
|
||||
<Bundle-Description>${pom.name}</Bundle-Description>
|
||||
<Export-Package>org.apache.tuscany.sca.binding.http*</Export-Package>
|
||||
</instructions>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,516 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT 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.http.provider;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URLDecoder;
|
||||
import java.text.ParseException;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import org.apache.tuscany.sca.assembly.Binding;
|
||||
import org.apache.tuscany.sca.binding.http.HTTPCacheContext;
|
||||
import org.apache.tuscany.sca.binding.http.util.HTTPHeadersParser;
|
||||
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.policy.Intent;
|
||||
import org.apache.tuscany.sca.policy.PolicySet;
|
||||
import org.apache.tuscany.sca.policy.PolicySetAttachPoint;
|
||||
import org.apache.tuscany.sca.policy.authentication.basic.BasicAuthenticationPolicy;
|
||||
|
||||
/**
|
||||
* Servlet responsible for dispatching HTTP requests to the
|
||||
* target component implementation.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPBindingListenerServlet extends HttpServlet {
|
||||
private static final long serialVersionUID = 2865466417329430610L;
|
||||
|
||||
private static final QName AUTEHTICATION_INTENT = new QName("http://www.osoa.org/xmlns/sca/1.0","authentication");
|
||||
|
||||
transient private Binding binding;
|
||||
|
||||
transient private boolean requiresAuthentication = false;
|
||||
transient private BasicAuthenticationPolicy basicAuthenticationPolicy = null;
|
||||
|
||||
private MessageFactory messageFactory;
|
||||
private Invoker getInvoker;
|
||||
private Invoker conditionalGetInvoker;
|
||||
private Invoker putInvoker;
|
||||
private Invoker conditionalPutInvoker;
|
||||
private Invoker postInvoker;
|
||||
private Invoker conditionalPostInvoker;
|
||||
private Invoker deleteInvoker;
|
||||
private Invoker conditionalDeleteInvoker;
|
||||
|
||||
/**
|
||||
* Constructs a new HTTPServiceListenerServlet.
|
||||
*/
|
||||
public HTTPBindingListenerServlet(Binding binding, MessageFactory messageFactory) {
|
||||
this.binding = binding;
|
||||
this.messageFactory = messageFactory;
|
||||
|
||||
|
||||
// find out which policies are active
|
||||
if (binding instanceof PolicySetAttachPoint) {
|
||||
List<Intent> intents = ((PolicySetAttachPoint)binding).getRequiredIntents();
|
||||
for(Intent intent : intents) {
|
||||
if(intent.getName().equals(AUTEHTICATION_INTENT)) {
|
||||
requiresAuthentication = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<PolicySet> policySets = ((PolicySetAttachPoint)binding).getApplicablePolicySets();
|
||||
for (PolicySet ps : policySets) {
|
||||
for (Object p : ps.getPolicies()) {
|
||||
if (BasicAuthenticationPolicy.class.isInstance(p)) {
|
||||
basicAuthenticationPolicy = (BasicAuthenticationPolicy)p;
|
||||
} else {
|
||||
// etc. check for other types of policy being present
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
|
||||
if(requiresAuthentication) {
|
||||
if(! hasAuthorization(request, response)) {
|
||||
response.setHeader("WWW-Authenticate", "BASIC realm=\"Tuscany\"");
|
||||
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
}
|
||||
}
|
||||
|
||||
super.service(request, response);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
// Get the request path
|
||||
String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
|
||||
if (path.length() ==0) {
|
||||
// Redirect to a URL ending with / to make relative hrefs work
|
||||
// relative to the served resource.
|
||||
response.sendRedirect(request.getRequestURL().append('/').toString());
|
||||
return;
|
||||
}
|
||||
|
||||
// Invoke the get operation on the service implementation
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
|
||||
//store http headers to message
|
||||
requestMessage.getHeaders().addAll(HTTPHeadersParser.getHeaders(request));
|
||||
|
||||
String id = path.substring(1);
|
||||
|
||||
Message responseMessage = null;
|
||||
HTTPCacheContext cacheContext = null;
|
||||
try {
|
||||
cacheContext = HTTPCacheContext.getCacheContextFromRequest(request);
|
||||
} catch (ParseException e) {
|
||||
}
|
||||
|
||||
// Route message based on availability of cache info and cache methods
|
||||
if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalGetInvoker != null )) {
|
||||
requestMessage.setBody(new Object[] {id, cacheContext});
|
||||
responseMessage = conditionalGetInvoker.invoke(requestMessage);
|
||||
} else {
|
||||
requestMessage.setBody(new Object[] {id});
|
||||
responseMessage = getInvoker.invoke(requestMessage);
|
||||
}
|
||||
if (responseMessage.isFault()) {
|
||||
Object body = responseMessage.getBody();
|
||||
|
||||
int index = -1;
|
||||
if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED );
|
||||
return;
|
||||
} else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED );
|
||||
return;
|
||||
}
|
||||
|
||||
throw new ServletException((Throwable)responseMessage.getBody());
|
||||
}
|
||||
|
||||
// Write the response from the service implementation to the response
|
||||
// output stream
|
||||
InputStream is = (InputStream)responseMessage.getBody();
|
||||
OutputStream os = response.getOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
for (;;) {
|
||||
int n = is.read(buffer);
|
||||
if (n <= 0)
|
||||
break;
|
||||
os.write(buffer, 0, n);
|
||||
}
|
||||
os.flush();
|
||||
os.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
// Get the request path
|
||||
String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
|
||||
if (path.length() ==0) {
|
||||
// Redirect to a URL ending with / to make relative hrefs work
|
||||
// relative to the served resource.
|
||||
response.sendRedirect(request.getRequestURL().append('/').toString());
|
||||
return;
|
||||
}
|
||||
|
||||
// Invoke the get operation on the service implementation
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
String id = path.substring(1);
|
||||
|
||||
Message responseMessage = null;
|
||||
HTTPCacheContext cacheContext = null;
|
||||
try {
|
||||
cacheContext = HTTPCacheContext.getCacheContextFromRequest(request);
|
||||
} catch (ParseException e) {
|
||||
}
|
||||
|
||||
// Route message based on availability of cache info and cache methods
|
||||
if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalDeleteInvoker != null )) {
|
||||
requestMessage.setBody(new Object[] {id, cacheContext});
|
||||
responseMessage = conditionalDeleteInvoker.invoke(requestMessage);
|
||||
} else {
|
||||
requestMessage.setBody(new Object[] {id});
|
||||
responseMessage = deleteInvoker.invoke(requestMessage);
|
||||
}
|
||||
if (responseMessage.isFault()) {
|
||||
Object body = responseMessage.getBody();
|
||||
|
||||
int index = -1;
|
||||
if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED );
|
||||
return;
|
||||
} else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED );
|
||||
return;
|
||||
}
|
||||
|
||||
throw new ServletException((Throwable)responseMessage.getBody());
|
||||
}
|
||||
|
||||
// Write the response from the service implementation to the response
|
||||
// output stream
|
||||
InputStream is = (InputStream)responseMessage.getBody();
|
||||
OutputStream os = response.getOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
for (;;) {
|
||||
int n = is.read(buffer);
|
||||
if (n <= 0)
|
||||
break;
|
||||
os.write(buffer, 0, n);
|
||||
}
|
||||
os.flush();
|
||||
os.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
// Get the request path
|
||||
String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
|
||||
if (path.length() ==0) {
|
||||
// Redirect to a URL ending with / to make relative hrefs work
|
||||
// relative to the served resource.
|
||||
response.sendRedirect(request.getRequestURL().append('/').toString());
|
||||
return;
|
||||
}
|
||||
|
||||
// Invoke the get operation on the service implementation
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
String id = path.substring(1);
|
||||
|
||||
Message responseMessage = null;
|
||||
HTTPCacheContext cacheContext = null;
|
||||
try {
|
||||
cacheContext = HTTPCacheContext.getCacheContextFromRequest(request);
|
||||
} catch (ParseException e) {
|
||||
}
|
||||
|
||||
// Route message based on availability of cache info and cache methods
|
||||
if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalPutInvoker != null )) {
|
||||
requestMessage.setBody(new Object[] {id, cacheContext});
|
||||
responseMessage = conditionalPutInvoker.invoke(requestMessage);
|
||||
} else {
|
||||
requestMessage.setBody(new Object[] {id});
|
||||
responseMessage = putInvoker.invoke(requestMessage);
|
||||
}
|
||||
if (responseMessage.isFault()) {
|
||||
Object body = responseMessage.getBody();
|
||||
|
||||
int index = -1;
|
||||
if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED );
|
||||
return;
|
||||
} else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED );
|
||||
return;
|
||||
}
|
||||
|
||||
throw new ServletException((Throwable)responseMessage.getBody());
|
||||
}
|
||||
|
||||
// Write the response from the service implementation to the response
|
||||
// output stream
|
||||
InputStream is = (InputStream)responseMessage.getBody();
|
||||
OutputStream os = response.getOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
for (;;) {
|
||||
int n = is.read(buffer);
|
||||
if (n <= 0)
|
||||
break;
|
||||
os.write(buffer, 0, n);
|
||||
}
|
||||
os.flush();
|
||||
os.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
// Get the request path
|
||||
String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
|
||||
if (path.length() ==0) {
|
||||
// Redirect to a URL ending with / to make relative hrefs work
|
||||
// relative to the served resource.
|
||||
response.sendRedirect(request.getRequestURL().append('/').toString());
|
||||
return;
|
||||
}
|
||||
|
||||
// Invoke the get operation on the service implementation
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
// String id = path.substring(1);
|
||||
|
||||
Message responseMessage = null;
|
||||
HTTPCacheContext cacheContext = null;
|
||||
try {
|
||||
cacheContext = HTTPCacheContext.getCacheContextFromRequest(request);
|
||||
} catch (ParseException e) {
|
||||
}
|
||||
|
||||
// Route message based on availability of cache info and cache methods
|
||||
if (( cacheContext != null ) && (cacheContext.isEnabled()) && (conditionalPostInvoker != null )) {
|
||||
requestMessage.setBody(new Object[] {cacheContext});
|
||||
responseMessage = conditionalPostInvoker.invoke(requestMessage);
|
||||
} else {
|
||||
requestMessage.setBody(new Object[] {});
|
||||
responseMessage = postInvoker.invoke(requestMessage);
|
||||
}
|
||||
if (responseMessage.isFault()) {
|
||||
Object body = responseMessage.getBody();
|
||||
|
||||
int index = -1;
|
||||
if ( -1 < (index = body.getClass().getName().indexOf( "NotModifiedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_NOT_MODIFIED );
|
||||
return;
|
||||
} else if ( -1 < (index = body.getClass().getName().indexOf( "PreconditionFailedException")) ) {
|
||||
if ( index > -1 )
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED, body.toString().substring( index ));
|
||||
else
|
||||
response.sendError( HttpServletResponse.SC_PRECONDITION_FAILED );
|
||||
return;
|
||||
}
|
||||
|
||||
throw new ServletException((Throwable)responseMessage.getBody());
|
||||
}
|
||||
|
||||
|
||||
// Test if the ETag and LastModified are returned as a cache context.
|
||||
Object body = responseMessage.getBody();
|
||||
if ( body.getClass() == HTTPCacheContext.class ) {
|
||||
// Transfer to header if so.
|
||||
HTTPCacheContext cc = (HTTPCacheContext)responseMessage.getBody();
|
||||
if (( cc != null ) && ( cc.isEnabled() )) {
|
||||
String eTag = cc.getETag();
|
||||
if ( eTag != null )
|
||||
response.setHeader( "ETag", cc.getETag() );
|
||||
String lastModified = cc.getLastModified();
|
||||
if ( lastModified != null)
|
||||
response.setHeader( "LastModified", cc.getLastModified() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the getInvoker
|
||||
*/
|
||||
public Invoker getGetInvoker() {
|
||||
return getInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param getInvoker the getInvoker to set
|
||||
*/
|
||||
public void setGetInvoker(Invoker getInvoker) {
|
||||
this.getInvoker = getInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the conditionalGetInvoker
|
||||
*/
|
||||
public Invoker getConditionalGetInvoker() {
|
||||
return conditionalGetInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param conditionalGetInvoker the conditionalGetInvoker to set
|
||||
*/
|
||||
public void setConditionalGetInvoker(Invoker conditionalGetInvoker) {
|
||||
this.conditionalGetInvoker = conditionalGetInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the putInvoker
|
||||
*/
|
||||
public Invoker getPutInvoker() {
|
||||
return putInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param putInvoker the putInvoker to set
|
||||
*/
|
||||
public void setPutInvoker(Invoker putInvoker) {
|
||||
this.putInvoker = putInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the conditionalPutInvoker
|
||||
*/
|
||||
public Invoker getConditionalPutInvoker() {
|
||||
return conditionalPutInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param conditionalPutInvoker the conditionalPutInvoker to set
|
||||
*/
|
||||
public void setConditionalPutInvoker(Invoker conditionalPutInvoker) {
|
||||
this.conditionalPutInvoker = conditionalPutInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the postInvoker
|
||||
*/
|
||||
public Invoker getPostInvoker() {
|
||||
return postInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param postInvoker the postInvoker to set
|
||||
*/
|
||||
public void setPostInvoker(Invoker postInvoker) {
|
||||
this.postInvoker = postInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the conditionalPostInvoker
|
||||
*/
|
||||
public Invoker getConditionalPostInvoker() {
|
||||
return conditionalPostInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param conditionalPostInvoker the conditionalPostInvoker to set
|
||||
*/
|
||||
public void setConditionalPostInvoker(Invoker conditionalPostInvoker) {
|
||||
this.conditionalPostInvoker = conditionalPostInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the deleteInvoker
|
||||
*/
|
||||
public Invoker getDeleteInvoker() {
|
||||
return deleteInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param deleteInvoker the deleteInvoker to set
|
||||
*/
|
||||
public void setDeleteInvoker(Invoker deleteInvoker) {
|
||||
this.deleteInvoker = deleteInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the conditionalDeleteInvoker
|
||||
*/
|
||||
public Invoker getConditionalDeleteInvoker() {
|
||||
return conditionalDeleteInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param conditionalDeleteInvoker the conditionalDeleteInvoker to set
|
||||
*/
|
||||
public void setConditionalDeleteInvoker(Invoker conditionalDeleteInvoker) {
|
||||
this.conditionalDeleteInvoker = conditionalDeleteInvoker;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Utility Methods related to Policy
|
||||
*/
|
||||
|
||||
|
||||
private boolean hasAuthorization(HttpServletRequest request, ServletResponse response) {
|
||||
boolean result = false;
|
||||
if(request.getHeader("Authorization") != null) {
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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.http.provider;
|
||||
|
||||
import org.apache.tuscany.sca.binding.http.HTTPBinding;
|
||||
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
|
||||
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
|
||||
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;
|
||||
|
||||
|
||||
/**
|
||||
* Factory for HTTP binding providers.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPBindingProviderFactory implements BindingProviderFactory<HTTPBinding> {
|
||||
private ExtensionPointRegistry extensionPoints;
|
||||
private MessageFactory messageFactory;
|
||||
private ServletHost servletHost;
|
||||
|
||||
public HTTPBindingProviderFactory(ExtensionPointRegistry extensionPoints) {
|
||||
this.extensionPoints = extensionPoints;
|
||||
ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class);
|
||||
this.servletHost = servletHosts.getServletHosts().get(0);
|
||||
ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class);
|
||||
messageFactory = modelFactories.getFactory(MessageFactory.class);
|
||||
}
|
||||
|
||||
public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component, RuntimeComponentReference reference, HTTPBinding binding) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component, RuntimeComponentService service, HTTPBinding binding) {
|
||||
return new HTTPServiceBindingProvider(component, service, binding, extensionPoints, messageFactory, servletHost);
|
||||
}
|
||||
|
||||
public Class<HTTPBinding> getModelType() {
|
||||
return HTTPBinding.class;
|
||||
}
|
||||
}
|
|
@ -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.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http.provider;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.URLDecoder;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.tuscany.sca.invocation.Invoker;
|
||||
import org.apache.tuscany.sca.invocation.Message;
|
||||
import org.apache.tuscany.sca.invocation.MessageFactory;
|
||||
|
||||
/**
|
||||
* Servlet responsible for dispatching HTTP GET requests to the
|
||||
* target component implementation.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPGetListenerServlet extends HttpServlet {
|
||||
private static final long serialVersionUID = 2865466417329430610L;
|
||||
|
||||
private MessageFactory messageFactory;
|
||||
private Invoker getInvoker;
|
||||
|
||||
/**
|
||||
* Constructs a new HTTPServiceListenerServlet.
|
||||
*/
|
||||
public HTTPGetListenerServlet(Invoker getInvoker, MessageFactory messageFactory) {
|
||||
this.getInvoker = getInvoker;
|
||||
this.messageFactory = messageFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
|
||||
// Get the request path
|
||||
String path = URLDecoder.decode(request.getRequestURI().substring(request.getServletPath().length()), "UTF-8");
|
||||
if (path.length() ==0) {
|
||||
|
||||
// Redirect to a URL ending with / to make relative hrefs work
|
||||
// relative to the served resource.
|
||||
response.sendRedirect(request.getRequestURL().append('/').toString());
|
||||
return;
|
||||
}
|
||||
|
||||
// Invoke the get operation on the service implementation
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
String id = path.substring(1);
|
||||
requestMessage.setBody(new Object[] {id});
|
||||
Message responseMessage = getInvoker.invoke(requestMessage);
|
||||
if (responseMessage.isFault()) {
|
||||
throw new ServletException((Throwable)responseMessage.getBody());
|
||||
}
|
||||
|
||||
// Write the response from the service implementation to the response
|
||||
// output stream
|
||||
InputStream is = (InputStream)responseMessage.getBody();
|
||||
OutputStream os = response.getOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
for (;;) {
|
||||
int n = is.read(buffer);
|
||||
if (n <= 0)
|
||||
break;
|
||||
os.write(buffer, 0, n);
|
||||
}
|
||||
os.flush();
|
||||
os.close();
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http.provider;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.CharArrayWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.apache.tuscany.sca.assembly.Binding;
|
||||
import org.apache.tuscany.sca.binding.http.HTTPBindingContext;
|
||||
import org.apache.tuscany.sca.invocation.Invoker;
|
||||
import org.apache.tuscany.sca.invocation.Message;
|
||||
import org.apache.tuscany.sca.invocation.MessageFactory;
|
||||
|
||||
public class HTTPRRBListenerServlet extends HttpServlet {
|
||||
|
||||
private static final long serialVersionUID = 6688524143716091739L;
|
||||
|
||||
transient private Binding binding;
|
||||
transient private Invoker bindingInvoker;
|
||||
transient private MessageFactory messageFactory;
|
||||
|
||||
/**
|
||||
* Constructs a new HTTPServiceListenerServlet.
|
||||
*/
|
||||
public HTTPRRBListenerServlet(Binding binding, Invoker bindingInvoker, MessageFactory messageFactory) {
|
||||
this.binding = binding;
|
||||
this.bindingInvoker = bindingInvoker;
|
||||
this.messageFactory = messageFactory;
|
||||
}
|
||||
|
||||
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||||
|
||||
// Decode using the charset in the request if it exists otherwise
|
||||
// use UTF-8 as this is what all browser implementations use.
|
||||
// The JSON-RPC-Java JavaScript client is ASCII clean so it
|
||||
// although here we can correctly handle data from other clients
|
||||
// that do not escape non ASCII data
|
||||
String charset = request.getCharacterEncoding();
|
||||
if (charset == null) {
|
||||
charset = "UTF-8";
|
||||
}
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(request.getInputStream(), charset));
|
||||
|
||||
// Read the request
|
||||
CharArrayWriter data = new CharArrayWriter();
|
||||
char[] buf = new char[4096];
|
||||
int ret;
|
||||
while ((ret = in.read(buf, 0, 4096)) != -1) {
|
||||
data.write(buf, 0, ret);
|
||||
}
|
||||
|
||||
HTTPBindingContext bindingContext = new HTTPBindingContext();
|
||||
bindingContext.setHttpRequest(request);
|
||||
bindingContext.setHttpResponse(response);
|
||||
|
||||
// Dispatch the service interaction to the service invoker
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
requestMessage.setBindingContext(bindingContext);
|
||||
requestMessage.setBody(new Object[]{data});
|
||||
|
||||
Message responseMessage = bindingInvoker.invoke(requestMessage);
|
||||
|
||||
// return response to client
|
||||
if (responseMessage.isFault()) {
|
||||
// Turn a fault into an exception
|
||||
//throw new ServletException((Throwable)responseMessage.getBody());
|
||||
Throwable e = (Throwable)responseMessage.getBody();
|
||||
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
|
||||
} else {
|
||||
byte[] bout;
|
||||
bout = responseMessage.<Object>getBody().toString().getBytes("UTF-8");
|
||||
response.getOutputStream().write(bout);
|
||||
response.getOutputStream().flush();
|
||||
response.getOutputStream().close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,265 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT 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.http.provider;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.Servlet;
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import org.apache.tuscany.sca.binding.http.HTTPBinding;
|
||||
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
|
||||
import org.apache.tuscany.sca.host.http.SecurityContext;
|
||||
import org.apache.tuscany.sca.host.http.ServletHost;
|
||||
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
|
||||
import org.apache.tuscany.sca.interfacedef.Operation;
|
||||
import org.apache.tuscany.sca.invocation.InvocationChain;
|
||||
import org.apache.tuscany.sca.invocation.Invoker;
|
||||
import org.apache.tuscany.sca.invocation.MessageFactory;
|
||||
import org.apache.tuscany.sca.invocation.Phase;
|
||||
import org.apache.tuscany.sca.policy.Intent;
|
||||
import org.apache.tuscany.sca.policy.PolicySet;
|
||||
import org.apache.tuscany.sca.policy.PolicySetAttachPoint;
|
||||
import org.apache.tuscany.sca.policy.authentication.AuthenticationConfigurationPolicy;
|
||||
import org.apache.tuscany.sca.policy.confidentiality.ConfidentialityPolicy;
|
||||
import org.apache.tuscany.sca.provider.OperationSelectorProvider;
|
||||
import org.apache.tuscany.sca.provider.OperationSelectorProviderFactory;
|
||||
import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
|
||||
import org.apache.tuscany.sca.provider.ServiceBindingProviderRRB;
|
||||
import org.apache.tuscany.sca.provider.WireFormatProvider;
|
||||
import org.apache.tuscany.sca.provider.WireFormatProviderFactory;
|
||||
import org.apache.tuscany.sca.runtime.RuntimeComponent;
|
||||
import org.apache.tuscany.sca.runtime.RuntimeComponentService;
|
||||
import org.apache.tuscany.sca.runtime.RuntimeWire;
|
||||
|
||||
/**
|
||||
* Implementation of an HTTP binding provider.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPServiceBindingProvider implements ServiceBindingProviderRRB {
|
||||
private static final QName AUTEHTICATION_INTENT = new QName("http://www.osoa.org/xmlns/sca/1.0","authentication");
|
||||
private static final QName CONFIDENTIALITY_INTENT = new QName("http://www.osoa.org/xmlns/sca/1.0","confidentiality");
|
||||
|
||||
private ExtensionPointRegistry extensionPoints;
|
||||
|
||||
private RuntimeComponent component;
|
||||
private RuntimeComponentService service;
|
||||
private InterfaceContract serviceContract;
|
||||
private HTTPBinding binding;
|
||||
private MessageFactory messageFactory;
|
||||
|
||||
private OperationSelectorProvider osProvider;
|
||||
private WireFormatProvider wfProvider;
|
||||
|
||||
private ServletHost servletHost;
|
||||
private String servletMapping;
|
||||
private HTTPBindingListenerServlet bindingListenerServlet;
|
||||
|
||||
public HTTPServiceBindingProvider(RuntimeComponent component,
|
||||
RuntimeComponentService service,
|
||||
HTTPBinding binding,
|
||||
ExtensionPointRegistry extensionPoints,
|
||||
MessageFactory messageFactory,
|
||||
ServletHost servletHost) {
|
||||
this.component = component;
|
||||
this.service = service;
|
||||
|
||||
this.binding = binding;
|
||||
this.extensionPoints = extensionPoints;
|
||||
this.messageFactory = messageFactory;
|
||||
this.servletHost = servletHost;
|
||||
|
||||
// retrieve operation selector and wire format service providers
|
||||
|
||||
ProviderFactoryExtensionPoint providerFactories = extensionPoints.getExtensionPoint(ProviderFactoryExtensionPoint.class);
|
||||
|
||||
|
||||
if (binding.getOperationSelector() != null) {
|
||||
// Configure the interceptors for operation selection
|
||||
OperationSelectorProviderFactory osProviderFactory = (OperationSelectorProviderFactory) providerFactories.getProviderFactory(binding.getOperationSelector().getClass());
|
||||
if (osProviderFactory != null) {
|
||||
this.osProvider = osProviderFactory.createServiceOperationSelectorProvider(component, service, binding);
|
||||
}
|
||||
}
|
||||
|
||||
if (binding.getRequestWireFormat() != null && binding.getResponseWireFormat() != null) {
|
||||
// Configure the interceptors for wire format
|
||||
WireFormatProviderFactory wfProviderFactory = (WireFormatProviderFactory) providerFactories.getProviderFactory(binding.getRequestWireFormat().getClass());
|
||||
if (wfProviderFactory != null) {
|
||||
this.wfProvider = wfProviderFactory.createServiceWireFormatProvider(component, service, binding);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//clone the service contract to avoid databinding issues
|
||||
try {
|
||||
this.serviceContract = (InterfaceContract) service.getInterfaceContract().clone();
|
||||
|
||||
// configure data binding
|
||||
if (this.wfProvider != null) {
|
||||
wfProvider.configureWireFormatInterfaceContract(service.getInterfaceContract());
|
||||
}
|
||||
} catch(CloneNotSupportedException e) {
|
||||
this.serviceContract = service.getInterfaceContract();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void start() {
|
||||
// Get the invokers for the supported operations
|
||||
RuntimeComponentService componentService = (RuntimeComponentService) service;
|
||||
RuntimeWire wire = componentService.getRuntimeWire(binding);
|
||||
Servlet servlet = null;
|
||||
bindingListenerServlet = new HTTPBindingListenerServlet(binding, messageFactory );
|
||||
for (InvocationChain invocationChain : wire.getInvocationChains()) {
|
||||
Operation operation = invocationChain.getTargetOperation();
|
||||
String operationName = operation.getName();
|
||||
if (operationName.equals("get")) {
|
||||
Invoker getInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setGetInvoker(getInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("conditionalGet")) {
|
||||
Invoker conditionalGetInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setConditionalGetInvoker(conditionalGetInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("delete")) {
|
||||
Invoker deleteInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setDeleteInvoker(deleteInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("conditionalDelete")) {
|
||||
Invoker conditionalDeleteInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setConditionalDeleteInvoker(conditionalDeleteInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("put")) {
|
||||
Invoker putInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setPutInvoker(putInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("conditionalPut")) {
|
||||
Invoker conditionalPutInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setConditionalPutInvoker(conditionalPutInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("post")) {
|
||||
Invoker postInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setPostInvoker(postInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("conditionalPost")) {
|
||||
Invoker conditionalPostInvoker = invocationChain.getHeadInvoker();
|
||||
bindingListenerServlet.setConditionalPostInvoker(conditionalPostInvoker);
|
||||
servlet = bindingListenerServlet;
|
||||
} else if (operationName.equals("service")) {
|
||||
Invoker serviceInvoker = invocationChain.getHeadInvoker();
|
||||
servlet = new HTTPServiceListenerServlet(binding, serviceInvoker, messageFactory);
|
||||
break;
|
||||
} else if (binding.getOperationSelector() != null || binding.getRequestWireFormat() != null) {
|
||||
Invoker bindingInvoker = wire.getBindingInvocationChain().getHeadInvoker();
|
||||
servlet = new HTTPRRBListenerServlet(binding, bindingInvoker, messageFactory);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (servlet == null) {
|
||||
throw new IllegalStateException("No get or service method found on the service");
|
||||
}
|
||||
|
||||
// Create our HTTP service listener Servlet and register it with the
|
||||
// Servlet host
|
||||
servletMapping = binding.getURI();
|
||||
if (!servletMapping.endsWith("/")) {
|
||||
servletMapping += "/";
|
||||
}
|
||||
if (!servletMapping.endsWith("*")) {
|
||||
servletMapping += "*";
|
||||
}
|
||||
|
||||
|
||||
SecurityContext securityContext = new SecurityContext();
|
||||
boolean isConfidentialityRequired = false;
|
||||
boolean isAuthenticationRequired = false;
|
||||
|
||||
|
||||
// find out which policies are active
|
||||
if (binding instanceof PolicySetAttachPoint) {
|
||||
List<Intent> intents = ((PolicySetAttachPoint)binding).getRequiredIntents();
|
||||
for(Intent intent : intents) {
|
||||
if (intent.getName().equals(AUTEHTICATION_INTENT)) {
|
||||
isAuthenticationRequired = true;
|
||||
} else if (intent.getName().equals(CONFIDENTIALITY_INTENT)) {
|
||||
isConfidentialityRequired = true;
|
||||
}
|
||||
}
|
||||
|
||||
List<PolicySet> policySets = ((PolicySetAttachPoint)binding).getApplicablePolicySets();
|
||||
for (PolicySet ps : policySets) {
|
||||
for (Object p : ps.getPolicies()) {
|
||||
if (ConfidentialityPolicy.class.isInstance(p) && isConfidentialityRequired) {
|
||||
//Handle enabling and configuring SSL
|
||||
ConfidentialityPolicy confidentialityPolicy = (ConfidentialityPolicy)p;
|
||||
|
||||
securityContext.setSSLEnabled(true);
|
||||
securityContext.setSSLProperties(confidentialityPolicy.toProperties());
|
||||
} else if(AuthenticationConfigurationPolicy.class.isInstance(p) && isAuthenticationRequired) {
|
||||
// Handle authentication and user configuration
|
||||
AuthenticationConfigurationPolicy authenticationConfiguration = (AuthenticationConfigurationPolicy)p;
|
||||
|
||||
securityContext.setAuthenticationEnabled(true);
|
||||
securityContext.getUsers().clear();
|
||||
securityContext.getUsers().addAll(authenticationConfiguration.getUsers());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
servletHost.addServletMapping(servletMapping, servlet, securityContext);
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
// Unregister the Servlet from the Servlet host
|
||||
servletHost.removeServletMapping(servletMapping);
|
||||
}
|
||||
|
||||
public InterfaceContract getBindingInterfaceContract() {
|
||||
return service.getInterfaceContract();
|
||||
}
|
||||
|
||||
public boolean supportsOneWayInvocation() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add specific http interceptor to invocation chain
|
||||
* @param runtimeWire
|
||||
*/
|
||||
public void configureBindingChain(RuntimeWire runtimeWire) {
|
||||
|
||||
InvocationChain bindingChain = runtimeWire.getBindingInvocationChain();
|
||||
|
||||
if(osProvider != null) {
|
||||
bindingChain.addInterceptor(Phase.SERVICE_BINDING_OPERATION_SELECTOR, osProvider.createInterceptor());
|
||||
}
|
||||
|
||||
if (wfProvider != null) {
|
||||
bindingChain.addInterceptor(Phase.SERVICE_BINDING_WIREFORMAT, wfProvider.createInterceptor());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,136 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http.provider;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import org.apache.tuscany.sca.assembly.Binding;
|
||||
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.policy.Intent;
|
||||
import org.apache.tuscany.sca.policy.PolicySet;
|
||||
import org.apache.tuscany.sca.policy.PolicySetAttachPoint;
|
||||
import org.apache.tuscany.sca.policy.authentication.basic.BasicAuthenticationPolicy;
|
||||
|
||||
/**
|
||||
* Servlet responsible for dispatching HTTP service requests to the
|
||||
* target component implementation.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPServiceListenerServlet implements Servlet {
|
||||
private static final QName AUTEHTICATION_INTENT = new QName("http://www.osoa.org/xmlns/sca/1.0","authentication");
|
||||
|
||||
transient private Binding binding;
|
||||
transient private ServletConfig config;
|
||||
transient private MessageFactory messageFactory;
|
||||
transient private Invoker serviceInvoker;
|
||||
|
||||
transient private boolean requiresAuthentication = false;
|
||||
transient private BasicAuthenticationPolicy basicAuthenticationPolicy = null;
|
||||
|
||||
/**
|
||||
* Constructs a new HTTPServiceListenerServlet.
|
||||
*/
|
||||
public HTTPServiceListenerServlet(Binding binding, Invoker serviceInvoker, MessageFactory messageFactory) {
|
||||
this.binding = binding;
|
||||
this.serviceInvoker = serviceInvoker;
|
||||
this.messageFactory = messageFactory;
|
||||
|
||||
// find out which policies are active
|
||||
if (binding instanceof PolicySetAttachPoint) {
|
||||
List<Intent> intents = ((PolicySetAttachPoint)binding).getRequiredIntents();
|
||||
for(Intent intent : intents) {
|
||||
if(intent.getName().equals(AUTEHTICATION_INTENT)) {
|
||||
requiresAuthentication = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
List<PolicySet> policySets = ((PolicySetAttachPoint)binding).getApplicablePolicySets();
|
||||
for (PolicySet ps : policySets) {
|
||||
for (Object p : ps.getPolicies()) {
|
||||
if (BasicAuthenticationPolicy.class.isInstance(p)) {
|
||||
basicAuthenticationPolicy = (BasicAuthenticationPolicy)p;
|
||||
} else {
|
||||
// etc. check for other types of policy being present
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public ServletConfig getServletConfig() {
|
||||
return config;
|
||||
}
|
||||
|
||||
public String getServletInfo() {
|
||||
return "";
|
||||
}
|
||||
|
||||
public void init(ServletConfig config) throws ServletException {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
|
||||
}
|
||||
|
||||
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
|
||||
|
||||
if(requiresAuthentication) {
|
||||
if(! hasAuthenticationHeader((HttpServletRequest)request, (HttpServletResponse)response)) {
|
||||
((HttpServletResponse)response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
}
|
||||
}
|
||||
|
||||
// Dispatch the service interaction to the service invoker
|
||||
Message requestMessage = messageFactory.createMessage();
|
||||
requestMessage.setBody(new Object[]{request, response});
|
||||
Message responseMessage = serviceInvoker.invoke(requestMessage);
|
||||
if (responseMessage.isFault()) {
|
||||
// Turn a fault into an exception
|
||||
//throw new ServletException((Throwable)responseMessage.getBody());
|
||||
Throwable e = (Throwable)responseMessage.getBody();
|
||||
((HttpServletResponse)response).sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private boolean hasAuthenticationHeader(HttpServletRequest request, ServletResponse response) {
|
||||
boolean result = false;
|
||||
if(request.getHeader("Authorization") != null) {
|
||||
result = true;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.apache.tuscany.sca.binding.http.HTTPHeader;
|
||||
|
||||
public class HTTPHeadersParser {
|
||||
|
||||
/**
|
||||
* Parse http request headers to a map
|
||||
*
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
public static List<HTTPHeader> getHeaders(HttpServletRequest request) {
|
||||
List<HTTPHeader> headers = new ArrayList<HTTPHeader>();
|
||||
|
||||
Enumeration<?> headerNames = request.getHeaderNames();
|
||||
while (headerNames.hasMoreElements()) {
|
||||
String headerName = (String) headerNames.nextElement();
|
||||
Object headerValue = request.getHeader(headerName);
|
||||
HTTPHeader header = new HTTPHeader(headerName, headerValue);
|
||||
headers.add(header);
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
}
|
|
@ -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.http.provider.HTTPBindingProviderFactory;model=org.apache.tuscany.sca.binding.http.HTTPBinding
|
|
@ -0,0 +1,855 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT 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.http;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.text.MessageFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.tuscany.sca.host.embedded.SCADomain;
|
||||
|
||||
/**
|
||||
* HTTP binding unit tests.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPBindingCacheTestCase extends TestCase {
|
||||
// RFC 822 date time
|
||||
protected static final SimpleDateFormat dateFormat = new SimpleDateFormat(
|
||||
"EEE, dd MMM yyyy HH:mm:ss Z");
|
||||
|
||||
// Request with no predicates in header.
|
||||
private static final String REQUEST1 = "{0} /httpbinding/{1} HTTP/1.0\n"
|
||||
+ "Host: localhost\n" + "Content-Type: text/xml\n"
|
||||
+ "Connection: close\n" + "Content-Length: {2}" + "\n\n{3}";
|
||||
|
||||
// Request with predicates in header
|
||||
private static final String REQUEST2 = "{0} /httpbinding/{1} HTTP/1.0\n"
|
||||
+ "Host: localhost\n" + "Content-Type: text/xml\n" + "{2}: {3}\n" // predicate (If-Match, If-None-Match, If-Modified-Since, If-NotModified-Since): value (date or ETag)
|
||||
+ "Connection: close\n" + "Content-Length: {4}" + "\n\n{5}";
|
||||
|
||||
private static final int HTTP_PORT = 8085;
|
||||
|
||||
private SCADomain scaDomain;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
scaDomain = SCADomain.newInstance("testCache.composite");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
scaDomain.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a POJO get method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testGet() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST1, "GET", index, content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfModifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfModifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfUnmodifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date()), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfUnmodifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfNoneMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-None-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalGetIfNoneMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "GET", index,
|
||||
"If-None-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a POJO get method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testDelete() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST1, "DELETE", index,
|
||||
content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfModifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfModifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfUnmodifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date()), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfUnmodifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfNoneMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-None-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalDeleteIfNoneMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "DELETE", index,
|
||||
"If-None-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("deleted item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a POJO get method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testPost() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST1, "POST", index, content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("HTTP/1.1 200 OK") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfModifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date()), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return code 200 OK
|
||||
// assertTrue(document.indexOf("posted item=" + index) != -1);
|
||||
assertTrue(document.indexOf("HTTP/1.1 200 OK") != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfModifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("posted item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfUnmodifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date()), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return code 200 OK
|
||||
assertTrue(document.indexOf("HTTP/1.1 200 OK") != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfUnmodifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("posted item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-Match", "eTagMatch", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return code 200 OK.
|
||||
assertTrue(document.indexOf("HTTP/1.1 200 OK") != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat
|
||||
.format(REQUEST2, "POST", index, "If-Match", "eTagNoneMatch",
|
||||
content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("posted item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfNoneMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-None-Match", "eTagNoneMatch", content.getBytes().length,
|
||||
content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return code 200 OK
|
||||
assertTrue(document.indexOf("HTTP/1.1 200 OK") != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPostIfNoneMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "POST", index,
|
||||
"If-None-Match", "eTagMatch", content.getBytes().length,
|
||||
content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("posted item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a POJO get method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testPut() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST1, "PUT", index, content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfModifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfModifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-Modified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfUnmodifiedNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date()), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 304 Not Modified.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 304") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfUnmodifiedPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-Unmodified-Since", dateFormat.format(new Date(0)), content
|
||||
.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfNoneMatchNegative() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 1;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-None-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 412 precondition failed.
|
||||
// assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a conditional method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testConditionalPutIfNoneMatchPositive() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String content = "";
|
||||
String request = MessageFormat.format(REQUEST2, "PUT", index,
|
||||
"If-None-Match", "eTagXXX", content.getBytes().length, content);
|
||||
os.write(request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
// Should return item
|
||||
// assertTrue(document.indexOf("updated item=" + index) != -1);
|
||||
// Should return code 412 PreconditionFailed.
|
||||
assertTrue(document.indexOf("HTTP/1.1 412") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read response stream from the given socket.
|
||||
* @param socket
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
private static String read(Socket socket) throws IOException {
|
||||
BufferedReader reader = null;
|
||||
try {
|
||||
reader = new BufferedReader(new InputStreamReader(socket
|
||||
.getInputStream()));
|
||||
StringBuffer sb = new StringBuffer();
|
||||
String str;
|
||||
while ((str = reader.readLine()) != null) {
|
||||
sb.append(str);
|
||||
}
|
||||
return sb.toString();
|
||||
} finally {
|
||||
if (reader != null) {
|
||||
reader.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT 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.http;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.tuscany.sca.host.embedded.SCADomain;
|
||||
|
||||
/**
|
||||
* HTTP binding unit tests.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class HTTPBindingTestCase extends TestCase {
|
||||
|
||||
private static final String REQUEST1_HEADER =
|
||||
"GET /httpservice/test HTTP/1.0\n" + "Host: localhost\n"
|
||||
+ "Content-Type: text/xml\n"
|
||||
+ "Connection: close\n"
|
||||
+ "Content-Length: ";
|
||||
private static final String REQUEST1_CONTENT = "";
|
||||
private static final String REQUEST1 =
|
||||
REQUEST1_HEADER + REQUEST1_CONTENT.getBytes().length + "\n\n" + REQUEST1_CONTENT;
|
||||
|
||||
private static final String REQUEST2_HEADER =
|
||||
"GET /webcontent/test.html HTTP/1.0\n" + "Host: localhost\n"
|
||||
+ "Content-Type: text/xml\n"
|
||||
+ "Connection: close\n"
|
||||
+ "Content-Length: ";
|
||||
private static final String REQUEST2_CONTENT = "";
|
||||
private static final String REQUEST2 =
|
||||
REQUEST2_HEADER + REQUEST2_CONTENT.getBytes().length + "\n\n" + REQUEST2_CONTENT;
|
||||
|
||||
private static final String REQUEST3_HEADER =
|
||||
"GET /httpget/{0} HTTP/1.0\n" + "Host: localhost\n"
|
||||
+ "Content-Type: text/xml\n"
|
||||
+ "Connection: close\n"
|
||||
+ "Content-Length: ";
|
||||
private static final String REQUEST3_CONTENT = "";
|
||||
private static final String REQUEST3 =
|
||||
REQUEST3_HEADER + REQUEST3_CONTENT.getBytes().length + "\n\n" + REQUEST3_CONTENT;
|
||||
|
||||
private static final int HTTP_PORT = 8085;
|
||||
|
||||
private SCADomain scaDomain;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
scaDomain = SCADomain.newInstance("test.composite");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void tearDown() throws Exception {
|
||||
scaDomain.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a POJO service implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testServiceImplementation() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
os.write(REQUEST1.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("<body><p>hey</body>") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test invoking a POJO get method implementation using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testGetImplementation() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
int index = 0;
|
||||
String request = MessageFormat.format( REQUEST3, index );
|
||||
os.write( request.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("<body><p>item=" + index) != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test getting a static resource provided using the HTTP binding.
|
||||
* @throws Exception
|
||||
*/
|
||||
public void testStaticResourceImplementation() throws Exception {
|
||||
Socket client = new Socket("127.0.0.1", HTTP_PORT);
|
||||
OutputStream os = client.getOutputStream();
|
||||
os.write(REQUEST2.getBytes());
|
||||
os.flush();
|
||||
|
||||
String document = read(client);
|
||||
assertTrue(document.indexOf("<body><p>hello</body>") != -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read response stream from the given socket.
|
||||
* @param socket
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
private static String read(Socket socket) throws IOException {
|
||||
BufferedReader reader = null;
|
||||
try {
|
||||
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||
StringBuffer sb = new StringBuffer();
|
||||
String str;
|
||||
while ((str = reader.readLine()) != null) {
|
||||
sb.append(str);
|
||||
}
|
||||
return sb.toString();
|
||||
} finally {
|
||||
if (reader != null) {
|
||||
reader.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http;
|
||||
|
||||
/**
|
||||
* Indicates that a resource was not modified.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class NotModifiedException extends Exception {
|
||||
private static final long serialVersionUID = -5046027674128627383L;
|
||||
|
||||
public NotModifiedException() {
|
||||
}
|
||||
|
||||
public NotModifiedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public NotModifiedException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public NotModifiedException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http;
|
||||
|
||||
/**
|
||||
* Indicates that a resource was not modified.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class PreconditionFailedException extends Exception {
|
||||
private static final long serialVersionUID = -5046027674128627383L;
|
||||
|
||||
public PreconditionFailedException() {
|
||||
}
|
||||
|
||||
public PreconditionFailedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public PreconditionFailedException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public PreconditionFailedException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,241 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT 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.http;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Test service implementation that implements a various conditional HTTP
|
||||
* methods. For testing, the id==0 items are very old (Date(0)), not modified,
|
||||
* and always match ETags and the id==1 items are always brand new (Date()),
|
||||
* modified, and never match ETags. Using these ids one can test the
|
||||
* LastModified and ETag headers of the requests.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class TestBindingCacheImpl {
|
||||
|
||||
/**
|
||||
* Implements the HTTP get method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream get(String id) {
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>item=" + id + "</body></html>").getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP conditional get method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream conditionalGet(String id, HTTPCacheContext cacheContext)
|
||||
throws NotModifiedException, PreconditionFailedException {
|
||||
|
||||
if (cacheContext != null) {
|
||||
if (cacheContext.ifModifiedSince) {
|
||||
if ((id.equals("1"))
|
||||
&& (0 > cacheContext.lastModifiedDate
|
||||
.compareTo(new Date())))
|
||||
throw new NotModifiedException("item 1 was modified on "
|
||||
+ new Date());
|
||||
}
|
||||
if (cacheContext.ifUnmodifiedSince) {
|
||||
if ((id.equals("0"))
|
||||
&& (0 > cacheContext.lastModifiedDate
|
||||
.compareTo(new Date())))
|
||||
throw new PreconditionFailedException(
|
||||
"item 0 was modified on " + new Date(0));
|
||||
}
|
||||
if (cacheContext.ifMatch) {
|
||||
if (id.equals("1"))
|
||||
throw new PreconditionFailedException(
|
||||
"item 1 eTag does not match "
|
||||
+ cacheContext.getETag());
|
||||
}
|
||||
if (cacheContext.ifNoneMatch) {
|
||||
if (id.equals("0"))
|
||||
throw new PreconditionFailedException(
|
||||
"item 0 eTag matches " + cacheContext.getETag());
|
||||
}
|
||||
}
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>item=" + id + "</body></html>").getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP delete method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream delete(String id) {
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>deleted item=" + id + "</body></html>")
|
||||
.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP conditional delete method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream conditionalDelete(String id, HTTPCacheContext cacheContext)
|
||||
throws NotModifiedException, PreconditionFailedException {
|
||||
|
||||
if (cacheContext != null) {
|
||||
if (cacheContext.ifModifiedSince) {
|
||||
if ((id.equals("1"))
|
||||
&& (0 > cacheContext.lastModifiedDate
|
||||
.compareTo(new Date())))
|
||||
throw new NotModifiedException("item 1 was modified on "
|
||||
+ new Date());
|
||||
}
|
||||
if (cacheContext.ifUnmodifiedSince) {
|
||||
if ((id.equals("0"))
|
||||
&& (0 > cacheContext.lastModifiedDate
|
||||
.compareTo(new Date())))
|
||||
throw new PreconditionFailedException(
|
||||
"item 0 was modified on " + new Date(0));
|
||||
}
|
||||
if (cacheContext.ifMatch) {
|
||||
if (id.equals("1"))
|
||||
throw new PreconditionFailedException(
|
||||
"item 1 eTag does not match "
|
||||
+ cacheContext.getETag());
|
||||
}
|
||||
if (cacheContext.ifNoneMatch) {
|
||||
if (id.equals("0"))
|
||||
throw new PreconditionFailedException(
|
||||
"item 0 eTag matches " + cacheContext.getETag());
|
||||
}
|
||||
}
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>deleted item=" + id + "</body></html>")
|
||||
.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP post method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream post() {
|
||||
int id = (new java.util.Random()).nextInt(Integer.MAX_VALUE);
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>posted item=" + id + "</body></html>")
|
||||
.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP conditional post method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public HTTPCacheContext conditionalPost(HTTPCacheContext cacheContext)
|
||||
throws NotModifiedException, PreconditionFailedException {
|
||||
String id = "" + (new java.util.Random()).nextInt(Integer.MAX_VALUE);
|
||||
|
||||
if (cacheContext != null) {
|
||||
if (cacheContext.ifModifiedSince) {
|
||||
if (0 >= cacheContext.lastModifiedDate.compareTo(new Date(0)))
|
||||
throw new NotModifiedException("item was modified on "
|
||||
+ new Date());
|
||||
}
|
||||
if (cacheContext.ifUnmodifiedSince) {
|
||||
if ((0 >= cacheContext.lastModifiedDate.compareTo(new Date(0))))
|
||||
throw new PreconditionFailedException(
|
||||
"item was modified on " + new Date(0));
|
||||
}
|
||||
if (cacheContext.ifMatch) {
|
||||
if (cacheContext.getETag().equalsIgnoreCase("ETagNoneMatch"))
|
||||
throw new PreconditionFailedException(
|
||||
"item eTag does not match "
|
||||
+ cacheContext.getETag());
|
||||
}
|
||||
if (cacheContext.ifNoneMatch) {
|
||||
if (cacheContext.getETag().equalsIgnoreCase("ETagMatch"))
|
||||
throw new PreconditionFailedException("item eTag matches "
|
||||
+ cacheContext.getETag());
|
||||
}
|
||||
}
|
||||
|
||||
// Return the ETag and LastModfied fields by serialize to a byte array
|
||||
HTTPCacheContext returnContext = new HTTPCacheContext();
|
||||
returnContext.setETag( "ETag" + (new java.util.Random()).nextInt(Integer.MAX_VALUE) );
|
||||
returnContext.setLastModified( new Date() );
|
||||
return returnContext;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP update/put method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream put(String id) {
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>updated item=" + id + "</body></html>")
|
||||
.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements the HTTP conditional update/put method of the collection implementation.
|
||||
* @param id
|
||||
* @return
|
||||
*/
|
||||
public InputStream conditionalPut(String id, HTTPCacheContext cacheContext)
|
||||
throws NotModifiedException, PreconditionFailedException {
|
||||
|
||||
if (cacheContext != null) {
|
||||
if (cacheContext.ifModifiedSince) {
|
||||
if ((id.equals("1"))
|
||||
&& (0 > cacheContext.lastModifiedDate
|
||||
.compareTo(new Date())))
|
||||
throw new NotModifiedException("item 1 was modified on "
|
||||
+ new Date());
|
||||
}
|
||||
if (cacheContext.ifUnmodifiedSince) {
|
||||
if ((id.equals("0"))
|
||||
&& (0 > cacheContext.lastModifiedDate
|
||||
.compareTo(new Date())))
|
||||
throw new PreconditionFailedException(
|
||||
"item 0 was modified on " + new Date(0));
|
||||
}
|
||||
if (cacheContext.ifMatch) {
|
||||
if (id.equals("1"))
|
||||
throw new PreconditionFailedException(
|
||||
"item 1 eTag does not match "
|
||||
+ cacheContext.getETag());
|
||||
}
|
||||
if (cacheContext.ifNoneMatch) {
|
||||
if (id.equals("0"))
|
||||
throw new PreconditionFailedException(
|
||||
"item 0 eTag matches " + cacheContext.getETag());
|
||||
}
|
||||
}
|
||||
|
||||
return new ByteArrayInputStream(
|
||||
("<html><body><p>updated item=" + id + "</body></html>")
|
||||
.getBytes());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
|
||||
/**
|
||||
* Test service implementation that implements a get method.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
public class TestGetImpl {
|
||||
|
||||
public InputStream get(String id) {
|
||||
return new ByteArrayInputStream(("<html><body><p>item=" + id + "</body></html>").getBytes());
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
||||
import org.osoa.sca.annotations.Service;
|
||||
|
||||
/**
|
||||
* Test service implementation.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
|
||||
@Service(Servlet.class)
|
||||
public class TestServiceCacheImpl implements Servlet {
|
||||
|
||||
public void init(ServletConfig config) throws ServletException {
|
||||
}
|
||||
|
||||
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
|
||||
//HttpServletResponse httpResponse = (HttpServletResponse)response;
|
||||
response.getOutputStream().print("<html><body><p>hey</body></html>");
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
|
||||
public ServletConfig getServletConfig() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getServletInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.tuscany.sca.binding.http;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.servlet.Servlet;
|
||||
import javax.servlet.ServletConfig;
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
|
||||
import org.osoa.sca.annotations.Service;
|
||||
|
||||
/**
|
||||
* Test service implementation.
|
||||
*
|
||||
* @version $Rev$ $Date$
|
||||
*/
|
||||
|
||||
@Service(Servlet.class)
|
||||
public class TestServiceImpl implements Servlet {
|
||||
|
||||
public void init(ServletConfig config) throws ServletException {
|
||||
}
|
||||
|
||||
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
|
||||
//HttpServletResponse httpResponse = (HttpServletResponse)response;
|
||||
response.getOutputStream().print("<html><body><p>hey</body></html>");
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
}
|
||||
|
||||
public ServletConfig getServletConfig() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getServletInfo() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
<html>
|
||||
<!--
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
-->
|
||||
<body><p>hello</body>
|
||||
</html>
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
-->
|
||||
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
|
||||
targetNamespace="http://sample/test"
|
||||
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
|
||||
xmlns:sr="http://sample/test"
|
||||
name="test">
|
||||
|
||||
<component name="ResourceServiceComponent">
|
||||
<tuscany:implementation.resource location="content"/>
|
||||
<service name="Resource">
|
||||
<tuscany:binding.http uri="http://localhost:8085/webcontent"/>
|
||||
</service>
|
||||
</component>
|
||||
|
||||
<component name="HTTPServiceComponent">
|
||||
<implementation.java class="org.apache.tuscany.sca.binding.http.TestServiceImpl"/>
|
||||
<service name="Servlet">
|
||||
<tuscany:binding.http uri="http://localhost:8085/httpservice"/>
|
||||
</service>
|
||||
</component>
|
||||
|
||||
<component name="HTTPGetComponent">
|
||||
<implementation.java class="org.apache.tuscany.sca.binding.http.TestGetImpl"/>
|
||||
<service name="TestGetImpl">
|
||||
<tuscany:binding.http uri="http://localhost:8085/httpget"/>
|
||||
</service>
|
||||
</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"
|
||||
targetNamespace="http://sample/test"
|
||||
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"
|
||||
xmlns:sr="http://sample/test"
|
||||
name="test">
|
||||
|
||||
<component name="HTTPBindingComponent">
|
||||
<implementation.java class="org.apache.tuscany.sca.binding.http.TestBindingCacheImpl"/>
|
||||
<service name="TestBindingCacheImpl">
|
||||
<tuscany:binding.http uri="http://localhost:8085/httpbinding"/>
|
||||
</service>
|
||||
</component>
|
||||
|
||||
</composite>
|
Loading…
Add table
Reference in a new issue