1 package net.sf.openrocket.motor;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashSet;
9 public class Manufacturer {
11 private static Set<Manufacturer> manufacturers = new HashSet<Manufacturer>();
14 // AeroTech has many name combinations...
15 List<String> names = new ArrayList<String>();
16 for (String s: new String[] { "A", "AT", "AERO", "AEROT", "AEROTECH" }) {
20 names.add("RCS-" + s);
21 names.add(s+"-APOGEE");
25 manufacturers.add(new Manufacturer("AeroTech", "AeroTech",
26 names.toArray(new String[0])));
28 manufacturers.add(new Manufacturer("Alpha Hybrid Rocketry LLC",
29 "Alpha Hybrid Rocketry",
30 "AHR", "ALPHA", "ALPHA HYBRID", "ALPHA HYBRIDS", "ALPHA HYBRIDS ROCKETRY"));
32 manufacturers.add(new Manufacturer("Animal Motor Works","Animal Motor Works",
33 "AMW", "AW", "ANIMAL"));
35 manufacturers.add(new Manufacturer("Apogee","Apogee",
38 manufacturers.add(new Manufacturer("Cesaroni Technology Inc.",
39 "Cesaroni Technology",
40 "CES", "CESARONI", "CESARONI TECHNOLOGY INCORPORATED", "CTI",
41 "CS", "CSR", "PRO38"));
43 manufacturers.add(new Manufacturer("Contrail Rockets","Contrail Rockets",
44 "CR", "CONTR", "CONTRAIL", "CONTRAIL ROCKET"));
46 manufacturers.add(new Manufacturer("Estes","Estes",
49 manufacturers.add(new Manufacturer("Ellis Mountain","Ellis Mountain",
50 "EM", "ELLIS", "ELLIS MOUNTAIN ROCKET", "ELLIS MOUNTAIN ROCKETS"));
52 manufacturers.add(new Manufacturer("Gorilla Rocket Motors",
53 "Gorilla Rocket Motors",
54 "GR", "GORILLA", "GORILLA ROCKET", "GORILLA ROCKETS", "GORILLA MOTOR",
55 "GORILLA MOTORS", "GORILLA ROCKET MOTOR"));
57 manufacturers.add(new Manufacturer("HyperTEK", "HyperTEK",
60 manufacturers.add(new Manufacturer("Kosdon by AeroTech", "Kosdon by AeroTech",
61 "K", "KBA", "K-AT", "KOS", "KOSDON", "KOSDON/AT", "KOSDON/AEROTECH"));
63 manufacturers.add(new Manufacturer("Loki Research", "Loki Research",
66 manufacturers.add(new Manufacturer("Public Missiles, Ltd.", "Public Missiles",
67 "PM", "PML", "PUBLIC MISSILES LIMITED"));
69 manufacturers.add(new Manufacturer("Propulsion Polymers", "Propulsion Polymers",
70 "PP", "PROP", "PROPULSION"));
72 manufacturers.add(new Manufacturer("Quest", "Quest",
75 manufacturers.add(new Manufacturer("RATT Works", "RATT Works",
76 "RATT", "RT", "RTW"));
78 manufacturers.add(new Manufacturer("Roadrunner Rocketry","Roadrunner Rocketry",
81 manufacturers.add(new Manufacturer("Rocketvision", "Rocketvision",
82 "RV", "ROCKET VISION"));
84 manufacturers.add(new Manufacturer("Sky Ripper Systems","Sky Ripper Systems",
85 "SR", "SRS", "SKYR", "SKYRIPPER", "SKY RIPPER", "SKYRIPPER SYSTEMS"));
87 manufacturers.add(new Manufacturer("West Coast Hybrids", "West Coast Hybrids",
88 "WCH", "WCR", "WEST COAST", "WEST COAST HYBRID"));
90 // German WECO Feuerwerk, previously Sachsen Feuerwerk
91 manufacturers.add(new Manufacturer("WECO Feuerwerk", "WECO Feuerwerk",
92 "WECO", "WECO FEUERWERKS", "SF", "SACHSEN", "SACHSEN FEUERWERK",
93 "SACHSEN FEUERWERKS"));
96 // Check that no duplicates have appeared
97 for (Manufacturer m1: manufacturers) {
98 for (Manufacturer m2: manufacturers) {
101 for (String name: m1.getAllNames()) {
102 if (m2.matches(name)) {
103 throw new IllegalStateException("Manufacturer name clash between " +
104 "manufacturers " + m1 + " and " + m2 + " name " + name);
113 private final String displayName;
114 private final String simpleName;
115 private final Set<String> allNames;
116 private final Set<String> searchNames;
119 private Manufacturer(String displayName, String simpleName, String... alternateNames) {
120 this.displayName = displayName;
121 this.simpleName = simpleName;
123 Set<String> all = new HashSet<String>();
124 Set<String> search = new HashSet<String>();
126 all.add(displayName);
128 search.add(generateSearchString(displayName));
129 search.add(generateSearchString(simpleName));
131 for (String name: alternateNames) {
133 search.add(generateSearchString(name));
136 this.allNames = Collections.unmodifiableSet(all);
137 this.searchNames = Collections.unmodifiableSet(search);
142 * Returns the display name of the manufacturer. This is the value that
143 * should be presented in the UI to the user.
145 * @return the display name
147 public String getDisplayName() {
153 * Returns the simple name of the manufacturer. This should be used for example
154 * when saving the manufacturer for compatibility.
156 * @return the simple name.
158 public String getSimpleName() {
164 * Return all names of the manufacturer. This includes all kinds of
165 * codes that correspond to the manufacturer (for example "A" for AeroTech).
167 * @return an unmodifiable set of the alternative names.
169 public Set<String> getAllNames() {
175 * Check whether the display, simple or any of the alternative names matches the
176 * specified name. Matching is performed case insensitively and ignoring any
177 * non-letter and non-number characters.
179 * @param name the name to search for.
180 * @return whether this manufacturer matches the request.
182 public boolean matches(String name) {
185 return this.searchNames.contains(generateSearchString(name));
190 * Return the display name of the manufacturer.
193 public String toString() {
199 * Returns a manufacturer for the given name. The manufacturer is searched for
200 * within the manufacturers and if a match is found the corresponding
201 * object is returned. If not, a new manufacturer is returned with display and
202 * simple name the name specified. Subsequent requests for the same (or corresponding)
203 * manufacturer name will return the same object.
205 * @param name the manufacturer name to search for.
206 * @return the Manufacturer object corresponding the name.
208 public static synchronized Manufacturer getManufacturer(String name) {
209 for (Manufacturer m: manufacturers) {
214 Manufacturer m = new Manufacturer(name.trim(), name.trim());
215 manufacturers.add(m);
222 private String generateSearchString(String str) {
223 return str.toLowerCase().replaceAll("[^a-zA-Z0-9]+", " ").trim();