001: /**
002: * EasyBeans
003: * Copyright (C) 2006 Bull S.A.S.
004: * Contact: easybeans@ow2.org
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019: * USA
020: *
021: * --------------------------------------------------------------------------
022: * $Id: ClientLifeCycleAdapter.java 2057 2007-11-21 15:35:32Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.enhancer.client;
025:
026: import org.ow2.easybeans.asm.ClassAdapter;
027: import org.ow2.easybeans.asm.ClassVisitor;
028: import org.ow2.easybeans.asm.MethodVisitor;
029: import org.ow2.easybeans.asm.Opcodes;
030: import org.ow2.easybeans.deployment.annotations.metadata.ClassAnnotationMetadata;
031: import org.ow2.easybeans.deployment.annotations.metadata.EjbJarAnnotationMetadata;
032: import org.ow2.easybeans.deployment.annotations.metadata.MethodAnnotationMetadata;
033:
034: /**
035: * This class manages the lifecycle of the client. It injects a method managing
036: * the postConstruct annotation.
037: * @author Florent Benoit
038: */
039: public class ClientLifeCycleAdapter extends ClassAdapter implements
040: Opcodes {
041:
042: /**
043: * Metadata available by this adapter for a class.
044: */
045: private ClassAnnotationMetadata classAnnotationMetadata;
046:
047: /**
048: * Defines java.lang.Object class.
049: */
050: public static final String JAVA_LANG_OBJECT = "java/lang/Object";
051:
052: /**
053: * Constructor.
054: * @param classAnnotationMetadata object containing all attributes of the
055: * class
056: * @param cv the class visitor to which this adapter must delegate calls.
057: */
058: public ClientLifeCycleAdapter(
059: final ClassAnnotationMetadata classAnnotationMetadata,
060: final ClassVisitor cv) {
061: super (cv);
062: this .classAnnotationMetadata = classAnnotationMetadata;
063: }
064:
065: /**
066: * Visits the end of the class. This method, which is the last one to be
067: * called, is used to inform the visitor that all the fields and methods of
068: * the class have been visited.
069: */
070: @Override
071: public void visitEnd() {
072: super .visitEnd();
073:
074: // Inject call to all postConstructs annotations
075: MethodVisitor mv = cv.visitMethod(ACC_PUBLIC + ACC_STATIC,
076: "easyBeansLifeCyclePostConstruct", "()V", null, null);
077: mv.visitCode();
078:
079: // call super method (if any)
080: String super NameClass = classAnnotationMetadata.getSuperName();
081: if (super NameClass != null
082: && !super NameClass.equals(JAVA_LANG_OBJECT)) {
083: EjbJarAnnotationMetadata jarMetadata = classAnnotationMetadata
084: .getEjbJarAnnotationMetadata();
085: ClassAnnotationMetadata super Metadata = jarMetadata
086: .getClassAnnotationMetadata(super NameClass);
087: if (super Metadata != null) {
088: mv.visitMethodInsn(INVOKESTATIC, super Metadata
089: .getClassName(),
090: "easyBeansLifeCyclePostConstruct", "()V");
091: }
092: }
093:
094: // call each method annotated
095: for (MethodAnnotationMetadata method : classAnnotationMetadata
096: .getPostConstructMethodsMetadata()) {
097: String clName = method.getClassAnnotationMetadata()
098: .getClassName();
099: mv.visitMethodInsn(INVOKESTATIC, clName, method
100: .getMethodName(), method.getJMethod()
101: .getDescriptor());
102: }
103:
104: mv.visitInsn(RETURN);
105: mv.visitMaxs(0, 0);
106: mv.visitEnd();
107: }
108:
109: }
|