/*
* eXist Open Source Native XML Database
* Copyright (C) 2000-04, Wolfgang M. Meier (wolfgang@exist-db.org)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This library 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 Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Id$
*/
package org.exist.collections;
import org.exist.Indexer;
import org.exist.Namespaces;
import org.exist.collections.triggers.DocumentTrigger;
import org.exist.collections.triggers.TriggerException;
import org.exist.dom.DocumentImpl;
import org.exist.storage.DBBroker;
import org.exist.storage.txn.Txn;
import org.exist.util.serializer.DOMStreamer;
import org.exist.xmldb.XmldbURI;
import org.xml.sax.ContentHandler;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.LexicalHandler;
/**
* Internal class used to track required fields between calls to
* {@link org.exist.collections.Collection#validateXMLResource(Txn, DBBroker, XmldbURI, InputSource)} and
* {@link org.exist.collections.Collection#store(Txn, DBBroker, IndexInfo, InputSource, boolean)}.
*
* @author wolf
*/
public class IndexInfo {
private Indexer indexer;
private DOMStreamer streamer;
private DocumentTrigger trigger;
private int event;
private CollectionConfiguration collectionConfig;
IndexInfo(Indexer indexer, CollectionConfiguration collectionConfig) {
this.indexer = indexer;
this.collectionConfig = collectionConfig;
}
public Indexer getIndexer() {
return indexer;
}
int getEvent() {
return event;
}
void setReader(XMLReader reader, EntityResolver entityResolver) throws SAXException {
if(entityResolver != null)
reader.setEntityResolver(entityResolver);
LexicalHandler lexicalHandler = trigger == null ? indexer : trigger.getLexicalInputHandler();
ContentHandler contentHandler = trigger == null ? indexer : trigger.getInputHandler();
reader.setProperty(Namespaces.SAX_LEXICAL_HANDLER, lexicalHandler);
reader.setContentHandler(contentHandler);
reader.setErrorHandler(indexer);
}
void setDOMStreamer(DOMStreamer streamer) {
this.streamer = streamer;
if (trigger == null) {
streamer.setContentHandler(indexer);
streamer.setLexicalHandler(indexer);
} else {
streamer.setContentHandler(trigger.getInputHandler());
streamer.setLexicalHandler(trigger.getLexicalInputHandler());
}
}
public DOMStreamer getDOMStreamer() {
return this.streamer;
}
public DocumentImpl getDocument() {
return indexer.getDocument();
}
public CollectionConfiguration getCollectionConfig() {
return collectionConfig;
}
void setTrigger(DocumentTrigger trigger, int event) {
this.trigger = trigger;
this.event = event;
}
DocumentTrigger getTrigger() {
return trigger;
}
void prepareTrigger(DBBroker broker, Txn transaction, XmldbURI docUri, DocumentImpl doc) throws TriggerException {
if (trigger == null) return;
trigger.setOutputHandler(indexer);
trigger.setLexicalOutputHandler(indexer);
trigger.setValidating(true);
trigger.prepare(event, broker, transaction, docUri, doc);
}
void postValidateTrigger() {
if (trigger == null) return;
trigger.setValidating(false);
}
void finishTrigger(DBBroker broker, Txn transaction, XmldbURI documentPath, DocumentImpl doc) {
if (trigger == null) return;
trigger.finish(event, broker, transaction, documentPath, doc);
}
}