001: /*--
002: $Id: ConverterLibrary.java,v 1.1 2004/03/01 07:56:05 wolfpaulus Exp $
003:
004: Copyright (C) 2003-2007 Wolf Paulus.
005: All rights reserved.
006:
007: Redistribution and use in source and binary forms, with or without
008: modification, are permitted provided that the following conditions
009: are met:
010:
011: 1. Redistributions of source code must retain the above copyright
012: notice, this list of conditions, and the following disclaimer.
013:
014: 2. Redistributions in binary form must reproduce the above copyright
015: notice, this list of conditions, and the disclaimer that follows
016: these conditions in the documentation and/or other materials provided
017: with the distribution.
018:
019: 3. The end-user documentation included with the redistribution,
020: if any, must include the following acknowledgment:
021: "This product includes software developed by the
022: SWIXML Project (http://www.swixml.org/)."
023: Alternately, this acknowledgment may appear in the software itself,
024: if and wherever such third-party acknowledgments normally appear.
025:
026: 4. The name "Swixml" must not be used to endorse or promote products
027: derived from this software without prior written permission. For
028: written permission, please contact <info_AT_swixml_DOT_org>
029:
030: 5. Products derived from this software may not be called "Swixml",
031: nor may "Swixml" appear in their name, without prior written
032: permission from the Swixml Project Management.
033:
034: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037: DISCLAIMED. IN NO EVENT SHALL THE SWIXML PROJECT OR ITS
038: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
039: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
040: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
041: USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
042: ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
043: OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
044: OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
045: SUCH DAMAGE.
046: ====================================================================
047:
048: This software consists of voluntary contributions made by many
049: individuals on behalf of the Swixml Project and was originally
050: created by Wolf Paulus <wolf_AT_swixml_DOT_org>. For more information
051: on the Swixml Project, please see <http://www.swixml.org/>.
052: */
053:
054: package org.swixml;
055:
056: import org.swixml.converters.*;
057:
058: import javax.swing.*;
059: import javax.swing.border.Border;
060: import java.awt.*;
061: import java.util.HashMap;
062: import java.util.Iterator;
063: import java.util.Locale;
064: import java.util.Map;
065:
066: /**
067: * <p>The <code>ConverterLibrary</code> contains all available Coverters, converting Strings.</p>
068: * <p>General purpose data type converters are able to convert Strings into objects that are
069: * usually as parameters when setters are called on javax.swing objects.
070: * <pre>
071: * Available Converter include converters able to produce
072: * <ul>
073: * <li>Primitives</li>
074: * <li>Dimension</li>
075: * <li>Color</li>
076: * <li>Border</li>
077: * <li>etc.</li>
078: * </ul>
079: * </pre>
080: * <pre>
081: * Example String inputs could look like this:
082: * <ul>
083: * <li>MatteBorder(4,4,4,4,red)</li>
084: * <li>FFCCEE</li>
085: * <li>BorderLayout.CENTER</li>
086: * <li>2,2,2,2</li>
087: * </ul>
088: * </pre>
089: * Date: Dec 16, 2002
090: *
091: * @author <a href="mailto:wolf@wolfpaulus.com">Wolf Paulus</a>
092: * @version $Revision: 1.1 $
093: * @see org.swixml.Converter
094: */
095: public class ConverterLibrary {
096: private static ConverterLibrary instance = new ConverterLibrary();
097: private Map<Class, Converter> converters = new HashMap<Class, Converter>();
098:
099: /**
100: * The only available Ctor is private to make this a Singleton
101: */
102: private ConverterLibrary() {
103: registerConverters();
104: }
105:
106: /**
107: * @return <code>ConverterLibrary</code> the single instacne of the ConverterLibrary.
108: */
109: public static synchronized ConverterLibrary getInstance() {
110: return instance;
111: }
112:
113: /**
114: * @return <code>Map</code> - all registered converters.
115: * <pre>Use a class to get to the converters</pre>
116: */
117: public Map getConverters() {
118: return converters;
119: }
120:
121: /**
122: * Registers <code>Converters</code> with the ConverterLibrary.
123: */
124: private void registerConverters() {
125: register(Action.class, new ActionConverter());
126: register(Border.class, new BorderConverter());
127: register(Color.class, new ColorConverter());
128: register(Component.class, new ComponentConverter());
129: register(Dimension.class, new DimensionConverter());
130: register(Font.class, new FontConverter());
131: register(Image.class, new ImageConverter());
132: register(Icon.class, new ImageIconConverter());
133: register(ImageIcon.class, new ImageIconConverter());
134: register(Insets.class, new InsetsConverter());
135: register(KeyStroke.class, new KeyStrokeConverter());
136: register(Locale.class, new LocaleConverter());
137: register(Point.class, new PointConverter());
138: register(Rectangle.class, new RectangleConverter());
139: register(String.class, new StringConverter());
140: //
141: // Register the PrimitiveConverter class for java primitive types
142: //
143: register(boolean.class, new PrimitiveConverter());
144: register(int.class, new PrimitiveConverter());
145: register(long.class, new PrimitiveConverter());
146: register(float.class, new PrimitiveConverter());
147: register(double.class, new PrimitiveConverter());
148: }
149:
150: /**
151: * Registers a Converter with the ConverterLibrary
152: *
153: * @param converter <code>Converter</code> Instance of Converter able to convert Strings into objects of the given type
154: */
155: public void register(Converter converter) {
156: converters.put(converter.convertsTo(), converter);
157: }
158:
159: /**
160: * Registers a Converter with the ConverterLibrary
161: *
162: * @param template <code>Class</code> type of the objects the Converter creates
163: * @param converter <code>Converter</code> Instance of Converter able to convert Strings into objects of the given type
164: */
165: public void register(Class template, Converter converter) {
166: converters.put(template, converter);
167: }
168:
169: /**
170: * Indicates if a the ConverterLibary has a Converter producing instances of the given Class.
171: *
172: * @param template <code>Class</code>
173: * @return <code>boolean</code> true, if the ConverterLibrary has a Converter to produce an instances of the gioven class.
174: */
175: public boolean hasConverter(Class template) {
176: boolean found = converters.keySet().contains(template);
177: Iterator it = converters.values().iterator();
178: while (!found && it != null && it.hasNext()) {
179: found = template.isAssignableFrom(((Converter) it.next())
180: .convertsTo());
181: }
182: return found;
183: }
184:
185: /**
186: * Returns a <code>Converter</code> instance, able to produce objects of the given <code>class</code>
187: *
188: * @param template <code>Class</code> Class of the object the <code>Converter</code> needs to produce.
189: * @return <code>Converter</code> - instance of the given Converter class.
190: */
191: public Converter getConverter(Class template) {
192: return converters.get(template);
193: }
194: }
|