package org.aksw.jena_sparql_api.util.sparql.syntax.path;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;
import org.apache.jena.graph.Node;
import org.apache.jena.sparql.graph.NodeTransform;
import org.apache.jena.sparql.path.P_Alt;
import org.apache.jena.sparql.path.P_Distinct;
import org.apache.jena.sparql.path.P_FixedLength;
import org.apache.jena.sparql.path.P_Inverse;
import org.apache.jena.sparql.path.P_Link;
import org.apache.jena.sparql.path.P_Mod;
import org.apache.jena.sparql.path.P_Multi;
import org.apache.jena.sparql.path.P_NegPropSet;
import org.apache.jena.sparql.path.P_OneOrMore1;
import org.apache.jena.sparql.path.P_OneOrMoreN;
import org.apache.jena.sparql.path.P_ReverseLink;
import org.apache.jena.sparql.path.P_Seq;
import org.apache.jena.sparql.path.P_Shortest;
import org.apache.jena.sparql.path.P_ZeroOrMore1;
import org.apache.jena.sparql.path.P_ZeroOrMoreN;
import org.apache.jena.sparql.path.P_ZeroOrOne;
import org.apache.jena.sparql.path.Path;
import org.apache.jena.sparql.path.PathVisitor;
public class PathVisitorApplyTransform
implements PathVisitor
{
protected PathTransform pathTransform;
protected NodeTransform nodeTransform;
protected Deque<Path> stack = new ArrayDeque<Path>();
public PathVisitorApplyTransform(PathTransform pathTransform, NodeTransform nodeTransform) {
this.pathTransform = pathTransform;
this.nodeTransform = nodeTransform;
}
public Path getResult() {
if(stack.size() != 1) {
throw new RuntimeException("Stack not aligned");
}
Path result = stack.pop();
return result;
}
public Node applyNodeTransform(Node node) {
Node result = nodeTransform == null ? node : nodeTransform.apply(node);
return result;
}
@Override
public void visit(P_Link path) {
Node newNode = applyNodeTransform(path.getNode());
Path newPath = pathTransform.transform(path, newNode);
stack.push(newPath);
}
@Override
public void visit(P_ReverseLink path) {
Node newNode = applyNodeTransform(path.getNode());
Path newPath = pathTransform.transform(path, newNode);
stack.push(newPath);
}
@Override
public void visit(P_NegPropSet path) {
List<Node> newFwdNodes = path.getFwdNodes();
List<Node> newBwdNodes = path.getBwdNodes();
Path newPath = pathTransform.transform(path, newFwdNodes, newBwdNodes);
stack.push(newPath);
}
@Override
public void visit(P_Inverse path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_Mod path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath, path.getMin(), path.getMax());
stack.push(newPath);
}
@Override
public void visit(P_FixedLength path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath, path.getCount());
stack.push(newPath);
}
@Override
public void visit(P_Distinct path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_Multi path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_Shortest path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_ZeroOrOne path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_ZeroOrMore1 path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_ZeroOrMoreN path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_OneOrMore1 path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_OneOrMoreN path) {
Path subPath = stack.pop() ;
Path newPath = pathTransform.transform(path, subPath);
stack.push(newPath);
}
@Override
public void visit(P_Alt path) {
Path newRight = stack.pop() ;
Path newLeft = stack.pop() ;
Path newPath = pathTransform.transform(path, newLeft, newRight);
stack.push(newPath);
}
@Override
public void visit(P_Seq path) {
Path newRight = stack.pop() ;
Path newLeft = stack.pop() ;
Path newPath = pathTransform.transform(path, newLeft, newRight);
stack.push(newPath);
}
}