blob: 15e355486436e99297573b8ff7cf3872cc5e8160 [file] [log] [blame]
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.blobstore.util;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jclouds.blobstore.AsyncBlobStore;
import org.jclouds.blobstore.BlobStore;
import org.jclouds.blobstore.BlobStoreContext;
import org.jclouds.blobstore.ContainerNotFoundException;
import org.jclouds.blobstore.KeyNotFoundException;
import org.jclouds.blobstore.domain.Blob;
import org.jclouds.blobstore.domain.BlobMetadata;
import org.jclouds.blobstore.domain.StorageMetadata;
import org.jclouds.blobstore.functions.BlobName;
import org.jclouds.functions.ExceptionToValueOrPropagate;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpRequestFilter;
import org.jclouds.http.HttpUtils;
import org.jclouds.rest.internal.GeneratedHttpRequest;
import org.jclouds.util.Strings2;
import com.google.common.reflect.TypeToken;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
/**
*
* @author Adrian Cole
*/
public class BlobStoreUtils {
public static <T> HttpRequest cleanRequest(HttpRequest returnVal) {
checkNotNull(returnVal, "http request");
for (HttpRequestFilter filter : returnVal.getFilters())
returnVal = filter.filter(returnVal);
return HttpRequest.builder().method(returnVal.getMethod()).endpoint(returnVal.getEndpoint())
.headers(returnVal.getHeaders()).payload(returnVal.getPayload()).build();
}
public static final ExceptionToValueOrPropagate<KeyNotFoundException, ?> keyNotFoundToNullOrPropagate = new ExceptionToValueOrPropagate<KeyNotFoundException, Object>(
KeyNotFoundException.class, null);
public static final ExceptionToValueOrPropagate<ContainerNotFoundException, ?> containerNotFoundToNullOrPropagate = new ExceptionToValueOrPropagate<ContainerNotFoundException, Object>(
ContainerNotFoundException.class, null);
@SuppressWarnings("unchecked")
public static <T> T keyNotFoundToNullOrPropagate(Exception e) {
return (T) keyNotFoundToNullOrPropagate.apply(e);
}
@SuppressWarnings("unchecked")
public static <T> T containerNotFoundToNullOrPropagate(Exception e) {
return (T) containerNotFoundToNullOrPropagate.apply(e);
}
public static Blob newBlob(BlobStore blobStore, StorageMetadata blobMeta) {
Blob blob = checkNotNull(blobStore, "blobStore").blobBuilder(checkNotNull(blobMeta, "blobMeta").getName())
.userMetadata(blobMeta.getUserMetadata()).build();
if (blobMeta instanceof BlobMetadata) {
HttpUtils.copy(((BlobMetadata) blobMeta).getContentMetadata(), blob.getMetadata().getContentMetadata());
}
blob.getMetadata().setETag(blobMeta.getETag());
blob.getMetadata().setId(blobMeta.getProviderId());
blob.getMetadata().setLastModified(blobMeta.getLastModified());
blob.getMetadata().setLocation(blobMeta.getLocation());
blob.getMetadata().setUri(blobMeta.getUri());
return blob;
}
public static String parseContainerFromPath(String path) {
String container = checkNotNull(path, "path");
if (path.indexOf('/') != -1)
container = path.substring(0, path.indexOf('/'));
return container;
}
public static String parsePrefixFromPath(String path) {
String prefix = null;
if (checkNotNull(path, "path").indexOf('/') != -1)
prefix = path.substring(path.indexOf('/') + 1);
return "".equals(prefix) ? null : prefix;
}
public static String parseDirectoryFromPath(String path) {
return checkNotNull(path, "path").substring(0, path.lastIndexOf('/'));
}
private static Pattern keyFromContainer = Pattern.compile("/?[^/]+/(.*)");
public static String getNameFor(GeneratedHttpRequest request) {
checkNotNull(request, "request");
// assume first params are container and key
if (request.getArgs().size() >= 2 && request.getArgs().get(0) instanceof String
&& request.getArgs().get(1) instanceof String) {
return request.getArgs().get(1).toString();
} else if (request.getArgs().size() >= 1 && request.getArgs().get(0) instanceof String) {
Matcher matcher = keyFromContainer.matcher(request.getArgs().get(0).toString());
if (matcher.find())
return matcher.group(1);
}
String objectKey = request.getEndpoint().getPath();
if (objectKey.startsWith("/")) {
// Trim initial slash from object key name.
objectKey = objectKey.substring(1);
}
return objectKey;
}
public static String getContentAsStringOrNullAndClose(Blob blob) throws IOException {
checkNotNull(blob, "blob");
checkNotNull(blob.getPayload(), "blob.payload");
if (blob.getPayload().getInput() == null)
return null;
Object o = blob.getPayload().getInput();
if (o instanceof InputStream) {
return Strings2.toStringAndClose((InputStream) o);
} else {
throw new IllegalArgumentException("Object type not supported: " + o.getClass().getName());
}
}
private static final BlobName blobName = new BlobName();
public static ListenableFuture<Void> createParentIfNeededAsync(AsyncBlobStore asyncBlobStore, String container,
Blob blob) {
checkNotNull(asyncBlobStore, "asyncBlobStore");
checkNotNull(container, "container");
String name = blobName.apply(blob);
if (name.indexOf('/') > 0) {
return asyncBlobStore.createDirectory(container, parseDirectoryFromPath(name));
} else {
return Futures.immediateFuture(null);
}
}
@Deprecated
public static Iterable<String> getSupportedProviders() {
return org.jclouds.rest.Providers.getSupportedProvidersOfType(TypeToken.of(BlobStoreContext.class));
}
}