001 // Copyright 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.hivemind.service.impl; 016 017 import java.lang.reflect.Modifier; 018 import java.util.ArrayList; 019 import java.util.Iterator; 020 import java.util.List; 021 022 import javassist.CtClass; 023 import javassist.CtMethod; 024 025 import org.apache.hivemind.ApplicationRuntimeException; 026 import org.apache.hivemind.service.InterfaceFab; 027 import org.apache.hivemind.service.MethodSignature; 028 029 /** 030 * @author Howard M. Lewis Ship 031 */ 032 public class InterfaceFabImpl extends AbstractFab implements InterfaceFab 033 { 034 private List _methods = new ArrayList(); 035 036 public InterfaceFabImpl(CtClassSource source, CtClass ctClass) 037 { 038 super(source, ctClass); 039 } 040 041 public String toString() 042 { 043 StringBuffer buffer = new StringBuffer("InterfaceFabImpl[\npublic interface "); 044 045 CtClass ctClass = getCtClass(); 046 047 buffer.append(ctClass.getName()); 048 049 try 050 { 051 CtClass[] interfaces = ctClass.getInterfaces(); 052 053 for (int i = 0; i < interfaces.length; i++) 054 { 055 buffer.append(i == 0 ? " extends " : ", "); 056 buffer.append(interfaces[i].getName()); 057 } 058 059 } 060 catch (Exception ex) 061 { 062 buffer.append("<Exception: " + ex + ">"); 063 } 064 065 Iterator i = _methods.iterator(); 066 067 while (i.hasNext()) 068 { 069 MethodSignature sig = (MethodSignature) i.next(); 070 071 buffer.append("\n\npublic "); 072 buffer.append(sig); 073 buffer.append(";"); 074 } 075 076 buffer.append("\n]"); 077 078 return buffer.toString(); 079 } 080 081 public void addMethod(MethodSignature ms) 082 { 083 CtClass ctReturnType = convertClass(ms.getReturnType()); 084 CtClass[] ctParameters = convertClasses(ms.getParameterTypes()); 085 CtClass[] ctExceptions = convertClasses(ms.getExceptionTypes()); 086 087 CtMethod method = new CtMethod(ctReturnType, ms.getName(), ctParameters, getCtClass()); 088 089 try 090 { 091 method.setModifiers(Modifier.PUBLIC | Modifier.ABSTRACT); 092 method.setExceptionTypes(ctExceptions); 093 094 getCtClass().addMethod(method); 095 } 096 catch (Exception ex) 097 { 098 throw new ApplicationRuntimeException(ServiceMessages.unableToAddMethod( 099 ms, 100 getCtClass(), 101 ex), ex); 102 } 103 104 _methods.add(ms); 105 } 106 107 public Class createInterface() 108 { 109 return createClass(); 110 } 111 112 }