/**
* Copyright (C) 2005 - 2014 Eric Van Dewoestine
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.eclim.plugin.core.command.project;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import org.eclim.annotation.Command;
import org.eclim.command.CommandLine;
import org.eclim.plugin.core.command.AbstractCommand;
import org.eclim.plugin.core.project.ProjectNatureFactory;
import org.eclim.plugin.core.util.ProjectUtils;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.internal.resources.LinkDescription;
import org.eclipse.core.internal.resources.Project;
import org.eclipse.core.internal.resources.ProjectDescription;
import org.eclipse.core.internal.resources.ProjectInfo;
import org.eclipse.core.internal.resources.ResourceInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
/**
* Command which obtains a list of projects and project paths for use by clients
* to determine which project a file belongs to.
*
* @author Eric Van Dewoestine
*/
@Command(name = "projects")
public class ProjectsCommand
extends AbstractCommand
{
@Override
public Object execute(CommandLine commandLine)
throws Exception
{
ArrayList<HashMap<String,Object>> results =
new ArrayList<HashMap<String,Object>>();
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProject[] projects = workspace.getRoot().getProjects();
for (IProject project : projects){
HashMap<String,Object> info = new HashMap<String,Object>();
info.put("name", project.getName());
if (project.isOpen()){
String[] aliases = ProjectNatureFactory.getProjectNatureAliases(project);
if (aliases.length == 0){
aliases = new String[]{"none"};
}
info.put("natures", aliases);
}else{
info.put("natures", new String[0]);
}
String projectPath = ProjectUtils.getPath(project);
String canonicalPath = new File(projectPath)
.getCanonicalPath().replace('\\', '/');
if (!canonicalPath.equals(projectPath)){
info.put("path", canonicalPath);
info.put("link", projectPath);
}else{
info.put("path", projectPath);
}
if (project.isOpen()){
HashMap<String,String> links = new HashMap<String,String>();
if (new File(projectPath).exists()){
// don't open/close projects due to the impact on performance
/*boolean close = false;
if (!project.isOpen()){
project.open(IResource.NONE, null);
close = true;
}*/
ResourceInfo pinfo = ((Project)project).getResourceInfo(false, false);
ProjectDescription desc = ((ProjectInfo)pinfo).getDescription();
if (desc != null){
HashMap<IPath, LinkDescription> linfo =
(HashMap<IPath, LinkDescription>)desc.getLinks();
if (linfo != null){
for (IPath path : linfo.keySet()){
LinkDescription link = linfo.get(path);
IResource member = project.findMember(link.getProjectRelativePath());
IFileStore store = EFS.getStore(member.getLocationURI());
String resolvedPath = store != null ?
store.toString() : link.getLocationURI().getPath();
links.put(path.toString(), resolvedPath.replace("\\", "/"));
}
}
}
/*if (close){
project.close(null);
}*/
}
info.put("links", links);
}
results.add(info);
}
return results;
}
}