b5f0e1bf1b52102bf14a360807d8bd7fec1122c8
[idea/community.git] / platform / core-api / src / com / intellij / openapi / components / ServiceManager.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.openapi.components;
3
4 import com.intellij.openapi.application.ApplicationManager;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.openapi.util.NotNullLazyKey;
7 import org.jetbrains.annotations.NotNull;
8 import org.jetbrains.annotations.Nullable;
9
10 /**
11  * For old-style components, the contract specifies a lifecycle: the component gets created and notified during the project opening process.
12  * For services, there's no such contract, so we don't even load the class implementing the service until someone requests it.
13  */
14 public final class ServiceManager {
15   private ServiceManager() { }
16
17   public static <T> T getService(@NotNull Class<T> serviceClass) {
18     return ApplicationManager.getApplication().getService(serviceClass, true);
19   }
20
21   public static <T> T getService(@NotNull Project project, @NotNull Class<T> serviceClass) {
22     return project.getService(serviceClass, true);
23   }
24
25   @Nullable
26   public static <T> T getServiceIfCreated(@NotNull Project project, @NotNull Class<T> serviceClass) {
27     return project.getService(serviceClass, false);
28   }
29
30   @Nullable
31   public static <T> T getServiceIfCreated(@NotNull Class<T> serviceClass) {
32     return ApplicationManager.getApplication().getService(serviceClass, false);
33   }
34
35   /**
36    * Creates lazy caching key to store project-level service instance from {@link #getService(Project, Class)}.
37    *
38    * @param serviceClass Service class to create key for.
39    * @param <T>          Service class type.
40    * @return Key instance.
41    */
42   @NotNull
43   public static <T> NotNullLazyKey<T, Project> createLazyKey(@NotNull final Class<? extends T> serviceClass) {
44     return NotNullLazyKey.create("Service: " + serviceClass.getName(), project -> project.getService(serviceClass));
45   }
46 }