blob: 976d51c25da70509256adee5671956aab69bdaf0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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.Arrays;
import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.java.JavaHelpers;
import org.eclipse.jst.j2ee.ejb.EjbPackage;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
public final class ClassUtility {
public static long supertype_counter = 0x1; // used by IMethodAndFieldConstants.java
private long[] _classTypeIndex;
private AClassType[] _classNames;
private abstract class AClassType {
public abstract String getName(EnterpriseBean bean) throws InvalidInputException;
public abstract long getId();
public JavaHelpers getClass(EnterpriseBean bean) throws InvalidInputException {
return ValidationRuleUtility.getType(getName(bean), bean);
}
/**
* Is this class type equal to the clazz parameter.
*/
public boolean equals(EnterpriseBean bean, JavaClass clazz) throws InvalidInputException {
if(clazz == null) {
return false;
}
JavaHelpers thisClass = getClass(bean);
if(thisClass == null) {
return false;
}
return clazz.equals(thisClass);
}
}
private static ClassUtility _inst = null;
private ClassUtility() {
buildTypeList();
}
public static ClassUtility getUtility() {
if(_inst == null) {
_inst = new ClassUtility();
}
return _inst;
}
/**
* Return true if the clazz is the same as the class, identified by the "type"
* parameter, in the bean.
*/
public boolean isClassType(EnterpriseBean bean, JavaClass clazz, long type) throws InvalidInputException {
AClassType ct = getClassType(type);
if(ct == null) {
// Unknown type
return false;
}
return ct.equals(bean, clazz);
}
public String getClassName(EnterpriseBean bean, long type) throws InvalidInputException {
AClassType ct = getClassType(type);
if(ct == null) {
return null;
}
return ct.getName(bean);
}
public AClassType getClassType(long type) {
int index = Arrays.binarySearch(_classTypeIndex, type);
if(index > _classNames.length) {
return null;
}
if(index < 0) {
return null;
}
if(_classNames[index].getId() != type) {
return null;
}
return _classNames[index];
}
public JavaHelpers getSupertype(EnterpriseBean bean, long type) throws InvalidInputException {
AClassType ct = getClassType(type);
if(ct == null) {
// No supertype
return null;
}
return ct.getClass(bean);
}
private void buildTypeList() {
int typeCount = 12; // This is the number of identifiable classes in ITypeConstants
_classTypeIndex = new long[typeCount];
_classNames = new AClassType[typeCount];
int count = 0;
// The index of the type in the long[] is equal to the
// index of the IMethodType in the IMethodType[]. By using
// this technique instead of a HashMap, we don't need to
// create an Integer every time we need to locate the
// IMethodType.
_classTypeIndex[count] = ITypeConstants.LOCAL_COMPONENT_INTERFACE;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
JavaHelpers clazz = getClass(bean);
if(clazz == null) {
return null;
}
return clazz.getQualifiedName();
}
public long getId() {
return ITypeConstants.LOCAL_COMPONENT_INTERFACE;
}
public JavaHelpers getClass(EnterpriseBean bean) {
if(bean == null) {
return null;
}
if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_LocalInterface())) {
JavaClass result = bean.getLocalInterface();
try {
ValidationRuleUtility.isValidTypeHierarchy(bean, result);
}
catch(InvalidInputException e) {
return null;
}
return result;
}
return null;
}
};
_classTypeIndex[count] = ITypeConstants.REMOTE_COMPONENT_INTERFACE;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
JavaHelpers clazz = getClass(bean);
if(clazz == null) {
return null;
}
return clazz.getQualifiedName();
}
public long getId() {
return ITypeConstants.REMOTE_COMPONENT_INTERFACE;
}
public JavaHelpers getClass(EnterpriseBean bean) {
if(bean == null) {
return null;
}
if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_RemoteInterface())) {
JavaClass result = bean.getRemoteInterface();
try {
ValidationRuleUtility.isValidTypeHierarchy(bean, result);
}
catch(InvalidInputException e) {
return null;
}
return result;
}
return null;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_ENTITYBEAN;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_ENTITYBEAN;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_ENTITYBEAN;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBLOCALHOME;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBLOCALHOME;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_EJBLOCALHOME;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBLOCALOBJECT;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBLOCALOBJECT;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_EJBLOCALOBJECT;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBHOME;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBHOME;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_EJBHOME;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBOBJECT;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBOBJECT;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_EJBOBJECT;
}
};
_classTypeIndex[count] = ITypeConstants.JAVA_LANG_OBJECT;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVA_LANG_OBJECT;
}
public long getId() {
return ITypeConstants.JAVA_LANG_OBJECT;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_MESSAGEDRIVENBEAN;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_MESSAGEDRIVENBEAN;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_MESSAGEDRIVENBEAN;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_JMS_MESSAGELISTENER;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_JMS_MESSAGELISTENER;
}
public long getId() {
return ITypeConstants.JAVAX_JMS_MESSAGELISTENER;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_SESSIONBEAN;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_SESSIONBEAN;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_SESSIONBEAN;
}
};
_classTypeIndex[count] = ITypeConstants.JAVAX_EJB_SESSIONSYNCHRONIZATION;
_classNames[count++] = new AClassType() {
public String getName(EnterpriseBean bean) {
return ITypeConstants.CLASSNAME_JAVAX_EJB_SESSIONSYNCHRONIZATION;
}
public long getId() {
return ITypeConstants.JAVAX_EJB_SESSIONSYNCHRONIZATION;
}
};
}
}