001 /* 002 * Copyright 2002-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 package org.apache.commons.clazz.bean; 017 018 import org.apache.commons.clazz.Clazz; 019 import org.apache.commons.clazz.ClazzLoader; 020 import org.apache.commons.clazz.ClazzOperation; 021 import org.apache.commons.clazz.common.ClazzFeatureSupport; 022 023 /** 024 * 025 * @author <a href="mailto:dmitri@apache.org">Dmitri Plotnikov</a> 026 * @version $Id: BeanClazzOperation.java 155436 2005-02-26 13:17:48Z dirkv $ 027 */ 028 public abstract class BeanClazzOperation 029 extends ClazzFeatureSupport 030 implements ClazzOperation 031 { 032 private String returnClazzName; 033 private Clazz returnClazz; 034 private String name; 035 private static final String[] EMPTY_STRING_ARRAY = new String[0]; 036 private String[] parameterClazzNames; 037 private Clazz[] parameterClazzes; 038 private String signature; 039 040 /** 041 * Constructor for BeanClazzOperaiton. 042 * 043 * @param declaringClazz the Clazz this Operation belongs to 044 * @param returnClazzName the return type of the operation, pass 045 * <code>null</code> for <code>void</code>. 046 * @param name the name of the operation. 047 * @param parameterClazzNames types of operation parameters, pass 048 * <code>null</code> if the operation does not take any parameters. 049 */ 050 public BeanClazzOperation( 051 Clazz declaringClazz, 052 String returnClazzName, 053 String name, 054 String[] parameterClazzNames) 055 { 056 super(declaringClazz); 057 this.returnClazzName = returnClazzName; 058 this.name = name; 059 this.parameterClazzNames = 060 (parameterClazzNames != null 061 ? parameterClazzNames 062 : EMPTY_STRING_ARRAY); 063 } 064 065 /** 066 * @see ClazzOperation#getSignature() 067 */ 068 public String getSignature() { 069 if (signature == null) { 070 signature = Clazz.constructSignature(name, getParameterClazzes()); 071 } 072 073 return signature; 074 } 075 076 /** 077 * @see ClazzOperation#getName() 078 */ 079 public String getName() { 080 return name; 081 } 082 083 /** 084 * @see ClazzOperation#getParameterClazzes() 085 */ 086 public Clazz[] getParameterClazzes() { 087 if (parameterClazzes == null) { 088 parameterClazzes = new Clazz[parameterClazzNames.length]; 089 ClazzLoader loader = getDeclaringClazz().getClazzLoader(); 090 for (int i = 0; i < parameterClazzes.length; i++) { 091 parameterClazzes[i] = 092 loader.getClazzForName(parameterClazzNames[i]); 093 if (parameterClazzes[i] == null) { 094 throw new BeanClazzConfigurationException( 095 "Invalid argument type: " 096 + parameterClazzNames[i] 097 + ". Clazz not found."); 098 } 099 } 100 } 101 102 return parameterClazzes; 103 } 104 105 /** 106 * @see ClazzOperation#getReturnClazz() 107 */ 108 public Clazz getReturnClazz() { 109 if (returnClazzName == null) { 110 return null; 111 } 112 113 if (returnClazz == null) { 114 ClazzLoader loader = getDeclaringClazz().getClazzLoader(); 115 returnClazz = loader.getClazzForName(returnClazzName); 116 } 117 118 return returnClazz; 119 } 120 121 /** 122 * @see ClazzOperation#invoke(Object, Object[]) 123 */ 124 public abstract Object invoke(Object target, Object[] parameters); 125 }