From 4450c6aebb2dc05219c094a4085e929a9474b5f3 Mon Sep 17 00:00:00 2001 From: Ka-Hing Cheung Date: Wed, 25 Mar 2015 16:34:22 -0700 Subject: [PATCH] add a way to lookup blobstore with a callback remove the old map based lookup --- .../org/gaul/s3proxy/BlobStoreLocator.java | 26 +++++++++++ src/main/java/org/gaul/s3proxy/S3Proxy.java | 7 ++- .../java/org/gaul/s3proxy/S3ProxyHandler.java | 43 ++++++++++++------- 3 files changed, 57 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/gaul/s3proxy/BlobStoreLocator.java diff --git a/src/main/java/org/gaul/s3proxy/BlobStoreLocator.java b/src/main/java/org/gaul/s3proxy/BlobStoreLocator.java new file mode 100644 index 0000000..f2c4c63 --- /dev/null +++ b/src/main/java/org/gaul/s3proxy/BlobStoreLocator.java @@ -0,0 +1,26 @@ +/* + * Copyright 2014-2015 Andrew Gaul + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gaul.s3proxy; + +import java.util.Map; + +import org.jclouds.blobstore.BlobStore; + +public interface BlobStoreLocator { + Map.Entry locateBlobStore(String identity, + String container, String blob); +} diff --git a/src/main/java/org/gaul/s3proxy/S3Proxy.java b/src/main/java/org/gaul/s3proxy/S3Proxy.java index 316bc99..06d46de 100644 --- a/src/main/java/org/gaul/s3proxy/S3Proxy.java +++ b/src/main/java/org/gaul/s3proxy/S3Proxy.java @@ -21,7 +21,6 @@ import static java.util.Objects.requireNonNull; import static com.google.common.base.Preconditions.checkArgument; import java.net.URI; -import java.util.Map; import com.google.common.base.Optional; import com.google.common.base.Strings; @@ -154,8 +153,8 @@ public final class S3Proxy { return server.getState(); } - public void setProviders( - Map> providers) { - handler.setProviders(providers); + public void setBlobStoreLocator(BlobStoreLocator lookup) { + handler.setBlobStoreLocator(lookup); } + } diff --git a/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java b/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java index c5b22f5..9d625f9 100644 --- a/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java +++ b/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java @@ -34,7 +34,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -151,22 +150,34 @@ final class S3ProxyHandler extends AbstractHandler { "log-delivery-write" ); - private Map> providers = - new HashMap<>(); private final BlobStore defaultBlobStore; private final Optional virtualHost; private final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); private final XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance(); + private BlobStoreLocator blobStoreLocator; - S3ProxyHandler(BlobStore blobStore, String identity, String credential, - Optional virtualHost) { - requireNonNull(blobStore); + S3ProxyHandler(final BlobStore blobStore, String identity, + final String credential, Optional virtualHost) { if (identity != null) { - providers.put(identity, Maps.immutableEntry(credential, blobStore)); + blobStoreLocator = new BlobStoreLocator() { + @Override + public Map.Entry locateBlobStore( + String identity, String container, String blob) { + return Maps.immutableEntry(credential, blobStore); + } + }; + defaultBlobStore = null; } else { + blobStoreLocator = new BlobStoreLocator() { + @Override + public Map.Entry locateBlobStore( + String identity, String container, String blob) { + return null; + } + }; defaultBlobStore = blobStore; } this.virtualHost = requireNonNull(virtualHost); @@ -278,9 +289,16 @@ final class S3ProxyHandler extends AbstractHandler { requestSignature = request.getParameter("Signature"); } + String[] path = uri.split("/", 3); + for (int i = 0; i < path.length; i++) { + path[i] = URLDecoder.decode(path[i], "UTF-8"); + } + if (requestIdentity != null) { Map.Entry provider = - providers.get(requestIdentity); + blobStoreLocator.locateBlobStore( + requestIdentity, path.length > 1 ? path[1] : null, + path.length > 2 ? path[2] : null); if (provider == null) { throw new S3Exception(S3ErrorCode.INVALID_ACCESS_KEY_ID); } @@ -319,10 +337,6 @@ final class S3ProxyHandler extends AbstractHandler { } } - String[] path = uri.split("/", 3); - for (int i = 0; i < path.length; i++) { - path[i] = URLDecoder.decode(path[i], "UTF-8"); - } String uploadId = request.getParameter("uploadId"); switch (method) { case "DELETE": @@ -1647,9 +1661,8 @@ final class S3ProxyHandler extends AbstractHandler { } } - public void setProviders( - Map> providers) { - this.providers = ImmutableMap.copyOf(providers); + public void setBlobStoreLocator(BlobStoreLocator locator) { + this.blobStoreLocator = locator; } static class S3Exception extends Exception {