/******************************************************************************* * Copyright (c) 2010 itemis AG (http://www.itemis.eu) and others. * 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 org.erlide.ui.containers; import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.IStorage; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.ui.XtextProjectHelper; import org.eclipse.xtext.ui.containers.AbstractStorage2UriMapperClient; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Singleton; /** * @author Sebastian Zarnekow - Initial contribution and API */ @Singleton public class WorkspaceProjectsStateHelper extends AbstractStorage2UriMapperClient { private final static Logger log = Logger .getLogger(WorkspaceProjectsStateHelper.class); @Inject private IWorkspace workspace; public String initHandle(final URI uri) { if (!uri.isPlatform()) { return null; } final IFile file = getWorkspaceRoot().getFile( new Path(uri.toPlatformString(true))); if (file == null) { return null; } final IProject project = file.getProject(); return project.getName(); } public Collection<URI> initContainedURIs(final String containerHandle) { try { final IPath projectPath = new Path(null, containerHandle) .makeAbsolute(); if (projectPath.segmentCount() != 1) { return Collections.emptySet(); } final IProject project = getWorkspaceRoot().getProject( containerHandle); if (project != null && isAccessibleXtextProject(project)) { final List<URI> uris = Lists.newArrayList(); try { project.accept(new IResourceVisitor() { @Override public boolean visit(final IResource resource) throws CoreException { if (resource.getName().equals("test")) { System.out.println("SKIP " + resource); return false; } if (resource instanceof IStorage) { final URI uri = getUri((IStorage) resource); if (uri != null) { uris.add(uri); } return false; } return true; } }); return uris; } catch (final CoreException e) { log.error(e.getMessage(), e); } } } catch (final IllegalArgumentException e) { if (log.isDebugEnabled()) { log.debug("Cannot init contained URIs for containerHandle '" + containerHandle + "'", e); } } return Collections.emptyList(); } public List<String> initVisibleHandles(final String handle) { try { final IProject project = getWorkspaceRoot().getProject(handle); if (isAccessibleXtextProject(project)) { try { final IProject[] referencedProjects = project .getReferencedProjects(); final List<String> result = Lists .newArrayListWithExpectedSize(referencedProjects.length); result.add(handle); for (final IProject referencedProject : referencedProjects) { if (isAccessibleXtextProject(referencedProject)) { result.add(referencedProject.getName()); } } return result; } catch (final CoreException e) { log.error(e.getMessage(), e); } } } catch (final IllegalArgumentException e) { if (log.isDebugEnabled()) { log.debug("Cannot init visible handles for containerHandle '" + handle + "'", e); } } return Collections.emptyList(); } protected boolean isAccessibleXtextProject(final IProject p) { return p != null && XtextProjectHelper.hasNature(p); } protected IWorkspaceRoot getWorkspaceRoot() { return workspace.getRoot(); } public void setWorkspace(final IWorkspace workspace) { this.workspace = workspace; } }