update copyright
[fedora-idea.git] / java / idea-ui / src / com / intellij / util / descriptors / impl / ConfigFileInfoSetImpl.java
blob89546d3db9f3988ded96dbc0512697f300e8a967
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.intellij.util.descriptors.impl;
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;
30 import java.util.*;
32 /**
33 * @author nik
35 public class ConfigFileInfoSetImpl implements ConfigFileInfoSet {
36 private static final Logger LOG = Logger.getInstance("#com.intellij.util.descriptors.impl.ConfigFileInfoSetImpl");
37 @NonNls private static final String ELEMENT_NAME = "deploymentDescriptor";
38 @NonNls private static final String ID_ATTRIBUTE = "name";
39 @NonNls private static final String URL_ATTRIBUTE = "url";
40 private final MultiValuesMap<ConfigFileMetaData, ConfigFileInfo> myConfigFiles = new MultiValuesMap<ConfigFileMetaData, ConfigFileInfo>();
41 private @Nullable ConfigFileContainerImpl myContainer;
42 private final ConfigFileMetaDataProvider myMetaDataProvider;
44 public ConfigFileInfoSetImpl(final @NotNull ConfigFileContainerImpl container) {
45 myContainer = container;
46 myMetaDataProvider = container.getMetaDataProvider();
49 public ConfigFileInfoSetImpl(final ConfigFileMetaDataProvider metaDataProvider) {
50 myMetaDataProvider = metaDataProvider;
53 public void addConfigFile(ConfigFileInfo descriptor) {
54 myConfigFiles.put(descriptor.getMetaData(), descriptor);
55 onChange();
58 public void addConfigFile(final ConfigFileMetaData metaData, final String url) {
59 addConfigFile(new ConfigFileInfo(metaData, url));
62 public void removeConfigFile(ConfigFileInfo descriptor) {
63 myConfigFiles.remove(descriptor.getMetaData(), descriptor);
64 onChange();
67 public void replaceConfigFile(final ConfigFileMetaData metaData, final String newUrl) {
68 myConfigFiles.removeAll(metaData);
69 addConfigFile(new ConfigFileInfo(metaData, newUrl));
72 public ConfigFileInfo updateConfigFile(ConfigFile configFile) {
73 myConfigFiles.remove(configFile.getMetaData(), configFile.getInfo());
74 ConfigFileInfo info = new ConfigFileInfo(configFile.getMetaData(), configFile.getUrl());
75 myConfigFiles.put(info.getMetaData(), info);
76 ((ConfigFileImpl)configFile).setInfo(info);
77 return info;
80 public void removeConfigFiles(final ConfigFileMetaData... metaData) {
81 for (ConfigFileMetaData data : metaData) {
82 myConfigFiles.removeAll(data);
84 onChange();
87 @NotNull
88 public Collection<ConfigFileInfo> getDescriptors(ConfigFileMetaData metaData) {
89 final Collection<ConfigFileInfo> collection = myConfigFiles.get(metaData);
90 return collection != null ? Collections.unmodifiableCollection(collection) : Collections.<ConfigFileInfo>emptyList();
93 @Nullable
94 public ConfigFileInfo getConfigFileInfo(ConfigFileMetaData metaData) {
95 final Collection<ConfigFileInfo> descriptors = myConfigFiles.get(metaData);
96 if (descriptors == null || descriptors.isEmpty()) {
97 return null;
99 return descriptors.iterator().next();
102 public ConfigFileInfo[] getConfigFileInfos() {
103 final Collection<ConfigFileInfo> configurations = myConfigFiles.values();
104 return configurations.toArray(new ConfigFileInfo[configurations.size()]);
107 public void setConfigFileInfos(final Collection<ConfigFileInfo> descriptors) {
108 myConfigFiles.clear();
109 for (ConfigFileInfo descriptor : descriptors) {
110 myConfigFiles.put(descriptor.getMetaData(), descriptor);
112 onChange();
115 private void onChange() {
116 if (myContainer != null) {
117 myContainer.updateDescriptors(myConfigFiles);
122 public ConfigFileMetaDataProvider getMetaDataProvider() {
123 return myMetaDataProvider;
126 public void readExternal(final Element element) throws InvalidDataException {
127 myConfigFiles.clear();
128 List<Element> children = element.getChildren(ELEMENT_NAME);
129 for (Element child : children) {
130 final String id = child.getAttributeValue(ID_ATTRIBUTE);
131 if (id != null) {
132 final ConfigFileMetaData metaData = myMetaDataProvider.findMetaData(id);
133 if (metaData != null) {
134 final String url = child.getAttributeValue(URL_ATTRIBUTE);
135 myConfigFiles.put(metaData, new ConfigFileInfo(metaData, url));
139 onChange();
142 @SuppressWarnings({"HardCodedStringLiteral"})
143 public void writeExternal(final Element element) throws WriteExternalException {
144 final TreeSet<ConfigFileInfo> sortedConfigFiles = new TreeSet<ConfigFileInfo>(new Comparator<ConfigFileInfo>() {
145 public int compare(final ConfigFileInfo o1, final ConfigFileInfo o2) {
146 final int id = Comparing.compare(o1.getMetaData().getId(), o2.getMetaData().getId());
147 return id != 0? id : Comparing.compare(o1.getUrl(), o2.getUrl());
150 sortedConfigFiles.addAll(myConfigFiles.collectValues());
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);
160 public void setContainer(@NotNull ConfigFileContainerImpl container) {
161 LOG.assertTrue(myContainer == null);
162 myContainer = container;
163 myContainer.updateDescriptors(myConfigFiles);