/**
* Copyright 2015 Santhosh Kumar Tekuri
*
* The JLibs authors license 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 jlibs.examples.xml.sax.dog;
import jlibs.core.lang.OS;
import jlibs.xml.DefaultNamespaceContext;
import jlibs.xml.sax.SAXUtil;
import jlibs.xml.sax.dog.NodeItem;
import jlibs.xml.sax.dog.XMLDog;
import jlibs.xml.sax.dog.XPathResults;
import jlibs.xml.sax.dog.expr.EvaluationListener;
import jlibs.xml.sax.dog.expr.Expression;
import jlibs.xml.sax.dog.expr.InstantEvaluationListener;
import jlibs.xml.sax.dog.sniff.DOMBuilder;
import jlibs.xml.sax.dog.sniff.Event;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* @author Santhosh Kumar T
*/
public class XMLDogTest{
public static void main(String[] args) throws Exception{
boolean useSTAX = false;
boolean createDOM = false;
boolean instantResults = false;
final boolean printResults;
boolean _printResults = true;
String file = null;
for(String arg: args){
if("-dom".equalsIgnoreCase(arg))
createDOM = true;
if("-instantResults".equalsIgnoreCase(arg))
instantResults = true;
if("-dontPrintResults".equalsIgnoreCase(arg))
_printResults = false;
if("-useSTAX".equalsIgnoreCase(arg))
useSTAX = true;
else
file = arg;
}
printResults = _printResults;
if(file==null){
System.err.println("usage: xmldog."+(OS.get().isWindows()?"bat":"sh")+" [-dom] [-instantResults] [-dontPrintResults] [-useSTAX] <xml-file>");
System.exit(1);
}
System.out.println("Namespaces:");
final DefaultNamespaceContext nsContext = new DefaultNamespaceContext();
SAXUtil.newSAXParser(true, false, false).parse(new InputSource(file), new DefaultHandler(){
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException{
if(uri.length()>0 && prefix.length()==0)
prefix = "ns";
if(nsContext.getPrefix(uri)==null){
String _uri = nsContext.getNamespaceURI(prefix);
if(_uri!=null && _uri.length()>0){
int i = 1;
String _prefix;
if(prefix.length()==0)
prefix = "ns";
while(true){
_prefix = prefix + i;
if(nsContext.getNamespaceURI(_prefix)==null){
prefix = _prefix;
break;
}
i++;
}
}
nsContext.declarePrefix(prefix, uri);
System.out.println(prefix+"\t= "+uri);
}
}
});
String prefix = nsContext.declarePrefix("*");
System.out.println(prefix+"\t= *");
final XMLDog dog = new XMLDog(nsContext, null, null);
List<Expression> expressions = new ArrayList<Expression>();
System.out.println();
System.out.println("XPaths: (press CTRL+"+(OS.get().isUnix()?'D':'Z')+" after all xpaths are specified)");
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=console.readLine())!=null){
line = line.trim();
if(line.startsWith("#for-each ")){
int i = line.indexOf("#eval ");
String forEach = line.substring("#for-each ".length(), i);
String xpath = line.substring(i+"#eval ".length());
expressions.add(dog.addForEach(forEach, xpath));
}else if(line.length()>0)
expressions.add(dog.addXPath(line));
else
break;
}
System.out.println("+----------------------------------------+");
System.out.println("| XPath-Results |");
System.out.println("+----------------------------------------+");
System.out.println();
long time = System.nanoTime();
Event event = dog.createEvent();
if(createDOM)
event.setXMLBuilder(new DOMBuilder());
EvaluationListener listener;
if(instantResults){
listener = new InstantEvaluationListener(){
int nodeCounts[] = new int[dog.getDocumentXPathsCount()];
@Override
public void onNodeHit(Expression expression, NodeItem nodeItem){
if(printResults){
System.out.print("XPath: "+expression.getXPath()+" Node["+ ++nodeCounts[expression.id]+"]: ");
nodeItem.printTo(System.out);
System.out.println();
}
}
@Override
public void finishedNodeSet(Expression expression){
System.out.println("Finished Nodeset: "+expression.getXPath());
}
@Override
public void onResult(Expression expression, Object result){
if(printResults){
XPathResults.print(System.out, expression.getXPath(), result);
System.out.println();
}
}
};
}else
listener = new XPathResults(event);
event.setListener(listener);
dog.sniff(event, new InputSource(file), useSTAX);
time = System.nanoTime() - time;
if(printResults && listener instanceof XPathResults)
((XPathResults)listener).print(expressions, System.out);
System.err.println("Evaluated in "+(long)(time*1E-06)+" milliseconds");
if(printResults && instantResults)
System.err.println("Note: the above duration include the time to print results.");
}
}