001: /*
002: * Copyright (c) 2002-2003 by OpenSymphony
003: * All rights reserved.
004: */
005: package com.opensymphony.workflow;
006:
007: import com.opensymphony.workflow.loader.ClassLoaderUtil;
008:
009: import org.apache.commons.logging.Log;
010: import org.apache.commons.logging.LogFactory;
011:
012: import java.util.HashMap;
013: import java.util.Map;
014:
015: /**
016: * Date: Aug 3, 2004
017: * Time: 11:04:43 PM
018: *
019: * @author hani
020: */
021: public class TypeResolver {
022: //~ Static fields/initializers /////////////////////////////////////////////
023:
024: private static final Log log = LogFactory
025: .getLog(TypeResolver.class);
026: private static TypeResolver resolver = new TypeResolver();
027:
028: //~ Instance fields ////////////////////////////////////////////////////////
029:
030: protected Map conditions = new HashMap();
031: protected Map functions = new HashMap();
032: protected Map registers = new HashMap();
033: protected Map validators = new HashMap();
034:
035: //~ Constructors ///////////////////////////////////////////////////////////
036:
037: public TypeResolver() {
038: validators
039: .put("remote-ejb",
040: "com.opensymphony.workflow.util.ejb.remote.RemoteEJBValidator");
041: validators
042: .put("local-ejb",
043: "com.opensymphony.workflow.util.ejb.local.LocalEJBValidator");
044: validators.put("jndi",
045: "com.opensymphony.workflow.util.jndi.JNDIValidator");
046: validators
047: .put("beanshell",
048: "com.opensymphony.workflow.util.beanshell.BeanShellValidator");
049: validators.put("bsf",
050: "com.opensymphony.workflow.util.bsf.BSFValidator");
051: conditions
052: .put("remote-ejb",
053: "com.opensymphony.workflow.util.ejb.remote.RemoteEJBCondition");
054: conditions
055: .put("local-ejb",
056: "com.opensymphony.workflow.util.ejb.local.LocalEJBCondition");
057: conditions.put("jndi",
058: "com.opensymphony.workflow.util.jndi.JNDICondition");
059: conditions
060: .put("beanshell",
061: "com.opensymphony.workflow.util.beanshell.BeanShellCondition");
062: conditions.put("bsf",
063: "com.opensymphony.workflow.util.bsf.BSFCondition");
064: registers
065: .put("remote-ejb",
066: "com.opensymphony.workflow.util.ejb.remote.RemoteEJBRegister");
067: registers
068: .put("local-ejb",
069: "com.opensymphony.workflow.util.ejb.local.LocalEJBRegister");
070: registers.put("jndi",
071: "com.opensymphony.workflow.util.jndi.JNDIRegister");
072: registers
073: .put("beanshell",
074: "com.opensymphony.workflow.util.beanshell.BeanShellRegister");
075: registers.put("bsf",
076: "com.opensymphony.workflow.util.bsf.BSFRegister");
077: functions
078: .put("remote-ejb",
079: "com.opensymphony.workflow.util.ejb.remote.RemoteEJBFunctionProvider");
080: functions
081: .put("local-ejb",
082: "com.opensymphony.workflow.util.ejb.local.LocalEJBFunctionProvider");
083: functions
084: .put("jndi",
085: "com.opensymphony.workflow.util.jndi.JNDIFunctionProvider");
086: functions
087: .put("beanshell",
088: "com.opensymphony.workflow.util.beanshell.BeanShellFunctionProvider");
089: functions
090: .put("bsf",
091: "com.opensymphony.workflow.util.bsf.BSFFunctionProvider");
092: }
093:
094: //~ Methods ////////////////////////////////////////////////////////////////
095:
096: public Condition getCondition(String type, Map args)
097: throws WorkflowException {
098: String className = (String) conditions.get(type);
099:
100: if (className == null) {
101: className = (String) args.get(Workflow.CLASS_NAME);
102: }
103:
104: if (className == null) {
105: throw new WorkflowException(
106: "No type or class.name argument specified to TypeResolver");
107: }
108:
109: return (Condition) loadObject(className);
110: }
111:
112: public FunctionProvider getFunction(String type, Map args)
113: throws WorkflowException {
114: String className = (String) functions.get(type);
115:
116: if (className == null) {
117: className = (String) args.get(Workflow.CLASS_NAME);
118: }
119:
120: if (className == null) {
121: throw new WorkflowException(
122: "No type or class.name argument specified to TypeResolver");
123: }
124:
125: return (FunctionProvider) loadObject(className);
126: }
127:
128: public Register getRegister(String type, Map args)
129: throws WorkflowException {
130: String className = (String) registers.get(type);
131:
132: if (className == null) {
133: className = (String) args.get(Workflow.CLASS_NAME);
134: }
135:
136: if (className == null) {
137: throw new WorkflowException(
138: "No type or class.name argument specified to TypeResolver");
139: }
140:
141: return (Register) loadObject(className);
142: }
143:
144: public static void setResolver(TypeResolver resolver) {
145: TypeResolver.resolver = resolver;
146: }
147:
148: public static TypeResolver getResolver() {
149: return resolver;
150: }
151:
152: public Validator getValidator(String type, Map args)
153: throws WorkflowException {
154: String className = (String) validators.get(type);
155:
156: if (className == null) {
157: className = (String) args.get(Workflow.CLASS_NAME);
158: }
159:
160: if (className == null) {
161: throw new WorkflowException(
162: "No type or class.name argument specified to TypeResolver");
163: }
164:
165: return (Validator) loadObject(className);
166: }
167:
168: protected Object loadObject(String clazz) {
169: try {
170: return ClassLoaderUtil.loadClass(clazz.trim(), getClass())
171: .newInstance();
172: } catch (Exception e) {
173: log.error("Could not load class '" + clazz + "'", e);
174:
175: return null;
176: }
177: }
178: }
|