blob: dd50bc8c8f5793c66725dfa83aa70b2503193fc1 [file] [log] [blame]
package com.intellij.openapi.externalSystem;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.externalSystem.task.ExternalSystemTaskManager;
import com.intellij.openapi.externalSystem.model.ProjectSystemId;
import com.intellij.openapi.externalSystem.model.settings.ExternalSystemExecutionSettings;
import com.intellij.openapi.externalSystem.service.ParametersEnhancer;
import com.intellij.openapi.externalSystem.service.project.ExternalSystemProjectResolver;
import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings;
import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings;
import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings;
import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsListener;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
/**
* IntelliJ external systems integration is built using GoF Bridge pattern, i.e. 'external-system' module defines
* external system-specific extension (current interface) and an api which is used by all extensions. Most of the codebase
* is built on top of that api and provides generic actions like 'sync ide project with external project'; 'import library
* dependencies which are configured at external system but not at the ide' etc.
* <p/>
* That makes it relatively easy to add a new external system integration.
*
* @author Denis Zhdanov
* @since 4/4/13 4:05 PM
*/
public interface ExternalSystemManager<
ProjectSettings extends ExternalProjectSettings,
SettingsListener extends ExternalSystemSettingsListener<ProjectSettings>,
Settings extends AbstractExternalSystemSettings<Settings, ProjectSettings, SettingsListener>,
LocalSettings extends AbstractExternalSystemLocalSettings,
ExecutionSettings extends ExternalSystemExecutionSettings>
extends ParametersEnhancer
{
ExtensionPointName<ExternalSystemManager> EP_NAME = ExtensionPointName.create("com.intellij.externalSystemManager");
/**
* @return id of the external system represented by the current manager
*/
@NotNull
ProjectSystemId getSystemId();
/**
* @return a strategy which can be queried for external system settings to use with the given project
*/
@NotNull
Function<Project, Settings> getSettingsProvider();
/**
* @return a strategy which can be queried for external system local settings to use with the given project
*/
@NotNull
Function<Project, LocalSettings> getLocalSettingsProvider();
/**
* @return a strategy which can be queried for external system execution settings to use with the given project
*/
@NotNull
Function<Pair<Project, String/*linked project path*/>, ExecutionSettings> getExecutionSettingsProvider();
/**
* Allows to retrieve information about {@link ExternalSystemProjectResolver project resolver} to use for the target external
* system.
* <p/>
* <b>Note:</b> we return a class instance instead of resolver object here because there is a possible case that the resolver
* is used at external (non-ide) process, so, it needs information which is enough for instantiating it there. That implies
* the requirement that target resolver class is expected to have a no-args constructor
*
* @return class of the project resolver to use for the target external system
*/
@NotNull
Class<? extends ExternalSystemProjectResolver<ExecutionSettings>> getProjectResolverClass();
/**
* @return class of the build manager to use for the target external system
* @see #getProjectResolverClass()
*/
Class<? extends ExternalSystemTaskManager<ExecutionSettings>> getTaskManagerClass();
/**
* @return file chooser descriptor to use when adding new external project
*/
@NotNull
FileChooserDescriptor getExternalProjectDescriptor();
}