You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2008/09/17 07:42:35 UTC

svn commit: r696157 - in /tuscany/branches/sca-equinox/modules/binding-http-runtime/src: main/java/org/apache/tuscany/sca/binding/http/provider/ test/java/org/apache/tuscany/sca/binding/http/ test/resources/

Author: jsdelfino
Date: Tue Sep 16 22:42:34 2008
New Revision: 696157

URL: http://svn.apache.org/viewvc?rev=696157&view=rev
Log:
TUSCANY-2601 HTTP binding ETag and LastModified test cases


Added:
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/HTTPBindingCacheTestCase.java
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/NotModifiedException.java
      - copied, changed from r696156, tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/PreconditionFailedException.java
      - copied, changed from r696156, tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestBindingCacheImpl.java
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestServiceCacheImpl.java
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/resources/testCache.composite
Modified:
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/main/java/org/apache/tuscany/sca/binding/http/provider/HTTPBindingListenerServlet.java
    tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java

Modified: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/main/java/org/apache/tuscany/sca/binding/http/provider/HTTPBindingListenerServlet.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/main/java/org/apache/tuscany/sca/binding/http/provider/HTTPBindingListenerServlet.java?rev=696157&r1=696156&r2=696157&view=diff
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/main/java/org/apache/tuscany/sca/binding/http/provider/HTTPBindingListenerServlet.java (original)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/main/java/org/apache/tuscany/sca/binding/http/provider/HTTPBindingListenerServlet.java Tue Sep 16 22:42:34 2008
@@ -311,10 +311,21 @@
             throw new ServletException((Throwable)responseMessage.getBody());
         }
 
-        // Put ETag and LastModified in response.
-        CacheContext cc = (CacheContext)responseMessage.getBody();
-        response.setHeader( "ETag", cc.getETag() );
-        response.setHeader( "LastModified", cc.getLastModified() );
+
+        // Test if the ETag and LastModified are returned as a cache context.
+    	Object body = responseMessage.getBody();
+    	if ( body.getClass() == CacheContext.class ) {
+    		// Transfer to header if so.
+    		CacheContext cc = (CacheContext)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() );
+    		}
+    	}
     }
 
 	/**

Added: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/HTTPBindingCacheTestCase.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/HTTPBindingCacheTestCase.java?rev=696157&view=auto
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/HTTPBindingCacheTestCase.java (added)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/HTTPBindingCacheTestCase.java Tue Sep 16 22:42:34 2008
@@ -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();
+			}
+		}
+	}
+}

Copied: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/NotModifiedException.java (from r696156, tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java)
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/NotModifiedException.java?p2=tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/NotModifiedException.java&p1=tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java&r1=696156&r2=696157&rev=696157&view=diff
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java (original)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/NotModifiedException.java Tue Sep 16 22:42:34 2008
@@ -19,20 +19,26 @@
 
 package org.apache.tuscany.sca.binding.http;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
 /**
- * Test service implementation that implements a get method.
- *
+ * Indicates that a resource was not modified.
+ * 
  * @version $Rev$ $Date$
  */
-public class TestGetImpl {
-    
-    public InputStream get(String id) {
-        System.out.println( "DOB: TestGetImpl id=" + id );
-        return new ByteArrayInputStream(("<html><body><p>item=" + id + "</body></html>").getBytes());
+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);
+    }
 }

Copied: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/PreconditionFailedException.java (from r696156, tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java)
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/PreconditionFailedException.java?p2=tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/PreconditionFailedException.java&p1=tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java&r1=696156&r2=696157&rev=696157&view=diff
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java (original)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/PreconditionFailedException.java Tue Sep 16 22:42:34 2008
@@ -19,20 +19,26 @@
 
 package org.apache.tuscany.sca.binding.http;
 
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
 /**
- * Test service implementation that implements a get method.
- *
+ * Indicates that a resource was not modified.
+ * 
  * @version $Rev$ $Date$
  */
-public class TestGetImpl {
-    
-    public InputStream get(String id) {
-        System.out.println( "DOB: TestGetImpl id=" + id );
-        return new ByteArrayInputStream(("<html><body><p>item=" + id + "</body></html>").getBytes());
+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);
+    }
 }

Added: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestBindingCacheImpl.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestBindingCacheImpl.java?rev=696157&view=auto
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestBindingCacheImpl.java (added)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestBindingCacheImpl.java Tue Sep 16 22:42:34 2008
@@ -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, CacheContext 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, CacheContext 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 CacheContext conditionalPost(CacheContext 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
+		CacheContext returnContext = new CacheContext();
+		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, CacheContext 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());
+	}
+
+}

Modified: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java?rev=696157&r1=696156&r2=696157&view=diff
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java (original)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestGetImpl.java Tue Sep 16 22:42:34 2008
@@ -30,7 +30,6 @@
 public class TestGetImpl {
     
     public InputStream get(String id) {
-        System.out.println( "DOB: TestGetImpl id=" + id );
         return new ByteArrayInputStream(("<html><body><p>item=" + id + "</body></html>").getBytes());
 
     }

Added: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestServiceCacheImpl.java
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestServiceCacheImpl.java?rev=696157&view=auto
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestServiceCacheImpl.java (added)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/java/org/apache/tuscany/sca/binding/http/TestServiceCacheImpl.java Tue Sep 16 22:42:34 2008
@@ -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;
+    }
+
+}

Added: tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/resources/testCache.composite
URL: http://svn.apache.org/viewvc/tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/resources/testCache.composite?rev=696157&view=auto
==============================================================================
--- tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/resources/testCache.composite (added)
+++ tuscany/branches/sca-equinox/modules/binding-http-runtime/src/test/resources/testCache.composite Tue Sep 16 22:42:34 2008
@@ -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>