package org.ariadne_eu.metadata.query; import org.apache.log4j.Logger; import org.ariadne.config.PropertiesManager; import org.ariadne_eu.metadata.query.language.QueryTranslationException; import org.ariadne_eu.metadata.query.language.TranslateLanguage; import org.ariadne_eu.utils.config.RepositoryConstants; import org.xmldb.api.DatabaseManager; import org.xmldb.api.base.Collection; import org.xmldb.api.base.Database; import org.xmldb.api.base.Resource; import org.xmldb.api.base.ResourceIterator; import org.xmldb.api.base.ResourceSet; import org.xmldb.api.base.XMLDBException; import org.xmldb.api.modules.XPathQueryService; /** * Created by ben * Date: 5-mei-2007 * Time: 16:37:14 * To change this template use File | Settings | File Templates. */ public class QueryMetadataExistDbImpl extends QueryMetadataImpl { private static Logger log = Logger.getLogger(QueryMetadataExistDbImpl.class); public QueryMetadataExistDbImpl() { } QueryMetadataExistDbImpl(int language) { setLanguage(language); initialize(); } private Collection collection; void initialize() { super.initialize(); try { String URI = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_URI + "." + getLanguage()); if (URI == null) URI = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_URI); try { // String driver = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_DRIVER + "." + getLanguage()); // if (driver == null) // driver = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_DRIVER); // Class cl = Class.forName(driver); Class cl = Class.forName("org.exist.xmldb.DatabaseImpl"); Database database = (Database)cl.newInstance(); DatabaseManager.registerDatabase(database); String username = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_USERNAME + "." + getLanguage()); if (username == null) username = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_USERNAME); String password = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_PASSWORD + "."+getLanguage()); if (password == null) password = PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().MD_DB_PASSWORD); collection = DatabaseManager.getCollection(URI, username, password); } catch (ClassNotFoundException e) { log.error("initialize: ", e); } catch (InstantiationException e) { log.error("initialize: ", e); } catch (IllegalAccessException e) { log.error("initialize: ", e); } catch (XMLDBException e) { e.printStackTrace(); } } catch (Throwable t) { log.error("initialize: ", t); } } public String xQuery(String xQuery) throws QueryMetadataException { try { XPathQueryService service = (XPathQueryService) collection.getService("XPathQueryService", "1.0"); service.setProperty("indent", "yes"); ResourceSet result = service.query(xQuery); ResourceIterator i = result.getIterator(); if (i.hasMoreResources()) { Resource r = i.nextResource(); return(String)r.getContent(); } } catch (XMLDBException e) { log.error("xQuery:xQuery="+xQuery, e); throw new QueryMetadataException(e); } log.error("xQuery:method didn't return answer, xQuery="+xQuery); return null; } public String query(String query, int start, int max, int resultsFormat) throws QueryTranslationException, QueryMetadataException { String xQuery = TranslateLanguage.translateToQuery(query, getLanguage(), TranslateLanguage.XQUERY, start, max, resultsFormat); return xQuery(xQuery); } public int count(String query) throws QueryTranslationException, QueryMetadataException { String xQuery = TranslateLanguage.translateToCount(query, getLanguage(), TranslateLanguage.XQUERY); return Integer.parseInt(xQuery(xQuery)); } }