/******************************************************************************* * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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 *******************************************************************************/ package gov.redhawk.codegen.validation; import gov.redhawk.ide.codegen.CodegenPackage; import gov.redhawk.ide.codegen.CodegenUtil; import gov.redhawk.ide.codegen.ImplementationSettings; import gov.redhawk.ide.codegen.WaveDevSettings; import java.util.List; import java.util.regex.Pattern; import mil.jpeojtrs.sca.spd.Implementation; import mil.jpeojtrs.sca.spd.SoftPkg; import mil.jpeojtrs.sca.validator.EnhancedConstraintStatus; import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.core.databinding.validation.ValidationStatus; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.validation.AbstractModelConstraint; import org.eclipse.emf.validation.IValidationContext; import org.eclipse.emf.validation.model.ConstraintStatus; /** * @since 1.2 */ public class OutputDirectoryValidator extends AbstractModelConstraint implements IValidator { public static final String ID = "gov.redhawk.validation.constraint.codegen.OutputDirectory"; public static final String VALID_OUTPUTDIR_REGEX = "((/)|[A-Za-z0-9_])[A-Za-z0-9_/]+"; private static final String NO_DIR = "An output directory must be provided"; private static final String TRAILING_SLASH = "Output directory must not end with a /"; private static final String BAD_DIR = "Invalid output directory"; private SoftPkg softPkg; public OutputDirectoryValidator() { this.softPkg = null; } /** * @since 2.0 */ public OutputDirectoryValidator(SoftPkg softPkg) { this.softPkg = softPkg; } /** * {@inheritDoc} * * Validates the following conditions: * 1. Output Directory, when trimmed of leading/trailing whitespace, cannot be "". * 2. Cannot contain leading or trailing whitespace * 3. May start with '/' or [A-Za-z] * 4. Cannot contain '.' or '..' * 5. Can only contain [A-Za-z0-9_/] */ @Override public IStatus validate(final Object value) { final String s = (String) value; String result = validateDir(s); if (result != null) { return ValidationStatus.error(result); } result = validateUnique(s); if (result != null) { return ValidationStatus.error(result); } return ValidationStatus.ok(); } /** * {@inheritDoc} * * Validates the following conditions: * 1. Output Directory, when trimmed of leading/trailing whitespace, cannot be "". * 2. Cannot contain leading or trailing whitespace * 3. May start with '/' or [A-Za-z] * 4. Cannot contain '.' or '..' * 5. Can only contain [A-Za-z0-9_/] */ @Override public IStatus validate(final IValidationContext ctx) { final EObject target = ctx.getTarget(); if (target instanceof ImplementationSettings) { final ImplementationSettings implSettings = (ImplementationSettings) target; final String dir = implSettings.getOutputDir(); String result = null; // If it is a manual template don't worry about output directory if (implSettings.getTemplate() != null && !(implSettings.getTemplate().toUpperCase().contains("MANUAL"))) { result = validateDir(dir); } if (result != null) { return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(result), CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__OUTPUT_DIR); } result = validateUnique(dir); if (result != null) { return new EnhancedConstraintStatus((ConstraintStatus) ctx.createFailureStatus(result), CodegenPackage.Literals.IMPLEMENTATION_SETTINGS__OUTPUT_DIR); } } return ctx.createSuccessStatus(); } /** * * @param dirname * @return error reason, null on success */ protected String validateDir(final String dir) { if ((dir == null) || (dir.trim().length() == 0)) { return OutputDirectoryValidator.NO_DIR; } else if ((dir.length() > 1) && dir.endsWith("/")) { return OutputDirectoryValidator.TRAILING_SLASH; } else if (!Pattern.matches(OutputDirectoryValidator.VALID_OUTPUTDIR_REGEX, dir)) { return OutputDirectoryValidator.BAD_DIR; } return null; } /** * @since 2.0 */ protected String validateUnique(final String dir) { if (this.softPkg != null) { final List<Implementation> implList = this.softPkg.getImplementation(); final WaveDevSettings waveDevSettings = CodegenUtil.loadWaveDevSettings(this.softPkg); if (waveDevSettings != null) { for (final Implementation anImpl : implList) { final ImplementationSettings settings = waveDevSettings.getImplSettings().get(anImpl.getId()); if (settings != null) { final String theDir = settings.getOutputDir(); if (theDir != null && theDir.equals(dir)) { return "Output directories should be unique. The directory " + dir + " is already in use."; } } } } } return null; } }