]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
9334399d1822f987e0ffcc6072579a736de69e89
[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 java.util.Iterator;\r
30 import java.util.List;\r
31 \r
32 import javax.ws.rs.Consumes;\r
33 import javax.ws.rs.GET;\r
34 import javax.ws.rs.PUT;\r
35 import javax.ws.rs.Path;\r
36 import javax.ws.rs.PathParam;\r
37 import javax.ws.rs.Produces;\r
38 import javax.ws.rs.WebApplicationException;\r
39 import javax.ws.rs.core.Response;\r
40 \r
41 import org.collectionspace.services.client.PayloadOutputPart;\r
42 import org.collectionspace.services.client.PoxPayloadIn;\r
43 import org.collectionspace.services.client.PoxPayloadOut;\r
44 import org.collectionspace.services.client.workflow.WorkflowClient;\r
45 import org.collectionspace.services.common.api.Tools;\r
46 import org.collectionspace.services.common.context.MultipartServiceContext;\r
47 import org.collectionspace.services.common.context.MultipartServiceContextFactory;\r
48 import org.collectionspace.services.common.context.ServiceContext;\r
49 import org.collectionspace.services.common.context.ServiceContextFactory;\r
50 import org.collectionspace.services.common.document.DocumentHandler;\r
51 import org.collectionspace.services.common.workflow.service.nuxeo.WorkflowDocumentModelHandler;\r
52 import org.collectionspace.services.lifecycle.Lifecycle;\r
53 import org.collectionspace.services.lifecycle.TransitionDef;\r
54 import org.collectionspace.services.lifecycle.TransitionDefList;\r
55 import org.collectionspace.services.workflow.WorkflowCommon;\r
56 import org.dom4j.DocumentException;\r
57 import org.jboss.resteasy.client.ClientResponse;\r
58 \r
59 import org.slf4j.Logger;\r
60 import org.slf4j.LoggerFactory;\r
61 \r
62 /**\r
63  * The Class AbstractMultiPartCollectionSpaceResourceImpl.\r
64  */\r
65 public abstract class AbstractMultiPartCollectionSpaceResourceImpl extends AbstractCollectionSpaceResourceImpl<PoxPayloadIn, PoxPayloadOut> {\r
66 \r
67     protected final Logger logger = LoggerFactory.getLogger(this.getClass());\r
68 \r
69     @Override\r
70     public ServiceContextFactory<PoxPayloadIn, PoxPayloadOut> getServiceContextFactory() {\r
71         return MultipartServiceContextFactory.get();\r
72     }\r
73 \r
74     @Override\r
75     public DocumentHandler createDocumentHandler(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) throws Exception {\r
76         return createDocumentHandler(ctx, ctx.getCommonPartLabel(), getCommonPartClass());\r
77     }\r
78 \r
79     /**\r
80      * Creates the document handler.\r
81      * \r
82      * @param serviceContext the service context\r
83      * @param schemaName the schema name\r
84      * @param commonClass the common class\r
85      * \r
86      * @return the document handler\r
87      * \r
88      * @throws Exception the exception\r
89      */\r
90     public DocumentHandler createDocumentHandler(ServiceContext<PoxPayloadIn, PoxPayloadOut> serviceContext,\r
91             String schemaName,\r
92             Class<?> commonClass) throws Exception {\r
93         DocumentHandler result = null;\r
94 \r
95         MultipartServiceContext ctx = (MultipartServiceContext) serviceContext;\r
96         Object commonPart = null;\r
97         if (ctx.getInput() != null) {\r
98             commonPart = ctx.getInputPart(schemaName);\r
99         }\r
100         result = super.createDocumentHandler(ctx, commonPart);\r
101 \r
102         return result;\r
103     }\r
104 \r
105     /**\r
106      * Creates the document handler.\r
107      * \r
108      * @param ctx the ctx\r
109      * @param commonClass the common class\r
110      * \r
111      * @return the document handler\r
112      * \r
113      * @throws Exception the exception\r
114      */\r
115     public DocumentHandler createDocumentHandler(\r
116             ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,\r
117             Class<Object> commonClass) throws Exception {\r
118         return createDocumentHandler(ctx, ctx.getCommonPartLabel(), commonClass);\r
119     }\r
120 \r
121     /**\r
122      * Creates the contact document handler.\r
123      * \r
124      * @param ctx the ctx\r
125      * @param inAuthority the in authority\r
126      * @param inItem the in item\r
127      * \r
128      * @return the document handler\r
129      * \r
130      * @throws Exception the exception\r
131      */\r
132     protected WorkflowDocumentModelHandler createWorkflowDocumentHandler(\r
133             ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) throws Exception {\r
134 \r
135         WorkflowDocumentModelHandler docHandler = (WorkflowDocumentModelHandler) createDocumentHandler(ctx,\r
136                 WorkflowClient.SERVICE_COMMONPART_NAME,\r
137                 WorkflowCommon.class);\r
138 \r
139         return docHandler;\r
140     }\r
141 \r
142     /*\r
143      * JAX-RS Annotated methods\r
144      */\r
145     @GET\r
146     @Path(WorkflowClient.SERVICE_PATH)\r
147     public Lifecycle getWorkflow() {\r
148         Lifecycle result;\r
149 \r
150         String documentType = "undefined";\r
151         MultipartServiceContext ctx = null;\r
152         try {\r
153             ctx = (MultipartServiceContext) createServiceContext();\r
154             DocumentHandler handler = ctx.getDocumentHandler();\r
155             result = handler.getLifecycle();\r
156         } catch (Exception e) {\r
157             throw bigReThrow(e, ServiceMessages.READ_FAILED + WorkflowClient.SERVICE_PAYLOAD_NAME, ctx.getDocumentType());\r
158         }\r
159 \r
160         if (result == null) {\r
161                 result = new Lifecycle();\r
162                 result.setName("No life cycle defined for:" + documentType);\r
163         }\r
164         \r
165         return result;\r
166     }\r
167     \r
168     /*\r
169      * JAX-RS Annotated methods\r
170      */\r
171     \r
172     /*\r
173      * We should change this method.  The RepositoryClient (from call to getRepositoryClient) should support a call getWorkflowTransition() instead.\r
174      */    \r
175     @GET\r
176     @Path("{csid}" + WorkflowClient.SERVICE_PATH)\r
177     public byte[] getWorkflow(\r
178             @PathParam("csid") String csid) {\r
179         PoxPayloadOut result = null;\r
180 \r
181         try {\r
182             ServiceContext<PoxPayloadIn, PoxPayloadOut> parentCtx = createServiceContext();\r
183             String parentWorkspaceName = parentCtx.getRepositoryWorkspaceName();\r
184 \r
185             MultipartServiceContext ctx = (MultipartServiceContext) createServiceContext(WorkflowClient.SERVICE_NAME);\r
186             WorkflowDocumentModelHandler handler = createWorkflowDocumentHandler(ctx);\r
187             ctx.setRespositoryWorkspaceName(parentWorkspaceName); //find the document in the parent's workspace\r
188             getRepositoryClient(ctx).get(ctx, csid, handler);\r
189             result = ctx.getOutput();\r
190         } catch (Exception e) {\r
191             throw bigReThrow(e, ServiceMessages.READ_FAILED + WorkflowClient.SERVICE_PAYLOAD_NAME, csid);\r
192         }\r
193 \r
194         return result.getBytes();\r
195     }\r
196     \r
197     protected TransitionDef getTransitionDef(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx, String transition) {\r
198         TransitionDef result = null;\r
199         \r
200         try {\r
201                         Lifecycle lifecycle = ctx.getDocumentHandler().getLifecycle();\r
202                         List<TransitionDef> transitionDefList = lifecycle.getTransitionDefList().getTransitionDef();\r
203                         Iterator<TransitionDef> iter = transitionDefList.iterator();\r
204                         boolean found = false;\r
205                         while (iter.hasNext() && found == false) {\r
206                                 TransitionDef transitionDef = iter.next();\r
207                                 if (transitionDef.getName().equalsIgnoreCase(transition)) {\r
208                                         result = transitionDef;\r
209                                         found = true;\r
210                                 }\r
211                         }\r
212                 } catch (Exception e) {\r
213                         logger.error("Exception trying to retreive life cycle information for: " + ctx.getDocumentType());\r
214                 }\r
215         \r
216         return result;\r
217     }\r
218     \r
219     private PoxPayloadIn synthEmptyWorkflowInput() {\r
220         PoxPayloadIn result = null;\r
221         \r
222         PoxPayloadOut output = new PoxPayloadOut(WorkflowClient.SERVICE_PAYLOAD_NAME);\r
223         WorkflowCommon workflowCommons = new WorkflowCommon();\r
224         PayloadOutputPart commonPart = output.addPart(WorkflowClient.SERVICE_COMMONPART_NAME, workflowCommons);\r
225         String payloadXML = output.toXML();\r
226         try {\r
227                         result = new PoxPayloadIn(payloadXML);\r
228                 } catch (DocumentException e) {\r
229                         // TODO Auto-generated catch block\r
230                         e.printStackTrace();\r
231                 }\r
232         \r
233         return result;\r
234     }\r
235     \r
236     /*\r
237      * We should change this code.  The RepositoryClient (from call to getRepositoryClient) should support a call doWorkflowTransition() instead.\r
238      */\r
239     //FIXME: This method is almost identical to the method org.collectionspace.services.common.vocabulary.updateWorkflowWithTransition() so\r
240     // they should be consolidated -be DRY (don't repeat yourself).\r
241 \r
242     @PUT\r
243     @Path("{csid}" + WorkflowClient.SERVICE_PATH + "/" + "{transition}")\r
244     public byte[] updateWorkflowWithTransition(@PathParam("csid") String csid,\r
245                 @PathParam("transition") String transition) {\r
246         PoxPayloadOut result = null;\r
247         \r
248         \r
249         try {\r
250                 //\r
251                 // Create an empty workflow_commons input part and set it into a new "workflow" sub-resource context\r
252                 PoxPayloadIn input = new PoxPayloadIn(WorkflowClient.SERVICE_PAYLOAD_NAME, new WorkflowCommon(), \r
253                                 WorkflowClient.SERVICE_COMMONPART_NAME);\r
254             MultipartServiceContext ctx = (MultipartServiceContext) createServiceContext(WorkflowClient.SERVICE_NAME, input);\r
255                 \r
256             // Create a service context and document handler for the parent resource.\r
257             ServiceContext<PoxPayloadIn, PoxPayloadOut> parentCtx = createServiceContext();\r
258             DocumentHandler parentDocHandler = this.createDocumentHandler(parentCtx);      \r
259             ctx.setProperty(WorkflowClient.PARENT_DOCHANDLER, parentDocHandler); //added as a context param for the workflow document handler -it will call the parent's dochandler "prepareForWorkflowTranstion" method\r
260 \r
261             // When looking for the document, we need to use the parent's workspace name -not the "workflow" workspace name\r
262             String parentWorkspaceName = parentCtx.getRepositoryWorkspaceName();\r
263             ctx.setRespositoryWorkspaceName(parentWorkspaceName); //find the document in the parent's workspace\r
264             \r
265                 // Get the type of transition we're being asked to make and store it as a context parameter -used by the workflow document handler\r
266             TransitionDef transitionDef = getTransitionDef(parentCtx, transition);\r
267             ctx.setProperty(WorkflowClient.TRANSITION_ID, transitionDef);\r
268 \r
269             WorkflowDocumentModelHandler handler = createWorkflowDocumentHandler(ctx);\r
270             getRepositoryClient(ctx).update(ctx, csid, handler);\r
271             result = ctx.getOutput();\r
272         } catch (Exception e) {\r
273             throw bigReThrow(e, ServiceMessages.UPDATE_FAILED + WorkflowClient.SERVICE_PAYLOAD_NAME, csid);\r
274         }\r
275         return result.getBytes();\r
276     }\r
277     \r
278 }\r