Rework the AttachmentFactory and Attachments. Make the Attachment
implementations stand on their own and be able to determine the location of their bytes without needing a reference back to the AttachmentFactory. This required changing the loading semantics so the OpenRocketDocument is created prior to beginning to read the xml file. Added an OpenRocketDocumentFactory to facilitate construction of OpenRocketDocument objects.
This commit is contained in:
parent
c59bdd31cd
commit
48adc0b7bf
@ -4,7 +4,7 @@ import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface Attachment {
|
||||
public interface Attachment extends Comparable<Attachment> {
|
||||
|
||||
public abstract String getName();
|
||||
|
||||
|
@ -1,135 +0,0 @@
|
||||
package net.sf.openrocket.document;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
import net.sf.openrocket.file.FileInfo;
|
||||
import net.sf.openrocket.util.FileUtils;
|
||||
|
||||
public class BaseAttachmentFactory implements AttachmentFactory<BaseAttachmentFactory.BaseAttachment> {
|
||||
|
||||
private FileInfo fileInfo;
|
||||
private boolean isZipFile = false;
|
||||
|
||||
public void setBaseFile(FileInfo fileInfo) {
|
||||
this.fileInfo = fileInfo;
|
||||
}
|
||||
|
||||
public void setIsZipFile(boolean isZipFile) {
|
||||
this.isZipFile = isZipFile;
|
||||
}
|
||||
|
||||
public class BaseAttachment implements Attachment, Comparable {
|
||||
|
||||
protected String name;
|
||||
|
||||
BaseAttachment(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getBytes() throws FileNotFoundException, IOException {
|
||||
return BaseAttachmentFactory.this.getBytes(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Object o) {
|
||||
if (!(o instanceof BaseAttachment)) {
|
||||
return -1;
|
||||
}
|
||||
return this.name.compareTo(((BaseAttachment) o).name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseAttachment getAttachment(String name) {
|
||||
return new BaseAttachment(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns an InputStream backed by a byte[] containing the decal pixels.
|
||||
* If it reads in the bytes from an actual file, the underlying file is closed.
|
||||
*
|
||||
* @param name
|
||||
* @return
|
||||
* @throws FileNotFoundException
|
||||
* @throws IOException
|
||||
*/
|
||||
private InputStream getBytes(BaseAttachment attachment) throws FileNotFoundException, IOException {
|
||||
|
||||
// This is the InputStream to be returned.
|
||||
InputStream rawIs = null;
|
||||
|
||||
|
||||
String name = attachment.getName();
|
||||
|
||||
if (rawIs == null && isZipFile) {
|
||||
rawIs = findInZipContainer(name);
|
||||
}
|
||||
|
||||
// Try relative to the model file directory. This is so we can support unzipped container format.
|
||||
if (rawIs == null) {
|
||||
if (fileInfo != null && fileInfo.getDirectory() != null) {
|
||||
File decalFile = new File(fileInfo.getDirectory(), name);
|
||||
rawIs = new FileInputStream(decalFile);
|
||||
}
|
||||
}
|
||||
|
||||
if (rawIs == null) {
|
||||
throw new FileNotFoundException("Unable to locate decal for name " + name);
|
||||
}
|
||||
|
||||
try {
|
||||
byte[] bytes = FileUtils.readBytes(rawIs);
|
||||
return new ByteArrayInputStream(bytes);
|
||||
} finally {
|
||||
rawIs.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private ZipInputStream findInZipContainer(String name) {
|
||||
ZipInputStream zis = null;
|
||||
try {
|
||||
zis = new ZipInputStream(fileInfo.getFileURL().openStream());
|
||||
} catch (IOException ex) {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
ZipEntry entry = zis.getNextEntry();
|
||||
while (entry != null) {
|
||||
if (entry.getName().equals(name)) {
|
||||
return zis;
|
||||
}
|
||||
entry = zis.getNextEntry();
|
||||
}
|
||||
zis.close();
|
||||
return null;
|
||||
} catch (IOException ioex) {
|
||||
try {
|
||||
zis.close();
|
||||
} catch (IOException ex) {
|
||||
// why does close throw? it's maddening
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -19,7 +19,6 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import net.sf.openrocket.appearance.DecalImage;
|
||||
import net.sf.openrocket.document.BaseAttachmentFactory.BaseAttachment;
|
||||
import net.sf.openrocket.logging.LogHelper;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.util.BugException;
|
||||
@ -28,9 +27,9 @@ import net.sf.openrocket.util.FileUtils;
|
||||
public class DecalRegistry implements AttachmentFactory<DecalImage> {
|
||||
private static LogHelper log = Application.getLogger();
|
||||
|
||||
private final BaseAttachmentFactory baseFactory;
|
||||
private final AttachmentFactory baseFactory;
|
||||
|
||||
public DecalRegistry(BaseAttachmentFactory baseFactory) {
|
||||
public DecalRegistry(AttachmentFactory baseFactory) {
|
||||
this.baseFactory = baseFactory;
|
||||
}
|
||||
|
||||
@ -39,7 +38,7 @@ public class DecalRegistry implements AttachmentFactory<DecalImage> {
|
||||
public DecalImage getAttachment(String decalName) {
|
||||
DecalImageImpl d = registeredDecals.get(decalName);
|
||||
if (d == null) {
|
||||
BaseAttachment attachment = baseFactory.getAttachment(decalName);
|
||||
Attachment attachment = baseFactory.getAttachment(decalName);
|
||||
d = new DecalImageImpl(attachment);
|
||||
registeredDecals.put(decalName, d);
|
||||
}
|
||||
@ -58,7 +57,7 @@ public class DecalRegistry implements AttachmentFactory<DecalImage> {
|
||||
// It's a new file, generate a name for it.
|
||||
String decalName = makeUniqueName(file.getName());
|
||||
|
||||
BaseAttachment attachment = baseFactory.getAttachment(decalName);
|
||||
Attachment attachment = baseFactory.getAttachment(decalName);
|
||||
decal = new DecalImageImpl(attachment);
|
||||
decal.setFileSystemLocation(file);
|
||||
|
||||
@ -76,13 +75,13 @@ public class DecalRegistry implements AttachmentFactory<DecalImage> {
|
||||
return decals;
|
||||
}
|
||||
|
||||
public class DecalImageImpl implements DecalImage, Comparable {
|
||||
public class DecalImageImpl implements DecalImage {
|
||||
|
||||
private final BaseAttachment delegate;
|
||||
private final Attachment delegate;
|
||||
|
||||
private File fileSystemLocation;
|
||||
|
||||
private DecalImageImpl(BaseAttachment delegate) {
|
||||
private DecalImageImpl(Attachment delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@ -116,7 +115,7 @@ public class DecalRegistry implements AttachmentFactory<DecalImage> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Object o) {
|
||||
public int compareTo(Attachment o) {
|
||||
if (!(o instanceof DecalImageImpl)) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -0,0 +1,41 @@
|
||||
package net.sf.openrocket.document;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import net.sf.openrocket.document.attachments.BaseAttachment;
|
||||
import net.sf.openrocket.document.attachments.FileSystemAttachment;
|
||||
|
||||
public class FileSystemAttachmentFactory implements AttachmentFactory<BaseAttachment> {
|
||||
|
||||
private final File baseDirectory;
|
||||
|
||||
public FileSystemAttachmentFactory() {
|
||||
super();
|
||||
this.baseDirectory = null;
|
||||
}
|
||||
|
||||
public FileSystemAttachmentFactory(File baseDirectory) {
|
||||
super();
|
||||
if (baseDirectory != null && baseDirectory.isDirectory() == false) {
|
||||
throw new IllegalArgumentException("Base file for FileSystemAttachmentFactory is not a directory");
|
||||
}
|
||||
this.baseDirectory = baseDirectory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseAttachment getAttachment(String name) {
|
||||
|
||||
File file = new File(name);
|
||||
|
||||
if (file.isAbsolute()) {
|
||||
return new FileSystemAttachment(name, file);
|
||||
}
|
||||
|
||||
else {
|
||||
file = new File(baseDirectory, name);
|
||||
return new FileSystemAttachment(name, file);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
package net.sf.openrocket.document;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.LinkedList;
|
||||
@ -10,7 +12,6 @@ import java.util.Set;
|
||||
import net.sf.openrocket.document.events.DocumentChangeEvent;
|
||||
import net.sf.openrocket.document.events.DocumentChangeListener;
|
||||
import net.sf.openrocket.document.events.SimulationChangeEvent;
|
||||
import net.sf.openrocket.file.FileInfo;
|
||||
import net.sf.openrocket.logging.LogHelper;
|
||||
import net.sf.openrocket.logging.TraceException;
|
||||
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
|
||||
@ -59,8 +60,8 @@ public class OpenRocketDocument implements ComponentChangeListener {
|
||||
private final ArrayList<Simulation> simulations = new ArrayList<Simulation>();
|
||||
private ArrayList<CustomExpression> customExpressions = new ArrayList<CustomExpression>();
|
||||
|
||||
private BaseAttachmentFactory attachmentFactory = new BaseAttachmentFactory();
|
||||
private DecalRegistry decalRegistry = new DecalRegistry(attachmentFactory);
|
||||
private final AttachmentFactory attachmentFactory;
|
||||
private final DecalRegistry decalRegistry;
|
||||
|
||||
/*
|
||||
* The undo/redo variables and mechanism are documented in doc/undo-redo-flow.*
|
||||
@ -95,34 +96,44 @@ public class OpenRocketDocument implements ComponentChangeListener {
|
||||
private final StorageOptions storageOptions = new StorageOptions();
|
||||
|
||||
|
||||
private final List<DocumentChangeListener> listeners =
|
||||
new ArrayList<DocumentChangeListener>();
|
||||
private final List<DocumentChangeListener> listeners = new ArrayList<DocumentChangeListener>();
|
||||
|
||||
public OpenRocketDocument(Rocket rocket) {
|
||||
this(rocket.getDefaultConfiguration());
|
||||
OpenRocketDocument(Rocket rocket, File fileName, boolean isContainer) {
|
||||
this.configuration = rocket.getDefaultConfiguration();
|
||||
this.rocket = rocket;
|
||||
AttachmentFactory attachments;
|
||||
if (isContainer) {
|
||||
try {
|
||||
attachments = new ZipFileAttachmentFactory(fileName.toURI().toURL());
|
||||
} catch (MalformedURLException mex) {
|
||||
attachments = new FileSystemAttachmentFactory(null);
|
||||
}
|
||||
} else {
|
||||
if (fileName == null) {
|
||||
attachments = new FileSystemAttachmentFactory(null);
|
||||
} else {
|
||||
attachments = new FileSystemAttachmentFactory(fileName.getParentFile());
|
||||
}
|
||||
}
|
||||
this.attachmentFactory = attachments;
|
||||
this.decalRegistry = new DecalRegistry(this.attachmentFactory);
|
||||
init();
|
||||
}
|
||||
|
||||
OpenRocketDocument(Rocket rocket, URL jarURL, boolean isContainer) {
|
||||
this.configuration = rocket.getDefaultConfiguration();
|
||||
this.rocket = rocket;
|
||||
this.attachmentFactory = isContainer ? new ZipFileAttachmentFactory(jarURL) : new FileSystemAttachmentFactory(null);
|
||||
this.decalRegistry = new DecalRegistry(this.attachmentFactory);
|
||||
init();
|
||||
}
|
||||
|
||||
private OpenRocketDocument(Configuration configuration) {
|
||||
this.configuration = configuration;
|
||||
this.rocket = configuration.getRocket();
|
||||
|
||||
private void init() {
|
||||
clearUndo();
|
||||
|
||||
rocket.addComponentChangeListener(this);
|
||||
}
|
||||
|
||||
|
||||
public void setBaseFile(FileInfo fileInfo) {
|
||||
attachmentFactory.setBaseFile(fileInfo);
|
||||
}
|
||||
|
||||
|
||||
public void setIsZipFile(boolean isZipFile) {
|
||||
attachmentFactory.setIsZipFile(isZipFile);
|
||||
}
|
||||
|
||||
|
||||
public void addCustomExpression(CustomExpression expression) {
|
||||
if (customExpressions.contains(expression)) {
|
||||
log.user("Could not add custom expression " + expression.getName() + " to document as document alerady has a matching expression.");
|
||||
@ -553,11 +564,14 @@ public class OpenRocketDocument implements ComponentChangeListener {
|
||||
* motor configuration ID is maintained and the simulations are copied to the new rocket.
|
||||
* No undo/redo information or file storage information is maintained.
|
||||
*
|
||||
* This function is used from the Optimization routine to store alternatives of the same rocket.
|
||||
* For now we can assume that the copy returned does not have any of the attachment factories in place.
|
||||
*
|
||||
* @return a copy of this document.
|
||||
*/
|
||||
public OpenRocketDocument copy() {
|
||||
Rocket rocketCopy = rocket.copyWithOriginalID();
|
||||
OpenRocketDocument documentCopy = new OpenRocketDocument(rocketCopy);
|
||||
OpenRocketDocument documentCopy = OpenRocketDocumentFactory.createDocumentFromRocket(rocketCopy);
|
||||
documentCopy.getDefaultConfiguration().setFlightConfigurationID(configuration.getFlightConfigurationID());
|
||||
for (Simulation s : simulations) {
|
||||
documentCopy.addSimulation(s.duplicateSimulation(rocketCopy));
|
||||
|
@ -0,0 +1,43 @@
|
||||
package net.sf.openrocket.document;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
|
||||
import net.sf.openrocket.l10n.Translator;
|
||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||
import net.sf.openrocket.rocketcomponent.Stage;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
|
||||
public class OpenRocketDocumentFactory {
|
||||
|
||||
private static final Translator trans = Application.getTranslator();
|
||||
|
||||
public static OpenRocketDocument createNewRocket() {
|
||||
Rocket rocket = new Rocket();
|
||||
Stage stage = new Stage();
|
||||
//// Sustainer
|
||||
stage.setName(trans.get("BasicFrame.StageName.Sustainer"));
|
||||
rocket.addChild(stage);
|
||||
OpenRocketDocument doc = new OpenRocketDocument(rocket, (File) null, false);
|
||||
doc.setSaved(true);
|
||||
return doc;
|
||||
}
|
||||
|
||||
public static OpenRocketDocument createDocumentFromRocket(Rocket r) {
|
||||
OpenRocketDocument doc = new OpenRocketDocument(r, (File) null, false);
|
||||
return doc;
|
||||
}
|
||||
|
||||
public static OpenRocketDocument createDocumentForFile(File filename, boolean isContainer) {
|
||||
Rocket rocket = new Rocket();
|
||||
OpenRocketDocument doc = new OpenRocketDocument(rocket, filename, isContainer);
|
||||
return doc;
|
||||
}
|
||||
|
||||
public static OpenRocketDocument createDocumentForUrl(URL filename, boolean isContainer) {
|
||||
Rocket rocket = new Rocket();
|
||||
OpenRocketDocument doc = new OpenRocketDocument(rocket, filename, isContainer);
|
||||
return doc;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package net.sf.openrocket.document;
|
||||
|
||||
import java.net.URL;
|
||||
|
||||
import net.sf.openrocket.document.attachments.ZipFileAttachment;
|
||||
|
||||
public class ZipFileAttachmentFactory implements AttachmentFactory<Attachment> {
|
||||
|
||||
private final URL zipFile;
|
||||
|
||||
public ZipFileAttachmentFactory(URL zipFile) {
|
||||
super();
|
||||
this.zipFile = zipFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Attachment getAttachment(String name) {
|
||||
return new ZipFileAttachment(name, zipFile);
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package net.sf.openrocket.document.attachments;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import net.sf.openrocket.document.Attachment;
|
||||
|
||||
public abstract class BaseAttachment implements Attachment {
|
||||
|
||||
private final String name;
|
||||
|
||||
public BaseAttachment(String name) {
|
||||
super();
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract InputStream getBytes() throws FileNotFoundException, IOException;
|
||||
|
||||
@Override
|
||||
public int compareTo(Attachment o) {
|
||||
if (!(o instanceof BaseAttachment)) {
|
||||
return -1;
|
||||
}
|
||||
return this.name.compareTo(((BaseAttachment) o).name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package net.sf.openrocket.document.attachments;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import net.sf.openrocket.document.Attachment;
|
||||
|
||||
public class FileSystemAttachment extends BaseAttachment implements Attachment {
|
||||
|
||||
private final File location;
|
||||
|
||||
public FileSystemAttachment(String name, File location) {
|
||||
super(name);
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getBytes() throws FileNotFoundException, IOException {
|
||||
return new FileInputStream(location);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package net.sf.openrocket.document.attachments;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
import net.sf.openrocket.document.Attachment;
|
||||
import net.sf.openrocket.util.FileUtils;
|
||||
|
||||
public class ZipFileAttachment extends BaseAttachment implements Attachment {
|
||||
|
||||
private final URL zipFileLocation;
|
||||
|
||||
public ZipFileAttachment(String name, URL zipFileLocation) {
|
||||
super(name);
|
||||
this.zipFileLocation = zipFileLocation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getBytes() throws FileNotFoundException, IOException {
|
||||
String name = getName();
|
||||
|
||||
ZipInputStream zis = new ZipInputStream(zipFileLocation.openStream());
|
||||
|
||||
try {
|
||||
ZipEntry entry = zis.getNextEntry();
|
||||
while (entry != null) {
|
||||
if (entry.getName().equals(name)) {
|
||||
byte[] bytes = FileUtils.readBytes(zis);
|
||||
return new ByteArrayInputStream(bytes);
|
||||
}
|
||||
entry = zis.getNextEntry();
|
||||
}
|
||||
throw new FileNotFoundException("Unable to locate decal for name " + name);
|
||||
} finally {
|
||||
zis.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,5 @@
|
||||
package net.sf.openrocket.file;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
@ -19,11 +15,11 @@ public abstract class AbstractRocketLoader implements RocketLoader {
|
||||
* Loads a rocket from the specified InputStream.
|
||||
*/
|
||||
@Override
|
||||
public final OpenRocketDocument load(InputStream source, MotorFinder motorFinder) throws RocketLoadException {
|
||||
public final void load(OpenRocketDocument doc, InputStream source, MotorFinder motorFinder) throws RocketLoadException {
|
||||
warnings.clear();
|
||||
|
||||
try {
|
||||
return loadFromStream(source, motorFinder);
|
||||
loadFromStream(doc, source, motorFinder);
|
||||
} catch (RocketLoadException e) {
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
@ -39,7 +35,7 @@ public abstract class AbstractRocketLoader implements RocketLoader {
|
||||
*
|
||||
* @throws RocketLoadException if an error occurs during loading.
|
||||
*/
|
||||
protected abstract OpenRocketDocument loadFromStream(InputStream source, MotorFinder motorFinder) throws IOException,
|
||||
protected abstract void loadFromStream(OpenRocketDocument doc, InputStream source, MotorFinder motorFinder) throws IOException,
|
||||
RocketLoadException;
|
||||
|
||||
|
||||
|
@ -1,35 +0,0 @@
|
||||
package net.sf.openrocket.file;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
|
||||
public class FileInfo {
|
||||
|
||||
public final URL fileURL;
|
||||
public final File directory;
|
||||
|
||||
public FileInfo(File sourceFile) {
|
||||
URL theURL = null;
|
||||
try {
|
||||
theURL = sourceFile.toURI().toURL();
|
||||
} catch (MalformedURLException mex) {
|
||||
}
|
||||
this.fileURL = theURL;
|
||||
this.directory = sourceFile.getParentFile();
|
||||
}
|
||||
|
||||
public FileInfo(URL sourceURL) {
|
||||
this.fileURL = sourceURL;
|
||||
this.directory = null;
|
||||
}
|
||||
|
||||
public URL getFileURL() {
|
||||
return fileURL;
|
||||
}
|
||||
|
||||
public File getDirectory() {
|
||||
return directory;
|
||||
}
|
||||
|
||||
}
|
@ -13,6 +13,7 @@ import java.util.zip.ZipInputStream;
|
||||
|
||||
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.document.OpenRocketDocumentFactory;
|
||||
import net.sf.openrocket.file.openrocket.importt.OpenRocketLoader;
|
||||
import net.sf.openrocket.file.rocksim.importt.RocksimLoader;
|
||||
import net.sf.openrocket.util.ArrayUtils;
|
||||
@ -38,33 +39,41 @@ public class GeneralRocketLoader {
|
||||
private static final byte[] ROCKSIM_SIGNATURE = TextUtil.asciiBytes("<RockSimDoc");
|
||||
|
||||
private final OpenRocketLoader openRocketLoader = new OpenRocketLoader();
|
||||
private final FileInfo fileInfo;
|
||||
|
||||
private final RocksimLoader rocksimLoader = new RocksimLoader();
|
||||
|
||||
private File baseFile;
|
||||
private URL jarURL;
|
||||
|
||||
private final MotorFinder motorFinder;
|
||||
|
||||
public GeneralRocketLoader(File file) {
|
||||
this.fileInfo = new FileInfo(file);
|
||||
this.baseFile = file;
|
||||
this.jarURL = null;
|
||||
this.motorFinder = new DatabaseMotorFinder();
|
||||
}
|
||||
|
||||
public GeneralRocketLoader(URL jarURL) {
|
||||
this.fileInfo = new FileInfo(jarURL);
|
||||
this.baseFile = null;
|
||||
this.jarURL = jarURL;
|
||||
this.motorFinder = new DatabaseMotorFinder();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a rocket from the specified File object.
|
||||
* Loads a rocket from the File object used in the constructor
|
||||
*/
|
||||
public final OpenRocketDocument load(File source, MotorFinder motorFinder) throws RocketLoadException {
|
||||
public final OpenRocketDocument load() throws RocketLoadException {
|
||||
warnings.clear();
|
||||
InputStream stream = null;
|
||||
|
||||
try {
|
||||
|
||||
stream = new BufferedInputStream(new FileInputStream(source));
|
||||
OpenRocketDocument doc = load(stream, motorFinder);
|
||||
stream = new BufferedInputStream(new FileInputStream(baseFile));
|
||||
OpenRocketDocument doc = load(stream);
|
||||
return doc;
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RocketLoadException("Exception loading file: " + source, e);
|
||||
throw new RocketLoadException("Exception loading file: " + baseFile, e);
|
||||
} finally {
|
||||
if (stream != null) {
|
||||
try {
|
||||
@ -76,10 +85,9 @@ public class GeneralRocketLoader {
|
||||
}
|
||||
}
|
||||
|
||||
public final OpenRocketDocument load(InputStream source, MotorFinder motorFinder) throws RocketLoadException {
|
||||
public final OpenRocketDocument load(InputStream source) throws RocketLoadException {
|
||||
try {
|
||||
OpenRocketDocument doc = loadFromStream(source, motorFinder);
|
||||
doc.setBaseFile(fileInfo);
|
||||
OpenRocketDocument doc = loadFromStream(source);
|
||||
return doc;
|
||||
} catch (Exception e) {
|
||||
throw new RocketLoadException("Exception loading stream", e);
|
||||
@ -90,7 +98,7 @@ public class GeneralRocketLoader {
|
||||
return warnings;
|
||||
}
|
||||
|
||||
protected OpenRocketDocument loadFromStream(InputStream source, MotorFinder motorFinder) throws IOException,
|
||||
private OpenRocketDocument loadFromStream(InputStream source) throws IOException,
|
||||
RocketLoadException {
|
||||
|
||||
// Check for mark() support
|
||||
@ -114,13 +122,19 @@ public class GeneralRocketLoader {
|
||||
|
||||
// Check for GZIP
|
||||
if (buffer[0] == GZIP_SIGNATURE[0] && buffer[1] == GZIP_SIGNATURE[1]) {
|
||||
OpenRocketDocument doc = loadFromStream(new GZIPInputStream(source), motorFinder);
|
||||
doc.setIsZipFile(false);
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentForFile(baseFile, false);
|
||||
loadFromStream(doc, new GZIPInputStream(source));
|
||||
return doc;
|
||||
}
|
||||
|
||||
// Check for ZIP (for future compatibility)
|
||||
if (buffer[0] == ZIP_SIGNATURE[0] && buffer[1] == ZIP_SIGNATURE[1]) {
|
||||
OpenRocketDocument doc;
|
||||
if (baseFile != null) {
|
||||
doc = OpenRocketDocumentFactory.createDocumentForFile(baseFile, true);
|
||||
} else {
|
||||
doc = OpenRocketDocumentFactory.createDocumentForUrl(jarURL, true);
|
||||
}
|
||||
// Search for entry with name *.ork
|
||||
ZipInputStream in = new ZipInputStream(source);
|
||||
while (true) {
|
||||
@ -129,25 +143,52 @@ public class GeneralRocketLoader {
|
||||
throw new RocketLoadException("Unsupported or corrupt file.");
|
||||
}
|
||||
if (entry.getName().matches(".*\\.[oO][rR][kK]$")) {
|
||||
OpenRocketDocument doc = loadFromStream(in, motorFinder);
|
||||
doc.setIsZipFile(true);
|
||||
loadFromStream(doc, in);
|
||||
return doc;
|
||||
} else if (entry.getName().matches(".*\\.[rR][kK][tT]$")) {
|
||||
OpenRocketDocument doc = loadFromStream(in, motorFinder);
|
||||
loadFromStream(doc, in);
|
||||
return doc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OpenRocketDocument doc = null;
|
||||
if (baseFile != null) {
|
||||
doc = OpenRocketDocumentFactory.createDocumentForFile(baseFile, false);
|
||||
} else {
|
||||
doc = OpenRocketDocumentFactory.createDocumentForUrl(jarURL, false);
|
||||
}
|
||||
loadFromStream(doc, source);
|
||||
return doc;
|
||||
|
||||
}
|
||||
|
||||
private void loadFromStream(OpenRocketDocument doc, InputStream source) throws IOException, RocketLoadException {
|
||||
|
||||
// Check for mark() support
|
||||
if (!source.markSupported()) {
|
||||
source = new BufferedInputStream(source);
|
||||
}
|
||||
|
||||
// Read using mark()
|
||||
byte[] buffer = new byte[READ_BYTES];
|
||||
int count;
|
||||
source.mark(READ_BYTES + 10);
|
||||
count = source.read(buffer);
|
||||
source.reset();
|
||||
|
||||
if (count < 10) {
|
||||
throw new RocketLoadException("Unsupported or corrupt file.");
|
||||
}
|
||||
|
||||
// Check for OpenRocket
|
||||
int match = 0;
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (buffer[i] == OPENROCKET_SIGNATURE[match]) {
|
||||
match++;
|
||||
if (match == OPENROCKET_SIGNATURE.length) {
|
||||
OpenRocketDocument doc = loadUsing(openRocketLoader, source, motorFinder);
|
||||
doc.setIsZipFile(false);
|
||||
return doc;
|
||||
loadUsing(doc, openRocketLoader, source);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
match = 0;
|
||||
@ -156,18 +197,16 @@ public class GeneralRocketLoader {
|
||||
|
||||
byte[] typeIdentifier = ArrayUtils.copyOf(buffer, ROCKSIM_SIGNATURE.length);
|
||||
if (Arrays.equals(ROCKSIM_SIGNATURE, typeIdentifier)) {
|
||||
OpenRocketDocument doc = loadUsing(rocksimLoader, source, motorFinder);
|
||||
doc.setIsZipFile(false);
|
||||
return doc;
|
||||
loadUsing(doc, rocksimLoader, source);
|
||||
return;
|
||||
}
|
||||
throw new RocketLoadException("Unsupported or corrupt file.");
|
||||
|
||||
}
|
||||
|
||||
private OpenRocketDocument loadUsing(RocketLoader loader, InputStream source, MotorFinder motorFinder)
|
||||
throws RocketLoadException {
|
||||
private void loadUsing(OpenRocketDocument doc, RocketLoader loader, InputStream source) throws RocketLoadException {
|
||||
warnings.clear();
|
||||
OpenRocketDocument doc = loader.load(source, motorFinder);
|
||||
loader.load(doc, source, motorFinder);
|
||||
warnings.addAll(loader.getWarnings());
|
||||
return doc;
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ import net.sf.openrocket.document.OpenRocketDocument;
|
||||
|
||||
public interface RocketLoader {
|
||||
|
||||
public OpenRocketDocument load(InputStream source, MotorFinder motorFinder) throws RocketLoadException;
|
||||
public void load(OpenRocketDocument doc, InputStream source, MotorFinder motorFinder) throws RocketLoadException;
|
||||
|
||||
public WarningSet getWarnings();
|
||||
|
||||
|
@ -7,15 +7,12 @@ import net.sf.openrocket.aerodynamics.WarningSet;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.file.simplesax.AbstractElementHandler;
|
||||
import net.sf.openrocket.file.simplesax.ElementHandler;
|
||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||
|
||||
/**
|
||||
* Handles the content of the <openrocket> tag.
|
||||
*/
|
||||
class OpenRocketContentHandler extends AbstractElementHandler {
|
||||
private final DocumentLoadingContext context;
|
||||
private final OpenRocketDocument doc;
|
||||
private final Rocket rocket;
|
||||
|
||||
private boolean rocketDefined = false;
|
||||
private boolean simulationsDefined = false;
|
||||
@ -23,15 +20,12 @@ class OpenRocketContentHandler extends AbstractElementHandler {
|
||||
|
||||
public OpenRocketContentHandler(DocumentLoadingContext context) {
|
||||
this.context = context;
|
||||
this.rocket = new Rocket();
|
||||
this.doc = new OpenRocketDocument(rocket);
|
||||
context.setOpenRocketDocument(doc);
|
||||
}
|
||||
|
||||
public OpenRocketDocument getDocument() {
|
||||
if (!rocketDefined)
|
||||
return null;
|
||||
return doc;
|
||||
return context.getOpenRocketDocument();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -46,7 +40,7 @@ class OpenRocketContentHandler extends AbstractElementHandler {
|
||||
return null;
|
||||
}
|
||||
rocketDefined = true;
|
||||
return new ComponentParameterHandler(rocket, context);
|
||||
return new ComponentParameterHandler(getDocument().getRocket(), context);
|
||||
}
|
||||
|
||||
if (element.equals("datatypes")) {
|
||||
@ -66,7 +60,7 @@ class OpenRocketContentHandler extends AbstractElementHandler {
|
||||
return null;
|
||||
}
|
||||
simulationsDefined = true;
|
||||
return new SimulationsHandler(doc, context);
|
||||
return new SimulationsHandler(getDocument(), context);
|
||||
}
|
||||
|
||||
warnings.add(Warning.fromString("Unknown element " + element + ", ignoring."));
|
||||
|
@ -35,11 +35,12 @@ public class OpenRocketLoader extends AbstractRocketLoader {
|
||||
|
||||
|
||||
@Override
|
||||
public OpenRocketDocument loadFromStream(InputStream source, MotorFinder motorFinder) throws RocketLoadException,
|
||||
public void loadFromStream(OpenRocketDocument doc, InputStream source, MotorFinder motorFinder) throws RocketLoadException,
|
||||
IOException {
|
||||
log.info("Loading .ork file");
|
||||
DocumentLoadingContext context = new DocumentLoadingContext();
|
||||
context.setMotorFinder(motorFinder);
|
||||
context.setOpenRocketDocument(doc);
|
||||
|
||||
InputSource xmlSource = new InputSource(source);
|
||||
OpenRocketHandler handler = new OpenRocketHandler(context);
|
||||
@ -52,8 +53,6 @@ public class OpenRocketLoader extends AbstractRocketLoader {
|
||||
throw new RocketLoadException("Malformed XML in input.", e);
|
||||
}
|
||||
|
||||
|
||||
OpenRocketDocument doc = handler.getDocument();
|
||||
doc.getDefaultConfiguration().setAllStages();
|
||||
|
||||
// Deduce suitable time skip
|
||||
@ -88,7 +87,6 @@ public class OpenRocketLoader extends AbstractRocketLoader {
|
||||
|
||||
doc.clearUndo();
|
||||
log.info("Loading done");
|
||||
return doc;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -27,118 +27,123 @@ import org.xml.sax.SAXException;
|
||||
* Limitations: Rocksim flight simulations are not imported; tube fins are not supported; Rocksim 'pods' are not supported.
|
||||
*/
|
||||
public class RocksimHandler extends AbstractElementHandler {
|
||||
|
||||
/**
|
||||
* The main content handler.
|
||||
*/
|
||||
private RocksimContentHandler handler = null;
|
||||
|
||||
/**
|
||||
* Return the OpenRocketDocument read from the file, or <code>null</code> if a document
|
||||
* has not been read yet.
|
||||
*
|
||||
* @return the document read, or null.
|
||||
*/
|
||||
public OpenRocketDocument getDocument() {
|
||||
return handler.getDocument();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes,
|
||||
WarningSet warnings) {
|
||||
|
||||
// Check for unknown elements
|
||||
if (!element.equals("RockSimDocument")) {
|
||||
warnings.add(Warning.fromString("Unknown element " + element + ", ignoring."));
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check for first call
|
||||
if (handler != null) {
|
||||
warnings.add(Warning.fromString("Multiple document elements found, ignoring later "
|
||||
+ "ones."));
|
||||
return null;
|
||||
}
|
||||
|
||||
handler = new RocksimContentHandler();
|
||||
return handler;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* The main content handler.
|
||||
*/
|
||||
private RocksimContentHandler handler = null;
|
||||
|
||||
private final OpenRocketDocument document;
|
||||
|
||||
public RocksimHandler(OpenRocketDocument document) {
|
||||
super();
|
||||
this.document = document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the OpenRocketDocument read from the file, or <code>null</code> if a document
|
||||
* has not been read yet.
|
||||
*
|
||||
* @return the document read, or null.
|
||||
*/
|
||||
public OpenRocketDocument getDocument() {
|
||||
return document;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes,
|
||||
WarningSet warnings) {
|
||||
|
||||
// Check for unknown elements
|
||||
if (!element.equals("RockSimDocument")) {
|
||||
warnings.add(Warning.fromString("Unknown element " + element + ", ignoring."));
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check for first call
|
||||
if (handler != null) {
|
||||
warnings.add(Warning.fromString("Multiple document elements found, ignoring later "
|
||||
+ "ones."));
|
||||
return null;
|
||||
}
|
||||
|
||||
handler = new RocksimContentHandler(document);
|
||||
return handler;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the content of the <DesignInformation> tag.
|
||||
*/
|
||||
class RocksimContentHandler extends AbstractElementHandler {
|
||||
/**
|
||||
* The OpenRocketDocument that is the container for the rocket.
|
||||
*/
|
||||
private final OpenRocketDocument doc;
|
||||
|
||||
/**
|
||||
* The top-level component, from which all child components are added.
|
||||
*/
|
||||
private final Rocket rocket;
|
||||
|
||||
/**
|
||||
* The rocksim file version.
|
||||
*/
|
||||
private String version;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public RocksimContentHandler() {
|
||||
this.rocket = new Rocket();
|
||||
this.doc = new OpenRocketDocument(rocket);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the OpenRocket document that has been created from parsing the Rocksim design file.
|
||||
*
|
||||
* @return the instantiated OpenRocketDocument
|
||||
*/
|
||||
public OpenRocketDocument getDocument() {
|
||||
return doc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes,
|
||||
WarningSet warnings) {
|
||||
if (RocksimCommonConstants.DESIGN_INFORMATION.equals(element)) {
|
||||
//The next sub-element is "RocketDesign", which is really the only thing that matters. Rather than
|
||||
//create another handler just for that element, handle it here.
|
||||
return this;
|
||||
}
|
||||
if (RocksimCommonConstants.FILE_VERSION.equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if (RocksimCommonConstants.ROCKET_DESIGN.equals(element)) {
|
||||
return new RocketDesignHandler(doc, rocket);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeElement(String element, HashMap<String, String> attributes,
|
||||
String content, WarningSet warnings) throws SAXException {
|
||||
/**
|
||||
* SAX handler for Rocksim file version number. The value is not used currently, but could be used in the future
|
||||
* for backward/forward compatibility reasons (different lower level handlers could be called via a strategy pattern).
|
||||
*/
|
||||
if (RocksimCommonConstants.FILE_VERSION.equals(element)) {
|
||||
version = content;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer the file version.
|
||||
*
|
||||
* @return the version of the Rocksim design file
|
||||
*/
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
/**
|
||||
* The OpenRocketDocument that is the container for the rocket.
|
||||
*/
|
||||
private final OpenRocketDocument doc;
|
||||
|
||||
/**
|
||||
* The top-level component, from which all child components are added.
|
||||
*/
|
||||
private final Rocket rocket;
|
||||
|
||||
/**
|
||||
* The rocksim file version.
|
||||
*/
|
||||
private String version;
|
||||
|
||||
public RocksimContentHandler(OpenRocketDocument doc) {
|
||||
super();
|
||||
this.doc = doc;
|
||||
this.rocket = doc.getRocket();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the OpenRocket document that has been created from parsing the Rocksim design file.
|
||||
*
|
||||
* @return the instantiated OpenRocketDocument
|
||||
*/
|
||||
public OpenRocketDocument getDocument() {
|
||||
return doc;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes,
|
||||
WarningSet warnings) {
|
||||
if (RocksimCommonConstants.DESIGN_INFORMATION.equals(element)) {
|
||||
//The next sub-element is "RocketDesign", which is really the only thing that matters. Rather than
|
||||
//create another handler just for that element, handle it here.
|
||||
return this;
|
||||
}
|
||||
if (RocksimCommonConstants.FILE_VERSION.equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if (RocksimCommonConstants.ROCKET_DESIGN.equals(element)) {
|
||||
return new RocketDesignHandler(doc, rocket);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeElement(String element, HashMap<String, String> attributes,
|
||||
String content, WarningSet warnings) throws SAXException {
|
||||
/**
|
||||
* SAX handler for Rocksim file version number. The value is not used currently, but could be used in the future
|
||||
* for backward/forward compatibility reasons (different lower level handlers could be called via a strategy pattern).
|
||||
*/
|
||||
if (RocksimCommonConstants.FILE_VERSION.equals(element)) {
|
||||
version = content;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer the file version.
|
||||
*
|
||||
* @return the version of the Rocksim design file
|
||||
*/
|
||||
public String getVersion() {
|
||||
return version;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -149,165 +154,164 @@ class RocksimContentHandler extends AbstractElementHandler {
|
||||
*/
|
||||
class RocketDesignHandler extends AbstractElementHandler {
|
||||
private final OpenRocketDocument document;
|
||||
/**
|
||||
* The parent component.
|
||||
*/
|
||||
private final RocketComponent component;
|
||||
/**
|
||||
* The parsed stage count. Defaults to 1.
|
||||
*/
|
||||
private int stageCount = 1;
|
||||
/**
|
||||
* The overridden stage 1 mass.
|
||||
*/
|
||||
private double stage1Mass = 0d;
|
||||
/**
|
||||
* The overridden stage 2 mass.
|
||||
*/
|
||||
private double stage2Mass = 0d;
|
||||
/**
|
||||
* The overridden stage 3 mass.
|
||||
*/
|
||||
private double stage3Mass = 0d;
|
||||
/**
|
||||
* The overridden stage 1 Cg.
|
||||
*/
|
||||
private double stage1CG = 0d;
|
||||
/**
|
||||
* The overridden stage 2 Cg.
|
||||
*/
|
||||
private double stage2CG = 0d;
|
||||
/**
|
||||
* The overridden stage 3 Cg.
|
||||
*/
|
||||
private double stage3CG = 0d;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param c the parent component
|
||||
*/
|
||||
public RocketDesignHandler(OpenRocketDocument document, RocketComponent c) {
|
||||
this.document = document;
|
||||
component = c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
||||
/**
|
||||
* In Rocksim stages are from the top down, so a single stage rocket is actually stage '3'. A 2-stage
|
||||
* rocket defines stage '2' as the initial booster with stage '3' sitting atop it. And so on.
|
||||
*/
|
||||
if ("Stage3Parts".equals(element)) {
|
||||
final Stage stage = new Stage();
|
||||
if (stage3Mass > 0.0d) {
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideMass(stage3Mass);
|
||||
}
|
||||
if (stage3CG > 0.0d) {
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideCGX(stage3CG);
|
||||
}
|
||||
component.addChild(stage);
|
||||
return new StageHandler(document, stage);
|
||||
}
|
||||
if ("Stage2Parts".equals(element)) {
|
||||
if (stageCount >= 2) {
|
||||
final Stage stage = new Stage();
|
||||
if (stage2Mass > 0.0d) {
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideMass(stage2Mass);
|
||||
}
|
||||
if (stage2CG > 0.0d) {
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideCGX(stage2CG);
|
||||
}
|
||||
component.addChild(stage);
|
||||
return new StageHandler(document, stage);
|
||||
}
|
||||
}
|
||||
if ("Stage1Parts".equals(element)) {
|
||||
if (stageCount == 3) {
|
||||
final Stage stage = new Stage();
|
||||
if (stage1Mass > 0.0d) {
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideMass(stage1Mass);
|
||||
}
|
||||
if (stage1CG > 0.0d) {
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideCGX(stage1CG);
|
||||
}
|
||||
component.addChild(stage);
|
||||
return new StageHandler(document, stage);
|
||||
}
|
||||
}
|
||||
if (RocksimCommonConstants.NAME.equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("StageCount".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage3Mass".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage2Mass".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage1Mass".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage3CG".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage2CGAlone".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage1CGAlone".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeElement(String element, HashMap<String, String> attributes,
|
||||
String content, WarningSet warnings) throws SAXException {
|
||||
try {
|
||||
if (RocksimCommonConstants.NAME.equals(element)) {
|
||||
component.setName(content);
|
||||
}
|
||||
if ("StageCount".equals(element)) {
|
||||
stageCount = Integer.parseInt(content);
|
||||
}
|
||||
if ("Stage3Mass".equals(element)) {
|
||||
stage3Mass = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS;
|
||||
}
|
||||
if ("Stage2Mass".equals(element)) {
|
||||
stage2Mass = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS;
|
||||
}
|
||||
if ("Stage1Mass".equals(element)) {
|
||||
stage1Mass = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS;
|
||||
}
|
||||
if ("Stage3CG".equals(element)) {
|
||||
stage3CG = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
|
||||
}
|
||||
if ("Stage2CGAlone".equals(element)) {
|
||||
stage2CG = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
|
||||
}
|
||||
if ("Stage1CGAlone".equals(element)) {
|
||||
stage1CG = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException nfe) {
|
||||
warnings.add("Could not convert " + element + " value of " + content + ". It is expected to be a number.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The parent component.
|
||||
*/
|
||||
private final RocketComponent component;
|
||||
/**
|
||||
* The parsed stage count. Defaults to 1.
|
||||
*/
|
||||
private int stageCount = 1;
|
||||
/**
|
||||
* The overridden stage 1 mass.
|
||||
*/
|
||||
private double stage1Mass = 0d;
|
||||
/**
|
||||
* The overridden stage 2 mass.
|
||||
*/
|
||||
private double stage2Mass = 0d;
|
||||
/**
|
||||
* The overridden stage 3 mass.
|
||||
*/
|
||||
private double stage3Mass = 0d;
|
||||
/**
|
||||
* The overridden stage 1 Cg.
|
||||
*/
|
||||
private double stage1CG = 0d;
|
||||
/**
|
||||
* The overridden stage 2 Cg.
|
||||
*/
|
||||
private double stage2CG = 0d;
|
||||
/**
|
||||
* The overridden stage 3 Cg.
|
||||
*/
|
||||
private double stage3CG = 0d;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param c the parent component
|
||||
*/
|
||||
public RocketDesignHandler(OpenRocketDocument document, RocketComponent c) {
|
||||
this.document = document;
|
||||
component = c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
||||
/**
|
||||
* In Rocksim stages are from the top down, so a single stage rocket is actually stage '3'. A 2-stage
|
||||
* rocket defines stage '2' as the initial booster with stage '3' sitting atop it. And so on.
|
||||
*/
|
||||
if ("Stage3Parts".equals(element)) {
|
||||
final Stage stage = new Stage();
|
||||
if (stage3Mass > 0.0d) {
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideMass(stage3Mass);
|
||||
}
|
||||
if (stage3CG > 0.0d) {
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideCGX(stage3CG);
|
||||
}
|
||||
component.addChild(stage);
|
||||
return new StageHandler(document, stage);
|
||||
}
|
||||
if ("Stage2Parts".equals(element)) {
|
||||
if (stageCount >= 2) {
|
||||
final Stage stage = new Stage();
|
||||
if (stage2Mass > 0.0d) {
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideMass(stage2Mass);
|
||||
}
|
||||
if (stage2CG > 0.0d) {
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideCGX(stage2CG);
|
||||
}
|
||||
component.addChild(stage);
|
||||
return new StageHandler(document, stage);
|
||||
}
|
||||
}
|
||||
if ("Stage1Parts".equals(element)) {
|
||||
if (stageCount == 3) {
|
||||
final Stage stage = new Stage();
|
||||
if (stage1Mass > 0.0d) {
|
||||
stage.setMassOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideMass(stage1Mass);
|
||||
}
|
||||
if (stage1CG > 0.0d) {
|
||||
stage.setCGOverridden(true);
|
||||
stage.setOverrideSubcomponents(true); //Rocksim does not support this type of override
|
||||
stage.setOverrideCGX(stage1CG);
|
||||
}
|
||||
component.addChild(stage);
|
||||
return new StageHandler(document, stage);
|
||||
}
|
||||
}
|
||||
if (RocksimCommonConstants.NAME.equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("StageCount".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage3Mass".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage2Mass".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage1Mass".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage3CG".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage2CGAlone".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
if ("Stage1CGAlone".equals(element)) {
|
||||
return PlainTextHandler.INSTANCE;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void closeElement(String element, HashMap<String, String> attributes,
|
||||
String content, WarningSet warnings) throws SAXException {
|
||||
try {
|
||||
if (RocksimCommonConstants.NAME.equals(element)) {
|
||||
component.setName(content);
|
||||
}
|
||||
if ("StageCount".equals(element)) {
|
||||
stageCount = Integer.parseInt(content);
|
||||
}
|
||||
if ("Stage3Mass".equals(element)) {
|
||||
stage3Mass = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS;
|
||||
}
|
||||
if ("Stage2Mass".equals(element)) {
|
||||
stage2Mass = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS;
|
||||
}
|
||||
if ("Stage1Mass".equals(element)) {
|
||||
stage1Mass = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_MASS;
|
||||
}
|
||||
if ("Stage3CG".equals(element)) {
|
||||
stage3CG = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
|
||||
}
|
||||
if ("Stage2CGAlone".equals(element)) {
|
||||
stage2CG = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
|
||||
}
|
||||
if ("Stage1CGAlone".equals(element)) {
|
||||
stage1CG = Double.parseDouble(content) / RocksimCommonConstants.ROCKSIM_TO_OPENROCKET_LENGTH;
|
||||
}
|
||||
} catch (NumberFormatException nfe) {
|
||||
warnings.add("Could not convert " + element + " value of " + content + ". It is expected to be a number.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -315,36 +319,36 @@ class RocketDesignHandler extends AbstractElementHandler {
|
||||
*/
|
||||
class StageHandler extends AbstractElementHandler {
|
||||
private final OpenRocketDocument document;
|
||||
/**
|
||||
* The parent OpenRocket component.
|
||||
*/
|
||||
private final RocketComponent component;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param c the parent component
|
||||
* @throws IllegalArgumentException thrown if <code>c</code> is null
|
||||
*/
|
||||
public StageHandler(OpenRocketDocument document, RocketComponent c) throws IllegalArgumentException {
|
||||
if (c == null) {
|
||||
throw new IllegalArgumentException("The stage component may not be null.");
|
||||
}
|
||||
this.document = document;
|
||||
component = c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
||||
if (RocksimCommonConstants.NOSE_CONE.equals(element)) {
|
||||
return new NoseConeHandler(document, component, warnings);
|
||||
}
|
||||
if (RocksimCommonConstants.BODY_TUBE.equals(element)) {
|
||||
return new BodyTubeHandler(document, component, warnings);
|
||||
}
|
||||
if (RocksimCommonConstants.TRANSITION.equals(element)) {
|
||||
return new TransitionHandler(document, component, warnings);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* The parent OpenRocket component.
|
||||
*/
|
||||
private final RocketComponent component;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param c the parent component
|
||||
* @throws IllegalArgumentException thrown if <code>c</code> is null
|
||||
*/
|
||||
public StageHandler(OpenRocketDocument document, RocketComponent c) throws IllegalArgumentException {
|
||||
if (c == null) {
|
||||
throw new IllegalArgumentException("The stage component may not be null.");
|
||||
}
|
||||
this.document = document;
|
||||
component = c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) {
|
||||
if (RocksimCommonConstants.NOSE_CONE.equals(element)) {
|
||||
return new NoseConeHandler(document, component, warnings);
|
||||
}
|
||||
if (RocksimCommonConstants.BODY_TUBE.equals(element)) {
|
||||
return new BodyTubeHandler(document, component, warnings);
|
||||
}
|
||||
if (RocksimCommonConstants.TRANSITION.equals(element)) {
|
||||
return new TransitionHandler(document, component, warnings);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -39,11 +39,11 @@ public class RocksimLoader extends AbstractRocketLoader {
|
||||
* if an error occurs during loading.
|
||||
*/
|
||||
@Override
|
||||
protected OpenRocketDocument loadFromStream(InputStream source, MotorFinder motorFinder) throws IOException, RocketLoadException {
|
||||
protected void loadFromStream(OpenRocketDocument doc, InputStream source, MotorFinder motorFinder) throws IOException, RocketLoadException {
|
||||
|
||||
InputSource xmlSource = new InputSource(source);
|
||||
|
||||
RocksimHandler handler = new RocksimHandler();
|
||||
RocksimHandler handler = new RocksimHandler(doc);
|
||||
|
||||
try {
|
||||
SimpleSAX.readXML(xmlSource, handler, warnings);
|
||||
@ -51,9 +51,7 @@ public class RocksimLoader extends AbstractRocketLoader {
|
||||
throw new RocketLoadException("Malformed XML in input.", e);
|
||||
}
|
||||
|
||||
final OpenRocketDocument document = handler.getDocument();
|
||||
document.setFile(null);
|
||||
document.clearUndo();
|
||||
return document;
|
||||
doc.setFile(null);
|
||||
doc.clearUndo();
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,6 @@ import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.file.DatabaseMotorFinder;
|
||||
import net.sf.openrocket.file.GeneralRocketLoader;
|
||||
import net.sf.openrocket.file.RocketLoadException;
|
||||
import net.sf.openrocket.gui.components.UnitSelector;
|
||||
@ -98,7 +97,7 @@ public class CustomExpressionPanel extends JPanel {
|
||||
// Load expressions from selected document
|
||||
GeneralRocketLoader loader = new GeneralRocketLoader(importFile);
|
||||
try {
|
||||
OpenRocketDocument importedDocument = loader.load(importFile, new DatabaseMotorFinder());
|
||||
OpenRocketDocument importedDocument = loader.load();
|
||||
for (CustomExpression exp : importedDocument.getCustomExpressions()) {
|
||||
doc.addCustomExpression(exp);
|
||||
}
|
||||
|
@ -60,6 +60,7 @@ import javax.swing.tree.TreeSelectionModel;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import net.sf.openrocket.aerodynamics.WarningSet;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.document.OpenRocketDocumentFactory;
|
||||
import net.sf.openrocket.document.StorageOptions;
|
||||
import net.sf.openrocket.file.GeneralRocketSaver;
|
||||
import net.sf.openrocket.file.RocketLoadException;
|
||||
@ -96,7 +97,6 @@ import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
|
||||
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
|
||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||
import net.sf.openrocket.rocketcomponent.Stage;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
import net.sf.openrocket.util.BugException;
|
||||
import net.sf.openrocket.util.MemoryManagement;
|
||||
@ -839,7 +839,7 @@ public class BasicFrame extends JFrame {
|
||||
return;
|
||||
}
|
||||
|
||||
OpenRocketDocument doc = new OpenRocketDocument(r);
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentFromRocket(r);
|
||||
doc.setSaved(true);
|
||||
BasicFrame frame = new BasicFrame(doc);
|
||||
frame.setVisible(true);
|
||||
@ -855,7 +855,7 @@ public class BasicFrame extends JFrame {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
log.user("Create Iso-Haisu selected");
|
||||
Rocket r = TestRockets.makeIsoHaisu();
|
||||
OpenRocketDocument doc = new OpenRocketDocument(r);
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentFromRocket(r);
|
||||
doc.setSaved(true);
|
||||
BasicFrame frame = new BasicFrame(doc);
|
||||
frame.setVisible(true);
|
||||
@ -870,7 +870,7 @@ public class BasicFrame extends JFrame {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
log.user("Create Big Blue selected");
|
||||
Rocket r = TestRockets.makeBigBlue();
|
||||
OpenRocketDocument doc = new OpenRocketDocument(r);
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentFromRocket(r);
|
||||
doc.setSaved(true);
|
||||
BasicFrame frame = new BasicFrame(doc);
|
||||
frame.setVisible(true);
|
||||
@ -1465,19 +1465,11 @@ public class BasicFrame extends JFrame {
|
||||
public static void newAction() {
|
||||
log.info("New action initiated");
|
||||
|
||||
Rocket rocket = new Rocket();
|
||||
Stage stage = new Stage();
|
||||
//// Sustainer
|
||||
stage.setName(trans.get("BasicFrame.StageName.Sustainer"));
|
||||
rocket.addChild(stage);
|
||||
OpenRocketDocument doc = new OpenRocketDocument(rocket);
|
||||
doc.setSaved(true);
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createNewRocket();
|
||||
|
||||
BasicFrame frame = new BasicFrame(doc);
|
||||
frame.replaceable = true;
|
||||
frame.setVisible(true);
|
||||
// kruland commented this out - I don't like it.
|
||||
//ComponentConfigDialog.showDialog(frame, doc, rocket);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -12,7 +12,6 @@ import java.net.URL;
|
||||
import javax.swing.SwingWorker;
|
||||
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.file.DatabaseMotorFinder;
|
||||
import net.sf.openrocket.file.GeneralRocketLoader;
|
||||
import net.sf.openrocket.logging.LogHelper;
|
||||
import net.sf.openrocket.startup.Application;
|
||||
@ -68,7 +67,7 @@ public class OpenFileWorker extends SwingWorker<OpenRocketDocument, Void> {
|
||||
is = new ProgressInputStream(is);
|
||||
|
||||
try {
|
||||
OpenRocketDocument document = loader.load(is, new DatabaseMotorFinder());
|
||||
OpenRocketDocument document = loader.load(is);
|
||||
|
||||
// Set document state
|
||||
document.setFile(file);
|
||||
|
@ -6,7 +6,6 @@ import java.util.Locale;
|
||||
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.document.StorageOptions;
|
||||
import net.sf.openrocket.file.DatabaseMotorFinder;
|
||||
import net.sf.openrocket.file.GeneralRocketLoader;
|
||||
import net.sf.openrocket.file.GeneralRocketSaver;
|
||||
import net.sf.openrocket.file.RocketLoadException;
|
||||
@ -62,7 +61,7 @@ public class RocksimConverter {
|
||||
opts.setExplicitlySet(true);
|
||||
|
||||
GeneralRocketLoader loader = new GeneralRocketLoader(input);
|
||||
OpenRocketDocument document = loader.load(input, new DatabaseMotorFinder());
|
||||
OpenRocketDocument document = loader.load();
|
||||
saver.save(output, document, opts);
|
||||
|
||||
} catch (RocketLoadException e) {
|
||||
|
@ -20,8 +20,6 @@ import net.sf.openrocket.database.motor.MotorDatabase;
|
||||
import net.sf.openrocket.database.motor.ThrustCurveMotorSetDatabase;
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.document.Simulation;
|
||||
import net.sf.openrocket.file.DatabaseMotorFinder;
|
||||
import net.sf.openrocket.file.FileInfo;
|
||||
import net.sf.openrocket.file.GeneralRocketLoader;
|
||||
import net.sf.openrocket.file.RocketLoadException;
|
||||
import net.sf.openrocket.file.motor.GeneralMotorLoader;
|
||||
@ -117,10 +115,10 @@ public class IntegrationTest extends BaseTestCase {
|
||||
System.setProperty("openrocket.unittest", "true");
|
||||
|
||||
// Load the rocket
|
||||
GeneralRocketLoader loader = new GeneralRocketLoader();
|
||||
GeneralRocketLoader loader = new GeneralRocketLoader(new File("simplerocket.ork"));
|
||||
InputStream is = this.getClass().getResourceAsStream("simplerocket.ork");
|
||||
assertNotNull("Problem in unit test, cannot find simplerocket.ork", is);
|
||||
document = loader.load(is, new FileInfo(new File("simplerocket.ork")), new DatabaseMotorFinder());
|
||||
document = loader.load(is);
|
||||
is.close();
|
||||
|
||||
undoAction = UndoRedoAction.newUndoAction(document);
|
||||
|
@ -1,26 +0,0 @@
|
||||
/*
|
||||
* RocksimContentHandlerTest.java
|
||||
*/
|
||||
package net.sf.openrocket.file.rocksim.importt;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
/**
|
||||
* RocksimContentHandler Tester.
|
||||
*
|
||||
*/
|
||||
public class RocksimContentHandlerTest {
|
||||
|
||||
/**
|
||||
*
|
||||
* Method: getDocument()
|
||||
*
|
||||
* @throws Exception thrown if something goes awry
|
||||
*/
|
||||
@org.junit.Test
|
||||
public void testGetDocument() throws Exception {
|
||||
RocksimContentHandler handler = new RocksimContentHandler();
|
||||
Assert.assertNotNull(handler.getDocument());
|
||||
}
|
||||
|
||||
}
|
@ -9,6 +9,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.document.OpenRocketDocumentFactory;
|
||||
import net.sf.openrocket.file.DatabaseMotorFinder;
|
||||
import net.sf.openrocket.file.RocketLoadException;
|
||||
import net.sf.openrocket.rocketcomponent.BodyTube;
|
||||
@ -34,7 +35,8 @@ public class RocksimLoaderTest {
|
||||
InputStream stream = this.getClass().getResourceAsStream("PodFins.rkt");
|
||||
Assert.assertNotNull("Could not open PodFins.rkt", stream);
|
||||
try {
|
||||
OpenRocketDocument doc = loader.loadFromStream(new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentForFile(null, false);
|
||||
loader.loadFromStream(doc, new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
Assert.assertNotNull(doc);
|
||||
Rocket rocket = doc.getRocket();
|
||||
Assert.assertNotNull(rocket);
|
||||
@ -64,7 +66,9 @@ public class RocksimLoaderTest {
|
||||
|
||||
stream = this.getClass().getResourceAsStream("rocksimTestRocket2.rkt");
|
||||
Assert.assertNotNull("Could not open rocksimTestRocket2.rkt", stream);
|
||||
doc = loader.loadFromStream(new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
|
||||
doc = OpenRocketDocumentFactory.createDocumentForFile(null, false);
|
||||
loader.loadFromStream(doc, new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
|
||||
Assert.assertNotNull(doc);
|
||||
rocket = doc.getRocket();
|
||||
@ -87,7 +91,9 @@ public class RocksimLoaderTest {
|
||||
|
||||
stream = this.getClass().getResourceAsStream("rocksimTestRocket3.rkt");
|
||||
Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream);
|
||||
doc = loader.loadFromStream(new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
|
||||
doc = OpenRocketDocumentFactory.createDocumentForFile(null, false);
|
||||
loader.loadFromStream(doc, new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
|
||||
Assert.assertNotNull(doc);
|
||||
rocket = doc.getRocket();
|
||||
@ -133,7 +139,9 @@ public class RocksimLoaderTest {
|
||||
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket1.rkt");
|
||||
try {
|
||||
Assert.assertNotNull("Could not open rocksimTestRocket1.rkt", stream);
|
||||
return theLoader.loadFromStream(new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentForFile(null, false);
|
||||
theLoader.loadFromStream(doc, new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
return doc;
|
||||
} finally {
|
||||
stream.close();
|
||||
}
|
||||
@ -143,7 +151,9 @@ public class RocksimLoaderTest {
|
||||
InputStream stream = RocksimLoaderTest.class.getResourceAsStream("rocksimTestRocket3.rkt");
|
||||
try {
|
||||
Assert.assertNotNull("Could not open rocksimTestRocket3.rkt", stream);
|
||||
return theLoader.loadFromStream(new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createDocumentForFile(null, false);
|
||||
theLoader.loadFromStream(doc, new BufferedInputStream(stream), new DatabaseMotorFinder());
|
||||
return doc;
|
||||
} finally {
|
||||
stream.close();
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
package net.sf.openrocket.rocketcomponent;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Iterator;
|
||||
@ -15,10 +18,10 @@ public class ComponentCompare {
|
||||
private static final String[] IGNORED_METHODS = {
|
||||
"getClass", "getChildCount", "getChildren", "getNextComponent", "getID",
|
||||
"getPreviousComponent", "getParent", "getRocket", "getRoot", "getStage",
|
||||
"getStageNumber", "getComponentName",
|
||||
"getStageNumber", "getComponentName", "getDefaultFlightConfiguration",
|
||||
// Rocket specific methods:
|
||||
"getModID", "getMassModID", "getAerodynamicModID", "getTreeModID", "getFunctionalModID",
|
||||
"getMotorConfigurationIDs", "getDefaultConfiguration", "getMotorMounts"
|
||||
"getFlightConfigurationIDs", "getDefaultConfiguration", "getMotorMounts"
|
||||
};
|
||||
|
||||
|
||||
@ -38,7 +41,7 @@ public class ComponentCompare {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static void assertDeepEquality(RocketComponent c1, RocketComponent c2) {
|
||||
assertEquality(c1, c2);
|
||||
|
||||
@ -54,7 +57,7 @@ public class ComponentCompare {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static void assertDeepSimilarity(RocketComponent c1, RocketComponent c2,
|
||||
boolean allowNameDifference) {
|
||||
assertSimilarity(c1, c2, allowNameDifference);
|
||||
@ -71,7 +74,7 @@ public class ComponentCompare {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Check whether the two components are <em>similar</em>. Two components are similar
|
||||
* if each of the getXXX and isXXX methods that both object types have return
|
||||
@ -114,7 +117,7 @@ public class ComponentCompare {
|
||||
if (allowNameDifference && name.equals("getName"))
|
||||
continue;
|
||||
|
||||
|
||||
|
||||
// Check for method in other class
|
||||
Method m2;
|
||||
try {
|
||||
|
@ -1,22 +1,22 @@
|
||||
package net.sf.openrocket.simulation.customexpression;
|
||||
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.document.OpenRocketDocumentFactory;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import net.sf.openrocket.document.OpenRocketDocument;
|
||||
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||
|
||||
public class TestExpressions {
|
||||
|
||||
|
||||
@Test
|
||||
public void testExpressions() {
|
||||
// TODO Auto-generated constructor stub
|
||||
|
||||
OpenRocketDocument doc = new OpenRocketDocument(new Rocket());
|
||||
OpenRocketDocument doc = OpenRocketDocumentFactory.createNewRocket();
|
||||
|
||||
//CustomExpression exp = new CustomExpression(doc, "Kinetic energy", "Ek", "J", ".5*m*Vt^2");
|
||||
|
||||
CustomExpression exp = new CustomExpression(doc, "Average mass", "Mavg", "kg", "mean(m[0:t])");
|
||||
System.out.println( exp.getExpressionString() );
|
||||
System.out.println(exp.getExpressionString());
|
||||
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user