public PluginInvoke invoke()

in src/main/java/org/apache/sling/scripting/sightly/impl/plugin/UnwrapPlugin.java [43:114]


    public PluginInvoke invoke(final Expression expression, final PluginCallInfo callInfo, final CompilerContext compilerContext) {

        return new DefaultPluginInvoke() {

            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());
                unwrapTest = new Conditional.Start(identifierName, false);
            }

            @Override
            public void beforeTagOpen(PushStream stream) {
                if (isSlyTag) {
                    Patterns.endStreamIgnore(stream);
                }
                stream.write(unwrapTest);
            }

            @Override
            public void afterTagOpen(PushStream stream) {
                stream.write(Conditional.END);
                if (isSlyTag) {
                    Patterns.beginStreamIgnore(stream);
                }
            }

            @Override
            public void beforeTagClose(PushStream stream, boolean isSelfClosing) {
                if (isSlyTag) {
                    Patterns.endStreamIgnore(stream);
                }
                stream.write(unwrapTest);
            }

            @Override
            public void afterTagClose(PushStream stream, boolean isSelfClosing) {
                stream.write(Conditional.END);
                if (isSlyTag) {
                    Patterns.beginStreamIgnore(stream);
                }
            }

            @Override
            public void afterElement(PushStream stream) {
                if (!globalBinding) {
                    stream.write(VariableBinding.END);
                }
            }

            private ExpressionNode testNode() {
                return (isEmptyExpression(expression.getRoot())) ? BooleanConstant.TRUE : expression.getRoot();
            }

            private boolean isEmptyExpression(ExpressionNode node) {
                return node instanceof StringConstant && ((StringConstant) node).getText().isEmpty();
            }
        };
    }