/** * Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below. * 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: * Cloudsmith * */ package org.cloudsmith.geppetto.pp.dsl.ui.container; import java.util.Collection; import java.util.List; import org.cloudsmith.geppetto.forge.Forge; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.ui.XtextProjectHelper; import org.eclipse.xtext.ui.containers.AbstractAllContainersState; import org.eclipse.xtext.ui.containers.WorkspaceProjectsStateHelper; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.google.inject.Singleton; /** * A PP Workspace Projects State manager - makes use of the default implementation for the Workspace (Project * dependencies), as well as Puppet Manifests (Modulefile/metadata.json) parsing. * */ @Singleton public class PPWorkspaceProjectsState extends AbstractAllContainersState { @Inject private WorkspaceProjectsStateHelper helper; @Inject private PPWorkspaceProjectsStateHelper manifestHelper; @Inject private Forge forge; protected boolean doesThisDeltaRequireClear(IResourceDelta delta) { return delta.getResource() instanceof IFile && forge.isMetadataFile(delta.getProjectRelativePath().toPortableString()); } @Override protected Collection<URI> doInitContainedURIs(String containerHandle) { // since the default holds all projects return helper.initContainedURIs(containerHandle); } @Override protected String doInitHandle(URI uri) { // since the default holds all projects return helper.initHandle(uri); } @Override protected List<String> doInitVisibleHandles(String handle) { // the manifest helper adds visibility return union(helper.initVisibleHandles(handle), manifestHelper.initVisibleHandles(handle)); } public WorkspaceProjectsStateHelper getHelper() { return helper; } public PPWorkspaceProjectsStateHelper getManifestHelper() { return manifestHelper; } protected boolean isAccessibleXtextProject(IProject p) { return p != null && XtextProjectHelper.hasNature(p); } @Override protected boolean isAffectingContainerState(IResourceDelta delta) { return super.isAffectingContainerState(delta) || doesThisDeltaRequireClear(delta); } public void setHelper(WorkspaceProjectsStateHelper helper) { this.helper = helper; } public void setManifestHelper(PPWorkspaceProjectsStateHelper manifestHelper) { this.manifestHelper = manifestHelper; } /** * Produce the union of two lists * * @param a * @param b * @return a U b */ private List<String> union(List<String> a, List<String> b) { List<String> theSmallerList = (a.size() < b.size()) ? a : b; List<String> theLargerList = (a.size() < b.size()) ? b : a; // can be optimized for empty cases and when lists are very small if(theSmallerList.isEmpty()) return theLargerList; if(theLargerList.isEmpty()) return theSmallerList; // TODO: small case - probably faster to just check if the larger list contains things from // the smaller list // Use hashsets as this is faster when there are more than a few entries // API doc state that it is faster to give the smaller list as the first argument to union return Lists.newArrayList(Sets.union(Sets.newHashSet(theSmallerList), Sets.newHashSet(theLargerList))); } }