001: /*
002: * ChainBuilder ESB
003: * Visual Enterprise Integration
004: *
005: * Copyright (C) 2006 Bostech Corporation
006: *
007: * This program is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License as published by the
009: * Free Software Foundation; either version 2 of the License, or (at your option)
010: * any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
014: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
015: * for more details.
016: *
017: * You should have received a copy of the GNU General Public License along with
018: * this program; if not, write to the Free Software Foundation, Inc.,
019: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: *
022: * $Id: ElementSerializerFactory.java 3622 2006-12-12 03:04:08Z lzheng $
023: */
024: package com.bostechcorp.cbesb.runtime.parser;
025:
026: import java.util.Hashtable;
027: import java.util.StringTokenizer;
028:
029: import com.bostechcorp.cbesb.common.i18n.Message;
030: import com.bostechcorp.cbesb.common.i18n.Messages;
031: import com.bostechcorp.cbesb.common.mdl.IElementDefinition;
032: import com.bostechcorp.cbesb.common.runtime.CbesbException;
033: import com.bostechcorp.cbesb.common.util.ErrorUtil;
034:
035: /**
036: * The ElementSerializerFactory class provides a mechanism to provide the
037: * correct implementation of an ElementSerializer for a given ElementDefinition.
038: * This should be the only method used to instantiate an ElementSerializer. The
039: * LegacyDataSerializer contains an instance of this class that is first called
040: * by its serialize method. Each implementation of ElementSerializer will also
041: * call this if it needs to recursively serialize any child elements. Instead of
042: * creating new instances of the different ElementSerializers each time an
043: * element is serialized, the ElementSerializerFactory should maintain an
044: * instance of each type of ElementSerializer and reuse it.
045: *
046: */
047: public class ElementSerializerFactory {
048:
049: private static ElementSerializerFactory _instance;
050:
051: private static String serializerName = "Leaf,Fixed,Variable";
052:
053: private Hashtable _serializers = new Hashtable();
054:
055: // for the local service management
056: static {
057: // ElementSerializerFactory theInstance = ElementSerializerFactory
058: // .instance();
059: // if (theInstance._serializers.size() == 0) {
060: // StringTokenizer tk = new StringTokenizer(serializerName, ",");
061: //
062: // while (tk.hasMoreTokens()) {
063: // String name = tk.nextToken();
064: // try {
065: // String className = "com.bostechcorp.cbesb.runtime.parser."
066: // + name + "ElementSerializer";
067: // Class cls = Class.forName(className);
068: //
069: // theInstance._serializers.put(name.toLowerCase(), cls
070: // .newInstance());
071: // } catch (Exception e) {
072: //
073: // ErrorUtil.printError("Exception in ElementSerializerFactory: ",e);
074: // // log.error("Unable to load service [" + name + "]: " +
075: // // e.toString());
076: // }
077: // }
078: // }
079: }
080:
081: public static ElementSerializerFactory instance()
082: throws ParserException {
083: if (_instance == null) {
084: synchronized (ElementSerializerFactory.class) {
085: if (_instance == null) {
086: _instance = new ElementSerializerFactory();
087: if (_instance._serializers.size() == 0) {
088: StringTokenizer tk = new StringTokenizer(
089: serializerName, ",");
090:
091: while (tk.hasMoreTokens()) {
092: String name = tk.nextToken();
093: try {
094: String className = "com.bostechcorp.cbesb.runtime.parser."
095: + name + "ElementSerializer";
096: Class cls = Class.forName(className);
097:
098: _instance._serializers.put(name
099: .toLowerCase(), cls
100: .newInstance());
101: } catch (Exception e) {
102: throw new ParserException(
103: "Exception in ElementSerializerFactory to load the '"
104: + name
105: + "' serializer class.",
106: CbesbException.SUBMIT_BUG, e);
107:
108: // ErrorUtil.printError("Exception in ElementSerializerFactory: ",e);
109: // log.error("Unable to load service [" + name + "]: " +
110: // e.toString());
111: }
112: }
113: }
114: }
115: }
116: }
117: return _instance;
118: }
119:
120: public IElementSerializer getElementSerializer(
121: IElementDefinition elementDefinition)
122: throws ParserException {
123: String serializerName = null;
124: if (elementDefinition.getFormatDefinition() == null
125: || elementDefinition.getFormatDefinition().equals("")
126: || elementDefinition.getFormatDefinition().getName() == null) {
127: serializerName = new String("leaf");
128: } else {
129: serializerName = elementDefinition.getFormatDefinition()
130: .getName();
131: }
132:
133: IElementSerializer serializer = (IElementSerializer) _serializers
134: .get(serializerName);
135: if (serializer == null) {
136: throw new ParserException(new Message(
137: Messages.NO_SUCH_SERVICE, serializerName)
138: .getMessage());
139: }
140:
141: return serializer;
142: }
143: }
|