Try to use Java Serializable to improve loading of included

ComponentPresets.
This commit is contained in:
kruland2607 2012-10-08 16:37:02 -05:00
parent 78e3931c9e
commit 7f6c542e5d
13 changed files with 290 additions and 133 deletions

View File

@ -68,7 +68,7 @@
</target>
<!-- Executible Eclipse-Jar-In-Jar style JAR -->
<target name="jar" depends="core-jar" description="Create the OpenRocket jar-in-jar Executable">
<target name="jar" depends="core-jar,serialize-presets" description="Create the OpenRocket jar-in-jar Executable">
<mkdir dir="${jar.dir}" />
<jar destfile="${jar.file}">
<manifest>
@ -104,7 +104,13 @@
</jar>
</target>
<target name="serialize-presets" depends="core-jar" description="Preprocess the orc preset files into serialized form">
<java classname="net.sf.openrocket.startup.SerializePresets"
fork="true"
classpathref="run-classpath"
failonerror="true">
</java>
</target>
<!-- Core OpenRocket JAR -->
<target name="core-jar" depends="build" description="Create the OpenRocket code-only jar file">
<jar destfile="${build.dir}/${ant.project.name}-Core.jar" basedir="${dist.dir}">
@ -126,7 +132,7 @@
classpathref="run-classpath"
failonerror="true">
<arg value="@{dir}"/>
<arg value="resources/datafiles/presets/@{vendor}.orc"/>
<arg value="resources-src/datafiles/presets/@{vendor}.orc"/>
</java>
</sequential>
</macrodef>

Binary file not shown.

View File

@ -2,6 +2,11 @@ package net.sf.openrocket.preset;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Arrays;
@ -10,6 +15,7 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.motor.Manufacturer;
@ -28,7 +34,7 @@ import net.sf.openrocket.util.TextUtil;
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class ComponentPreset implements Comparable<ComponentPreset> {
public class ComponentPreset implements Comparable<ComponentPreset>, Serializable {
private final TypedPropertyMap properties = new TypedPropertyMap();
@ -374,4 +380,69 @@ public class ComponentPreset implements Comparable<ComponentPreset> {
}
}
private static class MaterialDTO implements Serializable {
String name;
String type;
boolean userDefined;
Double density;
}
private void writeObject( ObjectOutputStream oos ) throws IOException {
Map<String,Object> DTO = new HashMap<String,Object>();
for ( Entry<TypedKey<?>, Object> entry :properties.entrySet() ) {
TypedKey<?> key = entry.getKey();
Object value = entry.getValue();
String keyName = key.getName();
if ( MANUFACTURER.getName().equals(keyName) ) {
value = ((Manufacturer) value).getDisplayName();
} else if ( value instanceof Material ) {
Material material = (Material) value;
MaterialDTO m = new MaterialDTO();
m.name = material.getName();
m.type = material.getType().name();
m.density = material.getDensity();
m.userDefined = material.isUserDefined();
value = m;
}
DTO.put(keyName,value);
}
oos.writeObject(DTO);
}
private void readObject( ObjectInputStream ois ) throws IOException, ClassNotFoundException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Map<String,Object> DTO = (Map<String,Object>) ois.readObject();
Field propField = ComponentPreset.class.getDeclaredField("properties");
propField.setAccessible(true);
propField.set(this, new TypedPropertyMap());
for ( Entry<String,Object> entry : DTO.entrySet() ) {
String keyName = entry.getKey();
Object value = entry.getValue();
if ( MANUFACTURER.getName().equals(keyName)) {
value = Manufacturer.getManufacturer((String) value);
} else if ( value instanceof MaterialDTO ) {
MaterialDTO m = (MaterialDTO) value;
value = Material.newMaterial(Material.Type.valueOf(m.type), m.name, m.density, m.userDefined);
}
if ( TYPE.getName().equals(keyName)) {
this.properties.put(TYPE, (ComponentPreset.Type) value);
} else {
for( TypedKey k : ORDERED_KEY_LIST ) {
if ( k.getName().equals(keyName)) {
this.properties.put( k, value );
break;
}
}
}
}
this.computeDigest();
}
}

View File

@ -2,7 +2,9 @@ package net.sf.openrocket.startup;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -17,6 +19,7 @@ import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.xml.OpenRocketComponentLoader;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Pair;
public class ConcurrentComponentPresetDatabaseLoader {
@ -90,19 +93,26 @@ public class ConcurrentComponentPresetDatabaseLoader {
// Start loading
log.info("Loading component presets from " + SYSTEM_PRESET_DIR);
SimpleFileFilter orcFilter = new SimpleFileFilter("", false, "orc");
iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR, orcFilter);
iterator = DirectoryIterator.findDirectory(SYSTEM_PRESET_DIR, new SimpleFileFilter("",false,"ser"));
if (iterator != null) {
while( iterator.hasNext() ) {
Pair<String,InputStream> f = iterator.next();
FileLoader loader = new FileLoader( f.getV(), f.getU() );
loaderPool.execute(loader);
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);
}
}
}
try {
SimpleFileFilter orcFilter = new SimpleFileFilter("", false, "orc");
iterator = new DirectoryIterator(
((SwingPreferences) Application.getPreferences()).getDefaultUserComponentDirectory(),
orcFilter,

View File

@ -0,0 +1,70 @@
package net.sf.openrocket.startup;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.util.Collection;
import java.util.List;
import net.sf.openrocket.database.ComponentPresetDatabase;
import net.sf.openrocket.file.iterator.DirectoryIterator;
import net.sf.openrocket.file.iterator.FileIterator;
import net.sf.openrocket.gui.util.SimpleFileFilter;
import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.xml.OpenRocketComponentLoader;
import net.sf.openrocket.util.Pair;
public class SerializePresets {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
Application.setPreferences( new SwingPreferences() );
ComponentPresetDatabase componentPresetDao = new ComponentPresetDatabase() {
@Override
protected void load() {
FileIterator iterator = DirectoryIterator.findDirectory("resources-src/datafiles/presets", new SimpleFileFilter("",false,"orc"));
if ( iterator == null ) {
throw new RuntimeException("Can't find resources-src/presets directory");
}
while( iterator.hasNext() ) {
Pair<String,InputStream> f = iterator.next();
String fileName = f.getU();
InputStream is = f.getV();
OpenRocketComponentLoader loader = new OpenRocketComponentLoader();
Collection<ComponentPreset> presets = loader.load(is, fileName);
this.addAll(presets);
}
}
};
componentPresetDao.startLoading();
List<ComponentPreset> list = componentPresetDao.listAll();
Application.getLogger().info("Total number of presets = " + list.size());
File outFile = new File("resources/datafiles/presets","system.ser");
FileOutputStream ofs = new FileOutputStream(outFile);
ObjectOutputStream oos = new ObjectOutputStream(ofs);
oos.writeObject(list);
ofs.flush();
ofs.close();
}
}