/*
* eXist Open Source Native XML Database
* Copyright (C) 2001-07 The eXist Project
* http://exist-db.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id$
*/
package org.exist.validation.internal;
import org.apache.log4j.Logger;
import org.exist.security.User;
import org.exist.security.xacml.AccessContext;
import org.exist.source.ClassLoaderSource;
import org.exist.storage.BrokerPool;
import org.exist.storage.DBBroker;
import org.exist.xquery.CompiledXQuery;
import org.exist.xquery.XPathException;
import org.exist.xquery.XQuery;
import org.exist.xquery.XQueryContext;
import org.exist.xquery.value.Sequence;
import org.exist.xquery.value.SequenceIterator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Helper class for accessing grammars.
*
* @author Dannes Wessels (dizzzz@exist-db.org)
*/
public class DatabaseResources {
public final static String QUERY_LOCATION
= "org/exist/validation/internal/query/";
public final static String FIND_XSD
= QUERY_LOCATION + "find_schema_by_targetNamespace.xq";
public final static String FIND_CATALOGS_WITH_DTD
= QUERY_LOCATION + "find_catalogs_with_dtd.xq";
public final static String PUBLICID = "publicId";
public final static String TARGETNAMESPACE = "targetNamespace";
public final static String CATALOG = "catalog";
public final static String COLLECTION = "collection";
/** Local reference to database */
private BrokerPool brokerPool = null;
/** Local logger */
private final static Logger logger = Logger.getLogger(DatabaseResources.class);
/**
* Convert sequence into list of strings.
*
* @param sequence Result of query.
* @return List containing String objects.
*/
public List<String> getAllResults(Sequence sequence){
List<String> result = new ArrayList<String>();
try {
SequenceIterator i = sequence.iterate();
while(i.hasNext()){
String path = i.nextItem().getStringValue();
result.add(path);
}
} catch (XPathException ex) {
logger.error("xQuery issue.", ex);
result=null;
}
return result;
}
/**
* Get first entry of sequence as String.
*
* @param sequence Result of query.
* @return String containing representation of 1st entry of sequence.
*/
public String getFirstResult(Sequence sequence){
String result = null;
try {
SequenceIterator i = sequence.iterate();
if(i.hasNext()){
result= i.nextItem().getStringValue();
logger.debug("Single query result: '"+result+"'.");
} else {
logger.debug("No query result.");
}
} catch (XPathException ex) {
logger.error("xQuery issue ", ex);
}
return result;
}
public Sequence executeQuery(String queryPath, Map<String,String> params, User user){
String namespace = params.get(TARGETNAMESPACE);
String publicId = params.get(PUBLICID);
String catalogPath = params.get(CATALOG);
String collection = params.get(COLLECTION);
logger.debug("collection=" + collection + " namespace=" + namespace
+ " publicId="+publicId + " catalogPath="+catalogPath);
DBBroker broker = null;
Sequence result= null;
try {
broker = brokerPool.get(user);
CompiledXQuery compiled =null;
XQuery xquery = broker.getXQueryService();
XQueryContext context = xquery.newContext(AccessContext.INTERNAL_PREFIX_LOOKUP);
if(collection!=null){
context.declareVariable(COLLECTION, collection);
}
if(namespace!=null){
context.declareVariable(TARGETNAMESPACE, namespace);
}
if(publicId!=null){
context.declareVariable(PUBLICID, publicId);
}
if(catalogPath!=null){
context.declareVariable(CATALOG, catalogPath);
}
compiled = xquery.compile(context, new ClassLoaderSource(queryPath) );
result = xquery.execute(compiled, null);
} catch (Exception ex) {
logger.error("Problem executing xquery", ex);
result= null;
} finally{
if(brokerPool!=null){
brokerPool.release(broker);
}
}
return result;
}
/**
* Creates a new instance of DatabaseResources.
*
*
*
* @param pool Instance shared broker pool.
*/
public DatabaseResources(BrokerPool pool) {
logger.info("Initializing DatabaseResources");
this.brokerPool = pool;
}
public String findXSD(String collection, String targetNamespace, User user){
logger.debug("Find schema with namespace '"+targetNamespace+"' in '"+collection+"'.");
Map<String,String> params = new HashMap<String,String>();
params.put(COLLECTION, collection);
params.put(TARGETNAMESPACE, targetNamespace);
Sequence result = executeQuery(FIND_XSD, params, user );
return getFirstResult(result);
}
public String findCatalogWithDTD(String collection, String publicId, User user){
logger.debug("Find DTD with public '"+publicId+"' in '"+collection+"'.");
Map<String,String> params = new HashMap<String,String>();
params.put(COLLECTION, collection);
params.put(PUBLICID, publicId);
Sequence result = executeQuery(FIND_CATALOGS_WITH_DTD, params, user );
return getFirstResult(result);
}
}