update copyright
[fedora-idea.git] / xml / dom-impl / src / com / intellij / util / xml / impl / DomApplicationComponent.java
blob15dcfb641311e83b922971072071b837f4ac9f03
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.
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;
32 import java.util.Set;
34 /**
35 * @author peter
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;
59 return false;
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);
88 @Nullable
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);
94 return set;
97 @Nullable
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;
107 return null;