// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.service.project.wizard;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.externalSystem.model.DataNode;
import com.intellij.openapi.externalSystem.model.project.ProjectData;
import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager;
import com.intellij.openapi.externalSystem.service.project.wizard.AbstractExternalProjectImportBuilder;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.twitter.intellij.pants.PantsBundle;
import com.twitter.intellij.pants.settings.ImportFromPantsControl;
import com.twitter.intellij.pants.util.PantsConstants;
import icons.PantsIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.io.File;
import java.util.List;
public class PantsProjectImportBuilder extends AbstractExternalProjectImportBuilder<ImportFromPantsControl> {
public PantsProjectImportBuilder(@NotNull ProjectDataManager dataManager) {
super(dataManager, new ImportFromPantsControl(), PantsConstants.SYSTEM_ID);
}
@NotNull
@Override
public String getName() {
return PantsBundle.message("pants.name");
}
@Override
public Icon getIcon() {
return PantsIcons.Icon;
}
@Override
protected void doPrepare(@NotNull WizardContext context) {
String pathToUse = context.getProjectFileDirectory();
getControl(context.getProject()).setLinkedProjectPath(pathToUse);
}
@Override
protected void beforeCommit(@NotNull DataNode<ProjectData> dataNode, @NotNull Project project) {
}
@NotNull
@Override
protected File getExternalProjectConfigToUse(@NotNull File file) {
return file;
}
@Override
protected void applyExtraSettings(@NotNull WizardContext context) {
final DataNode<ProjectData> node = getExternalProjectNode();
if (node == null) {
return;
}
final DataNode<Sdk> sdkNode = ExternalSystemApiUtil.find(node, PantsConstants.SDK_KEY);
if (sdkNode != null) {
Sdk pantsSdk = sdkNode.getData();
context.setProjectJdk(addIfNotExists(pantsSdk));
}
}
/**
* Find if pants sdk is already configured, return the existing sdk if it exists,
* otherwise add to the config and return.
*/
private Sdk addIfNotExists(final Sdk pantsSdk) {
final JavaSdk javaSdk = JavaSdk.getInstance();
List<Sdk> sdks = ProjectJdkTable.getInstance().getSdksOfType(javaSdk);
for (Sdk sdk : sdks) {
if (javaSdk.getVersion(sdk) == javaSdk.getVersion(pantsSdk)) {
return sdk;
}
}
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
ProjectJdkTable.getInstance().addJdk(pantsSdk);
}
});
return pantsSdk;
}
}