1 11 package org.eclipse.jdt.internal.corext.util; 12 13 import java.net.URI ; 14 import java.util.Arrays ; 15 import java.util.List ; 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 40 public class JarFileEntryTypeInfo extends TypeInfo { 41 42 private final String fJar; 43 private final String fFileName; 44 private final String fExtension; 45 46 public JarFileEntryTypeInfo(String pkg, String name, char[][] enclosingTypes, int modifiers, String jar, String fileName, String extension) { 47 super(pkg, name, enclosingTypes, modifiers); 48 fJar= jar; 49 fFileName= fileName; 50 fExtension= extension; 51 } 52 53 public boolean equals(Object 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 getJar() { 68 return fJar; 69 } 70 71 public String getFileName() { 72 return fFileName; 73 } 74 75 public String 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 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 extension= getExtension(); 111 String fullName= getFileName() + '.' + extension; 112 113 if ("class".equals(extension)) { 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 getPackageFragmentRootName() { 131 return fJar; 133 } 134 135 public String getPath() { 136 StringBuffer result= new StringBuffer (fJar); 137 result.append(IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR); 138 getElementPath(result); 139 return result.toString(); 140 } 141 142 public long getContainerTimestamp() { 143 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 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 if (element != null && !element.exists()) 160 element= null; 161 } 162 } catch (CoreException e) { 163 } 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 result) { 183 String 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 if (project.isOnClasspath(root)) 202 return root; 203 } 204 } catch (JavaModelException e) { 205 } 207 return null; 208 } 209 } 210 | Popular Tags |