diff --git a/openstack-examples/src/main/java/org/openstack/examples/objectstore/SwiftCopyExample.java b/openstack-examples/src/main/java/org/openstack/examples/objectstore/SwiftCopyExample.java new file mode 100644 index 000000000..a0bcc2923 --- /dev/null +++ b/openstack-examples/src/main/java/org/openstack/examples/objectstore/SwiftCopyExample.java @@ -0,0 +1,39 @@ +package org.openstack.examples.objectstore; + +import java.util.HashMap; +import java.util.List; + +import javax.ws.rs.core.Response; + +import org.openstack.swift.SwiftClient; +import org.openstack.swift.api.*; +import org.openstack.swift.model.Object; + +/** + * Swift copy operation with TempAuth. + * The containers and source file need to exist. + * + * @author Robin Bramley + */ +public class SwiftCopyExample { + + public static void main( String[] args ) { + SwiftClient swiftClient = new SwiftClient("https://192.168.22.66:8443/auth/v1.0", null); + Response res = swiftClient.execute(new TempAuthenticate("test:tester", "testing")); + + String storageUrl = res.getHeaderString(TempAuthenticate.RES_HEADER_STORAGE_URL); + String token = res.getHeaderString(TempAuthenticate.RES_HEADER_AUTH_TOKEN); + System.out.println("Token: " + token); + + swiftClient = new SwiftClient(storageUrl, token); + + swiftClient.execute(new CopyObject("container1","robin_monochrome.jpg","backup","rb-mono.jpg", "image/jpeg")); + + List objs = swiftClient.execute(new ListObjects("backup", new HashMap() {{ + put("path", ""); + }})); + for(Object obj : objs) { + System.out.println(obj.getName() + " - " + obj.getContentType()); + } + } +} diff --git a/swift-client/src/main/java/org/openstack/swift/SwiftClient.java b/swift-client/src/main/java/org/openstack/swift/SwiftClient.java index 8fc6a6861..fbfb2696b 100644 --- a/swift-client/src/main/java/org/openstack/swift/SwiftClient.java +++ b/swift-client/src/main/java/org/openstack/swift/SwiftClient.java @@ -12,11 +12,12 @@ public SwiftClient(String endpointURL, String token) { } public R execute(SwiftCommand command) { - WebTarget endpoint = OpenStack.CLIENT.target(endpointURL); + final WebTarget endpoint = OpenStack.CLIENT.target(endpointURL); if(token != null) { - endpoint.register(tokenFilter); + return command.execute(endpoint, token); + } else { + return command.execute(endpoint); } - return command.execute(endpoint); } } diff --git a/swift-client/src/main/java/org/openstack/swift/SwiftCommand.java b/swift-client/src/main/java/org/openstack/swift/SwiftCommand.java index c129bf2a0..1db68b3a7 100644 --- a/swift-client/src/main/java/org/openstack/swift/SwiftCommand.java +++ b/swift-client/src/main/java/org/openstack/swift/SwiftCommand.java @@ -3,7 +3,10 @@ import javax.ws.rs.client.WebTarget; public interface SwiftCommand { + + static final String REQ_HEADER_AUTH_TOKEN = "X-Auth-Token"; - R execute(WebTarget endpoint); + R execute(WebTarget target); + R execute(WebTarget target, String token); } diff --git a/swift-client/src/main/java/org/openstack/swift/api/CopyObject.java b/swift-client/src/main/java/org/openstack/swift/api/CopyObject.java new file mode 100644 index 000000000..df7afdef9 --- /dev/null +++ b/swift-client/src/main/java/org/openstack/swift/api/CopyObject.java @@ -0,0 +1,64 @@ +package org.openstack.swift.api; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Response; + +import org.openstack.swift.SwiftCommand; + +/** + * Copy an object. + * "do a PUT to the new object (the target) location, but add the 'X-Copy-From' header to designate the source of the data" + * + * @author Robin Bramley + */ +public class CopyObject implements SwiftCommand{ + + private static final String DELIMITER = "/"; + + private static final String REQ_HEADER_COPY_FROM = "X-Copy-From"; + + private String sourceContainerName; + + private String sourceObjectName; + + private String destContainerName; + + private String destObjectName; + + private String mimeType; + + public CopyObject(String sourceContainerName, String sourceObjectName, String destContainerName, String destObjectName, String mimeType) { + this.sourceContainerName = sourceContainerName; + this.sourceObjectName = sourceObjectName; + this.destContainerName = destContainerName; + this.destObjectName = destObjectName; + this.mimeType = mimeType; + } + + @Override + public Response execute(WebTarget target) { + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + // set up the value for the X-Copy-From header + StringBuilder sb = new StringBuilder(2 + + sourceContainerName.length() + + sourceObjectName.length()) + .append(DELIMITER).append(sourceContainerName) + .append(DELIMITER).append(sourceObjectName); + String source = sb.toString(); + + Invocation.Builder invocationBuilder = target.path(destContainerName).path(destObjectName).request(); + + invocationBuilder.header(REQ_HEADER_COPY_FROM, source); + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.put(Entity.entity("", mimeType)); + } +} diff --git a/swift-client/src/main/java/org/openstack/swift/api/CreateContainer.java b/swift-client/src/main/java/org/openstack/swift/api/CreateContainer.java index 56495759a..cfec54d1e 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/CreateContainer.java +++ b/swift-client/src/main/java/org/openstack/swift/api/CreateContainer.java @@ -1,6 +1,7 @@ package org.openstack.swift.api; import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; @@ -16,7 +17,18 @@ public CreateContainer(String containerName) { @Override public Response execute(WebTarget target) { - return target.path(containerName).request().method("PUT",Entity.text("*")); + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.path(containerName).request(); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.method("PUT", Entity.text("*")); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/CreateDirectory.java b/swift-client/src/main/java/org/openstack/swift/api/CreateDirectory.java index 586c6aba0..45c0cdbc7 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/CreateDirectory.java +++ b/swift-client/src/main/java/org/openstack/swift/api/CreateDirectory.java @@ -1,6 +1,7 @@ package org.openstack.swift.api; import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import org.openstack.swift.SwiftCommand; @@ -17,11 +18,22 @@ public CreateDirectory(String container, String path) { } @Override - public Void execute(WebTarget endpoint) { - endpoint.path(container).path(path).request().put(Entity.entity(new byte[1],"application/directory")); - return null; + public Void execute(WebTarget target) { + + return execute(target, null); } - - + @Override + public Void execute(WebTarget target, String token) { + // TODO Auto-generated method stub + Invocation.Builder invocationBuilder = target.path(container).path(path).request(); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + invocationBuilder.put(Entity.entity(new byte[1],"application/directory")); + + return null; + } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/DeleteContainer.java b/swift-client/src/main/java/org/openstack/swift/api/DeleteContainer.java index 100ab5e5b..22d9d9424 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/DeleteContainer.java +++ b/swift-client/src/main/java/org/openstack/swift/api/DeleteContainer.java @@ -1,5 +1,6 @@ package org.openstack.swift.api; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -16,7 +17,18 @@ public DeleteContainer(String containerName) { @Override public Response execute(WebTarget target) { - return target.path(containerName).request(MediaType.APPLICATION_JSON).delete(); + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.path(containerName).request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.delete(); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/DeleteObject.java b/swift-client/src/main/java/org/openstack/swift/api/DeleteObject.java index 7a50218bd..c8e9a7bb2 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/DeleteObject.java +++ b/swift-client/src/main/java/org/openstack/swift/api/DeleteObject.java @@ -1,5 +1,6 @@ package org.openstack.swift.api; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -19,7 +20,18 @@ public DeleteObject(String containerName, String objectName) { @Override public Response execute(WebTarget target) { - return target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON).delete(); + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.delete(); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/DownloadObject.java b/swift-client/src/main/java/org/openstack/swift/api/DownloadObject.java index 0aa65f3a6..e597da7ba 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/DownloadObject.java +++ b/swift-client/src/main/java/org/openstack/swift/api/DownloadObject.java @@ -2,6 +2,7 @@ import java.io.InputStream; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -22,11 +23,21 @@ public DownloadObject(String containerName, String objectName) { @Override public ObjectDownload execute(WebTarget target) { - Response response = target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON).get(); + return execute(target, null); + } + + @Override + public ObjectDownload execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + Response response = invocationBuilder.get(); ObjectDownload objectDownload = new ObjectDownload(); objectDownload.setInputStream((InputStream) response.getEntity()); return objectDownload; - } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/ListContainers.java b/swift-client/src/main/java/org/openstack/swift/api/ListContainers.java index 8d6de058e..ea6c228eb 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/ListContainers.java +++ b/swift-client/src/main/java/org/openstack/swift/api/ListContainers.java @@ -2,6 +2,7 @@ import java.util.List; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; @@ -13,7 +14,18 @@ public class ListContainers implements SwiftCommand>{ @Override public List execute(WebTarget target) { - return target.request(MediaType.APPLICATION_JSON).get(new GenericType>(){}); + return execute(target, null); + } + + @Override + public List execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.get(new GenericType>(){}); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/ListObjects.java b/swift-client/src/main/java/org/openstack/swift/api/ListObjects.java index 5e4532d7f..52a417c7d 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/ListObjects.java +++ b/swift-client/src/main/java/org/openstack/swift/api/ListObjects.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.MediaType; @@ -23,13 +24,25 @@ public ListObjects(String containerName, Map filters) { @Override public List execute(WebTarget target) { + return execute(target, null); + } + + @Override + public List execute(WebTarget target, String token) { target = target.path(containerName); for(String filter : new String[]{"prefix","delimiter","path","marker"}) { if(filters.get(filter) != null) { target = target.queryParam(filter, filters.get(filter)); } } - return target.request(MediaType.APPLICATION_JSON).get(new GenericType>(){}); + + Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.get(new GenericType>(){}); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/ShowAccount.java b/swift-client/src/main/java/org/openstack/swift/api/ShowAccount.java index e3d52bf74..abdad7b5e 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/ShowAccount.java +++ b/swift-client/src/main/java/org/openstack/swift/api/ShowAccount.java @@ -1,5 +1,6 @@ package org.openstack.swift.api; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -10,7 +11,18 @@ public class ShowAccount implements SwiftCommand{ @Override public Response execute(WebTarget target) { - return target.request(MediaType.APPLICATION_JSON).head(); + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.head(); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/ShowContainer.java b/swift-client/src/main/java/org/openstack/swift/api/ShowContainer.java index ef931cf85..a9daf3702 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/ShowContainer.java +++ b/swift-client/src/main/java/org/openstack/swift/api/ShowContainer.java @@ -1,5 +1,6 @@ package org.openstack.swift.api; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -16,7 +17,18 @@ public ShowContainer(String containerName) { @Override public Response execute(WebTarget target) { - return target.path(containerName).request(MediaType.APPLICATION_JSON).head(); + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.path(containerName).request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.head(); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/ShowObject.java b/swift-client/src/main/java/org/openstack/swift/api/ShowObject.java index ad2b1e2e6..ada30ce51 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/ShowObject.java +++ b/swift-client/src/main/java/org/openstack/swift/api/ShowObject.java @@ -1,5 +1,6 @@ package org.openstack.swift.api; +import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -19,7 +20,18 @@ public ShowObject(String containerName, String objectName) { @Override public Response execute(WebTarget target) { - return target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON).head(); + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.path(containerName).path(objectName).request(MediaType.APPLICATION_JSON); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.head(); } } diff --git a/swift-client/src/main/java/org/openstack/swift/api/TempAuthenticate.java b/swift-client/src/main/java/org/openstack/swift/api/TempAuthenticate.java new file mode 100644 index 000000000..6bcc6eeaa --- /dev/null +++ b/swift-client/src/main/java/org/openstack/swift/api/TempAuthenticate.java @@ -0,0 +1,51 @@ +package org.openstack.swift.api; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.openstack.swift.SwiftCommand; + +/** + * Perform TempAuth authentication + * + * @author Robin Bramley + */ +public class TempAuthenticate implements SwiftCommand{ + + private static final String REQ_HEADER_STORAGE_USER = "X-Storage-User"; + private static final String REQ_HEADER_STORAGE_PASS = "X-Storage-Pass"; + public static final String RES_HEADER_STORAGE_URL = "X-Storage-Url"; + public static final String RES_HEADER_AUTH_TOKEN = "X-Auth-Token"; + + private String storageUser; + + private String storagePass; + + public TempAuthenticate(String storageUser, String storagePass) { + this.storageUser = storageUser; + this.storagePass = storagePass; + } + + @Override + public Response execute(WebTarget target) { + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { + Invocation.Builder invocationBuilder = target.request(); + + invocationBuilder.header(REQ_HEADER_STORAGE_USER, storageUser); + invocationBuilder.header(REQ_HEADER_STORAGE_PASS, storagePass); + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + + return invocationBuilder.get(); + } + +} diff --git a/swift-client/src/main/java/org/openstack/swift/api/UploadObject.java b/swift-client/src/main/java/org/openstack/swift/api/UploadObject.java index 1f312dac6..e43242294 100644 --- a/swift-client/src/main/java/org/openstack/swift/api/UploadObject.java +++ b/swift-client/src/main/java/org/openstack/swift/api/UploadObject.java @@ -19,10 +19,20 @@ public UploadObject(ObjectForUpload objectForUpload) { @Override public Response execute(WebTarget target) { + return execute(target, null); + } + + @Override + public Response execute(WebTarget target, String token) { Invocation.Builder invocationBuilder = target.path(objectForUpload.getContainer()).path(objectForUpload.getName()).request(MediaType.APPLICATION_JSON); for(String key : objectForUpload.getProperties().keySet()) { invocationBuilder.header("x-object-meta-" + key, objectForUpload.getProperties().get(key)); } + + if(token != null) { + invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token); + } + return invocationBuilder.put(Entity.entity(objectForUpload.getInputStream(), MediaType.APPLICATION_OCTET_STREAM), Response.class); }