blob: 6babaed7d6a442dd2696282d213a765315437f1f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2007 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.internal.validation;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.MultiRule;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter;
import org.eclipse.jem.workbench.utility.JemProjectUtilities;
import org.eclipse.jst.j2ee.application.EjbModule;
import org.eclipse.jst.j2ee.application.Module;
import org.eclipse.jst.j2ee.application.WebModule;
import org.eclipse.jst.j2ee.classpathdep.ClasspathDependencyUtil;
import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
import org.eclipse.jst.j2ee.common.EjbRef;
import org.eclipse.jst.j2ee.common.MessageDestinationRef;
import org.eclipse.jst.j2ee.common.ResourceEnvRef;
import org.eclipse.jst.j2ee.common.ResourceRef;
import org.eclipse.jst.j2ee.common.SecurityRoleRef;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.ValidateXmlCommand;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.ManifestException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveConstants;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.componentcore.EnterpriseArtifactEdit;
import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
import org.eclipse.jst.j2ee.componentcore.util.EARArtifactEdit;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
import org.eclipse.jst.j2ee.internal.classpathdep.DuplicateClasspathComponentURIValidatorEnablement;
import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.model.internal.validation.EARValidationMessageResourceHandler;
import org.eclipse.jst.j2ee.model.internal.validation.EarValidator;
import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
import org.eclipse.jst.j2ee.webservice.wsclient.ServiceRef;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.operations.IWorkbenchContext;
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: (9/10/2001 2:11:02 PM)
*
* @author: Administrator
*/
public class UIEarValidator extends EarValidator {
public static final String VALIDATOR_ID = "org.eclipse.jst.j2ee.internal.validation.UIEarValidator"; //$NON-NLS-1$
public static final String MANIFEST_GROUP_NAME = "WSAD.EAR.MANIFEST"; //$NON-NLS-1$
public static final String DOCTYPE_1_2 = "1.2"; //$NON-NLS-1$
public static final String DOCTYPE_1_3 = "1.3"; //$NON-NLS-1$
protected UIEarHelper earHelper;
// private EARArtifactEdit earEdit = null;
private IProject project = null;
/**
* UIEarValidator constructor comment.
*/
public UIEarValidator() {
super();
}
@Override
public Command createValidateXMLCommand() {
ValidateXmlCommand cmd = (ValidateXmlCommand) super.createValidateXMLCommand();
cmd.setValidateNested(false);
return cmd;
}
@Override
protected String getResourceName() {
return ((EarHelper) _helper).getProject().getName();
}
protected void duplicateProjectMapError(String earProjectName, String moduleUri, String projectName) {
String[] params = new String[3];
params[0] = projectName;
params[1] = earProjectName;
params[2] = moduleUri;
String msg = NLS.bind(EARValidationMessageResourceHandler.DUPLICATE_MODULE_FOR_PROJECT_NAME_ERROR_, params);
addLocalizedError(msg, appDD);
}
/**
*
*/
@Override
protected void cleanUpSubTaskMessages(EObject ref) {
String groupName = EJB_REF_GROUP_NAME;
if (ref instanceof EjbRef)
{
// ref = (EjbRef) ref;
}
else if (ref instanceof ResourceRef) {
// ref = (ResourceRef) ref;
groupName = RES_REF_GROUP_NAME;
} else if (ref instanceof ServiceRef) {
// ref = (ServiceRef) ref;
groupName = SERVICE_REF_GROUP_NAME;
} else if (ref instanceof ResourceEnvRef) {
// ref = (ResourceEnvRef) ref;
groupName = RES_ENV_REF_GROUP_NAME;
} else if (ref instanceof SecurityRoleRef) {
// ref = (SecurityRoleRef) ref;
groupName = SEC_ROLE_REF_GROUP_NAME;
} else if (ref instanceof MessageDestinationRef) {
// ref = (MessageDestinationRef) ref;
groupName = MESSAGE_REF_GROUP_NAME;
}
Resource res = ref.eResource();
if (res != null) {
IFile file = WorkbenchResourceHelper.getFile(res);
if (file != null)
_reporter.removeMessageSubset(this, file, groupName);
}
}
@Override
protected void cleanUpAllRefSubTaskMessages(Resource res) {
if (res != null) {
IFile file = WorkbenchResourceHelper.getFile(res);
if (file != null)
_reporter.removeMessageSubset(this, file, EJB_REF_GROUP_NAME);
_reporter.removeMessageSubset(this, file, RES_REF_GROUP_NAME);
_reporter.removeMessageSubset(this, file, SERVICE_REF_GROUP_NAME);
_reporter.removeMessageSubset(this, file, SEC_ROLE_REF_GROUP_NAME);
_reporter.removeMessageSubset(this, file, MESSAGE_REF_GROUP_NAME);
_reporter.removeMessageSubset(this, file, RES_ENV_REF_GROUP_NAME);
}
}
/**
* Insert the method's description here. Creation date: (9/10/2001 2:56:32 PM)
*
* @return org.eclipse.wst.validation.internal.core.core.ear.workbenchimpl.UIEarHelper
*/
public org.eclipse.jst.j2ee.internal.validation.UIEarHelper getEarHelper() {
return earHelper;
}
protected void invalidClassPathEntryWarning(String entry, Archive anArchive) {
String[] params = new String[2];
params[0] = anArchive.getURI();
params[1] = entry;
String msg = NLS.bind(EARValidationMessageResourceHandler.INVALID_MANIFEST_CLASSPATH_ONE_WARN_, params);
addLocalizedWarning(msg, getManifestFile(anArchive), MANIFEST_GROUP_NAME);
}
protected void invalidClassPathEntryWarning(String entry, String resolvedEntry, Archive anArchive) {
String[] params = new String[3];
params[0] = anArchive.getURI();
params[1] = entry;
params[2] = resolvedEntry;
String msg = NLS.bind(EARValidationMessageResourceHandler.INVALID_MANIFEST_CLASSPATH_TWO_WARN_, params);
addLocalizedWarning(msg, getManifestFile(anArchive), MANIFEST_GROUP_NAME);
}
protected void invalidDepedencyWarning(String entry, Archive anArchive, ModuleFile m) {
String[] params = new String[3];
params[0] = m.getURI();
params[1] = entry;
params[2] = anArchive.getURI();
String msg = NLS.bind(EARValidationMessageResourceHandler.INVALID_MANIFEST_CLASSPATH_DEPENDENCY_WARN_, params);
addLocalizedWarning(msg, getManifestFile(anArchive), MANIFEST_GROUP_NAME);
}
/**
* Insert the method's description here. Creation date: (9/10/2001 2:56:32 PM)
*
* @param newEarHelper
* org.eclipse.wst.validation.internal.core.core.ear.workbenchimpl.UIEarHelper
*/
public void setEarHelper(org.eclipse.jst.j2ee.internal.validation.UIEarHelper newEarHelper) {
earHelper = newEarHelper;
}
@Override
public IStatus validateInJob(IValidationContext inHelper, IReporter inReporter) throws org.eclipse.wst.validation.internal.core.ValidationException {
IStatus status = IValidatorJob.OK_STATUS;
IProject earProj = ((IWorkbenchContext) inHelper).getProject();
IVirtualComponent earModule = ComponentCore.createComponent(earProj);
if(JavaEEProjectUtilities.isEARProject(earProj)){
IVirtualFile ddFile = earModule.getRootFolder().getFile(J2EEConstants.APPLICATION_DD_URI);
if( ddFile.exists()) {
inReporter.removeAllMessages(this);
IVirtualReference[] earReferences;
boolean isMixedEAR = false;
boolean isJavaEEFiveProject = false;
boolean isLegacyEAR = J2EEProjectUtilities.isLegacyJ2EEProject(earProj);
//because of [224484] 5.0 EARs may get to this validator when they should not, need to protect against this
if(isLegacyEAR) {
earReferences = earModule.getReferences();
IVirtualComponent referencedComponenet;
IProject earRefedProj;
//[Bug 241525] need to use referenced components because referenced projects return the EAR for referenced binary archives
for(IVirtualReference earReference : earReferences) {
referencedComponenet = earReference.getReferencedComponent();
//[Bug 241525]if its a VirtualArchiveComponent then we need to use
// components to get version, otherwise use IProject
if(referencedComponenet instanceof VirtualArchiveComponent) {
isJavaEEFiveProject = JavaEEProjectUtilities.isJEEComponent(referencedComponenet);
} else {
earRefedProj = referencedComponenet.getProject();
isJavaEEFiveProject = J2EEProjectUtilities.isJEEProject(earRefedProj);
}
//if any referenced project is a JEE 5 project then ear is mixed
if(!isMixedEAR) {
isMixedEAR = isJavaEEFiveProject;
}
}
}
//should only continue validation if this is not an invalid mixed EAR
//isLegacyEAR check needed because of [224484] 5.0 EARs may get to this validator when they should not, need to protect against this
if(isLegacyEAR && !isMixedEAR) {
status = super.validateInJob(inHelper, inReporter);
validateModuleMaps(earModule);
validateManifests();
if(DuplicateClasspathComponentURIValidatorEnablement.shouldValidateDuplicateClasspathComponentURI()){
validateDuplicateClasspathComponentURIs(earModule);
}
// validateUtilJarMaps(earEdit,earModule);
// validateUriAlreadyExistsInEar(earEdit,earModule);
// validateDocType(earEdit,earModule);
}
}
}
return status;
}
@Override
public ISchedulingRule getSchedulingRule(IValidationContext helper) {
ISchedulingRule combinedRule = null;
IProject project = ((IWorkbenchContext) helper).getProject();
IVirtualComponent comp = ComponentCore.createComponent( project );
IFile appDeploymentDescriptor = null;
if( comp != null ){
IVirtualFile vf = comp.getRootFolder().getFile(new Path(J2EEConstants.APPLICATION_DD_URI));
if( vf!= null ){
appDeploymentDescriptor = vf.getUnderlyingFile();
combinedRule = MultiRule.combine(appDeploymentDescriptor, combinedRule);
}
IVirtualReference[] refs = comp.getReferences();
for( int i=0; i< refs.length; i++ ){
IVirtualComponent refComp = refs[i].getReferencedComponent();
if( refComp != null && !refComp.isBinary() ){
String type = J2EEProjectUtilities.getJ2EEComponentType( refComp );
IVirtualFile refDDFile = null;
if( type.equals(IModuleConstants.JST_WEB_MODULE)){
refDDFile = refComp.getRootFolder().getFile(new Path(J2EEConstants.WEBAPP_DD_URI));
}else if ( type.equals(IModuleConstants.JST_CONNECTOR_MODULE)){
refDDFile = refComp.getRootFolder().getFile(new Path(J2EEConstants.RAR_DD_URI));
}else if( type.equals(IModuleConstants.JST_EJB_MODULE)){
refDDFile = refComp.getRootFolder().getFile(new Path(J2EEConstants.EJBJAR_DD_URI));
}else if( type.equals(IModuleConstants.JST_APPCLIENT_MODULE)){
refDDFile = refComp.getRootFolder().getFile(new Path(J2EEConstants.APPLICATION_DD_URI));
}
if( refDDFile!= null ){
IFile dd = refDDFile.getUnderlyingFile();
combinedRule = MultiRule.combine(dd, combinedRule);
}
}
}
}
return combinedRule;
}
public void validateDuplicateClasspathComponentURIs(final IVirtualComponent earComponent) {
if (earFile == null) {
return;
}
final Set moduleURIs = new HashSet();
final List archives = earFile.getArchiveFiles();
for (int i = 0; i < archives.size(); i++) {
final Archive anArchive = (Archive) archives.get(i);
moduleURIs.add(anArchive.getURI());
}
final Map archiveToPath = new HashMap();
final IVirtualReference[] components = earComponent.getReferences();
for (int i = 0; i < components.length; i++) {
IVirtualReference reference = components[i];
IVirtualComponent referencedComponent = reference.getReferencedComponent();
// retrieve all Java classpath component dependencies
if (referencedComponent instanceof J2EEModuleVirtualComponent) {
final IVirtualReference[] cpRefs = ((J2EEModuleVirtualComponent) referencedComponent).getJavaClasspathReferences();
for (int j = 0; j < cpRefs.length; j++) {
final IVirtualReference ref = cpRefs[j];
// only ../ runtime paths contribute to the EAR
if (ref.getRuntimePath().equals(IClasspathDependencyConstants.RUNTIME_MAPPING_INTO_CONTAINER_PATH)) {
String archiveName = ref.getArchiveName();
String[] params = {referencedComponent.getProject().getName(), archiveName};
if (moduleURIs.contains(archiveName)) {
String msg = NLS.bind(EARValidationMessageResourceHandler.CLASSPATH_COMPONENT_URI_MATCHES_ARCHIVE_URI, params);
addLocalizedError(msg, project);
} else {
IPath cpEntryPath= ClasspathDependencyUtil.getClasspathVirtualReferenceLocation(ref);
if (cpEntryPath != null) {
IPath existingPath = (IPath) archiveToPath.get(archiveName);
if (existingPath != null && !existingPath.equals(cpEntryPath)) {
String msg = NLS.bind(EARValidationMessageResourceHandler.DUPLICATE_CLASSPATH_COMPONENT_URI, params);
addLocalizedError(msg, project);
} else {
archiveToPath.put(archiveName, cpEntryPath);
}
}
}
}
}
}
}
}
public void validateManifests() throws ValidationException {
if (earFile == null)
return;
List archives = earFile.getArchiveFiles();
for (int i = 0; i < archives.size(); i++) {
final Archive anArchive = (Archive) archives.get(i);
if(anArchive.getLoadStrategy().isReadOnly()){
continue;
}
IFile target = getManifestFile(anArchive);
if (target != null)
_reporter.removeMessageSubset(this, target, MANIFEST_GROUP_NAME);
validateManifestCase(anArchive);
validateManifestLines(anArchive);
validateManifestClasspath(anArchive);
}
}
public void validateManifestCase(Archive anArchive) {
String mfuri = J2EEConstants.MANIFEST_URI;
//Indicates a manifest file with the valid name exists,
//nothing left to do
if (anArchive.containsFile(mfuri))
return;
//Otherwise iterate the list of files
//Ensure the archive is read-only first
anArchive.getOptions().setIsReadOnly(true);
List files = anArchive.getFiles();
String uri = null;
for (int i = 0; i < files.size(); i++) {
File aFile = (File) files.get(i);
uri = aFile.getURI();
if (mfuri.equalsIgnoreCase(uri) && !mfuri.equals(uri)) {
String[] params = {uri, anArchive.getURI()};
String msg = NLS.bind(EARValidationMessageResourceHandler.INVALID_CASE_FOR_MANIFEST_ERROR_, params);
addLocalizedError(msg, null);
}
}
}
public void validateManifestClasspath(Archive anArchive) throws ValidationException {
ArchiveManifest manifest = null;
try{
manifest = anArchive.getManifest();
}catch( ManifestException mf){
mf.getMessage();
String[] args = new String[]{anArchive.getURI()};
String tmp = NLS.bind(EARValidationMessageResourceHandler.ERROR_READING_MANIFEST_ERROR_, args);
addLocalizedError(tmp, args);
}
if(manifest == null)
return;
String[] cp = manifest.getClassPathTokenized();
for (int i = 0; i < cp.length; i++) {
String uri = ArchiveUtil.deriveEARRelativeURI(cp[i], anArchive);
if (uri == null) {
invalidClassPathEntryWarning(cp[i], anArchive);
continue;
}
File f = null;
//IFile rf = null;
try {
// if (uri.endsWith(J2EEImportConstants.IMPORTED_JAR_SUFFIX)) {
//TODO Needs work here to initialize rf as rf is an IFile and there is no way to get an IFile currently
// IVirtualResource resource = component.getRootFolder().findMember(new Path(uri));
// if (resource == null || !resource.exists()) {
// invalidClassPathEntryWarning(cp[i], uri, anArchive);
// }
// }
// else
f = earFile.getFile(uri);
} catch (java.io.FileNotFoundException ex) {
invalidClassPathEntryWarning(cp[i], earFile.getURI(), anArchive);
continue;
}
if (f != null && f.isArchive() && anArchive.isModuleFile()) {
Archive archive = (Archive) f;
ModuleFile m = (ModuleFile) anArchive;
if (!ArchiveUtil.isValidDependency(archive, m))
invalidDepedencyWarning(cp[i], archive, m);
}
}
}
protected void validateManifestLines(Archive anArchive) throws ValidationException {
if (anArchive == null)
return;
InputStream is = null;
try {
is = anArchive.getInputStream(J2EEConstants.MANIFEST_URI);
ManifestLineValidator lineVal = new ManifestLineValidator(is);
lineVal.validate();
addErrorsIfNecessary(anArchive, lineVal);
} catch (FileNotFoundException ex) {
return;
} catch (IOException ex) {
handleManifestException(ex, anArchive);
} finally {
if (is != null)
try {
is.close();
} catch (IOException ex) {
handleManifestException(ex, anArchive);
}
}
}
protected void addErrorsIfNecessary(Archive anArchive, ManifestLineValidator mfVal) {
if (!mfVal.hasErrors())
return;
IFile target = getManifestFile(anArchive);
if (!mfVal.endsWithLineBreak())
addFileEndError(anArchive, mfVal, target);
int[] lines = mfVal.getLineNumbersExceedingLimit();
for (int i = 0; i < lines.length; i++) {
addLineLengthError(anArchive, target, lines[i]);
}
}
protected void addLineLengthError(Archive anArchive, IFile target, int lineNo) {
String[] args = new String[2];
args[0] = Integer.toString(lineNo);
args[1] = anArchive.getURI();
String tmp = NLS.bind(EARValidationMessageResourceHandler.MANIFEST_LINE_EXCEEDS_LENGTH_ERROR_, args);
if( lineNo >= 0 ){
addLocalizedError(tmp, target, MANIFEST_GROUP_NAME, lineNo );
}else{
addLocalizedError(tmp, target, MANIFEST_GROUP_NAME );
}
}
protected void addFileEndError(Archive anArchive, ManifestLineValidator mfVal, IFile target) {
String[] args = new String[]{anArchive.getURI()};
String tmp = NLS.bind(EARValidationMessageResourceHandler.MANIFEST_LINE_END_ERROR_, args);
if (target != null)
addLocalizedError(tmp, getManifestFile(anArchive), MANIFEST_GROUP_NAME, mfVal.getLineCount());
else
addLocalizedError(tmp, null, MANIFEST_GROUP_NAME);
}
protected void handleManifestException(IOException ex, Archive anArchive) throws ValidationException {
J2EEPlugin.logError(ex);
String tmp = NLS.bind(EARValidationMessageResourceHandler.ERROR_READING_MANIFEST_ERROR_, new String[]{anArchive.getURI()});
IMessage message = new LocalizedMessage(IMessage.HIGH_SEVERITY, tmp);
throw new ValidationException(message, ex);
}
/**
* Validates utiljar maps
*/
// public void validateUtilJarMaps(EARArtifactEdit edit, IVirtualComponent workbenchModule) {
// List utilJarModules = edit.getUtilityModuleReferences();
// if (!utilJarModules.isEmpty() || !utilJarModules.isEmpty()) {
// for (int i = 0; i < utilJarModules.size(); i++) {
// IVirtualComponent aUtilJar = ((IVirtualReference) utilJarModules.get(i)).getReferencedComponent();
// if (aUtilJar != null) {
// IProject project = J2EEPlugin.getWorkspace().getRoot().getProject(aUtilJar.getProject().getName());
// if (project != null) {
// if (!project.exists()) {
// String[] params = new String[]{project.getName(), aUtilJar.getRuntimePath().toString(), earHelper.getProject().getName()};
// addWarning(getBaseName(), PROJECT_DOES_NOT_EXIST_WARN_, params);
// } else {
// //validateModuleProjectForValidServerTarget(project);
// if (!project.isOpen()) {
// String[] params = new String[]{project.getName()};
// addWarning(getBaseName(), PROJECT_IS_CLOSED_WARN_, params);
// }
// }
// }
// }
// }
// }
// validateDuplicateUtilJars(edit,workbenchModule);
// validateUtilJarNameCollision(edit,workbenchModule);
// validateUtilJarContainsNoSpaces(edit,workbenchModule);
//
// }// validateUtilJarMaps
/**
* Checks if the util jar contains spaces or not.
*
* @param EAREditModel
* earEditModel - The ear editmodel.
*/
protected void validateUtilJarContainsNoSpaces(EARArtifactEdit edit, IVirtualComponent module) {
IVirtualReference[] utilJars = edit.getUtilityModuleReferences();
if (utilJars == null)
return;
for (int i = 0; i < utilJars.length; i++) {
IVirtualReference utilModule = utilJars[i];
if (utilModule != null) {
String uri = ModuleURIUtil.fullyQualifyURI(project).toString();
if (uri != null && uri.indexOf(" ") != -1) { //$NON-NLS-1$
String[] params = new String[1];
params[0] = uri;
String tmp = NLS.bind(EARValidationMessageResourceHandler.URI_CONTAINS_SPACES_ERROR_, params);
addLocalizedError(tmp, appDD);
}// if
}// if
}// for
}// validateUtilJarContainsNoSpaces
/**
* Validates if the a util jar has the same name as another module.
*
* @param EAREditModel
* earEditModel - The ear editmodel.
*/
// protected void validateUtilJarNameCollision(EARArtifactEdit edit, IVirtualComponent module) {
// List utilJars = edit.getUtilityModuleReferences();
// if (utilJars == null)
// return;
// for (int i = 0; i < utilJars.size(); i++) {
// UtilityJARMapping utilModule = (UtilityJARMapping) utilJars.get(i);
//
// if (utilModule != null) {
// if (edit.uriExists(utilModule.getUri())) {
//
// String[] params = new String[]{utilModule.getUri(), module.getName()};
// addError(getBaseName(), MESSAGE_UTIL_URI_NAME_COLLISION_ERROR_, params);
//
// } else if (utilModule.getProjectName() != null || utilModule.getProjectName().length() != 0) {
// if (edit.uriExists(utilModule.getUri())) {
// String[] params = new String[]{utilModule.getUri(), utilModule.getProjectName()};
// addError(getBaseName(), MESSAGE_UTIL_PROJECT_NAME_COLLISION_ERROR_, params);
// }
// }
// }
// }
// }
/**
* validate is there are duplicate util jars.
*
* @param EAREditModel
* earEditModel - The ear editmodel
*/
protected void validateDuplicateUtilJars(EARArtifactEdit edit, IVirtualComponent module) {
IVirtualReference[] utilJars = edit.getUtilityModuleReferences();
Set visitedUtilUri = new HashSet();
if (utilJars == null)
return;
for (int i = 0; i < utilJars.length; i++) {
IVirtualReference utilModule = utilJars[i];
if (utilModule != null) {
String uri = ModuleURIUtil.fullyQualifyURI(project).toString();
if (visitedUtilUri.contains(uri)) {
String compName = module.getName();
duplicateUtilError(module.getName(),uri, compName);
} else
visitedUtilUri.add(uri);
} // if
} // for
} // validateModuleMapsDuplicateUtil
/**
* Creates an error for duplicate util jars.
*
* @param String
* earProjectName - The ears project name.
* @param String
* moduleUri - The modules uri.
* @param String
* projectName - The project name.
*/
protected void duplicateUtilError(String earProjectName, String moduleUri, String projectName) {
String[] params = new String[3];
params[0] = projectName;
params[1] = earProjectName;
params[2] = moduleUri;
String tmp = NLS.bind(EARValidationMessageResourceHandler.DUPLICATE_UTILJAR_FOR_PROJECT_NAME_ERROR_, params);
addLocalizedError(tmp, null);
}// duplicateUtilError
public void validateModuleMaps(IVirtualComponent component) {
IVirtualFile ddFile = component.getRootFolder().getFile(J2EEConstants.APPLICATION_DD_URI);
if( ddFile.exists()){
EList modules = appDD.getModules();
if (!modules.isEmpty()) {
EARArtifactEdit edit = null;
try{
edit = EARArtifactEdit.getEARArtifactEditForRead( component.getProject() );
for (int i = 0; i < modules.size(); i++) {
Module module = (Module) modules.get(i);
String uri = module.getUri();
IVirtualComponent referencedComp = edit.getModuleByManifestURI( uri );
if( referencedComp == null ){
String[] params = new String[]{uri, component.getProject().getName()};
String tmp = NLS.bind(EARValidationMessageResourceHandler.MISSING_PROJECT_FORMODULE_WARN_, params);
addLocalizedWarning(tmp, null);
}
validateModuleURIExtension(module);
}
}finally{
if( edit != null )
edit.dispose();
}
}
}
}
protected void validateModuleURIExtension(Module module) {
String newUri = module.getUri();
if (newUri != null && newUri.length() > 0) {
if (module instanceof EjbModule && !newUri.endsWith(IJ2EEModuleConstants.JAR_EXT)) {
String[] params = new String[1];
params[0] = module.getUri();
IResource target = earHelper.getProject().getFile(ArchiveConstants.APPLICATION_DD_URI);
String tmp = NLS.bind(EARValidationMessageResourceHandler.INVALID_URI_FOR_MODULE_ERROR_, params);
addLocalizedWarning(tmp, target);
} else if (module instanceof WebModule && !newUri.endsWith(IJ2EEModuleConstants.WAR_EXT)) {
String[] params = new String[1];
params[0] = module.getUri();
IResource target = earHelper.getProject().getFile(ArchiveConstants.APPLICATION_DD_URI);
String tmp = NLS.bind(EARValidationMessageResourceHandler.INVALID_URI_FOR_MODULE_ERROR_, params);
addLocalizedWarning(tmp, target);
}
}
}
@Override
public void cleanup(IReporter reporter) {
if (earHelper != null)
earHelper.closeEARFile();
super.cleanup(reporter);
}
@Override
public void cleanup() {
}
protected IFile getManifestFile(Archive anArchive) {
URIConverter conv = anArchive.getResourceSet().getURIConverter();
if (conv instanceof WorkbenchURIConverter) {
WorkbenchURIConverter wbConv = (WorkbenchURIConverter) conv;
IContainer input = wbConv.getInputContainer();
if (input == null)
return null;
IProject p = input.getProject();
if (p == null || JemProjectUtilities.isBinaryProject(p))
return null;
IFile result = J2EEProjectUtilities.getManifestFile(p, false);
if (result != null && result.exists())
return result;
}
return null;
}
/**
* Checks if the nature is consistent with doc type.
*/
protected void validateDocType(EnterpriseArtifactEdit edit,IVirtualComponent module) {
if (edit == null)
return;
if (edit.getJ2EEVersion() >= J2EEVersionConstants.J2EE_1_3_ID && appDD.getVersionID() < J2EEVersionConstants.J2EE_1_3_ID) {
String[] params = new String[3];
params[0] = DOCTYPE_1_2;
params[1] = getResourceName();
params[2] = DOCTYPE_1_3;
String tmp = NLS.bind(EARValidationMessageResourceHandler.EAR_INVALID_DOC_TYPE_ERROR_, params);
addLocalizedError(tmp, appDD);
} else if (edit.getJ2EEVersion() < J2EEVersionConstants.J2EE_1_3_ID && appDD.getVersionID() >= J2EEVersionConstants.J2EE_1_3_ID) {
String[] params = new String[3];
params[0] = DOCTYPE_1_3;
params[1] = getResourceName();
params[2] = DOCTYPE_1_2;
String tmp = NLS.bind(EARValidationMessageResourceHandler.EAR_INVALID_DOC_TYPE_ERROR_, params);
addLocalizedError(tmp, appDD);
}
}
/**
* Validates that conflicting jar does not exist in the ear project.
*/
public void validateUriAlreadyExistsInEar(EARArtifactEdit edit,IVirtualComponent component) {
IVirtualReference[] modules = edit.getJ2EEModuleReferences();
if (modules == null)
return;
for (int i = 0; i < modules.length; i++) {
IVirtualReference reference = modules[i];
IVirtualComponent module = reference.getReferencedComponent();
if (module != null && module.getRootFolder().getRuntimePath() != null) {
IProject currentEARProject = earHelper.getProject();
try {
IFile exFile = currentEARProject.getFile(module.getRootFolder().getRuntimePath());
if (exFile != null && exFile.exists()) {
String[] params = new String[2];
params[0] = module.getRootFolder().getRuntimePath().toString();
params[1] = currentEARProject.getName();
String tmp = NLS.bind(EARValidationMessageResourceHandler.URI_ALREADY_EXISTS_IN_EAR_WARN_, params);
addLocalizedWarning(tmp, appDD);
}
} catch (IllegalArgumentException iae) {
J2EEPlugin.logError(iae);
}
}
}
}
@Override
protected void removeAllMessages(EObject eObject, String groupName) {
Resource res = eObject.eResource();
if(res != null) {
IFile file = WorkbenchResourceHelper.getFile(res);
if(file != null)
_reporter.removeMessageSubset(this,file,groupName);
}
}
}// UIEarValidator