/**
* Copyright (C) 2010 Orbeon, Inc.
*
* 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.1 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.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.processor.impl;
import org.orbeon.oxf.pipeline.api.PipelineContext;
import org.orbeon.oxf.xml.XMLReceiver;
import org.orbeon.oxf.processor.*;
/**
* This special input is able to handle dependencies on URLs.
*/
public abstract class DependenciesProcessorInput extends DelegatingProcessorInput {
public DependenciesProcessorInput(ProcessorImpl processor, String originalName, ProcessorInput originalInput) {
super(processor, originalName);
// Custom processor handling input dependencies
final ProcessorImpl dependencyProcessor = new ProcessorImpl() {
@Override
public ProcessorOutput createOutput(String outputName) {
final ProcessorOutput output = new URIProcessorOutputImpl(this, outputName, INPUT_CONFIG) {
@Override
protected void readImpl(PipelineContext pipelineContext, final XMLReceiver xmlReceiver) {
final boolean[] foundInCache = new boolean[] { false };
readCacheInputAsObject(pipelineContext, getInputByName(INPUT_CONFIG), new CacheableInputReader<URIProcessorOutputImpl.URIReferences>() {
@Override
public URIProcessorOutputImpl.URIReferences read(PipelineContext pipelineContext, ProcessorInput processorInput) {
// Read the input directly into the output
readInputAsSAX(pipelineContext, processorInput, xmlReceiver);
// Return dependencies object
return getURIReferences(pipelineContext);
}
@Override
public void foundInCache() {
foundInCache[0] = true;
}
});
// Finding the dependencies in cache doesn't mean we don't read to the output: after all,
// we were asked to.
if (foundInCache[0]) {
readInputAsSAX(pipelineContext, getInputByName(INPUT_CONFIG), xmlReceiver);
}
}
};
addOutput(outputName, output);
return output;
}
};
// Create data input and output
final ProcessorInput dependencyInput = dependencyProcessor.createInput(ProcessorImpl.INPUT_CONFIG);
final ProcessorOutput dependencyOutput = dependencyProcessor.createOutput(ProcessorImpl.OUTPUT_DATA);
setDelegateInput(dependencyInput);
setDelegateOutput(dependencyOutput);
// Connect output of dependency processor to original input
{
dependencyOutput.setInput(originalInput);
originalInput.setOutput(dependencyOutput);
}
}
/**
* Get URI references on which this input depends. This is called right after the original input has been read.
*
* @param pipelineContext current context
* @return URI references
*/
protected abstract URIProcessorOutputImpl.URIReferences getURIReferences(PipelineContext pipelineContext);
}