[platform] get rid of some raw types in facets API and impl
[idea/community.git] / platform / lang-impl / src / com / intellij / facet / impl / FacetTypeRegistryImpl.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.facet.impl;
3
4 import com.intellij.facet.*;
5 import com.intellij.openapi.diagnostic.Logger;
6 import com.intellij.openapi.extensions.ExtensionPointListener;
7 import com.intellij.openapi.extensions.PluginDescriptor;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.Nullable;
10
11 import java.util.*;
12
13 public class FacetTypeRegistryImpl extends FacetTypeRegistry {
14   private static final Logger LOG = Logger.getInstance(FacetTypeRegistryImpl.class);
15   private static final Comparator<FacetType<?, ?>> FACET_TYPE_COMPARATOR =
16     (o1, o2) -> o1.getPresentableName().compareToIgnoreCase(o2.getPresentableName());
17   private final Map<String, FacetTypeId<?>> myTypeIds = new HashMap<>();
18   private final Map<FacetTypeId<?>, FacetType<?, ?>> myFacetTypes = new HashMap<>();
19   private boolean myExtensionsLoaded = false;
20
21   @Override
22   public synchronized void registerFacetType(FacetType<?, ?> facetType) {
23     final FacetTypeId<?> typeId = facetType.getId();
24     String id = facetType.getStringId();
25     LOG.assertTrue(!id.contains("/"), "Facet type id '" + id + "' contains illegal character '/'");
26     LOG.assertTrue(!myFacetTypes.containsKey(typeId), "Facet type '" + id + "' is already registered");
27     myFacetTypes.put(typeId, facetType);
28
29     LOG.assertTrue(!myTypeIds.containsKey(id), "Facet type id '" + id + "' is already registered");
30     myTypeIds.put(id, typeId);
31   }
32
33   @Override
34   public synchronized void unregisterFacetType(FacetType<?, ?> facetType) {
35     final FacetTypeId<?> id = facetType.getId();
36     final String stringId = facetType.getStringId();
37     LOG.assertTrue(myFacetTypes.remove(id) != null, "Facet type '" + stringId + "' is not registered");
38     myFacetTypes.remove(id);
39     myTypeIds.remove(stringId);
40   }
41
42   @Override
43   public synchronized FacetTypeId<?> @NotNull [] getFacetTypeIds() {
44     loadExtensions();
45     final Set<FacetTypeId<?>> ids = myFacetTypes.keySet();
46     return ids.toArray(new FacetTypeId[0]);
47   }
48
49   @Override
50   public synchronized FacetType<?, ?> @NotNull [] getFacetTypes() {
51     loadExtensions();
52     final Collection<FacetType<?, ?>> types = myFacetTypes.values();
53     final FacetType<?, ?>[] facetTypes = types.toArray(new FacetType[0]);
54     Arrays.sort(facetTypes, FACET_TYPE_COMPARATOR);
55     return facetTypes;
56   }
57
58   @Override
59   public FacetType<?, ?> @NotNull [] getSortedFacetTypes() {
60     final FacetType<?, ?>[] types = getFacetTypes();
61     Arrays.sort(types, FACET_TYPE_COMPARATOR);
62     return types;
63   }
64
65   @Override
66   @Nullable
67   public synchronized FacetType findFacetType(String id) {
68     loadExtensions();
69     final FacetTypeId<?> typeId = myTypeIds.get(id);
70     return typeId == null ? null : myFacetTypes.get(typeId);
71   }
72
73   @NotNull
74   @Override
75   public synchronized <F extends Facet<C>, C extends FacetConfiguration> FacetType<F, C> findFacetType(@NotNull FacetTypeId<F> typeId) {
76     loadExtensions();
77     @SuppressWarnings("unchecked")
78     FacetType<F, C> type = (FacetType<F, C>)myFacetTypes.get(typeId);
79     LOG.assertTrue(type != null, "Cannot find facet by id '" + typeId + "'");
80     return type;
81   }
82
83   private void loadExtensions() {
84     if (myExtensionsLoaded) {
85       return;
86     }
87
88     FacetType.EP_NAME.getPoint(null).addExtensionPointListener(new ExtensionPointListener<FacetType>() {
89       @Override
90       public void extensionAdded(@NotNull final FacetType extension, @NotNull final PluginDescriptor pluginDescriptor) {
91         registerFacetType(extension);
92       }
93
94       @Override
95       public void extensionRemoved(@NotNull final FacetType extension, @NotNull final PluginDescriptor pluginDescriptor) {
96         unregisterFacetType(extension);
97       }
98     }, true, null);
99     myExtensionsLoaded = true;
100   }
101 }