Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 150673 | Differences between
and this patch

Collapse All | Expand All

(-)modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java (+6 lines)
Lines 17-22 Link Here
17
import org.eclipse.core.resources.IFile;
17
import org.eclipse.core.resources.IFile;
18
import org.eclipse.core.resources.IProject;
18
import org.eclipse.core.resources.IProject;
19
import org.eclipse.core.resources.IResource;
19
import org.eclipse.core.resources.IResource;
20
import org.eclipse.core.resources.IResourceDelta;
20
import org.eclipse.core.resources.ResourcesPlugin;
21
import org.eclipse.core.resources.ResourcesPlugin;
21
import org.eclipse.core.runtime.CoreException;
22
import org.eclipse.core.runtime.CoreException;
22
import org.eclipse.core.runtime.IAdaptable;
23
import org.eclipse.core.runtime.IAdaptable;
Lines 28-33 Link Here
28
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
29
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
29
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
30
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
30
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
31
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
32
import org.eclipse.wst.common.componentcore.resources.VirtualTreeNode;
31
import org.eclipse.wst.common.frameworks.internal.HashUtil;
33
import org.eclipse.wst.common.frameworks.internal.HashUtil;
32
34
33
35
Lines 181-186 Link Here
181
		return null;
183
		return null;
182
	}
184
	}
183
185
186
	public VirtualTreeNode getVirtualTreeRoot() {
187
		return null;
188
	}
189
184
	public IVirtualComponent[] getReferencingComponents() {
190
	public IVirtualComponent[] getReferencingComponents() {
185
		return NO_COMPONENTS;
191
		return NO_COMPONENTS;
186
	}
192
	}
(-)modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java (+35 lines)
Lines 17-22 Link Here
17
import java.util.Properties;
17
import java.util.Properties;
18
18
19
import org.eclipse.core.resources.IProject;
19
import org.eclipse.core.resources.IProject;
20
import org.eclipse.core.resources.IResource;
20
import org.eclipse.core.runtime.CoreException;
21
import org.eclipse.core.runtime.CoreException;
21
import org.eclipse.core.runtime.IPath;
22
import org.eclipse.core.runtime.IPath;
22
import org.eclipse.core.runtime.IProgressMonitor;
23
import org.eclipse.core.runtime.IProgressMonitor;
Lines 24-29 Link Here
24
import org.eclipse.core.runtime.Platform;
25
import org.eclipse.core.runtime.Platform;
25
import org.eclipse.wst.common.componentcore.ComponentCore;
26
import org.eclipse.wst.common.componentcore.ComponentCore;
26
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
27
import org.eclipse.wst.common.componentcore.ModuleCoreNature;
28
import org.eclipse.wst.common.componentcore.internal.ComponentResource;
27
import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
29
import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
28
import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
30
import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
29
import org.eclipse.wst.common.componentcore.internal.DependencyType;
31
import org.eclipse.wst.common.componentcore.internal.DependencyType;
Lines 37-42 Link Here
37
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
39
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
38
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
40
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
39
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
41
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
42
import org.eclipse.wst.common.componentcore.resources.VirtualTreeNode;
40
import org.eclipse.wst.common.frameworks.internal.HashUtil;
43
import org.eclipse.wst.common.frameworks.internal.HashUtil;
41
44
42
45
Lines 503-508 Link Here
503
				core.dispose();
506
				core.dispose();
504
		}		
507
		}		
505
	}
508
	}
509
510
	protected List<VirtualTreeNode.Entry> getVirtualTreeRootEntries() throws CoreException {
511
		final List<VirtualTreeNode.Entry> entries = new ArrayList<VirtualTreeNode.Entry>();
512
		StructureEdit core = StructureEdit.getStructureEditForRead(getProject());
513
		try {
514
			if (core != null) {
515
				WorkbenchComponent component = core.getComponent();
516
				if (component != null) {
517
					List resources = component.getResources();
518
					Iterator resIter = resources.iterator();
519
					while (resIter.hasNext()) {
520
						ComponentResource componentResource = (ComponentResource) resIter.next();
521
						IResource resource = getProject().findMember(componentResource.getSourcePath());
522
						if (resource != null && resource.exists()) {
523
							entries.add(new VirtualTreeNode.Entry(componentResource.getRuntimePath(), resource));
524
						} else {
525
							// TODO warn 
526
						}
527
					}
528
				}
529
			}
530
		} finally {
531
			if(core != null)
532
				core.dispose();
533
		}
534
		return entries;
535
	}
536
537
	public VirtualTreeNode getVirtualTreeRoot() throws CoreException {
538
		return new VirtualTreeNode(getVirtualTreeRootEntries());
539
	}
540
506
	
541
	
507
	public String toString() {
542
	public String toString() {
508
		return componentProject.toString();
543
		return componentProject.toString();
(-)modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java (+2 lines)
Lines 235-238 Link Here
235
	 */
235
	 */
236
	public IVirtualComponent[] getReferencingComponents();
236
	public IVirtualComponent[] getReferencingComponents();
237
237
238
	public VirtualTreeNode getVirtualTreeRoot() throws CoreException;
239
238
}
240
}
(-).settings/org.eclipse.jdt.core.prefs (+12 lines)
Added Link Here
1
#Sat Aug 19 23:14:33 EDT 2006
2
eclipse.preferences.version=1
3
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
4
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
5
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
6
org.eclipse.jdt.core.compiler.compliance=1.5
7
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
8
org.eclipse.jdt.core.compiler.debug.localVariable=generate
9
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
10
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
11
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
12
org.eclipse.jdt.core.compiler.source=1.5
(-)modulecore-src/org/eclipse/wst/common/componentcore/resources/VirtualTreeNode.java (+383 lines)
Added Link Here
1
package org.eclipse.wst.common.componentcore.resources;
2
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.HashSet;
6
import java.util.List;
7
import java.util.Set;
8
9
import org.eclipse.core.resources.IContainer;
10
import org.eclipse.core.resources.IFile;
11
import org.eclipse.core.resources.IResource;
12
import org.eclipse.core.resources.IResourceDelta;
13
import org.eclipse.core.runtime.CoreException;
14
import org.eclipse.core.runtime.IPath;
15
import org.eclipse.core.runtime.Path;
16
17
public class VirtualTreeNode {
18
19
	public static class Entry {
20
		private final IPath runtimePath;
21
		private final IResource resource;
22
		private final File file;
23
		private final VirtualTreeNode node;
24
		private final IResourceDelta delta;
25
		protected Entry(IPath runtimePath, IResource resource, File file, VirtualTreeNode node, IResourceDelta delta) {
26
			this.runtimePath = runtimePath == null || runtimePath.segmentCount() == 0? null: runtimePath;
27
			this.resource = resource;
28
			this.file = file;
29
			this.node = node;
30
			this.delta = delta;
31
		}
32
		public Entry(IPath runtimePath, IResource resource) {
33
			this(runtimePath, resource, null, null, null);
34
		}
35
		public Entry(IPath runtimePath, IResource resource, IResourceDelta delta) {
36
			this(runtimePath, resource, null, null, delta);
37
		}
38
		public Entry(IPath runtimePath, VirtualTreeNode node) {
39
			this(runtimePath, null, null, node, null);
40
		}
41
		public Entry(IPath runtimePath, File file) {
42
			this(runtimePath, null, file, null, null);
43
		}
44
		public IPath getRuntimePath() {
45
			return runtimePath;
46
		}
47
		public IResource getResource() {
48
			return resource;
49
		}
50
		public File getFile() {
51
			return file;
52
		}
53
		public VirtualTreeNode getNode() {
54
			return node;
55
		}
56
		public IResourceDelta getResourceDelta() {
57
			return delta;
58
		}
59
	}
60
61
	public interface IEntryFilter {
62
		public boolean accept(Entry entry);
63
	}
64
65
	protected final IPath runtimePath;
66
	protected final List<Entry> entries;
67
	protected final boolean isDelta;
68
69
	/**
70
	 * This contructor should only be called from other constructors and never
71
	 * directly. #newVirtualTreeNode should be called from all other methods 
72
	 * to ensure creation of proper subclass. 
73
	 * 
74
	 * @param runtimePath
75
	 * @param entries
76
	 * @param isDelta
77
	 */
78
	protected VirtualTreeNode(IPath runtimePath, List<Entry> entries, boolean isDelta) {
79
		this.runtimePath = runtimePath;
80
		this.entries = entries;
81
		this.isDelta = isDelta;
82
	}
83
84
	public VirtualTreeNode(List<Entry> entries) {
85
		this(Path.ROOT, entries, false);
86
	}
87
88
	public VirtualTreeNode filter(IEntryFilter filter) {
89
		ArrayList<Entry> result = new ArrayList<Entry>(entries.size());
90
		for (Entry entry : entries) {
91
			if (filter.accept(entry)) {
92
				VirtualTreeNode node = entry.getNode();
93
				if (node != null) {
94
					result.add(new Entry(entry.getRuntimePath(), node.filter(filter)));
95
				} else {
96
					result.add(entry);
97
				}
98
			}
99
		}
100
		return newVirtualTreeNode(getRuntimePath(), result, isDelta);
101
	}
102
103
	private List<VirtualTreeNode> members;
104
	
105
	public List<VirtualTreeNode> members() throws CoreException {
106
		if (members == null) {
107
			members = internalMembers();
108
		}
109
		return members;
110
	}
111
112
	private List<VirtualTreeNode> internalMembers() throws CoreException {
113
		List<VirtualTreeNode> result = new ArrayList<VirtualTreeNode>();
114
		Set<String> names = new HashSet<String>();
115
		for (int i = 0; i < entries.size(); i++) {
116
			Entry entry = entries.get(i);
117
118
			IResource resource = entry.getResource();
119
			File file = entry.getFile();
120
			VirtualTreeNode node = entry.getNode();
121
			IResourceDelta delta = entry.getResourceDelta();
122
			if (entry.getRuntimePath() == null) { // mounted into this folder
123
				if (resource != null && hasChildren(entry)) {
124
					IResource[] children = ((IContainer) resource).members();
125
					for (IResource child : children) {
126
						String name = child.getName();
127
						if (names.add(name)) {
128
							addNotNull(result, internalNewMember(i, name, newEntry(null, child, null, null, delta)));
129
						}
130
					}
131
				}
132
				if (file != null && file.isDirectory() && !isDelta) {
133
					File[] children = file.listFiles();
134
					for (File child : children) {
135
						String name = child.getName();
136
						if (names.add(name)) {
137
							addNotNull(result, internalNewMember(i, name, newEntry(null, null, child, null, null)));
138
						}
139
					}
140
				}
141
				if (node != null) {
142
					List<VirtualTreeNode> children = node.members();
143
					for (VirtualTreeNode child : children) {
144
						String name = child.getName();
145
						if (names.add(name)) {
146
							addNotNull(result, internalNewMember(i, name, newEntry(null, null, null, child, null)));
147
						}
148
					}
149
				}
150
			} else {
151
				String name = entry.getRuntimePath().segment(0);
152
				// TODO make sure name is not null/empty
153
				if (names.add(name)) {
154
					addNotNull(result, internalNewMember(i, name, newEntry(entry.getRuntimePath().removeFirstSegments(1), resource, file, node, delta)));
155
				}
156
			}
157
		}
158
		return result;
159
	}
160
161
	private static void addNotNull(List<VirtualTreeNode> result, VirtualTreeNode node) {
162
		if (node != null) {
163
			result.add(node);
164
		}
165
	}
166
167
	public String getName() {
168
		return runtimePath.lastSegment();
169
	}
170
171
	static Entry newEntry(IPath runtimePath, IResource resource, File file, VirtualTreeNode node, IResourceDelta delta) {
172
		if (runtimePath == null && resource != null && delta != null) {
173
			delta = findMember(delta, resource.getFullPath());
174
		}
175
		return new Entry(runtimePath, resource, file, node, delta);
176
	}
177
178
	private boolean hasChildren(Entry entry) {
179
		if (entry.getResource() instanceof IFile) return false;
180
		if (!isDelta) return true;
181
		IResourceDelta delta = entry.getResourceDelta();
182
		if (delta == null) return false;
183
		IPath resourcePath = entry.getResource().getFullPath();
184
		IResourceDelta member = findMember(delta, resourcePath);
185
		return member != null;
186
	}
187
188
	private VirtualTreeNode internalNewMember(int idx, final String name, Entry childEntry) throws CoreException {
189
		ArrayList<Entry> childEntries = new ArrayList<Entry>();
190
		childEntries.add(childEntry);
191
		// gather rest of the child's entries
192
		for (int i = idx + 1; i < entries.size(); i++) {
193
			Entry entry = entries.get(i);
194
			IResource resource = entry.getResource();
195
			File file = entry.getFile();
196
			VirtualTreeNode node = entry.getNode();
197
			IResourceDelta delta = entry.getResourceDelta();
198
			if (entry.getRuntimePath() == null) {
199
				if (resource != null) {
200
					IResource childResource = ((IContainer) resource).findMember(name);
201
					if (childResource != null) {
202
						childEntries.add(newEntry(null, childResource, null, null, delta));
203
					}
204
				}
205
				if (file != null) {
206
					File childFile = findMember(file, name);
207
					if (childFile != null) {
208
						childEntries.add(newEntry(null, null, childFile, null, null));
209
					}
210
				}
211
				if (node != null) {
212
					// TODO findMember(..) using HashMap<name,childNode>
213
					List<VirtualTreeNode> children = node.members();
214
					for (VirtualTreeNode childNode : children) {
215
						if (name.equals(childNode.getName())) {
216
							childEntries.add(newEntry(null, null, null, childNode, null));
217
							break;
218
						}
219
					}
220
				}
221
			} else {
222
				if (name.equals(entry.getRuntimePath().segment(0))) { // still virtual
223
					childEntries.add(newEntry(entry.getRuntimePath().removeFirstSegments(1), resource, file, node, delta));
224
				}
225
			}
226
		}
227
		if (!isDelta || hasChanges(childEntries)) {
228
			IPath childRuntimePath = runtimePath.append(name);
229
			return newVirtualTreeNode(childRuntimePath, childEntries, isDelta);
230
		} else {
231
			return null;
232
		}
233
	}
234
235
	private static File findMember(File file, String name) {
236
		File[] children = file.listFiles();
237
		for (File child : children) {
238
			if (name.equals(child.getName())) {
239
				return child;
240
			}
241
		}
242
		return null;
243
	}
244
245
	private static boolean hasChanges(List<Entry> entries) {
246
		for (Entry entry : getResolvedEntries(entries)) {
247
			if (entry.getResourceDelta() != null) {
248
				return true;
249
			}
250
		}
251
		return false;
252
	}
253
254
	private static List<Entry> getResolvedEntries(List<Entry> entries) {
255
		ArrayList<Entry> result = new ArrayList<Entry>();
256
		for (Entry entry : entries) {
257
			if (entry.getRuntimePath() == null) {
258
				if (entry.getNode() != null) {
259
					result.addAll(entry.getNode().getResolvedEntries());
260
				} else {
261
					result.add(entry);
262
				}
263
			}
264
		}
265
		return result;
266
	}
267
268
	/**
269
	 * Hook that allows subclasses manipulate child nodes. Subclasses 
270
	 * implementation can return <code>null</code>. 
271
	 */
272
	public VirtualTreeNode newVirtualTreeNode(IPath runtimePath, List<Entry> entries, boolean isDelta) {
273
		return new VirtualTreeNode(runtimePath, entries, isDelta);
274
	}
275
276
	public IPath getRuntimePath() {
277
		return runtimePath;
278
	}
279
280
	/**
281
	 * Resolves nested virtual tree nodes into simple entries.
282
	 * 
283
	 * @return List<Entry> list of simple entries
284
	 */
285
	public List<Entry> getResolvedEntries() {
286
		return getResolvedEntries(entries);
287
	}
288
289
	public List<Entry> getRawEntries() {
290
		return entries;
291
	}
292
293
	protected static IResourceDelta findMember(IResourceDelta delta, IPath fullPath) {
294
		IPath deltaPath = delta.getResource().getFullPath();
295
		if (!deltaPath.isPrefixOf(fullPath)) return null;
296
		IPath relativePath = fullPath.removeFirstSegments(deltaPath.segmentCount());
297
		return delta.findMember(relativePath);
298
	}
299
300
	public int getKind() {
301
		boolean unchanged = false, added = false, removed = false, changed = false;
302
		for (Entry entry : getResolvedEntries()) {
303
			if (entry.getRuntimePath() == null) {
304
				IResourceDelta delta = entry.getResourceDelta();
305
				if (delta == null) {
306
					unchanged = true;
307
					continue;
308
				}
309
				switch (delta.getKind()) {
310
				case IResourceDelta.ADDED: added = true; break;
311
				case IResourceDelta.REMOVED: removed = true; break;
312
				case IResourceDelta.CHANGED: changed = true; break;
313
				}
314
			}
315
		}
316
		if (changed) return IResourceDelta.CHANGED;
317
		if (unchanged) {
318
			return (added || removed)? IResourceDelta.CHANGED: IResourceDelta.NO_CHANGE;
319
		} else {
320
			if (added && !removed) return IResourceDelta.ADDED;
321
			if (removed && !added) return IResourceDelta.REMOVED;
322
			return IResourceDelta.CHANGED;
323
		}
324
	}
325
326
	public String toString() {
327
		List<Entry> entries = getResolvedEntries();
328
		StringBuilder result = new StringBuilder();
329
		if (isDelta) {
330
			switch (getKind()) {
331
			case IResourceDelta.CHANGED: result.append("CHANGED"); break;
332
			case IResourceDelta.ADDED: result.append("ADDED"); break;
333
			case IResourceDelta.REMOVED: result.append("REMOVED"); break;
334
			case IResourceDelta.NO_CHANGE: result.append("NO_CHANGE"); break;
335
			
336
			default: result.append("????");
337
			}
338
			result.append(" ");
339
		}
340
		result.append(runtimePath).append(" -> [");
341
		boolean first = true;
342
		for(Entry entry : entries) {
343
			if (entry.getRuntimePath() == null) {
344
				if (!first) result.append(", ");
345
				if (entry.getResource() != null) {
346
					result.append(entry.getResource().toString());
347
				}
348
				if (entry.getFile() != null) {
349
					result.append(entry.getFile().isDirectory()? 'F': 'L');
350
					result.append(entry.getFile().toURI().getPath());
351
				}
352
				first = false;
353
			}
354
		}
355
		result.append("]");
356
		return result.toString();
357
	}
358
359
	public boolean isFolder() {
360
		List<Entry> resolvedEntries = getResolvedEntries();
361
		if (resolvedEntries.size() == 0) return true;
362
		Entry entry = resolvedEntries.get(0);
363
		return (entry.getResource() != null && entry.getResource() instanceof IContainer)
364
			|| (entry.getFile() != null && entry.getFile().isDirectory())
365
			|| (entry.getNode() != null && entry.getNode().isFolder());
366
	}
367
368
	public VirtualTreeNode getVirtualTreeDelta(IResourceDelta delta) {
369
		List<Entry> result = new ArrayList<Entry>();
370
		for (Entry entry : entries) {
371
			IResource resource = entry.getResource();
372
			VirtualTreeNode node = entry.getNode();
373
			IPath runtimePath = entry.getRuntimePath();
374
			if (runtimePath != null && runtimePath.segmentCount() == 0) runtimePath = null;
375
			if (resource != null) {
376
				result.add(new Entry(runtimePath, resource, null, null, findMember(delta, resource.getFullPath())));
377
			} else {
378
				result.add(new Entry(runtimePath, null, null, node.getVirtualTreeDelta(delta), null));
379
			}
380
		}
381
		return newVirtualTreeNode(Path.ROOT, result, true);
382
	}
383
}
(-).settings/org.eclipse.jdt.ui.prefs (+3 lines)
Added Link Here
1
#Sat Aug 19 23:14:33 EDT 2006
2
eclipse.preferences.version=1
3
internal.default.compliance=default

Return to bug 150673