From 4292f3a24a0ba4eb90701ea51b7a9ed0b4a0dc83 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 8 May 2011 17:31:08 +0200 Subject: [PATCH] implement createSession of ScmClientProvider --- .../java/sonia/scm/client/ScmUrlProvider.java | 12 ++++- .../scm/client/JerseyClientProvider.java | 54 ++++++++++++++++++- .../sonia/scm/client/JerseyClientSession.java | 31 +++++++++++ 3 files changed, 95 insertions(+), 2 deletions(-) diff --git a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java index 9f5811c954..6ca33740e4 100644 --- a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java +++ b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/ScmUrlProvider.java @@ -40,6 +40,9 @@ package sonia.scm.client; public class ScmUrlProvider { + /** Field description */ + public static final String API_PATH = "/api/rest/"; + /** Field description */ public static final String URLPART_AUTHENTICATION = "authentication/login"; @@ -53,7 +56,14 @@ public class ScmUrlProvider */ public ScmUrlProvider(String baseUrl) { - this.baseUrl = baseUrl; + if (!baseUrl.endsWith(API_PATH)) + { + this.baseUrl = baseUrl.concat(API_PATH); + } + else + { + this.baseUrl = baseUrl; + } } //~--- get methods ---------------------------------------------------------- diff --git a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientProvider.java b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientProvider.java index 767146f255..9d3d3df09b 100644 --- a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientProvider.java +++ b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientProvider.java @@ -33,6 +33,24 @@ package sonia.scm.client; +//~--- non-JDK imports -------------------------------------------------------- + +import org.sonatype.spice.jersey.client.ahc.config.DefaultAhcConfig; + +import sonia.scm.ScmState; +import sonia.scm.util.AssertUtil; +import sonia.scm.util.Util; + +//~--- JDK imports ------------------------------------------------------------ + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.core.util.MultivaluedMapImpl; +import com.sun.servicetag.UnauthorizedAccessException; + +import javax.ws.rs.core.MultivaluedMap; + /** * * @author Sebastian Sdorra @@ -57,6 +75,40 @@ public class JerseyClientProvider implements ScmClientProvider String password) throws ScmClientException { - throw new UnsupportedOperationException("Not supported yet."); + AssertUtil.assertIsNotEmpty(url); + + ScmUrlProvider urlProvider = new ScmUrlProvider(url); + DefaultAhcConfig config = new DefaultAhcConfig(); + Client client = Client.create(config); + WebResource resource = client.resource(urlProvider.getAuthenticationUrl()); + ClientResponse response = null; + + if (Util.isNotEmpty(username) && Util.isNotEmpty(password)) + { + MultivaluedMap formData = new MultivaluedMapImpl(); + + formData.add("username", username); + formData.add("password", password); + response = resource.type("application/x-www-form-urlencoded").post( + ClientResponse.class, formData); + } + else + { + response = resource.get(ClientResponse.class); + } + + if (response.getStatus() == 401) + { + throw new UnauthorizedAccessException(); + } + + ScmState state = response.getEntity(ScmState.class); + + if (!state.isSuccess()) + { + throw new ScmClientException("create ScmClientSession failed"); + } + + return new JerseyClientSession(client, urlProvider, state); } } diff --git a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientSession.java b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientSession.java index d884f7ffa4..ff508ecaf8 100644 --- a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientSession.java +++ b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseyClientSession.java @@ -42,6 +42,8 @@ import sonia.scm.user.User; //~--- JDK imports ------------------------------------------------------------ +import com.sun.jersey.api.client.Client; + import java.io.IOException; /** @@ -51,6 +53,24 @@ import java.io.IOException; public class JerseyClientSession implements ScmClientSession { + /** + * Constructs ... + * + * + * @param client + * @param urlProvider + * @param state + */ + public JerseyClientSession(Client client, ScmUrlProvider urlProvider, + ScmState state) + { + this.client = client; + this.urlProvider = urlProvider; + this.state = state; + } + + //~--- methods -------------------------------------------------------------- + /** * Method description * @@ -112,4 +132,15 @@ public class JerseyClientSession implements ScmClientSession { throw new UnsupportedOperationException("Not supported yet."); } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Client client; + + /** Field description */ + private ScmState state; + + /** Field description */ + private ScmUrlProvider urlProvider; }