/******************************************************************************* * Copyright (c) 2012,2015 Spring IDE Developers * 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: * Spring IDE Developers - initial API and implementation *******************************************************************************/ package org.springframework.ide.eclipse.boot.validation; import java.util.Collections; import java.util.LinkedHashSet; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.corext.buildpath.ClasspathModifier; import org.springframework.ide.eclipse.boot.core.BootActivator; import org.springframework.ide.eclipse.core.SpringCore; import org.springframework.ide.eclipse.core.internal.model.SpringProject; import org.springframework.ide.eclipse.core.model.IModelElement; import org.springframework.ide.eclipse.core.model.IResourceModelElement; import org.springframework.ide.eclipse.core.model.ISpringProject; import org.springframework.ide.eclipse.core.model.validation.AbstractValidator; import org.springframework.ide.eclipse.core.model.validation.IValidationContext; import org.springframework.ide.eclipse.core.model.validation.IValidationElementLifecycleManager; public class SpringBootValidator extends AbstractValidator { public SpringBootValidator() { } public Set<IResource> deriveResources(Object object) { Set<IResource> resources = new LinkedHashSet<IResource>(); if (object instanceof ISpringProject) { resources.add(((ISpringProject) object).getProject()); } return resources; } public Set<IResource> getAffectedResources(IResource resource, int kind, int deltaKind) throws CoreException { if (resource instanceof IFile && resource.getName().endsWith(".java") && JavaCore.create((IFile) resource) != null) { return Collections.singleton(resource); } return Collections.emptySet(); } @Override protected IValidationContext createContext( IResourceModelElement rootElement, IResourceModelElement contextElement) { return new SpringBootValidationContext(rootElement, contextElement); } /** * Creates a {@link IValidationElementLifecycleManager} instance. * <p> * This implementation creates an instance of * {@link SpringValidationElementLifecycleManager}. */ @Override protected IValidationElementLifecycleManager createValidationElementLifecycleManager() { return new SpringValidationElementLifecycleManager(); } @Override protected boolean supports(IModelElement element) { if (element instanceof SpringCompilationUnit) { return true; } return false; } private static class SpringValidationElementLifecycleManager implements IValidationElementLifecycleManager { private IResourceModelElement rootElement; public void destroy() { // Nothing to do here. } public Set<IResourceModelElement> getContextElements() { if (getRootElement()!=null) { Set<IResourceModelElement> resources = new LinkedHashSet<IResourceModelElement>(); resources.add(getRootElement()); return resources; } return Collections.emptySet(); } public IResourceModelElement getRootElement() { return rootElement; } public void init(IResource resource) { ICompilationUnit cu = getCompilationUnit(resource); if (cu!=null) { IModelElement parent = new SpringProject(SpringCore.getModel(), resource.getProject()); String name = resource.getName(); rootElement = new SpringCompilationUnit(cu, parent, name); } } @SuppressWarnings("restriction") private ICompilationUnit getCompilationUnit(IResource resource) { try { if (resource.getType() == IResource.FILE) { IJavaProject project = getJavaProject(resource); if (project.exists()) { IPackageFragmentRoot pfr = ClasspathModifier.getFragmentRoot(resource, project, null); if (pfr!=null && !ClasspathModifier.isExcluded(resource, project)) { return (ICompilationUnit)JavaCore.create((IFile) resource); } } } } catch (Exception e) { BootActivator.log(e); } return null; } private IJavaProject getJavaProject(IResource resource) { IProject project = resource.getProject(); return JavaCore.create(project); } } }