Repository: incubator-brooklyn Updated Branches: refs/heads/master fe425079f -> 09377df27
Rest client authenticates Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/317b69e1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/317b69e1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/317b69e1 Branch: refs/heads/master Commit: 317b69e17338bb541bc903b5ed97e30e58a929a6 Parents: fe42507 Author: Sam Corbett <[email protected]> Authored: Mon Jan 19 16:15:55 2015 +0000 Committer: Sam Corbett <[email protected]> Committed: Mon Jan 19 16:15:55 2015 +0000 ---------------------------------------------------------------------- .../java/brooklyn/rest/client/BrooklynApi.java | 86 ++++++++++++++++---- .../rest/client/BrooklynApiRestClientTest.java | 7 +- 2 files changed, 74 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/317b69e1/usage/rest-client/src/main/java/brooklyn/rest/client/BrooklynApi.java ---------------------------------------------------------------------- diff --git a/usage/rest-client/src/main/java/brooklyn/rest/client/BrooklynApi.java b/usage/rest-client/src/main/java/brooklyn/rest/client/BrooklynApi.java index 1bdd92f..1dbdf6c 100644 --- a/usage/rest-client/src/main/java/brooklyn/rest/client/BrooklynApi.java +++ b/usage/rest-client/src/main/java/brooklyn/rest/client/BrooklynApi.java @@ -18,13 +18,23 @@ */ package brooklyn.rest.client; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.MalformedURLException; import java.net.URL; import javax.ws.rs.core.Response; +import org.apache.commons.codec.binary.Base64; +import org.apache.http.impl.client.DefaultHttpClient; +import org.jboss.resteasy.client.ClientExecutor; +import org.jboss.resteasy.client.ClientRequest; import org.jboss.resteasy.client.ClientResponse; import org.jboss.resteasy.client.ProxyFactory; +import org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor; import org.jboss.resteasy.util.GenericType; +import com.google.common.base.Charsets; + import brooklyn.rest.api.AccessApi; import brooklyn.rest.api.ActivityApi; import brooklyn.rest.api.ApplicationApi; @@ -48,73 +58,113 @@ import brooklyn.rest.api.VersionApi; public class BrooklynApi { private final String target; + private final ClientExecutor clientExecutor; + + public BrooklynApi(URL endpoint) { + this(checkNotNull(endpoint, "endpoint").toString()); + } public BrooklynApi(String endpoint) { - target = endpoint; + this(endpoint, null, null); } - public BrooklynApi(URL endpoint) { - this(endpoint.toString()); + public BrooklynApi(URL endpoint, String username, String password) { + this(endpoint.toString(), username, password); + } + + public BrooklynApi(final String endpoint, final String username, final String password) { + URL target = null; + try { + target = new URL(checkNotNull(endpoint, "endpoint")); + } catch (MalformedURLException e) { + throw new IllegalArgumentException(e); + } + this.target = endpoint; + + // Resteasy is a big pain. + DefaultHttpClient client = new DefaultHttpClient(); + if (username != null && password != null) { + clientExecutor = new ApacheHttpClient4Executor(client) { + @Override + public ClientResponse execute(ClientRequest request) throws Exception { + String token = username + ":" + password; + String base64Token = Base64.encodeBase64String(token.getBytes(Charsets.UTF_8)); + request.header("Authorization", "Basic " + base64Token); + return super.execute(request); + } + }; + } else { + clientExecutor = new ApacheHttpClient4Executor(client); + } + } + + public BrooklynApi(URL endpoint, ClientExecutor clientExecutor) { + this.target = checkNotNull(endpoint, "endpoint").toString(); + this.clientExecutor = checkNotNull(clientExecutor, "clientExecutor"); + } + + private <T> T proxy(Class<T> clazz) { + return ProxyFactory.create(clazz, target, clientExecutor); } public ActivityApi getActivityApi() { - return ProxyFactory.create(ActivityApi.class, target); + return proxy(ActivityApi.class); } public ApplicationApi getApplicationApi() { - return ProxyFactory.create(ApplicationApi.class, target); + return proxy(ApplicationApi.class); } public CatalogApi getCatalogApi() { - return ProxyFactory.create(CatalogApi.class, target); + return proxy(CatalogApi.class); } public EffectorApi getEffectorApi() { - return ProxyFactory.create(EffectorApi.class, target); + return proxy(EffectorApi.class); } public EntityConfigApi getEntityConfigApi() { - return ProxyFactory.create(EntityConfigApi.class, target); + return proxy(EntityConfigApi.class); } public EntityApi getEntityApi() { - return ProxyFactory.create(EntityApi.class, target); + return proxy(EntityApi.class); } public LocationApi getLocationApi() { - return ProxyFactory.create(LocationApi.class, target); + return proxy(LocationApi.class); } public PolicyConfigApi getPolicyConfigApi() { - return ProxyFactory.create(PolicyConfigApi.class, target); + return proxy(PolicyConfigApi.class); } public PolicyApi getPolicyApi() { - return ProxyFactory.create(PolicyApi.class, target); + return proxy(PolicyApi.class); } public ScriptApi getScriptApi() { - return ProxyFactory.create(ScriptApi.class, target); + return proxy(ScriptApi.class); } public SensorApi getSensorApi() { - return ProxyFactory.create(SensorApi.class, target); + return proxy(SensorApi.class); } public ServerApi getServerApi() { - return ProxyFactory.create(ServerApi.class, target); + return proxy(ServerApi.class); } public UsageApi getUsageApi() { - return ProxyFactory.create(UsageApi.class, target); + return proxy(UsageApi.class); } public VersionApi getVersionApi() { - return ProxyFactory.create(VersionApi.class, target); + return proxy(VersionApi.class); } public AccessApi getAccessApi() { - return ProxyFactory.create(AccessApi.class, target); + return proxy(AccessApi.class); } @SuppressWarnings("unchecked") http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/317b69e1/usage/rest-client/src/test/java/brooklyn/rest/client/BrooklynApiRestClientTest.java ---------------------------------------------------------------------- diff --git a/usage/rest-client/src/test/java/brooklyn/rest/client/BrooklynApiRestClientTest.java b/usage/rest-client/src/test/java/brooklyn/rest/client/BrooklynApiRestClientTest.java index b7e35a3..b67b972 100644 --- a/usage/rest-client/src/test/java/brooklyn/rest/client/BrooklynApiRestClientTest.java +++ b/usage/rest-client/src/test/java/brooklyn/rest/client/BrooklynApiRestClientTest.java @@ -38,6 +38,9 @@ import brooklyn.management.internal.LocalManagementContext; import brooklyn.rest.BrooklynRestApiLauncher; import brooklyn.rest.BrooklynRestApiLauncherTest; import brooklyn.rest.domain.LocationSummary; +import brooklyn.rest.security.provider.ExplicitUsersSecurityProvider; +import brooklyn.rest.security.provider.SecurityProvider; +import brooklyn.rest.security.provider.TestSecurityProvider; @Test public class BrooklynApiRestClientTest { @@ -69,10 +72,12 @@ public class BrooklynApiRestClientTest { Server server = BrooklynRestApiLauncher.launcher() .managementContext(manager) + .securityProvider(TestSecurityProvider.class) .customContext(context) .start(); - api = new BrooklynApi("http://localhost:" + server.getConnectors()[0].getPort() + "/"); + api = new BrooklynApi("http://localhost:" + server.getConnectors()[0].getPort() + "/", + TestSecurityProvider.USER, TestSecurityProvider.PASSWORD); } @AfterClass(alwaysRun = true)
