package org.argeo.slc.core.execution.http;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.channels.Channels;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.AccessControlContext;
import java.security.PrivilegedAction;
import java.util.Collection;
import java.util.GregorianCalendar;
+import java.util.Map;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import org.argeo.jcr.JcrUtils;
import org.argeo.node.NodeUtils;
import org.argeo.slc.SlcException;
+import org.argeo.slc.SlcNames;
+import org.argeo.slc.SlcTypes;
import org.argeo.slc.execution.ExecutionProcess;
-import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.jcr.SlcTypes;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;
import org.osgi.util.tracker.ServiceTracker;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+
public class RunnerServlet extends HttpServlet {
private final static Log log = LogFactory.getLog(RunnerServlet.class);
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ InputStream in;
+ // Deal with x-www-form-urlencoded
+ // FIXME make it more robust an generic
+ Map<String, String[]> params = req.getParameterMap();
+ if (params.size() != 0) {
+ String json = params.keySet().iterator().next();
+ in = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
+ } else {
+ in = req.getInputStream();
+ }
+
// InputStream in = req.getInputStream();
// Gson gson = new Gson();
// JsonParser jsonParser = new JsonParser();
// Charset.forName("UTF-8")));
// JsonElement payload = jsonParser.parse(reader);
// String payloadStr = gson.toJson(payload);
+ //
+ // log.debug(payloadStr);
+ // if (true)
+ // return;
+
String path = req.getPathInfo();
- InputStream in = req.getInputStream();
+ // InputStream in = req.getInputStream();
OutputStream out = resp.getOutputStream();
String tokens[] = path.split("/");
// flow path
StringBuilder sb = new StringBuilder("");
for (int i = 2; i < tokens.length; i++) {
- sb.append('/').append(tokens[i]);
+ if (i != 2)
+ sb.append('/');
+ sb.append(tokens[i]);
}
- String flowPath = sb.toString();
- String ext = FilenameUtils.getExtension(flowPath.toString());
+ String flowName = sb.toString();
+ String ext = FilenameUtils.getExtension(flowName.toString());
// JCR
Repository repository = bc.getService(bc.getServiceReference(Repository.class));
realizedFlowNode = processNode.addNode(SlcNames.SLC_FLOW);
realizedFlowNode.addMixin(SlcTypes.SLC_REALIZED_FLOW);
realizedFlowNode.setProperty(SlcNames.SLC_STARTED, started);
+ realizedFlowNode.setProperty(SlcNames.SLC_NAME, flowName);
Node addressNode = realizedFlowNode.addNode(SlcNames.SLC_ADDRESS, NodeType.NT_ADDRESS);
- addressNode.setProperty(Property.JCR_PATH, flowPath);
+ addressNode.setProperty(Property.JCR_PATH, flowName);
processNode.getSession().save();
} catch (RepositoryException e1) {
throw new SlcException("Cannot register SLC process", e1);
}
if (log.isDebugEnabled())
- log.debug(userDn + " " + workgroup + " " + flowPath);
+ log.debug(userDn + " " + workgroup + " " + flowName);
try {
resp.setHeader("Content-Type", "application/json");
executor);
Callable<Integer> task;
if (ext.equals("api")) {
- String uri = Files.readAllLines(baseDir.resolve(flowPath.substring(1))).get(0);
+ String uri = Files.readAllLines(baseDir.resolve(flowName)).get(0);
task = new WebServiceTask(serviceChannel, uri);
} else {
- task = createTask(serviceChannel, flowPath);
+ task = createTask(serviceChannel, flowName);
}
if (task == null)
- throw new SlcException("No task found for " + flowPath);
+ throw new SlcException("No task found for " + flowName);
// execute
Future<Integer> f = executor.submit(task);
} catch (RepositoryException e1) {
throw new SlcException("Cannot update SLC process status", e1);
}
- throw new SlcException("Task " + flowPath + " failed", e);
+ throw new SlcException("Task " + flowName + " failed", e);
} finally {
JcrUtils.logoutQuietly(session);
}
// jsonWriter.flush();
}
- protected Callable<Integer> createTask(ServiceChannel serviceChannel, String flowPath) {
+ protected Callable<Integer> createTask(ServiceChannel serviceChannel, String flowName) {
return null;
}