FileDocCategorySizeDatePackage
ServiceInterfaceGenerator.javaAPI DocGlassfish v2 API8944Thu May 24 16:52:22 BST 2007com.sun.enterprise.webservice

ServiceInterfaceGenerator

public class ServiceInterfaceGenerator extends com.sun.ejb.codegen.Generator implements com.sun.ejb.codegen.ClassGeneratorFactory
This class is responsible for generating the SEI when it is not packaged by the application.
author
Jerome Dochez

Fields Summary
private static com.sun.enterprise.util.LocalStringManagerImpl
localStrings
private static Logger
_logger
Class
sib
String
serviceIntfName
String
packageName
String
serviceIntfSimpleName
Method[]
intfMethods
Constructors Summary
public ServiceInterfaceGenerator(ClassLoader cl, Class sib)
Construct the Wrapper generator with the specified deployment descriptor and class loader.

exception
GeneratorException.

    
                      
         
	  
    
	super();

        this.sib = sib;
        serviceIntfSimpleName = getServiceIntfName();

	packageName = getPackageName();
        serviceIntfName = packageName + "." + serviceIntfSimpleName;
	
        intfMethods = calculateMethods(sib, removeDups(sib.getMethods()));
        
        // NOTE : no need to remove ejb object methods because EJBObject
        // is only visible through the RemoteHome view.
    
Methods Summary
private java.lang.reflect.Method[]calculateMethods(java.lang.Class sib, java.lang.reflect.Method[] initialList)


        // we start by assuming the @WebMethod was NOT used on this class
        boolean webMethodAnnotationUsed = false;
        List<Method> list = new ArrayList<Method>();
        
        for (Method m : initialList) {
            WebMethod wm = m.getAnnotation(javax.jws.WebMethod.class);
            if (wm!=null && webMethodAnnotationUsed==false) {
                webMethodAnnotationUsed=true;
                // reset the list, this is the first annotated method we find
                list.clear();
            }
            if (wm!=null) {
                list.add(m);
            } else {
                if (!webMethodAnnotationUsed && !m.getDeclaringClass().equals(java.lang.Object.class)) {
                    list.add(m);
                }
            }
        }
        return list.toArray(new Method[0]);
    
public java.lang.StringclassName()

        return getGeneratedClass();
    
public com.sun.corba.ee.impl.codegen.ClassGeneratorevaluate()


        _clear();

	if (packageName != null) {
	    _package(packageName);
        }

        _interface(PUBLIC, serviceIntfName);

        for(int i = 0; i < intfMethods.length; i++) {
	    printMethod(intfMethods[i]);
	}

        _end();

        return _classGenerator() ;

    
public voidgenerate(java.io.OutputStream out)
Generate the code to the specified output stream.

param
the output stream
exception
GeneratorException on a generation error
exception
IOException on an IO error

	IndentingWriter p = new IndentingWriter(new OutputStreamWriter(out));

        p.pln("");

	if (packageName != null) {
	    p.pln("package " + packageName + ";");
        }

        p.pln("");

	p.plnI("public interface " + serviceIntfSimpleName + " {");

        p.pln("");

	// each remote method
	for(int i = 0; i < intfMethods.length; i++) {
	    printMethod(p, intfMethods[i]);
	}

	p.pOln("}");
	p.close();
    
public java.lang.StringgetGeneratedClass()
Get the fully qualified name of the generated class. Note: the remote/local implementation class is in the same package as the bean class, NOT the remote/local interface.

return
the name of the generated class.

        return serviceIntfName;
    
public java.lang.StringgetPackageName()

        return sib.getPackage().getName()+".internal.jaxws";
    
public java.lang.StringgetServiceIntfName()

        String serviceIntfSimpleName = sib.getSimpleName();
        if (serviceIntfSimpleName.endsWith("EJB")) {
            return serviceIntfSimpleName.substring(0, serviceIntfSimpleName.length()-3);
        } else {
            return serviceIntfSimpleName+"SEI";
        }
    
private voidprintMethod(sun.rmi.rmic.IndentingWriter p, java.lang.reflect.Method m)
Generate the code for a single method.

param
the writer.
param
the method to generate code for.
exception
IOException.

	p.pln("");

	// print method signature and exceptions
	p.p("public " + printType(m.getReturnType()) + " "
		+ m.getName() + "(");
	Class[] params = m.getParameterTypes();
	for(int i = 0; i < params.length; i++) {
	    if (i != 0)
		p.p(", ");
	    p.p(printType(params[i]) + " param" + i);
	}
	p.p(") ");
	Class[] exceptions = m.getExceptionTypes();
        boolean throwsRemoteException = false;
	for(int i = 0; i < exceptions.length; i++) {
	    if (i == 0)
		p.p("throws ");
	    else
		p.p(", ");
            String nextEx = exceptions[i].getName();
	    p.p(nextEx);
            if( nextEx.equals("java.rmi.RemoteException") ) {
                throwsRemoteException = true;
            }
	}
        if( exceptions.length == 0 ) {
            p.p("throws java.rmi.RemoteException");
        } else if (!throwsRemoteException) {
            p.p(", java.rmi.RemoteException");
        }
	p.pln(";");
        p.pln("");
    
private voidprintMethod(java.lang.reflect.Method m)


        boolean throwsRemoteException = false;
        List<Type> exceptionList = new LinkedList<Type>();
	for(Class exception : m.getExceptionTypes()) {
            exceptionList.add(Type.type(exception));
            if( exception.getName().equals("java.rmi.RemoteException") ) {
                throwsRemoteException = true;
            }
	}
        if( !throwsRemoteException ) {
            exceptionList.add(_t("java.rmi.RemoteException"));
        }

        _method( PUBLIC | ABSTRACT, Type.type(m.getReturnType()),
                 m.getName(), exceptionList);

        int i = 0;
        com.sun.corba.ee.spi.codegen.Expression expr = null;
        for(Class param : m.getParameterTypes()) {
            expr = _arg(Type.type(param), "param" + i);
            i++;
	}

        _end();