blob: 81d7900d73a037215e26daa0d55036d1247c4998 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.j2ee.model.internal.validation;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jem.java.Field;
import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.java.JavaHelpers;
import org.eclipse.jem.java.JavaParameter;
import org.eclipse.jem.java.Method;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
/*
* This class is a hack around the Java lack of support for multiple inheritance.
* All if statements which object-oriented programming would normally replace
* are contained in this class.
*/
public abstract class AInterfaceTypeVRule extends ATypeVRule implements IEJBInterfaceType {
public final static List getBeanClassMethodsExtended(List[] methodsExtendedList) {
return methodsExtendedList[0];
}
public final List[] getMethodsExtended(IEJBValidationContext vc, EnterpriseBean bean, JavaClass clazz) throws InvalidInputException {
// A home or component class needs the following classes' extended methods:
// 1. bean class
JavaClass beanClass = bean.getEjbClass();
if(beanClass == null) {
throw new InvalidInputException();
}
List[] result = new List[1];
result[0] = beanClass.getMethodsExtended();
return result;
}
public final List[] getFieldsExtended(IEJBValidationContext vc, EnterpriseBean bean, JavaClass clazz) {
// Never check that a home or component's field is defined on another class
// of the bean.
return null;
}
public void validate(IEJBValidationContext vc, EnterpriseBean bean, JavaClass clazz, Field field, List[] fieldsExtendedLists) throws ValidationCancelledException, InvalidInputException, ValidationException {
//Default
}
public void validate(IEJBValidationContext vc, EnterpriseBean bean, JavaClass clazz, Method method, List[] methodsExtendedLists) throws ValidationCancelledException, InvalidInputException, ValidationException {
validateApplicationExceptionRules(vc, bean, clazz, method);
}
public final boolean isEJBInterfaceMethod(EnterpriseBean bean, Method method) throws InvalidInputException {
long[] superTypes = getSupertypes();
for(int i=0; i<superTypes.length; i++) {
if(ClassUtility.getUtility().isClassType(bean, method.getJavaClass(), superTypes[i])) {
return true;
}
}
return false;
}
public final JavaHelpers getOverExposedLocalType(EnterpriseBean bean, JavaClass clazz, Method method) {
if((isRemote() & IEJBType.REMOTE) == IEJBType.REMOTE) {
// need to check that the method doesn't expose any of the local types of the bean
JavaParameter[] parms = method.listParametersWithoutReturn();
if(parms != null) {
for(int i=0; i<parms.length; i++) {
JavaParameter parm = parms[i];
if(ValidationRuleUtility.isLocalType(bean, parm.getJavaType())) {
return parm.getJavaType();
}
}
}
// Now check the return type
JavaHelpers parm = method.getReturnType();
if(ValidationRuleUtility.isLocalType(bean, parm)) {
return parm;
}
return null;
}
return null;
}
public long getFieldType(EnterpriseBean bean, JavaClass clazz, Field field) {
if(field == null) {
return EXCLUDED_FIELD;
}
else if(field.getName().equals(IMethodAndFieldConstants.FIELDNAME_SERIALVERSIONUID)) {
return SERIALVERSIONUID;
}
else {
return OTHER_FIELD;
}
}
public void validateApplicationExceptionRules(IEJBValidationContext vc, EnterpriseBean bean, JavaClass clazz, Method method) throws ValidationCancelledException {
List exceptions = method.getJavaExceptions();
if(exceptions.size() == 0) {
return;
}
// IWAD4419 = {0} must be a subclass of java.lang.Exception. Read section 18.1.1, 18.2.1 of the EJB 2.0 specification.
Iterator iterator = exceptions.iterator();
try {
JavaHelpers javaLangException = ValidationRuleUtility.getType(ITypeConstants.CLASSNAME_JAVA_LANG_EXCEPTION, bean);
JavaHelpers javaLangRuntimeException = ValidationRuleUtility.getType(ITypeConstants.CLASSNAME_JAVA_LANG_RUNTIMEEXCEPTION, bean);
while(iterator.hasNext()) {
JavaClass exception = (JavaClass)iterator.next();
if(!ValidationRuleUtility.isApplicationException(exception, bean)) {
continue;
}
if(!ValidationRuleUtility.isAssignableFrom(exception, javaLangException)) {
IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2404, IEJBValidationContext.WARNING, bean, clazz, method, new String[]{exception.getName()}, this);
vc.addMessage(message);
// no point checking the rest
continue;
}
// IWAD4420 = {0} must not be a subclass of java.lang.RuntimeException. Read section 18.1.1, 18.2.1 of the EJB 2.0 specification.
if(ValidationRuleUtility.isAssignableFrom(exception, javaLangRuntimeException)) {
IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2416, IEJBValidationContext.WARNING, bean, clazz, method, new String[]{exception.getName()}, this);
vc.addMessage(message);
}
}
return;
}
catch(InvalidInputException exc) {
// vc.addMessage("Cannot validate exceptions because the {0} type cannot be reflected. Check the classpath.");
// Don't add any message other than the "cannot validate" message.
return;
}
}
}