f2475dee7050d84bf1d0640665d34300fe2e6fb6
[idea/community.git] / platform / lang-impl / src / com / intellij / facet / impl / FacetModelImpl.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.facet.impl;
18
19 import com.intellij.facet.Facet;
20 import com.intellij.facet.FacetManagerImpl;
21 import com.intellij.facet.ModifiableFacetModel;
22 import com.intellij.openapi.Disposable;
23 import com.intellij.openapi.diagnostic.Logger;
24 import com.intellij.openapi.roots.ProjectModelExternalSource;
25 import com.intellij.openapi.util.Disposer;
26 import com.intellij.util.ArrayUtil;
27 import com.intellij.util.containers.ContainerUtil;
28 import org.jetbrains.annotations.NotNull;
29 import org.jetbrains.annotations.Nullable;
30
31 import java.util.*;
32
33 public class FacetModelImpl extends FacetModelBase implements ModifiableFacetModel {
34   private static final Logger LOG = Logger.getInstance(FacetModelImpl.class);
35   private final List<Facet> myFacets = new ArrayList<>();
36   private final Map<Facet, String> myFacet2NewName = new HashMap<>();
37   private final FacetManagerImpl myManager;
38   private final List<Listener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList();
39
40   public FacetModelImpl(final FacetManagerImpl manager) {
41     myManager = manager;
42   }
43
44   public void addFacetsFromManager() {
45     for (Facet facet : myManager.getAllFacets()) {
46       addFacet(facet);
47     }
48   }
49
50   @Override
51   public void addFacet(Facet facet) {
52     if (myFacets.contains(facet)) {
53       LOG.error("Facet " + facet + " [" + facet.getTypeId() + "] is already added");
54     }
55
56     myFacets.add(facet);
57     facetsChanged();
58   }
59
60   @Override
61   public void addFacet(Facet facet, @Nullable ProjectModelExternalSource externalSource) {
62     addFacet(facet);
63     myManager.setExternalSource(facet, externalSource);
64   }
65
66   @Override
67   public void removeFacet(Facet facet) {
68     if (!myFacets.remove(facet)) {
69       LOG.error("Facet " + facet + " [" + facet.getTypeId() + "] not found");
70     }
71     myFacet2NewName.remove(facet);
72     facetsChanged();
73   }
74
75   @Override
76   public void rename(final Facet facet, final String newName) {
77     if (!newName.equals(facet.getName())) {
78       myFacet2NewName.put(facet, newName);
79     } else {
80       myFacet2NewName.remove(facet);
81     }
82     facetsChanged();
83   }
84
85   @Override
86   @Nullable
87   public String getNewName(final Facet facet) {
88     return myFacet2NewName.get(facet);
89   }
90
91   @Override
92   public void commit() {
93     myManager.commit(this);
94   }
95
96   @Override
97   public boolean isModified() {
98     return !new HashSet<>(myFacets).equals(ContainerUtil.set(myManager.getAllFacets())) || !myFacet2NewName.isEmpty();
99   }
100
101   @Override
102   public boolean isNewFacet(final Facet facet) {
103     return myFacets.contains(facet) && ArrayUtil.find(myManager.getAllFacets(), facet) == -1;
104   }
105
106   @Override
107   public Facet @NotNull [] getAllFacets() {
108     return myFacets.toArray(Facet.EMPTY_ARRAY);
109   }
110
111   @Override
112   @NotNull
113   public String getFacetName(@NotNull final Facet facet) {
114     return myFacet2NewName.containsKey(facet) ? myFacet2NewName.get(facet) : facet.getName();
115   }
116
117   @Override
118   public void addListener(@NotNull final Listener listener, @NotNull Disposable parentDisposable) {
119     myListeners.add(listener);
120     Disposer.register(parentDisposable, () -> myListeners.remove(listener));
121   }
122
123   @Override
124   protected void facetsChanged() {
125     super.facetsChanged();
126     for (Listener each : myListeners) {
127       each.onChanged();
128     }
129   }
130 }