/******************************************************************************* * 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.HashSet; import java.util.List; import java.util.Locale; import java.util.Set; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.util.EList; import org.eclipse.jst.j2ee.common.EjbRef; import org.eclipse.jst.j2ee.common.internal.impl.ResourceRefImpl; import org.eclipse.jst.j2ee.common.internal.impl.SecurityRoleImpl; import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin; import org.eclipse.wst.validation.internal.ResourceConstants; import org.eclipse.wst.validation.internal.ResourceHandler; import org.eclipse.wst.validation.internal.core.Message; import org.eclipse.wst.validation.internal.core.ValidationException; import org.eclipse.wst.validation.internal.operations.LocalizedMessage; import org.eclipse.wst.validation.internal.provisional.core.IMessage; import org.eclipse.wst.validation.internal.provisional.core.IReporter; import org.eclipse.wst.validation.internal.provisional.core.IValidationContext; import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob; /** * Insert the type's description here. Creation date: (3/9/2001 3:34:39 PM) * * @author: Administrator */ public abstract class J2EEValidator implements IValidatorJob, J2EEMessageConstants { protected IReporter _reporter; protected IValidationContext _helper; protected IStatus status = OK_STATUS; public J2EEValidator() { initialize(); } /** * <p> * Create am <em>error</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgId * The ID of the message to be created. */ public void addError(String msgId) { addError(getBaseName(), msgId, null); } /** * <p> * Create am <em>error</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgId * The ID of the message to be created. */ public void addError(String msgId, String[] msgArgs) { addError(getBaseName(), msgId, msgArgs); } /** * <p> * Create am <em>error</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. */ public void addError(String msgCategory, String msgId) { addError(msgCategory, msgId, null); } /** * <p> * Create an <em>error</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require one or more arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addError(String bundleName, String msgId, String[] msgArgs) { this.addError(bundleName, msgId, msgArgs, null); } /** * <p> * Create an <em>error</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require one or more arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addError(String bundleName, String msgId, String[] msgArgs, Object target) { _reporter.addMessage(this, new Message(bundleName, IMessage.HIGH_SEVERITY, msgId, msgArgs, target)); } public void addError(String bundleName, String msgId, String[] msgArgs, Object target, String groupName) { IMessage message = new Message(bundleName, IMessage.HIGH_SEVERITY, msgId, msgArgs, target); message.setGroupName(groupName); _reporter.addMessage(this, message); } public void addError(String bundleName, String msgId, String[] msgArgs, Object target, String groupName, int lineNumber) { IMessage message = new Message(bundleName, IMessage.HIGH_SEVERITY, msgId, msgArgs, target); message.setLineNo(lineNumber); message.setGroupName(groupName); _reporter.addMessage(this, message); } public void addLocalizedError(String msg, Object target) { _reporter.addMessage(this, new LocalizedMessage(IMessage.HIGH_SEVERITY, msg, target)); } public void addLocalizedError(String msg, Object target, int lineNumber) { addLocalizedError( msg, target, null, lineNumber ); } public void addLocalizedError(String msg, Object target, String groupName, int lineNumber) { IMessage message = new LocalizedMessage(IMessage.HIGH_SEVERITY, msg, target); message.setGroupName( groupName ); message.setLineNo(lineNumber); _reporter.addMessage(this, message); } public void addLocalizedError(String msg, Object target, String groupName) { IMessage message = new LocalizedMessage(IMessage.HIGH_SEVERITY, msg, target); message.setGroupName( groupName ); _reporter.addMessage(this, message); } /** * <p> * Create an <em>informational</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgId * The ID of the message to be created. */ public void addInfo(String msgId) { addInfo(getBaseName(), msgId, null); } /** * <p> * Create an <em>informational</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addInfo(String msgId, String[] msgArgs) { addInfo(getBaseName(), msgId, msgArgs); } /** * <p> * Create an <em>informational</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. */ public void addInfo(String msgCategory, String msgId) { addInfo(msgCategory, msgId, null); } /** * <p> * Create an <em>informational</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require one or more arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addInfo(String bundleName, String msgId, String[] msgArgs) { addInfo(bundleName, msgId, msgArgs, null); } /** * <p> * Create an <em>informational</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require one or more arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addInfo(String bundleName, String msgId, String[] msgArgs, Object target) { _reporter.addMessage(this, new Message(bundleName, IMessage.LOW_SEVERITY, msgId, msgArgs, target)); } public void addLocalizedInfo(String msg, Object target) { _reporter.addMessage(this, new LocalizedMessage(IMessage.LOW_SEVERITY, msg, target)); } /** * <p> * Create a <em>warning</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgId * The ID of the message to be created. */ public void addWarning(String msgId) { addWarning(getBaseName(), msgId, null); } /** * <p> * Create a <em>warning</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addWarning(String msgId, String[] msgArgs) { addWarning(getBaseName(), msgId, msgArgs); } /** * <p> * Create a <em>warning</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require no arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. */ public void addWarning(String msgCategory, String msgId) { addWarning(msgCategory, msgId, null); } /** * <p> * Create a <em>warning</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require one or more arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addWarning(String bundleName, String msgId, String[] msgArgs) { addWarning(bundleName, msgId, msgArgs, null); } /** * <p> * Create a <em>warning</em> message and route it to the cached reporter. This form of * <code>addError</code> is for messages which require one or more arguments. * </p> * * @param msgCategory * The base name of the message bundle to use. * @param msgId * The ID of the message to be created. * @param msgArgs * The parameters for the message. */ public void addWarning(String bundleName, String msgId, String[] msgArgs, Object target) { _reporter.addMessage(this, new Message(bundleName, IMessage.NORMAL_SEVERITY, msgId, msgArgs, target)); } public void addWarning(String bundleName, String msgId, String[] msgArgs, Object target, String groupName) { IMessage message = new Message(bundleName, IMessage.NORMAL_SEVERITY, msgId, msgArgs, target); message.setGroupName(groupName); _reporter.addMessage(this, message); } public void addLocalizedWarning(String msg, Object target) { _reporter.addMessage(this, new LocalizedMessage(IMessage.NORMAL_SEVERITY, msg, target)); } public void addLocalizedWarning(String msg, Object target, String groupName) { IMessage message = new LocalizedMessage(IMessage.NORMAL_SEVERITY, msg, target); message.setGroupName(groupName); _reporter.addMessage(this, message); } /** * Perform any resource cleanup once validation is complete. * @deprecated Use cleanup(IReporter reporter) */ public void cleanup() { _reporter = null; } /** * Perform any resource cleanup once validation is complete. If cleanup will take some time, the * IValidator should report subtask information to the user through the IReporter parameter. The * AReporter parameter will not be null. */ public void cleanup(IReporter reporter) { _reporter = null; } /** * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder * uses this string as input to the IProgressMonitor. i.e., At some point during the validation * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0} * is the string that this method returns, and {1} is the name of the current resource. */ public String[] get1Param(String string1) { String[] parms = new String[1]; parms[0] = string1; return parms; } /** * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder * uses this string as input to the IProgressMonitor. i.e., At some point during the validation * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0} * is the string that this method returns, and {1} is the name of the current resource. */ public String[] get2Param(String string1, String string2) { String[] parms = new String[2]; parms[0] = string1; parms[1] = string2; return parms; } /** * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder * uses this string as input to the IProgressMonitor. i.e., At some point during the validation * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0} * is the string that this method returns, and {1} is the name of the current resource. */ public String[] get3Param(String string1, String string2, String string3) { String[] parms = new String[2]; parms[0] = string1; parms[1] = string2; parms[2] = string3; return parms; } /** * <p> * Answer the id of the resource bundle which is used by the receiver. * </p> */ public abstract String getBaseName(); /** * Returns a localized message from a resource bundle. * * @param msgCategory * The baseName of the resource bundle (filename minus any locale suffix) * @param msgId * The key of the message to lookup from the bundle. * @param msgArgs * An array of arguments that will be substituted into any message arguments in the * message's value. * @param locale * The locale to retrieve the message text from. */ public String getMessage(String msgCategory, String msgId, String[] msgArgs, Locale locale) { return J2EEValidationResourceHandler.getExternalizedMessage(msgCategory, msgId, getClass(), msgArgs, locale); } /** * Returns a localized message from a resource bundle. * * @param msgCategory * The baseName of the resource bundle (filename minus any locale suffix) * @param msgId * The key of the message to lookup from the bundle. * @param locale * The locale to retrieve the message text from. */ public String getMessage(String msgCategory, String msgId, Locale locale) { return J2EEValidationResourceHandler.getExternalizedMessage(msgCategory, msgId, getClass(), locale); } /** * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder * uses this string as input to the IProgressMonitor. i.e., At some point during the validation * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0} * is the string that this method returns, and {1} is the name of the current resource. */ public String getName() { return getName(Locale.getDefault()); } /** * <p> * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder * uses this string as input to the IProgressMonitor. i.e., At some point during the validation * process, the Validation Builder will output this string: * </p> * * <pre> * "{0} is validating {1}.", * </pre> * * <p> * where * </p> * * <pre> * {0} is the string that this method returns, * </pre> * * <p> * and * </p> * * <pre> * {1} is the name of the current resource. * </pre> * * @param locale * The locale from which to retrieve the name text. */ public String getName(Locale locale) { return getMessage(getBaseName(), VALIDATOR_NAME, locale); } /** * Returns the name of the Validator, as it should be displayed in the UI. The ValidationBuilder * uses this string as input to the IProgressMonitor. i.e., At some point during the validation * process, the Validation Builder will output this string: "{0} is validating {1}.", where {0} * is the string that this method returns, and {1} is the name of the current resource. */ public String[] getParam1(String string1) { String[] parms = new String[1]; parms[0] = string1; return parms; } protected void initialize() { // Default } /** * This is the method which performs the validation on the MOF model. <br> * <br> * <code>helper</code> and <code>reporter</code> may not be null. <code>changedFiles</code> * may be null, if a full build is desired. <br> * <br> * <code>helper</code> loads a EObject. The EObject is the root of the MOF model about to be * validated. When this object is traversed, you can reach every element in the MOF model which * needs to be validated. <br> * <br> * <code>reporter</code> is an instance of an IReporter interface, which is used for * interaction with the user. <br> * <br> * <code>changedFiles</code> is an array of file names which have changed since the last * validation. If <code>changedFiles</code> is null, or if it is an empty array, then a full * build is performed. Otherwise, validation on just the files listed in the Vector is * performed. */ public void validate(IValidationContext inHelper, IReporter inReporter) throws ValidationException { _helper = inHelper; _reporter = inReporter; if ((inHelper == null) || (inReporter == null)) { return; } } public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter) throws ValidationException { _helper = inHelper; _reporter = inReporter; status = OK_STATUS; return status; } /** * Validate EJB references. */ protected void validateEJBRefManadatoryElements(EjbRef eref, String ownerName) { String[] parms = new String[2]; parms[0] = eref.getName(); parms[1] = ownerName; if ((eref.getName() == null) || (eref.getName().trim().length() == 0)) addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFNAME, parms, eref); if (eref.isSetType()) { if (eref.getType() == null) addWarning(EREF_CATEGORY, ERROR_EAR_INVALID_EREFTYPE, parms); } else addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFTYPE, parms); String refHome = eref.getHome(); if ((refHome == null) || (refHome.trim().length() == 0)) addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFHOME, parms, eref); if ((eref.getRemote() == null) || (eref.getRemote().trim().length() == 0)) addWarning(EREF_CATEGORY, ERROR_EAR_MISSING_EREFREMOTE, parms, eref); } /** * Validate for duplicates in EAR Roles. */ protected void validateResourceRefs(List resourceRefs) { int numRefs = resourceRefs.size(); Set refSet = new HashSet(numRefs); for (int refNo = 0; refNo < numRefs; refNo++) { String refName = ((ResourceRefImpl) (resourceRefs.get(refNo))).getName(); String[] parms = new String[1]; parms[0] = refName; if (!(refSet.add(refName))) addError(EREF_CATEGORY, ERROR_EAR_DUPLICATE_RESREF, parms, resourceRefs.get(refNo)); } } /** * Validate the existance of Web Roles within the EAR Roles and duplicates in Web Roles. */ protected void validateWEBRolesWithEARRoles(EList earRoleList, EList warRoles) { int numRoles = warRoles.size(); // TFB This implementation requires a 'small' list of warRoles. // If 'warRoles' gets too big then another implementation // will be necessary. for (int roleNo = 0; roleNo < numRoles; roleNo++) { if( _reporter.isCancelled() ){ String msg = ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_STATUS_VALIDATOR_TERMINATED); status = WTPCommonPlugin.createErrorStatus(msg); } SecurityRoleImpl nextRole = (SecurityRoleImpl) (warRoles.get(roleNo)); String[] parms = new String[1]; parms[0] = nextRole.getRoleName(); if (!(earRoleList.contains(nextRole))) addWarning(WAR_CATEGORY, ERROR_EAR_MISSING_EJB_ROLE, parms, nextRole); } } }