package org.jboss.resteasy.skeleton.key.idm.service;
import org.jboss.resteasy.skeleton.key.idm.IdentityManager;
import org.jboss.resteasy.skeleton.key.idm.i18n.LogMessages;
import org.jboss.resteasy.skeleton.key.idm.i18n.Messages;
import org.jboss.resteasy.skeleton.key.idm.model.data.Realm;
import org.jboss.resteasy.skeleton.key.representations.idm.PublishedRealmRepresentation;
import javax.ws.rs.GET;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
@Path("/")
public class RealmResource
{
protected IdentityManager identityManager;
@Context
protected UriInfo uriInfo;
public RealmResource(IdentityManager identityManager)
{
this.identityManager = identityManager;
}
@GET
@Path("realms/{realm}")
@Produces("application/json")
public PublishedRealmRepresentation getRealm(@PathParam("realm") String id)
{
Realm realm = identityManager.getRealm(id);
if (realm == null)
{
LogMessages.LOGGER.debug(Messages.MESSAGES.realmNotFound());
throw new NotFoundException();
}
return realmRep(realm, uriInfo);
}
@GET
@Path("realms/{realm}.html")
@Produces("text/html")
public String getRealmHtml(@PathParam("realm") String id)
{
Realm realm = identityManager.getRealm(id);
if (realm == null)
{
LogMessages.LOGGER.debug(Messages.MESSAGES.realmNotFound());
throw new NotFoundException();
}
return realmHtml(realm);
}
private String realmHtml(Realm realm)
{
StringBuffer html = new StringBuffer();
UriBuilder auth = uriInfo.getBaseUriBuilder();
auth.path(TokenManagement.class)
.path(TokenManagement.class, "requestAccessCode");
String authUri = auth.build(realm.getId()).toString();
UriBuilder code = uriInfo.getBaseUriBuilder();
code.path(TokenManagement.class).path(TokenManagement.class, "accessRequest");
String codeUri = code.build(realm.getId()).toString();
UriBuilder grant = uriInfo.getBaseUriBuilder();
grant.path(TokenManagement.class).path(TokenManagement.class, "accessTokenGrant");
String grantUrl = grant.build(realm.getId()).toString();
html.append("<html><body><h1> ").append(Messages.MESSAGES.realm()).append(": ").append(realm.getName()).append("</h1>");
html.append("<p>").append(Messages.MESSAGES.auth()).append(": ").append(authUri).append("</p>");
html.append("<p>").append(Messages.MESSAGES.code()).append(": ").append(codeUri).append("</p>");
html.append("<p>").append(Messages.MESSAGES.grant()).append(": ").append(grantUrl).append("</p>");
html.append("<p>").append(Messages.MESSAGES.publicKey()).append(": ").append(realm.getPublicKeyPem()).append("</p>");
html.append("</body></html>");
return html.toString();
}
@GET
@Path("realms")
@Produces("application/json")
public Response getRealmsByName(@QueryParam("name") String name)
{
if (name == null) return Response.noContent().build();
List<Realm> realms = identityManager.getRealmsByName(name);
if (realms.size() == 0) return Response.noContent().build();
List<PublishedRealmRepresentation> list = new ArrayList<PublishedRealmRepresentation>();
for (Realm realm : realms)
{
list.add(realmRep(realm, uriInfo));
}
GenericEntity<List<PublishedRealmRepresentation>> entity = new GenericEntity<List<PublishedRealmRepresentation>>(list){};
return Response.ok(entity).type(MediaType.APPLICATION_JSON_TYPE).build();
}
@GET
@Path("realms.html")
@Produces("text/html")
public String getRealmsByNameHtml(@QueryParam("name") String name)
{
if (name == null) return "<html><body><h1>"+Messages.MESSAGES.noRealmsWithThatName()+"</h1></body></html>";
List<Realm> realms = identityManager.getRealmsByName(name);
if (realms.size() == 0) return "<html><body><h1>"+Messages.MESSAGES.noRealmsWithThatName()+"</h1></body></html>";
if (realms.size() == 1) return realmHtml(realms.get(0));
StringBuffer html = new StringBuffer();
html.append("<html><body><h1>"+Messages.MESSAGES.realms()+"</h1>");
for (Realm realm : realms)
{
html.append("<p><a href=\"").append(uriInfo.getBaseUriBuilder().path("realms").path(realm.getId() + ".html"))
.append("\">").append(realm.getId()).append("</a></p>");
}
html.append("</body></html>");
return html.toString();
}
public static PublishedRealmRepresentation realmRep(Realm realm, UriInfo uriInfo)
{
PublishedRealmRepresentation rep = new PublishedRealmRepresentation();
rep.setRealm(realm.getName());
rep.setSelf(uriInfo.getRequestUri().toString());
rep.setPublicKeyPem(realm.getPublicKeyPem());
UriBuilder auth = uriInfo.getBaseUriBuilder();
auth.path(TokenManagement.class)
.path(TokenManagement.class, "requestAccessCode");
rep.setAuthorizationUrl(auth.build(realm.getId()).toString());
UriBuilder code = uriInfo.getBaseUriBuilder();
code.path(TokenManagement.class).path(TokenManagement.class, "accessRequest");
rep.setCodeUrl(code.build(realm.getId()).toString());
UriBuilder grant = uriInfo.getBaseUriBuilder();
grant.path(TokenManagement.class).path(TokenManagement.class, "accessTokenGrant");
String grantUrl = grant.build(realm.getId()).toString();
rep.setGrantUrl(grantUrl);
return rep;
}
}