package com.intellij.openapi.externalSystem.service; import com.intellij.openapi.externalSystem.model.settings.ExternalSystemExecutionSettings; import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId; import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskType; import com.intellij.openapi.externalSystem.service.internal.ExternalSystemTaskAware; import com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProgressNotificationManager; import com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemProjectResolver; import com.intellij.openapi.externalSystem.service.remote.RemoteExternalSystemTaskManager; import org.jetbrains.annotations.NotNull; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.Collections; import java.util.Map; import java.util.Set; /** * Serves as a facade for working with external system which might be located at an external (non-ide) process. * <p/> * The main idea is that we don't want to use it directly from an ide process (to avoid unnecessary heap/perm gen pollution, * memory leaks etc). So, we use it at external process and current class works as a facade to it from ide process. * * @author Denis Zhdanov * @since 8/8/11 10:52 AM */ public interface RemoteExternalSystemFacade<S extends ExternalSystemExecutionSettings> extends Remote, ExternalSystemTaskAware { /** <a href="http://en.wikipedia.org/wiki/Null_Object_pattern">Null object</a> for {@link RemoteExternalSystemFacade}. */ RemoteExternalSystemFacade<?> NULL_OBJECT = new RemoteExternalSystemFacade<ExternalSystemExecutionSettings>() { @NotNull @Override public RemoteExternalSystemProjectResolver<ExternalSystemExecutionSettings> getResolver() throws RemoteException, IllegalStateException { return RemoteExternalSystemProjectResolver.NULL_OBJECT; } @NotNull @Override public RemoteExternalSystemTaskManager<ExternalSystemExecutionSettings> getTaskManager() throws RemoteException { return RemoteExternalSystemTaskManager.NULL_OBJECT; } @Override public void applySettings(@NotNull ExternalSystemExecutionSettings settings) throws RemoteException { } @Override public void applyProgressManager(@NotNull RemoteExternalSystemProgressNotificationManager progressManager) throws RemoteException { } @Override public boolean isTaskInProgress(@NotNull ExternalSystemTaskId id) throws RemoteException { return false; } @Override public boolean cancelTask(@NotNull ExternalSystemTaskId id) throws RemoteException { return false; } @NotNull @Override public Map<ExternalSystemTaskType, Set<ExternalSystemTaskId>> getTasksInProgress() throws RemoteException { return Collections.emptyMap(); } }; /** * Exposes <code>'resolve external system project'</code> service that works at another process. * * @return <code>'resolve external system project'</code> service * @throws RemoteException in case of unexpected I/O exception during processing * @throws IllegalStateException in case of inability to create the service */ @NotNull RemoteExternalSystemProjectResolver<S> getResolver() throws RemoteException, IllegalStateException; /** * Exposes <code>'run external system task'</code> service which works at another process. * * @return external system build manager * @throws RemoteException in case of inability to create the service */ @NotNull RemoteExternalSystemTaskManager<S> getTaskManager() throws RemoteException; /** * Asks remote external system process to apply given settings. * * @param settings settings to apply * @throws RemoteException in case of unexpected I/O exception during processing */ void applySettings(@NotNull S settings) throws RemoteException; /** * Asks remote external system process to use given progress manager. * * @param progressManager progress manager to use * @throws RemoteException in case of unexpected I/O exception during processing */ void applyProgressManager(@NotNull RemoteExternalSystemProgressNotificationManager progressManager) throws RemoteException; }