2 * Copyright (c) 2007, Your Corporation. All Rights Reserved.
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
;
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
) {
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
);
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
) {
74 public VirtualFile
getVirtualFile() {
75 return myFilePointer
.getFile();
79 public PsiFile
getPsiFile() {
81 synchronized (myPsiFileLock
) {
85 if (psiFile
!= null && psiFile
.isValid()) {
89 VirtualFile virtualFile
= getVirtualFile();
90 if (virtualFile
== null || !virtualFile
.isValid()) return null;
92 psiFile
= PsiManager
.getInstance(myProject
).findFile(virtualFile
);
94 synchronized (myPsiFileLock
) {
102 public XmlFile
getXmlFile() {
103 final PsiFile file
= getPsiFile();
104 return file
instanceof XmlFile ?
(XmlFile
)file
: null;
107 public void dispose() {
111 public ConfigFileInfo
getInfo() {
115 public boolean isValid() {
116 final PsiFile psiFile
= getPsiFile();
117 if (psiFile
== null || !psiFile
.isValid()) {
120 if (psiFile
instanceof XmlFile
) {
121 final XmlDocument document
= ((XmlFile
)psiFile
).getDocument();
122 return document
!= null && document
.getRootTag() != null;
129 public ConfigFileMetaData
getMetaData() {
130 return myInfo
.getMetaData();
134 public long getModificationCount() {
135 return myModificationCount
;