package org.zend.php.zendserver.deployment.core; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.zend.php.zendserver.deployment.core.descriptor.DescriptorContainerManager; import org.zend.php.zendserver.deployment.core.internal.validation.DescriptorValidator; import org.zend.php.zendserver.deployment.core.sdk.EclipseVariableResolver; import org.zend.sdklib.mapping.MappingModelFactory; import org.zend.sdklib.mapping.validator.IMappingValidator; import org.zend.sdklib.mapping.validator.MappingParseException; import org.zend.sdklib.mapping.validator.MappingParseStatus; import org.zend.sdklib.mapping.validator.MappingValidator; public class IncrementalDeploymentBuilder extends IncrementalProjectBuilder { public static final String PROBLEM_MARKER = "org.zend.php.zendserver.deployment.core.problemmarker"; //$NON-NLS-1$ public static final String ID = DeploymentCore.PLUGIN_ID + ".DeploymentBuilder"; //$NON-NLS-1$ public static final String FEATURE_ID = "feature.id"; //$NON-NLS-1$ public static final String OBJECT_ID = "object.id"; //$NON-NLS-1$ public static final String OBJECT_NUMBER = "object.no"; //$NON-NLS-1$ private DescriptorValidator descrValidator = new DescriptorValidator(); @Override protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { IResourceDelta delta = getDelta(getProject()); if (delta == null) { return null; } // find all projects touched in change final Set<IProject> projects = new HashSet<IProject>(); delta.accept(new IResourceDeltaVisitor() { public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); IProject project = resource.getProject(); projects.add(project); return true; } }); // for each touched project validate descriptor for (IProject project : projects) { IFile descrFile = project.getFile(DescriptorContainerManager.DESCRIPTOR_PATH); validateDescriptor(descrFile); IFile mappingFile = project.getFile(MappingModelFactory.DEPLOYMENT_PROPERTIES); validateMapping(mappingFile); } return null; } private void validateDescriptor(IFile file) { descrValidator.validate(file); } protected void validateMapping(IFile file) { IMappingValidator validator = new MappingValidator(file.getParent().getLocation().toFile()); validator.setVariableResolver(new EclipseVariableResolver()); try { try { if (file.exists()) { file.refreshLocal(IResource.DEPTH_ONE, new NullProgressMonitor()); validator.parse(file.getContents()); file.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO); } } catch (MappingParseException e) { handleMappingValidationErrors(file, e.getErrors()); } } catch (CoreException e) { DeploymentCore.log(e); } } protected void handleMappingValidationErrors(IFile file, List<MappingParseStatus> errors) throws CoreException { file.deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO); for (MappingParseStatus status : errors) { IMarker marker = file.createMarker(PROBLEM_MARKER); marker.setAttribute(IMarker.LINE_NUMBER, status.getLine()); marker.setAttribute(IMarker.CHAR_START, status.getStart()); marker.setAttribute(IMarker.CHAR_END, status.getEnd()); marker.setAttribute(IMarker.MESSAGE, status.getMessage()); marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_NORMAL); marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); } } }