1 /*******************************************************************************
2  * Copyright (c) 2000, 2020 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.jdt.internal.ui;
15 
16 import org.eclipse.core.runtime.IAdaptable;
17 
18 import org.eclipse.core.resources.IResource;
19 
20 import org.eclipse.ui.IContainmentAdapter;
21 
22 import org.eclipse.jdt.core.IJavaElement;
23 import org.eclipse.jdt.core.IJavaProject;
24 import org.eclipse.jdt.core.JavaCore;
25 
26 public class JavaElementContainmentAdapter implements IContainmentAdapter {
27 
28 	@Override
contains(Object workingSetElement, Object element, int flags)29 	public boolean contains(Object workingSetElement, Object element, int flags) {
30 		if (!(workingSetElement instanceof IJavaElement) || element == null)
31 			return false;
32 
33 		IJavaElement workingSetJavaElement= (IJavaElement)workingSetElement;
34 		IResource resource= null;
35 		IJavaElement jElement= null;
36 		if (element instanceof IJavaElement) {
37 			jElement= (IJavaElement)element;
38 			resource= jElement.getResource();
39 		} else {
40 			if (element instanceof IAdaptable) {
41 				resource= ((IAdaptable)element).getAdapter(IResource.class);
42 				if (resource != null) {
43 					jElement= findJavaElement(resource);
44 				}
45 			}
46 		}
47 
48 		if (jElement != null) {
49 			if (contains(workingSetJavaElement, jElement, flags))
50 				return true;
51 			if (workingSetJavaElement.getElementType() == IJavaElement.PACKAGE_FRAGMENT &&
52 				resource.getType() == IResource.FOLDER && checkIfDescendant(flags))
53 				return isChild(workingSetJavaElement, resource);
54 		} else if (resource != null) {
55 			return contains(workingSetJavaElement, resource, flags);
56 		}
57 		return false;
58 	}
59 
findJavaElement(IResource resource)60 	private static IJavaElement findJavaElement(IResource resource) {
61 		IJavaProject project= JavaCore.create(resource.getProject());
62 		if (project == null) {
63 			return null;
64 		}
65 		IJavaElement javaElement= JavaCore.create(resource, project);
66 		if (javaElement != null && javaElement.exists()) {
67 			return javaElement;
68 		}
69 		return null;
70 	}
71 
contains(IJavaElement workingSetElement, IJavaElement element, int flags)72 	private boolean contains(IJavaElement workingSetElement, IJavaElement element, int flags) {
73 		if (checkContext(flags) && workingSetElement.equals(element)) {
74 			return true;
75 		}
76 		if (checkIfChild(flags) && workingSetElement.equals(element.getParent())) {
77 			return true;
78 		}
79 		if (checkIfDescendant(flags) && check(workingSetElement, element)) {
80 			return true;
81 		}
82 		if (checkIfAncestor(flags) && check(element, workingSetElement)) {
83 			return true;
84 		}
85 		return false;
86 	}
87 
check(IJavaElement ancestor, IJavaElement descendent)88 	private boolean check(IJavaElement ancestor, IJavaElement descendent) {
89 		descendent= descendent.getParent();
90 		while (descendent != null) {
91 			if (ancestor.equals(descendent))
92 				return true;
93 			descendent= descendent.getParent();
94 		}
95 		return false;
96 	}
97 
isChild(IJavaElement workingSetElement, IResource element)98 	private boolean isChild(IJavaElement workingSetElement, IResource element) {
99 		IResource resource= workingSetElement.getResource();
100 		if (resource == null)
101 			return false;
102 		return check(element, resource);
103 	}
104 
contains(IJavaElement workingSetElement, IResource element, int flags)105 	private boolean contains(IJavaElement workingSetElement, IResource element, int flags) {
106 		IResource workingSetResource= workingSetElement.getResource();
107 		if (workingSetResource == null)
108 			return false;
109 		if (checkContext(flags) && workingSetResource.equals(element)) {
110 			return true;
111 		}
112 		if (checkIfChild(flags) && workingSetResource.equals(element.getParent())) {
113 			return true;
114 		}
115 		if (checkIfDescendant(flags) && check(workingSetResource, element)) {
116 			return true;
117 		}
118 		if (checkIfAncestor(flags) && check(element, workingSetResource)) {
119 			return true;
120 		}
121 		return false;
122 	}
123 
check(IResource ancestor, IResource descendent)124 	private boolean check(IResource ancestor, IResource descendent) {
125 		descendent= descendent.getParent();
126 		while(descendent != null) {
127 			if (ancestor.equals(descendent))
128 				return true;
129 			descendent= descendent.getParent();
130 		}
131 		return false;
132 	}
133 
checkIfDescendant(int flags)134 	private boolean checkIfDescendant(int flags) {
135 		return (flags & CHECK_IF_DESCENDANT) != 0;
136 	}
137 
checkIfAncestor(int flags)138 	private boolean checkIfAncestor(int flags) {
139 		return (flags & CHECK_IF_ANCESTOR) != 0;
140 	}
141 
checkIfChild(int flags)142 	private boolean checkIfChild(int flags) {
143 		return (flags & CHECK_IF_CHILD) != 0;
144 	}
145 
checkContext(int flags)146 	private boolean checkContext(int flags) {
147 		return (flags & CHECK_CONTEXT) != 0;
148 	}
149 }
150