1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 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
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.corext.util;
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.HashSet;
16 import java.util.List;
19 import org.eclipse.core.runtime.Assert;
20 import org.eclipse.core.runtime.CoreException;
21 import org.eclipse.core.runtime.IProgressMonitor;
22 import org.eclipse.core.runtime.IStatus;
24 import org.eclipse.core.resources.IContainer;
25 import org.eclipse.core.resources.IFolder;
26 import org.eclipse.core.resources.IProject;
27 import org.eclipse.core.resources.IResource;
28 import org.eclipse.core.resources.mapping.RemoteResourceMappingContext;
29 import org.eclipse.core.resources.mapping.ResourceMapping;
30 import org.eclipse.core.resources.mapping.ResourceMappingContext;
31 import org.eclipse.core.resources.mapping.ResourceTraversal;
33 import org.eclipse.jdt.core.IClassFile;
34 import org.eclipse.jdt.core.ICompilationUnit;
35 import org.eclipse.jdt.core.IJavaElement;
36 import org.eclipse.jdt.core.IJavaModel;
37 import org.eclipse.jdt.core.IJavaProject;
38 import org.eclipse.jdt.core.IPackageFragment;
39 import org.eclipse.jdt.core.IPackageFragmentRoot;
40 import org.eclipse.jdt.core.IType;
41 import org.eclipse.jdt.core.JavaModelException;
43 import org.eclipse.jdt.internal.ui.JavaPlugin;
44 import org.eclipse.jdt.internal.ui.browsing.LogicalPackage;
45 import org.eclipse.jdt.internal.ui.model.JavaModelProvider;
48 * An abstract super class to describe mappings from a Java element to a
49 * set of resources. The class also provides factory methods to create
54 public abstract class JavaElementResourceMapping extends ResourceMapping {
56 protected JavaElementResourceMapping() {
59 public IJavaElement getJavaElement() {
60 Object o= getModelObject();
61 if (o instanceof IJavaElement)
62 return (IJavaElement)o;
67 public boolean equals(Object obj) {
68 if (!(obj instanceof JavaElementResourceMapping))
70 return getJavaElement().equals(((JavaElementResourceMapping)obj).getJavaElement());
74 public int hashCode() {
75 IJavaElement javaElement= getJavaElement();
76 if (javaElement == null)
77 return super.hashCode();
79 return javaElement.hashCode();
83 public String getModelProviderId() {
84 return JavaModelProvider.JAVA_MODEL_PROVIDER_ID;
88 public boolean contains(ResourceMapping mapping) {
89 if (mapping instanceof JavaElementResourceMapping) {
90 JavaElementResourceMapping javaMapping = (JavaElementResourceMapping) mapping;
91 IJavaElement element = getJavaElement();
92 IJavaElement other = javaMapping.getJavaElement();
93 if (other != null && element != null)
94 return element.getPath().isPrefixOf(other.getPath());
99 //---- the factory code ---------------------------------------------------------------
101 private static final class JavaModelResourceMapping extends JavaElementResourceMapping {
102 private final IJavaModel fJavaModel;
103 private JavaModelResourceMapping(IJavaModel model) {
104 Assert.isNotNull(model);
108 public Object getModelObject() {
112 public IProject[] getProjects() {
113 IJavaProject[] projects= null;
115 projects= fJavaModel.getJavaProjects();
116 } catch (JavaModelException e) {
118 return new IProject[0];
120 IProject[] result= new IProject[projects.length];
121 for (int i= 0; i < projects.length; i++) {
122 result[i]= projects[i].getProject();
127 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
128 IJavaProject[] projects= fJavaModel.getJavaProjects();
129 ResourceTraversal[] result= new ResourceTraversal[projects.length];
130 for (int i= 0; i < projects.length; i++) {
131 result[i]= new ResourceTraversal(new IResource[] {projects[i].getProject()}, IResource.DEPTH_INFINITE, 0);
137 private static final class JavaProjectResourceMapping extends JavaElementResourceMapping {
138 private final IJavaProject fProject;
139 private JavaProjectResourceMapping(IJavaProject project) {
140 Assert.isNotNull(project);
144 public Object getModelObject() {
148 public IProject[] getProjects() {
149 return new IProject[] {fProject.getProject() };
152 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
153 return new ResourceTraversal[] {
154 new ResourceTraversal(new IResource[] {fProject.getProject()}, IResource.DEPTH_INFINITE, 0)
159 private static final class PackageFragementRootResourceMapping extends JavaElementResourceMapping {
160 private final IPackageFragmentRoot fRoot;
161 private PackageFragementRootResourceMapping(IPackageFragmentRoot root) {
162 Assert.isNotNull(root);
166 public Object getModelObject() {
170 public IProject[] getProjects() {
171 return new IProject[] {fRoot.getJavaProject().getProject() };
174 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
175 return new ResourceTraversal[] {
176 new ResourceTraversal(new IResource[] {fRoot.getResource()}, IResource.DEPTH_INFINITE, 0)
181 private static final class PackageFragmentResourceMapping extends JavaElementResourceMapping {
182 private final IPackageFragment fPack;
183 private PackageFragmentResourceMapping(IPackageFragment pack) {
184 Assert.isNotNull(pack);
188 public Object getModelObject() {
192 public IProject[] getProjects() {
193 return new IProject[] { fPack.getJavaProject().getProject() };
196 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
197 if (context instanceof RemoteResourceMappingContext) {
198 return getRemotePackageFragmentTraversals(fPack, (RemoteResourceMappingContext)context, monitor);
200 return getPackageFragmentTraversals(fPack);
205 private static ResourceTraversal[] getPackageFragmentTraversals(IPackageFragment pack) throws CoreException {
206 ArrayList<ResourceTraversal> res= new ArrayList<ResourceTraversal>();
207 IContainer container= (IContainer)pack.getResource();
209 if (container != null) {
210 res.add(new ResourceTraversal(new IResource[] { container }, IResource.DEPTH_ONE, 0));
211 if (pack.exists()) { // folder may not exist any more, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=269167
212 Object[] nonJavaResources= pack.getNonJavaResources();
213 for (int i= 0; i < nonJavaResources.length; i++) {
214 Object resource= nonJavaResources[i];
215 if (resource instanceof IFolder) {
216 res.add(new ResourceTraversal(new IResource[] { (IResource)resource }, IResource.DEPTH_INFINITE, 0));
222 return res.toArray(new ResourceTraversal[res.size()]);
225 private static ResourceTraversal[] getRemotePackageFragmentTraversals(IPackageFragment pack, RemoteResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
226 ArrayList<ResourceTraversal> res= new ArrayList<ResourceTraversal>();
227 IContainer container= (IContainer)pack.getResource();
229 if (container != null) {
230 res.add(new ResourceTraversal(new IResource[] {container}, IResource.DEPTH_ONE, 0));
231 IResource[] remoteMembers= context.fetchRemoteMembers(container, monitor);
232 if (remoteMembers == null) {
233 remoteMembers= context.fetchMembers(container, monitor);
235 if (remoteMembers != null) {
236 for (int i= 0; i < remoteMembers.length; i++) {
237 IResource member= remoteMembers[i];
238 if (member instanceof IFolder
239 && JavaConventionsUtil.validatePackageName(member.getName(), pack).getSeverity() == IStatus.ERROR) {
240 res.add(new ResourceTraversal(new IResource[] { member }, IResource.DEPTH_INFINITE, 0));
245 return res.toArray(new ResourceTraversal[res.size()]);
248 private static final class CompilationUnitResourceMapping extends JavaElementResourceMapping {
249 private final ICompilationUnit fUnit;
250 private CompilationUnitResourceMapping(ICompilationUnit unit) {
251 Assert.isNotNull(unit);
255 public Object getModelObject() {
259 public IProject[] getProjects() {
260 return new IProject[] {fUnit.getJavaProject().getProject() };
263 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
264 return new ResourceTraversal[] {
265 new ResourceTraversal(new IResource[] {fUnit.getResource()}, IResource.DEPTH_ONE, 0)
270 private static final class ClassFileResourceMapping extends JavaElementResourceMapping {
271 private final IClassFile fClassFile;
272 private ClassFileResourceMapping(IClassFile classFile) {
273 fClassFile= classFile;
276 public Object getModelObject() {
280 public IProject[] getProjects() {
281 return new IProject[] { fClassFile.getJavaProject().getProject() };
284 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
285 return new ResourceTraversal[] {
286 new ResourceTraversal(new IResource[] {fClassFile.getResource()}, IResource.DEPTH_ONE, 0)
291 private static final class LogicalPackageResourceMapping extends ResourceMapping {
292 private final IPackageFragment[] fFragments;
293 private LogicalPackageResourceMapping(IPackageFragment[] fragments) {
294 fFragments= fragments;
297 public Object getModelObject() {
301 public IProject[] getProjects() {
302 Set<IProject> result= new HashSet<IProject>();
303 for (int i= 0; i < fFragments.length; i++) {
304 result.add(fFragments[i].getJavaProject().getProject());
306 return result.toArray(new IProject[result.size()]);
309 public ResourceTraversal[] getTraversals(ResourceMappingContext context, IProgressMonitor monitor) throws CoreException {
310 List<ResourceTraversal> result= new ArrayList<ResourceTraversal>();
311 if (context instanceof RemoteResourceMappingContext) {
312 for (int i= 0; i < fFragments.length; i++) {
313 result.addAll(Arrays.asList(getRemotePackageFragmentTraversals(fFragments[i], (RemoteResourceMappingContext)context, monitor)));
316 for (int i= 0; i < fFragments.length; i++) {
317 result.addAll(Arrays.asList(getPackageFragmentTraversals(fFragments[i])));
320 return result.toArray(new ResourceTraversal[result.size()]);
324 public String getModelProviderId() {
325 return JavaModelProvider.JAVA_MODEL_PROVIDER_ID;
329 public static ResourceMapping create(IJavaElement element) {
330 switch (element.getElementType()) {
331 case IJavaElement.TYPE:
332 return create((IType)element);
333 case IJavaElement.COMPILATION_UNIT:
334 return create((ICompilationUnit)element);
335 case IJavaElement.CLASS_FILE:
336 return create((IClassFile)element);
337 case IJavaElement.PACKAGE_FRAGMENT:
338 return create((IPackageFragment)element);
339 case IJavaElement.PACKAGE_FRAGMENT_ROOT:
340 return create((IPackageFragmentRoot)element);
341 case IJavaElement.JAVA_PROJECT:
342 return create((IJavaProject)element);
343 case IJavaElement.JAVA_MODEL:
344 return create((IJavaModel)element);
351 public static ResourceMapping create(final IJavaModel model) {
352 return new JavaModelResourceMapping(model);
355 public static ResourceMapping create(final IJavaProject project) {
356 return new JavaProjectResourceMapping(project);
359 public static ResourceMapping create(final IPackageFragmentRoot root) {
360 if (root.isExternal())
362 return new PackageFragementRootResourceMapping(root);
365 public static ResourceMapping create(final IPackageFragment pack) {
366 // test if in an archive
367 IPackageFragmentRoot root= (IPackageFragmentRoot)pack.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
368 if (!root.isArchive() && !root.isExternal()) {
369 return new PackageFragmentResourceMapping(pack);
374 public static ResourceMapping create(ICompilationUnit unit) {
377 return new CompilationUnitResourceMapping(unit.getPrimary());
380 public static ResourceMapping create(IClassFile classFile) {
381 // test if in a archive
382 IPackageFragmentRoot root= (IPackageFragmentRoot)classFile.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
383 if (!root.isArchive() && !root.isExternal()) {
384 return new ClassFileResourceMapping(classFile);
389 public static ResourceMapping create(IType type) {
390 // top level types behave like the CU
391 IJavaElement parent= type.getParent();
392 if (parent instanceof ICompilationUnit) {
393 return create((ICompilationUnit)parent);
398 public static ResourceMapping create(LogicalPackage logicalPackage) {
399 IPackageFragment[] fragments= logicalPackage.getFragments();
400 List<IPackageFragment> toProcess= new ArrayList<IPackageFragment>(fragments.length);
401 for (int i= 0; i < fragments.length; i++) {
402 // only add if not part of an archive
403 IPackageFragmentRoot root= (IPackageFragmentRoot)fragments[i].getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
404 if (!root.isArchive() && !root.isExternal()) {
405 toProcess.add(fragments[i]);
408 if (toProcess.size() == 0)
410 return new LogicalPackageResourceMapping(toProcess.toArray(new IPackageFragment[toProcess.size()]));