]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
123ee7dcf90c2edca84558e8d9707f2ba1904866
[tmp/jakarta-migration.git] /
1 /**     \r
2  * AbstractMultiPartCollectionSpaceResourceImpl.java\r
3  *\r
4  * {Purpose of This Class}\r
5  *\r
6  * {Other Notes Relating to This Class (Optional)}\r
7  *\r
8  * $LastChangedBy: $\r
9  * $LastChangedRevision: $\r
10  * $LastChangedDate: $\r
11  *\r
12  * This document is a part of the source code and related artifacts\r
13  * for CollectionSpace, an open source collections management system\r
14  * for museums and related institutions:\r
15  *\r
16  * http://www.collectionspace.org\r
17  * http://wiki.collectionspace.org\r
18  *\r
19  * Copyright © 2009 {Contributing Institution}\r
20  *\r
21  * Licensed under the Educational Community License (ECL), Version 2.0.\r
22  * You may not use this file except in compliance with this License.\r
23  *\r
24  * You may obtain a copy of the ECL 2.0 License at\r
25  * https://source.collectionspace.org/collection-space/LICENSE.txt\r
26  */\r
27 package org.collectionspace.services.common;\r
28 \r
29 import javax.ws.rs.Consumes;\r
30 import javax.ws.rs.GET;\r
31 import javax.ws.rs.PUT;\r
32 import javax.ws.rs.Path;\r
33 import javax.ws.rs.PathParam;\r
34 import javax.ws.rs.Produces;\r
35 import javax.ws.rs.WebApplicationException;\r
36 import javax.ws.rs.core.Response;\r
37 \r
38 import org.collectionspace.services.client.PoxPayloadIn;\r
39 import org.collectionspace.services.client.PoxPayloadOut;\r
40 import org.collectionspace.services.client.workflow.WorkflowClient;\r
41 import org.collectionspace.services.common.api.Tools;\r
42 import org.collectionspace.services.common.context.MultipartServiceContext;\r
43 import org.collectionspace.services.common.context.MultipartServiceContextFactory;\r
44 import org.collectionspace.services.common.context.ServiceContext;\r
45 import org.collectionspace.services.common.context.ServiceContextFactory;\r
46 import org.collectionspace.services.common.document.DocumentHandler;\r
47 import org.collectionspace.services.common.document.DocumentNotFoundException;\r
48 import org.collectionspace.services.common.security.UnauthorizedException;\r
49 import org.collectionspace.services.common.workflow.service.nuxeo.WorkflowDocumentModelHandler;\r
50 import org.collectionspace.services.workflow.WorkflowCommon;\r
51 import org.jboss.resteasy.client.ClientResponse;\r
52 \r
53 import org.slf4j.Logger;\r
54 import org.slf4j.LoggerFactory;\r
55 \r
56 /**\r
57  * The Class AbstractMultiPartCollectionSpaceResourceImpl.\r
58  */\r
59 public abstract class AbstractMultiPartCollectionSpaceResourceImpl extends\r
60                 AbstractCollectionSpaceResourceImpl<PoxPayloadIn, PoxPayloadOut> {\r
61 \r
62     protected final Logger logger = LoggerFactory.getLogger(this.getClass());\r
63 \r
64     @Override\r
65     public ServiceContextFactory<PoxPayloadIn, PoxPayloadOut> getServiceContextFactory() {\r
66         return MultipartServiceContextFactory.get();\r
67     }\r
68 \r
69     protected WebApplicationException bigReThrow(Exception e, String serviceMsg)\r
70     throws WebApplicationException {\r
71         return bigReThrow(e, serviceMsg, "");\r
72     }\r
73 \r
74         protected WebApplicationException bigReThrow(Exception e,\r
75                         String serviceMsg, String csid) throws WebApplicationException {\r
76                 Response response;\r
77                 if (logger.isDebugEnabled()) {\r
78                         logger.debug(getClass().getName(), e);\r
79                 }\r
80                 if (e instanceof UnauthorizedException) {\r
81                         response = Response.status(Response.Status.UNAUTHORIZED)\r
82                                         .entity(serviceMsg + e.getMessage()).type("text/plain")\r
83                                         .build();\r
84                         return new WebApplicationException(response);\r
85                 } else if (e instanceof DocumentNotFoundException) {\r
86                         response = Response\r
87                                         .status(Response.Status.NOT_FOUND)\r
88                                         .entity(serviceMsg + " on " + getClass().getName()\r
89                                                         + " csid=" + csid).type("text/plain").build();\r
90                         return new WebApplicationException(response);\r
91                 } else if (e instanceof WebApplicationException) {\r
92                         //\r
93                         // subresource may have already thrown this exception\r
94                         // so just pass it on\r
95                         return (WebApplicationException)e;\r
96                 } else { // e is now instanceof Exception\r
97             String detail = Tools.errorToString(e, true);\r
98                         response = Response.status(Response.Status.INTERNAL_SERVER_ERROR)\r
99                                         .entity(serviceMsg+" detail: "+detail).type("text/plain").build();\r
100                         return new WebApplicationException(response);\r
101                 }\r
102         }\r
103     \r
104     @Override\r
105     public DocumentHandler createDocumentHandler(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) throws Exception {\r
106         return createDocumentHandler(ctx, ctx.getCommonPartLabel(), getCommonPartClass());\r
107     }\r
108     \r
109     /**\r
110      * Creates the document handler.\r
111      * \r
112      * @param serviceContext the service context\r
113      * @param schemaName the schema name\r
114      * @param commonClass the common class\r
115      * \r
116      * @return the document handler\r
117      * \r
118      * @throws Exception the exception\r
119      */\r
120     public DocumentHandler createDocumentHandler(ServiceContext<PoxPayloadIn, PoxPayloadOut> serviceContext,\r
121                 String schemaName, \r
122                 Class<?> commonClass) throws Exception {\r
123         DocumentHandler result = null;\r
124         \r
125         MultipartServiceContext ctx = (MultipartServiceContext)serviceContext;\r
126         Object commonPart = null;\r
127         if (ctx.getInput() != null) {\r
128                 commonPart = ctx.getInputPart(schemaName);\r
129         }\r
130         result = super.createDocumentHandler(ctx, commonPart);\r
131         \r
132         return result;\r
133     }\r
134     \r
135     /**\r
136      * Creates the document handler.\r
137      * \r
138      * @param ctx the ctx\r
139      * @param commonClass the common class\r
140      * \r
141      * @return the document handler\r
142      * \r
143      * @throws Exception the exception\r
144      */\r
145     public DocumentHandler createDocumentHandler(\r
146                 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,\r
147                 Class<Object> commonClass) throws Exception {\r
148         return createDocumentHandler(ctx, ctx.getCommonPartLabel(), commonClass);\r
149     }\r
150     \r
151     /**\r
152      * Creates the contact document handler.\r
153      * \r
154      * @param ctx the ctx\r
155      * @param inAuthority the in authority\r
156      * @param inItem the in item\r
157      * \r
158      * @return the document handler\r
159      * \r
160      * @throws Exception the exception\r
161      */\r
162     protected WorkflowDocumentModelHandler createWorkflowDocumentHandler(\r
163                 ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) throws Exception {\r
164         \r
165         WorkflowDocumentModelHandler docHandler = (WorkflowDocumentModelHandler)createDocumentHandler(ctx,\r
166                         WorkflowClient.SERVICE_COMMONPART_NAME,\r
167                         WorkflowCommon.class);          \r
168         \r
169         return docHandler;\r
170     }\r
171     \r
172     /*\r
173      * JAX-RS Annotated methods\r
174      */\r
175        \r
176     @GET\r
177     @Path("{csid}" + WorkflowClient.SERVICE_PATH)\r
178     public byte[] getWorkflow(\r
179             @PathParam("csid") String csid) {\r
180         PoxPayloadOut result = null;\r
181 \r
182         try {           \r
183             ServiceContext<PoxPayloadIn, PoxPayloadOut> parentCtx = createServiceContext();\r
184             String parentWorkspaceName = parentCtx.getRepositoryWorkspaceName();\r
185                 \r
186                 MultipartServiceContext ctx = (MultipartServiceContext) createServiceContext(WorkflowClient.SERVICE_NAME);\r
187                 WorkflowDocumentModelHandler handler = createWorkflowDocumentHandler(ctx);\r
188                 ctx.setRespositoryWorkspaceName(parentWorkspaceName); //find the document in the parent's workspace\r
189             getRepositoryClient(ctx).get(ctx, csid, handler);\r
190             result = ctx.getOutput();\r
191         } catch (Exception e) {\r
192             throw bigReThrow(e, ServiceMessages.READ_FAILED + WorkflowClient.SERVICE_PAYLOAD_NAME, csid);\r
193         }\r
194                 \r
195         return result.getBytes();\r
196     }\r
197     \r
198     @PUT\r
199     @Path("{csid}" + WorkflowClient.SERVICE_PATH)\r
200     public byte[] updateWorkflow(@PathParam("csid") String csid, String xmlPayload) {\r
201         PoxPayloadOut result = null;\r
202         try {\r
203                 ServiceContext<PoxPayloadIn, PoxPayloadOut> parentCtx = createServiceContext();\r
204                 String parentWorkspaceName = parentCtx.getRepositoryWorkspaceName();\r
205                 \r
206                 PoxPayloadIn workflowUpdate = new PoxPayloadIn(xmlPayload);\r
207                 MultipartServiceContext ctx = (MultipartServiceContext) createServiceContext(WorkflowClient.SERVICE_NAME, workflowUpdate);\r
208                 WorkflowDocumentModelHandler handler = createWorkflowDocumentHandler(ctx);\r
209                 ctx.setRespositoryWorkspaceName(parentWorkspaceName); //find the document in the parent's workspace\r
210                 getRepositoryClient(ctx).update(ctx, csid, handler);\r
211                 result = ctx.getOutput();\r
212         } catch (Exception e) {\r
213             throw bigReThrow(e, ServiceMessages.UPDATE_FAILED + WorkflowClient.SERVICE_PAYLOAD_NAME, csid);\r
214         }\r
215         return result.getBytes();\r
216     }    \r
217 }\r