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
;
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
);
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
);
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
);
80 public void removeConfigFiles(final ConfigFileMetaData
... metaData
) {
81 for (ConfigFileMetaData data
: metaData
) {
82 myConfigFiles
.removeAll(data
);
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();
94 public ConfigFileInfo
getConfigFileInfo(ConfigFileMetaData metaData
) {
95 final Collection
<ConfigFileInfo
> descriptors
= myConfigFiles
.get(metaData
);
96 if (descriptors
== null || descriptors
.isEmpty()) {
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
);
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
);
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
));
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
);