package org.xenei.jdbc4sparql.utils;
import java.util.ArrayList;
import java.util.List;
import com.hp.hpl.jena.sparql.syntax.Element;
import com.hp.hpl.jena.sparql.syntax.ElementAssign;
import com.hp.hpl.jena.sparql.syntax.ElementBind;
import com.hp.hpl.jena.sparql.syntax.ElementData;
import com.hp.hpl.jena.sparql.syntax.ElementDataset;
import com.hp.hpl.jena.sparql.syntax.ElementExists;
import com.hp.hpl.jena.sparql.syntax.ElementFilter;
import com.hp.hpl.jena.sparql.syntax.ElementGroup;
import com.hp.hpl.jena.sparql.syntax.ElementMinus;
import com.hp.hpl.jena.sparql.syntax.ElementNamedGraph;
import com.hp.hpl.jena.sparql.syntax.ElementNotExists;
import com.hp.hpl.jena.sparql.syntax.ElementOptional;
import com.hp.hpl.jena.sparql.syntax.ElementPathBlock;
import com.hp.hpl.jena.sparql.syntax.ElementService;
import com.hp.hpl.jena.sparql.syntax.ElementSubQuery;
import com.hp.hpl.jena.sparql.syntax.ElementTriplesBlock;
import com.hp.hpl.jena.sparql.syntax.ElementUnion;
import com.hp.hpl.jena.sparql.syntax.ElementVisitor;
/**
* Class for test classes to extract element types from query.
*/
public class ElementExtractor implements ElementVisitor {
private List<Element> extracted = new ArrayList<Element>();
private Class<? extends Element> matchType;
/**
* Set the type to match
*
* @param clazz
* The class type to match
* @return this ElementExtractor for chaining
*/
public ElementExtractor setMatchType(final Class<? extends Element> clazz) {
matchType = clazz;
return this;
}
/**
* Reset the results.
*
* @return this ElementExtractor for chaining
*/
public ElementExtractor reset() {
extracted = new ArrayList<Element>();
return this;
}
public List<Element> getExtracted() {
return extracted;
}
public ElementExtractor() {
;
}
public ElementExtractor(final Class<? extends Element> clazz) {
setMatchType(clazz);
}
@Override
public void visit(final ElementTriplesBlock el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
}
@Override
public void visit(final ElementPathBlock el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
}
@Override
public void visit(final ElementFilter el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
}
@Override
public void visit(final ElementAssign el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
}
@Override
public void visit(final ElementBind el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
}
@Override
public void visit(final ElementData el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
}
@Override
public void visit(final ElementUnion el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
for (final Element e : el.getElements()) {
e.visit(this);
}
}
@Override
public void visit(final ElementOptional el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getOptionalElement().visit(this);
}
@Override
public void visit(final ElementGroup el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
for (final Element e : el.getElements()) {
e.visit(this);
}
}
@Override
public void visit(final ElementDataset el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getPatternElement().visit(this);
}
@Override
public void visit(final ElementNamedGraph el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getElement().visit(this);
}
@Override
public void visit(final ElementExists el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getElement().visit(this);
}
@Override
public void visit(final ElementNotExists el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getElement().visit(this);
}
@Override
public void visit(final ElementMinus el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getMinusElement().visit(this);
}
@Override
public void visit(final ElementService el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getElement().visit(this);
}
@Override
public void visit(final ElementSubQuery el) {
if (matchType.isAssignableFrom(el.getClass())) {
extracted.add(el);
}
el.getQuery().getQueryPattern().visit(this);
}
}