blob: 8afa3ba0981ccfdcf2df4d1504ad10f35d708c1a [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.projectImport;
import com.intellij.CommonBundle;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.highlighter.ProjectFileType;
import com.intellij.ide.impl.NewProjectUtil;
import com.intellij.ide.impl.ProjectUtil;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.StorageScheme;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.CompilerProjectExtension;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
/**
* @author anna
* @since 12-Jul-2007
*/
public abstract class ProjectOpenProcessorBase<T extends ProjectImportBuilder> extends ProjectOpenProcessor {
private final T myBuilder;
protected ProjectOpenProcessorBase(@NotNull final T builder) {
myBuilder = builder;
}
public String getName() {
return getBuilder().getName();
}
@Nullable
public Icon getIcon() {
return getBuilder().getIcon();
}
public boolean canOpenProject(final VirtualFile file) {
final String[] supported = getSupportedExtensions();
if (supported != null) {
if (file.isDirectory()) {
for (VirtualFile child : getFileChildren(file)) {
if (canOpenFile(child, supported)) return true;
}
return false;
}
if (canOpenFile(file, supported)) return true;
}
return false;
}
private static Collection<VirtualFile> getFileChildren(VirtualFile file) {
if (file instanceof NewVirtualFile) {
return ((NewVirtualFile)file).getCachedChildren();
}
return Arrays.asList(file.getChildren());
}
protected static boolean canOpenFile(VirtualFile file, String[] supported) {
final String fileName = file.getName();
for (String name : supported) {
if (fileName.equals(name)) {
return true;
}
}
return false;
}
protected boolean doQuickImport(VirtualFile file, final WizardContext wizardContext) {
return false;
}
@NotNull
public T getBuilder() {
return myBuilder;
}
@Nullable
public abstract String[] getSupportedExtensions();
@Nullable
public Project doOpenProject(@NotNull VirtualFile virtualFile, Project projectToClose, boolean forceOpenInNewFrame) {
try {
getBuilder().setUpdate(false);
final WizardContext wizardContext = new WizardContext(null);
if (virtualFile.isDirectory()) {
final String[] supported = getSupportedExtensions();
for (VirtualFile file : getFileChildren(virtualFile)) {
if (canOpenFile(file, supported)) {
virtualFile = file;
break;
}
}
}
wizardContext.setProjectFileDirectory(virtualFile.getParent().getPath());
if (!doQuickImport(virtualFile, wizardContext)) return null;
if (wizardContext.getProjectName() == null) {
if (wizardContext.getProjectStorageFormat() == StorageScheme.DEFAULT) {
wizardContext.setProjectName(IdeBundle.message("project.import.default.name", getName()) + ProjectFileType.DOT_DEFAULT_EXTENSION);
}
else {
wizardContext.setProjectName(IdeBundle.message("project.import.default.name.dotIdea", getName()));
}
}
Project defaultProject = ProjectManager.getInstance().getDefaultProject();
Sdk jdk = ProjectRootManager.getInstance(defaultProject).getProjectSdk();
if (jdk == null) {
jdk = ProjectJdkTable.getInstance().findMostRecentSdkOfType(JavaSdk.getInstance());
}
wizardContext.setProjectJdk(jdk);
final String dotIdeaFilePath = wizardContext.getProjectFileDirectory() + File.separator + Project.DIRECTORY_STORE_FOLDER;
final String projectFilePath = wizardContext.getProjectFileDirectory() + File.separator + wizardContext.getProjectName() +
ProjectFileType.DOT_DEFAULT_EXTENSION;
File dotIdeaFile = new File(dotIdeaFilePath);
File projectFile = new File(projectFilePath);
String pathToOpen;
if (wizardContext.getProjectStorageFormat() == StorageScheme.DEFAULT) {
pathToOpen = projectFilePath;
} else {
pathToOpen = dotIdeaFile.getParent();
}
boolean shouldOpenExisting = false;
if (!ApplicationManager.getApplication().isHeadlessEnvironment() && (projectFile.exists() || dotIdeaFile.exists())) {
String existingName;
if (dotIdeaFile.exists()) {
existingName = "an existing project";
pathToOpen = dotIdeaFile.getParent();
}
else {
existingName = "'" + projectFile.getName() + "'";
pathToOpen = projectFilePath;
}
int result = Messages.showYesNoCancelDialog(
projectToClose,
IdeBundle.message("project.import.open.existing", existingName, projectFile.getParent(), virtualFile.getName()),
IdeBundle.message("title.open.project"),
IdeBundle.message("project.import.open.existing.openExisting"),
IdeBundle.message("project.import.open.existing.reimport"),
CommonBundle.message("button.cancel"),
Messages.getQuestionIcon());
if (result == Messages.CANCEL) return null;
shouldOpenExisting = result == Messages.YES;
}
final Project projectToOpen;
if (shouldOpenExisting) {
try {
projectToOpen = ProjectManagerEx.getInstanceEx().loadProject(pathToOpen);
}
catch (Exception e) {
return null;
}
}
else {
projectToOpen = ProjectManagerEx.getInstanceEx().newProject(wizardContext.getProjectName(), pathToOpen, true, false);
if (projectToOpen == null || !getBuilder().validate(projectToClose, projectToOpen)) {
return null;
}
projectToOpen.save();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
Sdk jdk = wizardContext.getProjectJdk();
if (jdk != null) {
NewProjectUtil.applyJdkToProject(projectToOpen, jdk);
}
String projectDirPath = wizardContext.getProjectFileDirectory();
String path = StringUtil.endsWithChar(projectDirPath, '/') ? projectDirPath + "classes" : projectDirPath + "/classes";
CompilerProjectExtension extension = CompilerProjectExtension.getInstance(projectToOpen);
if (extension != null) {
extension.setCompilerOutputUrl(getUrl(path));
}
}
});
getBuilder().commit(projectToOpen, null, ModulesProvider.EMPTY_MODULES_PROVIDER);
}
if (!forceOpenInNewFrame) {
NewProjectUtil.closePreviousProject(projectToClose);
}
ProjectUtil.updateLastProjectLocation(pathToOpen);
ProjectManagerEx.getInstanceEx().openProject(projectToOpen);
return projectToOpen;
}
finally {
getBuilder().cleanup();
}
}
public static String getUrl(@NonNls String path) {
try {
path = FileUtil.resolveShortWindowsName(path);
}
catch (IOException ignored) { }
return VfsUtilCore.pathToUrl(FileUtil.toSystemIndependentName(path));
}
}