/******************************************************************************* * 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() { @Override public String getName(EnterpriseBean bean) { JavaHelpers clazz = getClass(bean); if(clazz == null) { return null; } return clazz.getQualifiedName(); } @Override public long getId() { return ITypeConstants.LOCAL_COMPONENT_INTERFACE; } @Override 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() { @Override public String getName(EnterpriseBean bean) { JavaHelpers clazz = getClass(bean); if(clazz == null) { return null; } return clazz.getQualifiedName(); } @Override public long getId() { return ITypeConstants.REMOTE_COMPONENT_INTERFACE; } @Override 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() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_ENTITYBEAN; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_ENTITYBEAN; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBLOCALHOME; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBLOCALHOME; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_EJBLOCALHOME; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBLOCALOBJECT; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBLOCALOBJECT; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_EJBLOCALOBJECT; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBHOME; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBHOME; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_EJBHOME; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_EJBOBJECT; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_EJBOBJECT; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_EJBOBJECT; } }; _classTypeIndex[count] = ITypeConstants.JAVA_LANG_OBJECT; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVA_LANG_OBJECT; } @Override public long getId() { return ITypeConstants.JAVA_LANG_OBJECT; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_MESSAGEDRIVENBEAN; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_MESSAGEDRIVENBEAN; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_MESSAGEDRIVENBEAN; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_JMS_MESSAGELISTENER; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_JMS_MESSAGELISTENER; } @Override public long getId() { return ITypeConstants.JAVAX_JMS_MESSAGELISTENER; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_SESSIONBEAN; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_SESSIONBEAN; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_SESSIONBEAN; } }; _classTypeIndex[count] = ITypeConstants.JAVAX_EJB_SESSIONSYNCHRONIZATION; _classNames[count++] = new AClassType() { @Override public String getName(EnterpriseBean bean) { return ITypeConstants.CLASSNAME_JAVAX_EJB_SESSIONSYNCHRONIZATION; } @Override public long getId() { return ITypeConstants.JAVAX_EJB_SESSIONSYNCHRONIZATION; } }; } }