Modified: incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/resource/SiteManagerRootResource.java URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/resource/SiteManagerRootResource.java?rev=1094648&r1=1094647&r2=1094648&view=diff ============================================================================== --- incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/resource/SiteManagerRootResource.java (original) +++ incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/resource/SiteManagerRootResource.java Mon Apr 18 16:57:23 2011 @@ -26,6 +26,8 @@ import static org.apache.clerezza.rdf.co import java.io.File; import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; import java.util.Set; import java.util.TreeSet; @@ -38,7 +40,6 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; -import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; @@ -50,7 +51,6 @@ import org.apache.clerezza.rdf.ontologie import org.apache.stanbol.commons.web.base.ContextHelper; import org.apache.stanbol.commons.web.base.resource.BaseStanbolResource; import org.apache.stanbol.entityhub.jersey.utils.JerseyUtils; -import org.apache.stanbol.entityhub.model.clerezza.RdfValueFactory; import org.apache.stanbol.entityhub.servicesapi.model.Sign; import org.apache.stanbol.entityhub.servicesapi.query.FieldQuery; import org.apache.stanbol.entityhub.servicesapi.site.ReferencedSiteManager; @@ -96,13 +96,15 @@ public class SiteManagerRootResource ext public Response getSitesPage() { return Response.ok(new Viewable("index", this), TEXT_HTML).build(); } - - @GET - @Path("/referenced") - @Produces(MediaType.TEXT_HTML) - public Response getReferencedSitesPage() { - return Response.ok(new Viewable("referenced", this), TEXT_HTML).build(); - } + +// removed to allow request with Accept headers other than text/html to return +// the JSON array +// @GET +// @Path("/referenced") +// @Produces(MediaType.TEXT_HTML) +// public Response getReferencedSitesPage() { +// return Response.ok(new Viewable("referenced", this), TEXT_HTML).build(); +// } /** * Getter for the id's of all referenced sites @@ -111,24 +113,25 @@ public class SiteManagerRootResource ext */ @GET @Path(value = "/referenced") - @Produces(MediaType.APPLICATION_JSON) - public JSONArray getReferencedSites(@Context UriInfo uriInfo) { - JSONArray referencedSites = new JSONArray(); - ReferencedSiteManager referencedSiteManager = ContextHelper.getServiceFromContext( - ReferencedSiteManager.class, context); - for (String site : referencedSiteManager.getReferencedSiteIds()) { - referencedSites.put(String.format("%sentityhub/site/%s/", uriInfo.getBaseUri(), site)); + @Produces({MediaType.APPLICATION_JSON,MediaType.TEXT_HTML}) + public Response getReferencedSites(@Context UriInfo uriInfo, + @Context HttpHeaders headers) { + MediaType acceptable = JerseyUtils.getAcceptableMediaType(headers, + Arrays.asList(MediaType.APPLICATION_JSON,MediaType.TEXT_HTML) , + MediaType.APPLICATION_JSON_TYPE); + if(MediaType.TEXT_HTML_TYPE.isCompatible(acceptable)){ + return Response.ok(new Viewable("referenced", this), TEXT_HTML).build(); + } else { + JSONArray referencedSites = new JSONArray(); + ReferencedSiteManager referencedSiteManager = ContextHelper.getServiceFromContext( + ReferencedSiteManager.class, context); + for (String site : referencedSiteManager.getReferencedSiteIds()) { + referencedSites.put(String.format("%sentityhub/site/%s/", uriInfo.getBaseUri(), site)); + } + return Response.ok(referencedSites,acceptable).build(); } - return referencedSites; } - @GET - @Path("/entity") - @Produces(MediaType.TEXT_HTML) - public Response getEntityPage() { - return Response.ok(new Viewable("entity", this), TEXT_HTML).build(); - } - /** * Cool URI handler for Signs. * @@ -144,9 +147,18 @@ public class SiteManagerRootResource ext log.debug("getSignById() request\n\t> id : {}\n\t> accept : {}\n\t> mediaType: {}", new Object[] {id, headers.getAcceptableMediaTypes(), headers.getMediaType()}); + Collection<String> supported = new HashSet<String>(JerseyUtils.SIGN_SUPPORTED_MEDIA_TYPES); + supported.add(TEXT_HTML); + final MediaType acceptedMediaType = JerseyUtils.getAcceptableMediaType( + headers, supported, MediaType.APPLICATION_JSON_TYPE); if (id == null || id.isEmpty()) { - log.error("getSignById() No or emptpy ID was parsed as query parameter (id={})", id); - throw new WebApplicationException(Status.BAD_REQUEST); + if(MediaType.TEXT_HTML_TYPE.isCompatible(acceptedMediaType)){ + return Response.ok(new Viewable("entity", this), TEXT_HTML).build(); + } else { + return Response.status(Status.BAD_REQUEST) + .entity("No or empty ID was parsed. Missing parameter id.\n") + .header(HttpHeaders.ACCEPT, acceptedMediaType).build(); + } } ReferencedSiteManager referencedSiteManager = ContextHelper.getServiceFromContext( ReferencedSiteManager.class, context); @@ -157,24 +169,24 @@ public class SiteManagerRootResource ext // log.error("IOException while accessing ReferencedSiteManager",e); // throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR); // } - final MediaType acceptedMediaType = JerseyUtils - .getAcceptableMediaType(headers, MediaType.APPLICATION_JSON_TYPE); if (sign != null) { return Response.ok(sign, acceptedMediaType).build(); } else { // TODO: How to parse an ErrorMessage? // create an Response with the the Error? log.info("getSignById() entity {} not found on any referenced site"); - throw new WebApplicationException(Status.NOT_FOUND); + return Response.status(Status.NOT_FOUND) + .entity("Entity with ID '"+id+"' not found an any referenced site\n") + .header(HttpHeaders.ACCEPT, acceptedMediaType).build(); } } - @GET - @Path("/find") - @Produces(MediaType.TEXT_HTML) - public Response getFindPage() { - return Response.ok(new Viewable("find", this), TEXT_HTML).build(); - } +// @GET +// @Path("/find") +// @Produces(MediaType.TEXT_HTML) +// public Response getFindPage() { +// return Response.ok(new Viewable("find", this), TEXT_HTML).build(); +// } @GET @Path("/find") @@ -198,6 +210,19 @@ public class SiteManagerRootResource ext @FormParam(value = "offset") Integer offset, @Context HttpHeaders headers) { log.debug("findEntity() Request"); + Collection<String> supported = new HashSet<String>(JerseyUtils.SIGN_SUPPORTED_MEDIA_TYPES); + supported.add(TEXT_HTML); + final MediaType acceptedMediaType = JerseyUtils.getAcceptableMediaType( + headers, supported, MediaType.APPLICATION_JSON_TYPE); + if(name == null || name.isEmpty()){ + if(MediaType.TEXT_HTML_TYPE.isCompatible(acceptedMediaType)){ + return Response.ok(new Viewable("find", this), TEXT_HTML).build(); + } else { + return Response.status(Status.BAD_REQUEST) + .entity("The name must not be null nor empty for find requests. Missing parameter name.\n") + .header(HttpHeaders.ACCEPT, acceptedMediaType).build(); + } + } if (field == null) { field = DEFAULT_FIND_FIELD; } else { @@ -210,17 +235,15 @@ public class SiteManagerRootResource ext ReferencedSiteManager.class, context); FieldQuery query = JerseyUtils.createFieldQueryForFindRequest(name, field, language, limit == null || limit < 1 ? DEFAULT_FIND_RESULT_LIMIT : limit, offset); - final MediaType acceptedMediaType = JerseyUtils - .getAcceptableMediaType(headers, MediaType.APPLICATION_JSON_TYPE); return Response.ok(referencedSiteManager.find(query), acceptedMediaType).build(); } - @GET - @Path("/query") - @Produces(MediaType.TEXT_HTML) - public Response getQueryPage() { - return Response.ok(new Viewable("query", this), TEXT_HTML).build(); - } +// @GET +// @Path("/query") +// @Produces(MediaType.TEXT_HTML) +// public Response getQueryPage() { +// return Response.ok(new Viewable("query", this), TEXT_HTML).build(); +// } /** * Allows to parse any kind of {@link FieldQuery} in its JSON Representation. Note that the maximum number @@ -249,9 +272,20 @@ public class SiteManagerRootResource ext @Context HttpHeaders headers) { ReferencedSiteManager referencedSiteManager = ContextHelper.getServiceFromContext( ReferencedSiteManager.class, context); + Collection<String> supported = new HashSet<String>(JerseyUtils.SIGN_SUPPORTED_MEDIA_TYPES); + supported.add(TEXT_HTML); + final MediaType acceptedMediaType = JerseyUtils.getAcceptableMediaType( + headers, supported, MediaType.APPLICATION_JSON_TYPE); + if(queryString == null || queryString.isEmpty()){ + if(MediaType.TEXT_HTML_TYPE.isCompatible(acceptedMediaType)){ + return Response.ok(new Viewable("query", this), TEXT_HTML).build(); + } else { + return Response.status(Status.BAD_REQUEST) + .entity("The query must not be null nor empty for query requests. Missing parameter query.\n") + .header(HttpHeaders.ACCEPT, acceptedMediaType).build(); + } + } FieldQuery query = JerseyUtils.parseFieldQuery(queryString, file); - final MediaType acceptedMediaType = JerseyUtils.getAcceptableMediaType(headers, - MediaType.APPLICATION_JSON_TYPE); return Response.ok(referencedSiteManager.find(query), acceptedMediaType).build(); }
Modified: incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/utils/JerseyUtils.java URL: http://svn.apache.org/viewvc/incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/utils/JerseyUtils.java?rev=1094648&r1=1094647&r2=1094648&view=diff ============================================================================== --- incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/utils/JerseyUtils.java (original) +++ incubator/stanbol/trunk/entityhub/jersey/src/main/java/org/apache/stanbol/entityhub/jersey/utils/JerseyUtils.java Mon Apr 18 16:57:23 2011 @@ -16,10 +16,22 @@ */ package org.apache.stanbol.entityhub.jersey.utils; +import static javax.ws.rs.core.MediaType.APPLICATION_JSON; +import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.N3; +import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.N_TRIPLE; +import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.RDF_JSON; +import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.RDF_XML; +import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.TURTLE; +import static org.apache.clerezza.rdf.core.serializedform.SupportedFormat.X_TURTLE; + import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import javax.servlet.ServletContext; import javax.ws.rs.WebApplicationException; @@ -36,6 +48,7 @@ import org.apache.stanbol.entityhub.mode import org.apache.stanbol.entityhub.model.clerezza.RdfValueFactory; import org.apache.stanbol.entityhub.servicesapi.defaults.NamespaceEnum; import org.apache.stanbol.entityhub.servicesapi.model.Representation; +import org.apache.stanbol.entityhub.servicesapi.model.Sign; import org.apache.stanbol.entityhub.servicesapi.query.FieldQuery; import org.apache.stanbol.entityhub.servicesapi.query.FieldQueryFactory; import org.apache.stanbol.entityhub.servicesapi.query.TextConstraint; @@ -56,6 +69,17 @@ import org.slf4j.LoggerFactory; public final class JerseyUtils { private static Logger log = LoggerFactory.getLogger(JerseyUtils.class); + /** + * Unmodifiable Set with the Media Types supported for {@link Representation} + */ + public static final Set<String> REPRESENTATION_SUPPORTED_MEDIA_TYPES = + Collections.unmodifiableSet(new HashSet<String>(Arrays.asList( + APPLICATION_JSON,RDF_XML,N3,TURTLE,X_TURTLE,RDF_JSON,N_TRIPLE))); + /** + * Unmodifiable Set with the Media Types supported for {@link Sign} + */ + public static final Set<String> SIGN_SUPPORTED_MEDIA_TYPES = + REPRESENTATION_SUPPORTED_MEDIA_TYPES; /** * This utility class used the {@link DefaultQueryFactory} as @@ -91,6 +115,31 @@ public final class JerseyUtils { return acceptedMediaType; } /** + * Checks the parsed MediaTypes for supported types. WildCards are not + * supported by this method. If no supported is found the defaultType + * is returned + * @param headers the headers of the request + * @param supported the supported types + * @param defaultType the default type used of no match is found + * @return the first supported media type part of the header or the default + * type + */ + public static MediaType getAcceptableMediaType(HttpHeaders headers, Collection<String> supported,MediaType defaultType) { + MediaType acceptedMediaType = null; + if (!headers.getAcceptableMediaTypes().isEmpty()) { + for (MediaType accepted : headers.getAcceptableMediaTypes()) { + if (!accepted.isWildcardType() && supported.contains(accepted.getType()+'/'+accepted.getSubtype())) { + acceptedMediaType = accepted; + break; + } + } + } + if (acceptedMediaType == null) { + acceptedMediaType = defaultType; + } + return acceptedMediaType; + } + /** * Returns the {@link FieldQuery} based on the JSON formatted String (in case * of "application/x-www-form-urlencoded" requests) or file (in case of * "multipart/form-data" requests).<p>
