notnull
[idea/community.git] / platform / lang-impl / src / com / intellij / openapi / projectRoots / impl / SimpleProjectRoot.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
17 package com.intellij.openapi.projectRoots.impl;
18
19 import com.intellij.openapi.projectRoots.ex.ProjectRoot;
20 import com.intellij.openapi.util.InvalidDataException;
21 import com.intellij.openapi.util.JDOMExternalizable;
22 import com.intellij.openapi.util.WriteExternalException;
23 import com.intellij.openapi.vfs.JarFileSystem;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.openapi.vfs.VirtualFileManager;
26 import com.intellij.openapi.vfs.ex.http.HttpFileSystem;
27 import org.jdom.Element;
28 import org.jetbrains.annotations.NonNls;
29 import org.jetbrains.annotations.NotNull;
30
31 import java.io.File;
32
33 /**
34  * @author mike
35  */
36 public class SimpleProjectRoot implements ProjectRoot, JDOMExternalizable {
37   private String myUrl;
38   private VirtualFile myFile;
39   private final VirtualFile[] myFileArrray = new VirtualFile[1];
40   private boolean myInitialized = false;
41   @NonNls private static final String ATTRIBUTE_URL = "url";
42
43   SimpleProjectRoot(@NotNull VirtualFile file) {
44     myFile = file;
45     myUrl = myFile.getUrl();
46   }
47
48   public SimpleProjectRoot(@NotNull String url) {
49     myUrl = url;
50   }
51
52   SimpleProjectRoot() {
53   }
54
55   public VirtualFile getFile() {
56     return myFile;
57   }
58
59   public String getPresentableString() {
60     String path = VirtualFileManager.extractPath(myUrl);
61     if (path.endsWith(JarFileSystem.JAR_SEPARATOR)) {
62       path = path.substring(0, path.length() - JarFileSystem.JAR_SEPARATOR.length());
63     }
64     return path.replace('/', File.separatorChar);
65   }
66
67   public VirtualFile[] getVirtualFiles() {
68     if (!myInitialized) initialize();
69
70     if (myFile == null) {
71       return VirtualFile.EMPTY_ARRAY;
72     }
73
74     myFileArrray[0] = myFile;
75     return myFileArrray;
76   }
77
78   public String[] getUrls() {
79     return new String[]{myUrl};
80   }
81
82   public boolean isValid() {
83     if (!myInitialized) {
84       initialize();
85     }
86
87     return myFile != null && myFile.isValid();
88   }
89
90   public void update() {
91     initialize();
92   }
93
94   private void initialize() {
95     myInitialized = true;
96
97     if (myFile == null || !myFile.isValid()) {
98       myFile = VirtualFileManager.getInstance().findFileByUrl(myUrl);
99       if (myFile != null && cantHaveChildren()) {
100         myFile = null;
101       }
102     }
103   }
104
105   private boolean cantHaveChildren() {
106     if (myFile.getFileSystem() instanceof HttpFileSystem) return false;
107     return !myFile.isDirectory();
108   }
109
110   public String getUrl() {
111     return myUrl;
112   }
113
114   public void readExternal(Element element) throws InvalidDataException {
115     myUrl = element.getAttributeValue(ATTRIBUTE_URL);
116   }
117
118   public void writeExternal(Element element) throws WriteExternalException {
119     if (!myInitialized) {
120       initialize();
121     }
122
123     element.setAttribute(ATTRIBUTE_URL, myUrl);
124   }
125
126 }