/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.neo.loader.core.parser.impl.internal;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.amanzi.neo.loader.core.IData;
import org.amanzi.neo.loader.core.IMultiFileConfiguration;
import org.amanzi.neo.loader.core.ISingleFileConfiguration;
import org.amanzi.neo.loader.core.parser.IParser;
import org.amanzi.neo.loader.core.parser.IParser.IFileParsingStartedListener;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
/**
* TODO Purpose of
* <p>
* </p>
*
* @author Nikolay Lagutko (nikolay.lagutko@amanzitel.com)
* @since 1.0.0
*/
public abstract class MultiStreamParser<S extends ISingleFileConfiguration, P extends IParser<S, D>, C extends IMultiFileConfiguration, D extends IData>
extends
AbstractParser<C, D> implements IFileParsingStartedListener {
private final class ParserIterator implements Iterator<P> {
private final Iterator<File> fileIterator;
public ParserIterator(final Iterator<File> fileIterator) {
this.fileIterator = fileIterator;
}
@Override
public boolean hasNext() {
return fileIterator.hasNext();
}
@Override
public P next() {
return createParser(fileIterator.next());
}
@Override
public void remove() {
fileIterator.remove();
}
}
private ParserIterator parserIterator;
private P currentParser;
@Override
public void init(final C configuration) {
super.init(configuration);
parserIterator = new ParserIterator(configuration.getFileIterator());
}
@Override
protected D parseNextElement() throws IOException {
if (currentParser != null && currentParser.hasNext()) {
return currentParser.next();
} else {
if (parserIterator.hasNext()) {
parserIterator.next();
return parseNextElement();
}
}
return null;
}
private P createParser(final File file) {
currentParser = createParserInstance();
S configuration = createSingleFileConfiguration(file, getConfiguration());
currentParser.init(configuration);
currentParser.addFileParsingListener(this);
SubProgressMonitor monitor = new SubProgressMonitor(getProgressMonitor(), 1);
currentParser.setProgressMonitor(file.getName(), monitor);
getProgressMonitor().subTask(file.getName());
return currentParser;
}
protected abstract P createParserInstance();
protected abstract S createSingleFileConfiguration(File file, C configuration);
@Override
public void onFileParsingStarted(final File file) {
onNewFileParsingStarted(file);
}
@Override
public void setProgressMonitor(final String monitorName, final IProgressMonitor monitor) {
monitor.beginTask(monitorName, getConfiguration().getFileCount());
super.setProgressMonitor(monitorName, monitor);
}
@Override
protected File getFileFromConfiguration(final IMultiFileConfiguration configuration) {
return null;
}
protected P getCurrentParser() {
return currentParser;
}
}