// Copyright 2014 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.configurations.SimpleJavaParameters;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.externalSystem.ExternalSystemConfigurableAware;
import com.intellij.openapi.externalSystem.ExternalSystemManager;
import com.intellij.openapi.externalSystem.ExternalSystemUiAware;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.service.project.ExternalSystemProjectResolver;
import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings;
import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings;
import com.intellij.openapi.externalSystem.task.ExternalSystemTaskManager;
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
import com.intellij.openapi.externalSystem.util.ExternalSystemConstants;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.options.Configurable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.startup.StartupActivity;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.Function;
import com.twitter.intellij.pants.model.PantsTargetAddress;
import com.twitter.intellij.pants.service.project.PantsSystemProjectResolver;
import com.twitter.intellij.pants.service.task.PantsTaskManager;
import com.twitter.intellij.pants.settings.PantsConfigurable;
import com.twitter.intellij.pants.settings.PantsExecutionSettings;
import com.twitter.intellij.pants.settings.PantsLocalSettings;
import com.twitter.intellij.pants.settings.PantsProjectSettings;
import com.twitter.intellij.pants.settings.PantsSettings;
import com.twitter.intellij.pants.settings.PantsSettingsListener;
import com.twitter.intellij.pants.util.PantsConstants;
import com.twitter.intellij.pants.util.PantsUtil;
import icons.ExternalSystemIcons;
import icons.PantsIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon;
import java.net.URL;
import java.util.List;
import java.util.Optional;
public class PantsManager implements
ExternalSystemConfigurableAware,
ExternalSystemUiAware,
StartupActivity,
ExternalSystemManager<
PantsProjectSettings,
PantsSettingsListener,
PantsSettings,
PantsLocalSettings,
PantsExecutionSettings> {
public static final FileChooserDescriptor BUILD_FILE_CHOOSER_DESCRIPTOR =
new FileChooserDescriptor(true, true, false, false, false, false) {
@Override
public boolean isFileSelectable(VirtualFile file) {
return super.isFileSelectable(file) && PantsUtil.isPantsProjectFile(file);
}
};
private static final Logger LOG = Logger.getInstance(PantsManager.class);
@NotNull
@Override
public ProjectSystemId getSystemId() {
return PantsConstants.SYSTEM_ID;
}
@Nullable
@Override
public Icon getProjectIcon() {
return PantsIcons.Icon;
}
@Nullable
@Override
public Icon getTaskIcon() {
return ExternalSystemIcons.Task;
}
@NotNull
@Override
public Configurable getConfigurable(@NotNull Project project) {
return new PantsConfigurable(project);
}
@NotNull
@Override
public Function<Project, PantsSettings> getSettingsProvider() {
return new Function<Project, PantsSettings>() {
@Override
public PantsSettings fun(Project project) {
return PantsSettings.getInstance(project);
}
};
}
@NotNull
@Override
public Function<Project, PantsLocalSettings> getLocalSettingsProvider() {
return new Function<Project, PantsLocalSettings>() {
@Override
public PantsLocalSettings fun(Project project) {
return PantsLocalSettings.getInstance(project);
}
};
}
@NotNull
@Override
public Function<Pair<Project, String>, PantsExecutionSettings> getExecutionSettingsProvider() {
return new Function<Pair<Project, String>, PantsExecutionSettings>() {
@Override
public PantsExecutionSettings fun(Pair<Project, String> projectStringPair) {
final Project ideProject = projectStringPair.getFirst();
final String projectPath = projectStringPair.getSecond();
return getExecutionsSettingsFromPath(ideProject, projectPath);
}
@NotNull
private PantsExecutionSettings getExecutionsSettingsFromPath(@NotNull Project ideProject, @NotNull String projectPath) {
final AbstractExternalSystemSettings systemSettings = ExternalSystemApiUtil.getSettings(ideProject, PantsConstants.SYSTEM_ID);
final ExternalProjectSettings projectSettings = systemSettings.getLinkedProjectSettings(projectPath);
if (projectSettings instanceof PantsProjectSettings) {
PantsProjectSettings pantsProjectSettings = (PantsProjectSettings) projectSettings;
return new PantsExecutionSettings(
pantsProjectSettings.getTargetSpecs(),
pantsProjectSettings.isLibsWithSources(),
pantsProjectSettings.isUseIdeaProjectJdk(),
pantsProjectSettings.isEnableIncrementalImport()
);
}
else {
return PantsExecutionSettings.createDefault();
}
}
};
}
@NotNull
@Override
public Class<? extends ExternalSystemProjectResolver<PantsExecutionSettings>> getProjectResolverClass() {
return PantsSystemProjectResolver.class;
}
@Override
public Class<? extends ExternalSystemTaskManager<PantsExecutionSettings>> getTaskManagerClass() {
return PantsTaskManager.class;
}
@NotNull
@Override
public FileChooserDescriptor getExternalProjectDescriptor() {
return BUILD_FILE_CHOOSER_DESCRIPTOR;
}
@NotNull
@Override
public String getProjectRepresentationName(@NotNull String targetProjectPath, @Nullable String rootProjectPath) {
final Optional<PantsTargetAddress> addressOptional = PantsTargetAddress.fromString(targetProjectPath, false);
assert addressOptional.isPresent();
final PantsTargetAddress address = addressOptional.get();
return address.getRelativePath() + ":" + address.getTargetName();
}
@Nullable
@Override
public FileChooserDescriptor getExternalProjectConfigDescriptor() {
return BUILD_FILE_CHOOSER_DESCRIPTOR;
}
@Override
public void enhanceRemoteProcessing(@NotNull SimpleJavaParameters parameters) throws ExecutionException {
parameters.getVMParametersList().addProperty(
ExternalSystemConstants.EXTERNAL_SYSTEM_ID_KEY, PantsConstants.SYSTEM_ID.getId()
);
}
@Override
public void enhanceLocalProcessing(@NotNull List<URL> urls) {
}
@Override
public void runActivity(@NotNull Project project) {
}
}