Support new method `BlobContainer#move()`
This has been added in elasticsearch 2.0.0. See elasticsearch/elasticsearch#8782 Wondering if this PR should be split in two parts: * one that clean the code and which is portable to 1.4, 1.x and master * one that simply add move() method for master branch @imotov WDYT? Closes #49.
This commit is contained in:
parent
b91f5da2b2
commit
c20371aa8f
|
@ -59,4 +59,6 @@ public interface AzureStorageService {
|
||||||
OutputStream getOutputStream(String container, String blob) throws URISyntaxException, StorageException;
|
OutputStream getOutputStream(String container, String blob) throws URISyntaxException, StorageException;
|
||||||
|
|
||||||
ImmutableMap<String,BlobMetaData> listBlobsByPrefix(String container, String keyPath, String prefix) throws URISyntaxException, StorageException, ServiceException;
|
ImmutableMap<String,BlobMetaData> listBlobsByPrefix(String container, String keyPath, String prefix) throws URISyntaxException, StorageException, ServiceException;
|
||||||
|
|
||||||
|
void moveBlob(String container, String sourceBlob, String targetBlob) throws URISyntaxException, StorageException;
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,6 +214,19 @@ public class AzureStorageServiceImpl extends AbstractLifecycleComponent<AzureSto
|
||||||
return blobsBuilder.build();
|
return blobsBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void moveBlob(String container, String sourceBlob, String targetBlob) throws URISyntaxException, StorageException {
|
||||||
|
logger.debug("moveBlob container [{}], sourceBlob [{}], targetBlob [{}]", container, sourceBlob, targetBlob);
|
||||||
|
CloudBlobContainer blob_container = client.getContainerReference(container);
|
||||||
|
CloudBlockBlob blobSource = blob_container.getBlockBlobReference(sourceBlob);
|
||||||
|
if (blobSource.exists()) {
|
||||||
|
CloudBlockBlob blobTarget = blob_container.getBlockBlobReference(targetBlob);
|
||||||
|
blobTarget.copyFromBlob(blobSource);
|
||||||
|
blobSource.delete();
|
||||||
|
logger.debug("moveBlob container [{}], sourceBlob [{}], targetBlob [{}] -> done", container, sourceBlob, targetBlob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doStart() throws ElasticsearchException {
|
protected void doStart() throws ElasticsearchException {
|
||||||
logger.debug("starting azure storage client instance");
|
logger.debug("starting azure storage client instance");
|
||||||
|
|
|
@ -118,6 +118,24 @@ public class AzureBlobContainer extends AbstractBlobContainer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void move(String sourceBlobName, String targetBlobName) throws IOException {
|
||||||
|
try {
|
||||||
|
String source = keyPath + sourceBlobName;
|
||||||
|
String target = keyPath + targetBlobName;
|
||||||
|
|
||||||
|
logger.debug("moving blob [{}] to [{}] in container {{}}", source, target, blobStore.container());
|
||||||
|
|
||||||
|
blobStore.client().moveBlob(blobStore.container(), source, target);
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
logger.warn("can not move blob [{}] to [{}] in container {{}}: {}", sourceBlobName, targetBlobName, blobStore.container(), e.getMessage());
|
||||||
|
throw new IOException(e);
|
||||||
|
} catch (StorageException e) {
|
||||||
|
logger.warn("can not move blob [{}] to [{}] in container {{}}: {}", sourceBlobName, targetBlobName, blobStore.container(), e.getMessage());
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ImmutableMap<String, BlobMetaData> listBlobs() throws IOException {
|
public ImmutableMap<String, BlobMetaData> listBlobs() throws IOException {
|
||||||
return listBlobsByPrefix(null);
|
return listBlobsByPrefix(null);
|
||||||
|
|
|
@ -99,6 +99,17 @@ public class AzureStorageServiceMock extends AbstractLifecycleComponent<AzureSto
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void moveBlob(String container, String sourceBlob, String targetBlob) throws URISyntaxException, StorageException {
|
||||||
|
for (String blobName : blobs.keySet()) {
|
||||||
|
if (endsWithIgnoreCase(blobName, sourceBlob)) {
|
||||||
|
ByteArrayOutputStream outputStream = blobs.get(blobName);
|
||||||
|
blobs.put(blobName.replace(sourceBlob, targetBlob), outputStream);
|
||||||
|
blobs.remove(blobName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doStart() throws ElasticsearchException {
|
protected void doStart() throws ElasticsearchException {
|
||||||
}
|
}
|
||||||
|
@ -133,4 +144,27 @@ public class AzureStorageServiceMock extends AbstractLifecycleComponent<AzureSto
|
||||||
String lcPrefix = prefix.toLowerCase(Locale.ROOT);
|
String lcPrefix = prefix.toLowerCase(Locale.ROOT);
|
||||||
return lcStr.equals(lcPrefix);
|
return lcStr.equals(lcPrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if the given String ends with the specified suffix,
|
||||||
|
* ignoring upper/lower case.
|
||||||
|
*
|
||||||
|
* @param str the String to check
|
||||||
|
* @param suffix the suffix to look for
|
||||||
|
* @see java.lang.String#startsWith
|
||||||
|
*/
|
||||||
|
public static boolean endsWithIgnoreCase(String str, String suffix) {
|
||||||
|
if (str == null || suffix == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (str.endsWith(suffix)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (str.length() < suffix.length()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String lcStr = str.substring(0, suffix.length()).toLowerCase(Locale.ROOT);
|
||||||
|
String lcPrefix = suffix.toLowerCase(Locale.ROOT);
|
||||||
|
return lcStr.equals(lcPrefix);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue