1 //
2 //Copyright (c) 2003, 2004 Caltha - Gajda, Krzewski, Mach, Potempski Sp.J.
3 //All rights reserved.
4 //
5 //Redistribution and use in source and binary forms, with or without modification,
6 //are permitted provided that the following conditions are met:
7 //
8 //* Redistributions of source code must retain the above copyright notice,
9 //this list of conditions and the following disclaimer.
10 //* Redistributions in binary form must reproduce the above copyright notice,
11 //this list of conditions and the following disclaimer in the documentation
12 //and/or other materials provided with the distribution.
13 //* Neither the name of the Caltha - Gajda, Krzewski, Mach, Potempski Sp.J.
14 //nor the names of its contributors may be used to endorse or promote products
15 //derived from this software without specific prior written permission.
16 //
17 //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 //AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 //WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 //IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
21 //INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
22 //BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 //OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 //WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 //ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 //POSSIBILITY OF SUCH DAMAGE.
27 //
28
29 package org.objectledge.encodings;
30
31 import org.objectledge.ComponentInitializationError;
32 import org.objectledge.encodings.encoders.CharEncoder;
33 import org.picocontainer.MutablePicoContainer;
34 import org.picocontainer.defaults.ConstructorInjectionComponentAdapterFactory;
35 import org.picocontainer.defaults.DefaultPicoContainer;
36
37 /**
38 * Base encoder using CharacterEncoders.
39 *
40 * @author <a href="mailto:dgajda@caltha.pl">Damian Gajda</a>
41 * @version $Id: AbstractEncoder.java,v 1.2 2004/12/22 08:35:13 rafal Exp $
42 */
43 public abstract class AbstractEncoder
44 {
45 private static final String ENCODER_CLASS_PREFIX =
46 "org.objectledge.encodings.encoders.CharEncoder";
47 private MutablePicoContainer container;
48
49 /***
50 * Constructs the base encoder component.
51 */
52 public AbstractEncoder()
53 {
54 // non caching container
55 this.container =
56 new DefaultPicoContainer(new ConstructorInjectionComponentAdapterFactory());
57 CharEncoder ref1 = getCharsetEncoder("UTF-16");
58 CharEncoder ref2 = getCharsetEncoder("UTF-16");
59 if(ref1 == null || ref2 == null)
60 {
61 throw new ComponentInitializationError("cannot get basic UTF-16 encoder");
62 }
63 if(ref1 == ref2)
64 {
65 throw new ComponentInitializationError(
66 "container configured for component instance caching");
67 }
68 }
69
70 // implementation ----------------------------------------------------------------------------
71
72 /***
73 * Returns an encoder instance for the specific encoding.
74 *
75 * @param encodingName the name of character encoding.
76 * @return the encoder object.
77 */
78 protected CharEncoder getCharsetEncoder(String encodingName)
79 {
80 if(encodingName == null)
81 {
82 return null;
83 }
84
85 try
86 {
87 encodingName = EncodingMap.getIANA2JavaMapping(encodingName);
88 Object encoderInstance = container.getComponentInstance(encodingName);
89 if(encoderInstance == null)
90 {
91 Class clazz = Class.forName(ENCODER_CLASS_PREFIX + encodingName);
92 container.registerComponentImplementation(encodingName, clazz);
93 encoderInstance = container.getComponentInstance(encodingName);
94 }
95 return (CharEncoder) encoderInstance;
96 }
97 catch (ClassNotFoundException e)
98 {
99 throw new IllegalArgumentException(
100 "unknown or unsupported encoding '"+encodingName+"'");
101 }
102 }
103 }