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: ElementParserFactory.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.mdl.IVariableFormatDefinition;
033: import com.bostechcorp.cbesb.common.runtime.CbesbException;
034: import com.bostechcorp.cbesb.common.util.ErrorUtil;
035:
036: /**
037: * The ElementParserFactory class provides a mechanism to provide the correct
038: * implementation of an ElementParser for a given ElementDefinition. This should
039: * be the only method used to instantiate an ElementParser. The LegacyDataParser
040: * contains an instance of this class that is first called by its parse method.
041: * Each implementation of ElementParser will also call this if it needs to
042: * recursively parse any child elements. Instead of creating new instances of
043: * the different ElementParsers each time an element is parsed, the
044: * ElementParserFactory should maintain an instance of each type of
045: * ElementParser and reuse it.
046: *
047: */
048: public class ElementParserFactory {
049:
050: private static ElementParserFactory _instance;
051:
052: private static String parserName = "Leaf,Fixed,VariablePosition,VariableTagged";
053:
054: private Hashtable<String, IElementParser> _parsers = new Hashtable<String, IElementParser>();
055:
056: // for the local service management
057: static {
058:
059: // ElementParserFactory theInstance = ElementParserFactory.instance();
060: // if (theInstance._parsers.size() == 0) {
061: // StringTokenizer tk = new StringTokenizer(parserName, ",");
062: //
063: // while (tk.hasMoreTokens()) {
064: // String name = tk.nextToken();
065: // try {
066: // String className = "com.bostechcorp.cbesb.runtime.parser."
067: // + name + "ElementParser";
068: // Class cls = Class.forName(className);
069: //
070: // theInstance._parsers.put(name.toLowerCase(), (IElementParser)cls
071: // .newInstance());
072: // } catch (Exception e) {
073: // ErrorUtil.printError("Exception in ElementParserFactory to load the '"
074: // + name + "' parser class.",e);
075: // // log.error("Unable to load service [" + name + "]: " +
076: // // e.toString());
077: // }
078: // }
079: // }
080: }
081:
082: /**
083: * Get instance for the element parser factory
084: *
085: * @return instance of element parser factory
086: */
087: public static ElementParserFactory instance()
088: throws ParserException {
089: if (_instance == null) {
090: synchronized (ElementParserFactory.class) {
091: if (_instance == null) {
092: _instance = new ElementParserFactory();
093: if (_instance._parsers.size() == 0) {
094: StringTokenizer tk = new StringTokenizer(
095: parserName, ",");
096:
097: while (tk.hasMoreTokens()) {
098: String name = tk.nextToken();
099: try {
100: String className = "com.bostechcorp.cbesb.runtime.parser."
101: + name + "ElementParser";
102: Class cls = Class.forName(className);
103:
104: _instance._parsers.put(name
105: .toLowerCase(),
106: (IElementParser) cls
107: .newInstance());
108: } catch (Exception e) {
109: throw new ParserException(
110: "Exception in ElementParserFactory to load the '"
111: + name
112: + "' parser class.",
113: CbesbException.SUBMIT_BUG, e);
114: // log.error("Unable to load service [" + name + "]: " +
115: // e.toString());
116: }
117: }
118: }
119:
120: }
121: }
122: }
123: return _instance;
124: }
125:
126: /**
127: * @param elemDef
128: * @return
129: * @throws ParserException
130: */
131: public IElementParser getElementParser(IElementDefinition elemDef)
132: throws ParserException {
133:
134: String parserName = null;
135: if (elemDef.getFormatDefinition() == null
136: || elemDef.getFormatDefinition().equals("")
137: || elemDef.getFormatDefinition().getName() == null) {
138: parserName = new String("leaf");
139: } else {
140: parserName = elemDef.getFormatDefinition().getName();
141: if (parserName.equals("variable")) {
142: IVariableFormatDefinition varFormatDef = (IVariableFormatDefinition) elemDef
143: .getFormatDefinition();
144: if (varFormatDef.getIDMethod() == IVariableFormatDefinition.ID_METHOD_TAG) {
145: parserName = "variabletagged";
146: } else {
147: parserName = "variableposition";
148: }
149: }
150: }
151:
152: IElementParser parser = _parsers.get(parserName);
153:
154: if (parser == null) {
155: throw new ParserException(new Message(
156: Messages.NO_SUCH_SERVICE, parserName).getMessage());
157: }
158:
159: return parser;
160:
161: }
162:
163: public IElementParser getElementParser(String parserName)
164: throws ParserException {
165:
166: IElementParser parser = (IElementParser) _parsers
167: .get(parserName);
168: if (parser == null) {
169: throw new ParserException(new Message(
170: Messages.NO_SUCH_SERVICE, parserName).getMessage());
171: }
172:
173: return parser;
174:
175: }
176: }
|