source: VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/rest/VirtualCollectionRegistryRestService.java @ 190

Last change on this file since 190 was 190, checked in by oschonef, 14 years ago
  • append SNAPSHOT to product version
  • rename package *.vcrql to *.query
  • further work on search/query
  • Property svn:eol-style set to native
File size: 9.1 KB
Line 
1package eu.clarin.cmdi.virtualcollectionregistry.rest;
2
3import java.io.IOException;
4import java.io.InputStream;
5import java.io.OutputStream;
6import java.net.URI;
7import java.security.Principal;
8
9import javax.persistence.EntityManager;
10import javax.persistence.Query;
11import javax.ws.rs.Consumes;
12import javax.ws.rs.DELETE;
13import javax.ws.rs.DefaultValue;
14import javax.ws.rs.GET;
15import javax.ws.rs.POST;
16import javax.ws.rs.PUT;
17import javax.ws.rs.Path;
18import javax.ws.rs.PathParam;
19import javax.ws.rs.Produces;
20import javax.ws.rs.QueryParam;
21import javax.ws.rs.WebApplicationException;
22import javax.ws.rs.core.Context;
23import javax.ws.rs.core.HttpHeaders;
24import javax.ws.rs.core.MediaType;
25import javax.ws.rs.core.Response;
26import javax.ws.rs.core.SecurityContext;
27import javax.ws.rs.core.StreamingOutput;
28import javax.ws.rs.core.UriInfo;
29
30import eu.clarin.cmdi.virtualcollectionregistry.DataStore;
31import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistry;
32import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryException;
33import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryMarshaller.Format;
34import eu.clarin.cmdi.virtualcollectionregistry.model.ClarinVirtualCollection;
35import eu.clarin.cmdi.virtualcollectionregistry.model.Handle;
36import eu.clarin.cmdi.virtualcollectionregistry.model.ResourceMetadata;
37import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
38import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollectionList;
39import eu.clarin.cmdi.virtualcollectionregistry.query.Search;
40
41@Path("/")
42public class VirtualCollectionRegistryRestService {
43        private VirtualCollectionRegistry registry =
44                VirtualCollectionRegistry.instance();
45        @Context
46        SecurityContext security;
47        @Context
48        UriInfo uriInfo;
49        @Context
50        HttpHeaders headers;
51
52        @POST
53        @Path("/virtualcollection")
54        @Consumes({ MediaType.TEXT_XML,
55                                MediaType.TEXT_XML,
56                                MediaType.APPLICATION_JSON })
57        public Response createVirtualCollection(InputStream input)
58                        throws VirtualCollectionRegistryException {
59                Principal principal = security.getUserPrincipal();
60                if (principal == null) {
61                        throw new IllegalArgumentException("princial == null");
62                }
63                try {
64                        Format format = getInputFormat();
65                        String encoding = getInputEncoding();
66                        VirtualCollection vc = registry.getMarshaller()
67                                .unmarshal(input, format, encoding);
68                        long id = registry.createVirtualCollection(principal, vc);
69                        RestResponse response = new RestResponse();
70                        response.setIsSuccess(true);
71                        response.setInfo("created");
72                        response.setId(id);
73                        URI uri = uriInfo.getRequestUriBuilder().path(Long.toString(id))
74                                        .build();
75                        return Response.created(uri).entity(response).build();
76                } catch (Exception e) {
77                        throw new VirtualCollectionRegistryException("create", e);
78                }
79        }
80
81        @GET
82        @Path("/virtualcollection/{id}")
83        @Produces({ MediaType.TEXT_XML,
84                                MediaType.APPLICATION_XML,
85                                MediaType.APPLICATION_JSON })
86        public Response getVirtualCollection(@PathParam("id") long id)
87                        throws VirtualCollectionRegistryException {
88                final VirtualCollection vc = registry.retrieveVirtualCollection(id);
89                StreamingOutput writer = new StreamingOutput() {
90                        public void write(OutputStream stream) throws IOException,
91                                        WebApplicationException {
92                                Format format = getOutputFormat();
93                                registry.getMarshaller().marshal(stream, format, vc);
94                        }
95                };
96                return Response.ok(writer).build();
97        }
98
99        @PUT
100        @Path("/virtualcollection/{id}")
101        @Produces({ MediaType.TEXT_XML, MediaType.APPLICATION_XML })
102        public Response updateVirtualCollection(@PathParam("id") long id,
103                        VirtualCollection vc) throws VirtualCollectionRegistryException {
104                Principal principal = security.getUserPrincipal();
105                if (principal == null) {
106                        throw new IllegalArgumentException("princial == null");
107                }
108                registry.updateVirtualCollection(principal, id, vc);
109                RestResponse response = new RestResponse();
110                response.setIsSuccess(true);
111                response.setInfo("updated");
112                response.setId(id);
113                return Response.ok(response).build();
114        }
115
116        @DELETE
117        @Path("/virtualcollection/{id}")
118        @Produces({ MediaType.TEXT_XML, MediaType.APPLICATION_XML })
119        public Response deleteVirtualCollection(@PathParam("id") long id)
120                        throws VirtualCollectionRegistryException {
121                Principal principal = security.getUserPrincipal();
122                if (principal == null) {
123                        throw new IllegalArgumentException("princial == null");
124                }
125                registry.deleteVirtualCollection(principal, id);
126                RestResponse response = new RestResponse();
127                response.setIsSuccess(true);
128                response.setInfo("deleted");
129                response.setId(id);
130                return Response.ok(response).build();
131        }
132
133        @GET
134        @Path("/virtualcollections")
135        @Produces({ MediaType.TEXT_XML,
136                                MediaType.APPLICATION_XML,
137                                MediaType.APPLICATION_JSON })
138        public Response getVirtualCollections(@QueryParam("q") String query,
139                        @DefaultValue("0") @QueryParam("offset") int offset,
140                        @DefaultValue("-1") @QueryParam("count") int count)
141                        throws VirtualCollectionRegistryException {
142                if ( query != null ) {
143                        Search.doSearch(query);
144                }
145                final VirtualCollectionList vcs =
146                        registry.getVirtualCollections((offset > 0) ? offset : 0, count);
147                StreamingOutput writer = new StreamingOutput() {
148                        public void write(OutputStream stream) throws IOException,
149                                        WebApplicationException {
150                                Format format = getOutputFormat();
151                                registry.getMarshaller().marshal(stream, format, vcs);
152                        }
153                };
154                return Response.ok(writer).build();
155        }
156
157        @GET
158        @Path("/my-virtualcollections")
159        @Produces({ MediaType.TEXT_XML,
160                                MediaType.APPLICATION_XML,
161                                MediaType.APPLICATION_JSON })
162        public Response getMyVirtualCollections(
163                        @DefaultValue("0") @QueryParam("offset") int offset,
164                        @DefaultValue("-1") @QueryParam("count") int count)
165                        throws VirtualCollectionRegistryException {
166                Principal principal = security.getUserPrincipal();
167                if (principal == null) {
168                        throw new IllegalArgumentException("princial == null");
169                }
170                final VirtualCollectionList vcs =
171                                registry.getVirtualCollections(principal,
172                                                (offset > 0) ? offset : 0, count);
173                StreamingOutput writer = new StreamingOutput() {
174                        public void write(OutputStream stream) throws IOException,
175                                        WebApplicationException {
176                                Format format = getOutputFormat();
177                                registry.getMarshaller().marshal(stream, format, vcs);
178                        }
179                };
180                return Response.ok(writer).build();
181        }
182       
183        @GET
184        @Path("/clarin-virtualcollection/{id}")
185        @Produces({ MediaType.TEXT_XML, MediaType.APPLICATION_XML })
186        public Response getClarinVirtualCollection(
187                        @PathParam("id") long id) throws VirtualCollectionRegistryException {
188                VirtualCollection vc = registry.retrieveVirtualCollection(id);
189                URI handleBaseUri = uriInfo.getBaseUriBuilder().path("handle").build(); 
190                final ClarinVirtualCollection cvc =
191                        new ClarinVirtualCollection(vc, handleBaseUri);
192                StreamingOutput writer = new StreamingOutput() {
193                        public void write(OutputStream output) throws IOException,
194                                        WebApplicationException {
195                                registry.getMarshaller().marshal(output, Format.XML, cvc);
196                        }
197                };
198                return Response.ok(writer).build();
199        }
200
201        @GET
202        @Path("/clarin-metadata/{id}")
203        @Produces({ MediaType.TEXT_XML, MediaType.APPLICATION_XML })
204        public Response getClarinMetadata(@PathParam("id") long id)
205                        throws VirtualCollectionRegistryException {
206                System.err.println("Metadata!");
207                ResourceMetadata md = registry.retrieveMetadataResource(id);
208                return Response.ok(md).build();
209        }
210
211        @GET
212        @Path("/handle/{pid}")
213        public Response getHandle(@PathParam("pid") String pid) {
214                System.err.println("Pid: " + pid);
215                EntityManager em = DataStore.instance().getEntityManager();
216                try {
217                        em.getTransaction().begin();
218                        Query q = em.createNamedQuery("Handle.findByPid");
219                        q.setParameter("pid", pid);
220                        Handle handle = (Handle) q.getSingleResult();
221                        System.err.println("handle: " + handle.getType());
222                        URI target;
223                        switch (handle.getType()) {
224                        case COLLECTION:
225                                target = uriInfo.getBaseUriBuilder().path(
226                                                "clarin-virtualcollection/" + handle.getTarget()).build();
227                                break;
228                        case METADATA:
229                                target = uriInfo.getBaseUriBuilder().path(
230                                                "clarin-metadata/" + handle.getTarget()).build();
231                                break;
232                        default:
233                                throw new VirtualCollectionRegistryException("internel error");
234                        } // switch
235                        return Response.seeOther(target).build();
236                } catch (Exception e) {
237                        throw new WebApplicationException(e);
238                } finally {
239                        em.getTransaction().commit();
240                }
241        }
242
243        private Format getInputFormat() {
244                Format format = getMediaType(headers.getMediaType());
245                return (format != null) ? format : Format.UNSUPPORTED;
246        }
247
248        private String getInputEncoding() {
249                String encoding =
250                        headers.getMediaType().getParameters().get("encoding");
251                return (encoding != null) ? encoding : "utf-8";
252        }
253
254        private Format getOutputFormat() {
255                for (MediaType type : headers.getAcceptableMediaTypes()) {
256                        Format format = getMediaType(type);
257                        if (format != null) {
258                                return format;
259                        }
260                }
261                return Format.UNSUPPORTED;
262        }
263
264        private static Format getMediaType(MediaType type) {
265                if (type.isCompatible(MediaType.APPLICATION_XML_TYPE)
266                                || type.isCompatible(MediaType.TEXT_XML_TYPE)) {
267                        return Format.XML;
268                }
269                if (type.isCompatible(MediaType.APPLICATION_JSON_TYPE)) {
270                        return Format.JSON;
271                }
272                return null;
273        }
274
275} // class VirtualCollectionRegistryRestService
Note: See TracBrowser for help on using the repository browser.