package org.jboss.resteasy.keystone.client;
import org.jboss.resteasy.client.jaxrs.ProxyBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import org.jboss.resteasy.keystone.core.i18n.Messages;
import org.jboss.resteasy.keystone.model.Access;
import org.jboss.resteasy.keystone.model.Authentication;
import org.jboss.resteasy.keystone.model.Mappers;
import javax.ws.rs.client.ClientRequestContext;
import javax.ws.rs.client.ClientRequestFilter;
import javax.ws.rs.client.WebTarget;
import java.io.IOException;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class SkeletonKeyClientBuilder
{
protected ResteasyWebTarget admin;
protected TokenFactory tokenFactory;
protected String username;
protected String password;
public SkeletonKeyClientBuilder username(String username)
{
this.username = username;
return this;
}
public SkeletonKeyClientBuilder password(String password)
{
this.password = password;
return this;
}
public SkeletonKeyClientBuilder idp(WebTarget uri)
{
admin = (ResteasyWebTarget)uri;
WebTarget target = uri.path("tokens");
Mappers.registerContextResolver(target);
tokenFactory = ProxyBuilder.builder(TokenFactory.class, target).build();
return this;
}
public Access authenticateTarget(final String projectName, WebTarget target)
{
if (username == null) throw new NullPointerException(Messages.MESSAGES.usernameNull());
if (password == null) throw new NullPointerException(Messages.MESSAGES.passwordNull());
if (tokenFactory == null) throw new NullPointerException(Messages.MESSAGES.idpNull());
final Access access = obtainToken(projectName);
ClientRequestFilter tokenFilter = new ClientRequestFilter() {
volatile Access token = access;
@Override
public void filter(ClientRequestContext requestContext) throws IOException
{
Access tmp = token;
if (tmp.getToken().expired())
{
synchronized (this)
{
tmp = token;
if (tmp.getToken().expired())
{
token = tmp = obtainToken(projectName);
}
}
}
requestContext.getHeaders().putSingle("X-Auth-Token", tmp.getToken().getId());
}
};
target.register(tokenFilter);
return access;
}
public String signed(final String projectName, WebTarget target)
{
if (username == null) throw new NullPointerException(Messages.MESSAGES.usernameNull());
if (password == null) throw new NullPointerException(Messages.MESSAGES.passwordNull());
if (tokenFactory == null) throw new NullPointerException(Messages.MESSAGES.idpNull());
final String access = obtainSignedToken(projectName);
ClientRequestFilter tokenFilter = new ClientRequestFilter() {
@Override
public void filter(ClientRequestContext requestContext) throws IOException
{
requestContext.getHeaders().putSingle("X-Auth-Signed-Token", access);
}
};
target.register(tokenFilter);
return access;
}
public Access obtainToken(String projectName)
{
Authentication auth = authentication(projectName);
return tokenFactory.create(auth);
}
public String obtainSignedToken(String projectName)
{
Authentication auth = authentication(projectName);
return tokenFactory.createSigned(auth);
}
public Authentication authentication(String projectName)
{
Authentication auth = new Authentication();
Authentication.PasswordCredentials creds = new Authentication.PasswordCredentials();
creds.setUsername(username);
creds.setPassword(password);
auth.setProjectName(projectName);
auth.setPasswordCredentials(creds);
return auth;
}
public SkeletonKeyAdminClient admin()
{
ResteasyWebTarget clone = admin.clone();
Mappers.registerContextResolver(clone);
authenticateTarget("Skeleton Key", clone);
return clone.proxy(SkeletonKeyAdminClient.class);
}
}