source: VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/rest/VirtualCollectionFormSubmissionResource.java @ 5465

Last change on this file since 5465 was 5465, checked in by Twan Goosen, 10 years ago

Added support for keywords to the submission REST resource

  • Property svn:eol-style set to native
File size: 6.5 KB
Line 
1package eu.clarin.cmdi.virtualcollectionregistry.rest;
2
3import com.sun.jersey.api.core.InjectParam;
4import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistry;
5import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryException;
6import eu.clarin.cmdi.virtualcollectionregistry.VirtualCollectionRegistryUsageException;
7import eu.clarin.cmdi.virtualcollectionregistry.model.GeneratedBy;
8import eu.clarin.cmdi.virtualcollectionregistry.model.GeneratedByQuery;
9import eu.clarin.cmdi.virtualcollectionregistry.model.Resource;
10import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection;
11import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.Purpose;
12import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.Reproducibility;
13import eu.clarin.cmdi.virtualcollectionregistry.model.VirtualCollection.Type;
14import java.net.URI;
15import java.security.Principal;
16import java.util.Date;
17import java.util.List;
18import javax.ws.rs.Consumes;
19import javax.ws.rs.DefaultValue;
20import javax.ws.rs.FormParam;
21import javax.ws.rs.POST;
22import javax.ws.rs.Path;
23import javax.ws.rs.Produces;
24import javax.ws.rs.core.Context;
25import javax.ws.rs.core.MediaType;
26import javax.ws.rs.core.Response;
27import javax.ws.rs.core.SecurityContext;
28import javax.ws.rs.core.UriInfo;
29
30/**
31 *
32 * @author twagoo
33 */
34@Path("/submit")
35public class VirtualCollectionFormSubmissionResource {
36
37    @InjectParam
38    private VirtualCollectionRegistry registry;
39    @Context
40    private SecurityContext security;
41    @Context
42    private UriInfo uriInfo;
43
44    @POST
45    @Consumes({MediaType.APPLICATION_FORM_URLENCODED})
46    @Produces({MediaType.TEXT_HTML})
47    public Response submitNewVc(
48            @FormParam("type") @DefaultValue("EXTENSIONAL") Type type,
49            @FormParam("name") String name,
50            @FormParam("metadataUri") List<String> metadataUris,
51            @FormParam("resourceUri") List<String> resourceUris,
52            @FormParam("description") String description,
53            //optional params
54            @FormParam("keyword") List<String> keyword,
55            @FormParam("purpose") Purpose purpose,
56            @FormParam("reproducibility") Reproducibility reproducibility,
57            @FormParam("reproducibilityNotice") String reproducibilityNotice,
58            @FormParam("creationDate") Date creationDate,
59            @FormParam("queryDescription") String intensionalDescription,
60            @FormParam("queryUri") String intensionalUri,
61            @FormParam("queryProfile") String intensionalQueryProfile,
62            @FormParam("queryValue") String intensionalQueryValue
63    ) {
64        final Principal principal = security.getUserPrincipal();
65        if (principal == null) {
66            /*
67             * should never happen, because servlet container should supply a
68             * valid principal
69             */
70            throw new AssertionError("principal == null");
71        }
72
73        try {
74            // construct a proto-VC from the form parameters
75            final VirtualCollection vc = constructVirtualCollection(type, name,
76                    metadataUris, resourceUris, description, keyword, purpose,
77                    reproducibility, reproducibilityNotice, creationDate,
78                    intensionalDescription, intensionalUri, intensionalQueryProfile, intensionalQueryValue);
79
80            // create the VC in the registry (persist)
81            long id = registry.createVirtualCollection(principal, vc);
82
83            // respond with redirect to editor
84            final URI uri = uriInfo.getBaseUriBuilder()
85                    .path("../app/edit/{arg1}")
86                    .build(id);
87            return Response.seeOther(uri).build();
88        } catch (VirtualCollectionRegistryException ex) {
89            //TODO: wrap in friendly HTML page
90            final Response.Status response = Response.Status.BAD_REQUEST;
91            final String error = String.format("<html>\n<body>\n<h1>%d %s</h1>\nCould not create virtual collection. Reason: %s\n</body>\n</html>\n", response.getStatusCode(), response.toString(), ex.getMessage());
92            return Response.status(response).entity(error).build();
93        }
94    }
95
96    private VirtualCollection constructVirtualCollection(Type type, String name,
97            List<String> metadataUris, List<String> resourceUris, String description,
98            List<String> keywords, Purpose purpose, Reproducibility reproducibility,
99            String reproducibilityNotice, Date creationDate, String intensionalDescription,
100            String intensionalUri, String intensionalQueryProfile, String intensionalQueryValue) throws VirtualCollectionRegistryException {
101        final VirtualCollection vc = new VirtualCollection();
102
103        if (type == null) {
104            throw new VirtualCollectionRegistryUsageException("No type specified for collection");
105        }
106        if (name == null) {
107            throw new VirtualCollectionRegistryUsageException("No name specified for collection");
108
109        }
110
111        vc.setType(type);
112        vc.setName(name);
113
114        // add resources: type metadata
115        for (String uri : metadataUris) {
116            vc.getResources().add(new Resource(Resource.Type.METADATA, uri));
117        }
118        // add resources: type resource
119        for (String uri : resourceUris) {
120            vc.getResources().add(new Resource(Resource.Type.RESOURCE, uri));
121        }
122        // set optional values
123        for (String keyword : keywords) {
124            final String trimmed = keyword.trim();
125            if (!trimmed.isEmpty()) {
126                vc.getKeywords().add(keyword);
127            }
128        }
129        if (description != null) {
130            vc.setDescription(description);
131        }
132        if (purpose != null) {
133            vc.setPurpose(purpose);
134        }
135        if (reproducibility != null) {
136            vc.setReproducibility(reproducibility);
137        }
138        if (reproducibilityNotice != null) {
139            vc.setReproducibilityNotice(reproducibilityNotice);
140        }
141        if (creationDate == null) {
142            vc.setCreationDate(new Date());
143        } else {
144            vc.setCreationDate(creationDate);
145        }
146
147        if (intensionalDescription != null || intensionalQueryProfile != null || intensionalQueryValue != null || intensionalUri != null) {
148            final GeneratedBy generatedBy = new GeneratedBy();
149            generatedBy.setDescription(intensionalDescription);
150            generatedBy.setQuery(new GeneratedByQuery(intensionalQueryProfile, intensionalQueryValue));
151            generatedBy.setURI(intensionalUri);
152            vc.setGeneratedBy(generatedBy);
153        }
154        return vc;
155    }
156
157}
Note: See TracBrowser for help on using the repository browser.