Fix correctness and threading issue in new Manufacturer lookup mechanism. It was...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Fri, 24 Aug 2012 20:31:13 +0000 (20:31 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Fri, 24 Aug 2012 20:31:13 +0000 (20:31 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@1000 180e2498-e6e9-4542-8430-84ac67f01cd8

core/src/net/sf/openrocket/motor/Manufacturer.java
core/test/net/sf/openrocket/motor/ManufacturerTest.java

index 142b3d13cb5525efd3ab0f441bfa50aa20a47863..5d562ed7c72799e7f88a26a77d45e27281dfe326 100644 (file)
@@ -18,7 +18,7 @@ public class Manufacturer {
        private static class ManufacturerList extends ConcurrentHashMap<String,Manufacturer> {
                
                void add( Manufacturer m ) {
-                       for( String s : m.getAllNames() ) {
+                       for( String s : m.getSearchNames() ) {
                                Manufacturer previousRegistered;
                                if ( (previousRegistered = putIfAbsent( s, m )) != null ) {
                                        throw new IllegalStateException("Manufacturer name clash between " +
@@ -183,6 +183,9 @@ public class Manufacturer {
                return allNames;
        }
        
+       Set<String> getSearchNames() {
+               return searchNames;
+       }
        
        /**
         * Return the motor type that this manufacturer produces if it produces only one motor type.
@@ -231,21 +234,27 @@ public class Manufacturer {
         * @return              the Manufacturer object corresponding the name.
         */
        public static Manufacturer getManufacturer(String name) {
-               Manufacturer m = manufacturers.get(name);
+               String searchString = generateSearchString(name);
+               Manufacturer m = manufacturers.get(searchString);
                if ( m != null ) {
                        return m;
                }
 
                m = new Manufacturer(name.trim(), name.trim(), Motor.Type.UNKNOWN);
 
-               Manufacturer oldManu = manufacturers.putIfAbsent(name, m);
-               return  (oldManu != null) ? oldManu : m;
+               // We need some additional external synchronization here so we lock on the manufacturers.
+               synchronized( manufacturers ) {
+                       Manufacturer retest = manufacturers.get(searchString);
+                       if ( retest != null ) {
+                               // it exists now.
+                               return retest;
+                       }
+                       manufacturers.add(m);
+               }
+               return m;
        }
        
-       
-       
-       
-       private String generateSearchString(String str) {
+       private static String generateSearchString(String str) {
                return str.toLowerCase(Locale.getDefault()).replaceAll("[^a-zA-Z0-9]+", " ").trim();
        }
        
index 6870c5f2c2429adcc6ef03b3a221ced57b57975c..cd0ce25efb94a67caf72297627a224aad925980f 100644 (file)
@@ -24,6 +24,18 @@ public class ManufacturerTest {
                
        }
        
+       public void testContrail() {
+               Manufacturer c1, c2;
+               
+               c1 = Manufacturer.getManufacturer("Contrail" );
+               
+               // Used in rsp files.
+               c2 = Manufacturer.getManufacturer("Contrail_Rockets");
+               
+               assertNotNull(c1);
+               assertEquals(c1,c2);
+       }
+       
        @Test
        public void testNew() {