View | Details | Raw Unified | Return to bug 190840
Collapse All | Expand All

(-)src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceModelTests.java (+48 lines)
Lines 1074-1079 Link Here
1074
	}
1074
	}
1075
}
1075
}
1076
1076
1077
/*
1078
 * Performance test for the first time we get the source of a class file in a bug jar with no source attached
1079
 * (regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190840 )
1080
 */
1081
public void testGetSourceBigJarNoAttachment() throws CoreException {
1082
	
1083
	IJavaProject project = null;
1084
	try {
1085
		project = createJavaProject("HugeJarProject");
1086
		IFile bigJar1 = BIG_PROJECT.getProject().getFile(BIG_JAR1_NAME);
1087
		project.setRawClasspath(
1088
			new IClasspathEntry[] {
1089
				JavaCore.newLibraryEntry(bigJar1.getFullPath(), null, null),
1090
			}, null);
1091
		AbstractJavaModelTests.waitUntilIndexesReady();
1092
		AbstractJavaModelTests.waitForAutoBuild();
1093
		IPackageFragmentRoot root = project.getPackageFragmentRoot(bigJar1);
1094
		IClassFile classFile = root.getPackageFragment("p0").getClassFile("X0.class");
1095
		
1096
		// warm up
1097
		int max = 20;
1098
		int warmup = WARMUP_COUNT / 10;
1099
		for (int i = 0; i < warmup; i++) {
1100
			for (int j = 0; j < max; j++) {
1101
				root.close();
1102
				classFile.getSource();
1103
			}
1104
		}
1105
			
1106
		// measure performance
1107
		for (int i = 0; i < MEASURES_COUNT; i++) {
1108
			runGc();
1109
			startMeasuring();
1110
			for (int j = 0; j < max; j++) {
1111
				root.close();
1112
				classFile.getSource();
1113
			}
1114
			stopMeasuring();
1115
		}
1116
	
1117
		commitMeasurements();
1118
		assertPerformance();
1119
	} finally {
1120
		if (project != null)
1121
			project.getProject().delete(false, null);
1122
	}
1123
}
1124
1077
protected void resetCounters() {
1125
protected void resetCounters() {
1078
	// do nothing
1126
	// do nothing
1079
}
1127
}
(-)model/org/eclipse/jdt/internal/core/SourceMapper.java (-50 / +59 lines)
Lines 345-350 Link Here
345
			return;
345
			return;
346
		}
346
		}
347
		IPackageFragmentRoot root = (IPackageFragmentRoot) type.getPackageFragment().getParent();
347
		IPackageFragmentRoot root = (IPackageFragmentRoot) type.getPackageFragment().getParent();
348
		IPath pkgFragmentRootPath = root.getPath();
348
		final HashSet tempRoots = new HashSet();
349
		final HashSet tempRoots = new HashSet();
349
		long time = 0;
350
		long time = 0;
350
		if (VERBOSE) {
351
		if (VERBOSE) {
Lines 353-388 Link Here
353
		}
354
		}
354
		final HashSet firstLevelPackageNames = new HashSet();
355
		final HashSet firstLevelPackageNames = new HashSet();
355
		boolean containsADefaultPackage = false;
356
		boolean containsADefaultPackage = false;
357
		boolean containsJavaSource = !pkgFragmentRootPath.equals(this.sourcePath); // used to optimize zip file reading only if source path and root path are equals, otherwise assume that attachment contains Java source
356
358
357
		String sourceLevel = null;
359
		String sourceLevel = null;
358
		String complianceLevel = null;
360
		String complianceLevel = null;
359
		if (root.isArchive()) {
361
		if (root.isArchive()) {
360
			JarPackageFragmentRoot jarPackageFragmentRoot = (JarPackageFragmentRoot) root;
361
			JavaModelManager manager = JavaModelManager.getJavaModelManager();
362
			JavaModelManager manager = JavaModelManager.getJavaModelManager();
362
			ZipFile zip = null;
363
			ZipFile zip = null;
363
			try {
364
			try {
364
				zip = manager.getZipFile(jarPackageFragmentRoot.getPath());
365
				zip = manager.getZipFile(pkgFragmentRootPath);
365
				for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
366
				for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
366
					ZipEntry entry = (ZipEntry) entries.nextElement();
367
					ZipEntry entry = (ZipEntry) entries.nextElement();
367
					String entryName = entry.getName();
368
					String entryName = entry.getName();
368
					if (!entry.isDirectory()) {
369
					if (!entry.isDirectory()) {
369
						int index = entryName.indexOf('/');
370
						if (Util.isClassFileName(entryName)) {
370
						if (index != -1 && Util.isClassFileName(entryName)) {
371
							int index = entryName.indexOf('/');
371
							String firstLevelPackageName = entryName.substring(0, index);
372
							if (index != -1) {
372
							if (!firstLevelPackageNames.contains(firstLevelPackageName)) {
373
								String firstLevelPackageName = entryName.substring(0, index);
373
								if (sourceLevel == null) {
374
								if (!firstLevelPackageNames.contains(firstLevelPackageName)) {
374
									IJavaProject project = root.getJavaProject();
375
									if (sourceLevel == null) {
375
									sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
376
										IJavaProject project = root.getJavaProject();
376
									complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
377
										sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
377
								}
378
										complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
378
								IStatus status = JavaConventions.validatePackageName(firstLevelPackageName, sourceLevel, complianceLevel);
379
									}
379
								if (status.isOK() || status.getSeverity() == IStatus.WARNING) {
380
									IStatus status = JavaConventions.validatePackageName(firstLevelPackageName, sourceLevel, complianceLevel);
380
									firstLevelPackageNames.add(firstLevelPackageName);
381
									if (status.isOK() || status.getSeverity() == IStatus.WARNING) {
382
										firstLevelPackageNames.add(firstLevelPackageName);
383
									}
381
								}
384
								}
385
							} else {
386
								containsADefaultPackage = true;
382
							}
387
							}
383
						} else if (Util.isClassFileName(entryName)) {
388
						} else if (!containsJavaSource && org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(entryName)) {
384
							containsADefaultPackage = true;
389
							containsJavaSource = true;
385
						}						
390
						}
386
					}
391
					}
387
				}
392
				}
388
			} catch (CoreException e) {
393
			} catch (CoreException e) {
Lines 399-417 Link Here
399
						IResource[] members = ((IContainer) resource).members();
404
						IResource[] members = ((IContainer) resource).members();
400
						for (int i = 0, max = members.length; i < max; i++) {
405
						for (int i = 0, max = members.length; i < max; i++) {
401
							IResource member = members[i];
406
							IResource member = members[i];
407
							String resourceName = member.getName();
402
							if (member.getType() == IResource.FOLDER) {
408
							if (member.getType() == IResource.FOLDER) {
403
								if (sourceLevel == null) {
409
								if (sourceLevel == null) {
404
									IJavaProject project = root.getJavaProject();
410
									IJavaProject project = root.getJavaProject();
405
									sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
411
									sourceLevel = project.getOption(JavaCore.COMPILER_SOURCE, true);
406
									complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
412
									complianceLevel = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
407
								}
413
								}
408
								String firstLevelPackageName = member.getName();
414
								IStatus status = JavaConventions.validatePackageName(resourceName, sourceLevel, complianceLevel);
409
								IStatus status = JavaConventions.validatePackageName(firstLevelPackageName, sourceLevel, complianceLevel);
410
								if (status.isOK() || status.getSeverity() == IStatus.WARNING) {
415
								if (status.isOK() || status.getSeverity() == IStatus.WARNING) {
411
									firstLevelPackageNames.add(firstLevelPackageName);
416
									firstLevelPackageNames.add(resourceName);
412
								}
417
								}
413
							} else if (Util.isClassFileName(member.getName())) {
418
							} else if (Util.isClassFileName(resourceName)) {
414
								containsADefaultPackage = true;
419
								containsADefaultPackage = true;
420
							} else if (!containsJavaSource && org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(resourceName)) {
421
								containsJavaSource = true;
415
							}
422
							}
416
						}
423
						}
417
					} catch (CoreException e) {
424
					} catch (CoreException e) {
Lines 421-460 Link Here
421
			}
428
			}
422
		}
429
		}
423
430
424
		Object target = JavaModel.getTarget(this.sourcePath, true);
431
		if (containsJavaSource) { // no need to read source attachment if it contains no Java source (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=190840 )
425
		if (target instanceof IContainer) {
432
			Object target = JavaModel.getTarget(this.sourcePath, true);
426
			IContainer folder = (IContainer)target;
433
			if (target instanceof IContainer) {
427
			computeRootPath(folder, firstLevelPackageNames, containsADefaultPackage, tempRoots, folder.getFullPath().segmentCount()/*if external folder, this is the linked folder path*/);
434
				IContainer folder = (IContainer)target;
428
		} else {
435
				computeRootPath(folder, firstLevelPackageNames, containsADefaultPackage, tempRoots, folder.getFullPath().segmentCount()/*if external folder, this is the linked folder path*/);
429
			JavaModelManager manager = JavaModelManager.getJavaModelManager();
436
			} else {
430
			ZipFile zip = null;
437
				JavaModelManager manager = JavaModelManager.getJavaModelManager();
431
			try {
438
				ZipFile zip = null;
432
				zip = manager.getZipFile(this.sourcePath);
439
				try {
433
				for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
440
					zip = manager.getZipFile(this.sourcePath);
434
					ZipEntry entry = (ZipEntry) entries.nextElement();
441
					for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
435
					String entryName;
442
						ZipEntry entry = (ZipEntry) entries.nextElement();
436
					if (!entry.isDirectory() && org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(entryName = entry.getName())) {
443
						String entryName;
437
						IPath path = new Path(entryName);
444
						if (!entry.isDirectory() && org.eclipse.jdt.internal.core.util.Util.isJavaLikeFileName(entryName = entry.getName())) {
438
						int segmentCount = path.segmentCount();
445
							IPath path = new Path(entryName);
439
						if (segmentCount > 1) {
446
							int segmentCount = path.segmentCount();
440
							for (int i = 0, max = path.segmentCount() - 1; i < max; i++) {
447
							if (segmentCount > 1) {
441
								if (firstLevelPackageNames.contains(path.segment(i))) {
448
								for (int i = 0, max = path.segmentCount() - 1; i < max; i++) {
442
									tempRoots.add(path.uptoSegment(i));
449
									if (firstLevelPackageNames.contains(path.segment(i))) {
443
									// don't break here as this path could contain other first level package names (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=74014)
450
										tempRoots.add(path.uptoSegment(i));
444
								}
451
										// don't break here as this path could contain other first level package names (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=74014)
445
								if (i == max - 1 && containsADefaultPackage) {
452
									}
446
									tempRoots.add(path.uptoSegment(max));
453
									if (i == max - 1 && containsADefaultPackage) {
454
										tempRoots.add(path.uptoSegment(max));
455
									}
447
								}
456
								}
457
							} else if (containsADefaultPackage) {
458
								tempRoots.add(new Path("")); //$NON-NLS-1$
448
							}
459
							}
449
						} else if (containsADefaultPackage) {
450
							tempRoots.add(new Path("")); //$NON-NLS-1$
451
						}
460
						}
452
					}
461
					}
462
				} catch (CoreException e) {
463
					// ignore
464
				} finally {
465
					manager.closeZipFile(zip); // handle null case
453
				}
466
				}
454
			} catch (CoreException e) {
455
				// ignore
456
			} finally {
457
				manager.closeZipFile(zip); // handle null case
458
			}
467
			}
459
		}
468
		}
460
		int size = tempRoots.size();
469
		int size = tempRoots.size();

Return to bug 190840