1 /* 2 * Copyright 1999-2001,2004 The Apache Software Foundation. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.apache.commons.workflow.core; 18 19 20 import org.apache.commons.workflow.Context; 21 import org.apache.commons.workflow.StepException; 22 import org.apache.commons.workflow.base.BaseStep; 23 24 25 /** 26 * <p>Load a class with the specified name from the specified class loader, 27 * and push the corresponding <code>java.lang.Class</code> object onto the 28 * evaluation stack. 29 * 30 * <p>Supported Attributes:</p> 31 * <ul> 32 * <li><strong>name</strong> - The fully qualified name of the Java class 33 * to be loaded. If not specified, the top of the evaluation stack 34 * is popped, converted to a String (if necessary), and used as the 35 * name of the class to be loaded.</li> 36 * <li><strong>thread</strong> - Should the class be loaded from the current 37 * Thread's context class loader? (Default is to load from the same 38 * class loader that loaded this class).</li> 39 * </ul> 40 * 41 * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $ 42 * @author Craig R. McClanahan 43 */ 44 45 public class LoadStep extends BaseStep { 46 47 48 // ----------------------------------------------------------= Constructors 49 50 51 /** 52 * Construct a default instance of this Step. 53 */ 54 public LoadStep() { 55 56 super(); 57 58 } 59 60 61 /** 62 * Construct an instance of this Step with the specified identifier. 63 * 64 * @param id Step identifier 65 */ 66 public LoadStep(String id) { 67 68 super(); 69 setId(id); 70 71 } 72 73 74 /** 75 * Construct a fully configured instance of this Step. 76 * 77 * @param id Step identifier 78 * @param name Class name 79 */ 80 public LoadStep(String id, String name) { 81 82 super(); 83 setId(id); 84 setName(name); 85 86 } 87 88 89 /** 90 * Construct a fully configured instance of this Step. 91 * 92 * @param id Step identifier 93 * @param name Class name 94 * @param thread Load from thread context class loader? 95 */ 96 public LoadStep(String id, String name, boolean thread) { 97 98 super(); 99 setId(id); 100 setName(name); 101 setThread(thread); 102 103 } 104 105 106 // ------------------------------------------------------------- Properties 107 108 109 /** 110 * The class name to be loaded. 111 */ 112 protected String name = null; 113 114 public String getName() { 115 return (this.name); 116 } 117 118 public void setName(String name) { 119 this.name = name; 120 } 121 122 123 /** 124 * Load from the thread context class loader? 125 */ 126 protected boolean thread = false; 127 128 public boolean getThread() { 129 return (this.thread); 130 } 131 132 public void setThread(boolean thread) { 133 this.thread = thread; 134 } 135 136 137 // --------------------------------------------------------- Public Methods 138 139 140 /** 141 * Perform the executable actions related to this Step, in the context of 142 * the specified Context. 143 * 144 * @param context The Context that is tracking our execution state 145 * 146 * @exception StepException if a processing error has occurred 147 */ 148 public void execute(Context context) throws StepException { 149 150 // Acquire the class loader we will be using 151 ClassLoader classLoader = null; 152 if (thread) 153 classLoader = Thread.currentThread().getContextClassLoader(); 154 else 155 classLoader = this.getClass().getClassLoader(); 156 if (classLoader == null) 157 throw new StepException 158 ("No thread context class loader is available"); 159 160 // Calculate the name of the class to be loaded 161 String className = getName(); 162 if (className == null) 163 className = context.pop().toString(); 164 165 // Load the specified class 166 Class clazz = null; 167 try { 168 clazz = classLoader.loadClass(className); 169 } catch (Throwable t) { 170 throw new StepException 171 ("Exception from loadClass()", t, this); 172 } 173 174 // Push the new Class onto the evaluation stack and return 175 context.push(clazz); 176 177 } 178 179 180 /** 181 * Render a string representation of this Step. 182 */ 183 public String toString() { 184 185 StringBuffer sb = new StringBuffer("<core:load"); 186 if (getId() != null) { 187 sb.append(" id=\""); 188 sb.append(getId()); 189 sb.append("\""); 190 } 191 if (getName() != null) { 192 sb.append(" name=\""); 193 sb.append(getName()); 194 sb.append("\""); 195 } 196 sb.append(" thread=\""); 197 sb.append(getThread()); 198 sb.append("\"/>"); 199 return (sb.toString()); 200 201 } 202 203 204 }