diff --git a/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java b/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java index f1a28a866..e80a1e2fd 100644 --- a/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java +++ b/core/src/net/sf/openrocket/file/iterator/DirectoryIterator.java @@ -35,6 +35,7 @@ public class DirectoryIterator extends FileIterator { * * @param directory the directory to read. * @param filter the filter for selecting files. + * @param recursive true for recursive search * @throws IOException if the directory cannot be read. */ public DirectoryIterator(File directory, FileFilter filter, boolean recursive) diff --git a/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java b/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java index 2d1deb444..4ab2f4b15 100644 --- a/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java +++ b/swing/src/net/sf/openrocket/database/ComponentPresetDatabaseLoader.java @@ -19,6 +19,11 @@ import net.sf.openrocket.util.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * + * Loader that gets all component preset from the database in directory datafiles/preset + * + */ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader { private final static Logger log = LoggerFactory.getLogger(ComponentPresetDatabaseLoader.class); @@ -27,6 +32,7 @@ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader { private int fileCount = 0; private int presetCount = 0; + /** the database is immutable*/ private final ComponentPresetDatabase componentPresetDao = new ComponentPresetDatabase(); public ComponentPresetDatabaseLoader() { @@ -47,51 +53,72 @@ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader { @Override protected void loadDatabase() { long startTime = System.currentTimeMillis(); + loadPresetComponents(); + loadUserComponents(); + long end = System.currentTimeMillis(); + log.debug("Time to load presets: " + (end - startTime) + "ms " + presetCount + " loaded from " + fileCount + " files"); - log.info("Loading component presets from " + SYSTEM_PRESET_DIR); - - FileIterator iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR, new SimpleFileFilter("", false, "ser")); - - if (iterator != null) { - while (iterator.hasNext()) { - Pair f = iterator.next(); - try { - ObjectInputStream ois = new ObjectInputStream(f.getV()); - List list = (List) ois.readObject(); - componentPresetDao.addAll(list); - fileCount++; - presetCount += list.size(); - } catch (Exception ex) { - throw new BugException(ex); - } - } - } - + } + + /** + * loads the user defined defined components into the database + * uses the directory defined in the preferences + */ + private void loadUserComponents() { SimpleFileFilter orcFilter = new SimpleFileFilter("", false, "orc"); + FileIterator iterator; try { iterator = new DirectoryIterator( ((SwingPreferences) Application.getPreferences()).getDefaultUserComponentDirectory(), orcFilter, true); } catch (IOException ioex) { - iterator = null; log.debug("Error opening UserComponentDirectory", ioex); + return; } - if (iterator != null) { - while (iterator.hasNext()) { - Pair f = iterator.next(); - Collection presets = loadFile(f.getU(), f.getV()); - componentPresetDao.addAll(presets); + while (iterator.hasNext()) { + Pair f = iterator.next(); + Collection presets = loadFile(f.getU(), f.getV()); + componentPresetDao.addAll(presets); + fileCount++; + presetCount += presets.size(); + } + } + + /** + * loads the default preset components into the database + * uses the file directory from "datafiles/presets" + */ + private void loadPresetComponents() { + log.info("Loading component presets from " + SYSTEM_PRESET_DIR); + FileIterator iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR, new SimpleFileFilter("", false, "ser")); + + if(iterator == null) + return; + + while (iterator.hasNext()) { + Pair f = iterator.next(); + try { + ObjectInputStream ois = new ObjectInputStream(f.getV()); + @SuppressWarnings("unchecked") + List list = (List) ois.readObject(); + componentPresetDao.addAll(list); fileCount++; - presetCount += presets.size(); + presetCount += list.size(); + } catch (Exception ex) { + throw new BugException(ex); } } - - long end = System.currentTimeMillis(); - log.debug("Time to load presets: " + (end - startTime) + "ms " + presetCount + " loaded from " + fileCount + " files"); - } + /** + * load components from a custom component file + * uses an OpenRocketComponentLoader for the job + * + * @param fileName name of the file to be + * @param stream the input stream to the file + * @return a collection of components preset from the file + */ private Collection loadFile(String fileName, InputStream stream) { log.debug("loading from file: " + fileName); OpenRocketComponentLoader loader = new OpenRocketComponentLoader(); diff --git a/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java b/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java index 19ef8bd18..47b1f3f28 100644 --- a/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java +++ b/swing/src/net/sf/openrocket/database/MotorDatabaseLoader.java @@ -17,7 +17,6 @@ import net.sf.openrocket.file.iterator.FileIterator; import net.sf.openrocket.file.motor.GeneralMotorLoader; import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SwingPreferences; -import net.sf.openrocket.motor.Motor; import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.BugException; @@ -40,7 +39,9 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { private final ThrustCurveMotorSetDatabase database = new ThrustCurveMotorSetDatabase(); private int motorCount = 0; - + /** + * sole constructor, default startup delay = 0 + */ public MotorDatabaseLoader() { super(STARTUP_DELAY); } @@ -48,19 +49,18 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { @Override protected void loadDatabase() { - + loadSerializedMotorDatabase(); + loadUserDefinedMotors(); + } + + + /** + * Loads the user defined motors + * the directories are defined in the preferences + */ + private void loadUserDefinedMotors() { GeneralMotorLoader loader = new GeneralMotorLoader(); SimpleFileFilter fileFilter = new SimpleFileFilter("", loader.getSupportedExtensions()); - - log.info("Starting reading serialized motor database"); - FileIterator iterator = DirectoryIterator.findDirectory(THRUSTCURVE_DIRECTORY, new SimpleFileFilter("", false, "ser")); - while (iterator.hasNext()) { - Pair f = iterator.next(); - loadSerialized(f); - } - log.info("Ending reading serialized motor database, motorCount=" + motorCount); - - log.info("Starting reading user-defined motors"); for (File file : ((SwingPreferences) Application.getPreferences()).getUserThrustCurveFiles()) { if (file.isFile()) { @@ -72,11 +72,29 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { } } log.info("Ending reading user-defined motors, motorCount=" + motorCount); - + } + + + /** + * Loads the default, with established serialized manufacturing and data + * uses directory "datafiles/thrustcurves" for data + */ + private void loadSerializedMotorDatabase() { + log.info("Starting reading serialized motor database"); + FileIterator iterator = DirectoryIterator.findDirectory(THRUSTCURVE_DIRECTORY, new SimpleFileFilter("", false, "ser")); + while (iterator.hasNext()) { + Pair f = iterator.next(); + loadSerialized(f); + } + log.info("Ending reading serialized motor database, motorCount=" + motorCount); } - + /** + * loads a serailized motor data from an stream + * + * @param f the pair of a String with the filename (for logging) and the input stream + */ @SuppressWarnings("unchecked") private void loadSerialized(Pair f) { try { @@ -89,27 +107,52 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { } } - + /** + * loads a single motor file into the database using a simple file handler object + * + * @param loader the motor loading handler object + * @param file the File to the file itself + */ private void loadFile(GeneralMotorLoader loader, File file) { - BufferedInputStream bis = null; try { log.debug("Loading motors from file " + file); - bis = new BufferedInputStream(new FileInputStream(file)); - List motors = loader.load(bis, file.getName()); - addMotorsFromBuilders(motors); - bis.close(); + loadFile( + loader, + new Pair( + file.getName(), + new BufferedInputStream(new FileInputStream(file)))); } catch (IOException e) { log.warn("IOException while reading " + file + ": " + e, e); - if (bis != null) { - try { - bis.close(); - } catch (IOException e1) { - - } + } + } + + /** + * loads a single motor file into the database using inputStream instead of file object + * + * @param loader an object to handle the loading + * @param f the pair of File name and its input stream + */ + private void loadFile(GeneralMotorLoader loader, Pair f) { + try { + List motors = loader.load(f.getV(), f.getU()); + addMotorsFromBuilders(motors); + f.getV().close(); + } catch (IOException e) { + log.warn("IOException while loading file " + f.getU() + ": " + e, e); + try { + f.getV().close(); + } catch (IOException e1) { } } } + /** + * loads an entire directory of motor files + * + * @param loader a motor loading handler object + * @param fileFilter the supported extensions of files + * @param file the directory file object + */ private void loadDirectory(GeneralMotorLoader loader, SimpleFileFilter fileFilter, File file) { FileIterator iterator; try { @@ -119,21 +162,17 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { return; } while (iterator.hasNext()) { - Pair f = iterator.next(); - try { - List motors = loader.load(f.getV(), f.getU()); - addMotorsFromBuilders(motors); - f.getV().close(); - } catch (IOException e) { - log.warn("IOException while loading file " + f.getU() + ": " + e, e); - try { - f.getV().close(); - } catch (IOException e1) { - } - } + loadFile(loader, iterator.next()); } } + + + + /** + * adds a motor list into the database + * @param motors the list of motors to be added + */ private synchronized void addMotors(List motors) { for (ThrustCurveMotor m : motors) { motorCount++; @@ -141,8 +180,13 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader { } } - private synchronized void addMotorsFromBuilders(List motors) { - for (ThrustCurveMotor.Builder m : motors) { + /** + * builds the motors while building them + * + * @param motorBuilders List of motor builders to be used for adding motor into the database + */ + private synchronized void addMotorsFromBuilders(List motorBuilders) { + for (ThrustCurveMotor.Builder m : motorBuilders) { motorCount++; database.addMotor(m.build()); }