package org.odata4j.producer.resources; import java.io.StringWriter; import javax.ws.rs.GET; 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.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.SecurityContext; import javax.ws.rs.core.UriInfo; import javax.ws.rs.ext.ContextResolver; import org.odata4j.core.ODataConstants; import org.odata4j.edm.EdmDataServices; import org.odata4j.exceptions.NotImplementedException; import org.odata4j.format.FormatType; import org.odata4j.format.xml.EdmxFormatWriter; import org.odata4j.producer.ODataProducer; import org.odata4j.producer.edm.MetadataProducer; @Path("{first: \\$}metadata") public class MetadataResource { private static final MediaType APPLICATION_ATOMSVC_XML_MEDIATYPE = MediaType.valueOf(ODataConstants.APPLICATION_ATOMSVC_XML); @GET @Produces({ ODataConstants.APPLICATION_XML_CHARSET_UTF8, ODataConstants.APPLICATION_ATOMSVC_XML_CHARSET_UTF8 }) public Response getMetadata( @Context HttpHeaders httpHeaders, @Context UriInfo uriInfo, @Context ContextResolver<ODataProducer> producerResolver, @QueryParam("$format") String format) { ODataProducer producer = producerResolver.getContext(ODataProducer.class); // a request for media type atomsvc+xml means give me the service document of the metadata producer if ("atomsvc".equals(format) || isAtomSvcRequest(httpHeaders)) { MetadataProducer metadataProducer = producer.getMetadataProducer(); if (metadataProducer == null) { throw newMetadataNotImplementedException(); } ServiceDocumentResource r = new ServiceDocumentResource(); return r.getServiceDocument(httpHeaders, uriInfo, producerResolver, FormatType.ATOM.name(), null); } else { StringWriter w = new StringWriter(); ODataProducer source = "metamodel".equals(format) ? producer.getMetadataProducer() : producer; if (source == null) { throw newMetadataNotImplementedException(); } EdmDataServices s = source.getMetadata(); EdmxFormatWriter.write(s, w); return Response.ok(w.toString(), ODataConstants.APPLICATION_XML_CHARSET_UTF8) .header(ODataConstants.Headers.DATA_SERVICE_VERSION, ODataConstants.DATA_SERVICE_VERSION_HEADER) .build(); } } private boolean isAtomSvcRequest(HttpHeaders h) { return h.getAcceptableMediaTypes().contains(APPLICATION_ATOMSVC_XML_MEDIATYPE); } @GET @Path("{entitySetName}") @Produces({ ODataConstants.APPLICATION_ATOM_XML_CHARSET_UTF8, ODataConstants.TEXT_JAVASCRIPT_CHARSET_UTF8, ODataConstants.APPLICATION_JAVASCRIPT_CHARSET_UTF8 }) public Response getMetadataEntities( @Context HttpHeaders httpHeaders, @Context UriInfo uriInfo, @Context ContextResolver<ODataProducer> producerResolver, @Context SecurityContext securityContext, @PathParam("entitySetName") String entitySetName, @PathParam("optionalId") String optionalId, @QueryParam("$inlinecount") String inlineCount, @QueryParam("$top") String top, @QueryParam("$skip") String skip, @QueryParam("$filter") String filter, @QueryParam("$orderby") String orderBy, @QueryParam("$format") String format, @QueryParam("$callback") String callback, @QueryParam("$skiptoken") String skipToken, @QueryParam("$expand") String expand, @QueryParam("$select") String select) throws Exception { ODataProducer producer = producerResolver.getContext(ODataProducer.class); MetadataProducer metadataProducer = producer.getMetadataProducer(); if (metadataProducer == null) { throw newMetadataNotImplementedException(); } EntitiesRequestResource r = new EntitiesRequestResource(); return r.getEntitiesImpl(httpHeaders, uriInfo, securityContext, metadataProducer, entitySetName, false, inlineCount, top, skip, filter, orderBy, format, callback, skipToken, expand, select); } @GET @Path("{entitySetName}{id: (\\(.+?\\))}") @Produces({ ODataConstants.APPLICATION_ATOM_XML_CHARSET_UTF8, ODataConstants.TEXT_JAVASCRIPT_CHARSET_UTF8, ODataConstants.APPLICATION_JAVASCRIPT_CHARSET_UTF8 }) public Response getMetadataEntity( @Context HttpHeaders httpHeaders, @Context UriInfo uriInfo, @Context ContextResolver<ODataProducer> producerResolver, @Context SecurityContext securityContext, @PathParam("entitySetName") String entitySetName, @PathParam("id") String id, @QueryParam("$format") String format, @QueryParam("$callback") String callback, @QueryParam("$expand") String expand, @QueryParam("$select") String select) { ODataProducer producer = producerResolver.getContext(ODataProducer.class); MetadataProducer metadataProducer = producer.getMetadataProducer(); if (metadataProducer == null) { throw newMetadataNotImplementedException(); } EntityRequestResource r = new EntityRequestResource(); return r.getEntityImpl(httpHeaders, uriInfo, securityContext, metadataProducer, entitySetName, id, format, callback, expand, select); } private static NotImplementedException newMetadataNotImplementedException() { return new NotImplementedException("Queryable metadata not implemented by this producer"); } }