EditorConfig documentation test
[idea/community.git] / java / idea-ui / src / com / intellij / util / descriptors / impl / ConfigFileInfoSetImpl.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.util.descriptors.impl;
18
19 import com.intellij.openapi.diagnostic.Logger;
20 import com.intellij.openapi.util.Comparing;
21 import com.intellij.openapi.util.InvalidDataException;
22 import com.intellij.openapi.util.MultiValuesMap;
23 import com.intellij.openapi.util.WriteExternalException;
24 import com.intellij.util.descriptors.*;
25 import org.jdom.Element;
26 import org.jetbrains.annotations.NonNls;
27 import org.jetbrains.annotations.NotNull;
28 import org.jetbrains.annotations.Nullable;
29
30 import java.util.Collection;
31 import java.util.List;
32 import java.util.TreeSet;
33
34 /**
35  * @author nik
36  */
37 public class ConfigFileInfoSetImpl implements ConfigFileInfoSet {
38   private static final Logger LOG = Logger.getInstance("#com.intellij.util.descriptors.impl.ConfigFileInfoSetImpl");
39   @NonNls private static final String ELEMENT_NAME = "deploymentDescriptor";
40   @NonNls private static final String ID_ATTRIBUTE = "name";
41   @NonNls private static final String URL_ATTRIBUTE = "url";
42   private final MultiValuesMap<ConfigFileMetaData, ConfigFileInfo> myConfigFiles = new MultiValuesMap<>();
43   private @Nullable ConfigFileContainerImpl myContainer;
44   private final ConfigFileMetaDataProvider myMetaDataProvider;
45
46   public ConfigFileInfoSetImpl(final ConfigFileMetaDataProvider metaDataProvider) {
47     myMetaDataProvider = metaDataProvider;
48   }
49
50   @Override
51   public void addConfigFile(ConfigFileInfo descriptor) {
52     myConfigFiles.put(descriptor.getMetaData(), descriptor);
53     onChange();
54   }
55
56   @Override
57   public void addConfigFile(final ConfigFileMetaData metaData, final String url) {
58     addConfigFile(new ConfigFileInfo(metaData, url));
59   }
60
61   @Override
62   public void removeConfigFile(ConfigFileInfo descriptor) {
63     myConfigFiles.remove(descriptor.getMetaData(), descriptor);
64     onChange();
65   }
66
67   @Override
68   public void replaceConfigFile(final ConfigFileMetaData metaData, final String newUrl) {
69     myConfigFiles.removeAll(metaData);
70     addConfigFile(new ConfigFileInfo(metaData, newUrl));
71   }
72
73   public ConfigFileInfo updateConfigFile(ConfigFile configFile) {
74     myConfigFiles.remove(configFile.getMetaData(), configFile.getInfo());
75     ConfigFileInfo info = new ConfigFileInfo(configFile.getMetaData(), configFile.getUrl());
76     myConfigFiles.put(info.getMetaData(), info);
77     ((ConfigFileImpl)configFile).setInfo(info);
78     return info;
79   }
80
81   @Override
82   public void removeConfigFiles(final ConfigFileMetaData... metaData) {
83     for (ConfigFileMetaData data : metaData) {
84       myConfigFiles.removeAll(data);
85     }
86     onChange();
87   }
88
89   @Override
90   @Nullable
91   public ConfigFileInfo getConfigFileInfo(ConfigFileMetaData metaData) {
92     final Collection<ConfigFileInfo> descriptors = myConfigFiles.get(metaData);
93     if (descriptors == null || descriptors.isEmpty()) {
94       return null;
95     }
96     return descriptors.iterator().next();
97   }
98
99   @Override
100   public ConfigFileInfo[] getConfigFileInfos() {
101     final Collection<ConfigFileInfo> configurations = myConfigFiles.values();
102     return configurations.toArray(new ConfigFileInfo[0]);
103   }
104
105   @Override
106   public void setConfigFileInfos(final Collection<? extends ConfigFileInfo> descriptors) {
107     myConfigFiles.clear();
108     for (ConfigFileInfo descriptor : descriptors) {
109       myConfigFiles.put(descriptor.getMetaData(), descriptor);
110     }
111     onChange();
112   }
113
114   private void onChange() {
115     if (myContainer != null) {
116       myContainer.updateDescriptors(myConfigFiles);
117     }
118   }
119
120
121   @Override
122   public ConfigFileMetaDataProvider getMetaDataProvider() {
123     return myMetaDataProvider;
124   }
125
126   @Override
127   public void readExternal(final Element element) throws InvalidDataException {
128     myConfigFiles.clear();
129     List<Element> children = element.getChildren(ELEMENT_NAME);
130     for (Element child : children) {
131       final String id = child.getAttributeValue(ID_ATTRIBUTE);
132       if (id != null) {
133         final ConfigFileMetaData metaData = myMetaDataProvider.findMetaData(id);
134         if (metaData != null) {
135           final String url = child.getAttributeValue(URL_ATTRIBUTE);
136           if (url == null) throw new InvalidDataException(URL_ATTRIBUTE + " attribute not specified for " + id + " descriptor");
137           myConfigFiles.put(metaData, new ConfigFileInfo(metaData, url));
138         }
139       }
140     }
141     onChange();
142   }
143
144   @Override
145   public void writeExternal(final Element element) throws WriteExternalException {
146     final TreeSet<ConfigFileInfo> sortedConfigFiles = new TreeSet<>((o1, o2) -> {
147       final int id = Comparing.compare(o1.getMetaData().getId(), o2.getMetaData().getId());
148       return id != 0 ? id : Comparing.compare(o1.getUrl(), o2.getUrl());
149     });
150     sortedConfigFiles.addAll(myConfigFiles.values());
151     for (ConfigFileInfo configuration : sortedConfigFiles) {
152       final Element child = new Element(ELEMENT_NAME);
153       final ConfigFileMetaData metaData = configuration.getMetaData();
154       child.setAttribute(ID_ATTRIBUTE, metaData.getId());
155       child.setAttribute(URL_ATTRIBUTE, configuration.getUrl());
156       element.addContent(child);
157     }
158   }
159
160   public void setContainer(@NotNull ConfigFileContainerImpl container) {
161     LOG.assertTrue(myContainer == null);
162     myContainer = container;
163     myContainer.updateDescriptors(myConfigFiles);
164   }
165 }