1 package org.apache.ojb.broker.metadata; 2 3 /* Copyright 2003-2005 The Apache Software Foundation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 import java.io.Serializable; 19 import java.util.ArrayList; 20 import java.util.Collection; 21 import java.util.Iterator; 22 23 /** 24 * A ProcedureDescriptor contains information that is common for all types 25 * of procedures/functions that are used to handle the persistence operations. 26 * <br> 27 * Note: Be careful when use ProcedureDescriptor variables or caching 28 * ProcedureDescriptor instances, because instances could become invalid 29 * during runtime (see {@link MetadataManager}). 30 * 31 * @author <a href="mailto:rongallagher@bellsouth.net">Ron Gallagher<a> 32 * @version $Id: ProcedureDescriptor.java,v 1.1 2007-08-24 22:17:29 ewestfal Exp $ 33 */ 34 public abstract class ProcedureDescriptor extends DescriptorBase implements Serializable 35 { 36 private static final long serialVersionUID = -8228331122289787173L; 37 //--------------------------------------------------------------- 38 /** 39 * The the name of the procedure/function to invoke. 40 */ 41 private String name; 42 43 //--------------------------------------------------------------- 44 /** 45 * The the field descriptor that will receive the return value from the procedure/function... 46 */ 47 private FieldDescriptor returnValueFieldRef; 48 49 //--------------------------------------------------------------- 50 /** 51 * The class descriptor that this object is related to. 52 */ 53 private ClassDescriptor classDescriptor; 54 55 //--------------------------------------------------------------- 56 /** 57 * The argument descriptor lists. 58 */ 59 private ArrayList arguments = new ArrayList(); 60 61 //--------------------------------------------------------------- 62 /** 63 * Constructor declaration 64 */ 65 public ProcedureDescriptor(ClassDescriptor classDescriptor, String name) 66 { 67 this.classDescriptor = classDescriptor; 68 this.name = name; 69 } 70 71 //--------------------------------------------------------------- 72 /** 73 * Retrieve the the name of the procedure/function to invoke. 74 * 75 * @return The current value 76 */ 77 public final String getName() 78 { 79 return this.name; 80 } 81 82 //--------------------------------------------------------------- 83 /** 84 * Change the field descriptor that will receive the return value 85 * from the procedure/function.. 86 * 87 * @param fieldName the name of the field that will receive the 88 * return value from the procedure/function. 89 */ 90 public final void setReturnValueFieldRef(String fieldName) 91 { 92 this.returnValueFieldRef = this.getClassDescriptor().getFieldDescriptorByName(fieldName); 93 } 94 95 //--------------------------------------------------------------- 96 /** 97 * Change the the field descriptor that will receive the return 98 * value from the procedure/function... 99 * 100 * @param fieldDescriptor the field descriptor that will receive the 101 * return value from the procedure/function. 102 */ 103 public final void setReturnValueFieldRef(FieldDescriptor fieldDescriptor) 104 { 105 this.returnValueFieldRef = fieldDescriptor; 106 } 107 108 //--------------------------------------------------------------- 109 /** 110 * Retrieve the field descriptor that will receive the return value 111 * from the procedure/function... 112 * 113 * @return The current value 114 */ 115 public final FieldDescriptor getReturnValueFieldRef() 116 { 117 return this.returnValueFieldRef; 118 } 119 120 //--------------------------------------------------------------- 121 /** 122 * Is there a return value for this procedure? 123 * 124 * @return <code>true</code> if there is a return value for this 125 * procedure. 126 */ 127 public final boolean hasReturnValue() 128 { 129 return (this.returnValueFieldRef != null); 130 } 131 132 //--------------------------------------------------------------- 133 /** 134 * Does this procedure return any values to the 'caller'? 135 * 136 * @return <code>true</code> if the procedure returns at least 1 137 * value that is returned to the caller. 138 */ 139 public final boolean hasReturnValues() 140 { 141 if (this.hasReturnValue()) 142 { 143 return true; 144 } 145 else 146 { 147 // TODO: We may be able to 'pre-calculate' the results 148 // of this loop by just checking arguments as they are added 149 // The only problem is that the 'isReturnedbyProcedure' property 150 // can be modified once the argument is added to this procedure. 151 // If that occurs, then 'pre-calculated' results will be inacccurate. 152 Iterator iter = this.getArguments().iterator(); 153 while (iter.hasNext()) 154 { 155 ArgumentDescriptor arg = (ArgumentDescriptor) iter.next(); 156 if (arg.getIsReturnedByProcedure()) 157 { 158 return true; 159 } 160 } 161 } 162 return false; 163 } 164 165 //--------------------------------------------------------------- 166 /** 167 * Retrieve the name of the field descriptor that will receive the 168 * return value from the procedure/function... 169 * 170 * @return The current value 171 */ 172 public final String getReturnValueFieldRefName() 173 { 174 if (this.returnValueFieldRef == null) 175 { 176 return null; 177 } 178 else 179 { 180 return this.returnValueFieldRef.getAttributeName(); 181 } 182 } 183 184 //--------------------------------------------------------------- 185 /** 186 * Retrieve the class descriptor that this object is related to. 187 * 188 * @return The current value 189 */ 190 public final ClassDescriptor getClassDescriptor() 191 { 192 return this.classDescriptor; 193 } 194 195 /* 196 * @see XmlCapable#toXML() 197 */ 198 public abstract String toXML(); 199 200 //--------------------------------------------------------------- 201 /** 202 * Add an argument 203 */ 204 protected void addArgument(ArgumentDescriptor argument) 205 { 206 this.arguments.add(argument); 207 } 208 209 //--------------------------------------------------------------- 210 /** 211 * Set up arguments for each FieldDescriptor in an array. 212 */ 213 protected void addArguments(FieldDescriptor field[]) 214 { 215 for (int i = 0; i < field.length; i++) 216 { 217 ArgumentDescriptor arg = new ArgumentDescriptor(this); 218 arg.setValue(field[i].getAttributeName(), false); 219 this.addArgument(arg); 220 } 221 } 222 223 //--------------------------------------------------------------- 224 /** 225 * Get the argument descriptors for this procedure. 226 */ 227 public final Collection getArguments() 228 { 229 return this.arguments; 230 } 231 232 //--------------------------------------------------------------- 233 /** 234 * Retrieves the number of arguments that are passed to the 235 * procedure that this descriptor represents. 236 * <p> 237 * Note: The value returned by this method does not reflect 238 * the presence of any return value for the procedure 239 */ 240 public final int getArgumentCount() 241 { 242 return this.arguments.size(); 243 } 244 }