/**
* Copyright (C) 2005 - 2015 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.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import org.eclim.Services;
import org.eclim.annotation.Command;
import org.eclim.command.CommandLine;
import org.eclim.command.Options;
import org.eclim.plugin.core.command.AbstractCommand;
import org.eclim.plugin.core.util.ProjectUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.internal.wizards.datatransfer.WizardProjectsImportPage;
/**
* Command to import a project from a folder.
*
* @author Eric Van Dewoestine
*/
@Command(name = "project_import", options = "REQUIRED f folder ARG")
public class ProjectImportCommand
extends AbstractCommand
{
/**
* {@inheritDoc}
*/
public Object execute(CommandLine commandLine)
throws Exception
{
String folder = commandLine.getValue(Options.FOLDER_OPTION);
if(folder.endsWith("/") || folder.endsWith("\\")){
folder = folder.substring(0, folder.length() - 1);
}
if (!new File(folder).exists()){
return Services.getMessage("project.directory.missing", folder);
}
File dotproject = new File(folder + "/.project");
if (!dotproject.exists()){
return Services.getMessage("project.dotproject.missing", folder);
}
// hacky, but I want to re-use the eclipse logic as much as possible.
WizardProjectsImportPage page = new WizardProjectsImportPage();
// construct a ProjectRecord
Constructor<WizardProjectsImportPage.ProjectRecord> construct =
WizardProjectsImportPage.ProjectRecord.class
.getDeclaredConstructor(WizardProjectsImportPage.class, File.class);
construct.setAccessible(true);
WizardProjectsImportPage.ProjectRecord record =
construct.newInstance(page, dotproject);
String projectName = record.getProjectName();
IProject project = ProjectUtils.getProject(projectName);
if(project.exists()){
return Services.getMessage("project.name.exists", projectName, folder);
}
// need to initialize the wizard page's 'createdProjects' list.
Field field = page.getClass().getDeclaredField("createdProjects");
field.setAccessible(true);
field.set(page, new ArrayList<IProject>());
// create the project from the ProjectRecord
Method method = page.getClass().getDeclaredMethod(
"createExistingProject",
WizardProjectsImportPage.ProjectRecord.class,
IProgressMonitor.class);
method.setAccessible(true);
Status result = (Status)method.invoke(page, record, new NullProgressMonitor());
if (!result.isOK()){
return Services.getMessage("project.import.failed", projectName);
}
return Services.getMessage("project.imported", projectName);
}
}