Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memory leak prevention on using authentication tokens #98

Open
wants to merge 3 commits into
base: stable/grizzly
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<Object> objs = swiftClient.execute(new ListObjects("backup", new HashMap<String, String>() {{
put("path", "");
}}));
for(Object obj : objs) {
System.out.println(obj.getName() + " - " + obj.getContentType());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ public SwiftClient(String endpointURL, String token) {
}

public <R> R execute(SwiftCommand<R> 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);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
import javax.ws.rs.client.WebTarget;

public interface SwiftCommand<R> {

static final String REQ_HEADER_AUTH_TOKEN = "X-Auth-Token";

R execute(WebTarget endpoint);
R execute(WebTarget target);
R execute(WebTarget target, String token);

}
64 changes: 64 additions & 0 deletions swift-client/src/main/java/org/openstack/swift/api/CopyObject.java
Original file line number Diff line number Diff line change
@@ -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<Response>{

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));
}
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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("*"));
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -13,7 +14,18 @@ public class ListContainers implements SwiftCommand<List<Container>>{

@Override
public List<Container> execute(WebTarget target) {
return target.request(MediaType.APPLICATION_JSON).get(new GenericType<List<Container>>(){});
return execute(target, null);
}

@Override
public List<Container> 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<List<Container>>(){});
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,13 +24,25 @@ public ListObjects(String containerName, Map<String, String> filters) {

@Override
public List<Object> execute(WebTarget target) {
return execute(target, null);
}

@Override
public List<Object> 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<List<Object>>(){});

Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON);

if(token != null) {
invocationBuilder.header(REQ_HEADER_AUTH_TOKEN, token);
}

return invocationBuilder.get(new GenericType<List<Object>>(){});
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -10,7 +11,18 @@ public class ShowAccount implements SwiftCommand<Response>{

@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();
}

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}

}
Loading