/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.seam.internal.core.project.facet; import java.io.File; import java.util.Map; import java.util.Properties; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.datatools.connectivity.IConnectionProfile; import org.eclipse.datatools.connectivity.ProfileManager; import org.eclipse.datatools.connectivity.drivers.DriverInstance; import org.eclipse.datatools.connectivity.drivers.DriverManager; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.internal.corext.util.Messages; import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages; import org.eclipse.osgi.util.NLS; import org.jboss.tools.common.ui.IValidator; import org.jboss.tools.common.ui.ValidatorFactory; import org.jboss.tools.seam.core.ISeamComponent; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.SeamCoreMessages; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.project.facet.SeamRuntime; import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager; /** * * @author eskimo * */ @SuppressWarnings("restriction") public class SeamValidatorFactory extends ValidatorFactory { /** * */ public static final IValidator JBOSS_SEAM_HOME_FOLDER_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { Map<String, IStatus> errors = FILE_SYSTEM_FOLDER_EXISTS.validate( value, context); if (!errors.isEmpty()) { errors = createErrorMap(); errors.put(ISeamFacetDataModelProperties.JBOSS_SEAM_HOME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_SEAM_HOME_FOLDER_DOES_NOT_EXISTS)); return errors; } String version = (String) context; if (version.startsWith("2.")) { //$NON-NLS-1$ File seamJarFile = new File(value.toString(), "lib/jboss-seam.jar"); //$NON-NLS-1$ if (!seamJarFile.isFile()) { errors = createErrorMap(); errors.put(ISeamFacetDataModelProperties.JBOSS_SEAM_HOME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_HOME_FOLDER_POINTS_TO_LOCATION_THAT_DOES_NOT_LOOK_LIKE_SEAM_HOME_FOLDER)); } } else { File seamJarFile = new File(value.toString(), "jboss-seam.jar"); //$NON-NLS-1$ if (!seamJarFile.isFile()) { errors = createErrorMap(); errors.put(ISeamFacetDataModelProperties.JBOSS_SEAM_HOME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_HOME_FOLDER_POINTS_TO_LOCATION_THAT_DOES_NOT_LOOK_LIKE_SEAM_HOME_FOLDER)); } } return errors; } }; /** * */ public static final IValidator JBOSS_AS_HOME_FOLDER_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { Map<String, IStatus> errors = FILE_SYSTEM_FOLDER_EXISTS.validate( value, context); if (!errors.isEmpty()) { errors = createErrorMap(); errors.put(ISeamFacetDataModelProperties.JBOSS_AS_HOME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_JBOSS_AS_HOME_FOLDER_DOES_NOT_EXIST)); return errors; } if (!new File(value.toString(), "bin/twiddle.jar").isFile()) { //$NON-NLS-1$ errors.put(ISeamFacetDataModelProperties.JBOSS_AS_HOME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_JBOSS_AS_HOME_FOLDER_POINT_TO_LOCATION_THAT_DOES_NOT_LOOK_LIKE_JBOSS_AS_HOME_FOLDER)); } return errors; } }; /** * */ public static final IValidator CLASS_QNAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { String classDecl = "class " + value.toString() + " {}"; //$NON-NLS-1$ //$NON-NLS-2$ ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource(classDecl.toCharArray()); parser.setProject((IJavaProject) context); CompilationUnit compilationUnit = (CompilationUnit)parser.createAST(null); IProblem[] problems = compilationUnit.getProblems(); if (problems.length > 0) { return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, Messages.format(SeamCoreMessages.VALIDATOR_FACTORY_COMPONENT_NAME_IS_NOT_VALID, problems[0].getMessage()))); } return SeamValidatorFactory.NO_ERRORS; } }; public static final IValidator PACKAGE_NAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { IStatus status = JavaConventions.validatePackageName(value.toString(), DEFAULT_SOURCE_LEVEL, DEFAULT_COMPLIANCE_LEVEL); if (status.getSeverity() == IStatus.ERROR) { return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, Messages.format(NewWizardMessages.NewTypeWizardPage_error_InvalidPackageName, status.getMessage()))); } return SeamValidatorFactory.NO_ERRORS; } }; /** * */ public static final IValidator FILESYSTEM_FILE_EXISTS_VALIDATOR = new IValidator() { public java.util.Map<String, IStatus> validate(Object value, Object context) { return SeamValidatorFactory.NO_ERRORS; }; }; /** * * @author eskimo * */ public static final IValidator SEAM_COMPONENT_NAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { String name = value.toString(); if(context != null && context instanceof ISeamProject){ ISeamProject seamProject = (ISeamProject)context; ISeamComponent component = seamProject.getComponent(name); if(component != null) return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_COMPONENT_ALREADY_EXISTS, name))); } String[] segs = name.split("\\.");//$NON-NLS-1$ for(String segm : segs){ if(!segm.trim().equals(segm)) return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_NAME_IS_NOT_VALID)); IStatus status = JavaConventions.validateClassFileName(segm + ".class", DEFAULT_SOURCE_LEVEL, DEFAULT_COMPLIANCE_LEVEL); //$NON-NLS-1$ if (!status.isOK()) return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_NAME_IS_NOT_VALID)); } return NO_ERRORS; } }; /** * * @author eskimo * */ public static final IValidator SEAM_JAVA_INTEFACE_NAME_CONVENTION_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { if (!(context instanceof Object[])) { throw new IllegalArgumentException( "Context parameter should be instance of Object[]"); //$NON-NLS-1$ } Object[] contextArray = ((Object[]) context); IProject project = (IProject) contextArray[1]; IJavaProject jProject = JavaCore.create(project); IStatus status = JavaConventions.validateJavaTypeName(value.toString(), getCompilerSourceLevel(jProject), getCompilerComplianceLevel(jProject)); if (((IStatus.ERROR | IStatus.WARNING) & status.getSeverity()) != 0) { return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_LOCAL_INTERFACE_NAME_IS_NOT_VALID + status.getMessage())); } return NO_ERRORS; } }; public static final IValidator SEAM_METHOD_NAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { if (!(context instanceof Object[])) { throw new IllegalArgumentException( "Context parameter should be instance of Object[]"); //$NON-NLS-1$ } Object[] contextArray = ((Object[]) context); String targetName = contextArray[0].toString(); IProject project = (IProject) contextArray[1]; IJavaProject jProject = JavaCore.create(project); IStatus status = JavaConventions.validateMethodName(value.toString(), getCompilerSourceLevel(jProject), getCompilerComplianceLevel(jProject)); if (status.getSeverity() == IStatus.ERROR){ return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_NAME_IS_NOT_VALID, targetName))); } return NO_ERRORS; } }; public static final IValidator FILE_NAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { if (!(context instanceof Object[])) { throw new IllegalArgumentException( "Context parameter should be instance of Object[]"); //$NON-NLS-1$ } Object[] contextArray = ((Object[]) context); String targetName = contextArray[0].toString(); IProject project = (IProject) contextArray[1]; if ("".equals(value) //$NON-NLS-1$ || !project.getLocation().isValidSegment(value.toString())) return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_NAME_IS_NOT_VALID, targetName))); return NO_ERRORS; } }; public static final IValidator SEAM_PROJECT_NAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { if (value == null || "".equals(value)) { //$NON-NLS-1$ return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_PRJ_NOT_SELECTED)); } IResource project = ResourcesPlugin.getWorkspace().getRoot() .findMember(value.toString()); if (project == null || !(project instanceof IProject) || !project.exists()) { return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_PROJECT_DOES_NOT_EXIST, value))); } else { IProject selection = (IProject) project; try { if (!selection.hasNature(ISeamProject.NATURE_ID) || SeamCorePlugin.getSeamPreferences(selection) == null // || // selection.getAdapter(IFacetedProject.class)==null // || !((IFacetedProject)selection.getAdapter( // IFacetedProject // .class)).hasProjectFacet(ProjectFacetsManager // .getProjectFacet("jst.web")) || "" .equals(SeamCorePlugin.getSeamPreferences(selection).get(ISeamFacetDataModelProperties.JBOSS_AS_DEPLOY_AS, ""))) { //$NON-NLS-1$ return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_SELECTED_PROJECT_IS_NOT_A_SEAM_WEB_PROJECT, project.getName()))); } else { // TODO validate project(s) structure } } catch (CoreException e) { // it might happen only if project is closed and project // name typed by hand return createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SELECTED_PRJ_IS_CLOSED, project.getName()))); } } return NO_ERRORS; } }; private static class ConnectionProfileValidator implements IValidator { private boolean allowEmptyConnection; public ConnectionProfileValidator(boolean allowEmptyConnection) { this.allowEmptyConnection = allowEmptyConnection; } public Map<String, IStatus> validate(Object value, Object context) { if (!allowEmptyConnection && (value == null || "".equals(value.toString().trim()))) { //$NON-NLS-1$ return createErrormessage( ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_CONNECTION_PROFILE_IS_NOT_SELECTED)); } else { IConnectionProfile connProfile = ProfileManager.getInstance() .getProfileByName(value.toString()); Properties props = connProfile.getBaseProperties(); Object driverClass = props .get("org.eclipse.datatools.connectivity.db.driverClass"); //$NON-NLS-1$ if (driverClass == null || "".equals(driverClass)) { //$NON-NLS-1$ return createErrormessage( ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_DRIVER_CLASS_PROPERTY_IS_EMPTY_FOR_SELECTED_CONNECTION_PROFILE, value))); } if(props.get("org.eclipse.datatools.connectivity.driverDefinitionID")!=null) { DriverInstance i = DriverManager.getInstance().getDriverInstanceByID(props.get( "org.eclipse.datatools.connectivity.driverDefinitionID").toString()); //$NON-NLS-1$ if(i == null) { return createErrormessage( ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, new Status(IStatus.WARNING, SeamCorePlugin.PLUGIN_ID, NLS.bind(SeamCoreMessages.VALIDATOR_FACTORY_DRIVER_CLASS_PROPERTY_IS_NOT_FOUND_FOR_SELECTED_CONNECTION_PROFILE, value))); } } } return NO_ERRORS; } } public static final IValidator CONNECTION_PROFILE_VALIDATOR = new ConnectionProfileValidator(false); public static final IValidator CONNECTION_DRIVER_VALIDATOR = new ConnectionProfileValidator(true); public static final IValidator SEAM_RUNTIME_NAME_VALIDATOR = new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { Map<String, IStatus> errors = NO_ERRORS; if (value == null || "".equals(value.toString().trim())) { //$NON-NLS-1$ errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RUNTIME_IS_NOT_SELECTED)); } else { SeamRuntime rt = SeamRuntimeManager.getInstance() .findRuntimeByName(value.toString()); if (rt == null) { errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_CANNOT_FIND_SEAM_RUNTIME, value))); } else if (!new File(rt.getHomeDir()).exists()) { errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_HOME_DIR_IS_MISSING, value))); } else if (!new File(rt.getSeamGenDir()).exists()) { errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_TEMPLATES_DIR_IS_MISSING, value))); } else if (!new File(rt.getSrcTemplatesDir()).exists()) { errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_SRC_DIR_IS_MISSING, value))); } else if (!new File(rt.getViewTemplatesDir()).exists()) { errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_VIEW_DIR_IS_MISSING, value))); } else if (!new File(rt.getResourceTemplatesDir()).exists()) { errors = createErrormessage( ISeamFacetDataModelProperties.SEAM_RUNTIME_NAME, new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_RESOURCES_DIR_IS_MISSING, value))); } } return errors; } }; public static final IValidator SEAM_RUNTIME_VALIDATOR = new IValidator() { public java.util.Map<String, IStatus> validate(Object value, Object context) { Map<String, IStatus> errors = NO_ERRORS; if (value == null || "".equals(value)) { //$NON-NLS-1$ errors = createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_NOT_CONFIGURED)); } else { SeamRuntime rt = SeamRuntimeManager.getInstance() .findRuntimeByName(value.toString()); if (rt == null) { errors = createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_CANNOT_BE_FOUND, value))); } else if (!new File(rt.getHomeDir()).exists()) { errors = createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_HOME_DIR_DOES_NOT_EXIST, value))); } else if (!new File(rt.getSeamGenDir()).exists()) { errors = createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_TEMPLATES_DIR_DOES_NOT_EXIST, value))); } else if (!new File(rt.getSrcTemplatesDir()).exists()) { errors = createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_SOURCE_TEMPLATES_DIR_DOES_NOT_EXIST, value))); } else if (!new File(rt.getViewTemplatesDir()).exists()) { errors = createErrormessage(new Status(IStatus.ERROR, SeamCorePlugin.PLUGIN_ID, NLS .bind( SeamCoreMessages.VALIDATOR_FACTORY_SEAM_RT_VIE_TEMPLATE_DIR_DOES_NOT_EXIST, value))); // } else if(!new // File(rt.getResourceTemplatesDir()).exists()) { // errors = createErrormessage(NLS.bind( // "Seam Runtime '{0)' resource templates directory doesn't exist for selected Seam Web Project" // ,value)); } } return errors; } }; }