diff options
Diffstat (limited to 'plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EnterpriseBean20VRule.java')
-rw-r--r-- | plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EnterpriseBean20VRule.java | 1274 |
1 files changed, 0 insertions, 1274 deletions
diff --git a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EnterpriseBean20VRule.java b/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EnterpriseBean20VRule.java deleted file mode 100644 index 5c866bf5b..000000000 --- a/plugins/org.eclipse.jst.j2ee.core/j2ee-validation/org/eclipse/jst/j2ee/model/internal/validation/EnterpriseBean20VRule.java +++ /dev/null @@ -1,1274 +0,0 @@ -/******************************************************************************* - * 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.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; - -import org.eclipse.jem.java.Field; -import org.eclipse.jem.java.JavaClass; -import org.eclipse.jem.java.JavaHelpers; -import org.eclipse.jem.util.logger.LogEntry; -import org.eclipse.jem.util.logger.proxy.Logger; -import org.eclipse.jst.j2ee.common.CommonPackage; -import org.eclipse.jst.j2ee.common.EjbRef; -import org.eclipse.jst.j2ee.common.EjbRefType; -import org.eclipse.jst.j2ee.common.EnvEntry; -import org.eclipse.jst.j2ee.common.EnvEntryType; -import org.eclipse.jst.j2ee.common.SecurityRole; -import org.eclipse.jst.j2ee.common.SecurityRoleRef; -import org.eclipse.jst.j2ee.ejb.ActivationConfig; -import org.eclipse.jst.j2ee.ejb.ActivationConfigProperty; -import org.eclipse.jst.j2ee.ejb.CMPAttribute; -import org.eclipse.jst.j2ee.ejb.CMRField; -import org.eclipse.jst.j2ee.ejb.ContainerManagedEntity; -import org.eclipse.jst.j2ee.ejb.EJBJar; -import org.eclipse.jst.j2ee.ejb.EjbPackage; -import org.eclipse.jst.j2ee.ejb.EnterpriseBean; -import org.eclipse.jst.j2ee.ejb.Entity; -import org.eclipse.jst.j2ee.ejb.MessageDriven; -import org.eclipse.jst.j2ee.ejb.Session; -import org.eclipse.jst.j2ee.ejb.internal.util.MDBActivationConfigModelUtil; -import org.eclipse.jst.j2ee.internal.J2EEConstants; -import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; -import org.eclipse.wst.validation.internal.core.ValidationException; -import org.eclipse.wst.validation.internal.provisional.core.IMessage; - - -/** - * @version 1.0 - * @author - */ -public class EnterpriseBean20VRule extends AValidationRule implements IMessagePrefixEjb20Constants { - private List _securityRoles = null; - private static final Map MESSAGE_IDS; - private static final Object[] DEPENDS_ON = new Object[]{IValidationRuleList.EJB20_BMP_BEANCLASS, IValidationRuleList.EJB20_BMP_HOME, IValidationRuleList.EJB20_BMP_KEYCLASS, IValidationRuleList.EJB20_BMP_LOCAL, IValidationRuleList.EJB20_BMP_LOCALHOME, IValidationRuleList.EJB20_BMP_REMOTE, IValidationRuleList.EJB20_CMP_BEANCLASS, IValidationRuleList.EJB20_CMP_HOME, IValidationRuleList.EJB20_CMP_KEYCLASS, IValidationRuleList.EJB20_CMP_LOCAL, IValidationRuleList.EJB20_CMP_LOCALHOME, IValidationRuleList.EJB20_CMP_REMOTE, IValidationRuleList.EJB20_STATEFUL_SESSION_BEANCLASS, IValidationRuleList.EJB20_STATEFUL_SESSION_HOME, IValidationRuleList.EJB20_STATEFUL_SESSION_LOCAL, IValidationRuleList.EJB20_STATEFUL_SESSION_LOCALHOME, IValidationRuleList.EJB20_STATEFUL_SESSION_REMOTE, IValidationRuleList.EJB20_STATELESS_SESSION_BEANCLASS, IValidationRuleList.EJB20_STATELESS_SESSION_HOME, IValidationRuleList.EJB20_STATELESS_SESSION_LOCAL, IValidationRuleList.EJB20_STATELESS_SESSION_LOCALHOME, IValidationRuleList.EJB20_STATELESS_SESSION_REMOTE}; - private static String JMS_MESSAGING_TYPE = "javax.jms.MessageListener"; //$NON-NLS-1$ - - static { - MESSAGE_IDS = new HashMap(); - - MESSAGE_IDS.put(CHKJ2433, new String[]{CHKJ2433}); - MESSAGE_IDS.put(CHKJ2800_NAMED, new String[]{CHKJ2800_NAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2800_UNNAMED, new String[]{CHKJ2800_UNNAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2801, new String[]{CHKJ2801+SPEC}); - MESSAGE_IDS.put(CHKJ2802_NAMED, new String[]{CHKJ2802_NAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2802_UNNAMED, new String[]{CHKJ2802_UNNAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2803_NAMED, new String[]{CHKJ2803_NAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2803_UNNAMED, new String[]{CHKJ2803_UNNAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2804_NAMED, new String[]{CHKJ2804_NAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2804_UNNAMED, new String[]{CHKJ2804_UNNAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2805_NAMED, new String[]{CHKJ2805_NAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2805_UNNAMED, new String[]{CHKJ2805_UNNAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2806, new String[]{CHKJ2806+SPEC}); - MESSAGE_IDS.put(CHKJ2807, new String[]{CHKJ2807+SPEC}); - MESSAGE_IDS.put(CHKJ2808, new String[]{CHKJ2808+SPEC}); - MESSAGE_IDS.put(CHKJ2809, new String[]{CHKJ2809+SPEC}); - MESSAGE_IDS.put(CHKJ2810_NAMED, new String[]{CHKJ2810_NAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2810_UNNAMED, new String[]{CHKJ2810_UNNAMED+SPEC}); - MESSAGE_IDS.put(CHKJ2813, new String[]{CHKJ2813+SPEC}); - MESSAGE_IDS.put(CHKJ2820, new String[]{CHKJ2820+SPEC}); - MESSAGE_IDS.put(CHKJ2822, new String[]{CHKJ2822+SPEC}); - MESSAGE_IDS.put(CHKJ2823, new String[]{CHKJ2823+SPEC}); - MESSAGE_IDS.put(CHKJ2824, new String[]{CHKJ2824+SPEC}); - MESSAGE_IDS.put(CHKJ2825, new String[]{CHKJ2825+SPEC}); - MESSAGE_IDS.put(CHKJ2826, new String[]{CHKJ2826+SPEC}); - MESSAGE_IDS.put(CHKJ2827, new String[]{CHKJ2827+SPEC}); - MESSAGE_IDS.put(CHKJ2828, new String[]{CHKJ2828+SPEC}); - MESSAGE_IDS.put(CHKJ2830, new String[]{CHKJ2830+SPEC}); - MESSAGE_IDS.put(CHKJ2831, new String[]{CHKJ2831+SPEC}); - MESSAGE_IDS.put(CHKJ2832, new String[]{CHKJ2832+SPEC}); - MESSAGE_IDS.put(CHKJ2833, new String[]{CHKJ2833+SPEC}); - MESSAGE_IDS.put(CHKJ2834, new String[]{CHKJ2834+SPEC}); - MESSAGE_IDS.put(CHKJ2835, new String[]{CHKJ2835+SPEC}); - MESSAGE_IDS.put(CHKJ2836, new String[]{CHKJ2836+SPEC}); - MESSAGE_IDS.put(CHKJ2837, new String[]{CHKJ2837+SPEC}); - MESSAGE_IDS.put(CHKJ2838, new String[]{CHKJ2838+SPEC}); - MESSAGE_IDS.put(CHKJ2839, new String[]{CHKJ2839+SPEC}); - MESSAGE_IDS.put(CHKJ2840, new String[]{CHKJ2840+SPEC}); - MESSAGE_IDS.put(CHKJ2841, new String[]{CHKJ2841+SPEC}); - MESSAGE_IDS.put(CHKJ2845, new String[]{CHKJ2845+SPEC}); - MESSAGE_IDS.put(CHKJ2846, new String[]{CHKJ2846+SPEC}); - MESSAGE_IDS.put(CHKJ2847, new String[]{CHKJ2847+SPEC}); - MESSAGE_IDS.put(CHKJ2852, new String[]{CHKJ2852}); - MESSAGE_IDS.put(CHKJ2854, new String[]{CHKJ2854+SPEC}); - MESSAGE_IDS.put(CHKJ2855, new String[]{CHKJ2855+SPEC}); - MESSAGE_IDS.put(CHKJ2856, new String[]{CHKJ2856+SPEC}); - MESSAGE_IDS.put(CHKJ2857, new String[]{CHKJ2857+SPEC}); - MESSAGE_IDS.put(CHKJ2858, new String[]{CHKJ2858+SPEC}); - MESSAGE_IDS.put(CHKJ2859, new String[]{CHKJ2859+SPEC}); - MESSAGE_IDS.put(CHKJ2860, new String[]{CHKJ2860+SPEC}); - MESSAGE_IDS.put(CHKJ2880, new String[]{"CHKJ2880.s"+SPEC, "CHKJ2880.b"+SPEC, "CHKJ2880.c"+SPEC}); // special case; need diff spec number for each type of bean //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - MESSAGE_IDS.put(CHKJ2881, new String[]{"CHKJ2881.s"+SPEC, "CHKJ2881.b"+SPEC, "CHKJ2881.c"+SPEC}); // special case; need diff spec number for each type of bean //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - MESSAGE_IDS.put(CHKJ2882, new String[]{"CHKJ2882.s"+SPEC, "CHKJ2882.b"+SPEC, "CHKJ2882.c"+SPEC}); // special case; need diff spec number for each type of bean //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - MESSAGE_IDS.put(CHKJ2883, new String[]{"CHKJ2883.s"+SPEC, "CHKJ2883.b"+SPEC, "CHKJ2883.c"+SPEC}); // special case; need diff spec number for each type of bean //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - MESSAGE_IDS.put(CHKJ2884, new String[]{"CHKJ2884.s"+SPEC, "CHKJ2884.b"+SPEC, "CHKJ2884.c"+SPEC}); // special case; need diff spec number for each type of bean //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - MESSAGE_IDS.put(CHKJ2885, new String[]{"CHKJ2885.s"+SPEC, "CHKJ2885.b"+SPEC, "CHKJ2885.c"+SPEC}); // special case; need diff spec number for each type of bean //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - MESSAGE_IDS.put(CHKJ2907, new String[]{CHKJ2907}); - } - - public Object[] getDependsOn() { - // EJBJar doesn't depend on anything else - return DEPENDS_ON; - } - - public Object getId() { - return IValidationRuleList.EJB20_ENTERPRISEBEAN; - } - - public Map getMessageIds() { - return MESSAGE_IDS; - } - - public Object getTarget(Object parent, Object clazz) { - return parent; // The parent will be an EnterpriseBean. - } - - /* - * @see IValidationRule#validate(IEJBValidationContext, Object, Object) - */ - public void validate(IEJBValidationContext vc, Object targetParent, Object target) throws ValidationCancelledException, ValidationException { - Logger logger = vc.getMsgLogger(); - if(logger != null && logger.isLoggingLevel(Level.FINEST)) { - LogEntry entry = vc.getLogEntry(); - entry.setSourceID("EnterpriseBean20VRule - validate"); //$NON-NLS-1$ - entry.setText(getClass().getName() + "::validate(" + targetParent + ", " + target); //$NON-NLS-1$ //$NON-NLS-2$ - logger.write(Level.FINEST, entry); - } - - EJBJar ejbJar = null; - if(targetParent instanceof EnterpriseBean) { - // running as a dependent - ejbJar = (EJBJar)vc.loadModel(EJBValidatorModelEnum.EJB_MODEL); - } - else { - ejbJar = (EJBJar)targetParent; - } - EnterpriseBean bean = (EnterpriseBean)target; - - validate(vc, ejbJar, bean); - } - - - public void validate(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) throws ValidationCancelledException, ValidationException { - Logger logger = vc.getMsgLogger(); - try { - // Check if the bean parts are reflected. Some rules can be validated - // whether or not the bean is reflected. - boolean reflected = validateBeanComponentsReflected(vc, ejbJar, bean); - - // These rules can be validated whether or not the bean is reflected. - validateEJBNameElement(vc, ejbJar, bean); - validateReentrantElement(vc, ejbJar, bean); - validateSessionTypeElement(vc, ejbJar, bean); - validateTransactionTypeElement(vc, ejbJar, bean); - validatePersistenceTypeElement(vc, ejbJar, bean); - validateEnvironmentEntries(vc, ejbJar, bean); - - // The rest of the rules cannot be validated because the bean isn't reflected. - if (!reflected) { - return; - } - - validateLocalPairs(vc, ejbJar, bean); - validateRemotePairs(vc, ejbJar, bean); - validateLocalOrRemote(vc, ejbJar, bean); - - if (bean.isContainerManagedEntity()) { - ContainerManagedEntity cmp = (ContainerManagedEntity) bean; - if((cmp.getPrimKeyField() != null) && !cmp.getPrimKeyField().eIsProxy()) { - // Don't validate the fields if it's neither a primitive primary key nor a compound primary key. - // If the user was attempting a primitive primary key, but did a typo in ejb-jar.xml, - // the user will see a lot of strange messages logged against the fields in the primitive primary key. - validateCMPFieldElement(vc, ejbJar, cmp); - } - validateAbstractSchemaNameElement(vc, ejbJar, cmp); - validateJavaIdentifier(vc, ejbJar, cmp); - } - if(bean.isMessageDriven() && bean.getVersionID() == J2EEVersionConstants.EJB_2_1_ID) { - validateActivationConfiguration(vc, (MessageDriven)bean); - } - validatePrimKeyClassElement(vc, ejbJar, bean); - validateEJBRef(vc, ejbJar, bean); - } - catch(ValidationCancelledException e) { - throw e; - } - catch (Throwable exc) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2852, IEJBValidationContext.WARNING, bean, new String[]{J2EEConstants.EJBJAR_DD_SHORT_NAME, bean.getName()}, this); - vc.addMessage(message); - if (logger != null && logger.isLoggingLevel(Level.SEVERE)) { - logger.write(Level.SEVERE, exc); - } - } - } - - /** - * If the bean components (home interface, remote interface, bean class, and primary - * key) can all be found and reflected, return true. Let the DDValidator - * report the error message against the bean if one of these types doesn't reflect. - */ - public boolean validateBeanComponentsReflected(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - // Don't need to check if the bean is null, because this method will - // not be called if it is. - boolean isValid = true; - try { - ValidationRuleUtility.isValidTypeHierarchy(bean, bean.getEjbClass()); - } - catch (InvalidInputException exc) { - IMessage message = null; - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_EjbClass())) { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2802_NAMED, IEJBValidationContext.ERROR, bean, new String[]{bean.getEjbClassName()}, this); - } - else { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2802_UNNAMED, IEJBValidationContext.ERROR, bean, this); - } - vc.addMessage(message); - isValid = false; - } - - if(bean instanceof MessageDriven) { - // don't need to check the rest - return isValid; - } - - try { - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_HomeInterface())) { - ValidationRuleUtility.isValidTypeHierarchy(bean, bean.getHomeInterface()); - } - } - catch (InvalidInputException exc) { - IMessage message = null; - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_HomeInterface())) { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2803_NAMED, IEJBValidationContext.ERROR, bean, new String[]{bean.getHomeInterfaceName()}, this); - } - else { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2803_UNNAMED, IEJBValidationContext.ERROR, bean, this); - } - vc.addMessage(message); - isValid = false; - } - - try { - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_RemoteInterface())) { - ValidationRuleUtility.isValidTypeHierarchy(bean, bean.getRemoteInterface()); - } - } - catch (InvalidInputException exc) { - IMessage message = null; - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_RemoteInterface())) { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2804_NAMED, IEJBValidationContext.ERROR, bean, new String[]{bean.getRemoteInterfaceName()}, this); - } - else { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2804_UNNAMED, IEJBValidationContext.ERROR, bean, this); - } - vc.addMessage(message); - isValid = false; - } - - try { - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_LocalHomeInterface())) { - ValidationRuleUtility.isValidTypeHierarchy(bean, bean.getLocalHomeInterface()); - } - } - catch (InvalidInputException exc) { - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_LocalHomeInterface())) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2805_NAMED, IEJBValidationContext.ERROR, bean, new String[]{bean.getLocalHomeInterfaceName()}, this); - vc.addMessage(message); - isValid = false; - } - else { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2805_UNNAMED, IEJBValidationContext.ERROR, bean, this); - vc.addMessage(message); - isValid = false; - } - } - - try { - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_LocalInterface())) { - ValidationRuleUtility.isValidTypeHierarchy(bean, bean.getLocalInterface()); - } - } - catch (InvalidInputException exc) { - IMessage message = null; - if(bean.eIsSet(EjbPackage.eINSTANCE.getEnterpriseBean_LocalInterface())) { - message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2800_NAMED, IEJBValidationContext.ERROR, bean, new String[]{bean.getLocalInterfaceName()}, this); - } - else { - message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2800_UNNAMED, IEJBValidationContext.ERROR, bean, this); - } - vc.addMessage(message); - isValid = false; - } - - if (bean.isEntity()) { - JavaClass primaryKey = ((Entity) bean).getPrimaryKey(); - try { - ValidationRuleUtility.isValidTypeHierarchy(bean, primaryKey); - } - catch (InvalidInputException exc) { - IMessage message = null; - if(((Entity)bean).eIsSet(EjbPackage.eINSTANCE.getEntity_PrimaryKey())) { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2810_NAMED, IEJBValidationContext.ERROR, bean, new String[]{((Entity)bean).getPrimaryKeyName()}, this); - } - else { - message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2810_UNNAMED, IEJBValidationContext.ERROR, bean, this); - } - vc.addMessage(message); - isValid = false; - } - } - - return isValid; - } - - public void validateCMPFieldElement(IEJBValidationContext vc, EJBJar ejbJar, ContainerManagedEntity cmp) { - // check syntax of tag is okay - List fields = cmp.getPersistentAttributes(); - if ((fields == null) || (fields.size() == 0)) { - // unlike EJB 1.1 CMPs, this is legal. - return; - } - - boolean mapsToMultipleFields = !ValidationRuleUtility.isPrimitivePrimaryKey(cmp); - Iterator iterator = fields.iterator(); -// Field field = null; - List fieldNames = new ArrayList(fields.size()); - while (iterator.hasNext()) { - CMPAttribute attrib = (CMPAttribute) iterator.next(); - if (attrib == null) { - Logger logger = vc.getMsgLogger(); - if (logger != null && logger.isLoggingLevel(Level.FINEST)) { - LogEntry entry = vc.getLogEntry(); - entry.setSourceID("DDValidator.validateCMPFieldElement(EnterpriseBean)"); //$NON-NLS-1$ - entry.setText("CMPAttribute is null."); //$NON-NLS-1$ - logger.write(Level.FINEST, entry); - } - continue; - } - - fieldNames.add(attrib.getName()); - - JavaHelpers fieldType = attrib.getType(); - try { - // If the field is not a valid type - ValidationRuleUtility.isValidType(fieldType); - } - catch (InvalidInputException exc) { - // field not identified - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2830, IEJBValidationContext.WARNING, cmp, new String[] { attrib.getName()}, this); - vc.addMessage(message); - continue; // if you can't reflect it, then you can't validate it - } - - try { - if(!fieldType.isPrimitive() && - !ValidationRuleUtility.isSerializable(fieldType, cmp)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2855, IEJBValidationContext.INFO, cmp, new String[] { attrib.getName()}, this); - vc.addMessage(message); - } - } - catch(InvalidInputException e) { - String[] msgParm = (e.getJavaClass() == null) ? new String[]{} : new String[]{e.getJavaClass().getQualifiedName()}; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2907, IEJBValidationContext.WARNING, cmp, msgParm, this); - vc.addMessage(message); - } - } - - // 9.4.7.2 - if (mapsToMultipleFields && !ValidationRuleUtility.usesUnknownPrimaryKey(cmp)) { - List primKeyFields = cmp.getPrimaryKey().getFieldsExtended(); - - // (9.4.7.1 is validated in validatePrimKeyClassElement(bean) - // check if the primary key class' fields exist in the container-managed fields - iterator = primKeyFields.iterator(); - - while (iterator.hasNext()) { - Field keyField = (Field) iterator.next(); - if ((keyField.getName() != null) && (keyField.getName().equals(IMethodAndFieldConstants.FIELDNAME_SERIALVERSIONUID))) { - // not a customer-entered field - continue; - } - - if (!fieldNames.contains(keyField.getName())) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2831, IEJBValidationContext.WARNING, cmp, new String[] { keyField.getName()}, this); - vc.addMessage(message); - } - } - } - } - - public void validateCMRFieldElement(IEJBValidationContext vc, EJBJar ejbJar, ContainerManagedEntity cmp) { - if (cmp == null) - return; - switch(cmp.getVersionID()) { - case J2EEVersionConstants.EJB_1_0_ID: - case J2EEVersionConstants.EJB_1_1_ID: - break; - case J2EEVersionConstants.EJB_2_0_ID: - case J2EEVersionConstants.EJB_2_1_ID: default: - List fields = cmp.getCMRFields(); - Iterator iterator = fields.iterator(); - while(iterator.hasNext()) { - CMRField field = (CMRField)iterator.next(); - String fieldName = field.getName(); - if((fieldName == null) || (fieldName.equals(""))) { //$NON-NLS-1$ - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2857, IEJBValidationContext.INFO, cmp, new String[] { field.getName()}, this); - vc.addMessage(message); - continue; // don't look for the get methods - } - if(!ValidationRuleUtility.isValidJavaIdentifier(fieldName)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2857, IEJBValidationContext.INFO, cmp, new String[] { field.getName()}, this); - vc.addMessage(message); - } - - try { - JavaHelpers fieldType = field.getType(); - if(!ValidationRuleUtility.isAssignableFrom(fieldType, cmp.getLocalInterface()) && - !ValidationRuleUtility.isAssignableFromCollection(fieldType, cmp) && - !ValidationRuleUtility.isAssignableFromSet(fieldType, cmp)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2856, IEJBValidationContext.INFO, cmp, new String[] { field.getName()}, this); - vc.addMessage(message); - } - } - catch(InvalidInputException e) { - String[] msgParm = (e.getJavaClass() == null) ? new String[]{} : new String[]{e.getJavaClass().getQualifiedName()}; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2907, IEJBValidationContext.WARNING, cmp, msgParm, this); - vc.addMessage(message); - } - } - break; - } - } - - public void validateEJBNameElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean == null) { - return; - } - - String name = bean.getName(); - if ((name == null) || (name.equals(""))) { //$NON-NLS-1$ - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2801, IEJBValidationContext.ERROR, bean, this); - vc.addMessage(message); - } - - if(bean.isContainerManagedEntity() && bean.getVersionID() >= J2EEVersionConstants.EJB_2_0_ID) { - if(!ValidationRuleUtility.isValidJavaIdentifier(name)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2813, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - - // p. 466 - // "The name for an entity bean with cmp-version 2.x must conform - // to the lexical rules for an NMTOKEN. The name for an entity bean with - // cmp-version 2.x must not be a reserved literal in EJB QL. - if(ValidationRuleUtility.isReservedWord(name)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2859, IEJBValidationContext.INFO, bean, this); - vc.addMessage(message); - } - } - } - - public void validateAbstractSchemaNameElement(IEJBValidationContext vc, EJBJar ejbJar, ContainerManagedEntity cmp) { - if (cmp == null) - return; - switch(cmp.getVersionID()) { - case J2EEVersionConstants.EJB_1_0_ID: - case J2EEVersionConstants.EJB_1_1_ID: - break; - case J2EEVersionConstants.EJB_2_0_ID: - case J2EEVersionConstants.EJB_2_1_ID: default: - - String name = cmp.getAbstractSchemaName(); - if(!ValidationRuleUtility.isValidJavaIdentifier(name)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2858, IEJBValidationContext.WARNING, cmp, this); - vc.addMessage(message); - } - - // Check that the name is not a reserved word - if(ValidationRuleUtility.isReservedWord(name)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2860, IEJBValidationContext.INFO, cmp, this); - vc.addMessage(message); - } - break; - } - } - - public void validateJavaIdentifier(IEJBValidationContext vc, EJBJar ejbJar, ContainerManagedEntity cmp) { - /* - * Don't duplicate the EJB QL validator's function. - List queries = cmp.getQueries(); - Iterator iterator = queries.iterator(); - Query query = (Query)iterator.next(); - */ - } - - - /** - * Validate section 14.3 of the EJB 1.1 specification. - * - * 14.3 EJB References - * 14.3.1 Bean Provider's responsibilities - * 14.3.1.1 EJB reference programming interfaces - * 14.3.1.2 Declaration of EJB references in deployment descriptor - * 14.3.2 Application Assembler's responsibilities - * 14.3.3 Deployer's responsibility - * 14.3.4 Container Provider's responsibility - */ - public void validateEJBRef(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean == null) { - return; - } - - List ejbRefs = bean.getEjbRefs(); - if ((ejbRefs == null) || (ejbRefs.size() == 0)) { - return; - } - - Iterator iterator = ejbRefs.iterator(); - EjbRef ref = null; - while (iterator.hasNext()) { - ref = (EjbRef) iterator.next(); - if (ref == null) { - Logger logger = vc.getMsgLogger(); - if (logger != null && logger.isLoggingLevel(Level.FINEST)) { - LogEntry entry = vc.getLogEntry(); - entry.setSourceID("DDValidator.validateEJBRef(EnterpriseBean)"); //$NON-NLS-1$ - entry.setText("EjbRef is null in " + bean.getName()); //$NON-NLS-1$ - logger.write(Level.FINEST, entry); - } - continue; - } - // 14.3.1.1 - // Info mssg. "EJB spec recommends that all references to other enterprise beans be organized in the ejb subcontext of the bean's environment" - EnterpriseBean namedEjb = null; - if (ref.eIsSet(CommonPackage.eINSTANCE.getEjbRef_Link())) { - // Load the EJB identified by the reference, if it exists. - namedEjb = ejbJar.getEnterpiseBeanFromRef(ref); - if (namedEjb != null) { - // if the named EJB is null it could be in another EJBJar - Integer ejbType = new Integer(ref.getType().getValue()); - boolean wrongType = false; // is the EJB, identified by ejb-link, of the type specified in the ejb-ref-type element? - String type = (namedEjb instanceof Session) ? "Session" : "Entity"; //$NON-NLS-1$ //$NON-NLS-2$ - if (ejbType.intValue() == EjbRefType.SESSION) { - if (!(namedEjb instanceof Session)) { - wrongType = true; - } - } - else if (ejbType.intValue() == EjbRefType.ENTITY) { - if (!(namedEjb instanceof Entity)) { - wrongType = true; - } - } - else { - wrongType = true; - } - if (wrongType) { - String[] parms = { namedEjb.getName(), type }; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2835, IEJBValidationContext.INFO, bean, parms, this); - vc.addMessage(message); - } - } - } - - // 14.3.1.2, 14.3.2, 14.3.4 - // Check that ejb-ref-name, ejb-ref-type, home, and remote have been defined, and exist - validateHomeRef(vc, ejbJar, ref, namedEjb); - validateRemoteRef(vc, ejbJar, ref, namedEjb); - - // 14.3.1.1 - // Info mssg. "EJB spec recommends that all references to other enterprise beans be organized in the ejb subcontext of the bean's environment" - if (ref.eIsSet(CommonPackage.eINSTANCE.getEjbRef_Name())) { - // If ejb name isn't set, that error would have been caught by one of the validateRef methods - // Don't duplicate that effort here. - String ejbName = ref.getName(); - if (!ejbName.startsWith("ejb/")) { //$NON-NLS-1$ - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2838, IEJBValidationContext.INFO, bean, this); - vc.addMessage(message); - } - } - } - } - - /** - * Validate section 14.3 of the EJB 1.1 specification. - * - * 14.2.1.2 Declaration of environment entries - */ - public void validateEnvironmentEntries(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean == null) { - return; - } - - List envEntries = bean.getEnvironmentProperties(); - if ((envEntries == null) || (envEntries.size() == 0)) { - return; - } - - EnvEntry envEntry = null; - Iterator iterator = envEntries.iterator(); - DuplicatesTable envNames = new DuplicatesTable(); - while (iterator.hasNext()) { - envEntry = (EnvEntry) iterator.next(); - if (envEntry == null) { - Logger logger = vc.getMsgLogger(); - if (logger != null && logger.isLoggingLevel(Level.FINEST)) { - LogEntry entry = vc.getLogEntry(); - entry.setSourceID("DDValidator.validateEnvironmentEntries(EnterpriseBean)"); //$NON-NLS-1$ - entry.setText("EjbEntry is null in " + bean.getName()); //$NON-NLS-1$ - logger.write(Level.FINEST, entry); - } - continue; - } - - if (envEntry.getName() != null) { - envNames.add(envEntry.getName()); - } - else { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2839, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - - if (envEntry.isSetType()) { - // 14.2.1.2; type must be one of these types: String, Integer, Boolean, Double, Byte, Short, Long, and Float. - int type = envEntry.getType().getValue(); - if (!((type == EnvEntryType.BOOLEAN) || (type == EnvEntryType.BYTE) || (type == EnvEntryType.DOUBLE) || (type == EnvEntryType.FLOAT) || (type == EnvEntryType.INTEGER) || (type == EnvEntryType.LONG) || (type == EnvEntryType.SHORT) || (type == EnvEntryType.STRING) || (type == EnvEntryType.CHARACTER))) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2840, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - } - else { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2840, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - } - - if (envNames.containsDuplicates()) { - Iterator dups = envNames.getDuplicates().iterator(); - while (dups.hasNext()) { - String name = (String) dups.next(); - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2841, IEJBValidationContext.WARNING, bean, new String[] { name }, this); - vc.addMessage(message); - } - } - } - - /** - * If the metadata from the EjbRef is not valid, add a validation message. - * - * @parm EjbRef The <ejb-ref> element this method validates. - * @parm EnterpriseBean If the <ejb-ref> uses an <ejb-link>, this is the enterprise bean identified by that link. If the link doesn't exist, or if the user has identified a bean which doesn't exist, this parameter will be null. - */ - protected void validateHomeRef(IEJBValidationContext vc, EJBJar ejbJar, EjbRef ref, EnterpriseBean namedEjb) { - boolean validType = true; - EnterpriseBean bean = (EnterpriseBean)ref.eContainer(); - if (ref.eIsSet(CommonPackage.eINSTANCE.getEjbRef_Home())) { - try { - String homeName = ref.getHome(); - JavaHelpers type = ValidationRuleUtility.getType(homeName, bean); - // Check that the home specified in the <home> element of the <ejb-ref> element - // exists. - ValidationRuleUtility.isValidType(type); - - if (namedEjb != null) { - // Check that the home specified in the <home> element - // is assignable to the home used by the named EJB in the - // <ejb-link> element. - JavaClass intfType = namedEjb.getHomeInterface(); - ValidationRuleUtility.isValidType(intfType); - - // Make sure that the identified home/remote interface in the ejb-ref - // is of the same type as the one used by the bean. - if (!ValidationRuleUtility.isAssignableFrom(type, intfType)) { - String[] parms = { namedEjb.getName(), intfType.getName()}; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2836, IEJBValidationContext.INFO, bean, parms, this); - vc.addMessage(message); - } - } - } - catch (InvalidInputException exc) { - validType = false; - } - } - else { - validType = false; - } - - if (!validType) { - String[] parms = { ref.getHome()}; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2832, IEJBValidationContext.INFO, bean, parms, this); - vc.addMessage(message); - } - } - - /** - * If the bean provides a local view, both parts of the view must exist. - * If this method is being called, then all parts of the bean are reflected. - */ - protected void validateLocalPairs(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if(bean instanceof MessageDriven) { - // Message driven beans don't use local or remote views - return; - } - - JavaClass local = bean.getLocalInterface(); - JavaClass localHome = bean.getLocalHomeInterface(); - if((local != null ) && (localHome == null)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2880, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - else if((local == null) && (localHome != null)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2882, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - // otherwise either both are set or both are unset, and that's fine. - } - - /** - * If the bean provides a remote view, both parts of the view must exist. - * If this method is being called, then all parts of the bean are reflected. - */ - protected void validateRemotePairs(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if(bean instanceof MessageDriven) { - // Message driven beans don't use local or remote views - return; - } - - JavaClass remote = bean.getRemoteInterface(); - JavaClass home = bean.getHomeInterface(); - if((remote != null) && (home == null)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2881, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - else if((remote == null) && (home != null)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2883, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - // otherwise either both are set or both are unset, and that's fine. - } - - /** - * The bean must provide either a local view, or a remote view, or both. - */ - protected void validateLocalOrRemote(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if(bean instanceof MessageDriven) { - // Message driven beans don't use local or remote views - return; - } - - JavaClass local = bean.getLocalInterface(); - JavaClass localHome = bean.getLocalHomeInterface(); - JavaClass remote = bean.getRemoteInterface(); - JavaClass remoteHome = bean.getHomeInterface(); - - if((localHome == null) && (remoteHome == null)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2884, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - - if((local == null) && (remote == null)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2885, IEJBValidationContext.WARNING, bean, this); - vc.addMessage(message); - } - } - - public void validatePersistenceTypeElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - // Attempt in vain to validate the persistence type element here, because - // if it's not specified, there's a syntax error, and the - // validateDeploymentDescriptor(IReporter, IValidationContext) would have been - // called instead. - if (bean.isEntity()) { - // check syntax - Entity entityBean = (Entity) bean; - if (!(entityBean.isContainerManagedEntity() || entityBean.isBeanManagedEntity())) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2809, IEJBValidationContext.ERROR, bean, this); - vc.addMessage(message); - } - } - } - - /** - * If the primary key class reflected properly, return true. Else, return false. - */ - public void validatePrimKeyClassElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean.isEntity()) { - // check syntax - if (bean instanceof ContainerManagedEntity) { - ContainerManagedEntity cmp = (ContainerManagedEntity) bean; - CMPAttribute attr = cmp.getPrimKeyField(); - if((attr != null) && !attr.eIsProxy() && !isValidPrimKeyField(cmp,attr)) { - // 9.4.7.1 - // user has specified both a prim-key-class and a primkey-field - // can't use the CMPAttribute's field's name, because the primitive primary key returned is null - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2828, IEJBValidationContext.ERROR, bean, this); - vc.addMessage(message); - } - } - } - } - - /** - * If the prim key is specified in the xml, answer whether it is the same as the derived primaryKeyAttribute - */ - public boolean isValidPrimKeyField(ContainerManagedEntity cmp, CMPAttribute attr) { - return cmp.getPrimaryKeyName().equals(attr.getType().getJavaName()); - } - - public void validateReentrantElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean.isEntity()) { - // check syntax - Entity entity = (Entity) bean; - if (!entity.eIsSet(EjbPackage.eINSTANCE.getEntity_Reentrant())) { - // Can only test if the reentrant attribute is set, because the model defaults it - // to some boolean value if it isn't set. - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2806, IEJBValidationContext.ERROR, bean, this); - vc.addMessage(message); - } - } - } - - /** - * If the metadata from the EjbRef is not valid, add a validation message. - * - * @parm EjbRef The ref whose home this method checks. - * @parm EnterpriseBean If the EjbRef uses an <ejb-link> element, this is the enterprise bean identified by that element. It may be null, if the user has made a mistake. - */ - protected void validateRemoteRef(IEJBValidationContext vc, EJBJar ejbJar, EjbRef ref, EnterpriseBean namedEjb) { - boolean validType = true; - EnterpriseBean bean = (EnterpriseBean)ref.eContainer(); - if (ref.eIsSet(CommonPackage.eINSTANCE.getEjbRef_Remote())) { - try { - String remoteName = ref.getRemote(); - JavaHelpers type = ValidationRuleUtility.getType(remoteName, bean); - // Check that the home specified in the <home> element of the <ejb-ref> element - // exists. - ValidationRuleUtility.isValidType(type); - - if (namedEjb != null) { - // Check that the home specified in the <home> element - // is assignable to the home used by the named EJB in the - // <ejb-link> element. - JavaClass intfType = namedEjb.getRemoteInterface(); - ValidationRuleUtility.isValidType(intfType); - - // Make sure that the identified home/remote interface in the ejb-ref - // is of the same type as the one used by the bean. - if (!ValidationRuleUtility.isAssignableFrom(type, intfType)) { - String[] parms = { namedEjb.getName(), intfType.getName()}; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2837, IEJBValidationContext.INFO, bean, parms, this); - vc.addMessage(message); - } - } - } - catch (InvalidInputException exc) { - validType = false; - } - } - else { - validType = false; - } - - if (!validType) { - String[] parms = { ref.getRemote()}; - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2833, IEJBValidationContext.INFO, bean, parms, this); - vc.addMessage(message); - } - } - - /** - * 15.2.5.3 Declaration of security roles referenced from the bean's code - * The Bean Provider is responsible for declaring in the security-role-ref - * elements of the deployment descriptor all the security role names used - * in the enterprise bean code. Declaring the security roles references in - * the code allows the Application Assembler or Deployer to link the names - * of the security roles used in the code to the security roles defined for - * an assembled application through the security-role elements. - * The Bean Provider must declare each security role referenced in the code - * using the security-role-ref element as follows: - * Declare the name of the security role using the role-name element. - * The name must be the security role name that is used as a parameter to - * the isCallerInRole(String role-Name) method. - * Optional: Provide a description of the security role in the - * description element. A security role reference, including the name defined - * by the role-name element, is scoped to the session or entity bean element - * whose declaration contains the security-role-ref element. The following - * example illustrates how an enterprise bean's references to security roles - * are declared in the deployment descriptor. - * ... - * <enterprise-beans> - * ... - * <entity> - * <ejb-name>AardvarkPayroll</ejb-name> - * <ejb-class>com.aardvark.payroll.PayrollBean</ejb-class> - * ... - * <security-role-ref> - * <description> - * This security role should be assigned to the - * employees of the payroll department who are - * allowed to update employees' salaries. - * </description> - * <role-name>payroll</role-name> - * </security-role-ref> - * ... - * </entity> - * ... - * </enterprise-beans> - * ... - * - * The deployment descriptor above indicates that the enterprise bean - * AardvarkPayroll makes the security check using isCallerInRole("payroll") - * in its business method. - * - * - * 15.3.3 Linking security role references to security roles - * If the Application Assembler defines the security-role elements in the - * deployment descriptor, he or she is also responsible for linking all the - * security role references declared in the security-role-ref elements to the - * security roles defined in the security-role elements. The Application - * Assembler links each security role reference to a security role using the - * role-link element. The value of the role-link element must be the name of - * one of the security roles defined in a security-role element. - * A role-link element must be used even if the value of role-name is the - * same as the value of the role-link reference. - * The following deployment descriptor example shows how to link the security - * role reference named payroll to the security role named payroll-department. - * ... - * <enterprise-beans> - * ... - * <entity> - * <ejb-name>AardvarkPayroll</ejb-name> - * <ejb-class>com.aardvark.payroll.PayrollBean</ejb-class> - * ... - * <security-role-ref> - * <description> - * This role should be assigned to the - * employees of the payroll department. - * Members of this role have access to - * anyone's payroll record. - * - * The role has been linked to the - * payroll-department role. - * </description> - * <role-name>payroll</role-name> - * <role-link>payroll-department</role-link> - * </security-role-ref> - * ... - * </entity> - * ... - * </enterprise-beans> - * ... - * - */ - public void validateSecurityRoleRefElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean == null) { - return; - } - - /** - * Need to build up a list of duplicate role names, but the validation message - * needs to be registered against the duplicate SecurityRoleRef instance. - * (Without the instance, we cannot get line numbers.) - * - * This class wrappers the SecurityRoleRef instance so that the wrapper's - * implemention of equals compares the names, but the validation message will - * still be able to get the ref from the duplicate name. - */ - class RoleRefWrapper { - private SecurityRoleRef _ref = null; - - public RoleRefWrapper(SecurityRoleRef ref) { - _ref = ref; - } - - @Override - public boolean equals(Object o) { - if (o instanceof RoleRefWrapper) { - RoleRefWrapper other = (RoleRefWrapper) o; - return _ref.getName().equals(other.getRoleRef().getName()); - } - return false; - } - - @Override - public int hashCode() { - return super.hashCode() + _ref.getName().hashCode(); - } - - public SecurityRoleRef getRoleRef() { - return _ref; - } - } - - boolean areSRolesDefined = ((_securityRoles != null) && (_securityRoles.size() > 0)); - - List securityRoleRefs = bean.getSecurityRoleRefs(); - if ((securityRoleRefs != null) && (securityRoleRefs.size() != 0)) { - // Check that each security role ref refers to a security role, - // if security roles are defined in the assembly descriptor, - // and that each referenced security role exists. - DuplicatesTable roleRefNames = new DuplicatesTable(); - for (int i = 0; i < securityRoleRefs.size(); i++) { - SecurityRoleRef ref = (SecurityRoleRef) securityRoleRefs.get(i); - - // Check that the role name is set (15.2.5.3) - String roleName = ref.getName(); - if ((roleName == null) || (roleName.equals(""))) { //$NON-NLS-1$ - roleName = ""; //$NON-NLS-1$ - String beanName = (bean.getName() == null) ? "" : bean.getName(); //$NON-NLS-1$ - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2822, IEJBValidationContext.WARNING, ref, new String[] { beanName }, this); - vc.addMessage(message); - } - else { - // Build up the list of names, to check for duplicates - roleRefNames.add(new RoleRefWrapper(ref)); - } - - // Check that the role link is set (15.3.3) - String roleLink = ref.getLink(); - boolean isLinkDefined = ((ref.eIsSet(CommonPackage.eINSTANCE.getSecurityRoleRef_Link())) && (roleLink != null) && (!roleLink.equals(""))); //$NON-NLS-1$ - - if ((areSRolesDefined) && (!isLinkDefined)) { - // must have role link defined (15.3.3) - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2823, IEJBValidationContext.WARNING, ref, this); - vc.addMessage(message); - } - else if ((!areSRolesDefined) && (isLinkDefined)) { - // must not have role link defined (15.2.5.3) - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2827, IEJBValidationContext.WARNING, ref, this); - vc.addMessage(message); - } - else if (areSRolesDefined && isLinkDefined) { - // check that the role listed in the link exists. (15.3.3) - Iterator iterator = _securityRoles.iterator(); - boolean roleExists = false; - while(iterator.hasNext()) { - SecurityRole role = (SecurityRole)iterator.next(); - if(role.getRoleName().equals(roleLink)) { - roleExists = true; - break; - } - } - if (!roleExists) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2824, IEJBValidationContext.WARNING, ref, new String[] { roleName }, this); - vc.addMessage(message); - } - } - } - - // Check for duplicates - // Check that there are no duplicate role-names. (15.3.1) - if (roleRefNames.containsDuplicates()) { - List duplicates = roleRefNames.getDuplicates(); - Iterator iterator = duplicates.iterator(); - while (iterator.hasNext()) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2820, IEJBValidationContext.WARNING, ((RoleRefWrapper) iterator.next()).getRoleRef(), this); - vc.addMessage(message); - } - } - roleRefNames.clear(); - } - } - - /** - * 6.5.3 The optional SessionSynchronization interface - *... - * Only a stateful Session bean with container-managed transaction demarcation may - * implement the SessionSynchronization interface. - *... - * There is no need for a Session bean with bean-managed transaction to rely on the - * synchronization call backs because the bean is in control of the commit the bean - * knows when the transaction is about to be committed and it knows the outcome of the - * transaction commit. - *... - */ - public void validateSessionTypeElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean.isSession()) { - Session session = (Session) bean; - - // check syntax - boolean isValidSess = ValidationRuleUtility.isValidSessionTypeElement(session); - if (!isValidSess) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2807, IEJBValidationContext.ERROR, session, this); - vc.addMessage(message); - } - - } - } - public void validateTransactionTypeElement(IEJBValidationContext vc, EJBJar ejbJar, EnterpriseBean bean) { - if (bean.isSession()) { - // check syntax - Session sessionBean = (Session) bean; - if (!ValidationRuleUtility.isValidTransactionTypeElement(sessionBean)) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IEJBValidatorMessageConstants.CHKJ2808, IEJBValidationContext.ERROR, bean, this); - vc.addMessage(message); - } - } - } - - /* - * @see IValidationRule#reset() - */ - @Override - public void reset() { - super.reset(); - _securityRoles = null; - } - - /* - * @see IValidationRule#preValidate(IEJBValidationContext, Object, Object) - */ - @Override - public void preValidate(IEJBValidationContext vc, Object targetParent, Object target) throws ValidationCancelledException, ValidationException { - super.preValidate(vc, targetParent, target); - - EJBJar ejbJar = (EJBJar)vc.loadModel(EJBValidatorModelEnum.EJB_MODEL); - if(ejbJar == null) { - return; - } - - if(ejbJar.getAssemblyDescriptor() == null) { - return; - } - _securityRoles = ejbJar.getAssemblyDescriptor().getSecurityRoles(); - } - - /** - * Need to build up a list of duplicate EJB names, but the validation message - * needs to be registered against the duplicate EnterpriseBean instance. - * (Without the instance, we cannot get line numbers.) - * - * This class wrappers the EnterpriseBean instance so that the wrapper's - * implemention of equals compares the names, but the validation message will - * still be able to get the ref from the duplicate name. - */ - class EjbNameWrapper { - private EnterpriseBean _bean = null; - - public EjbNameWrapper(EnterpriseBean bean) { - _bean = bean; - } - - @Override - public boolean equals(Object o) { - if (o instanceof EnterpriseBean) { - EnterpriseBean other = (EnterpriseBean) o; - return _bean.getName().equals(other.getName()); - } - return false; - } - - @Override - public int hashCode() { - return super.hashCode() + _bean.getName().hashCode(); - } - - public EnterpriseBean getBean() { - return _bean; - } - } - - class ASNameWrapper { - private ContainerManagedEntity _bean = null; - - public ASNameWrapper(ContainerManagedEntity bean) { - _bean = bean; - } - - @Override - public boolean equals(Object o) { - if (o instanceof ContainerManagedEntity) { - ContainerManagedEntity other = (ContainerManagedEntity) o; - return _bean.getAbstractSchemaName().equals(other.getAbstractSchemaName()); - } - return false; - } - - @Override - public int hashCode() { - return super.hashCode() + _bean.getAbstractSchemaName().hashCode(); - } - - public EnterpriseBean getBean() { - return _bean; - } - } - /** - * @param driven - */ - private void validateActivationConfiguration(IEJBValidationContext vc, MessageDriven bean) { - ActivationConfig config = bean.getActivationConfig(); - if(config != null) { - List configProperties = config.getConfigProperties(); - if(configProperties != null && !configProperties.isEmpty()) { - HashSet namePropertySet = new HashSet(); - for(int i = 0; i < configProperties.size(); i++) { - ActivationConfigProperty property = (ActivationConfigProperty)configProperties.get(i); - boolean doesNotExists = namePropertySet.add(property.getName()); - if(!doesNotExists) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2886, IMessage.HIGH_SEVERITY, bean, bean.getEjbJar(),new String[] {property.getName(),bean.getName()},this); - vc.addMessage(message); - } - if(isJMSMDB(bean)) { - validationAckModeActivationConfig(vc, bean, property); - validateDestinationTypeActivationConfig(vc, bean, property); - validateDurabilityActivationConfig(vc, bean, configProperties, property); - } - } - } - } - } - - private boolean isJMSMDB(MessageDriven bean) { - return bean.getMessagingType() == null || bean.getMessagingType().getQualifiedName().equals(JMS_MESSAGING_TYPE); - } - - private void validationAckModeActivationConfig(IEJBValidationContext vc, MessageDriven bean, ActivationConfigProperty property) { - if(property.getName().equals(MDBActivationConfigModelUtil.ackModeKey) && !Arrays.asList(MDBActivationConfigModelUtil.ackModeValues).contains(property.getValue())) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2887, IMessage.HIGH_SEVERITY, bean, bean.getEjbJar(),new String[] {property.getName(),property.getValue(),bean.getName()},this); - vc.addMessage(message); - } - } - - /** - * @param vc - * @param bean - * @param property - */ - private void validateDestinationTypeActivationConfig(IEJBValidationContext vc, MessageDriven bean, ActivationConfigProperty property) { - if(property.getName().equals(MDBActivationConfigModelUtil.destinationTypeKey) && !Arrays.asList(MDBActivationConfigModelUtil.destinationTypeValues).contains(property.getValue())) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2887, IMessage.HIGH_SEVERITY, bean, bean.getEjbJar(),new String[] {property.getName(),property.getValue(),bean.getName()},this); - vc.addMessage(message); - } - JavaClass messageDestination = bean.getMessageDestination(); - if(messageDestination != null && messageDestination.getQualifiedName() != null && (property.getName().equals(MDBActivationConfigModelUtil.destinationTypeKey) && !(messageDestination.getQualifiedName().equals(property.getValue())))) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2890, IMessage.HIGH_SEVERITY, bean, bean.getEjbJar(),new String[] {messageDestination.getQualifiedName(),property.getValue(),bean.getName()},this); - vc.addMessage(message); - } - } - /** - * @param vc - * @param bean - * @param configProperties - * @param property - */ - private void validateDurabilityActivationConfig(IEJBValidationContext vc, MessageDriven bean, List configProperties, ActivationConfigProperty property) { - if(property.getName().equals(MDBActivationConfigModelUtil.durabilityKey) && !Arrays.asList(MDBActivationConfigModelUtil.durabilityValue).contains(property.getValue())) { - IMessage message = MessageUtility.getUtility().getMessage(vc, IMessagePrefixEjb20Constants.CHKJ2887, IMessage.HIGH_SEVERITY, bean, bean.getEjbJar(),new String[] {property.getName(),property.getValue(),bean.getName()},this); - vc.addMessage(message); - } - } -} |