View | Details | Raw Unified | Return to bug 293861 | Differences between
and this patch

Collapse All | Expand All

(-)search/org/eclipse/jdt/internal/core/search/indexing/AddJarFileToIndex.java (-3 / +37 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2008 IBM Corporation and others.
2
 * Copyright (c) 2000, 2010 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
5
 * which accompanies this distribution, and is available at
Lines 22-31 Link Here
22
import org.eclipse.core.runtime.IPath;
22
import org.eclipse.core.runtime.IPath;
23
import org.eclipse.core.runtime.IProgressMonitor;
23
import org.eclipse.core.runtime.IProgressMonitor;
24
import org.eclipse.core.runtime.Path;
24
import org.eclipse.core.runtime.Path;
25
import org.eclipse.jdt.core.compiler.InvalidInputException;
25
import org.eclipse.jdt.core.search.IJavaSearchScope;
26
import org.eclipse.jdt.core.search.IJavaSearchScope;
26
import org.eclipse.jdt.core.search.SearchEngine;
27
import org.eclipse.jdt.core.search.SearchEngine;
27
import org.eclipse.jdt.core.search.SearchParticipant;
28
import org.eclipse.jdt.core.search.SearchParticipant;
29
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
30
import org.eclipse.jdt.internal.compiler.parser.Scanner;
31
import org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
28
import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
32
import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
33
import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
29
import org.eclipse.jdt.internal.compiler.util.Util;
34
import org.eclipse.jdt.internal.compiler.util.Util;
30
import org.eclipse.jdt.internal.core.JavaModelManager;
35
import org.eclipse.jdt.internal.core.JavaModelManager;
31
import org.eclipse.jdt.internal.core.index.Index;
36
import org.eclipse.jdt.internal.core.index.Index;
Lines 36-41 Link Here
36
41
37
	private static final char JAR_SEPARATOR = IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR.charAt(0);
42
	private static final char JAR_SEPARATOR = IJavaSearchScope.JAR_FILE_ENTRY_SEPARATOR.charAt(0);
38
	IFile resource;
43
	IFile resource;
44
	Scanner scanner;
39
45
40
	public AddJarFileToIndex(IFile resource, IndexManager manager) {
46
	public AddJarFileToIndex(IFile resource, IndexManager manager) {
41
		super(resource.getFullPath(), manager);
47
		super(resource.getFullPath(), manager);
Lines 153-159 Link Here
153
						// iterate each entry to index it
159
						// iterate each entry to index it
154
						ZipEntry ze = (ZipEntry) e.nextElement();
160
						ZipEntry ze = (ZipEntry) e.nextElement();
155
						String zipEntryName = ze.getName();
161
						String zipEntryName = ze.getName();
156
						if (Util.isClassFileName(zipEntryName))
162
						if (Util.isClassFileName(zipEntryName) && isValidPackageNameForClass(zipEntryName))
163
								// the class file may not be there if the package name is not valid
157
							indexedFileNames.put(zipEntryName, EXISTS);
164
							indexedFileNames.put(zipEntryName, EXISTS);
158
					}
165
					}
159
					boolean needToReindex = indexedFileNames.elementSize != max; // a new file was added
166
					boolean needToReindex = indexedFileNames.elementSize != max; // a new file was added
Lines 195-201 Link Here
195
202
196
					// iterate each entry to index it
203
					// iterate each entry to index it
197
					ZipEntry ze = (ZipEntry) e.nextElement();
204
					ZipEntry ze = (ZipEntry) e.nextElement();
198
					if (Util.isClassFileName(ze.getName())) {
205
					String zipEntryName = ze.getName();
206
					if (Util.isClassFileName(zipEntryName) && 
207
							isValidPackageNameForClass(zipEntryName)) {
208
						// index only classes coming from valid packages - https://bugs.eclipse.org/bugs/show_bug.cgi?id=293861
199
						final byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getZipEntryByteContent(ze, zip);
209
						final byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getZipEntryByteContent(ze, zip);
200
						JavaSearchDocument entryDocument = new JavaSearchDocument(ze, zipFilePath, classFileBytes, participant);
210
						JavaSearchDocument entryDocument = new JavaSearchDocument(ze, zipFilePath, classFileBytes, participant);
201
						this.manager.indexDocument(entryDocument, participant, index, this.containerPath);
211
						this.manager.indexDocument(entryDocument, participant, index, this.containerPath);
Lines 228-233 Link Here
228
		if (this.resource != null)
238
		if (this.resource != null)
229
			return super.getJobFamily();
239
			return super.getJobFamily();
230
		return this.containerPath.toOSString(); // external jar
240
		return this.containerPath.toOSString(); // external jar
241
	}	
242
	private  boolean isValidPackageNameForClass(String className) {
243
		char[] classNameArray = className.toCharArray();
244
		if (this.scanner == null)
245
			this.scanner = new Scanner(false /* comment */, true /* whitespace */, false /* nls */,
246
					ClassFileConstants.JDK1_3/* sourceLevel */, null/* taskTag */, null/* taskPriorities */, true /* taskCaseSensitive */);
247
		this.scanner.setSource(classNameArray); 
248
		this.scanner.eofPosition = classNameArray.length - SuffixConstants.SUFFIX_CLASS.length;
249
		try {
250
			if (this.scanner.scanIdentifier() == TerminalTokens.TokenNameIdentifier) {
251
				while (this.scanner.eofPosition > this.scanner.currentPosition) {
252
					if (this.scanner.getNextChar() != '/' || this.scanner.eofPosition <= this.scanner.currentPosition) {
253
						return false;
254
					}
255
					if (this.scanner.scanIdentifier() != TerminalTokens.TokenNameIdentifier) {
256
						return false;
257
					}
258
				}
259
				return true;
260
			}
261
		} catch (InvalidInputException e) {
262
			// invalid class name
263
		}
264
		return false;
231
	}
265
	}
232
	protected Integer updatedIndexState() {
266
	protected Integer updatedIndexState() {
233
		return IndexManager.REBUILDING_STATE;
267
		return IndexManager.REBUILDING_STATE;
(-)src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java (-1 / +71 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2009 IBM Corporation and others.
2
 * Copyright (c) 2000, 2010 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
5
 * which accompanies this distribution, and is available at
Lines 11070-11073 Link Here
11070
		removeClasspathEntry(JAVA_PROJECT, new Path(libPath));
11070
		removeClasspathEntry(JAVA_PROJECT, new Path(libPath));
11071
	}
11071
	}
11072
}
11072
}
11073
/**
11074
 * @bug 293861: Problem with refactoring when existing jar with invalid package names
11075
 * @test Ensure that the search doesn't return classes with invalid package names
11076
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=293861"
11077
 */
11078
public void testBug293861a() throws CoreException {
11079
	try 
11080
	{
11081
		IJavaProject project = createJavaProject("P");
11082
		addClasspathEntry(project, JavaCore.newLibraryEntry(new Path("/JavaSearchBugs/lib/b293861.jar"), null, null));
11083
		int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES | IJavaSearchScope.REFERENCED_PROJECTS;
11084
		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask);
11085
				
11086
		search("b293861TestFunc", IJavaSearchConstants.METHOD, IJavaSearchConstants.DECLARATIONS, scope);
11087
		assertSearchResults("No search results expected", "", this.resultCollector);
11088
	} finally {
11089
		deleteProject("P");
11090
	}
11091
}
11092
11093
/*
11094
 * SearchEngine#searchAllTypeNames should also not return classes with invalid package names
11095
 */
11096
public void testBug293861b() throws CoreException {
11097
	try
11098
	{
11099
		IJavaProject project = createJavaProject("P");
11100
		addClasspathEntry(project, JavaCore.newLibraryEntry(new Path("/JavaSearchBugs/lib/b293861.jar"), null, null));
11101
		int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES | IJavaSearchScope.REFERENCED_PROJECTS;
11102
		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask);
11103
		
11104
		TypeNameMatchCollector collector = new TypeNameMatchCollector();
11105
		new SearchEngine().searchAllTypeNames(
11106
				null,
11107
				new char[][] {"b293861Test".toCharArray()},
11108
				scope,
11109
				collector,
11110
				IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
11111
				null);
11112
		assertSearchResults("No search results expected", "", collector);		
11113
	} finally {
11114
		deleteProject("P");
11115
	}
11116
}
11117
11118
/*
11119
 * enum is a valid package name in Java1.4 and those classes should be returned by search
11120
 */
11121
public void testBug293861c() throws CoreException {
11122
	try
11123
	{
11124
		IJavaProject project = createJavaProject("P");
11125
		addClasspathEntry(project, JavaCore.newLibraryEntry(new Path("/JavaSearchBugs/lib/b293861.jar"), null, null));
11126
		int mask = IJavaSearchScope.APPLICATION_LIBRARIES | IJavaSearchScope.SOURCES | IJavaSearchScope.REFERENCED_PROJECTS;
11127
		IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] { project }, mask);
11128
		
11129
		TypeNameMatchCollector collector = new TypeNameMatchCollector();
11130
		new SearchEngine().searchAllTypeNames(
11131
				null,
11132
				new char[][] {"InEnumPackage".toCharArray()},
11133
				scope,
11134
				collector,
11135
				IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
11136
				null);
11137
		assertSearchResults("Unexpected search results!", "InEnumPackage (not open) [in InEnumPackage.class [in enum [in /JavaSearchBugs/lib/b293861.jar [in P]]]]", collector);		
11138
	} finally {
11139
		deleteProject("P");
11140
	}
11141
}
11142
11073
}
11143
}
(-)src/org/eclipse/jdt/core/tests/performance/FullSourceWorkspaceSearchTests.java (-3 / +2 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2008 IBM Corporation and others.
2
 * Copyright (c) 2000, 2010 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
5
 * which accompanies this distribution, and is available at
Lines 19-25 Link Here
19
19
20
import org.eclipse.core.runtime.CoreException;
20
import org.eclipse.core.runtime.CoreException;
21
import org.eclipse.core.runtime.IProgressMonitor;
21
import org.eclipse.core.runtime.IProgressMonitor;
22
import org.eclipse.core.runtime.Path;
23
import org.eclipse.jdt.core.IJavaElement;
22
import org.eclipse.jdt.core.IJavaElement;
24
import org.eclipse.jdt.core.IPackageFragment;
23
import org.eclipse.jdt.core.IPackageFragment;
25
import org.eclipse.jdt.core.search.*;
24
import org.eclipse.jdt.core.search.*;
Lines 211-217 Link Here
211
		AbstractJavaModelTests.waitUntilIndexesReady();
210
		AbstractJavaModelTests.waitUntilIndexesReady();
212
211
213
		// Remove project previous indexing
212
		// Remove project previous indexing
214
		INDEX_MANAGER.removeIndexFamily(new Path(""));
213
		INDEX_MANAGER.deleteIndexFiles();
215
		INDEX_MANAGER.reset();
214
		INDEX_MANAGER.reset();
216
215
217
		// Clean memory
216
		// Clean memory

Return to bug 293861