001: /*--
002:
003: Copyright (C) 2002-2005 Adrian Price.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The names "OBE" and "Open Business Engine" must not be used to
019: endorse or promote products derived from this software without prior
020: written permission. For written permission, please contact
021: adrianprice@sourceforge.net.
022:
023: 4. Products derived from this software may not be called "OBE" or
024: "Open Business Engine", nor may "OBE" or "Open Business Engine"
025: appear in their name, without prior written permission from
026: Adrian Price (adrianprice@users.sourceforge.net).
027:
028: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
029: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
030: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
031: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
032: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
033: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
034: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
035: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
036: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
037: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
038: POSSIBILITY OF SUCH DAMAGE.
039:
040: For more information on OBE, please see
041: <http://obe.sourceforge.net/>.
042:
043: */
044:
045: package org.obe.spi.service;
046:
047: import org.obe.OBERuntimeException;
048: import org.obe.client.api.WMClient;
049: import org.obe.client.api.repository.ObjectAlreadyExistsException;
050: import org.obe.client.api.repository.ObjectNotFoundException;
051: import org.obe.spi.WorkflowService;
052: import org.obe.xpdl.parser.XPDLParser;
053: import org.obe.xpdl.parser.dom4j.Dom4JXPDLParser;
054: import org.obe.xpdl.serializer.XPDLSerializer;
055: import org.obe.xpdl.serializer.dom4j.Dom4JXPDLSerializer;
056:
057: import java.util.HashMap;
058: import java.util.Map;
059:
060: /**
061: * Supports parsing multiple process definition languages into the XPDL model.
062: *
063: * @author Adrian Price
064: */
065: public final class XPDLParserFactory implements WorkflowService {
066: public static final String SERVICE_NAME = "XPDLParserFactory";
067:
068: private final ServiceManager _svcMgr;
069: private final Map _parsers = new HashMap();
070: private final Map _serializers = new HashMap();
071:
072: public XPDLParserFactory(ServiceManager svcMgr) {
073: _svcMgr = svcMgr;
074: try {
075: registerParser(WMClient.XPDL, Dom4JXPDLParser.class
076: .getName(), Dom4JXPDLSerializer.class.getName());
077: } catch (ObjectAlreadyExistsException e) {
078: throw new OBERuntimeException(e);
079: }
080: }
081:
082: public XPDLParser createParser(String contentType)
083: throws ObjectNotFoundException {
084:
085: String parserClass = (String) _parsers.get(contentType);
086: if (parserClass == null) {
087: throw new ObjectNotFoundException(contentType);
088: }
089: try {
090: return (XPDLParser) Class.forName(parserClass)
091: .newInstance();
092: } catch (ClassNotFoundException e) {
093: throw new OBERuntimeException(e);
094: } catch (IllegalAccessException e) {
095: throw new OBERuntimeException(e);
096: } catch (InstantiationException e) {
097: throw new OBERuntimeException(e);
098: }
099: }
100:
101: public XPDLSerializer createSerializer(String contentType)
102: throws ObjectNotFoundException {
103:
104: String serializerClass = (String) _serializers.get(contentType);
105: if (serializerClass == null) {
106: throw new ObjectNotFoundException(contentType);
107: }
108: try {
109: return (XPDLSerializer) Class.forName(serializerClass)
110: .newInstance();
111: } catch (ClassNotFoundException e) {
112: throw new OBERuntimeException(e);
113: } catch (IllegalAccessException e) {
114: throw new OBERuntimeException(e);
115: } catch (InstantiationException e) {
116: throw new OBERuntimeException(e);
117: }
118: }
119:
120: public ServiceManager getServiceManager() {
121: return _svcMgr;
122: }
123:
124: public String getServiceName() {
125: return SERVICE_NAME;
126: }
127:
128: public void init() {
129: }
130:
131: public void exit() {
132: }
133:
134: public void registerParser(String contentType, String parserClass,
135: String serializerClass) throws ObjectAlreadyExistsException {
136:
137: if (parserClass != null && _parsers.containsKey(contentType))
138: throw new ObjectAlreadyExistsException(contentType);
139: _parsers.put(contentType, parserClass);
140: if (serializerClass != null
141: && _serializers.containsKey(contentType))
142: throw new ObjectAlreadyExistsException(contentType);
143: _serializers.put(contentType, serializerClass);
144: }
145:
146: public void unregisterParser(String contentType) {
147: _parsers.remove(contentType);
148: _serializers.remove(contentType);
149: }
150: }
|