/******************************************************************************* * Copyright (c) 2010-2014 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.cdi.internal.core.validation; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.core.resources.IProject; import org.jboss.tools.cdi.core.CDICoreNature; import org.jboss.tools.cdi.core.CDICorePlugin; import org.jboss.tools.common.validation.IProjectValidationContext; import org.jboss.tools.common.validation.IValidatingProjectSet; import org.jboss.tools.common.validation.IValidatingProjectTree; import org.jboss.tools.common.validation.internal.ValidatingProjectSet; import org.jboss.tools.jst.web.kb.IKbProject; import org.jboss.tools.jst.web.kb.KbProjectFactory; import org.jboss.tools.jst.web.kb.internal.KbProject; /** * Represents a tree of dependent CDI projects. * * @author Alexey Kazakov */ public class CDIProjectTree implements IValidatingProjectTree { private Map<IProject, IValidatingProjectSet> brunches = new HashMap<IProject, IValidatingProjectSet>(); private Set<IProject> validatingProjects = new HashSet<IProject>(); private Set<IProject> allProjects = new HashSet<IProject>(); /** * @param project */ public CDIProjectTree(IProject project) { addProject(project); } /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.validation.IValidatingProjectTree#addProject(org.eclipse.core.resources.IProject) */ public void addProject(IProject project) { if(project!=null) { allProjects.add(project); if(!validatingProjects.contains(project)) { validatingProjects.add(project); CDICoreNature currentNature = CDICorePlugin.getCDI(project, true); //because we do not store it if(currentNature!=null) { Set<CDICoreNature> roots = getRootProjects(currentNature); for (CDICoreNature root : roots) { IProject rootProject = root.getProject(); if(rootProject!=null && rootProject.isAccessible()) { Set<IProject> requiredProjects = collectRequiredProjects(root); IKbProject kbProject = KbProjectFactory.getKbProject(rootProject, false); IProjectValidationContext rootContext; if(kbProject!=null) { rootContext = kbProject.getValidationContext(); } else { KbProject.checkKBBuilderInstalled(rootProject); rootContext = root.getValidationContext(); } requiredProjects.add(root.getProject()); for (IProject p: requiredProjects) { CDICorePlugin.getCDI(p, true); //all should be active. } IValidatingProjectSet brunch = new ValidatingProjectSet(root.getProject(), requiredProjects, rootContext){ @Override public boolean isFullValidationRequired() { for (IProject p: getAllProjects()) { CDICoreNature n = CDICorePlugin.getCDI(p, false); if(n != null && n.getValidationContext().isFullValidationRequired()) { return true; } } return false; } @Override public void setFullValidationRequired(boolean b) { for (IProject p: getAllProjects()) { CDICoreNature n = CDICorePlugin.getCDI(p, false); if(n != null) { n.getValidationContext().setFullValidationRequired(b); } } } }; brunches.put(rootProject, brunch); allProjects.addAll(brunch.getAllProjects()); } } } } } } /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.validation.IValidatingProjectTree#getBrunches() */ @Override public Map<IProject, IValidatingProjectSet> getBrunches() { return brunches; } /** * @return the validatingProjects */ public Set<IProject> getValidatingProjects() { return validatingProjects; } /* * (non-Javadoc) * @see org.jboss.tools.jst.web.kb.validation.IValidatingProjectTree#getAllProjects() */ @Override public Set<IProject> getAllProjects() { return allProjects; } private Set<CDICoreNature> getRootProjects(CDICoreNature project) { Set<CDICoreNature> result = new HashSet<CDICoreNature>(); CDICoreNature[] dependentProjects = project.getAllDependentProjects(true); if(dependentProjects.length == 0) { result.add(project); } else { for (CDICoreNature nature : dependentProjects) { if(!nature.getProject().isAccessible()) continue; if(nature.getDependentProjects().isEmpty()) { result.add(nature); } } } return result; } private Set<IProject> collectRequiredProjects(CDICoreNature project) { return collectRequiredProjects(new HashSet<IProject>(), project); } private Set<IProject> collectRequiredProjects(Set<IProject> dependsOn, CDICoreNature project) { Set<CDICoreNature> cdiProjects = project.getCDIProjects(); for (CDICoreNature cdiCoreNature : cdiProjects) { IProject includedProject = cdiCoreNature.getProject(); if(!dependsOn.contains(includedProject)) { dependsOn.add(includedProject); collectRequiredProjects(dependsOn, cdiCoreNature); } } return dependsOn; } }