version 1.0.0
[debian/openrocket] / src / net / sf / openrocket / motor / Manufacturer.java
1 package net.sf.openrocket.motor;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Set;
8
9 public class Manufacturer {
10         
11         private static Set<Manufacturer> manufacturers = new HashSet<Manufacturer>();
12         static {
13
14                 // AeroTech has many name combinations...
15                 List<String> names = new ArrayList<String>();
16                 for (String s: new String[] { "A", "AT", "AERO", "AEROT", "AEROTECH" }) {
17                         names.add(s);
18                         names.add(s+"-RMS");
19                         names.add(s+"-RCS");
20                         names.add("RCS-" + s);
21                         names.add(s+"-APOGEE");
22                 }
23                 names.add("ISP");
24
25                 manufacturers.add(new Manufacturer("AeroTech", "AeroTech",
26                                 names.toArray(new String[0])));
27                 
28                 manufacturers.add(new Manufacturer("Alpha Hybrid Rocketry LLC",
29                                 "Alpha Hybrid Rocketry",
30                                 "AHR", "ALPHA", "ALPHA HYBRID", "ALPHA HYBRIDS", "ALPHA HYBRIDS ROCKETRY"));
31
32                 manufacturers.add(new Manufacturer("Animal Motor Works","Animal Motor Works",
33                                 "AMW", "AW", "ANIMAL"));
34
35                 manufacturers.add(new Manufacturer("Apogee","Apogee",
36                                 "AP", "APOG", "P"));
37
38                 manufacturers.add(new Manufacturer("Cesaroni Technology Inc.",
39                                 "Cesaroni Technology",
40                                 "CES", "CESARONI", "CESARONI TECHNOLOGY INCORPORATED", "CTI",
41                                 "CS", "CSR", "PRO38", "ABC"));
42
43                 manufacturers.add(new Manufacturer("Contrail Rockets","Contrail Rockets",
44                                 "CR", "CONTR", "CONTRAIL", "CONTRAIL ROCKET"));
45                 
46                 manufacturers.add(new Manufacturer("Estes","Estes",
47                                 "E", "ES"));
48                 
49                 manufacturers.add(new Manufacturer("Ellis Mountain","Ellis Mountain",
50                                 "EM", "ELLIS", "ELLIS MOUNTAIN ROCKET", "ELLIS MOUNTAIN ROCKETS"));
51
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"));
56                 
57                 manufacturers.add(new Manufacturer("HyperTEK", "HyperTEK",
58                                 "H", "HT", "HYPER"));
59                 
60                 manufacturers.add(new Manufacturer("Kosdon by AeroTech", "Kosdon by AeroTech",
61                                 "K", "KBA", "K-AT", "KOS", "KOSDON", "KOSDON/AT", "KOSDON/AEROTECH"));
62                 
63                 manufacturers.add(new Manufacturer("Loki Research", "Loki Research",
64                                 "LOKI", "LR"));
65                 
66                 manufacturers.add(new Manufacturer("Public Missiles, Ltd.", "Public Missiles",
67                                 "PM", "PML", "PUBLIC MISSILES LIMITED"));
68
69                 manufacturers.add(new Manufacturer("Propulsion Polymers", "Propulsion Polymers",
70                                 "PP", "PROP", "PROPULSION"));
71                 
72                 manufacturers.add(new Manufacturer("Quest", "Quest",
73                                 "Q", "QU"));
74                 
75                 manufacturers.add(new Manufacturer("RATT Works", "RATT Works",
76                                 "RATT", "RT", "RTW"));
77                 
78                 manufacturers.add(new Manufacturer("Roadrunner Rocketry","Roadrunner Rocketry",
79                                 "RR", "ROADRUNNER"));
80                 
81                 manufacturers.add(new Manufacturer("Rocketvision", "Rocketvision",
82                                 "RV", "ROCKET VISION"));
83                 
84                 manufacturers.add(new Manufacturer("Sky Ripper Systems","Sky Ripper Systems",
85                                 "SR", "SRS", "SKYR", "SKYRIPPER", "SKY RIPPER", "SKYRIPPER SYSTEMS"));
86                 
87                 manufacturers.add(new Manufacturer("West Coast Hybrids", "West Coast Hybrids",
88                                 "WCH", "WCR", "WEST COAST", "WEST COAST HYBRID"));
89                 
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"));
94                 
95                 
96                 // Check that no duplicates have appeared
97                 for (Manufacturer m1: manufacturers) {
98                         for (Manufacturer m2: manufacturers) {
99                                 if (m1 == m2)
100                                         continue;
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);
105                                         }
106                                 }
107                         }
108                 }
109         }
110         
111         
112
113         private final String displayName;
114         private final String simpleName;
115         private final Set<String> allNames;
116         private final Set<String> searchNames;
117         
118         
119         private Manufacturer(String displayName, String simpleName, String... alternateNames) {
120                 this.displayName = displayName;
121                 this.simpleName = simpleName;
122                 
123                 Set<String> all = new HashSet<String>();
124                 Set<String> search = new HashSet<String>();
125                 
126                 all.add(displayName);
127                 all.add(simpleName);
128                 search.add(generateSearchString(displayName));
129                 search.add(generateSearchString(simpleName));
130                 
131                 for (String name: alternateNames) {
132                         all.add(name);
133                         search.add(generateSearchString(name));
134                 }
135                 
136                 this.allNames = Collections.unmodifiableSet(all);
137                 this.searchNames = Collections.unmodifiableSet(search);
138         }
139         
140         
141         /**
142          * Returns the display name of the manufacturer.  This is the value that
143          * should be presented in the UI to the user.
144          * 
145          * @return      the display name
146          */
147         public String getDisplayName() {
148                 return displayName;
149         }
150
151
152         /**
153          * Returns the simple name of the manufacturer.  This should be used for example
154          * when saving the manufacturer for compatibility.
155          * 
156          * @return      the simple name.
157          */
158         public String getSimpleName() {
159                 return simpleName;
160         }
161
162
163         /**
164          * Return all names of the manufacturer.  This includes all kinds of
165          * codes that correspond to the manufacturer (for example "A" for AeroTech).
166          * 
167          * @return      an unmodifiable set of the alternative names.
168          */
169         public Set<String> getAllNames() {
170                 return allNames;
171         }
172
173         
174         /**
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.
178          * 
179          * @param name  the name to search for.
180          * @return              whether this manufacturer matches the request.
181          */
182         public boolean matches(String name) {
183                 if (name == null)
184                         return false;
185                 return this.searchNames.contains(generateSearchString(name));
186         }
187         
188         
189         /**
190          * Return the display name of the manufacturer.
191          */
192         @Override
193         public String toString() {
194                 return displayName;
195         }
196         
197         
198         /**
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.
204          * 
205          * @param name  the manufacturer name to search for.
206          * @return              the Manufacturer object corresponding the name.
207          */
208         public static synchronized Manufacturer getManufacturer(String name) {
209                 for (Manufacturer m: manufacturers) {
210                         if (m.matches(name))
211                                 return m;
212                 }
213                 
214                 Manufacturer m = new Manufacturer(name.trim(), name.trim());
215                 manufacturers.add(m);
216                 return m;
217         }
218         
219         
220         
221                 
222         private String generateSearchString(String str) {
223                 return str.toLowerCase().replaceAll("[^a-zA-Z0-9]+", " ").trim();
224         }
225         
226 }