Author: genman
Date: 2008-03-19 20:00:45 -0400 (Wed, 19 Mar 2008)
New Revision: 5451
Modified:
amazon-s3/trunk/pom.xml
amazon-s3/trunk/src/main/java/com/amazon/s3/emulator/Server.java
amazon-s3/trunk/src/test/java/com/amazon/s3/CanonicalStringTest.java
amazon-s3/trunk/src/test/java/com/amazon/s3/S3EmulatorTest.java
amazon-s3/trunk/src/test/java/com/amazon/s3/S3Test.java
Log:
Emulator seems to work with CacheLoader now
Modified: amazon-s3/trunk/pom.xml
===================================================================
--- amazon-s3/trunk/pom.xml 2008-03-19 22:46:38 UTC (rev 5450)
+++ amazon-s3/trunk/pom.xml 2008-03-20 00:00:45 UTC (rev 5451)
@@ -65,5 +65,10 @@
<artifactId>commons-httpclient</artifactId>
<version>3.0.1</version>
</dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1.1</version>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
Modified: amazon-s3/trunk/src/main/java/com/amazon/s3/emulator/Server.java
===================================================================
--- amazon-s3/trunk/src/main/java/com/amazon/s3/emulator/Server.java 2008-03-19 22:46:38
UTC (rev 5450)
+++ amazon-s3/trunk/src/main/java/com/amazon/s3/emulator/Server.java 2008-03-20 00:00:45
UTC (rev 5451)
@@ -20,6 +20,9 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import net.noderunner.http.servlet.ServletServer;
import com.amazon.s3.Entry;
@@ -31,41 +34,41 @@
private static final long serialVersionUID = 1L;
+ private Log log = LogFactory.getLog(getClass());
private ServletServer ss;
private boolean bucket = false;
private SortedMap<Entry, S3Object> map = new TreeMap<Entry, S3Object>();
public Server() throws IOException {
ss = new ServletServer(this);
+ log.info("Server created " + this);
}
/**
* Closes socket, stops accepting requests.
*/
public void close() throws IOException {
+ log("close");
ss.close();
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
- URI uri;
- try {
- uri = new URI(req.getRequestURI());
- } catch (URISyntaxException e1) {
- throw new RuntimeException(e1);
- }
- String key = uri.getPath().substring(1);
- Entry e = new Entry(key);
+ Entry e = entry(req);
S3Object remove = map.remove(e);
if (remove == null) {
- resp.sendError(404, "Not found " + key);
+ resp.sendError(404, "Not found " + e);
} else {
resp.sendError(HttpURLConnection.HTTP_NO_CONTENT, "Deleted");
}
}
+ private Entry entry(HttpServletRequest req) {
+ return new Entry(key(uri(req)));
+ }
+
/**
* Listening port.
*/
@@ -83,26 +86,24 @@
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
- URI uri;
- try {
- uri = new URI(req.getRequestURI());
- } catch (URISyntaxException e1) {
- throw new RuntimeException(e1);
- }
+ URI uri = uri(req);
+ boolean debug = log.isDebugEnabled();
+ if (debug)
+ log("doGet " + uri);
if ("/".equals(uri.getPath())) {
list(req, resp);
} else {
String key = uri.getPath().substring(1);
Entry e = new Entry(key);
S3Object obj = map.get(e);
+ if (debug)
+ log("map.get(" + key + ") = " + obj);
if (obj == null) {
resp.sendError(404, "Not here: " + e);
return;
}
Headers h = new Headers();
h = h.mergeMetadata(obj.getMetadata());
- log("Headers " + obj);
- log("Headers " + h);
for (Map.Entry<String, List<String>> me : h.getHeaders().entrySet()) {
for (String v : me.getValue()) {
resp.setHeader(me.getKey(), v);
@@ -118,6 +119,8 @@
String marker = req.getParameter("marker");
String delimiter = req.getParameter("delimiter");
String maxKeysStr = req.getParameter("max-keys");
+ if (log.isDebugEnabled())
+ log("list prefix=" + prefix + " delimiter=" + delimiter);
int maxKeys = Integer.MAX_VALUE;
if (maxKeysStr != null)
maxKeys = Integer.parseInt(maxKeysStr);
@@ -127,16 +130,24 @@
submap = map.tailMap(new Entry(prefix));
int keyCount = 0;
boolean truncated = false;
+ String nextMarker = null;
for (Entry e : submap.keySet()) {
if (++keyCount > maxKeys) {
truncated = true;
break;
}
String key = e.getKey();
- if (prefix != null && !key.startsWith(prefix))
- break;
- if (delimiter != null && key.indexOf(delimiter) != -1)
+ String remain = key;
+ nextMarker = key;
+ if (prefix != null) {
+ if (!key.startsWith(prefix))
+ break;
+ remain = key.substring(prefix.length());
+ }
+ if (delimiter != null && remain.indexOf(delimiter) != -1)
continue;
+ if (log.isDebugEnabled())
+ log("include key=" + key);
w.start("Contents");
w.start("Key").write(key).end();
w.start("LastModified").write(e.getLastModified()).end();
@@ -154,8 +165,12 @@
hw.start("Name").write("localhost").end();
hw.start("Prefix").write(s(prefix)).end();
hw.start("Marker").write(s(marker)).end();
- if (delimiter != null)
+ if (delimiter != null) {
hw.start("Delimiter").write(delimiter).end();
+ if (truncated) {
+ hw.start("NextMarker").write(nextMarker).end();
+ }
+ }
hw.start("IsTruncated").write(String.valueOf(truncated)).end();
if (maxKeysStr != null)
hw.start("MaxKeys").write(maxKeysStr).end();
@@ -164,7 +179,6 @@
PrintWriter pw = resp.getWriter();
pw.write(hw.toString());
- log(hw.toString());
pw.flush();
bucket = true;
}
@@ -178,25 +192,40 @@
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
- System.out.println(req);
+ URI uri = uri(req);
+ if (log.isDebugEnabled())
+ log("doHead " + uri);
+ if (map.containsKey(entry(req))) {
+ log("found");
+ resp.sendError(HttpURLConnection.HTTP_OK, "Found URI");
+ } else {
+ log("not found");
+ resp.sendError(404, "Not found");
+ }
}
+
+ private URI uri(HttpServletRequest req) {
+ try {
+ return new URI(req.getRequestURI());
+ } catch (URISyntaxException e1) {
+ throw new RuntimeException(e1);
+ }
+ }
+
+ private String key(URI uri) {
+ return uri.getPath().substring(1);
+ }
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
- URI uri;
- try {
- uri = new URI(req.getRequestURI());
- } catch (URISyntaxException e1) {
- throw new RuntimeException(e1);
- }
+ URI uri = uri(req);
+ log("doPut " + uri);
if ("/".equals(uri.getPath())) {
log("create bucket");
bucket = true;
} else {
- log("URI " + uri.getPath());
- String key = uri.getPath().substring(1);
- Entry e = new Entry(key);
+ Entry e = new Entry(key(uri));
e.setLastModified(new Date());
e.setSize(req.getContentLength());
e.setOwner(new Owner("id", "name"));
@@ -217,13 +246,25 @@
for (String n : Collections.list(names))
h.put(n, req.getHeader(n));
s3.setMetadata(h.extractMetadata());
- log("PUT '" + e + "' as: " + s3);
+ log("put '" + e + "' as: " + s3);
}
- System.out.println(req);
}
- public void log(String log) {
- System.err.println(log);
+ public void log(String s) {
+ log.debug(s);
}
+ /**
+ * Returns a debug <code>String</code>.
+ */
+ @Override
+ public String toString()
+ {
+ return super.toString() +
+ " bucket=" + this.bucket +
+ " ss=" + this.ss +
+ " map=" + this.map +
+ "";
+ }
+
}
Modified: amazon-s3/trunk/src/test/java/com/amazon/s3/CanonicalStringTest.java
===================================================================
--- amazon-s3/trunk/src/test/java/com/amazon/s3/CanonicalStringTest.java 2008-03-19
22:46:38 UTC (rev 5450)
+++ amazon-s3/trunk/src/test/java/com/amazon/s3/CanonicalStringTest.java 2008-03-20
00:00:45 UTC (rev 5451)
@@ -25,7 +25,7 @@
String canon =
"XXYasfajkjaslkfdjalksjflkasjflkajskfjasjflksadjflksajfdkljsadlkfjaslkfd";
Key key = CanonicalString.key(access);
String encode = CanonicalString.encode(key, canon);
- assertEquals("p5p5Y89Qhhaitcesa/l03whnQhw=", encode);
+ assertEquals("hAu+ibd/CZIw6/5OR69i2+40bfc=", encode);
}
@Test
Modified: amazon-s3/trunk/src/test/java/com/amazon/s3/S3EmulatorTest.java
===================================================================
--- amazon-s3/trunk/src/test/java/com/amazon/s3/S3EmulatorTest.java 2008-03-19 22:46:38
UTC (rev 5450)
+++ amazon-s3/trunk/src/test/java/com/amazon/s3/S3EmulatorTest.java 2008-03-20 00:00:45
UTC (rev 5451)
@@ -8,18 +8,11 @@
// this software code. (c) 2006-2007 Amazon Digital Services, Inc. or its
// affiliates.
-import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.List;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.URI;
-import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
-import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -104,7 +97,7 @@
assertEquals("Unexpected list size", 1,
listBucketResponse.getEntries().size());
assertEquals("Unexpected common prefix size", 0,
listBucketResponse.getCommonPrefixEntries().size());
// TODO
- // verifyBucketResponseParameters(listBucketResponse, bucket, "",
"", 1, "/", true, "example.txt");
+ verifyBucketResponseParameters(listBucketResponse, bucket, "",
"", 1, "/", true, "example.txt");
// root "directory" with a max-keys of "2"
listBucketResponse = conn.list(bucket, null, null, 2, "/", null);
@@ -125,8 +118,7 @@
// test "directory"
listBucketResponse = conn.list(bucket, "test/", null, null,
"/", null);
listBucketResponse.assertOk();
- // TODO
- // assertEquals("Unexpected list size", 1,
listBucketResponse.getEntries().size());
+ assertEquals("Unexpected list size", 1,
listBucketResponse.getEntries().size());
assertEquals("Unexpected common prefix size", 0,
listBucketResponse.getCommonPrefixEntries().size());
verifyBucketResponseParameters(listBucketResponse, bucket, "test/",
"", UnspecifiedMaxKeys, "/", false, null);
Modified: amazon-s3/trunk/src/test/java/com/amazon/s3/S3Test.java
===================================================================
--- amazon-s3/trunk/src/test/java/com/amazon/s3/S3Test.java 2008-03-19 22:46:38 UTC (rev
5450)
+++ amazon-s3/trunk/src/test/java/com/amazon/s3/S3Test.java 2008-03-20 00:00:45 UTC (rev
5451)
@@ -34,6 +34,9 @@
@Before
public void setUp() {
+ if (emulated)
+ return;
+
if (awsAccessKeyId == null)
throw new IllegalStateException("accessKey system propery null");
if (awsSecretAccessKey == null)