package org.ariadne_eu.metadata.query.language;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.apache.log4j.Logger;
import org.apache.xpath.XPathAPI;
import org.ariadne_eu.metadata.query.language.plql_xquery.Plql_XQueryHandler;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Created by ben
* Date: 5-mei-2007
* Time: 17:28:38
* To change this template use File | Settings | File Templates.
*/
public class Vsql_XQueryHandler extends Translate {
private static Logger log = Logger.getLogger(Vsql_XQueryHandler.class);
public Vsql_XQueryHandler(int startQueryLanguage, int endQueryLanguage) {
super(startQueryLanguage, endQueryLanguage);
}
public String translateToQuery(String query, int startResult, int nbResults, int resultsFormat) throws QueryTranslationException {
if (getStartQueryLanguage() != TranslateLanguage.VSQL && getEndQueryLanguage() != TranslateLanguage.XQUERY)
throw new QueryTranslationException();
try {
return new Plql_XQueryHandler(TranslateLanguage.PLQL0, getEndQueryLanguage()).translateToQuery(vsqlToPLQL(query), startResult, nbResults, resultsFormat);
} catch (QueryTranslationException e) {
log.error(e);
return null;
}
}
public String translateToCount(String query) throws QueryTranslationException {
if (getStartQueryLanguage() != TranslateLanguage.VSQL && getEndQueryLanguage() != TranslateLanguage.XQUERY)
throw new QueryTranslationException();
try {
return new Plql_XQueryHandler(TranslateLanguage.PLQL0, getEndQueryLanguage()).translateToCount(vsqlToPLQL(query));
} catch (QueryTranslationException e) {
log.error(e);
return null;
}
}
private String vsqlToPLQL(String query) {
try {
InputSource input = new InputSource(new StringReader(query));
Node queryNode = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(input).getFirstChild();
NodeList nl = XPathAPI.selectNodeList(queryNode, "term/text()");
String plql = "";
for (int i = 0; i < nl.getLength(); i++) {
String term =nl.item(i).getNodeValue();
if (i == 0)
plql += "\"" + term + "\"";
else
plql += " and \"" + term + "\"";
}
log.debug("vsqlToPLQL:translated \"" + query + "\" to \"" + plql + "\"");
return plql;
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
return null;
}
}