All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.simy4.xpath.expr.EqualsExpr Maven / Gradle / Ivy

There is a newer version: 2.3.9
Show newest version
package com.github.simy4.xpath.expr;

import com.github.simy4.xpath.XmlBuilderException;
import com.github.simy4.xpath.navigator.Navigator;
import com.github.simy4.xpath.navigator.Node;
import com.github.simy4.xpath.view.AbstractViewVisitor;
import com.github.simy4.xpath.view.BooleanView;
import com.github.simy4.xpath.view.IterableNodeView;
import com.github.simy4.xpath.view.NodeView;
import com.github.simy4.xpath.view.View;
import com.github.simy4.xpath.view.ViewContext;

import java.util.Iterator;

public class EqualsExpr extends AbstractOperationExpr {

    public EqualsExpr(Expr leftExpr, Expr rightExpr) {
        super(leftExpr, rightExpr);
    }

    @Override
    public  View resolve(ViewContext context, View left, View right)
            throws XmlBuilderException {
        boolean eq = 0 == left.compareTo(right);
        if (!eq && context.isGreedy() && !context.hasNext()) {
            eq = left.visit(new EqualsVisitor(context.getNavigator(), right));
        }
        return BooleanView.of(eq);
    }

    @Override
    String operator() {
        return "=";
    }

    static final class EqualsVisitor extends AbstractViewVisitor {

        private final Navigator navigator;
        private final View right;

        EqualsVisitor(Navigator navigator, View right) {
            this.navigator = navigator;
            this.right = right;
        }

        @Override
        public Boolean visit(IterableNodeView nodeSet) throws XmlBuilderException {
            final Iterator> iterator = nodeSet.iterator();
            if (!iterator.hasNext()) {
                throw new XmlBuilderException("Unable to satisfy not equals criteria for: " + right);
            }
            while (iterator.hasNext()) {
                navigator.setText(iterator.next().getNode(), right.toString());
            }
            return true;
        }

        @Override
        protected Boolean returnDefault(View view) throws XmlBuilderException {
            throw new XmlBuilderException("Can not modify read-only node: " + view);
        }

    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy