container/services/src/main/java/org/mobicents/slee/container/deployment/ConcreteSbbLocalObjectGenerator.java
private void generateConcreteMethods(Map interfaceMethods,
            String sbbAbstractClassName) {
        if (interfaceMethods == null)
            return;

        Iterator it = interfaceMethods.values().iterator();
        while (it.hasNext()) {
            CtMethod interfaceMethod = (CtMethod) it.next();
            if (interfaceMethod == null)
                return;

            // The following methods are implemented in the superclass

            if (interfaceMethod.getName().equals("isIdentical")
            		|| interfaceMethod.getName().equals("equals")
            		|| interfaceMethod.getName().equals("hashCode")
            		|| interfaceMethod.getName().equals("getSbbPriority")
                    || interfaceMethod.getName().equals("remove")
                    || interfaceMethod.getName().equals("setSbbPriority")
                	|| interfaceMethod.getName().equals("getName")
            		|| interfaceMethod.getName().equals("getChildRelation")
            		|| interfaceMethod.getName().equals("getParent"))         		
                continue;
            
            String methodToAdd = "public ";
            //Add the return type
            boolean hasReturn = false;
            CtClass returnType = null;
            try {
                // There's probably a more elegant way to do this.
                returnType = interfaceMethod.getReturnType();
                if (returnType.equals(CtClass.voidType)) {
                    methodToAdd += "void ";
                } else {
                    methodToAdd = methodToAdd
                            .concat(returnType.getName() + " ");
                    hasReturn = true;
                }
            } catch (NotFoundException nfe) {
                nfe.printStackTrace();
                methodToAdd = methodToAdd + "void ";
            }
            //Add the method name
            methodToAdd += interfaceMethod.getName() + "(";
            //Add the parameters
            CtClass[] parameterTypes = null;
            ;
            try {
                parameterTypes = interfaceMethod.getParameterTypes();
                for (int argNumber = 0; argNumber < parameterTypes.length; argNumber++) {
                    methodToAdd = methodToAdd.concat(parameterTypes[argNumber]
                            .getName()
                            + " arg_" + argNumber);
                    if (argNumber + 1 < parameterTypes.length)
                        methodToAdd = methodToAdd + ",";
                }
            } catch (NotFoundException nfe) {
                nfe.printStackTrace();
                throw new RuntimeException("unexpected Exception ! ", nfe);
            }
            methodToAdd = methodToAdd + ") { ";

            // We need to do this in a type neutral way !
            methodToAdd += SbbConcrete.class.getName() + " concrete = "
                    + " getSbbEntity().getSbbObject().getSbbConcrete();";

            //These methods are delegated to superclass.
            // Note the convoluted code here because finally is not supported
            // yet by javaassist.

            methodToAdd += "Object[] args = new Object ["
                    + parameterTypes.length + "];";

            methodToAdd += "Class[] types = new Class ["
                    + parameterTypes.length + "];";

            if (parameterTypes != null && parameterTypes.length > 0) {
                for (int argNumber = 0; argNumber < parameterTypes.length; argNumber++) {
                    methodToAdd += "args[" + argNumber + "]  = ";
                    // Check if parameter type is primitive and add the wrapper
                    // types.
                    if (parameterTypes[argNumber].isPrimitive()) {
                        CtClass ptype = parameterTypes[argNumber];
                        if (ptype.equals(CtClass.intType)) {
                            methodToAdd += "Integer.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.booleanType)) {
                            methodToAdd += "Boolean.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.longType)) {
                            methodToAdd += "Long.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.shortType)) {
                            methodToAdd += "Short.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.floatType)) {
                            methodToAdd += "Float.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.doubleType)) {
                            methodToAdd += "Double.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.charType)) {
                            methodToAdd += "Character.valueOf(" + "arg_"
                                    + argNumber + ");";
                        }
                    } else {
                        methodToAdd += "arg_" + argNumber + ";";
                    }

                }

                for (int i = 0; i < parameterTypes.length; i++) {
                    methodToAdd += "types[" + i + "] = ";
                    if (parameterTypes[i].isPrimitive()) {
                        CtClass ptype = parameterTypes[i];
                        if (ptype.equals(CtClass.intType)) {
                            methodToAdd += "Integer.TYPE;";
                        } else if (ptype.equals(CtClass.booleanType)) {
                            methodToAdd += "Boolean.TYPE;";
                        } else if (ptype.equals(CtClass.longType)) {
                            methodToAdd += "Long.TYPE;";
                        } else if (ptype.equals(CtClass.shortType)) {
                            methodToAdd += "Short.TYPE;";
                        } else if (ptype.equals(CtClass.floatType)) {
                            methodToAdd += "Float.TYPE;";
                        } else if (ptype.equals(CtClass.doubleType)) {
                            methodToAdd += "Double.TYPE;";
                        } else if (ptype.equals(CtClass.charType)) {
                            methodToAdd += "Character.TYPE;";
                        }
                    } else {
                    	methodToAdd += parameterTypes[i].getName() + ".class; ";
                    }
                }
            }
            if (hasReturn) {
                methodToAdd += " return  " + "(" + returnType.getName() + ")";
            }

            if (returnType.isPrimitive()) {
                methodToAdd += "sbbLocalObjectInterceptor.invokeAndReturn"
                        + returnType.getSimpleName() + "(concrete," + "\""
                        + interfaceMethod.getName() + "\"" + ", args, types); ";
            } else {
                methodToAdd += "sbbLocalObjectInterceptor.invokeAndReturnObject(concrete,"
                        + "\""
                        + interfaceMethod.getName()
                        + "\""
                        + ", args, types );";
            }
            methodToAdd += "}";

            //Add the implementation code
            if (logger.isTraceEnabled()) {
                logger.trace("Method " + methodToAdd + " added");
            }
            CtMethod methodTest;
            try {
                methodTest = CtNewMethod.make(methodToAdd,
                        concreteSbbLocalObject);
                concreteSbbLocalObject.addMethod(methodTest);
            } catch (CannotCompileException cce) {
                cce.printStackTrace();
                throw new RuntimeException("error generating method ", cce);
            }
        }
    }
private void generateConcreteMethods(Map interfaceMethods,
            String sbbAbstractClassName) {
        if (interfaceMethods == null)
            return;

        Iterator it = interfaceMethods.values().iterator();
        while (it.hasNext()) {
            CtMethod interfaceMethod = (CtMethod) it.next();
            if (interfaceMethod == null)
                return;

            // The following methods are implemented in the superclass

            if (interfaceMethod.getName().equals("isIdentical")
            		|| interfaceMethod.getName().equals("equals")
            		|| interfaceMethod.getName().equals("hashCode")
            		|| interfaceMethod.getName().equals("getSbbPriority")
                    || interfaceMethod.getName().equals("remove")
                    || interfaceMethod.getName().equals("setSbbPriority")
                	|| interfaceMethod.getName().equals("getName")
            		|| interfaceMethod.getName().equals("getChildRelation")
            		|| interfaceMethod.getName().equals("getParent"))         		
                continue;
            
            String methodToAdd = "public ";
            //Add the return type
            boolean hasReturn = false;
            CtClass returnType = null;
            try {
                // There's probably a more elegant way to do this.
                returnType = interfaceMethod.getReturnType();
                if (returnType.equals(CtClass.voidType)) {
                    methodToAdd += "void ";
                } else {
                    methodToAdd = methodToAdd
                            .concat(returnType.getName() + " ");
                    hasReturn = true;
                }
            } catch (NotFoundException nfe) {
                nfe.printStackTrace();
                methodToAdd = methodToAdd + "void ";
            }
            //Add the method name
            methodToAdd += interfaceMethod.getName() + "(";
            //Add the parameters
            CtClass[] parameterTypes = null;
            ;
            try {
                parameterTypes = interfaceMethod.getParameterTypes();
                for (int argNumber = 0; argNumber < parameterTypes.length; argNumber++) {
                    methodToAdd = methodToAdd.concat(parameterTypes[argNumber]
                            .getName()
                            + " arg_" + argNumber);
                    if (argNumber + 1 < parameterTypes.length)
                        methodToAdd = methodToAdd + ",";
                }
            } catch (NotFoundException nfe) {
                nfe.printStackTrace();
                throw new RuntimeException("unexpected Exception ! ", nfe);
            }
            methodToAdd = methodToAdd + ") { ";

            // We need to do this in a type neutral way !
            methodToAdd += SbbConcrete.class.getName() + " concrete = "
                    + " getSbbEntity().getSbbObject().getSbbConcrete();";

            //These methods are delegated to superclass.
            // Note the convoluted code here because finally is not supported
            // yet by javaassist.

            methodToAdd += "Object[] args = new Object ["
                    + parameterTypes.length + "];";

            methodToAdd += "Class[] types = new Class ["
                    + parameterTypes.length + "];";

            if (parameterTypes != null && parameterTypes.length > 0) {
                for (int argNumber = 0; argNumber < parameterTypes.length; argNumber++) {
                    methodToAdd += "args[" + argNumber + "]  = ";
                    // Check if parameter type is primitive and add the wrapper
                    // types.
                    if (parameterTypes[argNumber].isPrimitive()) {
                        CtClass ptype = parameterTypes[argNumber];
                        if (ptype.equals(CtClass.intType)) {
                            methodToAdd += "Integer.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.booleanType)) {
                            methodToAdd += "Boolean.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.longType)) {
                            methodToAdd += "Long.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.shortType)) {
                            methodToAdd += "Short.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.floatType)) {
                            methodToAdd += "Float.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.doubleType)) {
                            methodToAdd += "Double.valueOf(" + "arg_" + argNumber
                                    + ");";
                        } else if (ptype.equals(CtClass.charType)) {
                            methodToAdd += "Character.valueOf(" + "arg_"
                                    + argNumber + ");";
                        }
                    } else {
                        methodToAdd += "arg_" + argNumber + ";";
                    }

                }

                for (int i = 0; i < parameterTypes.length; i++) {
                    methodToAdd += "types[" + i + "] = ";
                    if (parameterTypes[i].isPrimitive()) {
                        CtClass ptype = parameterTypes[i];
                        if (ptype.equals(CtClass.intType)) {
                            methodToAdd += "Integer.TYPE;";
                        } else if (ptype.equals(CtClass.booleanType)) {
                            methodToAdd += "Boolean.TYPE;";
                        } else if (ptype.equals(CtClass.longType)) {
                            methodToAdd += "Long.TYPE;";
                        } else if (ptype.equals(CtClass.shortType)) {
                            methodToAdd += "Short.TYPE;";
                        } else if (ptype.equals(CtClass.floatType)) {
                            methodToAdd += "Float.TYPE;";
                        } else if (ptype.equals(CtClass.doubleType)) {
                            methodToAdd += "Double.TYPE;";
                        } else if (ptype.equals(CtClass.charType)) {
                            methodToAdd += "Character.TYPE;";
                        }
                    } else {
                    	methodToAdd += parameterTypes[i].getName() + ".class; ";
                    }
                }
            }
            if (hasReturn) {
                methodToAdd += " return  " + "(" + returnType.getName() + ")";
            }

            if (returnType.isPrimitive()) {
                methodToAdd += "sbbLocalObjectInterceptor.invokeAndReturn"
                        + returnType.getSimpleName() + "(concrete," + "\""
                        + interfaceMethod.getName() + "\"" + ", args, types); ";
            } else {
                methodToAdd += "sbbLocalObjectInterceptor.invokeAndReturnObject(concrete,"
                        + "\""
                        + interfaceMethod.getName()
                        + "\""
                        + ", args, types );";
            }
            methodToAdd += "}";

            //Add the implementation code
            if (logger.isTraceEnabled()) {
                logger.trace("Method " + methodToAdd + " added");
            }
            CtMethod methodTest;
            try {
                methodTest = CtNewMethod.make(methodToAdd,
                        concreteSbbLocalObject);
                concreteSbbLocalObject.addMethod(methodTest);
            } catch (CannotCompileException cce) {
                cce.printStackTrace();
                throw new RuntimeException("error generating method ", cce);
            }
        }
    }
private void generateConcreteMethods ( Map interfaceMethods , String sbbAbstractClassName ) { if ( interfaceMethods == null ) return ; Iterator it = interfaceMethods . values ( ) . iterator ( ) ; while ( it . hasNext ( ) ) { CtMethod interfaceMethod = ( CtMethod ) it . next ( ) ; if ( interfaceMethod == null ) return ; // The following methods are implemented in the superclass if ( interfaceMethod . getName ( ) . equals ( "isIdentical" ) || interfaceMethod . getName ( ) . equals ( "equals" ) || interfaceMethod . getName ( ) . equals ( "hashCode" ) || interfaceMethod . getName ( ) . equals ( "getSbbPriority" ) || interfaceMethod . getName ( ) . equals ( "remove" ) || interfaceMethod . getName ( ) . equals ( "setSbbPriority" ) || interfaceMethod . getName ( ) . equals ( "getName" ) || interfaceMethod . getName ( ) . equals ( "getChildRelation" ) || interfaceMethod . getName ( ) . equals ( "getParent" ) ) continue ; String methodToAdd = "public " ; //Add the return type boolean hasReturn = false ; CtClass returnType = null ; try { // There's probably a more elegant way to do this. returnType = interfaceMethod . getReturnType ( ) ; if ( returnType . equals ( CtClass . voidType ) ) { methodToAdd += "void " ; } else { methodToAdd = methodToAdd . concat ( returnType . getName ( ) + " " ) ; hasReturn = true ; } } catch ( NotFoundException nfe ) { nfe . printStackTrace ( ) ; methodToAdd = methodToAdd + "void " ; } //Add the method name methodToAdd += interfaceMethod . getName ( ) + "(" ; //Add the parameters CtClass [ ] parameterTypes = null ; ; try { parameterTypes = interfaceMethod . getParameterTypes ( ) ; for ( int argNumber = 0 ; argNumber < parameterTypes . length ; argNumber ++ ) { methodToAdd = methodToAdd . concat ( parameterTypes [ argNumber ] . getName ( ) + " arg_" + argNumber ) ; if ( argNumber + 1 < parameterTypes . length ) methodToAdd = methodToAdd + "," ; } } catch ( NotFoundException nfe ) { nfe . printStackTrace ( ) ; throw new RuntimeException ( "unexpected Exception ! " , nfe ) ; } methodToAdd = methodToAdd + ") { " ; // We need to do this in a type neutral way ! methodToAdd += SbbConcrete . class . getName ( ) + " concrete = " + " getSbbEntity().getSbbObject().getSbbConcrete();" ; //These methods are delegated to superclass. // Note the convoluted code here because finally is not supported // yet by javaassist. methodToAdd += "Object[] args = new Object [" + parameterTypes . length + "];" ; methodToAdd += "Class[] types = new Class [" + parameterTypes . length + "];" ; if ( parameterTypes != null && parameterTypes . length > 0 ) { for ( int argNumber = 0 ; argNumber < parameterTypes . length ; argNumber ++ ) { methodToAdd += "args[" + argNumber + "]  = " ; // Check if parameter type is primitive and add the wrapper // types. if ( parameterTypes [ argNumber ] . isPrimitive ( ) ) { CtClass ptype = parameterTypes [ argNumber ] ; if ( ptype . equals ( CtClass . intType ) ) { methodToAdd += "Integer.valueOf(" + "arg_" + argNumber + ");" ; } else if ( ptype . equals ( CtClass . booleanType ) ) { methodToAdd += "Boolean.valueOf(" + "arg_" + argNumber + ");" ; } else if ( ptype . equals ( CtClass . longType ) ) { methodToAdd += "Long.valueOf(" + "arg_" + argNumber + ");" ; } else if ( ptype . equals ( CtClass . shortType ) ) { methodToAdd += "Short.valueOf(" + "arg_" + argNumber + ");" ; } else if ( ptype . equals ( CtClass . floatType ) ) { methodToAdd += "Float.valueOf(" + "arg_" + argNumber + ");" ; } else if ( ptype . equals ( CtClass . doubleType ) ) { methodToAdd += "Double.valueOf(" + "arg_" + argNumber + ");" ; } else if ( ptype . equals ( CtClass . charType ) ) { methodToAdd += "Character.valueOf(" + "arg_" + argNumber + ");" ; } } else { methodToAdd += "arg_" + argNumber + ";" ; } } for ( int i = 0 ; i < parameterTypes . length ; i ++ ) { methodToAdd += "types[" + i + "] = " ; if ( parameterTypes [ i ] . isPrimitive ( ) ) { CtClass ptype = parameterTypes [ i ] ; if ( ptype . equals ( CtClass . intType ) ) { methodToAdd += "Integer.TYPE;" ; } else if ( ptype . equals ( CtClass . booleanType ) ) { methodToAdd += "Boolean.TYPE;" ; } else if ( ptype . equals ( CtClass . longType ) ) { methodToAdd += "Long.TYPE;" ; } else if ( ptype . equals ( CtClass . shortType ) ) { methodToAdd += "Short.TYPE;" ; } else if ( ptype . equals ( CtClass . floatType ) ) { methodToAdd += "Float.TYPE;" ; } else if ( ptype . equals ( CtClass . doubleType ) ) { methodToAdd += "Double.TYPE;" ; } else if ( ptype . equals ( CtClass . charType ) ) { methodToAdd += "Character.TYPE;" ; } } else { methodToAdd += parameterTypes [ i ] . getName ( ) + ".class; " ; } } } if ( hasReturn ) { methodToAdd += " return  " + "(" + returnType . getName ( ) + ")" ; } if ( returnType . isPrimitive ( ) ) { methodToAdd += "sbbLocalObjectInterceptor.invokeAndReturn" + returnType . getSimpleName ( ) + "(concrete," + "\"" + interfaceMethod . getName ( ) + "\"" + ", args, types); " ; } else { methodToAdd += "sbbLocalObjectInterceptor.invokeAndReturnObject(concrete," + "\"" + interfaceMethod . getName ( ) + "\"" + ", args, types );" ; } methodToAdd += "}" ; //Add the implementation code if ( logger . isTraceEnabled ( ) ) { logger . trace ( "Method " + methodToAdd + " added" ) ; } CtMethod methodTest ; try { methodTest = CtNewMethod . make ( methodToAdd , concreteSbbLocalObject ) ; concreteSbbLocalObject . addMethod ( methodTest ) ; } catch ( CannotCompileException cce ) { cce . printStackTrace ( ) ; throw new RuntimeException ( "error generating method " , cce ) ; } } }
Generates the concrete methods of the class

@param interfaceMethods
the methods to implement coming from the
ActivityContextInterface developer
@param sbbAbstractClassName
Generates the concrete methods of the class