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.
16 package com
.intellij
.util
.xml
.impl
;
18 import com
.intellij
.openapi
.application
.ApplicationManager
;
19 import com
.intellij
.openapi
.extensions
.Extensions
;
20 import com
.intellij
.psi
.PsiElement
;
21 import com
.intellij
.psi
.filters
.ElementFilter
;
22 import com
.intellij
.psi
.meta
.MetaDataRegistrar
;
23 import com
.intellij
.psi
.xml
.XmlTag
;
24 import com
.intellij
.util
.containers
.FactoryMap
;
25 import com
.intellij
.util
.xml
.DomElement
;
26 import com
.intellij
.util
.xml
.DomFileDescription
;
27 import com
.intellij
.util
.xml
.DomManager
;
28 import com
.intellij
.util
.xml
.DomMetaData
;
29 import gnu
.trove
.THashSet
;
30 import org
.jetbrains
.annotations
.Nullable
;
37 public class DomApplicationComponent
{
38 private final FactoryMap
<String
,Set
<DomFileDescription
>> myRootTagName2FileDescription
= new FactoryMap
<String
, Set
<DomFileDescription
>>() {
39 protected Set
<DomFileDescription
> create(final String key
) {
40 return new THashSet
<DomFileDescription
>();
43 private final Set
<DomFileDescription
> myAcceptingOtherRootTagNamesDescriptions
= new THashSet
<DomFileDescription
>();
45 public DomApplicationComponent() {
46 for (final DomFileDescription description
: Extensions
.getExtensions(DomFileDescription
.EP_NAME
)) {
47 registerFileDescription(description
);
50 MetaDataRegistrar
.getInstance().registerMetaData(new ElementFilter() {
51 public boolean isAcceptable(Object element
, PsiElement context
) {
52 if (element
instanceof XmlTag
) {
53 final XmlTag tag
= (XmlTag
)element
;
54 final DomElement domElement
= DomManager
.getDomManager(tag
.getProject()).getDomElement(tag
);
55 if (domElement
!= null) {
56 return domElement
.getGenericInfo().getNameDomElement(domElement
) != null;
62 public boolean isClassAcceptable(Class hintClass
) {
63 return XmlTag
.class.isAssignableFrom(hintClass
);
65 }, DomMetaData
.class);
69 public static DomApplicationComponent
getInstance() {
70 return ApplicationManager
.getApplication().getComponent(DomApplicationComponent
.class);
73 public final synchronized Set
<DomFileDescription
> getFileDescriptions(String rootTagName
) {
74 return myRootTagName2FileDescription
.get(rootTagName
);
77 public final synchronized Set
<DomFileDescription
> getAcceptingOtherRootTagNameDescriptions() {
78 return myAcceptingOtherRootTagNamesDescriptions
;
81 public final synchronized void registerFileDescription(final DomFileDescription description
) {
82 myRootTagName2FileDescription
.get(description
.getRootTagName()).add(description
);
83 if (description
.acceptsOtherRootTagNames()) {
84 myAcceptingOtherRootTagNamesDescriptions
.add(description
);
89 public final synchronized Set
<DomFileDescription
> getAllFileDescriptions() {
90 final THashSet
<DomFileDescription
> set
= new THashSet
<DomFileDescription
>(myAcceptingOtherRootTagNamesDescriptions
);
91 for (final Set
<DomFileDescription
> descriptions
: myRootTagName2FileDescription
.values()) {
92 set
.addAll(descriptions
);
98 public final synchronized DomFileDescription
findFileDescription(String className
) {
99 for (final Set
<DomFileDescription
> descriptions
: myRootTagName2FileDescription
.values()) {
100 for (final DomFileDescription description
: descriptions
) {
101 if (description
.getClass().getName().equals(className
)) return description
;
104 for (final DomFileDescription description
: myAcceptingOtherRootTagNamesDescriptions
) {
105 if (description
.getClass().getName().equals(className
)) return description
;