fix compilation
[idea/community.git] / plugins / ant / src / com / intellij / lang / ant / AntSupport.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 package com.intellij.lang.ant;
17
18 import com.intellij.lang.CompositeLanguage;
19 import com.intellij.lang.StdLanguages;
20 import com.intellij.lang.ant.dom.AntDomAntlib;
21 import com.intellij.lang.ant.dom.AntDomElement;
22 import com.intellij.lang.ant.dom.AntDomProject;
23 import com.intellij.lang.ant.psi.AntFile;
24 import com.intellij.lang.ant.psi.changes.AntChangeVisitor;
25 import com.intellij.lang.xml.XMLLanguage;
26 import com.intellij.openapi.components.ApplicationComponent;
27 import com.intellij.openapi.fileTypes.FileType;
28 import com.intellij.openapi.fileTypes.FileTypeManager;
29 import com.intellij.openapi.fileTypes.LanguageFileType;
30 import com.intellij.openapi.project.Project;
31 import com.intellij.openapi.vfs.VirtualFile;
32 import com.intellij.psi.FileViewProvider;
33 import com.intellij.psi.PsiFile;
34 import com.intellij.psi.PsiManager;
35 import com.intellij.psi.xml.XmlFile;
36 import com.intellij.psi.xml.XmlTag;
37 import com.intellij.util.xml.ConvertContext;
38 import com.intellij.util.xml.DomElement;
39 import com.intellij.util.xml.DomFileElement;
40 import com.intellij.util.xml.DomManager;
41 import org.jetbrains.annotations.NonNls;
42 import org.jetbrains.annotations.NotNull;
43 import org.jetbrains.annotations.Nullable;
44
45 import java.util.*;
46
47 public class AntSupport implements ApplicationComponent {
48   private static LanguageFileType ourFileType = null;
49   private static AntLanguage ourLanguage = null;
50   private static AntChangeVisitor ourChangeVisitor = null;
51   private static final Map<AntFile, WeakHashMap<AntFile, Boolean>> ourFileDependencies = new WeakHashMap<AntFile, WeakHashMap<AntFile, Boolean>>();
52
53   public AntSupport(FileTypeManager fileTypeManager) {
54     fileTypeManager.getRegisteredFileTypes();
55     ((CompositeLanguage)StdLanguages.XML).registerLanguageExtension(new AntLanguageExtension());
56   }
57
58   public static synchronized AntLanguage getLanguage() {
59     if (ourLanguage == null) {
60       if (ourFileType == null) {
61         ourFileType = new AntFileType();
62       }
63       ourLanguage = (AntLanguage)ourFileType.getLanguage();
64     }
65     return ourLanguage;
66   }
67
68   public static synchronized AntChangeVisitor getChangeVisitor() {
69     if (ourChangeVisitor == null) {
70       ourChangeVisitor = new AntChangeVisitor();
71     }
72     return ourChangeVisitor;
73   }
74
75   @NotNull
76   @NonNls
77   public String getComponentName() {
78     return "AntSupport";
79   }
80
81   public void initComponent() {
82   }
83
84   public void disposeComponent() {
85   }
86
87   public static void markFileAsAntFile(final VirtualFile file, final FileViewProvider viewProvider, final boolean value) {
88     if (file.isValid() && ForcedAntFileAttribute.isAntFile(file) != value) {
89       ForcedAntFileAttribute.forceAntFile(file, value);
90       viewProvider.contentsSynchronized();
91     }
92   }
93
94   //
95   // Managing ant files dependencies via the <import> task.
96   //
97
98   public static synchronized List<AntFile> getImportingFiles(final AntFile imported) {
99     final WeakHashMap<AntFile, Boolean> files = ourFileDependencies.get(imported);
100     if (files != null) {
101       final int size = files.size();
102       if (size > 0) {
103         final List<AntFile> result = new ArrayList<AntFile>(size);
104         for (final AntFile file : files.keySet()) {
105           if (file != null) {
106             result.add(file);
107           }
108         }
109         return result;
110       }
111     }
112     return Collections.emptyList();
113   }
114
115   public static synchronized void registerDependency(final AntFile importing, final AntFile imported) {
116     final Map<AntFile, WeakHashMap<AntFile,Boolean>> dependencies = ourFileDependencies;
117     WeakHashMap<AntFile, Boolean> files = dependencies.get(imported);
118     if(files == null) {
119       files = new WeakHashMap<AntFile, Boolean>();
120       dependencies.put(imported, files);
121     }
122     files.put(importing, true);
123   }
124
125   public static AntFile getAntFile ( PsiFile psiFile ) {
126     if (psiFile instanceof AntFile) {
127       return (AntFile)psiFile;
128     }
129     else {
130       return (AntFile)psiFile.getViewProvider().getPsi(getLanguage());
131     }
132   }
133
134   @Nullable
135   public static AntDomProject getAntDomProject(PsiFile psiFile) {
136     if (psiFile instanceof XmlFile) {
137       final DomManager domManager = DomManager.getDomManager(psiFile.getProject());
138       final DomFileElement<AntDomProject> fileElement = domManager.getFileElement((XmlFile)psiFile, AntDomProject.class);
139       return fileElement != null? fileElement.getRootElement() : null;
140     }
141     return null;
142   }
143
144   @Nullable
145   public static AntDomAntlib getAntLib(PsiFile psiFile) {
146     if (psiFile instanceof XmlFile) {
147       final DomManager domManager = DomManager.getDomManager(psiFile.getProject());
148       final DomFileElement<AntDomAntlib> fileElement = domManager.getFileElement((XmlFile)psiFile, AntDomAntlib.class);
149       return fileElement != null? fileElement.getRootElement() : null;
150     }
151     return null;
152   }
153
154   @Nullable
155   public static AntDomElement getAntDomElement(XmlTag xmlTag) {
156     final DomElement domElement = DomManager.getDomManager(xmlTag.getProject()).getDomElement(xmlTag);
157     return domElement instanceof AntDomElement? (AntDomElement)domElement : null;
158   }
159
160   @Nullable
161   public static AntFile toAntFile(VirtualFile vFile, final Project project) {
162     if (vFile == null) {
163       return null;
164     }
165     final FileType fileType = vFile.getFileType();
166     if (fileType instanceof AntFileType || XMLLanguage.INSTANCE.getAssociatedFileType() == fileType) {
167       final PsiFile psiFile = PsiManager.getInstance(project).findFile(vFile);
168       return psiFile != null? getAntFile(psiFile) : null;
169     }
170     return null;
171   }
172
173   @Nullable
174   public static AntDomElement getInvocationAntDomElement(ConvertContext context) {
175     return context.getInvocationElement().getParentOfType(AntDomElement.class, false);
176   }
177 }