[infinispan-commits] Infinispan SVN: r123 - in trunk/cachestore/s3: src/main/java/org/infinispan/loader/s3 and 2 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Wed Apr 15 10:18:15 EDT 2009


Author: adriancole
Date: 2009-04-15 10:18:06 -0400 (Wed, 15 Apr 2009)
New Revision: 123

Added:
   trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Bucket.java
   trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3ConnectionException.java
   trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Bucket.java
Removed:
   trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/Jets3tS3Connection.java
   trunk/cachestore/s3/src/test/java/org/infinispan/s3/
Modified:
   trunk/cachestore/s3/pom.xml
   trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStore.java
   trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStoreConfig.java
   trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Connection.java
   trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Connection.java
Log:
ISPN-28 created mock implementation so that all tests can pass

Modified: trunk/cachestore/s3/pom.xml
===================================================================
--- trunk/cachestore/s3/pom.xml	2009-04-15 08:57:14 UTC (rev 122)
+++ trunk/cachestore/s3/pom.xml	2009-04-15 14:18:06 UTC (rev 123)
@@ -2,53 +2,39 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-   <modelVersion>4.0.0</modelVersion>
-   <parent>
-      <groupId>org.infinispan</groupId>
-      <artifactId>infinispan-parent</artifactId>
-      <version>4.0.0-SNAPSHOT</version>
-      <relativePath>../../parent/pom.xml</relativePath>
-   </parent>
-   <groupId>org.infinispan</groupId>
-   <artifactId>infinispan-cachestore-s3</artifactId>
-   <name>Infinispan Amazon S3 CacheStore</name>
-   <description>Infinispan Amazon S3 CacheStore module</description>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.infinispan</groupId>
+        <artifactId>infinispan-parent</artifactId>
+        <version>4.0.0-SNAPSHOT</version>
+        <relativePath>../../parent/pom.xml</relativePath>
+    </parent>
+    <groupId>org.infinispan</groupId>
+    <artifactId>infinispan-cachestore-s3</artifactId>
+    <name>Infinispan Amazon S3 CacheStore</name>
+    <description>Infinispan Amazon S3 CacheStore module</description>
 
-   <dependencies>
-      <dependency>
-         <groupId>${project-package}</groupId>
-         <artifactId>infinispan-core</artifactId>
-         <version>${project-version}</version>
-      </dependency>
+    <dependencies>
+        <dependency>
+            <groupId>${project-package}</groupId>
+            <artifactId>infinispan-core</artifactId>
+            <version>${project-version}</version>
+        </dependency>
 
-      <dependency>
-         <groupId>${project-package}</groupId>
-         <artifactId>infinispan-core</artifactId>
-         <version>${project-version}</version>
-         <type>test-jar</type>
-         <scope>test</scope>
-      </dependency>
+        <dependency>
+            <groupId>${project-package}</groupId>
+            <artifactId>infinispan-core</artifactId>
+            <version>${project-version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
 
-      <dependency>
-         <groupId>net.java.dev.jets3t</groupId>
-         <artifactId>jets3t</artifactId>
-         <version>0.7.0</version>
-      </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>1.4</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 
-      <dependency>
-         <groupId>commons-io</groupId>
-         <artifactId>commons-io</artifactId>
-         <version>1.4</version>
-         <scope>test</scope>
-      </dependency>
-   </dependencies>
-
-   <repositories>
-      <!-- Repository for Amazon S3 artifacts -->
-      <repository>
-         <name>jets3t</name>
-         <id>jets3t</id>
-         <url>http://jets3t.s3.amazonaws.com/maven2</url>
-      </repository>
-   </repositories>
 </project>

Deleted: trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/Jets3tS3Connection.java
===================================================================
--- trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/Jets3tS3Connection.java	2009-04-15 08:57:14 UTC (rev 122)
+++ trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/Jets3tS3Connection.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -1,133 +0,0 @@
-package org.infinispan.loader.s3;
-
-import org.jets3t.service.S3Service;
-import org.jets3t.service.S3ServiceException;
-import org.jets3t.service.impl.rest.httpclient.RestS3Service;
-import org.jets3t.service.model.S3Bucket;
-import org.jets3t.service.model.S3Object;
-import org.jets3t.service.multithread.S3ServiceSimpleMulti;
-import org.jets3t.service.security.AWSCredentials;
-
-/**
- * A {@link org.jets3t.service.S3Service jets3t} implementation of {@link S3Connection}.
- * <p/>
- * Tuning and configuration parameters can be overridden by creating <tt>jets3t.properties</tt> and adding it to your
- * classpath.
- *
- * @author Adrian Cole
- * @link http://jets3t.s3.amazonaws.com/toolkit/configuration.html
- * @since 4.0
- */
-public class Jets3tS3Connection implements S3Connection {
-   private S3Service s3Service;
-   private S3ServiceSimpleMulti s3MultiService;
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see RestS3Service#RestS3Service(org.jets3t.service.security.AWSCredentials)
-    * @see S3ServiceSimpleMulti#S3ServiceSimpleMulti(org.jets3t.service.S3Service)
-    */
-   public void connect(String awsAccessKey, String awsSecretKey) throws S3ServiceException {
-      AWSCredentials awsCredentials =
-            new AWSCredentials(awsAccessKey, awsSecretKey);
-      s3Service = new RestS3Service(awsCredentials);
-      s3MultiService = new S3ServiceSimpleMulti(s3Service);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see S3Object#S3Object(String)
-    */
-   public S3Object createObject(String key) {
-      return new S3Object(key);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see org.jets3t.service.S3Service#deleteObject(org.jets3t.service.model.S3Bucket, String)
-    */
-   public void removeObjectFromBucket(String objectKey, S3Bucket bucket) throws S3ServiceException {
-      s3Service.deleteObject(bucket, objectKey);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see org.jets3t.service.S3Service#getBucket(String)
-    * @see org.jets3t.service.S3Service#createBucket(String)
-    */
-   public S3Bucket getOrCreateBucket(String bucketName) throws S3ServiceException {
-      return s3Service.getOrCreateBucket(bucketName);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see org.jets3t.service.S3Service#listObjects(org.jets3t.service.model.S3Bucket)
-    */
-   public S3Object[] getAllObjectsInBucketWithoutTheirData(S3Bucket bucket) throws S3ServiceException {
-      return s3Service.listObjects(bucket);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see S3ServiceSimpleMulti#copyObjects(String, String, String[], org.jets3t.service.model.S3Object[], boolean)
-    */
-   public void copyObjectsFromOneBucketToAnother(String[] keys, String sourceBucketName, String destinationBucketName) throws S3ServiceException {
-      S3Object[] destinationObjects = new S3Object[keys.length];
-      int i = 0;
-      for (String key : keys) {
-         destinationObjects[i++] = createObject(key);
-      }
-      s3MultiService.copyObjects(sourceBucketName, destinationBucketName, keys, destinationObjects, false);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see Jets3tS3Connection#getAllObjectsInBucketWithoutTheirData(org.jets3t.service.model.S3Bucket)
-    * @see S3ServiceSimpleMulti#deleteObjects(org.jets3t.service.model.S3Bucket, org.jets3t.service.model.S3Object[])
-    */
-   public void removeAllObjectsFromBucket(S3Bucket bucket) throws S3ServiceException {
-      S3Object[] objects = getAllObjectsInBucketWithoutTheirData(bucket);
-      s3MultiService.deleteObjects(bucket, objects);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see S3Service#deleteBucket(S3Bucket)
-    */
-   public void removeBucketIfEmpty(S3Bucket bucket) throws S3ServiceException {
-      s3Service.deleteBucket(bucket);
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see S3Service#getObject(org.jets3t.service.model.S3Bucket, String)
-    */
-   public S3Object getObjectInBucket(String objectKey, S3Bucket bucket) throws S3ServiceException {
-      try {
-         return s3Service.getObject(bucket, objectKey);
-      } catch (S3ServiceException e) {
-         if (e.getS3ErrorCode() != null && e.getS3ErrorCode().equals("NoSuchKey")) {
-            return null;
-         }
-         throw e;
-      }
-   }
-
-   /**
-    * {@inheritDoc}
-    *
-    * @see S3Service#putObject(org.jets3t.service.model.S3Bucket, org.jets3t.service.model.S3Object)
-    */
-   public S3Object putObjectIntoBucket(S3Object object, S3Bucket bucket) throws S3ServiceException {
-      return s3Service.putObject(bucket, object);
-   }
-}
\ No newline at end of file

Added: trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Bucket.java
===================================================================
--- trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Bucket.java	                        (rev 0)
+++ trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Bucket.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -0,0 +1,33 @@
+package org.infinispan.loader.s3;
+
+import org.infinispan.loader.bucket.Bucket;
+
+import java.util.Set;
+
+/**
+ * // TODO: Adrian: Document this!
+ * <p/>
+ * This interface defines the interactons between the {@link S3CacheStore} and Amazon S3.
+ *
+ * @author Adrian Cole
+ * @since 4.0
+ */
+public interface S3Bucket<B, C extends S3Connection> {
+
+    void init(C connection, B bucket);
+
+    String getName();
+
+    void insert(Bucket object) throws S3ConnectionException;
+
+    Bucket get(String key) throws S3ConnectionException;
+
+    Set<String> keySet() throws S3ConnectionException;
+
+    Set<Bucket> values() throws S3ConnectionException;
+
+    public void remove(String key) throws S3ConnectionException;
+
+    void clear() throws S3ConnectionException;
+
+}
\ No newline at end of file

Modified: trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStore.java
===================================================================
--- trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStore.java	2009-04-15 08:57:14 UTC (rev 122)
+++ trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStore.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -6,207 +6,138 @@
 import org.infinispan.loader.CacheLoaderException;
 import org.infinispan.loader.bucket.Bucket;
 import org.infinispan.loader.bucket.BucketBasedCacheStore;
-import org.infinispan.loader.file.FileCacheStore;
 import org.infinispan.logging.Log;
 import org.infinispan.logging.LogFactory;
 import org.infinispan.marshall.Marshaller;
-import org.jets3t.service.S3ServiceException;
-import org.jets3t.service.model.S3Bucket;
-import org.jets3t.service.model.S3Object;
-import org.jets3t.service.utils.ServiceUtils;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.ObjectInput;
-import java.io.ObjectInputStream;
 import java.io.ObjectOutput;
 import java.util.HashSet;
 import java.util.Set;
 
 /**
- * A {@link org.jets3t.service.S3Service jets3t} implementation of a {@link org.infinispan.loader.bucket.BucketBasedCacheStore}.
+ * A TODO link implementation of a {@link org.infinispan.loader.bucket.BucketBasedCacheStore}.
  * This file store stores stuff in the following format: <tt>http://s3.amazon.com/{bucket}/bucket_number.bucket</tt>
  * <p/>
- * Tuning and configuration parameters can be overridden by creating <tt>jets3t.properties</tt> and adding it to your
- * classpath.
  *
  * @author Adrian Cole
- * @link http://jets3t.s3.amazonaws.com/toolkit/configuration.html
  * @since 4.0
  */
 public class S3CacheStore extends BucketBasedCacheStore {
 
-   private static final Log log = LogFactory.getLog(FileCacheStore.class);
+    private static final Log log = LogFactory.getLog(S3CacheStore.class);
 
-   private S3CacheStoreConfig config;
-   private S3Bucket rootS3Bucket;
+    private S3CacheStoreConfig config;
 
-   Cache cache;
-   Marshaller marshaller;
+    Cache cache;
+    Marshaller marshaller;
 
-   private S3Connection s3Connection;
+    private S3Connection connection;
+    private S3Bucket s3Bucket;
 
-   public Class<? extends CacheLoaderConfig> getConfigurationClass() {
-      return S3CacheStoreConfig.class;
-   }
+    public Class<? extends CacheLoaderConfig> getConfigurationClass() {
+        return S3CacheStoreConfig.class;
+    }
 
-   /**
-    * {@inheritDoc} This initializes the internal <tt>s3Connection</tt> as an implementation of {@link
-    * Jets3tS3Connection}
-    */
-   public void init(CacheLoaderConfig config, Cache cache, Marshaller m) {
-      init(config, cache, m, new Jets3tS3Connection());
-   }
+    /**
+     * {@inheritDoc} This initializes the internal <tt>s3Connection</tt> to a default implementation
+     */
+    public void init(CacheLoaderConfig config, Cache cache, Marshaller m) {
+        throw new UnsupportedOperationException("no default implementation, yet");
+//        init(config, cache, m, null, null);
+    }
 
-   public void init(CacheLoaderConfig config, Cache cache, Marshaller m, S3Connection s3Connection) {
-      super.init(config, cache, m);
-      this.config = (S3CacheStoreConfig) config;
-      this.cache = cache;
-      this.marshaller = m;
-      this.s3Connection = s3Connection;
-   }
+    @Override
+    public void stop() throws CacheLoaderException {
+        super.stop();
+        this.connection.disconnect();
+    }
 
+    public void init(CacheLoaderConfig config, Cache cache, Marshaller m, S3Connection connection, S3Bucket bucket) {
+        super.init(config, cache, m);
+        this.config = (S3CacheStoreConfig) config;
+        this.cache = cache;
+        this.marshaller = m;
+        this.connection = connection;
+        this.s3Bucket = bucket;
+    }
 
-   public void start() throws CacheLoaderException {
-      super.start();
 
-      String awsAccessKey = config.getAwsAccessKey();
-      if (awsAccessKey == null)
-         throw new IllegalArgumentException("awsAccessKey must be set");
-      String awsSecretKey = config.getAwsSecretKey();
-      if (awsSecretKey == null)
-         throw new IllegalArgumentException("awsSecretKey must be set");
-      String s3Bucket = config.getBucket();
-      if (s3Bucket == null)
-         throw new IllegalArgumentException("s3Bucket must be set");
+    public void start() throws CacheLoaderException {
+        super.start();
 
-      try {
-         s3Connection.connect(awsAccessKey, awsSecretKey);
-         rootS3Bucket = s3Connection.getOrCreateBucket(s3Bucket);
-      } catch (S3ServiceException e) {
-         throw convertToCacheLoaderException("error opening s3 service", e);
-      }
-   }
+        if (config.getAwsAccessKey() == null)
+            throw new IllegalArgumentException("awsAccessKey must be set");
+        if (config.getAwsSecretKey() == null)
+            throw new IllegalArgumentException("awsSecretKey must be set");
+        this.connection.connect(config, marshaller);
+        String s3Bucket = config.getBucket();
+        if (s3Bucket == null)
+            throw new IllegalArgumentException("s3Bucket must be set");
+        this.s3Bucket.init(this.connection, connection.verifyOrCreateBucket(s3Bucket));
+    }
 
-   protected Set<InternalCacheEntry> loadAllLockSafe() throws CacheLoaderException {
-      Set<InternalCacheEntry> result = new HashSet<InternalCacheEntry>();
-      try {
-         for (S3Object s3Object : s3Connection.getAllObjectsInBucketWithoutTheirData(rootS3Bucket)) {
-            Bucket bucket = loadBucket(s3Object);
-            if (bucket != null) {
-               if (bucket.removeExpiredEntries()) {
-                  saveBucket(bucket);
-               }
-               result.addAll(bucket.getStoredEntries());
+    protected Set<InternalCacheEntry> loadAllLockSafe() throws CacheLoaderException {
+        Set<InternalCacheEntry> result = new HashSet<InternalCacheEntry>();
+        // TODO I don't know why this returns objects at the moment
+        for (Bucket bucket : (Set<Bucket>) s3Bucket.values()) {
+            if (bucket.removeExpiredEntries()) {
+                saveBucket(bucket);
             }
-         }
-      } catch (S3ServiceException e) {
-         throw convertToCacheLoaderException("Error while loading entries", e);
-      }
-      return result;
-   }
+            result.addAll(bucket.getStoredEntries());
+        }
+        return result;
+    }
 
-   protected void fromStreamLockSafe(ObjectInput objectInput) throws CacheLoaderException {
-      try {
-         S3Bucket source = (S3Bucket) objectInput.readObject();
-         if (rootS3Bucket.getName().equals(source.getName())) {
+    protected void fromStreamLockSafe(ObjectInput objectInput) throws CacheLoaderException {
+        String source;
+        try {
+            source = (String) objectInput.readObject();
+
+        } catch (Exception e) {
+            throw convertToCacheLoaderException("Error while reading from stream", e);
+        }
+        if (config.getBucket().equals(source)) {
             log.info("Attempt to load the same s3 bucket ignored");
-         } else {
-            S3Object[] sourceObjects = s3Connection.getAllObjectsInBucketWithoutTheirData(source);
-            String[] sourceKeys = new String[sourceObjects.length];
+        } else {
+            connection.copyBucket(source, config.getBucket());
+        }
+    }
 
-            int i = 0;
-            for (S3Object sourceObject : sourceObjects) {
-               sourceKeys[i++] = sourceObject.getKey();
-            }
-            s3Connection.copyObjectsFromOneBucketToAnother(sourceKeys, source.getName(), rootS3Bucket.getName());
-         }
-         loadAll();
-      } catch (Exception e) {
-         throw convertToCacheLoaderException("Error while reading from stream", e);
-      }
-   }
+    protected void toStreamLockSafe(ObjectOutput objectOutput) throws CacheLoaderException {
+        try {
+            objectOutput.writeObject(config.getBucket());
+        } catch (IOException e) {
+            throw convertToCacheLoaderException("Error while writing to stream", e);
+        }
+    }
 
-   protected void toStreamLockSafe(ObjectOutput objectOutput) throws CacheLoaderException {
-      try {
-         objectOutput.writeObject(rootS3Bucket);
-      } catch (IOException e) {
-         throw convertToCacheLoaderException("Error while writing to stream", e);
-      }
-   }
+    protected void clearLockSafe() throws CacheLoaderException {
+        s3Bucket.clear();
+    }
 
-   protected void clearLockSafe() throws CacheLoaderException {
-      try {
-         s3Connection.removeAllObjectsFromBucket(rootS3Bucket);
-      } catch (S3ServiceException caught) {
-         throw convertToCacheLoaderException("error recreating bucket " + config.getBucket(), caught);
-      }
-   }
+    CacheLoaderException convertToCacheLoaderException(String message, Exception caught) {
+        return (caught instanceof CacheLoaderException) ? (CacheLoaderException) caught :
+                new CacheLoaderException(message, caught);
+    }
 
-   CacheLoaderException convertToCacheLoaderException(String message, Exception caught) {
-      return (caught instanceof CacheLoaderException) ? (CacheLoaderException) caught :
-            new CacheLoaderException(message, caught);
-   }
+    protected void purgeInternal() throws CacheLoaderException {
+        loadAll();
+    }
 
-   protected void purgeInternal() throws CacheLoaderException {
-      loadAll();
-   }
+    protected Bucket loadBucket(String bucketName) throws CacheLoaderException {
+        return s3Bucket.get(bucketName);
+    }
 
-   protected Bucket loadBucket(String bucketName) throws CacheLoaderException {
-      return loadBucket(s3Connection.createObject(bucketName));
-   }
 
-   protected Bucket loadBucket(S3Object s3Object) throws CacheLoaderException {
-      Bucket bucket = null;
-      InputStream is = null;
-      ObjectInputStream ois = null;
-      String key = s3Object.getKey();
-      try {
-         // it is possible that the S3Object above only holds details.  Try to fetch, if this is the case
-         if (s3Object.getDataInputStream() == null) {
-            s3Object = s3Connection.getObjectInBucket(key, rootS3Bucket);
-         }
+    protected void insertBucket(Bucket bucket) throws CacheLoaderException {
+        s3Bucket.insert(bucket);
+    }
 
-         // it is possible that the object never existed. in this case, fall out.
-         if (s3Object != null && s3Object.getDataInputStream() != null) {
-            is = s3Object.getDataInputStream();
-            ois = new ObjectInputStream(is);
-            bucket = (Bucket) ois.readObject();
-            s3Object.closeDataInputStream();
-            bucket.setBucketName(s3Object.getKey());
-         }
-      } catch (Exception e) {
-         throw convertToCacheLoaderException("Error while reading from object: " + key, e);
-      } finally {
-         safeClose(ois);
-         safeClose(is);
-      }
-      return bucket;
-   }
+    protected void saveBucket(Bucket bucket) throws CacheLoaderException {
+        s3Bucket.insert(bucket);
+    }
 
-   protected void insertBucket(Bucket bucket) throws CacheLoaderException {
-      saveBucket(bucket);
-   }
 
-   public final void saveBucket(Bucket b) throws CacheLoaderException {
-      try {
-         if (b.getEntries().isEmpty()) {
-            s3Connection.removeObjectFromBucket(b.getBucketName(), rootS3Bucket);
-         } else {
-            ByteArrayInputStream dataIS = new ByteArrayInputStream(
-                  marshaller.objectToByteBuffer(b));
-            byte[] md5Hash = ServiceUtils.computeMD5Hash(dataIS);
-            dataIS.reset();
-            S3Object s3Object = s3Connection.createObject(b.getBucketName());
-            s3Object.setDataInputStream(dataIS);
-            s3Object.setContentLength(dataIS.available());
-            s3Object.setMd5Hash(md5Hash);
-            s3Connection.putObjectIntoBucket(s3Object, rootS3Bucket);
-         }
-      } catch (Exception ex) {
-         throw convertToCacheLoaderException("Exception while saving bucket " + b, ex);
-      }
-   }
-
 }

Modified: trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStoreConfig.java
===================================================================
--- trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStoreConfig.java	2009-04-15 08:57:14 UTC (rev 122)
+++ trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3CacheStoreConfig.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -18,7 +18,29 @@
    private String awsAccessKey;
    private String awsSecretKey;
    private String bucket;
+   private String proxyHost;
+   private int proxyPort;
 
+   public int getMaxConnections() {
+      return maxConnections;
+   }
+
+   public void setMaxConnections(int maxConnections) {
+      this.maxConnections = maxConnections;
+   }
+
+   private int maxConnections = 3;
+   private boolean secure = true;
+
+   public boolean isSecure() {
+      return secure;
+   }
+
+   public void setSecure(boolean secure) {
+      this.secure = secure;
+   }
+
+
    public S3CacheStoreConfig() {
       setCacheLoaderClassName(S3CacheStore.class.getName());
    }
@@ -47,5 +69,21 @@
       this.bucket = bucket;
    }
 
+   public String getProxyHost() {
+      return proxyHost;
+   }
 
-}
+   public void setProxyHost(String proxyHost) {
+      this.proxyHost = proxyHost;
+   }
+
+   public int getProxyPort() {
+      return proxyPort;
+   }
+
+   public void setProxyPort(int proxyPort) {
+      this.proxyPort = proxyPort;
+   }
+
+
+}
\ No newline at end of file

Modified: trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Connection.java
===================================================================
--- trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Connection.java	2009-04-15 08:57:14 UTC (rev 122)
+++ trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3Connection.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -1,35 +1,23 @@
 package org.infinispan.loader.s3;
 
-import org.jets3t.service.S3ServiceException;
-import org.jets3t.service.model.S3Bucket;
-import org.jets3t.service.model.S3Object;
+import org.infinispan.marshall.Marshaller;
 
 /**
- * This interface defines the interactons between the {@link S3CacheStore} and Amazon S3.
+ * // TODO: Adrian: Document this!
  *
  * @author Adrian Cole
  * @since 4.0
  */
-public interface S3Connection {
+public interface S3Connection<C, B> {
+    void connect(S3CacheStoreConfig config, Marshaller m) throws S3ConnectionException;
 
-   void connect(String awsAccessKey, String awsSecretKey) throws S3ServiceException;
+    C getConnection() throws S3ConnectionException;
 
-   S3Bucket getOrCreateBucket(String bucketName) throws S3ServiceException;
+    B verifyOrCreateBucket(String bucketName) throws S3ConnectionException;
 
-   void removeBucketIfEmpty(S3Bucket bucket) throws S3ServiceException;
+    void destroyBucket(String name) throws S3ConnectionException;
 
-   S3Object createObject(String key);
+    void copyBucket(String sourceBucket, String destinationBucket) throws S3ConnectionException;
 
-   S3Object putObjectIntoBucket(S3Object object, S3Bucket bucket) throws S3ServiceException;
-
-   S3Object getObjectInBucket(String objectKey, S3Bucket bucket) throws S3ServiceException;
-
-   S3Object[] getAllObjectsInBucketWithoutTheirData(S3Bucket bucket) throws S3ServiceException;
-
-   public void removeObjectFromBucket(String objectKey, S3Bucket bucket) throws S3ServiceException;
-
-   void removeAllObjectsFromBucket(S3Bucket rootS3Bucket) throws S3ServiceException;
-
-   void copyObjectsFromOneBucketToAnother(String[] keys, String sourceBucketName, String destinationBucketName) throws S3ServiceException;
-
+    void disconnect();
 }
\ No newline at end of file

Added: trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3ConnectionException.java
===================================================================
--- trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3ConnectionException.java	                        (rev 0)
+++ trunk/cachestore/s3/src/main/java/org/infinispan/loader/s3/S3ConnectionException.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -0,0 +1,26 @@
+package org.infinispan.loader.s3;
+
+import org.infinispan.loader.CacheLoaderException;
+
+/**
+ * An exception thrown by a {@link S3Bucket} implementation if there are problems reading from S3.
+ *
+ * @author Adrian Cole
+ * @since 4.0
+ */
+public class S3ConnectionException extends CacheLoaderException {
+   public S3ConnectionException() {
+   }
+
+   public S3ConnectionException(String message) {
+      super(message);
+   }
+
+   public S3ConnectionException(String message, Throwable cause) {
+      super(message, cause);
+   }
+
+   public S3ConnectionException(Throwable cause) {
+      super(cause);
+   }
+}
\ No newline at end of file

Added: trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Bucket.java
===================================================================
--- trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Bucket.java	                        (rev 0)
+++ trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Bucket.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -0,0 +1,58 @@
+package org.infinispan.loader.s3;
+
+import org.infinispan.loader.bucket.Bucket;
+import org.infinispan.marshall.Marshaller;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Stores Infinispan Buckets in a map instead of a live S3 Bucket.
+ *
+ * @author Adrian Cole
+ * @version $Id: $
+ * @since 4.0
+ */
+public class MockS3Bucket implements S3Bucket<Map<String, Bucket>, org.infinispan.loader.s3.MockS3Connection> {
+    private String name;
+    private Map<String, Bucket> s3Bucket;
+
+    public void init(String name, String awsAccessKey, String awsSecretKey, Marshaller m) throws S3ConnectionException {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public Set<Bucket> values() throws S3ConnectionException {
+        return new HashSet<Bucket>(s3Bucket.values());
+    }
+
+    public void init(org.infinispan.loader.s3.MockS3Connection connection, Map<String, Bucket> bucket) {
+        this.s3Bucket = bucket;
+    }
+
+    public void insert(Bucket object) throws S3ConnectionException {
+        s3Bucket.put(object.getBucketName(), object);
+    }
+
+    public Bucket get(String key) throws S3ConnectionException {
+        return s3Bucket.get(key);
+    }
+
+    public Set<String> keySet() throws S3ConnectionException {
+        return s3Bucket.keySet();
+    }
+
+    public void remove(String key) throws S3ConnectionException {
+        s3Bucket.remove(key);
+    }
+
+    public void clear() throws S3ConnectionException {
+        s3Bucket.clear();
+    }
+
+}
+

Modified: trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Connection.java
===================================================================
--- trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Connection.java	2009-04-15 08:57:14 UTC (rev 122)
+++ trunk/cachestore/s3/src/test/java/org/infinispan/loader/s3/MockS3Connection.java	2009-04-15 14:18:06 UTC (rev 123)
@@ -1,104 +1,48 @@
 package org.infinispan.loader.s3;
 
-import org.apache.commons.io.IOUtils;
-import org.jets3t.service.S3ServiceException;
-import org.jets3t.service.model.S3Bucket;
-import org.jets3t.service.model.S3Object;
+import org.infinispan.loader.bucket.Bucket;
+import org.infinispan.marshall.Marshaller;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
- * @author Adrian Cole
- * @version $Id$
+ * Stores S3 Buckets in a map instead of connecting to a live server.
+ *
  * @since 4.0
+ * @author Adrian Cole
  */
-public class MockS3Connection implements S3Connection {
-   private Map<String, S3Bucket> nameToS3Bucket = new ConcurrentHashMap<String, S3Bucket>();
-   private Map<String, Map<String, S3Object>> bucketToContents = new ConcurrentHashMap<String, Map<String, S3Object>>();
+public class MockS3Connection implements S3Connection<MockS3Connection, Map<String, Bucket>> {
+    private static Map<String, Map<String, Bucket>> bucketToContents = new ConcurrentHashMap<String, Map<String, Bucket>>();
 
-   public synchronized S3Bucket getOrCreateBucket(String bucketName) throws S3ServiceException {
-      S3Bucket bucket = nameToS3Bucket.get(bucketName);
-      if (bucket == null) {
-         bucket = new S3Bucket(bucketName);
-         nameToS3Bucket.put(bucketName, bucket);
-         bucketToContents.put(bucketName, new ConcurrentHashMap<String, S3Object>());
-      }
-      return bucket;
-   }
+    public void connect(S3CacheStoreConfig config, Marshaller m) throws S3ConnectionException {
+        // Do nothing
+    }
 
-   public S3Object[] getAllObjectsInBucketWithoutTheirData(S3Bucket bucket) throws S3ServiceException {
-      Map<String, S3Object> contents = bucketToContents.get(bucket.getName());
-      return contents.values().toArray(new S3Object[]{});
-   }
+    public MockS3Connection getConnection() throws S3ConnectionException {
+        return this;
+    }
 
-   public void copyObjectsFromOneBucketToAnother(String[] keys, String sourceBucketName, String destinationBucketName) throws S3ServiceException {
-      Map<String, S3Object> source = bucketToContents.get(sourceBucketName);
-      Map<String, S3Object> destination = bucketToContents.get(destinationBucketName);
-      for (int i = 0; i < keys.length; i++) {
-         destination.put(keys[i], source.get(keys[i]));
-      }
-   }
+    public Map<String, Bucket> verifyOrCreateBucket(String bucketName) throws S3ConnectionException {
+        if (!bucketToContents.containsKey(bucketName)) {
+            bucketToContents.put(bucketName, new ConcurrentHashMap<String, Bucket>());
+        }
+        return bucketToContents.get(bucketName);
+    }
 
-   public void removeBucketIfEmpty(S3Bucket bucket) throws S3ServiceException {
-      nameToS3Bucket.remove(bucket.getName());
-      bucketToContents.remove(bucket.getName());
-   }
+    public void destroyBucket(String name) throws S3ConnectionException {
+        bucketToContents.remove(name);
+    }
 
-   public S3Object getObjectInBucket(String objectKey, S3Bucket bucket) throws S3ServiceException {
-      Map<String, S3Object> contents = bucketToContents.get(bucket.getName());
-      return contents.get(objectKey);
-   }
+    public void disconnect() {
+        // na
+    }
 
-   public S3Object putObjectIntoBucket(S3Object object, S3Bucket bucket) throws S3ServiceException {
-      Map<String, S3Object> contents = bucketToContents.get(bucket.getName());
-      contents.put(object.getKey(), object);
-      return object;
-   }
-
-   public void connect(String awsAccessKey, String awsSecretKey) throws S3ServiceException {
-      // ignore
-   }
-
-   public S3Object createObject(String key) {
-      return new MockS3Object(key);
-   }
-
-   public void removeObjectFromBucket(String objectKey, S3Bucket bucket) throws S3ServiceException {
-      Map<String, S3Object> contents = bucketToContents.get(bucket.getName());
-      contents.remove(objectKey);
-   }
-
-   public void removeAllObjectsFromBucket(S3Bucket bucket) throws S3ServiceException {
-      Map<String, S3Object> contents = bucketToContents.get(bucket.getName());
-      contents.clear();
-   }
-
-   class MockS3Object extends S3Object {
-
-      byte[] buff;
-
-      public MockS3Object(String key) {
-         super(key);
-      }
-
-      @Override
-      public void setDataInputStream(InputStream inputStream) {
-         try {
-            buff = IOUtils.toByteArray(inputStream);
-         } catch (IOException e) {
-            throw new RuntimeException(e);
-         }
-      }
-
-      @Override
-      public InputStream getDataInputStream() throws S3ServiceException {
-         return (buff != null) ? new ByteArrayInputStream(buff) : null;
-      }
-   }
-
+    public void copyBucket(String sourceBucket, String destinationBucket) throws S3ConnectionException {
+        Map<String, Bucket> source = bucketToContents.get(sourceBucket);
+        Map<String, Bucket> dest = bucketToContents.get(destinationBucket);
+        for (Bucket bucket : source.values()) {
+            dest.put(bucket.getBucketName(), bucket);
+        }
+    }
 }
-




More information about the infinispan-commits mailing list