package sk.stuba.fiit.perconik.core.resources;
import com.google.common.collect.SetMultimap;
import sk.stuba.fiit.perconik.core.Listener;
import sk.stuba.fiit.perconik.core.ListenerRegistrationException;
import sk.stuba.fiit.perconik.core.ListenerUnregistrationException;
import sk.stuba.fiit.perconik.core.Resource;
import sk.stuba.fiit.perconik.core.UnsupportedResourceException;
import sk.stuba.fiit.perconik.core.listeners.CommandCategoryListener;
import sk.stuba.fiit.perconik.core.listeners.CommandContextListener;
import sk.stuba.fiit.perconik.core.listeners.CommandContextManagerListener;
import sk.stuba.fiit.perconik.core.listeners.CommandExecutionListener;
import sk.stuba.fiit.perconik.core.listeners.CommandHandlerListener;
import sk.stuba.fiit.perconik.core.listeners.CommandListener;
import sk.stuba.fiit.perconik.core.listeners.CommandManagerListener;
import sk.stuba.fiit.perconik.core.listeners.CompletionListener;
import sk.stuba.fiit.perconik.core.listeners.DebugEventsListener;
import sk.stuba.fiit.perconik.core.listeners.DocumentListener;
import sk.stuba.fiit.perconik.core.listeners.EditorListener;
import sk.stuba.fiit.perconik.core.listeners.FileBufferListener;
import sk.stuba.fiit.perconik.core.listeners.GitConfigurationListener;
import sk.stuba.fiit.perconik.core.listeners.GitIndexListener;
import sk.stuba.fiit.perconik.core.listeners.GitReferenceListener;
import sk.stuba.fiit.perconik.core.listeners.GitRepositoryListener;
import sk.stuba.fiit.perconik.core.listeners.JavaElementListener;
import sk.stuba.fiit.perconik.core.listeners.LaunchConfigurationListener;
import sk.stuba.fiit.perconik.core.listeners.LaunchListener;
import sk.stuba.fiit.perconik.core.listeners.LaunchesListener;
import sk.stuba.fiit.perconik.core.listeners.MarkSelectionListener;
import sk.stuba.fiit.perconik.core.listeners.OperationHistoryListener;
import sk.stuba.fiit.perconik.core.listeners.PageListener;
import sk.stuba.fiit.perconik.core.listeners.PartListener;
import sk.stuba.fiit.perconik.core.listeners.PerspectiveListener;
import sk.stuba.fiit.perconik.core.listeners.RefactoringExecutionListener;
import sk.stuba.fiit.perconik.core.listeners.RefactoringHistoryListener;
import sk.stuba.fiit.perconik.core.listeners.ResourceListener;
import sk.stuba.fiit.perconik.core.listeners.SearchQueryListener;
import sk.stuba.fiit.perconik.core.listeners.SearchResultListener;
import sk.stuba.fiit.perconik.core.listeners.SelectionListener;
import sk.stuba.fiit.perconik.core.listeners.StructuredSelectionListener;
import sk.stuba.fiit.perconik.core.listeners.TestRunListener;
import sk.stuba.fiit.perconik.core.listeners.TextInputListener;
import sk.stuba.fiit.perconik.core.listeners.TextListener;
import sk.stuba.fiit.perconik.core.listeners.TextPresentationListener;
import sk.stuba.fiit.perconik.core.listeners.TextSelectionListener;
import sk.stuba.fiit.perconik.core.listeners.ViewListener;
import sk.stuba.fiit.perconik.core.listeners.ViewportListener;
import sk.stuba.fiit.perconik.core.listeners.WindowListener;
import sk.stuba.fiit.perconik.core.listeners.WorkbenchListener;
import sk.stuba.fiit.perconik.core.services.Services;
import sk.stuba.fiit.perconik.core.services.resources.ResourceManager;
import sk.stuba.fiit.perconik.core.services.resources.ResourceManagers;
import sk.stuba.fiit.perconik.core.services.resources.ResourceNamesSupplier;
import sk.stuba.fiit.perconik.core.services.resources.ResourceProvider;
import sk.stuba.fiit.perconik.core.services.resources.ResourceProvider.Builder;
import sk.stuba.fiit.perconik.core.services.resources.ResourceProviders;
import sk.stuba.fiit.perconik.core.services.resources.ResourceService;
import sk.stuba.fiit.perconik.core.services.resources.ResourceServices;
import static sk.stuba.fiit.perconik.core.plugin.Activator.defaultInstance;
import static sk.stuba.fiit.perconik.utilities.MoreThrowables.initializeCause;
/**
* Static accessor methods pertaining to default resource core implementation.
*
* <p>The core implementation includes default {@code Resource}
* instances along with respective {@code ResourceNamesSupplier}
* as well as default {@code ResourceService}, {@code ResourceProvider}
* and {@code ResourceManager}.
*
* <p>The default implementations of resources as well as resource provider,
* manager and service are still available by this class even if the respective
* resources are unregistered from the core or the services are switched or
* stopped.
*
* @author Pavol Zbell
* @since 1.0
*/
public final class DefaultResources {
static final Resource<CommandListener> command;
static final Resource<CommandCategoryListener> commandCategory;
static final Resource<CommandContextListener> commandContext;
static final Resource<CommandContextManagerListener> commandContextManager;
static final Resource<CommandExecutionListener> commandExecution;
static final Resource<CommandHandlerListener> commandHandler;
static final Resource<CommandManagerListener> commandManager;
static final Resource<CompletionListener> completion;
static final Resource<DebugEventsListener> debugEvents;
static final Resource<DocumentListener> document;
static final Resource<EditorListener> editor;
static final Resource<FileBufferListener> fileBuffer;
static final Resource<GitConfigurationListener> gitConfiguration;
static final Resource<GitIndexListener> gitIndex;
static final Resource<GitReferenceListener> gitReference;
static final Resource<GitRepositoryListener> gitRepository;
static final Resource<JavaElementListener> javaElement;
static final Resource<LaunchListener> launch;
static final Resource<LaunchesListener> launches;
static final Resource<LaunchConfigurationListener> launchConfiguration;
static final Resource<MarkSelectionListener> markSelection;
static final Resource<OperationHistoryListener> operationHistory;
static final Resource<PageListener> page;
static final Resource<PartListener> part;
static final Resource<PerspectiveListener> perspective;
static final Resource<RefactoringExecutionListener> refactoringExecution;
static final Resource<RefactoringHistoryListener> refactoringHistory;
static final Resource<ResourceListener> resource;
static final Resource<SearchQueryListener> searchQuery;
static final Resource<SearchResultListener> searchResult;
static final Resource<SelectionListener> selection;
static final Resource<StructuredSelectionListener> structuredSelection;
static final Resource<TestRunListener> testRun;
static final Resource<TextListener> text;
static final Resource<TextInputListener> textInput;
static final Resource<TextPresentationListener> textPresentation;
static final Resource<TextSelectionListener> textSelection;
static final Resource<ViewListener> view;
static final Resource<ViewportListener> viewport;
static final Resource<WindowListener> window;
static final Resource<WorkbenchListener> workbench;
static final ResourceProvider provider;
static {
ResourceProvider.Builder builder = ResourceProviders.builder();
command = forge(CommandListener.class, CommandHandler.INSTANCE, builder);
commandCategory = forge(CommandCategoryListener.class, CommandCategoryHandler.INSTANCE, builder);
commandContext = forge(CommandContextListener.class, CommandContextHandler.INSTANCE, builder);
commandContextManager = forge(CommandContextManagerListener.class, CommandContextManagerHandler.INSTANCE, builder);
commandExecution = forge(CommandExecutionListener.class, CommandExecutionHandler.INSTANCE, builder);
commandHandler = forge(CommandHandlerListener.class, CommandHandlerHandler.INSTANCE, builder);
commandManager = forge(CommandManagerListener.class, CommandManagerHandler.INSTANCE, builder);
completion = forge(CompletionListener.class, CompletionHandler.INSTANCE, builder);
debugEvents = forge(DebugEventsListener.class, DebugEventsHandler.INSTANCE, builder);
document = forge(DocumentListener.class, DocumentHandler.INSTANCE, builder);
editor = forge(EditorListener.class, EditorHandler.INSTANCE, builder);
fileBuffer = forge(FileBufferListener.class, FileBufferHandler.INSTANCE, builder);
gitConfiguration = forge(GitConfigurationListener.class, GitConfigurationHandler.INSTANCE, builder);
gitIndex = forge(GitIndexListener.class, GitIndexHandler.INSTANCE, builder);
gitReference = forge(GitReferenceListener.class, GitReferenceHandler.INSTANCE, builder);
gitRepository = forge(GitRepositoryListener.class, GitRepositoryHandler.INSTANCE, builder);
javaElement = forge(JavaElementListener.class, JavaElementHandler.INSTANCE, builder);
launch = forge(LaunchListener.class, LaunchHandler.INSTANCE, builder);
launchConfiguration = forge(LaunchConfigurationListener.class, LaunchConfigurationHandler.INSTANCE, builder);
launches = forge(LaunchesListener.class, LaunchesHandler.INSTANCE, builder);
markSelection = forge(MarkSelectionListener.class, MarkSelectionHandler.INSTANCE, builder);
operationHistory = forge(OperationHistoryListener.class, OperationHistoryHandler.INSTANCE, builder);
page = forge(PageListener.class, PageHandler.INSTANCE, builder);
part = forge(PartListener.class, PartHandler.INSTANCE, builder);
perspective = forge(PerspectiveListener.class, PerspectiveHandler.INSTANCE, builder);
refactoringExecution = forge(RefactoringExecutionListener.class, RefactoringExecutionHandler.INSTANCE, builder);
refactoringHistory = forge(RefactoringHistoryListener.class, RefactoringHistoryHandler.INSTANCE, builder);
resource = forge(ResourceListener.class, ResourceHandler.INSTANCE, builder);
searchQuery = forge(SearchQueryListener.class, SearchQueryHandler.INSTANCE, builder);
searchResult = forge(SearchResultListener.class, SearchResultHandler.INSTANCE, builder);
selection = forge(SelectionListener.class, SelectionHandler.INSTANCE, builder);
structuredSelection = forge(StructuredSelectionListener.class, StructuredSelectionHandler.INSTANCE, builder);
testRun = forge(TestRunListener.class, TestRunHandler.INSTANCE, builder);
text = forge(TextListener.class, TextHandler.INSTANCE, builder);
textInput = forge(TextInputListener.class, TextInputHandler.INSTANCE, builder);
textPresentation = forge(TextPresentationListener.class, TextPresentationHandler.INSTANCE, builder);
textSelection = forge(TextSelectionListener.class, TextSelectionHandler.INSTANCE, builder);
view = forge(ViewListener.class, ViewHandler.INSTANCE, builder);
viewport = forge(ViewportListener.class, ViewportHandler.INSTANCE, builder);
window = forge(WindowListener.class, WindowHandler.INSTANCE, builder);
workbench = forge(WorkbenchListener.class, WorkbenchHandler.INSTANCE, builder);
provider = builder.build();
}
private DefaultResources() {}
/**
* Creates default resource provider. The returned provider is a
* standard resource provider constructed using the standard provider
* builder from {@link ResourceProviders#builder()} factory method.
* Its direct parent and the only predecessor in the resource provider
* hierarchy is the system resource provider.
*
* @return the default resource provider
*
* @see ResourceProvider
* @see ResourceProviders#builder()
* @see ResourceProviders#superResourceProvider()
*/
public static ResourceProvider createResourceProvider() {
return provider;
}
/**
* Creates default resource manager. The returned
* manager is a standard resource manager constructed by
* the {@link ResourceManagers#create()} factory method.
*
* @return the default resource manager
*
* @see ResourceManager
* @see ResourceManagers#create()
*/
public static ResourceManager createResourceManager() {
return ResourceManagers.create();
}
/**
* Creates default resource service. The returned service is a
* standard resource service constructed using the standard service
* builder from {@link ResourceServices#builder()} factory method.
* It contains the default resource provider and manager.
*
* @return the default resource service
*
* @see ResourceService
* @see ResourceServices#builder()
* @see #createResourceProvider()
* @see #createResourceManager()
*/
public static ResourceService createResourceService() {
return ResourceServices.builder().provider(createResourceProvider()).manager(createResourceManager()).build();
}
/**
* Creates default resource names supplier.
* The built supplier dynamically supplies resource
* names associated with listener types based on the
* currently used {@code ResourceProvider} obtained by this
* {@code Services.getResourceService().getResourceProvider()}
* method call at supplying.
*
* @return the default resource names supplier
*
* @see ResourceNamesSupplier
* @see #createResourceProvider()
*/
public static ResourceNamesSupplier createResourceNamesSupplier() {
return new ResourceNamesSupplier() {
public SetMultimap<Class<? extends Listener>, String> get() {
return ResourceProviders.toResourceNamesMultimap(Services.getResourceService().getResourceProvider());
}
};
}
private static <L extends Listener> void safePreRegister(final L listener) {
try {
listener.preRegister();
} catch (Exception failure) {
throw initializeCause(new ListenerRegistrationException(), failure);
}
}
private static <L extends Listener> void safeRegisterTo(final Resource<? super L> resource, final L listener) {
try {
resource.register(listener);
} catch (UnsupportedResourceException failure) {
defaultInstance().getConsole().error(failure, "Unsupported resource %s failed registering listener %s", resource, listener);
}
}
private static <L extends Listener> void safePostRegister(final Listener listener) {
try {
listener.postRegister();
} catch (Exception failure) {
throw initializeCause(new ListenerRegistrationException(), failure);
}
}
private static <L extends Listener> void safePreUnregister(final L listener) {
try {
listener.preUnregister();
} catch (Exception failure) {
throw initializeCause(new ListenerUnregistrationException(), failure);
}
}
private static <L extends Listener> void safeUnregisterFrom(final Resource<? super L> resource, final L listener) {
try {
resource.unregister(listener);
} catch (UnsupportedResourceException failure) {
defaultInstance().getConsole().error(failure, "Unsupported resource %s failed unregistering listener %s", resource, listener);
}
}
private static <L extends Listener> void safePostUnregister(final L listener) {
try {
listener.postUnregister();
} catch (Exception failure) {
throw initializeCause(new ListenerUnregistrationException(), failure);
}
}
public static <L extends Listener> void registerTo(final Resource<L> resource, final L listener) {
safePreRegister(listener);
safeRegisterTo(resource, listener);
safePostRegister(listener);
}
public static <L extends Listener> void registerTo(final Iterable<Resource<? super L>> resources, final L listener) {
safePreRegister(listener);
for (Resource<? super L> resource: resources) {
safeRegisterTo(resource, listener);
}
safePostRegister(listener);
}
public static <L extends Listener> void unregisterFrom(final Resource<L> resource, final L listener) {
safePreUnregister(listener);
safeUnregisterFrom(resource, listener);
safePostUnregister(listener);
}
public static <L extends Listener> void unregisterFrom(final Iterable<Resource<? super L>> resources, final L listener) {
safePreUnregister(listener);
for (Resource<? super L> resource: resources) {
safeUnregisterFrom(resource, listener);
}
safePostUnregister(listener);
}
private static <L extends Listener> Resource<L> forge(final Class<L> type, final Handler<L> handler, final Builder builder) {
boolean unsupported = handler.getClass().isAnnotationPresent(Unimplemented.class);
Resource<L> resource = StandardResource.newInstance(Pools.safe(Pools.getListenerPoolFactory().create(handler), type), unsupported);
builder.add(type, resource);
return resource;
}
public static Resource<CommandListener> getCommandResource() {
return DefaultResources.command;
}
public static Resource<CommandCategoryListener> getCommandCategoryResource() {
return DefaultResources.commandCategory;
}
public static Resource<CommandContextListener> getCommandContextResource() {
return DefaultResources.commandContext;
}
public static Resource<CommandContextManagerListener> getCommandContextManagerResource() {
return DefaultResources.commandContextManager;
}
public static Resource<CommandExecutionListener> getCommandExecutionResource() {
return DefaultResources.commandExecution;
}
public static Resource<CommandHandlerListener> getCommandHandlerResource() {
return DefaultResources.commandHandler;
}
public static Resource<CommandManagerListener> getCommandManagerResource() {
return DefaultResources.commandManager;
}
public static Resource<CompletionListener> getCompletionResource() {
return DefaultResources.completion;
}
public static Resource<DebugEventsListener> getDebugEventsResource() {
return DefaultResources.debugEvents;
}
public static Resource<DocumentListener> getDocumentResource() {
return DefaultResources.document;
}
public static Resource<EditorListener> getEditorResource() {
return DefaultResources.editor;
}
public static Resource<FileBufferListener> getFileBufferResource() {
return DefaultResources.fileBuffer;
}
public static Resource<GitConfigurationListener> getGitConfigurationResource() {
return DefaultResources.gitConfiguration;
}
public static Resource<GitIndexListener> getGitIndexResource() {
return DefaultResources.gitIndex;
}
public static Resource<GitReferenceListener> getGitReferenceResource() {
return DefaultResources.gitReference;
}
public static Resource<GitRepositoryListener> getGitRepositoryResource() {
return DefaultResources.gitRepository;
}
public static Resource<JavaElementListener> getJavaElementResource() {
return DefaultResources.javaElement;
}
public static Resource<LaunchListener> getLaunchResource() {
return DefaultResources.launch;
}
public static Resource<LaunchesListener> getLaunchesResource() {
return DefaultResources.launches;
}
public static Resource<LaunchConfigurationListener> getLaunchConfigurationResource() {
return DefaultResources.launchConfiguration;
}
public static Resource<MarkSelectionListener> getMarkSelectionResource() {
return DefaultResources.markSelection;
}
public static Resource<OperationHistoryListener> getOperationHistoryResource() {
return DefaultResources.operationHistory;
}
public static Resource<PageListener> getPageResource() {
return DefaultResources.page;
}
public static Resource<PartListener> getPartResource() {
return DefaultResources.part;
}
public static Resource<PerspectiveListener> getPerspectiveResource() {
return DefaultResources.perspective;
}
public static Resource<RefactoringExecutionListener> getRefactoringExecutionResource() {
return DefaultResources.refactoringExecution;
}
public static Resource<RefactoringHistoryListener> getRefactoringHistoryResource() {
return DefaultResources.refactoringHistory;
}
public static Resource<ResourceListener> getResourceResource() {
return DefaultResources.resource;
}
public static Resource<SearchQueryListener> getSearchQueryResource() {
return DefaultResources.searchQuery;
}
public static Resource<SearchResultListener> getSearchResultResource() {
return DefaultResources.searchResult;
}
public static Resource<SelectionListener> getSelectionResource() {
return DefaultResources.selection;
}
public static Resource<StructuredSelectionListener> getStructuredSelectionResource() {
return DefaultResources.structuredSelection;
}
public static Resource<TestRunListener> getTestRunResource() {
return DefaultResources.testRun;
}
public static Resource<TextListener> getTextResource() {
return DefaultResources.text;
}
public static Resource<TextInputListener> getTextInputResource() {
return DefaultResources.textInput;
}
public static Resource<TextPresentationListener> getTextPresentationResource() {
return DefaultResources.textPresentation;
}
public static Resource<TextSelectionListener> getTextSelectionResource() {
return DefaultResources.textSelection;
}
public static Resource<ViewListener> getViewResource() {
return DefaultResources.view;
}
public static Resource<ViewportListener> getViewportResource() {
return DefaultResources.viewport;
}
public static Resource<WindowListener> getWindowResource() {
return DefaultResources.window;
}
public static Resource<WorkbenchListener> getWorkbenchResource() {
return DefaultResources.workbench;
}
}