package fi.otavanopisto.muikku.rest.meta;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import org.apache.commons.lang3.StringUtils;
import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.core.ResourceMethodRegistry;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import fi.otavanopisto.muikku.rest.AbstractRESTService;
import fi.otavanopisto.security.rest.RESTPermit;
import fi.otavanopisto.security.rest.RESTPermit.Handling;
@Path("/meta")
@Produces("application/json")
public class MetaRESTService extends AbstractRESTService {
private static final String ETAG = UUID.randomUUID().toString();
@Context
private Dispatcher dispatcher;
@GET
@Path("/resources")
@RESTPermit(handling = Handling.UNSECURED)
public Response getResources(@Context Request request, @QueryParam ("format") String format) {
EntityTag tag = new EntityTag(ETAG);
ResponseBuilder builder = request.evaluatePreconditions(tag);
if (builder != null) {
return builder.build();
}
List<String> resources = new ArrayList<>();
ResourceMethodRegistry registry = (ResourceMethodRegistry) dispatcher.getRegistry();
Set<Entry<String, java.util.List<org.jboss.resteasy.core.ResourceInvoker>>> entries = registry.getBounded().entrySet();
for (Entry<String, java.util.List<org.jboss.resteasy.core.ResourceInvoker>> entry : entries) {
String path = entry.getKey();
resources.add(path);
}
CacheControl cacheControl = new CacheControl();
cacheControl.setMaxAge(-1);
cacheControl.setPrivate(false);
cacheControl.setMustRevalidate(false);
Collections.sort(resources);
if (StringUtils.isNotBlank(format) && "js".equals(format)) {
try {
return Response
.ok(String.format("var META_RESOURCES = %s", new ObjectMapper().writeValueAsString(resources)), "text/javascript")
.cacheControl(cacheControl)
.tag(tag)
.build();
} catch (JsonProcessingException e) {
return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()).build();
}
} else {
return Response
.ok(resources)
.cacheControl(cacheControl)
.tag(tag)
.build();
}
}
}