This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.pipes-0.0.10 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-pipes.git
commit c21dae5d108be9ce07efc0b899fcec1e0096eb79 Author: Robert Munteanu <[email protected]> AuthorDate: Tue Sep 6 11:30:13 2016 +0000 SLING-5818 - Make sling pipe writer a persistent configuration Submitted-By: Nicolas Peltier git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/sling-pipes@1759410 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/sling/pipes/ContainerPipe.java | 21 +---- .../java/org/apache/sling/pipes/PipeBindings.java | 5 + .../org/apache/sling/pipes/PlumberServlet.java | 101 +++++++-------------- .../org/apache/sling/pipes/PlumberServletTest.java | 11 ++- 4 files changed, 45 insertions(+), 93 deletions(-) diff --git a/src/main/java/org/apache/sling/pipes/ContainerPipe.java b/src/main/java/org/apache/sling/pipes/ContainerPipe.java index 0c68310..64aa072 100644 --- a/src/main/java/org/apache/sling/pipes/ContainerPipe.java +++ b/src/main/java/org/apache/sling/pipes/ContainerPipe.java @@ -17,23 +17,11 @@ package org.apache.sling.pipes; import org.apache.sling.api.resource.Resource; -import org.apache.sling.api.resource.ValueMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.script.Bindings; -import javax.script.Invocable; -import javax.script.ScriptContext; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import javax.script.SimpleScriptContext; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Calendar; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -84,10 +72,6 @@ public class ContainerPipe extends BasePipe { @Override public Iterator<Resource> getOutput() { - if (pipeList.size() == 1) { - //corner case with only one element: no need to have a container resource iterator - return pipeList.iterator().next().getOutput(); - } return new ContainerResourceIterator(this); } @@ -187,7 +171,8 @@ public class ContainerPipe extends BasePipe { //2 choices here: // either cursor is at 0 with no resource left: end, // either cursor is on last pipe with a resource left: hasNext - return cursor > 0; + // the second part is for the corner case with only one item + return cursor > 0 || (iterators.size() == 1 && it.hasNext()); } /** @@ -220,7 +205,7 @@ public class ContainerPipe extends BasePipe { @Override public void remove() { - + throw new UnsupportedOperationException(); } } diff --git a/src/main/java/org/apache/sling/pipes/PipeBindings.java b/src/main/java/org/apache/sling/pipes/PipeBindings.java index c1f9f62..7d48e1d 100644 --- a/src/main/java/org/apache/sling/pipes/PipeBindings.java +++ b/src/main/java/org/apache/sling/pipes/PipeBindings.java @@ -130,6 +130,10 @@ public class PipeBindings { getBindings().putAll(bindings); } + public void copyBindings(PipeBindings original){ + getBindings().putAll(original.getBindings()); + } + /** * Update current resource of a given pipe, and appropriate binding * @param pipe @@ -144,6 +148,7 @@ public class PipeBindings { } public void addBinding(String name, Object value){ + log.debug("Adding binding {}={}", name, value); getBindings().put(name, value); } diff --git a/src/main/java/org/apache/sling/pipes/PlumberServlet.java b/src/main/java/org/apache/sling/pipes/PlumberServlet.java index c0efe83..807b58e 100644 --- a/src/main/java/org/apache/sling/pipes/PlumberServlet.java +++ b/src/main/java/org/apache/sling/pipes/PlumberServlet.java @@ -16,7 +16,6 @@ */ package org.apache.sling.pipes; - import org.apache.commons.lang.StringUtils; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.sling.SlingServlet; @@ -25,17 +24,16 @@ import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.servlets.SlingAllMethodsServlet; +import org.apache.sling.commons.json.JSONException; import org.apache.sling.commons.json.JSONObject; -import org.apache.sling.commons.json.io.JSONWriter; +import org.apache.sling.pipes.impl.CustomJsonWriter; +import org.apache.sling.pipes.impl.CustomWriter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletException; import java.io.IOException; -import java.util.HashMap; import java.util.Iterator; -import java.util.Map; -import java.util.Set; /** * Servlet executing plumber for a pipe path given as 'path' parameter, @@ -54,20 +52,12 @@ public class PlumberServlet extends SlingAllMethodsServlet { protected static final String PARAM_PATH = "path"; - public static final String PATH_KEY = "path"; - protected static final String PARAM_BINDINGS = "bindings"; - protected static final String PARAM_WRITER = "writer"; - protected static final String PARAM_SIZE = "size"; public static final int NB_MAX = 10; - public static final String KEY_SIZE = PARAM_SIZE; - - public static final String KEY_ITEMS = "items"; - @Reference Plumber plumber; @@ -88,87 +78,58 @@ public class PlumberServlet extends SlingAllMethodsServlet { throw new Exception("path should be provided"); } String dryRun = request.getParameter(BasePipe.DRYRUN_KEY); - String paramBindings = request.getParameter(PARAM_BINDINGS); int size = request.getParameter(PARAM_SIZE) != null ? Integer.parseInt(request.getParameter(PARAM_SIZE)) : NB_MAX; if (size < 0) { size = Integer.MAX_VALUE; } - Map additionalBindings = null; + ResourceResolver resolver = request.getResourceResolver(); + Resource pipeResource = resolver.getResource(path); + Pipe pipe = plumber.getPipe(pipeResource); + PipeBindings bindings = pipe.getBindings(); + if (StringUtils.isNotBlank(dryRun) && dryRun.equals(Boolean.TRUE.toString())) { - additionalBindings = new HashMap<>(); - additionalBindings.put(BasePipe.DRYRUN_KEY, true); + bindings.addBinding(BasePipe.DRYRUN_KEY, true); } + + String paramBindings = request.getParameter(PARAM_BINDINGS); if (StringUtils.isNotBlank(paramBindings)){ try { JSONObject bindingJSON = new JSONObject(paramBindings); - additionalBindings = additionalBindings != null ? additionalBindings: new HashMap<>(); for (Iterator<String> keys = bindingJSON.keys(); keys.hasNext();){ String key = keys.next(); - additionalBindings.put(key, bindingJSON.get(key)); + bindings.addBinding(key, bindingJSON.get(key)); } } catch (Exception e){ log.error("Unable to retrieve bindings information", e); } } - - String paramWriter = request.getParameter(PARAM_WRITER); - JSONObject writerObj = null; - if (StringUtils.isNotBlank(paramWriter)){ - try { - writerObj = new JSONObject(paramWriter); - } catch (Exception e) { - log.error("Unable to retrieve the writer object"); - } - } - response.setCharacterEncoding("utf-8"); - response.setContentType("application/json"); - JSONWriter writer = new JSONWriter(response.getWriter()); - ResourceResolver resolver = request.getResourceResolver(); - Resource pipeResource = resolver.getResource(path); - Pipe pipe = plumber.getPipe(pipeResource); if (!writeAllowed && pipe.modifiesContent()) { throw new Exception("This pipe modifies content, you should use a POST request"); } - writer.object(); + OutputWriter writer = getWriter(request, response, pipe); int i = 0; - if (writerObj != null) { - pipe.getBindings().addBindings(additionalBindings); - Iterator<Resource> resourceIterator = pipe.getOutput(); - writer.key(KEY_ITEMS).array(); - while (resourceIterator.hasNext()){ - Resource resource = resourceIterator.next(); - if (++i < size) { - writer.object(); - writer.key(PATH_KEY).value(resource.getPath()); - Iterator<String> keys = writerObj.keys(); - while (keys.hasNext()) { - String key = keys.next(); - writer.key(key).value(pipe.getBindings().instantiateObject(writerObj.getString(key))); - } - writer.endObject(); - } + Iterator<Resource> resourceIterator = pipe.getOutput(); + while (resourceIterator.hasNext()){ + Resource resource = resourceIterator.next(); + if (++i < size) { + writer.writeItem(resource); } - writer.endArray(); - writer.key(KEY_SIZE).value(i); - } else { - Set<String> resources = plumber.execute(resolver, pipe, additionalBindings, true); - writer.key(KEY_SIZE).value(resources.size()); - writer.key(KEY_ITEMS); - writer.array(); - for (String resource : resources) { - if (++i > size){ - break; - } else { - writer.value(resource); - } - } - writer.endArray(); } - writer.endObject(); - response.flushBuffer(); + writer.ends(i); } catch (Exception e) { throw new ServletException(e); } } -} + + OutputWriter getWriter(SlingHttpServletRequest request, SlingHttpServletResponse response, Pipe pipe) throws IOException, JSONException { + OutputWriter[] candidates = new OutputWriter[]{new CustomJsonWriter(), new CustomWriter(), new DefaultOutputWriter()}; + for (OutputWriter candidate : candidates) { + if (candidate.handleRequest(request)) { + candidate.init(request, response, pipe); + return candidate; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/test/java/org/apache/sling/pipes/PlumberServletTest.java b/src/test/java/org/apache/sling/pipes/PlumberServletTest.java index 52ecf05..7d63794 100644 --- a/src/test/java/org/apache/sling/pipes/PlumberServletTest.java +++ b/src/test/java/org/apache/sling/pipes/PlumberServletTest.java @@ -25,6 +25,7 @@ import org.apache.sling.api.resource.ValueMap; import org.apache.sling.commons.json.JSONArray; import org.apache.sling.commons.json.JSONException; import org.apache.sling.commons.json.JSONObject; +import org.apache.sling.pipes.impl.CustomWriter; import org.junit.Before; import org.junit.Test; @@ -78,8 +79,8 @@ public class PlumberServletTest extends AbstractPipeTest { String finalResponse = stringResponse.toString(); assertFalse("There should be a response", StringUtils.isBlank(finalResponse)); JSONObject object = new JSONObject(finalResponse); - assertEquals("response should be an obj with size value equals to 4", object.getInt(PlumberServlet.KEY_SIZE), 4); - assertEquals("response should be an obj with items value equals to a 4 valued array", object.getJSONArray(PlumberServlet.KEY_ITEMS).length(), 4); + assertEquals("response should be an obj with size value equals to 4", object.getInt(OutputWriter.KEY_SIZE), 4); + assertEquals("response should be an obj with items value equals to a 4 valued array", object.getJSONArray(OutputWriter.KEY_ITEMS).length(), 4); } @Test @@ -134,11 +135,11 @@ public class PlumberServletTest extends AbstractPipeTest { servlet.execute(request, response, false); assertDummyTree(); JSONObject response = new JSONObject(stringResponse.toString()); - JSONArray array = response.getJSONArray(PlumberServlet.KEY_ITEMS); + JSONArray array = response.getJSONArray(OutputWriter.KEY_ITEMS); for (int i = 0; i < array.length(); i++) { JSONObject object = array.optJSONObject(i); assertNotNull("there should be an object returned at each time", object); - String path = object.optString(PlumberServlet.PATH_KEY); + String path = object.optString(CustomWriter.PATH_KEY); assertNotNull("the string path should be returned for each item, containing the path of the resource"); String pathLength = object.optString(pathLengthParam); assertNotNull("there should be a pathLength param, as specified in the writer", pathLength); @@ -176,7 +177,7 @@ public class PlumberServletTest extends AbstractPipeTest { when(request.getResource()).thenReturn(resource); when(request.getParameter(PlumberServlet.PARAM_PATH)).thenReturn(pathParam); when(request.getParameter(PlumberServlet.PARAM_BINDINGS)).thenReturn(bindings); - when(request.getParameter(PlumberServlet.PARAM_WRITER)).thenReturn(writer); + when(request.getParameter(CustomWriter.PARAM_WRITER)).thenReturn(writer); when(request.getParameter(BasePipe.DRYRUN_KEY)).thenReturn(dryRun); return request; } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
