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: BusinessMethodResolver.java 1970 2007-10-16 11:49:25Z benoitf $
023: * --------------------------------------------------------------------------
024: */package org.ow2.easybeans.deployment.annotations.helper.bean;
025:
026: import org.ow2.easybeans.deployment.annotations.JMethod;
027: import org.ow2.easybeans.deployment.annotations.metadata.ClassAnnotationMetadata;
028: import org.ow2.easybeans.deployment.annotations.metadata.MethodAnnotationMetadata;
029: import org.ow2.util.log.Log;
030: import org.ow2.util.log.LogFactory;
031:
032: /**
033: * This class resolves the business method for bean class by looking at the
034: * interfaces.
035: * @author Florent Benoit
036: */
037: public final class BusinessMethodResolver {
038:
039: /**
040: * Name of the method used in constructor.
041: * This has to be ignored as this is never a business interface
042: */
043: public static final String CLASS_INIT = "<clinit>";
044:
045: /**
046: * Ignore constructor "method" of interfaces.
047: * Not a business interface.
048: */
049: public static final String CONST_INIT = "<init>";
050:
051: /**
052: * Logger.
053: */
054: private static Log logger = LogFactory
055: .getLog(BusinessMethodResolver.class);
056:
057: /**
058: * Helper class, no public constructor.
059: */
060: private BusinessMethodResolver() {
061:
062: }
063:
064: /**
065: * Found all business methods of a bean.<br>
066: * A business method is a method from one of the local or remote interfaces.
067: * @param classAnnotationMetadata class to analyze
068: */
069: public static void resolve(
070: final ClassAnnotationMetadata classAnnotationMetadata) {
071: loop(classAnnotationMetadata, classAnnotationMetadata);
072: }
073:
074: /**
075: * While there are super interfaces, loop on them.
076: * @param beanclassAnnotationMetadata the class that is analyzed
077: * @param visitingclassAnnotationMetadata classes from where we get
078: * interfaces
079: */
080: private static void loop(
081: final ClassAnnotationMetadata beanclassAnnotationMetadata,
082: final ClassAnnotationMetadata visitingclassAnnotationMetadata) {
083: // first, need to analyze all methods of interfaces used by this class
084: // then, set them as business method
085:
086: for (String itf : visitingclassAnnotationMetadata
087: .getInterfaces()) {
088: if (itf.startsWith("javax/ejb/")
089: || itf.startsWith("java/io/Serializable")
090: || itf.startsWith("java/io/Externalizable")) {
091: continue;
092: }
093:
094: // get meta data of the interface
095: ClassAnnotationMetadata itfMetadata = visitingclassAnnotationMetadata
096: .getEjbJarAnnotationMetadata()
097: .getClassAnnotationMetadata(itf);
098:
099: if (itfMetadata == null) {
100: logger.warn("No class was found for interface {0}.",
101: itf);
102: continue;
103: }
104:
105: // for each method of the interface, set the business method to true
106: // in bean
107: for (MethodAnnotationMetadata methodData : itfMetadata
108: .getMethodAnnotationMetadataCollection()) {
109: JMethod itfMethod = methodData.getJMethod();
110:
111: // Ignore class init method
112: if (itfMethod.getName().equals(CLASS_INIT)
113: || itfMethod.getName().equals(CONST_INIT)) {
114: continue;
115: }
116:
117: // take the method from the bean class
118: MethodAnnotationMetadata beanMethod = beanclassAnnotationMetadata
119: .getMethodAnnotationMetadata(itfMethod);
120: if (beanMethod == null) {
121: // TODO: I18n
122: throw new IllegalStateException(
123: "No method was found for method "
124: + itfMethod
125: + " in class "
126: + beanclassAnnotationMetadata
127: .getClassName());
128: }
129: beanMethod.setBusinessMethod(true);
130: }
131:
132: // loop again
133: if (itfMetadata.getInterfaces() != null) {
134: loop(beanclassAnnotationMetadata, itfMetadata);
135: }
136: }
137: }
138:
139: }
|