KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > jdt > internal > corext > refactoring > reorg > ParentChecker


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.refactoring.reorg;
12
13 import java.util.ArrayList JavaDoc;
14 import java.util.List JavaDoc;
15
16 import org.eclipse.core.runtime.Assert;
17
18 import org.eclipse.core.resources.IResource;
19
20 import org.eclipse.jdt.core.IJavaElement;
21 import org.eclipse.jdt.core.JavaCore;
22
23
24 public class ParentChecker {
25     private IResource[] fResources;
26     private IJavaElement[] fJavaElements;
27
28     public ParentChecker(IResource[] resources, IJavaElement[] javaElements) {
29         Assert.isNotNull(resources);
30         Assert.isNotNull(javaElements);
31         fResources= resources;
32         fJavaElements= javaElements;
33     }
34     
35     public boolean haveCommonParent() {
36         return getCommonParent() != null;
37     }
38     
39     public Object JavaDoc getCommonParent(){
40         if (fJavaElements.length == 0 && fResources.length == 0)
41             return null;
42         if (! resourcesHaveCommonParent() || ! javaElementsHaveCommonParent())
43             return null;
44         if (fJavaElements.length == 0){
45             IResource commonResourceParent= getCommonResourceParent();
46             Assert.isNotNull(commonResourceParent);
47             IJavaElement convertedToJava= JavaCore.create(commonResourceParent);
48             if (convertedToJava != null && convertedToJava.exists())
49                 return convertedToJava;
50             else
51                 return commonResourceParent;
52         }
53         if (fResources.length == 0)
54             return getCommonJavaElementParent();
55             
56         IResource commonResourceParent= getCommonResourceParent();
57         IJavaElement commonJavaElementParent= getCommonJavaElementParent();
58         Assert.isNotNull(commonJavaElementParent);
59         Assert.isNotNull(commonResourceParent);
60         IJavaElement convertedToJava= JavaCore.create(commonResourceParent);
61         if (convertedToJava == null ||
62             ! convertedToJava.exists() ||
63             ! commonJavaElementParent.equals(convertedToJava))
64             return null;
65         return commonJavaElementParent;
66     }
67
68     private IJavaElement getCommonJavaElementParent() {
69         Assert.isNotNull(fJavaElements);
70         Assert.isTrue(fJavaElements.length > 0);//safe - checked before
71
return fJavaElements[0].getParent();
72     }
73
74     private IResource getCommonResourceParent() {
75         Assert.isNotNull(fResources);
76         Assert.isTrue(fResources.length > 0);//safe - checked before
77
return fResources[0].getParent();
78     }
79
80     private boolean javaElementsHaveCommonParent() {
81         if (fJavaElements.length == 0)
82             return true;
83         IJavaElement firstParent= fJavaElements[0].getParent();
84         Assert.isNotNull(firstParent); //this should never happen
85
for (int i= 1; i < fJavaElements.length; i++) {
86             if (! firstParent.equals(fJavaElements[i].getParent()))
87                 return false;
88         }
89         return true;
90     }
91
92     private boolean resourcesHaveCommonParent() {
93         if (fResources.length == 0)
94             return true;
95         IResource firstParent= fResources[0].getParent();
96         Assert.isNotNull(firstParent);
97         for (int i= 1; i < fResources.length; i++) {
98             if (! firstParent.equals(fResources[i].getParent()))
99                 return false;
100         }
101         return true;
102     }
103     
104     public IResource[] getResources(){
105         return fResources;
106     }
107         
108     public IJavaElement[] getJavaElements(){
109         return fJavaElements;
110     }
111
112     public void removeElementsWithAncestorsOnList(boolean removeOnlyJavaElements) {
113         if (! removeOnlyJavaElements){
114             removeResourcesDescendantsOfResources();
115             removeResourcesDescendantsOfJavaElements();
116         }
117         removeJavaElementsDescendantsOfJavaElements();
118 // removeJavaElementsChildrenOfResources(); //this case is covered by removeUnconfirmedArchives
119
}
120                 
121     private void removeResourcesDescendantsOfJavaElements() {
122         List JavaDoc subResources= new ArrayList JavaDoc(3);
123         for (int i= 0; i < fResources.length; i++) {
124             IResource subResource= fResources[i];
125             for (int j= 0; j < fJavaElements.length; j++) {
126                 IJavaElement superElements= fJavaElements[j];
127                 if (isDescendantOf(subResource, superElements))
128                     subResources.add(subResource);
129             }
130         }
131         removeFromSetToDelete((IResource[]) subResources.toArray(new IResource[subResources.size()]));
132     }
133
134     private void removeJavaElementsDescendantsOfJavaElements() {
135         List JavaDoc subElements= new ArrayList JavaDoc(3);
136         for (int i= 0; i < fJavaElements.length; i++) {
137             IJavaElement subElement= fJavaElements[i];
138             for (int j= 0; j < fJavaElements.length; j++) {
139                 IJavaElement superElement= fJavaElements[j];
140                 if (isDescendantOf(subElement, superElement))
141                     subElements.add(subElement);
142             }
143         }
144         removeFromSetToDelete((IJavaElement[]) subElements.toArray(new IJavaElement[subElements.size()]));
145     }
146
147     private void removeResourcesDescendantsOfResources() {
148         List JavaDoc subResources= new ArrayList JavaDoc(3);
149         for (int i= 0; i < fResources.length; i++) {
150             IResource subResource= fResources[i];
151             for (int j= 0; j < fResources.length; j++) {
152                 IResource superResource= fResources[j];
153                 if (isDescendantOf(subResource, superResource))
154                     subResources.add(subResource);
155             }
156         }
157         removeFromSetToDelete((IResource[]) subResources.toArray(new IResource[subResources.size()]));
158     }
159
160     public static boolean isDescendantOf(IResource subResource, IJavaElement superElement) {
161         IResource parent= subResource.getParent();
162         while(parent != null){
163             IJavaElement el= JavaCore.create(parent);
164             if (el != null && el.exists() && el.equals(superElement))
165                 return true;
166             parent= parent.getParent();
167         }
168         return false;
169     }
170
171     public static boolean isDescendantOf(IJavaElement subElement, IJavaElement superElement) {
172         if (subElement.equals(superElement))
173             return false;
174         IJavaElement parent= subElement.getParent();
175         while(parent != null){
176             if (parent.equals(superElement))
177                 return true;
178             parent= parent.getParent();
179         }
180         return false;
181     }
182
183     public static boolean isDescendantOf(IResource subResource, IResource superResource) {
184         return ! subResource.equals(superResource) && superResource.getFullPath().isPrefixOf(subResource.getFullPath());
185     }
186
187     private void removeFromSetToDelete(IResource[] resourcesToNotDelete) {
188         fResources= ReorgUtils.setMinus(fResources, resourcesToNotDelete);
189     }
190     
191     private void removeFromSetToDelete(IJavaElement[] elementsToNotDelete) {
192         fJavaElements= ReorgUtils.setMinus(fJavaElements, elementsToNotDelete);
193     }
194 }
195
Popular Tags