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
015package org.apache.hivemind.service.impl;
016
017import java.lang.reflect.Modifier;
018import java.util.ArrayList;
019import java.util.Iterator;
020import java.util.List;
021
022import javassist.CtClass;
023import javassist.CtMethod;
024
025import org.apache.hivemind.ApplicationRuntimeException;
026import org.apache.hivemind.service.InterfaceFab;
027import org.apache.hivemind.service.MethodSignature;
028
029/**
030 * @author Howard M. Lewis Ship
031 */
032public 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}