blob: 42e6d0811aac66b7b7d25752f770566564028bee [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.syntax;
/** <p> Visitor pattern helper that walks the entire tree calling operations
* are various points in the walking process. It is a depth first traversal.</p>
*
* <p> Every visit operation is bracketted by a start/end pair making the
* calling points:
* <ul>
* <li>start of element</li>
* <li>start each sub element</li>
* <li>end of each sub element</li>
* <li>end of element</li>
* </ul>
* </p>
*
* <p>The calls before and after subElements pass in the containing Element.
* These calls are in addition to the start/end call on elements as
* part of the recursive walk.</p>
*
* <p>Usage: inherit from this class and implement startElement/endElement as needed.
* The ElementWalker is like implementing endElement.</p> */
public class RecursiveElementVisitor implements ElementVisitor
{
// ---- Call points.
// Not abstract, because subclasses don't have to implement them.
public void startElement(ElementTriplesBlock el) {}
public void endElement (ElementTriplesBlock el) {}
public void startElement(ElementDataset el) {}
public void endElement (ElementDataset el) {}
public void startElement(ElementFilter el) {}
public void endElement (ElementFilter el) {}
public void startElement(ElementAssign el) {}
public void endElement (ElementAssign el) {}
public void startElement(ElementBind el) {}
public void endElement (ElementBind el) {}
public void startElement(ElementFind el) {}
public void endElement (ElementFind el) {}
public void startElement(ElementData el) {}
public void endElement (ElementData el) {}
public void startElement(ElementUnion el) {}
public void endElement (ElementUnion el) {}
public void startSubElement(ElementUnion el, Element subElt) {}
public void endSubElement (ElementUnion el, Element subElt) {}
public void startElement(ElementGroup el) {}
public void endElement (ElementGroup el) {}
public void startSubElement(ElementGroup el, Element subElt) {}
public void endSubElement (ElementGroup el, Element subElt) {}
public void startElement(ElementOptional el) {}
public void endElement (ElementOptional el) {}
public void startElement(ElementNamedGraph el) {}
public void endElement (ElementNamedGraph el) {}
public void startElement(ElementService el) {}
public void endElement (ElementService el) {}
public void startElement(ElementExists el) {}
public void endElement (ElementExists el) {}
public void startElement(ElementNotExists el) {}
public void endElement (ElementNotExists el) {}
public void startElement(ElementMinus el) {}
public void endElement (ElementMinus el) {}
public void endElement(ElementSubQuery el) {}
public void startElement(ElementSubQuery el) {}
public void endElement(ElementPathBlock el) {}
public void startElement(ElementPathBlock el) {}
protected ElementVisitor visitor = null ;
// ----
private RecursiveElementVisitor() { this.visitor = new ElementVisitorBase() ; }
public RecursiveElementVisitor(ElementVisitor visitor) { this.visitor = visitor ; }
// Visitor pattern on Elements
@Override
public final void visit(ElementTriplesBlock el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public final void visit(ElementDataset el)
{
startElement(el) ;
el.getElement().visit(this) ;
endElement(el) ;
}
@Override
public final void visit(ElementFilter el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public void visit(ElementAssign el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public void visit(ElementBind el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public void visit(ElementFind el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public void visit(ElementData el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public final void visit(ElementUnion el)
{
startElement(el) ;
for ( Element subElement : el.getElements() )
{
startSubElement(el, subElement) ;
subElement.visit(this) ;
endSubElement(el, subElement) ;
}
endElement(el) ;
}
@Override
public final void visit(ElementGroup el)
{
startElement(el) ;
for ( Element subElement : el.getElements() )
{
startSubElement(el, subElement) ;
subElement.visit(this) ;
endSubElement(el, subElement) ;
}
endElement(el) ;
}
@Override
public final void visit(ElementOptional el)
{
startElement(el) ;
el.getOptionalElement().visit(this) ;
endElement(el) ;
}
@Override
public final void visit(ElementNamedGraph el)
{
startElement(el) ;
el.getElement().visit(this) ;
endElement(el) ;
}
@Override
public final void visit(ElementService el)
{
startElement(el) ;
el.getElement().visit(this) ;
endElement(el) ;
}
@Override
public final void visit(ElementExists el)
{
startElement(el) ;
el.getElement().visit(this) ;
endElement(el) ;
}
@Override
public final void visit(ElementNotExists el)
{
startElement(el) ;
el.getElement().visit(this) ;
endElement(el) ;
}
@Override
public final void visit(ElementMinus el)
{
startElement(el) ;
el.getMinusElement().visit(this) ;
endElement(el) ;
}
@Override
public void visit(ElementSubQuery el)
{
startElement(el) ;
endElement(el) ;
}
@Override
public void visit(ElementPathBlock el)
{
startElement(el) ;
endElement(el) ;
}
}