package org.osmtools.dataimport; import java.io.InputStream; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.helpers.DefaultHandler; public class ImportHandler<T> implements Runnable { private int defaultQueueSize = 10; private InputStream inputStream; private Consumer<T> consumer; private BlockingQueueDefaultHandler<T> producer; public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } public void setConsumer(Consumer<T> consumer) { this.consumer = consumer; } public void setProducer(BlockingQueueDefaultHandler<T> producer) { this.producer = producer; } public void setDefaultQueueSize(int defaultQueueSize) { this.defaultQueueSize = defaultQueueSize; } @Override public void run() { BlockingQueue<T> queue = new LinkedBlockingDeque<T>(defaultQueueSize); consumer.setQueue(queue); producer.setQueue(queue); Thread thread = new Thread(consumer); thread.start(); parse(inputStream, producer); consumer.producerFinished(); try { synchronized (thread) { while (thread.isAlive()) { thread.wait(1); } } } catch (InterruptedException e) { } } protected void parse(InputStream is, DefaultHandler producer) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(is, producer); } catch (Exception e) { throw new RuntimeException(e); } } }