SLING-7713 - [HTL] Add support for data-sly-unwrap identifiers
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/AbstractPlugin.java b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/AbstractPlugin.java
index cd09ef7..5a204c1 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/AbstractPlugin.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/AbstractPlugin.java
@@ -37,4 +37,12 @@
     public int compareTo(Plugin o) {
         return this.priority - o.priority();
     }
+
+    public String decodeVariableName(PluginCallInfo pluginCallInfo) {
+        String[] args = pluginCallInfo.getArguments();
+        if (args.length > 0) {
+            return args[0];
+        }
+        return null;
+    }
 }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/SetPlugin.java b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/SetPlugin.java
index 010918b..f4fe975 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/SetPlugin.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/SetPlugin.java
@@ -18,6 +18,7 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.scripting.sightly.impl.plugin;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.scripting.sightly.compiler.SightlyCompilerException;
 import org.apache.sling.scripting.sightly.compiler.commands.VariableBinding;
 import org.apache.sling.scripting.sightly.compiler.expression.Expression;
@@ -38,6 +39,9 @@
     public PluginInvoke invoke(final Expression expressionNode, final PluginCallInfo callInfo, final CompilerContext compilerContext) {
 
         final String variableName = decodeVariableName(callInfo);
+        if (StringUtils.isEmpty(variableName)) {
+            throw new SightlyCompilerException("Identifier name was not provided.");
+        }
 
         return new DefaultPluginInvoke() {
 
@@ -50,13 +54,4 @@
         };
     }
 
-    private String decodeVariableName(PluginCallInfo callInfo) {
-        String[] arguments = callInfo.getArguments();
-        if (arguments.length == 0) {
-            throw new SightlyCompilerException("Identifier name was not provided.");
-        }
-        return arguments[0];
-    }
-
-
 }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/TestPlugin.java b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/TestPlugin.java
index 66570d4..202bfb4 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/TestPlugin.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/TestPlugin.java
@@ -43,7 +43,7 @@
 
             @Override
             public void beforeElement(PushStream stream, String tagName) {
-                String variableName = decodeVariableName();
+                String variableName = decodeVariableName(callInfo);
                 globalBinding = variableName != null;
                 if (variableName == null) {
                     variableName = compilerContext.generateVariable("testVariable");
@@ -63,15 +63,6 @@
                     stream.write(VariableBinding.END);
                 }
             }
-
-            private String decodeVariableName() {
-                String[] args = callInfo.getArguments();
-                if (args.length > 0) {
-                    return args[0];
-                }
-                return null;
-            }
-
         };
     }
 
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/UnwrapPlugin.java b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/UnwrapPlugin.java
index 104ecf7..51e2594 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/UnwrapPlugin.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/plugin/UnwrapPlugin.java
@@ -40,17 +40,28 @@
     }
 
     @Override
-    public PluginInvoke invoke(final Expression expression, PluginCallInfo callInfo, final CompilerContext compilerContext) {
+    public PluginInvoke invoke(final Expression expression, final PluginCallInfo callInfo, final CompilerContext compilerContext) {
+
         return new DefaultPluginInvoke() {
 
-            private final String variable = compilerContext.generateVariable("unwrapCondition");
-            private final Command unwrapTest = new Conditional.Start(variable, false);
+            private Command unwrapTest;
             private boolean isSlyTag = false;
+            private String identifierName = decodeVariableName(callInfo);
+            private boolean globalBinding;
 
             @Override
             public void beforeElement(PushStream stream, String tagName) {
+                globalBinding = identifierName != null;
+                if (identifierName == null) {
+                    identifierName = compilerContext.generateVariable("unwrapCondition");
+                }
+                if (globalBinding) {
+                    stream.write(new VariableBinding.Global(identifierName, expression.getRoot()));
+                } else {
+                    stream.write(new VariableBinding.Start(identifierName, testNode()));
+                }
                 isSlyTag = "sly".equals(tagName.toLowerCase());
-                stream.write(new VariableBinding.Start(variable, testNode()));
+                unwrapTest = new Conditional.Start(identifierName, false);
             }
 
             @Override
@@ -87,7 +98,9 @@
 
             @Override
             public void afterElement(PushStream stream) {
-                stream.write(VariableBinding.END);
+                if (!globalBinding) {
+                    stream.write(VariableBinding.END);
+                }
             }
 
             private ExpressionNode testNode() {