KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > util > JarFileEntryTypeInfo


1 /*******************************************************************************
2  * Copyright (c) 2000, 2006 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  *******************************************************************************/

11 package org.eclipse.jdt.internal.corext.util;
12
13 import java.net.URI JavaDoc;
14 import java.util.Arrays JavaDoc;
15 import java.util.List JavaDoc;
16
17 import org.eclipse.core.filesystem.EFS;
18 import org.eclipse.core.filesystem.IFileInfo;
19
20 import org.eclipse.core.runtime.CoreException;
21 import org.eclipse.core.runtime.IPath;
22 import org.eclipse.core.runtime.Path;
23
24 import org.eclipse.core.resources.IResource;
25 import org.eclipse.core.resources.IWorkspaceRoot;
26 import org.eclipse.core.resources.ResourcesPlugin;
27
28 import org.eclipse.jdt.core.IJavaElement;
29 import org.eclipse.jdt.core.IJavaModel;
30 import org.eclipse.jdt.core.IJavaProject;
31 import org.eclipse.jdt.core.IPackageFragment;
32 import org.eclipse.jdt.core.IPackageFragmentRoot;
33 import org.eclipse.jdt.core.JavaCore;
34 import org.eclipse.jdt.core.JavaModelException;
35 import org.eclipse.jdt.core.search.IJavaSearchScope;
36
37 /**
38  * A <tt>JarFileEntryTypeInfo</tt> represents a type in a Jar file.
39  */

40 public class JarFileEntryTypeInfo extends TypeInfo {
41     
42     private final String JavaDoc fJar;
43     private final String JavaDoc fFileName;
44     private final String JavaDoc fExtension;
45     
46     public JarFileEntryTypeInfo(String JavaDoc pkg, String JavaDoc name, char[][] enclosingTypes, int modifiers, String JavaDoc jar, String JavaDoc fileName, String JavaDoc extension) {
47         super(pkg, name, enclosingTypes, modifiers);
48         fJar= jar;
49         fFileName= fileName;
50         fExtension= extension;
51     }
52     
53     public boolean equals(Object JavaDoc obj) {
54         if (this == obj)
55             return true;
56         if (!JarFileEntryTypeInfo.class.equals(obj.getClass()))
57             return false;
58         JarFileEntryTypeInfo other= (JarFileEntryTypeInfo)obj;
59         return doEquals(other) && fJar.equals(other.fJar) &&
60             fFileName.equals(other.fFileName) && fExtension.equals(other.fExtension);
61     }
62     
63     public int getElementType() {
64         return TypeInfo.JAR_FILE_ENTRY_TYPE_INFO;
65     }
66     
67     public String JavaDoc getJar() {
68         return fJar;
69     }
70     
71     public String JavaDoc getFileName() {
72         return fFileName;
73     }
74     
75     public String JavaDoc getExtension() {
76         return fExtension;
77     }
78     
79     protected IJavaElement getContainer(IJavaSearchScope scope) throws JavaModelException {
80         IJavaModel jmodel= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
81         IPath[] enclosedPaths= scope.enclosingProjectsAndJars();
82
83         for (int i= 0; i < enclosedPaths.length; i++) {
84             IPath curr= enclosedPaths[i];
85             if (curr.segmentCount() == 1) {
86                 IJavaProject jproject= jmodel.getJavaProject(curr.segment(0));
87                 IPackageFragmentRoot root= jproject.getPackageFragmentRoot(fJar);
88                 if (root.exists()) {
89                     return findElementInRoot(root);
90                 }
91             }
92         }
93         List JavaDoc paths= Arrays.asList(enclosedPaths);
94         IJavaProject[] projects= jmodel.getJavaProjects();
95         for (int i= 0; i < projects.length; i++) {
96             IJavaProject jproject= projects[i];
97             if (!paths.contains(jproject.getPath())) {
98                 IPackageFragmentRoot root= jproject.getPackageFragmentRoot(fJar);
99                 if (root.exists()) {
100                     return findElementInRoot(root);
101                 }
102             }
103         }
104         return null;
105     }
106     
107     private IJavaElement findElementInRoot(IPackageFragmentRoot root) {
108         IJavaElement res;
109         IPackageFragment frag= root.getPackageFragment(getPackageName());
110         String JavaDoc extension= getExtension();
111         String JavaDoc fullName= getFileName() + '.' + extension;
112         
113         if ("class".equals(extension)) { //$NON-NLS-1$
114
res= frag.getClassFile(fullName);
115         } else if (JavaCore.isJavaLikeFileName(fullName)) {
116             res= frag.getCompilationUnit(fullName);
117         } else {
118             return null;
119         }
120         if (res.exists()) {
121             return res;
122         }
123         return null;
124     }
125     
126     public IPath getPackageFragmentRootPath() {
127         return new Path(fJar);
128     }
129     
130     public String JavaDoc getPackageFragmentRootName() {
131         // we can't remove the '/' since the jar can be external.
132
return fJar;
133     }
134         
135     public String JavaDoc getPath() {
136         StringBuffer JavaDoc result= new StringBuffer JavaDoc(fJar);
137         result.append(IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR);
138         getElementPath(result);
139         return result.toString();
140     }
141     
142     public long getContainerTimestamp() {
143         // First try internal Jar
144
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
145         IPath path= new Path(fJar);
146         IResource resource= root.findMember(path);
147         IFileInfo info= null;
148         IJavaElement element= null;
149         if (resource != null && resource.exists()) {
150             URI JavaDoc location= resource.getLocationURI();
151             if (location != null) {
152                 try {
153                     info= EFS.getStore(location).fetchInfo();
154                     if (info.exists()) {
155                         element= JavaCore.create(resource);
156                         // The exist test for external jars is expensive due to
157
// JDT/Core. So do the test here since we know that the
158
// Java element points to an internal Jar.
159
if (element != null && !element.exists())
160                             element= null;
161                     }
162                 } catch (CoreException e) {
163                     // Fall through
164
}
165             }
166         } else {
167             info= EFS.getLocalFileSystem().getStore(Path.fromOSString(fJar)).fetchInfo();
168             if (info.exists()) {
169                 element= getPackageFragementRootForExternalJar();
170             }
171         }
172         if (info != null && info.exists() && element != null) {
173             return info.getLastModified();
174         }
175         return IResource.NULL_STAMP;
176     }
177     
178     public boolean isContainerDirty() {
179         return false;
180     }
181         
182     private void getElementPath(StringBuffer JavaDoc result) {
183         String JavaDoc pack= getPackageName();
184         if (pack != null && pack.length() > 0) {
185             result.append(pack.replace(TypeInfo.PACKAGE_PART_SEPARATOR, TypeInfo.SEPARATOR));
186             result.append(TypeInfo.SEPARATOR);
187         }
188         result.append(getFileName());
189         result.append('.');
190         result.append(getExtension());
191     }
192     
193     private IPackageFragmentRoot getPackageFragementRootForExternalJar() {
194         try {
195             IJavaModel jmodel= JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
196             IJavaProject[] projects= jmodel.getJavaProjects();
197             for (int i= 0; i < projects.length; i++) {
198                 IJavaProject project= projects[i];
199                 IPackageFragmentRoot root= project.getPackageFragmentRoot(fJar);
200                 // Cheaper check than calling root.exists().
201
if (project.isOnClasspath(root))
202                     return root;
203             }
204         } catch (JavaModelException e) {
205             // Fall through
206
}
207         return null;
208     }
209 }
210
Popular Tags