Oops forgot the webservice.

This commit is contained in:
Kevin Ruland 2015-12-07 22:29:51 -06:00
parent b415238a02
commit 17540d160c
12 changed files with 1294 additions and 0 deletions

View File

@ -0,0 +1,122 @@
package net.sf.openrocket.thrustcurve;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
public abstract class Base64Decoder {
private static final String BASE64_CHARS =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
private static final char PAD_CHAR = '=';
private final static short[] _charToBits = new short[128];
static {
for (int i = 0; i < _charToBits.length; i++)
_charToBits[i] = -1;
for (int i = 0; i < BASE64_CHARS.length(); i++)
_charToBits[BASE64_CHARS.charAt(i)] = (byte) i;
_charToBits[PAD_CHAR] = 0;
}
/**
* Decode the specified Base64 string and write binary data
* to the given stream.
* @param str Base64 encoded string
* @param w output stream
*/
public static String decodeData(String str) throws IOException
{
StringReader r;
int c1;
if (str == null || str.length() < 1)
return null;
r = new StringReader(str);
StringWriter w = new StringWriter();
// spin through the input string
c1 = readToNonSpace(r);
while (c1 > 0)
{
int c2, c3, c4;
int p1, p2, p3, p4;
int pad, n;
pad = 0;
c2 = readToNonSpace(r);
c3 = readToNonSpace(r);
c4 = readToNonSpace(r);
if (c4 < 0)
throw new IllegalArgumentException("Encoded string ends prematurely.");
p1 = charToBits(c1);
p2 = charToBits(c2);
if (c3 == PAD_CHAR)
{
p3 = 0;
pad++;
}
else
p3 = charToBits(c3);
if (c4 == PAD_CHAR)
{
p4 = 0;
pad++;
}
else
p4 = charToBits(c4);
if (p1 < 0 || p2 < 0 || p3 < 0 || p4 < 0)
throw new IllegalArgumentException("Encoded string contains invalid characters.");
n = (p1 << 18) | (p2 << 12) | (p3 << 6) | p4;
w.write((byte) ((n & 0xFF0000) >> 16));
if (pad < 2)
w.write((byte) ((n & 0x00FF00) >> 8));
if (pad < 1)
w.write((byte) (n & 0x0000FF));
c1 = readToNonSpace(r);
if (c1 > 0 && pad > 0)
throw new IllegalArgumentException("Extra characters found after padding.");
}
return w.toString();
}
private static int readToNonSpace(Reader r)
throws IOException
{
int c;
c = r.read();
while (c >= 0 && Character.isWhitespace(c))
c = r.read();
return c;
}
private static int charToBits(int c)
{
// use it to look up the value
if (c < 0 || c >= _charToBits.length)
return -1;
else
return _charToBits[c];
}
}

View File

@ -0,0 +1,43 @@
package net.sf.openrocket.thrustcurve;
import java.util.ArrayList;
class DownloadRequest {
private ArrayList<Integer> motorIds = new ArrayList<Integer>();
private String format = null;
public void add(Integer motorId) {
this.motorIds.add(motorId);
}
public void setFormat(String format) {
this.format = format;
}
@Override
public String toString() {
StringBuilder w = new StringBuilder();
w.append("<?xml version=\"1.0\" encoding=\"ascii\"?>\n");
w.append("<download-request\n");
w.append(" xmlns=\"http://www.thrustcurve.org/2008/DownloadRequest\"\n");
w.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
w.append(" xsi:schemaLocation=\"http://www.thrustcurve.org/2008/DownloadRequest http://www.thrustcurve.org/2008/download-request.xsd\">\n");
if (format != null) {
w.append(" <format>").append(format).append("</format>\n");
}
w.append(" <motor-ids>\n");
for (Integer i : motorIds) {
w.append(" <id>").append(i).append("</id>\n");
}
w.append(" </motor-ids>\n");
w.append("</download-request>\n");
return w.toString();
}
}

View File

@ -0,0 +1,41 @@
package net.sf.openrocket.thrustcurve;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DownloadResponse {
private Map<Integer,List<MotorBurnFile>> data = new HashMap<Integer,List<MotorBurnFile>>();
private String error = null;
public void add( MotorBurnFile mbd ) {
List<MotorBurnFile> currentData = data.get(mbd.getMotorId());
if ( currentData == null ) {
currentData = new ArrayList<MotorBurnFile>();
data.put(mbd.getMotorId(), currentData);
}
currentData.add(mbd);
}
public List<MotorBurnFile> getData(Integer motor_id) {
return data.get(motor_id);
}
public void setError(String error) {
this.error = error;
}
public String getError() {
return error;
}
@Override
public String toString() {
return "DownloadResponse [error=" + error + ", data=" + data + "]";
}
}

View File

@ -0,0 +1,75 @@
package net.sf.openrocket.thrustcurve;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import net.sf.openrocket.aerodynamics.WarningSet;
import net.sf.openrocket.file.simplesax.ElementHandler;
import net.sf.openrocket.file.simplesax.SimpleSAX;
public class DownloadResponseParser implements ElementHandler {
private static final String thrustcurveURI = "http://www.thrustcurve.org/2009/DownloadResponse";
private static final String root_tag = "download-response";
private static final String results_tag = "results";
private static final String result_tag = "result";
private static final String motor_id_tag = "motor-id";
private static final String simfile_id_tag = "simfile-id";
private static final String format_tag = "format";
private static final String source_tag = "source";
private static final String license_tag = "license";
private static final String data_tag = "data";
private static final String error_tag = "error";
private DownloadResponse response = new DownloadResponse();
private MotorBurnFile motorBurnFile;
private DownloadResponseParser() {
};
public static DownloadResponse parse(InputStream in) throws IOException, SAXException {
DownloadResponseParser handler = new DownloadResponseParser();
WarningSet warnings = new WarningSet();
SimpleSAX.readXML(new InputSource(in), handler, warnings);
return handler.response;
}
@Override
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException {
if (result_tag.equals(element)) {
motorBurnFile = new MotorBurnFile();
}
return this;
}
@Override
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
if (result_tag.equals(element)) {
response.add(motorBurnFile);
} else if (motor_id_tag.equals(element)) {
motorBurnFile.setMotorId(Integer.parseInt(content));
} else if (format_tag.equals(element)) {
motorBurnFile.setFiletype(content);
} else if (data_tag.equals(element)) {
try {
motorBurnFile.decodeFile(content);
} catch (IOException e) {
throw new SAXException(e);
}
}
}
@Override
public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
}
}

View File

@ -0,0 +1,84 @@
package net.sf.openrocket.thrustcurve;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import net.sf.openrocket.file.motor.RASPMotorLoader;
import net.sf.openrocket.file.motor.RockSimMotorLoader;
import net.sf.openrocket.motor.ThrustCurveMotor;
public class MotorBurnFile {
private Integer motorId;
private String filetype;
private ThrustCurveMotor.Builder thrustCurveMotor;
public void init() {
this.motorId = null;
this.filetype = null;
this.thrustCurveMotor = null;
}
@Override
public MotorBurnFile clone() {
MotorBurnFile clone = new MotorBurnFile();
clone.motorId = this.motorId;
clone.filetype = this.filetype;
clone.thrustCurveMotor = this.thrustCurveMotor;
return clone;
}
public void decodeFile(String data) throws IOException {
data = Base64Decoder.decodeData(data);
try {
if (SupportedFileTypes.RASP_FORMAT.equals(filetype)) {
RASPMotorLoader loader = new RASPMotorLoader();
List<ThrustCurveMotor.Builder> motors = loader.load(new StringReader(data), "download");
this.thrustCurveMotor = motors.get(0);
} else if (SupportedFileTypes.ROCKSIM_FORMAT.equals(filetype)) {
RockSimMotorLoader loader = new RockSimMotorLoader();
List<ThrustCurveMotor.Builder> motors = loader.load(new StringReader(data), "download");
this.thrustCurveMotor = motors.get(0);
}
} catch (IOException ex) {
this.thrustCurveMotor = null;
}
}
/**
* @return the motor_id
*/
public Integer getMotorId() {
return motorId;
}
/**
* @param motor_id the motor_id to set
*/
public void setMotorId(Integer motorId) {
this.motorId = motorId;
}
/**
* @return the filetype
*/
public String getFiletype() {
return filetype;
}
/**
* @param filetype the filetype to set
*/
public void setFiletype(String filetype) {
this.filetype = filetype;
}
/**
* @return the thrustCurveMotor
*/
public ThrustCurveMotor.Builder getThrustCurveMotor() {
return thrustCurveMotor;
}
}

View File

@ -0,0 +1,117 @@
package net.sf.openrocket.thrustcurve;
public class SearchRequest {
private String manufacturer;
private String designation;
private String brand_name;
private String common_name;
private String impulse_class;
private Integer diameter;
/*
public enum Type {
"SU";
"reload";
"hybrid"
};
*/
private String type;
public void setManufacturer(String manufacturer) {
this.manufacturer = null;
if (manufacturer != null) {
manufacturer = manufacturer.trim();
if (!"".equals(manufacturer)) {
this.manufacturer = manufacturer;
}
}
}
public void setDesignation(String designation) {
this.designation = designation;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public void setCommon_name(String common_name) {
if (common_name == null) {
this.common_name = null;
return;
}
this.common_name = common_name.trim();
if ("".equals(this.common_name)) {
this.common_name = null;
}
}
public void setImpulse_class(String impulse_class) {
this.impulse_class = null;
if (impulse_class != null) {
this.impulse_class = impulse_class.trim();
if ("".equals(impulse_class)) {
this.impulse_class = null;
}
}
}
public void setDiameter(Integer diameter) {
this.diameter = diameter;
}
public void setDiameter(String diameter) {
this.diameter = null;
if (diameter == null) {
return;
}
try {
this.diameter = Integer.decode(diameter);
} catch (NumberFormatException ex) {
this.diameter = null;
}
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
StringBuilder w = new StringBuilder();
w.append("<?xml version=\"1.0\" encoding=\"ascii\"?>\n");
w.append("<search-request\n");
w.append(" xmlns=\"http://www.thrustcurve.org/2014/SearchRequest\"\n");
w.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
w.append(" xsi:schemaLocation=\"http://www.thrustcurve.org/2014/SearchRequest http://www.thrustcurve.org/2014/search-request.xsd\">\n");
if (manufacturer != null) {
w.append(" <manufacturer>").append(manufacturer).append("</manufacturer>\n");
}
if (designation != null) {
w.append(" <designation>").append(designation).append("</designation>\n");
}
if (brand_name != null) {
w.append(" <brand-name>").append(brand_name).append("</brand-name>\n");
}
if (common_name != null) {
w.append(" <common-name>").append(common_name).append("</common-name>\n");
}
if (impulse_class != null) {
w.append(" <impulse-class>").append(impulse_class).append("</impulse-class>\n");
}
if (diameter != null) {
w.append(" <diameter>").append(diameter).append("</diameter>\n");
}
if (type != null) {
w.append(" <type>").append(type).append("</type>\n");
}
w.append("<data-fields>*</data-fields>");
w.append("<max-results>0</max-results>");
w.append("</search-request>\n");
return w.toString();
}
}

View File

@ -0,0 +1,45 @@
package net.sf.openrocket.thrustcurve;
import java.util.ArrayList;
import java.util.List;
public class SearchResponse {
private List<TCMotor> results = new ArrayList<TCMotor>();
private int matches;
private String error;
public List<TCMotor> getResults() {
return results;
}
void addMotor(TCMotor motor) {
results.add(motor);
}
public int getMatches() {
return matches;
}
public void setMatches(int matches) {
this.matches = matches;
}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
@Override
public String toString() {
return "SearchResult [results=" + results + ", matches=" + matches
+ ", error=" + error + "]";
}
}

View File

@ -0,0 +1,180 @@
package net.sf.openrocket.thrustcurve;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import net.sf.openrocket.aerodynamics.WarningSet;
import net.sf.openrocket.file.simplesax.ElementHandler;
import net.sf.openrocket.file.simplesax.SimpleSAX;
public class SearchResponseParser implements ElementHandler {
private static final String thrustcurveURI = "http://www.thrustcurve.org/2008/SearchResponse";
/*
* XML Tags in SearchResult xsd
*/
private static final String root_tag = "search-response";
private static final String criteria = "criteria";
private static final String criterion = "criterion";
private static final String name = "name";
private static final String value = "value";
private static final String matches = "matches";
private static final String results = "results";
private static final String result = "result";
private static final String motor_id = "motor-id";
private static final String manufacturer = "manufacturer";
private static final String manufacturer_abbr = "manufacturer-abbrev";
private static final String designation = "designation";
private static final String brand_name = "brand-name";
private static final String common_name = "common-name";
private static final String impulse_class = "impulse-class";
private static final String diameter = "diameter";
private static final String length = "length";
private static final String type = "type";
private static final String cert_org = "cert-org";
private static final String avg_thrust_n = "avg-thrust-n";
private static final String max_thrust_n = "max-thrust-n";
private static final String tot_impulse_ns = "tot-impulse-ns";
private static final String burn_time_s = "burn-time-s";
private static final String data_files = "data-files";
private static final String info_url = "info-url";
private static final String total_weight_g = "total-weight-g";
private static final String prop_weight_g = "prop-weight-g";
private static final String delays = "delays";
private static final String case_info = "case-info";
private static final String prop_info = "prop-info";
private static final String updated_on = "updated-on";
private static final String availability = "availability";
private SearchResponse response = new SearchResponse();
private TCMotor currentMotor;
private SearchResponseParser() {
}
public static SearchResponse parse(InputStream in) throws IOException, SAXException {
SearchResponseParser handler = new SearchResponseParser();
WarningSet warnings = new WarningSet();
SimpleSAX.readXML(new InputSource(in), handler, warnings);
return handler.response;
}
@Override
public ElementHandler openElement(String element, HashMap<String, String> attributes, WarningSet warnings) throws SAXException {
if (result.equals(element)) {
currentMotor = new TCMotor();
}
return this;
}
@Override
public void closeElement(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
switch (element) {
case result:
// Convert impulse class. ThrustCurve puts mmx, 1/4a and 1/2a as A.
if ("a".equalsIgnoreCase(currentMotor.getImpulse_class())) {
if (currentMotor.getCommon_name().startsWith("1/2A")) {
currentMotor.setImpulse_class("1/2A");
} else if (currentMotor.getCommon_name().startsWith("1/4A")) {
currentMotor.setImpulse_class("1/4A");
} else if (currentMotor.getCommon_name().startsWith("Micro")) {
currentMotor.setImpulse_class("1/8A");
}
}
// Convert Case Info.
if (currentMotor.getCase_info() == null
|| "single use".equalsIgnoreCase(currentMotor.getCase_info())
|| "single-use".equalsIgnoreCase(currentMotor.getCase_info())) {
currentMotor.setCase_info(currentMotor.getType() + " " + currentMotor.getDiameter() + "x" + currentMotor.getLength());
}
response.addMotor(currentMotor);
break;
case motor_id:
currentMotor.setMotor_id(Integer.parseInt(content));
break;
case manufacturer:
currentMotor.setManufacturer(content);
break;
case manufacturer_abbr:
currentMotor.setManufacturer_abbr(content);
break;
case designation:
currentMotor.setDesignation(content);
break;
case brand_name:
currentMotor.setBrand_name(content);
break;
case common_name:
currentMotor.setCommon_name(content);
break;
case impulse_class:
currentMotor.setImpulse_class(content);
break;
case diameter:
currentMotor.setDiameter(Float.parseFloat(content));
break;
case length:
currentMotor.setLength(Float.parseFloat(content));
break;
case type:
currentMotor.setType(content);
break;
case cert_org:
currentMotor.setCert_org(content);
break;
case avg_thrust_n:
currentMotor.setAvg_thrust_n(Float.parseFloat(content));
break;
case max_thrust_n:
currentMotor.setMax_thrust_n(Float.parseFloat(content));
break;
case tot_impulse_ns:
currentMotor.setTot_impulse_ns(Float.parseFloat(content));
break;
case burn_time_s:
currentMotor.setBurn_time_s(Float.parseFloat(content));
break;
case data_files:
currentMotor.setData_files(Integer.parseInt(content));
break;
case info_url:
currentMotor.setInfo_url(content);
break;
case total_weight_g:
currentMotor.setTot_mass_g(Double.parseDouble(content));
break;
case prop_weight_g:
currentMotor.setProp_mass_g(Double.parseDouble(content));
break;
case delays:
currentMotor.setDelays(content);
break;
case case_info:
currentMotor.setCase_info(content);
break;
case prop_info:
currentMotor.setProp_info(content);
break;
case availability:
currentMotor.setAvailability(content);
break;
}
}
@Override
public void endHandler(String element, HashMap<String, String> attributes, String content, WarningSet warnings) throws SAXException {
}
}

View File

@ -0,0 +1,195 @@
package net.sf.openrocket.thrustcurve;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.SAXException;
import net.sf.openrocket.file.iterator.DirectoryIterator;
import net.sf.openrocket.file.iterator.FileIterator;
import net.sf.openrocket.file.motor.GeneralMotorLoader;
import net.sf.openrocket.gui.util.SimpleFileFilter;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.ThrustCurveMotor;
import net.sf.openrocket.motor.ThrustCurveMotor.Builder;
import net.sf.openrocket.util.Pair;
public class SerializeThrustcurveMotors {
private static String[] manufacturers = {
"AeroTech",
"Alpha",
"AMW",
"Apogee",
"Cesaroni",
"Contrail",
"Ellis",
"Estes",
"GR",
"Hypertek",
"KBA",
"Kosdon",
"Loki",
"PP",
"PML",
"Quest",
"RATT",
"Roadrunner",
"RV",
"SkyR",
"SCR",
"WCH"
};
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.out.println("Usage: java " + SerializeThrustcurveMotors.class.getCanonicalName() + " <input-dir> <output-file>");
System.exit(1);
}
String inputDir = args[0];
String outputFile = args[1];
final List<Motor> allMotors = new ArrayList<Motor>();
loadFromLocalMotorFiles(allMotors, inputDir);
loadFromThrustCurve(allMotors);
File outFile = new File(outputFile);
FileOutputStream ofs = new FileOutputStream(outFile);
final ObjectOutputStream oos = new ObjectOutputStream(ofs);
oos.writeObject(allMotors);
oos.flush();
ofs.flush();
ofs.close();
}
public static void loadFromThrustCurve(List<Motor> allMotors) throws SAXException, MalformedURLException, IOException {
SearchRequest searchRequest = new SearchRequest();
for (String m : manufacturers) {
searchRequest.setManufacturer(m);
System.out.println("Motors for : " + m);
SearchResponse res = ThrustCurveAPI.doSearch(searchRequest);
for (TCMotor mi : res.getResults()) {
StringBuilder message = new StringBuilder();
message.append(mi.getManufacturer_abbr());
message.append(" ");
message.append(mi.getCommon_name());
message.append(" ");
message.append(mi.getMotor_id());
if (mi.getData_files() == null || mi.getData_files().intValue() == 0) {
continue;
}
final Motor.Type type;
switch (mi.getType()) {
case "SU":
type = Motor.Type.SINGLE;
break;
case "reload":
type = Motor.Type.RELOAD;
break;
case "hybrid":
type = Motor.Type.HYBRID;
break;
default:
type = Motor.Type.UNKNOWN;
break;
}
System.out.println(message);
List<MotorBurnFile> b = getThrustCurvesForMotorId(mi.getMotor_id());
for (MotorBurnFile burnFile : b) {
ThrustCurveMotor.Builder builder = burnFile.getThrustCurveMotor();
if (builder == null) {
continue;
}
if (mi.getTot_mass_g() != null) {
builder.setInitialMass(mi.getTot_mass_g() / 1000.0);
}
if (mi.getProp_mass_g() != null) {
builder.setPropellantMass(mi.getProp_mass_g() / 1000.0);
}
builder.setCaseInfo(mi.getCase_info())
.setPropellantInfo(mi.getProp_info())
.setDiameter(mi.getDiameter() / 1000.0)
.setLength(mi.getLength() / 1000.0)
.setMotorType(type);
if ("OOP".equals(mi.getAvailiability())) {
builder.setDesignation(mi.getDesignation());
builder.setAvailablity(false);
} else if (mi.getDesignation().startsWith("Micro")) {
builder.setDesignation(mi.getDesignation());
} else {
builder.setDesignation(mi.getCommon_name());
}
allMotors.add(builder.build());
}
System.out.println("\t curves: " + b.size());
}
}
}
private static List<MotorBurnFile> getThrustCurvesForMotorId(int motorId) {
List<MotorBurnFile> b = new ArrayList<>();
try {
b.addAll(ThrustCurveAPI.downloadData(motorId, "RockSim"));
} catch (Exception ex) {
System.out.println("\tError downloading RockSim");
}
try {
b.addAll(ThrustCurveAPI.downloadData(motorId, "RASP"));
} catch (Exception ex) {
System.out.println("\tError downloading RASP");
}
return b;
}
private static void loadFromLocalMotorFiles(List<Motor> allMotors, String inputDir) throws IOException {
GeneralMotorLoader loader = new GeneralMotorLoader();
FileIterator iterator = DirectoryIterator.findDirectory(inputDir, new SimpleFileFilter("", false, loader.getSupportedExtensions()));
if (iterator == null) {
System.out.println("Can't find " + inputDir + " directory");
System.exit(1);
} else {
while (iterator.hasNext()) {
Pair<String, InputStream> f = iterator.next();
String fileName = f.getU();
InputStream is = f.getV();
List<Builder> motors = loader.load(is, fileName);
for (Builder builder : motors) {
allMotors.add(builder.build());
}
}
}
}
}

View File

@ -0,0 +1,11 @@
package net.sf.openrocket.thrustcurve;
public abstract class SupportedFileTypes {
public final static String ROCKSIM_FORMAT = "RockSim";
public final static String RASP_FORMAT = "RASP";
public static boolean isSupportedFileType( String arg0 ) {
return (ROCKSIM_FORMAT.equals(arg0) || RASP_FORMAT.equals(arg0));
}
}

View File

@ -0,0 +1,298 @@
package net.sf.openrocket.thrustcurve;
import java.util.Date;
public class TCMotor implements Cloneable {
private Integer motor_id;
private String manufacturer;
private String manufacturer_abbr;
private String designation;
private String brand_name;
private String common_name;
private String impulse_class;
private Float diameter;
private Float length;
private String type;
private String cert_org;
private Float avg_thrust_n;
private Float max_thrust_n;
private Float tot_impulse_ns;
private Float burn_time_s;
private Integer data_files;
private String info_url;
private Double tot_mass_g;
private Double prop_mass_g;
private String delays;
private String case_info;
private String prop_info;
private Date updated_on;
private String availability;
public void init() {
motor_id = null;
manufacturer = null;
manufacturer_abbr = null;
designation = null;
brand_name = null;
common_name = null;
impulse_class = null;
diameter = null;
length = null;
type = null;
cert_org = null;
avg_thrust_n = null;
max_thrust_n = null;
tot_impulse_ns = null;
burn_time_s = null;
data_files = null;
info_url = null;
tot_mass_g = null;
prop_mass_g = null;
delays = null;
case_info = null;
prop_info = null;
updated_on = null;
availability = null;
}
@Override
public TCMotor clone() {
TCMotor clone = new TCMotor();
clone.motor_id = this.motor_id;
clone.manufacturer = this.manufacturer;
clone.manufacturer_abbr = this.manufacturer_abbr;
clone.designation = this.designation;
clone.brand_name = this.brand_name;
clone.common_name = this.common_name;
clone.impulse_class = this.impulse_class;
clone.diameter = this.diameter;
clone.length = this.length;
clone.type = this.type;
clone.cert_org = this.cert_org;
clone.avg_thrust_n = this.avg_thrust_n;
clone.max_thrust_n = this.max_thrust_n;
clone.tot_impulse_ns = this.tot_impulse_ns;
clone.burn_time_s = this.burn_time_s;
clone.data_files = this.data_files;
clone.info_url = this.info_url;
clone.tot_mass_g = this.tot_mass_g;
clone.prop_mass_g = this.prop_mass_g;
clone.delays = this.delays;
clone.case_info = this.case_info;
clone.prop_info = this.prop_info;
clone.updated_on = this.updated_on;
clone.availability = this.availability;
return clone;
}
public Integer getMotor_id() {
return motor_id;
}
public void setMotor_id(Integer motor_id) {
this.motor_id = motor_id;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getManufacturer_abbr() {
return manufacturer_abbr;
}
public void setManufacturer_abbr(String manufacturer_abbr) {
this.manufacturer_abbr = manufacturer_abbr;
}
public String getDesignation() {
return designation;
}
public void setDesignation(String designation) {
this.designation = designation;
}
public String getBrand_name() {
return brand_name;
}
public void setBrand_name(String brand_name) {
this.brand_name = brand_name;
}
public String getCommon_name() {
return common_name;
}
public void setCommon_name(String common_name) {
this.common_name = common_name;
}
public String getImpulse_class() {
return impulse_class;
}
public void setImpulse_class(String impulse_class) {
this.impulse_class = impulse_class;
}
public Float getDiameter() {
return diameter;
}
public void setDiameter(Float diameter) {
this.diameter = diameter;
}
public Float getLength() {
return length;
}
public void setLength(Float length) {
this.length = length;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getCert_org() {
return cert_org;
}
public void setCert_org(String cert_org) {
this.cert_org = cert_org;
}
public Float getAvg_thrust_n() {
return avg_thrust_n;
}
public void setAvg_thrust_n(Float avg_thrust_n) {
this.avg_thrust_n = avg_thrust_n;
}
public Float getMax_thrust_n() {
return max_thrust_n;
}
public void setMax_thrust_n(Float max_thrust_n) {
this.max_thrust_n = max_thrust_n;
}
public Float getTot_impulse_ns() {
return tot_impulse_ns;
}
public void setTot_impulse_ns(Float tot_impulse_ns) {
this.tot_impulse_ns = tot_impulse_ns;
}
public Float getBurn_time_s() {
return burn_time_s;
}
public void setBurn_time_s(Float burn_time_s) {
this.burn_time_s = burn_time_s;
}
public Integer getData_files() {
return data_files;
}
public void setData_files(Integer data_files) {
this.data_files = data_files;
}
public String getInfo_url() {
return info_url;
}
public void setInfo_url(String info_url) {
this.info_url = info_url;
}
public Double getTot_mass_g() {
return tot_mass_g;
}
public void setTot_mass_g(Double tot_mass_g) {
this.tot_mass_g = tot_mass_g;
}
public Double getProp_mass_g() {
return prop_mass_g;
}
public void setProp_mass_g(Double prop_mass_g) {
this.prop_mass_g = prop_mass_g;
}
public String getDelays() {
return delays;
}
public void setDelays(String delays) {
this.delays = delays;
}
public String getCase_info() {
return case_info;
}
public void setCase_info(String case_info) {
this.case_info = case_info;
}
public String getProp_info() {
return prop_info;
}
public void setProp_info(String prop_info) {
this.prop_info = prop_info;
}
public Date getUpdated_on() {
return updated_on;
}
public void setUpdated_on(Date updated_on) {
this.updated_on = updated_on;
}
public String getAvailiability() {
return availability;
}
public void setAvailability(String avail) {
this.availability = avail;
}
@Override
public String toString() {
return "TCMotor [motor_id=" + motor_id + ", manufacturer="
+ manufacturer + ", manufacturer_abbr=" + manufacturer_abbr
+ ", designation=" + designation + ", brand_name=" + brand_name
+ ", common_name=" + common_name + ", impulse_class="
+ impulse_class + ", diameter=" + diameter + ", length="
+ length + ", type=" + type + ", cert_org=" + cert_org
+ ", avg_thrust_n=" + avg_thrust_n + ", max_thrust_n="
+ max_thrust_n + ", tot_impulse_ns=" + tot_impulse_ns
+ ", burn_time_s=" + burn_time_s + ", data_files=" + data_files
+ ", info_url=" + info_url + ", tot_mass_g=" + tot_mass_g
+ ", prop_mass_g=" + prop_mass_g + ", delays=" + delays
+ ", case_info=" + case_info + ", prop_info=" + prop_info
+ ", updated_on=" + updated_on + "]";
}
}

View File

@ -0,0 +1,83 @@
package net.sf.openrocket.thrustcurve;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collections;
import java.util.List;
import org.xml.sax.SAXException;
public abstract class ThrustCurveAPI {
public static SearchResponse doSearch(SearchRequest request) throws MalformedURLException, IOException, SAXException {
String requestString = request.toString();
// Froyo has troubles resolving URLS constructed with protocols. Because of this
// we need to do it in parts.
URL url = new URL("http", "www.thrustcurve.org", "/servlets/search");
OutputStream stream;
URLConnection conn = url.openConnection();
conn.setConnectTimeout(2000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
stream = conn.getOutputStream();
stream.write(requestString.getBytes());
InputStream is = conn.getInputStream();
SearchResponse result = SearchResponseParser.parse(is);
return result;
}
public static List<MotorBurnFile> downloadData(Integer motor_id, String format) throws MalformedURLException, IOException, SAXException {
if (motor_id == null) {
return null;
}
DownloadRequest dr = new DownloadRequest();
dr.add(motor_id);
dr.setFormat(format);
String requestString = dr.toString();
// Froyo has troubles resolving URLS constructed with protocols. Because of this
// we need to do it in parts.
URL url = new URL("http", "www.thrustcurve.org", "/servlets/download");
OutputStream stream;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
stream = conn.getOutputStream();
stream.write(requestString.getBytes());
if (conn.getResponseCode() == HttpURLConnection.HTTP_BAD_REQUEST) {
return Collections.<MotorBurnFile> emptyList();
}
InputStream is = conn.getInputStream();
DownloadResponse downloadResponse = DownloadResponseParser.parse(is);
return downloadResponse.getData(motor_id);
}
}