/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.index.config;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.transform.JDOMSource;
import net.sf.saxon.om.Item;
import net.sf.saxon.sxpath.XPathEvaluator;
import net.sf.saxon.sxpath.XPathExpression;
/**
* This class implements a xpath 2.0 evaluator that is used to evaluate index paths.
*/
public final class IndexPathEvaluator
{
/**
* Shared evaluator.
*/
private final static IndexPathEvaluator SHARED_EVALUATOR = new IndexPathEvaluator();
/**
* Evaluator instance.
*/
private final XPathEvaluator evaluator;
/**
* Constructs the evaluator.
*/
public IndexPathEvaluator()
{
this.evaluator = new XPathEvaluator();
}
/**
* Evaluate the xpath on specified document.
*/
public List<String> evaluate( String xpath, Document doc )
{
try
{
return doEvaluate( xpath, doc );
}
catch ( Exception e )
{
throw new IndexPathException( e );
}
}
/**
* Internal evaluator method.
*/
private List<String> doEvaluate( String xpath, Document doc )
throws Exception
{
ArrayList<String> values = new ArrayList<String>();
XPathExpression expr = this.evaluator.createExpression( xpath );
List result = expr.evaluate( new JDOMSource( doc ) );
for ( Object o : result )
{
if ( o instanceof Item )
{
values.add( ( (Item) o ).getStringValue() );
}
else
{
values.add( o.toString() );
}
}
return values;
}
/**
* Evaluate xpath based on shared instance. For more speed.
*/
public static List<String> evaluateShared( String xpath, Document doc )
{
synchronized ( SHARED_EVALUATOR )
{
return SHARED_EVALUATOR.evaluate( xpath, doc );
}
}
}