001 /* 002 * Copyright 1999-2001,2004 The Apache Software Foundation. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.apache.commons.workflow.core; 018 019 020 import org.apache.commons.workflow.Context; 021 import org.apache.commons.workflow.StepException; 022 import org.apache.commons.workflow.base.BaseStep; 023 024 025 /** 026 * <p>Load a class with the specified name from the specified class loader, 027 * and push the corresponding <code>java.lang.Class</code> object onto the 028 * evaluation stack. 029 * 030 * <p>Supported Attributes:</p> 031 * <ul> 032 * <li><strong>name</strong> - The fully qualified name of the Java class 033 * to be loaded. If not specified, the top of the evaluation stack 034 * is popped, converted to a String (if necessary), and used as the 035 * name of the class to be loaded.</li> 036 * <li><strong>thread</strong> - Should the class be loaded from the current 037 * Thread's context class loader? (Default is to load from the same 038 * class loader that loaded this class).</li> 039 * </ul> 040 * 041 * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $ 042 * @author Craig R. McClanahan 043 */ 044 045 public class LoadStep extends BaseStep { 046 047 048 // ----------------------------------------------------------= Constructors 049 050 051 /** 052 * Construct a default instance of this Step. 053 */ 054 public LoadStep() { 055 056 super(); 057 058 } 059 060 061 /** 062 * Construct an instance of this Step with the specified identifier. 063 * 064 * @param id Step identifier 065 */ 066 public LoadStep(String id) { 067 068 super(); 069 setId(id); 070 071 } 072 073 074 /** 075 * Construct a fully configured instance of this Step. 076 * 077 * @param id Step identifier 078 * @param name Class name 079 */ 080 public LoadStep(String id, String name) { 081 082 super(); 083 setId(id); 084 setName(name); 085 086 } 087 088 089 /** 090 * Construct a fully configured instance of this Step. 091 * 092 * @param id Step identifier 093 * @param name Class name 094 * @param thread Load from thread context class loader? 095 */ 096 public LoadStep(String id, String name, boolean thread) { 097 098 super(); 099 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 }