2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org
.argeo
.slc
.web
.mvc
.controllers
;
19 import java
.io
.BufferedReader
;
20 import java
.text
.SimpleDateFormat
;
21 import java
.util
.Comparator
;
22 import java
.util
.List
;
23 import java
.util
.SortedSet
;
24 import java
.util
.TreeSet
;
25 import java
.util
.UUID
;
27 import javax
.servlet
.http
.HttpServletRequest
;
28 import javax
.servlet
.http
.HttpServletResponse
;
30 import org
.apache
.commons
.logging
.Log
;
31 import org
.apache
.commons
.logging
.LogFactory
;
32 import org
.argeo
.slc
.SlcException
;
33 import org
.argeo
.slc
.core
.attachment
.AttachmentsStorage
;
34 import org
.argeo
.slc
.dao
.process
.SlcExecutionDao
;
35 import org
.argeo
.slc
.execution
.ExecutionModuleDescriptor
;
36 import org
.argeo
.slc
.msg
.ExecutionAnswer
;
37 import org
.argeo
.slc
.msg
.MsgConstants
;
38 import org
.argeo
.slc
.msg
.ObjectList
;
39 import org
.argeo
.slc
.process
.SlcExecution
;
40 import org
.argeo
.slc
.process
.SlcExecutionStep
;
41 import org
.argeo
.slc
.runtime
.SlcAgent
;
42 import org
.argeo
.slc
.runtime
.SlcAgentFactory
;
43 import org
.argeo
.slc
.services
.SlcExecutionService
;
44 import org
.springframework
.oxm
.Marshaller
;
45 import org
.springframework
.oxm
.Unmarshaller
;
46 import org
.springframework
.stereotype
.Controller
;
47 import org
.springframework
.ui
.Model
;
48 import org
.springframework
.util
.Assert
;
49 import org
.springframework
.web
.bind
.annotation
.RequestMapping
;
50 import org
.springframework
.web
.bind
.annotation
.RequestParam
;
51 import org
.springframework
.xml
.transform
.StringSource
;
54 public class ProcessController
{
56 private final static Log log
= LogFactory
.getLog(ProcessController
.class);
58 private SlcExecutionDao slcExecutionDao
;
59 private SlcAgentFactory agentFactory
;
60 private Unmarshaller unmarshaller
;
61 private Marshaller marshaller
;
62 private SlcExecutionService slcExecutionService
;
63 private AttachmentsStorage attachmentsStorage
;
65 private SlcExecutionManager slcExecutionManager
;
67 @RequestMapping("/listSlcExecutions.service")
68 protected ObjectList
listSlcExecutions() {
69 List
<SlcExecution
> list
= slcExecutionDao
.listSlcExecutions();
70 return new ObjectList(list
);
73 @RequestMapping("/getExecutionDescriptor.service")
74 protected ExecutionModuleDescriptor
getExecutionDescriptor(
75 @RequestParam String agentId
, @RequestParam String moduleName
,
76 @RequestParam String version
) {
78 SlcAgent slcAgent
= agentFactory
.getAgent(agentId
);
80 ExecutionModuleDescriptor md
= slcAgent
.getExecutionModuleDescriptor(
85 @RequestMapping("/listModulesDescriptors.service")
86 protected ObjectList
listModulesDescriptors(@RequestParam String agentId
) {
87 // TODO: use centralized agentId property (from MsgConstants)?
88 SlcAgent slcAgent
= agentFactory
.getAgent(agentId
);
90 List
<ExecutionModuleDescriptor
> descriptors
= slcAgent
91 .listExecutionModuleDescriptors();
92 SortedSet
<ExecutionModuleDescriptor
> set
= new TreeSet
<ExecutionModuleDescriptor
>(
93 new Comparator
<ExecutionModuleDescriptor
>() {
95 public int compare(ExecutionModuleDescriptor md1
,
96 ExecutionModuleDescriptor md2
) {
97 String str1
= md1
.getLabel() != null ? md1
.getLabel()
99 String str2
= md2
.getLabel() != null ? md2
.getLabel()
101 return str1
.compareTo(str2
);
104 set
.addAll(descriptors
);
105 return new ObjectList(set
);
108 @RequestMapping("/getSlcExecution.service")
109 protected SlcExecution
getSlcExecution(@RequestParam String uuid
) {
110 SlcExecution slcExecution
= slcExecutionDao
.getSlcExecution(uuid
);
112 slcExecutionManager
.retrieveRealizedFlows(slcExecution
);
116 @RequestMapping("/newSlcExecution.service")
117 protected ExecutionAnswer
newSlcExecution(HttpServletRequest request
,
118 Model model
) throws Exception
{
120 String agentId
= request
121 .getParameter(MsgConstants
.PROPERTY_SLC_AGENT_ID
);
122 Assert
.notNull(agentId
, "agent id");
124 String answer
= request
.getParameter("body");
125 if (answer
== null) {
126 // lets read the message body instead
127 BufferedReader reader
= request
.getReader();
128 StringBuffer buffer
= new StringBuffer();
130 while (((line
= reader
.readLine()) != null)) {
133 answer
= buffer
.toString();
136 if (log
.isTraceEnabled())
137 log
.debug("Received message:\n" + answer
);
139 StringSource source
= new StringSource(answer
);
140 SlcExecution slcExecution
= (SlcExecution
) unmarshaller
143 // Workaround for https://www.argeo.org/bugzilla/show_bug.cgi?id=86
144 if (slcExecution
.getUuid() == null
145 || slcExecution
.getUuid().length() < 8)
146 slcExecution
.setUuid(UUID
.randomUUID().toString());
148 slcExecution
.setStatus(SlcExecution
.SCHEDULED
);
149 slcExecution
.getSteps().add(
150 new SlcExecutionStep(SlcExecutionStep
.START
,
151 "Process started from the Web UI"));
154 slcExecutionManager
.storeRealizedFlows(slcExecution
);
155 slcExecutionService
.newExecution(slcExecution
);
156 SlcAgent agent
= agentFactory
.getAgent(agentId
);
157 //agent.runSlcExecution(slcExecution);
159 return ExecutionAnswer
.ok("Execution completed properly");
162 @RequestMapping("/tailSlcExecutionStepsCount.service")
163 protected ObjectList
tailSlcExecutionSteps(@RequestParam String uuid
,
164 @RequestParam Integer stepCount
) {
165 List
<SlcExecutionStep
> list
= slcExecutionDao
166 .tailSteps(uuid
, stepCount
);
167 return new ObjectList(list
);
170 @RequestMapping("/tailSlcExecutionStepsOffset.service")
171 protected ObjectList
tailSlcExecutionSteps(@RequestParam String uuid
,
172 @RequestParam String stepOffsetUuid
) {
173 List
<SlcExecutionStep
> list
= slcExecutionDao
.tailSteps(uuid
,
175 return new ObjectList(list
);
178 @RequestMapping("/downloadSlcExecution.service")
179 protected void downloadSlcExecution(@RequestParam String uuid
,
180 @RequestParam String ext
, HttpServletResponse response
)
183 // cf. http://en.wikipedia.org/wikServicei/Internet_media_type
184 if ("csv".equals(ext
))
185 contentType
= "text/csv";
186 else if ("pdf".equals(ext
))
187 contentType
= "application/pdf";
188 else if ("zip".equals(ext
))
189 contentType
= "application/zip";
190 else if ("html".equals(ext
))
191 contentType
= "application/html";
192 else if ("txt".equals(ext
) || "log".equals(ext
))
193 contentType
= "text/plain";
194 else if ("doc".equals(ext
) || "docx".equals(ext
))
195 contentType
= "application/msword";
196 else if ("xls".equals(ext
) || "xlsx".equals(ext
))
197 contentType
= "application/vnd.ms-excel";
198 else if ("xml".equals(ext
))
199 contentType
= "text/xml";
201 contentType
= "Content-Type: application/force-download";
203 String name
= "Process-" + uuid
+ "." + ext
;
205 SlcExecution process
= slcExecutionDao
.getSlcExecution(uuid
);
207 SimpleDateFormat df
= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
209 // TODO: put it in a separate view
210 if ("log".equals(ext
)) {
211 StringBuffer buf
= new StringBuffer("");
212 buf
.append("#\n# PROCESS " + process
.getUuid() + "\n#\n\n");
214 .append("Started at " + df
.format(process
.getStartDate())
216 buf
.append("Ended at " + df
.format(process
.getEndDate()) + "\n");
217 buf
.append("On host " + process
.getHost() + "\n");
218 buf
.append("\n# LOG\n\n");
219 for (SlcExecutionStep step
: process
.getSteps()) {
220 buf
.append(df
.format(step
.getTimestamp()));
222 for (int i
= 0; i
< step
.getLogLines().size(); i
++) {
225 buf
.append(step
.getLogLines().get(i
));
228 buf
.append(step
.getType());
230 buf
.append('[').append(step
.getThread()).append(']');
233 prepareDownloadResponse(name
, contentType
, response
);
234 response
.getWriter().print(buf
);
236 throw new SlcException("Unsupported content type " + contentType
);
240 protected void prepareDownloadResponse(String name
, String contentType
,
241 HttpServletResponse response
) {
242 response
.setHeader("Content-Disposition", "attachment; filename=\""
244 response
.setContentType(contentType
+ ";name=\"" + name
+ "\"");
245 response
.setHeader("Expires", "0");
246 response
.setHeader("Cache-Control", "no-cache, must-revalidate");
247 response
.setHeader("Pragma", "no-cache");
250 private void initializeSEM() {
251 slcExecutionManager
= new SlcExecutionManager(unmarshaller
, marshaller
,
255 public void setSlcExecutionDao(SlcExecutionDao slcExecutionDao
) {
256 this.slcExecutionDao
= slcExecutionDao
;
259 public void setSlcExecutionService(SlcExecutionService slcExecutionService
) {
260 this.slcExecutionService
= slcExecutionService
;
263 public void setUnmarshaller(Unmarshaller unmarshaller
) {
264 this.unmarshaller
= unmarshaller
;
267 public void setMarshaller(Marshaller marshaller
) {
268 this.marshaller
= marshaller
;
271 public void setAttachmentsStorage(AttachmentsStorage attachmentsStorage
) {
272 this.attachmentsStorage
= attachmentsStorage
;
275 public void setAgentFactory(SlcAgentFactory agentFactory
) {
276 this.agentFactory
= agentFactory
;