adds documentation for database package

This commit is contained in:
Luiz Victor Linhares Rocha 2016-10-24 14:48:05 -02:00
parent f0ecd6f495
commit 3fc4c3799c
3 changed files with 143 additions and 71 deletions

View File

@ -35,6 +35,7 @@ public class DirectoryIterator extends FileIterator {
* *
* @param directory the directory to read. * @param directory the directory to read.
* @param filter the filter for selecting files. * @param filter the filter for selecting files.
* @param recursive true for recursive search
* @throws IOException if the directory cannot be read. * @throws IOException if the directory cannot be read.
*/ */
public DirectoryIterator(File directory, FileFilter filter, boolean recursive) public DirectoryIterator(File directory, FileFilter filter, boolean recursive)

View File

@ -19,6 +19,11 @@ import net.sf.openrocket.util.Pair;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/**
*
* Loader that gets all component preset from the database in directory datafiles/preset
*
*/
public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader { public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader {
private final static Logger log = LoggerFactory.getLogger(ComponentPresetDatabaseLoader.class); private final static Logger log = LoggerFactory.getLogger(ComponentPresetDatabaseLoader.class);
@ -27,6 +32,7 @@ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader {
private int fileCount = 0; private int fileCount = 0;
private int presetCount = 0; private int presetCount = 0;
/** the database is immutable*/
private final ComponentPresetDatabase componentPresetDao = new ComponentPresetDatabase(); private final ComponentPresetDatabase componentPresetDao = new ComponentPresetDatabase();
public ComponentPresetDatabaseLoader() { public ComponentPresetDatabaseLoader() {
@ -47,51 +53,72 @@ public class ComponentPresetDatabaseLoader extends AsynchronousDatabaseLoader {
@Override @Override
protected void loadDatabase() { protected void loadDatabase() {
long startTime = System.currentTimeMillis(); 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")); /**
* loads the user defined defined components into the database
if (iterator != null) { * uses the directory defined in the preferences
while (iterator.hasNext()) { */
Pair<String, InputStream> f = iterator.next(); private void loadUserComponents() {
try {
ObjectInputStream ois = new ObjectInputStream(f.getV());
List<ComponentPreset> list = (List<ComponentPreset>) ois.readObject();
componentPresetDao.addAll(list);
fileCount++;
presetCount += list.size();
} catch (Exception ex) {
throw new BugException(ex);
}
}
}
SimpleFileFilter orcFilter = new SimpleFileFilter("", false, "orc"); SimpleFileFilter orcFilter = new SimpleFileFilter("", false, "orc");
FileIterator iterator;
try { try {
iterator = new DirectoryIterator( iterator = new DirectoryIterator(
((SwingPreferences) Application.getPreferences()).getDefaultUserComponentDirectory(), ((SwingPreferences) Application.getPreferences()).getDefaultUserComponentDirectory(),
orcFilter, orcFilter,
true); true);
} catch (IOException ioex) { } catch (IOException ioex) {
iterator = null;
log.debug("Error opening UserComponentDirectory", ioex); log.debug("Error opening UserComponentDirectory", ioex);
return;
} }
if (iterator != null) { while (iterator.hasNext()) {
while (iterator.hasNext()) { Pair<String, InputStream> f = iterator.next();
Pair<String, InputStream> f = iterator.next(); Collection<ComponentPreset> presets = loadFile(f.getU(), f.getV());
Collection<ComponentPreset> presets = loadFile(f.getU(), f.getV()); componentPresetDao.addAll(presets);
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<String, InputStream> f = iterator.next();
try {
ObjectInputStream ois = new ObjectInputStream(f.getV());
@SuppressWarnings("unchecked")
List<ComponentPreset> list = (List<ComponentPreset>) ois.readObject();
componentPresetDao.addAll(list);
fileCount++; 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<ComponentPreset> loadFile(String fileName, InputStream stream) { private Collection<ComponentPreset> loadFile(String fileName, InputStream stream) {
log.debug("loading from file: " + fileName); log.debug("loading from file: " + fileName);
OpenRocketComponentLoader loader = new OpenRocketComponentLoader(); OpenRocketComponentLoader loader = new OpenRocketComponentLoader();

View File

@ -17,7 +17,6 @@ import net.sf.openrocket.file.iterator.FileIterator;
import net.sf.openrocket.file.motor.GeneralMotorLoader; import net.sf.openrocket.file.motor.GeneralMotorLoader;
import net.sf.openrocket.gui.util.SimpleFileFilter; import net.sf.openrocket.gui.util.SimpleFileFilter;
import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.ThrustCurveMotor; import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
@ -40,7 +39,9 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader {
private final ThrustCurveMotorSetDatabase database = new ThrustCurveMotorSetDatabase(); private final ThrustCurveMotorSetDatabase database = new ThrustCurveMotorSetDatabase();
private int motorCount = 0; private int motorCount = 0;
/**
* sole constructor, default startup delay = 0
*/
public MotorDatabaseLoader() { public MotorDatabaseLoader() {
super(STARTUP_DELAY); super(STARTUP_DELAY);
} }
@ -48,19 +49,18 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader {
@Override @Override
protected void loadDatabase() { protected void loadDatabase() {
loadSerializedMotorDatabase();
loadUserDefinedMotors();
}
/**
* Loads the user defined motors
* the directories are defined in the preferences
*/
private void loadUserDefinedMotors() {
GeneralMotorLoader loader = new GeneralMotorLoader(); GeneralMotorLoader loader = new GeneralMotorLoader();
SimpleFileFilter fileFilter = new SimpleFileFilter("", loader.getSupportedExtensions()); 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<String, InputStream> f = iterator.next();
loadSerialized(f);
}
log.info("Ending reading serialized motor database, motorCount=" + motorCount);
log.info("Starting reading user-defined motors"); log.info("Starting reading user-defined motors");
for (File file : ((SwingPreferences) Application.getPreferences()).getUserThrustCurveFiles()) { for (File file : ((SwingPreferences) Application.getPreferences()).getUserThrustCurveFiles()) {
if (file.isFile()) { if (file.isFile()) {
@ -72,11 +72,29 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader {
} }
} }
log.info("Ending reading user-defined motors, motorCount=" + motorCount); 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<String, InputStream> 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") @SuppressWarnings("unchecked")
private void loadSerialized(Pair<String, InputStream> f) { private void loadSerialized(Pair<String, InputStream> f) {
try { 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) { private void loadFile(GeneralMotorLoader loader, File file) {
BufferedInputStream bis = null;
try { try {
log.debug("Loading motors from file " + file); log.debug("Loading motors from file " + file);
bis = new BufferedInputStream(new FileInputStream(file)); loadFile(
List<ThrustCurveMotor.Builder> motors = loader.load(bis, file.getName()); loader,
addMotorsFromBuilders(motors); new Pair<String,InputStream>(
bis.close(); file.getName(),
new BufferedInputStream(new FileInputStream(file))));
} catch (IOException e) { } catch (IOException e) {
log.warn("IOException while reading " + file + ": " + e, 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<String, InputStream> f) {
try {
List<ThrustCurveMotor.Builder> 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) { private void loadDirectory(GeneralMotorLoader loader, SimpleFileFilter fileFilter, File file) {
FileIterator iterator; FileIterator iterator;
try { try {
@ -119,21 +162,17 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader {
return; return;
} }
while (iterator.hasNext()) { while (iterator.hasNext()) {
Pair<String, InputStream> f = iterator.next(); loadFile(loader, iterator.next());
try {
List<ThrustCurveMotor.Builder> 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) {
}
}
} }
} }
/**
* adds a motor list into the database
* @param motors the list of motors to be added
*/
private synchronized void addMotors(List<ThrustCurveMotor> motors) { private synchronized void addMotors(List<ThrustCurveMotor> motors) {
for (ThrustCurveMotor m : motors) { for (ThrustCurveMotor m : motors) {
motorCount++; motorCount++;
@ -141,8 +180,13 @@ public class MotorDatabaseLoader extends AsynchronousDatabaseLoader {
} }
} }
private synchronized void addMotorsFromBuilders(List<ThrustCurveMotor.Builder> 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<ThrustCurveMotor.Builder> motorBuilders) {
for (ThrustCurveMotor.Builder m : motorBuilders) {
motorCount++; motorCount++;
database.addMotor(m.build()); database.addMotor(m.build());
} }