1 package net.sf.openrocket.startup;
3 import java.io.InputStream;
4 import java.util.Collection;
5 import java.util.concurrent.CountDownLatch;
6 import java.util.concurrent.ExecutorService;
7 import java.util.concurrent.Executors;
8 import java.util.concurrent.ThreadFactory;
9 import java.util.concurrent.TimeUnit;
11 import net.sf.openrocket.database.ComponentPresetDatabase;
12 import net.sf.openrocket.file.iterator.DirectoryIterator;
13 import net.sf.openrocket.file.iterator.FileIterator;
14 import net.sf.openrocket.gui.util.SimpleFileFilter;
15 import net.sf.openrocket.logging.LogHelper;
16 import net.sf.openrocket.preset.ComponentPreset;
17 import net.sf.openrocket.preset.xml.OpenRocketComponentLoader;
18 import net.sf.openrocket.util.Pair;
20 public class ConcurrentComponentPresetDatabaseLoader {
22 private static final LogHelper log = Application.getLogger();
23 private static final String SYSTEM_PRESET_DIR = "datafiles/presets";
25 private final CountDownLatch latch = new CountDownLatch(1);
27 private final ComponentPresetDatabase componentPresetDao;
29 private final ExecutorService writerPool;
31 private final ExecutorService loaderPool;
33 private final Thread workGenerator;
35 private FileIterator iterator;
37 private long startTime;
38 private long fileCount = 0;
39 private long presetCount = 0;
41 ConcurrentComponentPresetDatabaseLoader( ComponentPresetDatabase componentPresetDao ) {
42 this.componentPresetDao = componentPresetDao;
44 writerPool = Executors.newSingleThreadExecutor(new ThreadFactory() {
46 public Thread newThread(Runnable r) {
47 Thread t = new Thread(r,"PresetWriterThread");
52 loaderPool = Executors.newFixedThreadPool(15, new ThreadFactory() {
55 public Thread newThread(Runnable r) {
56 Thread t = new Thread(r,"PresetLoaderPool-" + threadCount++);
62 workGenerator = new Thread( new WorkGenerator(),"PresetGeneratorThread");
66 startTime = System.currentTimeMillis();
67 workGenerator.start();
70 public void await() throws InterruptedException {
72 loaderPool.shutdown();
73 loaderPool.awaitTermination(30, TimeUnit.SECONDS);
74 writerPool.shutdown();
75 writerPool.awaitTermination(30, TimeUnit.SECONDS);
77 long end = System.currentTimeMillis();
78 log.debug("Time to load presets: " + (end-startTime) + "ms " + presetCount + " loaded from " + fileCount + " files");
82 private class WorkGenerator implements Runnable {
86 log.info("Loading component presets from " + SYSTEM_PRESET_DIR);
88 iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR,
89 new SimpleFileFilter("", false, "orc"));
91 if (iterator == null) {
92 throw new IllegalStateException("Component preset directory " + SYSTEM_PRESET_DIR +
93 " not found, distribution built wrong");
96 while( iterator.hasNext() ) {
97 Pair<String,InputStream> f = iterator.next();
98 FileLoader loader = new FileLoader( f.getV(), f.getU() );
99 loaderPool.execute(loader);
107 private class FileLoader implements Runnable {
108 private final InputStream is;
109 private final String fileName;
111 public FileLoader(InputStream is, String fileName) {
114 this.fileName = fileName;
119 OpenRocketComponentLoader loader = new OpenRocketComponentLoader();
120 Collection<ComponentPreset> presets = loader.load(is, fileName);
121 PresetWriter writer = new PresetWriter(presets);
122 writerPool.execute(writer);
126 private class PresetWriter implements Runnable {
127 private final Collection<ComponentPreset> presets;
129 public PresetWriter(Collection<ComponentPreset> presets) {
131 this.presets = presets;
136 presetCount += presets.size();
137 componentPresetDao.addAll(presets);