SLING-7994 add skipExecution to reference pipes
diff --git a/src/main/java/org/apache/sling/pipes/internal/NotPipe.java b/src/main/java/org/apache/sling/pipes/internal/NotPipe.java
index 892134a..36cc23e 100644
--- a/src/main/java/org/apache/sling/pipes/internal/NotPipe.java
+++ b/src/main/java/org/apache/sling/pipes/internal/NotPipe.java
@@ -36,7 +36,7 @@
     }
 
     @Override
-    protected Iterator<Resource> computeSubpipesOutput() {
+    protected Iterator<Resource> computeReferredOutput() {
         if (reference.getOutput().hasNext()){
             return EMPTY_ITERATOR;
         }
diff --git a/src/main/java/org/apache/sling/pipes/internal/ReferencePipe.java b/src/main/java/org/apache/sling/pipes/internal/ReferencePipe.java
index 71f9e32..ae780c0 100644
--- a/src/main/java/org/apache/sling/pipes/internal/ReferencePipe.java
+++ b/src/main/java/org/apache/sling/pipes/internal/ReferencePipe.java
@@ -34,6 +34,7 @@
     private static final Logger log = LoggerFactory.getLogger(ReferencePipe.class);
 
     public static final String RESOURCE_TYPE = "slingPipes/reference";
+    static final String PN_SKIPEXECUTION = "skipExecution";
 
     protected Pipe reference;
 
@@ -67,10 +68,31 @@
         }
     }
 
-    @Override
-    protected Iterator<Resource> computeSubpipesOutput() {
+    /**
+     * @return boolean flag mentionning wether we could skip the execution of that pipe
+     */
+    boolean shouldBeSkipped() {
+        String skip = properties.get(PN_SKIPEXECUTION, String.class);
+        if (StringUtils.isNotBlank(skip)) {
+            Object object = bindings.instantiateObject(skip);
+            if (object instanceof Boolean) {
+                return (Boolean)object;
+            }
+        }
+        return false;
+    }
+
+    protected Iterator<Resource> computeReferredOutput() {
         buildChildren();
         log.debug("getting {} output", reference);
         return reference.getOutput();
     }
+
+    @Override
+    protected Iterator<Resource> computeSubpipesOutput() {
+        if (! shouldBeSkipped()) {
+            return computeReferredOutput();
+        }
+        return EMPTY_ITERATOR;
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/org/apache/sling/pipes/internal/ReferencePipeTest.java b/src/test/java/org/apache/sling/pipes/internal/ReferencePipeTest.java
index 7d95805..a20c64f 100644
--- a/src/test/java/org/apache/sling/pipes/internal/ReferencePipeTest.java
+++ b/src/test/java/org/apache/sling/pipes/internal/ReferencePipeTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.sling.pipes.internal;
 
+import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.pipes.AbstractPipeTest;
 import org.apache.sling.pipes.ExecutionResult;
@@ -61,6 +62,19 @@
         testOneResource(PATH_PIPE + "/isAppleWormy", PATH_APPLE);
     }
 
+
+    @Test
+    public void testSkipExecution() throws PersistenceException, IllegalAccessException {
+        Pipe pipe = plumber.newPipe(context.resourceResolver()).echo(PATH_FRUITS).build();
+        String path = pipe.getResource().getPath();
+        assertEquals("there should be one result", 1, plumber.newPipe(context.resourceResolver())
+            .ref(path).run().size());
+        assertEquals("there should be one result", 1, plumber.newPipe(context.resourceResolver())
+            .ref(path).with("skipExecution","${false}").run().size());
+        assertEquals("there should be zero result", 0, plumber.newPipe(context.resourceResolver())
+            .ref(path).with("skipExecution","${true}").run().size());
+    }
+
     @Test
     public void testBuilderWithAdditionalBinding() throws Exception {
         String newFruit = "watermelon";