]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.core/src/org/argeo/slc/core/execution/http/RunnerServlet.java
Deal with x-www-form-urlencoded
[gpl/argeo-slc.git] / org.argeo.slc.core / src / org / argeo / slc / core / execution / http / RunnerServlet.java
index cebf4d82aff759d1a308f8df9783ce81295357dd..1823759c4e0810830e0e112c64ca4db99c175a6b 100644 (file)
@@ -1,15 +1,21 @@
 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;
@@ -36,9 +42,9 @@ import org.argeo.cms.auth.CmsSession;
 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;
@@ -46,6 +52,10 @@ import org.osgi.service.http.HttpContext;
 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);
 
@@ -68,6 +78,17 @@ public class RunnerServlet extends HttpServlet {
 
        @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();
@@ -75,8 +96,13 @@ public class RunnerServlet extends HttpServlet {
                // 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("/");
@@ -102,10 +128,12 @@ public class RunnerServlet extends HttpServlet {
                // 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));
@@ -134,15 +162,16 @@ public class RunnerServlet extends HttpServlet {
                        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");
@@ -150,14 +179,14 @@ public class RunnerServlet extends HttpServlet {
                                        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);
@@ -179,7 +208,7 @@ public class RunnerServlet extends HttpServlet {
                        } 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);
                }
@@ -192,7 +221,7 @@ public class RunnerServlet extends HttpServlet {
                // jsonWriter.flush();
        }
 
-       protected Callable<Integer> createTask(ServiceChannel serviceChannel, String flowPath) {
+       protected Callable<Integer> createTask(ServiceChannel serviceChannel, String flowName) {
                return null;
        }