deadlock fixed
[fedora-idea.git] / java / idea-ui / src / com / intellij / util / descriptors / impl / ConfigFileImpl.java
blobe5ec38df5b31a95a7141c83eeffca8bbd1b6644a
1 /*
2 * Copyright (c) 2007, Your Corporation. All Rights Reserved.
3 */
5 package com.intellij.util.descriptors.impl;
7 import com.intellij.openapi.project.Project;
8 import com.intellij.openapi.util.Disposer;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
11 import com.intellij.openapi.vfs.pointers.VirtualFilePointerListener;
12 import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager;
13 import com.intellij.psi.PsiFile;
14 import com.intellij.psi.PsiManager;
15 import com.intellij.psi.xml.XmlDocument;
16 import com.intellij.psi.xml.XmlFile;
17 import com.intellij.util.descriptors.ConfigFile;
18 import com.intellij.util.descriptors.ConfigFileInfo;
19 import com.intellij.util.descriptors.ConfigFileMetaData;
20 import org.jetbrains.annotations.NotNull;
21 import org.jetbrains.annotations.Nullable;
23 /**
24 * @author nik
26 public class ConfigFileImpl implements ConfigFile {
27 @NotNull private ConfigFileInfo myInfo;
28 private VirtualFilePointer myFilePointer;
29 private PsiFile myPsiFile;
30 private final ConfigFileContainerImpl myContainer;
31 private final Project myProject;
32 private long myModificationCount;
33 private final Object myPsiFileLock = new Object();
34 private final VirtualFilePointerListener myListener = new VirtualFilePointerListener() {
35 public void beforeValidityChanged(final VirtualFilePointer[] pointers) {
38 public void validityChanged(final VirtualFilePointer[] pointers) {
39 synchronized (myPsiFileLock) {
40 myPsiFile = null;
42 onChange();
46 public ConfigFileImpl(@NotNull final ConfigFileContainerImpl container, @NotNull final ConfigFileInfo configuration) {
47 myContainer = container;
48 myInfo = configuration;
49 setUrl(configuration.getUrl());
50 Disposer.register(container, this);
51 myProject = myContainer.getProject();
54 private void setUrl(String url) {
55 final VirtualFilePointerManager pointerManager = VirtualFilePointerManager.getInstance();
56 myFilePointer = pointerManager.create(url, this, myListener);
57 onChange();
60 private void onChange() {
61 myModificationCount++;
62 myContainer.fireDescriptorChanged(this);
65 public String getUrl() {
66 return myFilePointer.getUrl();
69 public void setInfo(@NotNull final ConfigFileInfo info) {
70 myInfo = info;
73 @Nullable
74 public VirtualFile getVirtualFile() {
75 return myFilePointer.getFile();
78 @Nullable
79 public PsiFile getPsiFile() {
80 PsiFile psiFile;
81 synchronized (myPsiFileLock) {
82 psiFile = myPsiFile;
85 if (psiFile != null && psiFile.isValid()) {
86 return psiFile;
89 VirtualFile virtualFile = getVirtualFile();
90 if (virtualFile == null || !virtualFile.isValid()) return null;
92 psiFile = PsiManager.getInstance(myProject).findFile(virtualFile);
94 synchronized (myPsiFileLock) {
95 myPsiFile = psiFile;
98 return psiFile;
101 @Nullable
102 public XmlFile getXmlFile() {
103 final PsiFile file = getPsiFile();
104 return file instanceof XmlFile ? (XmlFile)file : null;
107 public void dispose() {
110 @NotNull
111 public ConfigFileInfo getInfo() {
112 return myInfo;
115 public boolean isValid() {
116 final PsiFile psiFile = getPsiFile();
117 if (psiFile == null || !psiFile.isValid()) {
118 return false;
120 if (psiFile instanceof XmlFile) {
121 final XmlDocument document = ((XmlFile)psiFile).getDocument();
122 return document != null && document.getRootTag() != null;
124 return true;
128 @NotNull
129 public ConfigFileMetaData getMetaData() {
130 return myInfo.getMetaData();
134 public long getModificationCount() {
135 return myModificationCount;