adds documentation for database package
This commit is contained in:
parent
f0ecd6f495
commit
3fc4c3799c
@ -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)
|
||||||
|
@ -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();
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user