001    package org.picocontainer.defaults;
002    
003    import java.util.Map;
004    
005    /**
006     * A simple factory for ordered maps: use JDK1.4's java.util.LinkedHashMap if available,
007     * or commons-collection's LinkedMap, or defaults to unordered java.util.HashMap
008     *
009     * @author Gregory Joseph
010     * @version $Revision: $ 
011     */
012    public class MapFactory {
013        private static final String JDK14 = "java.util.LinkedHashMap";
014        private static final String COMMONS = "org.apache.commons.collections.map.LinkedMap";
015        private static final String NON_ORDERED = "java.util.HashMap";
016    
017        private Class clazz;
018    
019        public MapFactory() {
020            try {
021                clazz = Class.forName(JDK14);
022            } catch (ClassNotFoundException e) {
023                try {
024                    clazz = Class.forName(COMMONS);
025                } catch (ClassNotFoundException e1) {
026                    try {
027                        clazz = Class.forName(NON_ORDERED);
028                    } catch (ClassNotFoundException e2) {
029                        throw new IllegalStateException("What kind of JRE is this ? No " + NON_ORDERED + " class was found.");
030                    }
031                }
032            }
033        }
034    
035        public Map newInstance() {
036            try {
037                return (Map) clazz.newInstance();
038            } catch (InstantiationException e) {
039                throw new RuntimeException("Could not instantiate " + clazz + " : " + e.getMessage());
040            } catch (IllegalAccessException e) {
041                throw new RuntimeException("Could not instantiate " + clazz + " : " + e.getMessage());
042            }
043        }
044    }