1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

New core framework for indexer

New UI framework for indexer
Updates to core tests/ui tests
This commit is contained in:
Bogdan Gheorghe 2005-03-14 05:32:07 +00:00
parent db73140257
commit 8cb9d02dae
73 changed files with 3400 additions and 2109 deletions

View file

@ -1,3 +1,6 @@
2005-03-13 Bogdan Gheorghe
Updated tests to work with new index framework
2005-02-02 Tanya Wolff
added regression tests to AutomatedIntegrationSuite
* build.properties

View file

@ -20,6 +20,9 @@ import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexChangeListener;
import org.eclipse.cdt.core.index.IIndexDelta;
import org.eclipse.cdt.core.index.IndexChangeEvent;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.search.BasicSearchResultCollector;
import org.eclipse.cdt.core.search.ICSearchConstants;
@ -30,12 +33,14 @@ import org.eclipse.cdt.core.search.IMatch;
import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.internal.core.browser.cache.TypeCacheManager;
import org.eclipse.cdt.internal.core.index.impl.IFileDocument;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.PathCollector;
import org.eclipse.cdt.internal.core.search.PatternSearchJob;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.cdt.internal.core.sourcedependency.DependencyQueryJob;
import org.eclipse.cdt.internal.core.sourcedependency.UpdateDependency;
import org.eclipse.core.resources.IFile;
@ -53,7 +58,7 @@ import org.eclipse.core.runtime.Platform;
/**
* @author bgheorgh
*/
public class DependencyTests extends TestCase {
public class DependencyTests extends TestCase implements IIndexChangeListener {
IFile file;
IFileDocument fileDoc;
IProject testProject;
@ -63,12 +68,15 @@ import org.eclipse.core.runtime.Platform;
BasicSearchResultCollector resultCollector;
SearchEngine searchEngine;
ICSearchScope scope;
SourceIndexer sourceIndexer;
boolean fileIndexed;
public static final int TIMEOUT = 50;
public static Test suite() {
TestSuite suite = new TestSuite(DependencyTests.class.getName());
suite.addTest(new DependencyTests("testDependencyTree"));
suite.addTest(new DependencyTests("testDepTable"));
//suite.addTest(new DependencyTests("testDepTable"));
suite.addTest(new DependencyTests("testDepSourceChangeTree"));
suite.addTest(new DependencyTests("testDepHeaderChangeTree"));
suite.addTest(new DependencyTests("testDepHeaderChangeReindex"));
@ -97,7 +105,8 @@ import org.eclipse.core.runtime.Platform;
if (indexFile.exists())
indexFile.delete();
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(false));
testProject.setSessionProperty(IndexManager.indexerIDKey, SourceIndexerTests.sourceIndexerID);
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
if (testProject==null)
fail("Unable to create project");
@ -105,6 +114,9 @@ import org.eclipse.core.runtime.Platform;
indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
indexManager.reset();
TypeCacheManager typeCacheManager = TypeCacheManager.getInstance();
typeCacheManager.setProcessTypeCacheEvents(false);
workspace = ResourcesPlugin.getWorkspace();
scope = SearchEngine.createWorkspaceScope();
@ -112,6 +124,9 @@ import org.eclipse.core.runtime.Platform;
resultCollector = new BasicSearchResultCollector();
searchEngine = new SearchEngine();
sourceIndexer = (SourceIndexer) indexManager.getIndexerForProject(testProject);
sourceIndexer.addIndexChangeListener(this);
}
/*
* @see TestCase#tearDown()
@ -121,6 +136,9 @@ import org.eclipse.core.runtime.Platform;
super.tearDown();
} catch (Exception e1) {
}
sourceIndexer.shutdown();
//Delete project
if (testProject.exists()){
try {
@ -156,19 +174,13 @@ import org.eclipse.core.runtime.Platform;
importFile("DepTest2.h","resources/dependency/DepTest2.h");
IFile depTest = importFile("DepTest.cpp","resources/dependency/DepTest.cpp");
IFile depTest2 = importFile("DepTest2.cpp","resources/dependency/DepTest2.cpp");
//Enable indexing on the created project
//By doing this, we force the Dependency Manager to do a g()
IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
//indexManager.setEnabled(testProject,true);
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
String[] depTestModel = {File.separator + "DepTestProject" + File.separator + "d.h", File.separator + "DepTestProject" + File.separator + "Inc1.h", File.separator + "DepTestProject" + File.separator + "c.h", File.separator + "DepTestProject" + File.separator + "a.h", File.separator + "DepTestProject" + File.separator + "DepTest.h"};
String[] depTest2Model = {File.separator + "DepTestProject" + File.separator + "d.h", File.separator + "DepTestProject" + File.separator + "DepTest2.h"};
ArrayList includes = new ArrayList();
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null,null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest,sourceIndexer,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null,null);
String[] depTestModelLocal = convertToLocalPath(depTestModel);
String[] depTestIncludes = new String[includes.size()];
@ -191,7 +203,7 @@ import org.eclipse.core.runtime.Platform;
}
ArrayList includes2 = new ArrayList();
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest2,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null,null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest2,sourceIndexer,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null,null);
String[] depTest2ModelLocal = convertToLocalPath(depTest2Model);
String[] depTest2Includes = new String[includes2.size()];
@ -226,7 +238,7 @@ import org.eclipse.core.runtime.Platform;
IFile depTestH = importFile("DepTest.h","resources/dependency/DepTest.h");
IFile depTest2H = importFile("DepTest2.h","resources/dependency/DepTest2.h");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
PathCollector pathCollector = new PathCollector();
getTableRefs(dH, pathCollector);
@ -273,7 +285,7 @@ import org.eclipse.core.runtime.Platform;
IFile depTestH = importFile("DepTest.h","resources/dependency/DepTest.h");
IFile depTestC = importFile("DepTest.cpp","resources/dependency/DepTest.cpp");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
String[] beforeModel = {Path.SEPARATOR + "DepTestProject" + IPath.SEPARATOR + "DepTest.cpp"};
@ -370,14 +382,14 @@ import org.eclipse.core.runtime.Platform;
IFile depTestC = importFile("DepTest.cpp","resources/dependency/DepTest.cpp");
IFile depTest2C = importFile("DepTest2.cpp","resources/dependency/DepTest2.cpp");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
String[] preDepTestModel = {File.separator + "DepTestProject" + File.separator + "DepTest.h", File.separator + "DepTestProject" + File.separator + "Inc1.h", File.separator + "DepTestProject" + File.separator + "a.h", File.separator + "DepTestProject" + File.separator + "c.h", File.separator + "DepTestProject" + File.separator + "d.h"};
ArrayList includes = new ArrayList();
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,sourceIndexer,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
String[] preDepTestModelLocal = convertToLocalPath(preDepTestModel);
String[] preDepTestIncludes = new String[includes.size()];
@ -406,7 +418,7 @@ import org.eclipse.core.runtime.Platform;
testProject.refreshLocal(IResource.DEPTH_INFINITE,null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,sourceIndexer,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
String[] postDepTestModelLocal = convertToLocalPath(postDepTestModel);
@ -439,14 +451,14 @@ import org.eclipse.core.runtime.Platform;
IFile depTest3H = importFile("DepTest3.h","resources/dependency/DepTest3.h");
IFile depTest3C = importFile("DepTest3.cpp","resources/dependency/DepTest3.cpp");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
String[] preDepTestModel = {File.separator + "DepTestProject" + File.separator + "DepTest3.h", File.separator + "DepTestProject" + File.separator + "a.h", File.separator + "DepTestProject" + File.separator + "c.h"};
ArrayList includes = new ArrayList();
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,sourceIndexer,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
String[] preDepTestModelLocal = convertToLocalPath(preDepTestModel);
String[] preDepTestIncludes = new String[includes.size()];
@ -475,7 +487,7 @@ import org.eclipse.core.runtime.Platform;
testProject.refreshLocal(IResource.DEPTH_INFINITE,null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,sourceIndexer,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
String[] postDepTestModelLocal = convertToLocalPath(postDepTestModel);
@ -508,7 +520,7 @@ import org.eclipse.core.runtime.Platform;
IFile depTest3H = importFile("DepTest3.h","resources/dependency/DepTest3.h");
IFile depTest3C = importFile("DepTest3.cpp","resources/dependency/DepTest3.cpp");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
String[] beforeModel = {Path.SEPARATOR + "DepTestProject" + IPath.SEPARATOR + "DepTest3.cpp"};
@ -568,7 +580,7 @@ import org.eclipse.core.runtime.Platform;
assertFalse(nonExistantResource.exists());
assertNull(nonExistantResource.getLocation());
IJob job = new UpdateDependency(nonExistantResource);
IIndexJob job = new UpdateDependency(nonExistantResource, sourceIndexer);
assertFalse(job.execute(new NullProgressMonitor()));
}
@ -580,7 +592,7 @@ import org.eclipse.core.runtime.Platform;
IFile depTest3H = importFile("DepTest3.h","resources/dependency/DepTest3.h");
IFile depTest3C = importFile("DepTest3.cpp","resources/dependency/DepTest3.cpp");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
ICSearchPattern pattern = SearchEngine.createSearchPattern( "Z", ICSearchConstants.TYPE, ICSearchConstants.DECLARATIONS, true );
@ -712,8 +724,8 @@ import org.eclipse.core.runtime.Platform;
}
private IFile importFile(String fileName, String resourceLocation)throws Exception{
String testCaseName = this.getName();
private IFile importFile(String fileName, String resourceLocation)throws Exception {
resetIndexState();
//Obtain file handle
file = testProject.getProject().getFile(fileName);
//Create file input stream
@ -724,6 +736,26 @@ import org.eclipse.core.runtime.Platform;
false, monitor);
}
fileDoc = new IFileDocument(file);
waitForIndex(10); // only wait 20 seconds max.
return file;
}
}
public void resetIndexState() {
fileIndexed = false;
}
public void waitForIndex(int maxSec) throws Exception {
int delay = 0;
while (fileIndexed != true && delay < (maxSec * 1000))
{
Thread.sleep(TIMEOUT);
delay += TIMEOUT;
}
}
public void indexChanged(IndexChangeEvent event) {
IIndexDelta delta = event.getDelta();
if (delta.getDeltaType() == IIndexDelta.MERGE_DELTA){
fileIndexed = true;
}
}
}

View file

@ -33,6 +33,8 @@ import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.IQueryResult;
import org.eclipse.cdt.internal.core.index.impl.IFileDocument;
import org.eclipse.cdt.internal.core.index.sourceindexer.CIndexStorage;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IIndexConstants;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IFile;
@ -47,20 +49,22 @@ import org.eclipse.core.runtime.Path;
/**
* @author bgheorgh
*/
public class IndexManagerTests extends TestCase implements IIndexChangeListener {
public class SourceIndexerTests extends TestCase implements IIndexChangeListener {
IFile file;
IFileDocument fileDoc;
IProject testProject;
NullProgressMonitor monitor;
IndexManager indexManager;
SourceIndexer sourceIndexer;
boolean fileIndexed;
static final String sourceIndexerID = "org.eclipse.cdt.core.originalsourceindexer"; //$NON-NLS-1$
public static final int TIMEOUT = 50;
/**
* Constructor for IndexManagerTest.
* @param name
*/
public IndexManagerTests(String name) {
public SourceIndexerTests(String name) {
super(name);
}
@ -89,22 +93,28 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
monitor = new NullProgressMonitor();
//Create temp project
testProject = createProject("IndexerTestProject");
testProject = createProject("IndexerTestProject"); //$NON-NLS-1$
IPath pathLoc = CCorePlugin.getDefault().getStateLocation();
File indexFile = new File(pathLoc.append("3915980774.index").toOSString());
File indexFile = new File(pathLoc.append("3915980774.index").toOSString()); //$NON-NLS-1$
if (indexFile.exists())
indexFile.delete();
//Set the id of the source indexer extension point as a session property to allow
//index manager to instantiate it
testProject.setSessionProperty(IndexManager.indexerIDKey, sourceIndexerID);
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
//Enable indexing on test project
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
if (testProject==null)
fail("Unable to create project");
fail("Unable to create project"); //$NON-NLS-1$
indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
indexManager.reset();
indexManager.addIndexChangeListener(this);
//Get the indexer used for the test project
sourceIndexer = (SourceIndexer) indexManager.getIndexerForProject(testProject);
sourceIndexer.addIndexChangeListener(this);
}
/*
* @see TestCase#tearDown()
@ -112,7 +122,7 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
protected void tearDown() {
try {
super.tearDown();
indexManager.removeIndexChangeListener(this);
sourceIndexer.removeIndexChangeListener(this);
} catch (Exception e1) {
}
//Delete project
@ -128,7 +138,7 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
}
private String getMessage(IStatus status) {
StringBuffer message = new StringBuffer("[");
StringBuffer message = new StringBuffer("["); //$NON-NLS-1$
message.append(status.getMessage());
if (status.isMultiStatus()) {
IStatus children[] = status.getChildren();
@ -136,23 +146,23 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
message.append(getMessage(children[i]));
}
}
message.append("]");
message.append("]"); //$NON-NLS-1$
return message.toString();
}
public static Test suite() {
TestSuite suite = new TestSuite(IndexManagerTests.class.getName());
TestSuite suite = new TestSuite(SourceIndexerTests.class.getName());
suite.addTest(new IndexManagerTests("testAddNewFileToIndex"));
suite.addTest(new IndexManagerTests("testForwardDeclarations"));
suite.addTest(new IndexManagerTests("testIndexAll"));
suite.addTest(new IndexManagerTests("testIndexContents"));
suite.addTest(new IndexManagerTests("testMacros"));
suite.addTest(new IndexManagerTests("testRefs"));
suite.addTest(new IndexManagerTests("testExactDeclarations"));
suite.addTest(new IndexManagerTests("testRemoveFileFromIndex"));
suite.addTest(new IndexManagerTests("testRemoveProjectFromIndex"));
suite.addTest(new IndexManagerTests("testIndexShutdown"));
suite.addTest(new SourceIndexerTests("testAddNewFileToIndex")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testForwardDeclarations")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testIndexAll")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testIndexContents")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testMacros")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testRefs")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testExactDeclarations")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testRemoveFileFromIndex")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testRemoveProjectFromIndex")); //$NON-NLS-1$
suite.addTest(new SourceIndexerTests("testIndexShutdown")); //$NON-NLS-1$
return suite;
@ -161,7 +171,7 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
* Utils
*/
private IProject createProject(String projectName) throws CoreException {
ICProject cPrj = CProjectHelper.createCCProject(projectName, "bin");
ICProject cPrj = CProjectHelper.createCCProject(projectName, "bin"); //$NON-NLS-1$
return cPrj.getProject();
}
@ -188,27 +198,40 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
//Add a file to the project
importFile("mail.cpp","resources/indexer/mail.cpp");
importFile("mail.cpp","resources/indexer/mail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
IIndex ind = indexManager.getIndex(testProject.getFullPath(),true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProject.getFullPath(),true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
char[] prefix = "typeDecl/".toCharArray();
char[] prefix = "typeDecl/".toCharArray(); //$NON-NLS-1$
IQueryResult[] qresults = ind.queryPrefix(prefix);
IEntryResult[] eresults = ind.queryEntries(prefix);
assertTrue("Query Results exist", qresults != null);
assertTrue("Entry Results exist", eresults != null);
assertTrue("Query Results exist", qresults != null); //$NON-NLS-1$
assertTrue("Entry Results exist", eresults != null); //$NON-NLS-1$
String [] queryResultModel = {"IndexedFile(1: /IndexerTestProject/mail.cpp)"};
String [] entryResultModel ={"EntryResult: word=typeDecl/C/Mail, refs={ 1 }", "EntryResult: word=typeDecl/C/Unknown, refs={ 1 }", "EntryResult: word=typeDecl/C/container, refs={ 1 }", "EntryResult: word=typeDecl/C/first_class, refs={ 1 }", "EntryResult: word=typeDecl/C/postcard, refs={ 1 }","EntryResult: word=typeDecl/D/Mail, refs={ 1 }", "EntryResult: word=typeDecl/D/first_class, refs={ 1 }", "EntryResult: word=typeDecl/D/postcard, refs={ 1 }","EntryResult: word=typeDecl/V/PO_Box, refs={ 1 }", "EntryResult: word=typeDecl/V/index, refs={ 1 }", "EntryResult: word=typeDecl/V/mail, refs={ 1 }","EntryResult: word=typeDecl/V/size, refs={ 1 }", "EntryResult: word=typeDecl/V/temp, refs={ 1 }", "EntryResult: word=typeDecl/V/x, refs={ 1 }"};
String [] queryResultModel = {"IndexedFile(1: /IndexerTestProject/mail.cpp)"}; //$NON-NLS-1$
String [] entryResultModel ={"EntryResult: word=typeDecl/C/Mail, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/C/Unknown, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/C/container, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/C/first_class, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/C/postcard, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/D/Mail, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/D/first_class, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/D/postcard, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/V/PO_Box, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/V/index, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/V/mail, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/V/size, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/V/temp, refs={ 1 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/V/x, refs={ 1 }"}; //$NON-NLS-1$
if (qresults.length != queryResultModel.length)
fail("Query Result length different from model");
fail("Query Result length different from model"); //$NON-NLS-1$
if (eresults.length != entryResultModel.length)
fail("Entry Result length different from model");
fail("Entry Result length different from model"); //$NON-NLS-1$
for (int i=0; i<qresults.length;i++)
{
@ -225,28 +248,28 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
//Add a file to the project
importFile("mail.cpp","resources/indexer/mail.cpp");
importFile("mail.cpp","resources/indexer/mail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
//Add a new file to the project, give it some time to index
importFile("DocumentManager.h","resources/indexer/DocumentManager.h");
importFile("DocumentManager.h","resources/indexer/DocumentManager.h"); //$NON-NLS-1$ //$NON-NLS-2$
importFile("DocumentManager.cpp","resources/indexer/DocumentManager.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
ind = sourceIndexer.getIndex(testProjectPath,true,true);
importFile("DocumentManager.cpp","resources/indexer/DocumentManager.cpp");
ind = indexManager.getIndex(testProjectPath,true,true);
char[] prefix = "typeDecl/C/CDocumentManager".toCharArray();
String [] entryResultModel ={"EntryResult: word=typeDecl/C/CDocumentManager, refs={ 2 }"};
char[] prefix = "typeDecl/C/CDocumentManager".toCharArray(); //$NON-NLS-1$
String [] entryResultModel ={"EntryResult: word=typeDecl/C/CDocumentManager, refs={ 2 }"}; //$NON-NLS-1$
IEntryResult[] eresults =ind.queryEntries(prefix);
IEntryResult[] bogRe = ind.queryEntries(IIndexConstants.TYPE_DECL);
assertTrue("Entry Result exists", eresults != null);
assertTrue("Entry Result exists", eresults != null); //$NON-NLS-1$
if (eresults.length != entryResultModel.length)
fail("Entry Result length different from model");
fail("Entry Result length different from model"); //$NON-NLS-1$
for (int i=0;i<eresults.length; i++)
{
@ -258,18 +281,18 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
//Add a file to the project
importFile("mail.cpp","resources/indexer/mail.cpp");
importFile("mail.cpp","resources/indexer/mail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
//Delete the project
safeDelete(testProject);
//See if the index is still there
ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index deleted",ind == null);
ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index deleted",ind == null); //$NON-NLS-1$
}
/**
@ -290,33 +313,41 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
public void testRemoveFileFromIndex() throws Exception{
//Add a file to the project
importFile("mail.cpp","resources/indexer/mail.cpp");
importFile("mail.cpp","resources/indexer/mail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
importFile("DocumentManager.h","resources/indexer/DocumentManager.h");
importFile("DocumentManager.cpp","resources/indexer/DocumentManager.cpp");
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
importFile("DocumentManager.h","resources/indexer/DocumentManager.h"); //$NON-NLS-1$ //$NON-NLS-2$
importFile("DocumentManager.cpp","resources/indexer/DocumentManager.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
ind = indexManager.getIndex(testProjectPath,true,true);
ind = sourceIndexer.getIndex(testProjectPath,true,true);
//Do a "before" deletion comparison
//ind = indexManager.getIndex(testProjectPath,true,true);
char[] prefix = "typeDecl/".toCharArray();
char[] prefix = "typeDecl/".toCharArray(); //$NON-NLS-1$
IEntryResult[] eresults = ind.queryEntries(prefix);
assertTrue("Entry result found for typdeDecl/", eresults != null);
assertTrue("Entry result found for typdeDecl/", eresults != null); //$NON-NLS-1$
String [] entryResultBeforeModel ={"EntryResult: word=typeDecl/C/CDocumentManager, refs={ 2 }", "EntryResult: word=typeDecl/C/Mail, refs={ 3 }", "EntryResult: word=typeDecl/C/Unknown, refs={ 3 }", "EntryResult: word=typeDecl/C/container, refs={ 3 }", "EntryResult: word=typeDecl/C/first_class, refs={ 3 }", "EntryResult: word=typeDecl/C/postcard, refs={ 3 }", "EntryResult: word=typeDecl/D/Mail, refs={ 3 }", "EntryResult: word=typeDecl/D/first_class, refs={ 3 }", "EntryResult: word=typeDecl/D/postcard, refs={ 3 }", "EntryResult: word=typeDecl/V/, refs={ 1, 2 }", "EntryResult: word=typeDecl/V/PO_Box, refs={ 3 }", "EntryResult: word=typeDecl/V/index, refs={ 3 }", "EntryResult: word=typeDecl/V/mail, refs={ 3 }", "EntryResult: word=typeDecl/V/size, refs={ 3 }", "EntryResult: word=typeDecl/V/temp, refs={ 3 }", "EntryResult: word=typeDecl/V/x, refs={ 3 }"};
String [] entryResultBeforeModel ={"EntryResult: word=typeDecl/C/CDocumentManager, refs={ 2 }", //$NON-NLS-1$
"EntryResult: word=typeDecl/C/Mail, refs={ 3 }", "EntryResult: word=typeDecl/C/Unknown, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/C/container, refs={ 3 }", "EntryResult: word=typeDecl/C/first_class, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/C/postcard, refs={ 3 }", "EntryResult: word=typeDecl/D/Mail, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/D/first_class, refs={ 3 }", "EntryResult: word=typeDecl/D/postcard, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/, refs={ 1, 2 }", "EntryResult: word=typeDecl/V/PO_Box, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/index, refs={ 3 }", "EntryResult: word=typeDecl/V/mail, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/size, refs={ 3 }", "EntryResult: word=typeDecl/V/temp, refs={ 3 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/x, refs={ 3 }"}; //$NON-NLS-1$ //$NON-NLS-2$
if (eresults.length != entryResultBeforeModel.length)
fail("Entry Result length different from model");
fail("Entry Result length different from model"); //$NON-NLS-1$
for (int i=0;i<eresults.length; i++)
{
assertEquals(entryResultBeforeModel[i],eresults[i].toString());
}
//Delete mail.cpp from the project, give some time to remove index
IResource resourceHdl = testProject.findMember("mail.cpp") ;
IResource resourceHdl = testProject.findMember("mail.cpp") ; //$NON-NLS-1$
// Cleaning up file handles before delete
System.gc();
System.runFinalization();
@ -325,13 +356,13 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
waitForIndex(10); // wait up to 10 seconds for the index to be deleted.
//See if the index is still there
ind = indexManager.getIndex(testProjectPath,true,true);
ind = sourceIndexer.getIndex(testProjectPath,true,true);
eresults = ind.queryEntries(prefix);
assertTrue("Entry exists", eresults != null);
assertTrue("Entry exists", eresults != null); //$NON-NLS-1$
String [] entryResultAfterModel ={"EntryResult: word=typeDecl/C/CDocumentManager, refs={ 2 }", "EntryResult: word=typeDecl/V/, refs={ 1, 2 }"};
String [] entryResultAfterModel ={"EntryResult: word=typeDecl/C/CDocumentManager, refs={ 2 }", "EntryResult: word=typeDecl/V/, refs={ 1, 2 }"}; //$NON-NLS-1$ //$NON-NLS-2$
if (eresults.length != entryResultAfterModel.length)
fail("Entry Result length different from model");
fail("Entry Result length different from model"); //$NON-NLS-1$
for (int i=0;i<eresults.length; i++)
{
@ -342,180 +373,190 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
public void testIndexContents() throws Exception{
//Add a new file to the project
importFile("extramail.cpp","resources/indexer/extramail.cpp");
importFile("extramail.cpp","resources/indexer/extramail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$ //$NON-NLS-2$
IEntryResult[] typerefreesults = ind.queryEntries(IIndexConstants.TYPE_REF);
assertTrue("Type Ref Results exist", typerefreesults != null);
assertTrue("Type Ref Results exist", typerefreesults != null); //$NON-NLS-1$
String [] typeDeclEntryResultModel ={"EntryResult: word=typeDecl/C/Mail/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/C/Unknown/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/C/container/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/C/first_class/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/C/postcard/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/D/Mail/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/D/first_class/Y/X/Z, refs={ 1 }", "EntryResult: word=typeDecl/D/postcard/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/E/test/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/T/int32, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/PO_Box, refs={ 1 }","EntryResult: word=typeDecl/V/index, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/mail, refs={ 1 }", "EntryResult: word=typeDecl/V/size, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/temp, refs={ 1 }", "EntryResult: word=typeDecl/V/x, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeDecl/V/x/Z, refs={ 1 }"}; //$NON-NLS-1$
String [] typeDeclEntryResultModel ={"EntryResult: word=typeDecl/C/Mail/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/C/Unknown/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/C/container/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/C/first_class/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/C/postcard/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/D/Mail/Y/X/Z, refs={ 1 }", "EntryResult: word=typeDecl/D/first_class/Y/X/Z, refs={ 1 }", "EntryResult: word=typeDecl/D/postcard/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/E/test/Y/X/Z, refs={ 1 }","EntryResult: word=typeDecl/T/int32, refs={ 1 }", "EntryResult: word=typeDecl/V/PO_Box, refs={ 1 }","EntryResult: word=typeDecl/V/index, refs={ 1 }", "EntryResult: word=typeDecl/V/mail, refs={ 1 }", "EntryResult: word=typeDecl/V/size, refs={ 1 }", "EntryResult: word=typeDecl/V/temp, refs={ 1 }", "EntryResult: word=typeDecl/V/x, refs={ 1 }", "EntryResult: word=typeDecl/V/x/Z, refs={ 1 }"};
IEntryResult[] typedeclresults =ind.queryEntries(IIndexConstants.TYPE_DECL);
assertTrue("Type Decl Results exist", typedeclresults != null);
assertTrue("Type Decl Results exist", typedeclresults != null); //$NON-NLS-1$
if (typedeclresults.length != typeDeclEntryResultModel.length)
fail("Entry Result length different from model for typeDecl");
fail("Entry Result length different from model for typeDecl"); //$NON-NLS-1$
for (int i=0;i<typedeclresults.length; i++)
{
assertEquals(typeDeclEntryResultModel[i],typedeclresults[i].toString());
}
String [] typeDefEntryResultModel ={"EntryResult: word=typeDecl/T/int32, refs={ 1 }"};
String [] typeDefEntryResultModel ={"EntryResult: word=typeDecl/T/int32, refs={ 1 }"}; //$NON-NLS-1$
IEntryResult[] typedefresults =ind.queryEntries(IIndexConstants.TYPEDEF_DECL);
assertTrue("Type Def Results exist", typedefresults != null);
assertTrue("Type Def Results exist", typedefresults != null); //$NON-NLS-1$
if (typedefresults.length != typeDefEntryResultModel.length)
fail("Entry Result length different from model for typeDef");
fail("Entry Result length different from model for typeDef"); //$NON-NLS-1$
for (int i=0;i<typedefresults.length; i++)
{
assertEquals(typeDefEntryResultModel[i],typedefresults[i].toString());
}
String [] namespaceResultModel = {"EntryResult: word=namespaceDecl/X/Z, refs={ 1 }", "EntryResult: word=namespaceDecl/Y/X/Z, refs={ 1 }", "EntryResult: word=namespaceDecl/Z, refs={ 1 }"};
String [] namespaceResultModel = {"EntryResult: word=namespaceDecl/X/Z, refs={ 1 }", "EntryResult: word=namespaceDecl/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=namespaceDecl/Z, refs={ 1 }"}; //$NON-NLS-1$
IEntryResult[] namespaceresults =ind.queryEntries(IIndexConstants.NAMESPACE_DECL);
assertTrue("Namespace Results exist", namespaceresults != null);
assertTrue("Namespace Results exist", namespaceresults != null); //$NON-NLS-1$
if (namespaceresults.length != namespaceResultModel.length)
fail("Entry Result length different from model for namespace");
fail("Entry Result length different from model for namespace"); //$NON-NLS-1$
for (int i=0;i<namespaceresults.length; i++)
{
assertEquals(namespaceResultModel[i],namespaceresults[i].toString());
}
String [] fieldResultModel = {"EntryResult: word=fieldDecl/array/container/Y/X/Z, refs={ 1 }", "EntryResult: word=fieldDecl/index/container/Y/X/Z, refs={ 1 }", "EntryResult: word=fieldDecl/postage/Mail/Y/X/Z, refs={ 1 }", "EntryResult: word=fieldDecl/sz/container/Y/X/Z, refs={ 1 }", "EntryResult: word=fieldDecl/type/Mail/Y/X/Z, refs={ 1 }"};
String [] fieldResultModel = {"EntryResult: word=fieldDecl/array/container/Y/X/Z, refs={ 1 }", "EntryResult: word=fieldDecl/index/container/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=fieldDecl/postage/Mail/Y/X/Z, refs={ 1 }", "EntryResult: word=fieldDecl/sz/container/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=fieldDecl/type/Mail/Y/X/Z, refs={ 1 }"}; //$NON-NLS-1$ //$NON-NLS-2$
IEntryResult[] fieldresults =ind.queryEntries(IIndexConstants.FIELD_DECL);
assertTrue("Field Results exist", fieldresults != null);
assertTrue("Field Results exist", fieldresults != null); //$NON-NLS-1$
if (fieldresults.length != fieldResultModel.length)
fail("Entry Result length different from model for fieldDecl");
fail("Entry Result length different from model for fieldDecl"); //$NON-NLS-1$
for (int i=0;i<fieldresults.length; i++)
{
assertEquals(fieldResultModel[i],fieldresults[i].toString());
}
String [] enumeratorResultModel = {"EntryResult: word=enumtorDecl/bye/Y/X/Z, refs={ 1 }", "EntryResult: word=enumtorDecl/cool/Y/X/Z, refs={ 1 }", "EntryResult: word=enumtorDecl/hi/Y/X/Z, refs={ 1 }", "EntryResult: word=enumtorDecl/why/Y/X/Z, refs={ 1 }"};
String [] enumeratorResultModel = {"EntryResult: word=enumtorDecl/bye/Y/X/Z, refs={ 1 }", "EntryResult: word=enumtorDecl/cool/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=enumtorDecl/hi/Y/X/Z, refs={ 1 }", "EntryResult: word=enumtorDecl/why/Y/X/Z, refs={ 1 }"}; //$NON-NLS-1$ //$NON-NLS-2$
IEntryResult[] enumeratorresults =ind.queryEntries(IIndexConstants.ENUMTOR_DECL);
assertTrue("Enumerator Results exist", enumeratorresults != null);
assertTrue("Enumerator Results exist", enumeratorresults != null); //$NON-NLS-1$
if (enumeratorresults.length != enumeratorResultModel.length)
fail("Entry Result length different from model for enumtorDecl");
fail("Entry Result length different from model for enumtorDecl"); //$NON-NLS-1$
for (int i=0;i<enumeratorresults.length; i++)
{
assertEquals(enumeratorResultModel[i],enumeratorresults[i].toString());
}
String [] functionResultModel = {"EntryResult: word=functionDecl/doSomething, refs={ 1 }", "EntryResult: word=functionDecl/main/Y/X/Z, refs={ 1 }"};
String [] functionResultModel = {"EntryResult: word=functionDecl/doSomething, refs={ 1 }", "EntryResult: word=functionDecl/main/Y/X/Z, refs={ 1 }"}; //$NON-NLS-1$ //$NON-NLS-2$
IEntryResult[] functionresults =ind.queryEntries(IIndexConstants.FUNCTION_DECL);
if (functionresults.length != functionResultModel.length)
fail("Entry Result length different from model for functionDecl");
fail("Entry Result length different from model for functionDecl"); //$NON-NLS-1$
for (int i=0;i<functionresults.length; i++)
{
assertEquals(functionResultModel[i],functionresults[i].toString());
}
String [] methodResultModel = {"EntryResult: word=methodDecl/Mail/Mail/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/Unknown/Unknown/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/container/container/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/first_class/first_class/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/operator =/container/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/operator []/container/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/postcard/postcard/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/print/Mail/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/print/Unknown/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/print/first_class/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/print/postcard/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/size/container/Y/X/Z, refs={ 1 }",
"EntryResult: word=methodDecl/~container/container/Y/X/Z, refs={ 1 }"};
String [] methodResultModel = {"EntryResult: word=methodDecl/Mail/Mail/Y/X/Z, refs={ 1 }", "EntryResult: word=methodDecl/Unknown/Unknown/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=methodDecl/container/container/Y/X/Z, refs={ 1 }", "EntryResult: word=methodDecl/first_class/first_class/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=methodDecl/operator =/container/Y/X/Z, refs={ 1 }","EntryResult: word=methodDecl/operator []/container/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=methodDecl/postcard/postcard/Y/X/Z, refs={ 1 }", "EntryResult: word=methodDecl/print/Mail/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=methodDecl/print/Unknown/Y/X/Z, refs={ 1 }", "EntryResult: word=methodDecl/print/first_class/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=methodDecl/print/postcard/Y/X/Z, refs={ 1 }", "EntryResult: word=methodDecl/size/container/Y/X/Z, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=methodDecl/~container/container/Y/X/Z, refs={ 1 }"}; //$NON-NLS-1$
IEntryResult[] methodresults =ind.queryEntries(IIndexConstants.METHOD_DECL);
assertTrue("Entry exists", methodresults != null);
assertTrue("Entry exists", methodresults != null); //$NON-NLS-1$
if (methodresults.length != methodResultModel.length)
fail("Entry Result length different from model for functionDecl");
fail("Entry Result length different from model for functionDecl"); //$NON-NLS-1$
for (int i=0;i<methodresults.length; i++)
{
assertEquals("Index is " +i , methodResultModel[i],methodresults[i].toString());
assertEquals("Index is " +i , methodResultModel[i],methodresults[i].toString()); //$NON-NLS-1$
}
}
public void testRefs() throws Exception{
//Add a new file to the project
importFile("reftest.cpp","resources/indexer/reftest.cpp");
importFile("reftest.cpp","resources/indexer/reftest.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
String [] typeRefEntryResultModel ={"EntryResult: word=typeRef/C/C/B/A, refs={ 1 }", "EntryResult: word=typeRef/E/e1/B/A, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=typeRef/G/ForwardA/A, refs={ 1 }", "EntryResult: word=typeRef/V/x/B/A, refs={ 1 }"}; //$NON-NLS-1$ //$NON-NLS-2$
String [] typeRefEntryResultModel ={"EntryResult: word=typeRef/C/C/B/A, refs={ 1 }", "EntryResult: word=typeRef/E/e1/B/A, refs={ 1 }", "EntryResult: word=typeRef/G/ForwardA/A, refs={ 1 }", "EntryResult: word=typeRef/V/x/B/A, refs={ 1 }"};
IEntryResult[] typerefresults = ind.queryEntries(IIndexConstants.TYPE_REF);
assertTrue("Entry exists",typerefresults != null);
assertTrue("Entry exists",typerefresults != null); //$NON-NLS-1$
if (typerefresults.length != typeRefEntryResultModel.length)
fail("Entry Result length different from model for typeRef");
fail("Entry Result length different from model for typeRef"); //$NON-NLS-1$
for (int i=0;i<typerefresults.length; i++)
{
assertEquals(typeRefEntryResultModel[i],typerefresults[i].toString());
}
String [] funRefEntryResultModel ={"EntryResult: word=functionRef/something/A, refs={ 1 }"};
String [] funRefEntryResultModel ={"EntryResult: word=functionRef/something/A, refs={ 1 }"};//$NON-NLS-1$
IEntryResult[] funRefresults = ind.queryEntries(IIndexConstants.FUNCTION_REF);
assertTrue("Entry exists",funRefresults != null);
assertTrue("Entry exists",funRefresults != null); //$NON-NLS-1$
if (funRefresults.length != funRefEntryResultModel.length)
fail("Entry Result length different from model for funcRef");
fail("Entry Result length different from model for funcRef"); //$NON-NLS-1$
for (int i=0;i<funRefresults.length; i++)
{
assertEquals(funRefEntryResultModel[i],funRefresults[i].toString());
}
String [] namespaceRefResultModel = {"EntryResult: word=namespaceRef/A, refs={ 1 }", "EntryResult: word=namespaceRef/B/A, refs={ 1 }"};
String [] namespaceRefResultModel = {"EntryResult: word=namespaceRef/A, refs={ 1 }", "EntryResult: word=namespaceRef/B/A, refs={ 1 }"}; //$NON-NLS-1$ //$NON-NLS-2$
IEntryResult[] namespacerefresults = ind.queryEntries(IIndexConstants.NAMESPACE_REF);
assertTrue("Entry exists",namespacerefresults!=null);
assertTrue("Entry exists",namespacerefresults!=null); //$NON-NLS-1$
if (namespacerefresults.length != namespaceRefResultModel.length)
fail("Entry Result length different from model for namespaceRef");
fail("Entry Result length different from model for namespaceRef"); //$NON-NLS-1$
for (int i=0;i<namespacerefresults.length; i++)
{
assertEquals(namespaceRefResultModel[i],namespacerefresults[i].toString());
}
String [] fieldRefResultModel = {"EntryResult: word=fieldRef/y/C/B/A, refs={ 1 }"};
String [] fieldRefResultModel = {"EntryResult: word=fieldRef/y/C/B/A, refs={ 1 }"}; //$NON-NLS-1$
IEntryResult[] fieldrefresults = ind.queryEntries(IIndexConstants.FIELD_REF);
assertTrue("Entry exists",fieldrefresults!=null);
assertTrue("Entry exists",fieldrefresults!=null); //$NON-NLS-1$
if (fieldrefresults.length != fieldRefResultModel.length)
fail("Entry Result length different from model for fieldRef");
fail("Entry Result length different from model for fieldRef"); //$NON-NLS-1$
for (int i=0;i<fieldrefresults.length; i++)
{
assertEquals(fieldRefResultModel[i],fieldrefresults[i].toString());
}
String [] methodRefResultModel = {"EntryResult: word=methodRef/bar/C/B/A, refs={ 1 }"};
String [] methodRefResultModel = {"EntryResult: word=methodRef/bar/C/B/A, refs={ 1 }"}; //$NON-NLS-1$
IEntryResult[] methodrefresults = ind.queryEntries(IIndexConstants.METHOD_REF);
assertTrue("Entry exists", methodrefresults != null);
assertTrue("Entry exists", methodrefresults != null); //$NON-NLS-1$
if (methodrefresults.length != methodRefResultModel.length)
fail("Entry Result length different from model for methodRef");
fail("Entry Result length different from model for methodRef");//$NON-NLS-1$
for (int i=0;i<methodrefresults.length; i++)
{
@ -525,55 +566,55 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
public void testExactDeclarations() throws Exception
{
importFile("a.h","resources/dependency/a.h");
importFile("a.h","resources/dependency/a.h");//$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
importFile("DepTest3.h","resources/dependency/DepTest3.h");
importFile("DepTest3.cpp","resources/dependency/DepTest3.cpp");
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
importFile("DepTest3.h","resources/dependency/DepTest3.h");//$NON-NLS-1$ //$NON-NLS-2$
importFile("DepTest3.cpp","resources/dependency/DepTest3.cpp");//$NON-NLS-1$ //$NON-NLS-2$
IEntryResult[] eResult = ind.queryEntries(IIndexConstants.CLASS_DECL);
IQueryResult[] qResult = ind.queryPrefix(IIndexConstants.CLASS_DECL);
assertTrue("Expected 2 files indexed", qResult.length == 2);
assertTrue("Checking DepTest3.h location", qResult[0].getPath().equals("/IndexerTestProject/DepTest3.h"));
assertTrue("Checking a.h location", qResult[1].getPath().equals("/IndexerTestProject/a.h"));
assertTrue("Expected 2 files indexed", qResult.length == 2); //$NON-NLS-1$
assertTrue("Checking DepTest3.h location", qResult[0].getPath().equals("/IndexerTestProject/DepTest3.h")); //$NON-NLS-1$ //$NON-NLS-2$
assertTrue("Checking a.h location", qResult[1].getPath().equals("/IndexerTestProject/a.h")); //$NON-NLS-1$ //$NON-NLS-2$
assertTrue("Expect 2 class declaration entries", eResult.length == 2);
assertTrue("Expect 2 class declaration entries", eResult.length == 2); //$NON-NLS-1$
int[] DepTest3FileRefs = {2};
int[] fileRefs = eResult[0].getFileReferences();
assertTrue("Check DepTest3 File Refs number", fileRefs.length == 1);
assertTrue("Check DepTest3 File Refs number", fileRefs.length == 1); //$NON-NLS-1$
for (int i=0; i<fileRefs.length; i++){
assertTrue("Verify DepTest3 File Ref",fileRefs[i] == DepTest3FileRefs[i]);
assertTrue("Verify DepTest3 File Ref",fileRefs[i] == DepTest3FileRefs[i]); //$NON-NLS-1$
}
int[] aFileRefs = {3};
fileRefs = eResult[1].getFileReferences();
assertTrue("Check a.h File Refs number", fileRefs.length == 1);
assertTrue("Check a.h File Refs number", fileRefs.length == 1); //$NON-NLS-1$
for (int i=0; i<fileRefs.length; i++){
assertTrue("Verify a.h File Ref",fileRefs[i] == aFileRefs[i]);
assertTrue("Verify a.h File Ref",fileRefs[i] == aFileRefs[i]); //$NON-NLS-1$
}
}
public void testMD5() throws Exception
{
importFile("extramail.cpp","resources/indexer/extramail.cpp");
importFile("extramail.cpp","resources/indexer/extramail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//importFile("mail.cpp","resources/indexer/mail.cpp");
MessageDigest md = MessageDigest.getInstance("MD5");
MessageDigest md = MessageDigest.getInstance("MD5"); //$NON-NLS-1$
//MessageDigest md = MessageDigest.getInstance("SHA");
String fileName = testProject.getFile("extramail.cpp").getLocation().toOSString();
String fileName = testProject.getFile("extramail.cpp").getLocation().toOSString(); //$NON-NLS-1$
//String fileName = testProject.getFile("mail.cpp").getLocation().toOSString();
long startTime = System.currentTimeMillis();
@ -596,20 +637,21 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
public void testMacros() throws Exception
{
//Add a new file to the project
importFile("extramail.cpp","resources/indexer/extramail.cpp");
importFile("extramail.cpp","resources/indexer/extramail.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
IEntryResult[] macroresults = ind.queryEntries(IIndexConstants.MACRO_DECL);
assertTrue("Entry exists", macroresults != null);
assertTrue("Entry exists", macroresults != null); //$NON-NLS-1$
String [] macroResultModel = {"EntryResult: word=macroDecl/CASE, refs={ 1 }", "EntryResult: word=macroDecl/MAX, refs={ 1 }", "EntryResult: word=macroDecl/PRINT, refs={ 1 }"};
String [] macroResultModel = {"EntryResult: word=macroDecl/CASE, refs={ 1 }", "EntryResult: word=macroDecl/MAX, refs={ 1 }", //$NON-NLS-1$ //$NON-NLS-2$
"EntryResult: word=macroDecl/PRINT, refs={ 1 }"}; //$NON-NLS-1$
if (macroresults.length != macroResultModel.length)
fail("Entry Result length different from model for macros");
fail("Entry Result length different from model for macros"); //$NON-NLS-1$
for (int i=0;i<macroresults.length; i++)
{
@ -619,15 +661,15 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
public void testIndexShutdown() throws Exception{
//Add a new file to the project
importFile("reftest.cpp","resources/indexer/reftest.cpp");
importFile("reftest.cpp","resources/indexer/reftest.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
//Create an empty index file
String badIndexFile = CCorePlugin.getDefault().getStateLocation().append("badIndex.index").toOSString();
String badIndexFile = CCorePlugin.getDefault().getStateLocation().append("badIndex.index").toOSString(); //$NON-NLS-1$
FileWriter writer = null;
try {
writer = new FileWriter(badIndexFile);
@ -645,8 +687,8 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
File[] indexesFiles = indexesDirectory.listFiles();
if (indexesFiles != null) {
for (int i = 0, indexesFilesLength = indexesFiles.length; i < indexesFilesLength; i++) {
if(indexesFiles[i].getName().equals("badIndex.index")){
fail("Shutdown did not delete .index file");
if(indexesFiles[i].getName().equals("badIndex.index")){ //$NON-NLS-1$
fail("Shutdown did not delete .index file"); //$NON-NLS-1$
}
}
}
@ -654,34 +696,33 @@ public class IndexManagerTests extends TestCase implements IIndexChangeListener
public void testForwardDeclarations() throws Exception{
//Add a new file to the project
importFile("reftest.cpp","resources/indexer/reftest.cpp");
importFile("reftest.cpp","resources/indexer/reftest.cpp"); //$NON-NLS-1$ //$NON-NLS-2$
//Make sure project got added to index
IPath testProjectPath = testProject.getFullPath();
IIndex ind = indexManager.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null);
IIndex ind = sourceIndexer.getIndex(testProjectPath,true,true);
assertTrue("Index exists for project",ind != null); //$NON-NLS-1$
//IEntryResult[] fwdDclResults = ind.queryEntries("typeDecl/C/ForwardA/A".toCharArray());
IEntryResult[] fwdDclResults = ind.queryEntries("typeDecl/G/ForwardA/A".toCharArray());
assertTrue("Entry exists",fwdDclResults != null);
IEntryResult[] fwdDclResults = ind.queryEntries("typeDecl/G/ForwardA/A".toCharArray()); //$NON-NLS-1$
assertTrue("Entry exists",fwdDclResults != null); //$NON-NLS-1$
String [] fwdDclModel = {"EntryResult: word=typeDecl/G/ForwardA/A, refs={ 1 }"};
String [] fwdDclModel = {"EntryResult: word=typeDecl/G/ForwardA/A, refs={ 1 }"}; //$NON-NLS-1$
if (fwdDclResults.length != fwdDclModel.length)
fail("Entry Result length different from model for forward declarations");
fail("Entry Result length different from model for forward declarations"); //$NON-NLS-1$
for (int i=0;i<fwdDclResults.length; i++)
{
assertEquals(fwdDclModel[i],fwdDclResults[i].toString());
}
IEntryResult[] fwdDclRefResults = ind.queryEntries("typeRef/G/ForwardA/A".toCharArray());
assertTrue("Entry exists", fwdDclRefResults!= null);
IEntryResult[] fwdDclRefResults = ind.queryEntries("typeRef/G/ForwardA/A".toCharArray()); //$NON-NLS-1$
assertTrue("Entry exists", fwdDclRefResults!= null); //$NON-NLS-1$
String [] fwdDclRefModel = {"EntryResult: word=typeRef/G/ForwardA/A, refs={ 1 }"};
String [] fwdDclRefModel = {"EntryResult: word=typeRef/G/ForwardA/A, refs={ 1 }"}; //$NON-NLS-1$
if (fwdDclRefResults.length != fwdDclRefModel.length)
fail("Entry Result length different from model for forward declarations refs");
fail("Entry Result length different from model for forward declarations refs"); //$NON-NLS-1$
for (int i=0;i<fwdDclRefResults.length; i++)
{

View file

@ -70,9 +70,9 @@ import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.core.parser.ast.IASTVariableReference;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.parser.Parser;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
@ -105,7 +105,7 @@ public class FileBasePluginTest extends TestCase {
cPrj = CProjectHelper.createCCProject("ParserTestProject", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject();
project.setSessionProperty(IndexManager.activationKey,new Boolean(false));
project.setSessionProperty(SourceIndexer.activationKey,new Boolean(false));
// ugly
if (className == null || !className.equals(aClassName)) {

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@ -41,7 +41,8 @@ abstract public class BaseTestFramework extends TestCase {
static protected IProject project;
static protected ICProject cproject;
static protected FileManager fileManager;
static final String sourceIndexerID = "org.eclipse.cdt.core.originalsourceindexer"; //$NON-NLS-1$
static protected SourceIndexer sourceIndexer;
{
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){
(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
@ -53,7 +54,14 @@ abstract public class BaseTestFramework extends TestCase {
cproject = CProjectHelper.createCCProject("RegressionTestProject", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
project = cproject.getProject();
project.setSessionProperty(IndexManager.activationKey, Boolean.FALSE );
/*project.setSessionProperty(SourceIndexer.activationKey, Boolean.FALSE );
//Set the id of the source indexer extension point as a session property to allow
//index manager to instantiate it
project.setSessionProperty(IndexManager.indexerIDKey, sourceIndexerID);*/
} catch ( CoreException e ) {
/*boo*/
}
@ -69,7 +77,7 @@ abstract public class BaseTestFramework extends TestCase {
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){
if( project != null )
try {
project.setSessionProperty( IndexManager.activationKey, Boolean.TRUE );
project.setSessionProperty( SourceIndexer.activationKey, Boolean.TRUE );
} catch ( CoreException e ) { //boo
}
}
@ -79,7 +87,7 @@ abstract public class BaseTestFramework extends TestCase {
if( CCorePlugin.getDefault() != null && CCorePlugin.getDefault().getCoreModel() != null){
if( project != null )
try {
project.setSessionProperty( IndexManager.activationKey, Boolean.FALSE );
project.setSessionProperty( SourceIndexer.activationKey, Boolean.FALSE );
} catch ( CoreException e ) { //boo
}
}

View file

@ -33,6 +33,8 @@ import org.eclipse.cdt.core.search.ICSearchPattern;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.core.search.IMatch;
import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.internal.core.browser.cache.TypeCacheManager;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
@ -42,11 +44,10 @@ import org.eclipse.core.runtime.Path;
* @author aniefer
*/
public class SearchRegressionTests extends BaseTestFramework implements ICSearchConstants, IIndexChangeListener{
static protected ICSearchScope scope;
static protected SearchEngine searchEngine;
static protected BasicSearchResultCollector resultCollector;
static private boolean indexChanged = false;
static protected ICSearchScope scope;
static protected SearchEngine searchEngine;
static protected BasicSearchResultCollector resultCollector;
static private boolean indexChanged = false;
{
scope = SearchEngine.createWorkspaceScope();
resultCollector = new BasicSearchResultCollector();
@ -67,11 +68,18 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
protected void setUp() throws Exception {
super.setUp();
try{
project.setSessionProperty( IndexManager.activationKey, new Boolean( true ) );
project.setSessionProperty(IndexManager.indexerIDKey, sourceIndexerID);
project.setSessionProperty( SourceIndexer.activationKey, new Boolean( true ) );
} catch ( CoreException e ) { //boo
}
TypeCacheManager typeCacheManager = TypeCacheManager.getInstance();
typeCacheManager.setProcessTypeCacheEvents(false);
IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
indexManager.addIndexChangeListener( this );
indexManager.reset();
sourceIndexer = (SourceIndexer) CCorePlugin.getDefault().getCoreModel().getIndexManager().getIndexerForProject(project);
sourceIndexer.addIndexChangeListener( this );
}
protected void tearDown() throws Exception {
@ -79,9 +87,9 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
return;
IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
indexManager.removeIndexChangeListener( this );
sourceIndexer.removeIndexChangeListener( this );
try{
project.setSessionProperty( IndexManager.activationKey, new Boolean( false ) );
project.setSessionProperty( SourceIndexer.activationKey, new Boolean( false ) );
} catch ( CoreException e ) { //boo
}
super.tearDown();

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.CTestPlugin;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@ -53,6 +54,8 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants {
static protected BasicSearchResultCollector resultCollector;
static protected SearchEngine searchEngine;
static protected FileManager fileManager;
static final String sourceIndexerID = "org.eclipse.cdt.core.originalsourceindexer"; //$NON-NLS-1$
{
(CCorePlugin.getDefault().getCoreModel().getIndexManager()).reset();
@ -63,7 +66,12 @@ public class BaseSearchTest extends TestCase implements ICSearchConstants {
try {
//Create temp project
testProject = createProject("SearchTestProject");
testProject.setSessionProperty(IndexManager.activationKey,new Boolean(true));
testProject.setSessionProperty(SourceIndexer.activationKey,new Boolean(true));
//Set the id of the source indexer extension point as a session property to allow
//index manager to instantiate it
testProject.setSessionProperty(IndexManager.indexerIDKey, sourceIndexerID);
} catch (CoreException e) {}

View file

@ -13,7 +13,7 @@ import org.eclipse.cdt.core.build.managed.tests.StandardBuildTests;
import org.eclipse.cdt.core.cdescriptor.tests.CDescriptorTests;
import org.eclipse.cdt.core.filetype.tests.ResolverTests;
import org.eclipse.cdt.core.indexer.tests.DependencyTests;
import org.eclipse.cdt.core.indexer.tests.IndexManagerTests;
import org.eclipse.cdt.core.indexer.tests.SourceIndexerTests;
import org.eclipse.cdt.core.model.tests.AllCoreTests;
import org.eclipse.cdt.core.model.tests.BinaryTests;
import org.eclipse.cdt.core.model.tests.ElementDeltaTests;
@ -65,7 +65,7 @@ public class AutomatedIntegrationSuite extends TestSuite {
suite.addTest(RegressionTestSuite.suite());
//Indexer Tests need to be run after any indexer client tests
//as the last test shuts down the indexing thread
suite.addTest(IndexManagerTests.suite());
suite.addTest(SourceIndexerTests.suite());
// Last test to trigger report generation
// Add all failed tests

View file

@ -1,3 +1,12 @@
2005-03-13 Bogdan Gheorghe
Added support for new indexer framework
* model/org/eclipse/cdt/core/model/CoreModel.java
* model/org/eclipse/cdt/internal/core/model/CModelManager.java
* model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java
* src/org/eclipse/cdt/core/CCorePlugin.java
* plugin.xml
2005-03-12 Alain Magloire
Plan item 79518: for PathEntry variable manager.
* model/org/eclipse/cdt/internal/core/model/PathEntryManager.java

View file

@ -1,3 +1,15 @@
2005-03-13 Bogdan Gheorghe
Updated references to IndexManager to reflect new multi-indexer framework.
* browser/org/eclipse/cdt/internal/core/browser/cache/IndexerDependencies.java
* browser/org/eclipse/cdt/internal/core/browser/cache/IndexerJob.java
* browser/org/eclipse/cdt/internal/core/browser/cache/IndexerTypesJob.java
* browser/org/eclipse/cdt/internal/core/browser/cache/TypeCache.java
* browser/org/eclipse/cdt/internal/core/browser/cache/TypeCacherJob.java
Added temporary flag to TypeCacheManager to prevent deadlocks during JUnit runs, pending
changes to Index Storage framework.
* browser/org/eclipse/cdt/internal/core/browser/cache/TypeCacheManager.java
2005-01-06 Chris Wiebe
added parser timeout to TypeParser
* browser/org/eclipse/cdt/internal/core/browser/cache/TypeParser.java

View file

@ -13,10 +13,12 @@ package org.eclipse.cdt.internal.core.browser.cache;
import java.io.IOException;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
@ -25,16 +27,23 @@ import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
public abstract class IndexerJob implements IJob {
public abstract class IndexerJob implements IIndexJob {
private IndexManager fIndexManager;
private IProject fProject;
private IIndex fProjectIndex = null;
private SourceIndexer fSourceIndexer = null;
public static final String FAMILY= "BasicTypeIndexerJob"; //$NON-NLS-1$
public IndexerJob(IndexManager indexManager, IProject project) {
fIndexManager = indexManager;
fProject = project;
//Get the indexer assigned to this project; check to see if it's
//a Source Indexder
ICDTIndexer indexer = indexManager.getIndexerForProject(project);
if (indexer instanceof SourceIndexer)
fSourceIndexer = (SourceIndexer) indexer;
}
public boolean belongsTo(String family) {
@ -94,7 +103,11 @@ public abstract class IndexerJob implements IJob {
if (index == null)
return COMPLETE;
ReadWriteMonitor monitor = fIndexManager.getMonitorFor(index);
if (fSourceIndexer == null)
return FAILED;
ReadWriteMonitor monitor = fSourceIndexer.getMonitorFor(index);
if (monitor == null)
return COMPLETE; // index got deleted since acquired
@ -105,7 +118,7 @@ public abstract class IndexerJob implements IJob {
try {
monitor.exitRead(); // free read lock
monitor.enterWrite(); // ask permission to write
fIndexManager.saveIndex(index);
fSourceIndexer.saveIndex(index);
} catch (IOException e) {
return FAILED;
} finally {
@ -135,7 +148,10 @@ public abstract class IndexerJob implements IJob {
}
// may trigger some index recreation work
return fIndexManager.getIndex(path, true /*reuse index file*/, false /*do not create if none*/);
if (fSourceIndexer != null)
return fSourceIndexer.getIndex(path, true /*reuse index file*/, false /*do not create if none*/);
return null;
}
}

View file

@ -50,7 +50,8 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
//TODO make this a WeakHashMap or LRUCache
private Map fTypeToElementMap = new HashMap(INITIAL_TYPE_MAP_SIZE);
private Map fElementToTypeMap = new HashMap(INITIAL_TYPE_MAP_SIZE);
private boolean processTypeCacheEvents = true;
private TypeCacheManager() {
fCacheMap = new HashMap();
}
@ -227,6 +228,9 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
}
public synchronized void reconcile(boolean enableIndexing, int priority, int delay) {
if (!(processTypeCacheEvents))
return;
TypeSearchScope workspaceScope = new TypeSearchScope(true);
IProject[] projects = workspaceScope.getEnclosingProjects();
for (int i = 0; i < projects.length; ++i) {
@ -236,6 +240,9 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
}
public synchronized void reconcileAndWait(boolean enableIndexing, int priority, IProgressMonitor monitor) {
if (!(processTypeCacheEvents))
return;
TypeSearchScope workspaceScope = new TypeSearchScope(true);
IProject[] projects = workspaceScope.getEnclosingProjects();
for (int i = 0; i < projects.length; ++i) {
@ -444,4 +451,10 @@ public class TypeCacheManager implements ITypeCacheChangedListener {
}
return null;
}
public boolean getProcessTypeCacheEvents() {
return processTypeCacheEvents;
}
public void setProcessTypeCacheEvents(boolean processTypeCacheEvents) {
this.processTypeCacheEvents = processTypeCacheEvents;
}
}

View file

@ -141,16 +141,16 @@ public class TypeCacherJob extends BasicJob {
private void update(ITypeSearchScope scope, IProgressMonitor monitor) throws InterruptedException {
boolean success = true;
IProject project = fTypeCache.getProject();
monitor.beginTask("", 100); //$NON-NLS-1$
if (project.exists() && project.isOpen()) {
success = doIndexerJob(new IndexerTypesJob(fIndexManager, fTypeCache, scope), monitor);
}
if (!success || monitor.isCanceled()) {
throw new InterruptedException();
}
monitor.done();
}

View file

@ -1,3 +1,9 @@
2005-03-12 Bogdan Gheorghe
- Updated references from IndexManager to SourceIndexer due to new indexer framework
* src/org/eclipse/cdt/internal/core/sourcedependency/DependencyQueryJob.java
* src/org/eclipse/cdt/internal/core/sourcedependency/UpdateDependency.java
2004-02-25 Bogdan Gheorghe
- Check to see if the resource has a location before using it in
UpdateDependency

View file

@ -7,6 +7,8 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.IIndexStorage;
import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.internal.core.index.IDocument;
import org.eclipse.cdt.internal.core.index.IIndex;
@ -15,10 +17,12 @@ import org.eclipse.cdt.internal.core.index.impl.IFileDocument;
import org.eclipse.cdt.internal.core.index.impl.IncludeEntry;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.CIndexStorage;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.IndexSelector;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@ -28,20 +32,22 @@ import org.eclipse.core.runtime.OperationCanceledException;
/**
* @author bgheorgh
*/
public class DependencyQueryJob implements IJob {
public class DependencyQueryJob implements IIndexJob {
IProject project;
IFile file;
ArrayList includeFiles;
SourceIndexer indexer;
IndexManager indexManager;
protected IndexSelector indexSelector;
protected long executionTime = 0;
public DependencyQueryJob(IProject project, IFile file, IndexManager inMan, List includeFiles) {
public DependencyQueryJob(IProject project, IFile file, SourceIndexer indexer, List includeFiles) {
this.project = project;
this.file = file;
this.indexManager = inMan;
this.indexer = indexer;
this.includeFiles = (ArrayList) includeFiles;
this.indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
}
/* (non-Javadoc)
@ -69,11 +75,12 @@ public class DependencyQueryJob implements IJob {
executionTime = 0;
if (this.indexSelector == null) {
this.indexSelector =
new IndexSelector(SearchEngine.createWorkspaceScope(), null, false, this.indexManager);
new IndexSelector(SearchEngine.createWorkspaceScope(), null, false, indexManager);
}
IIndex[] searchIndexes = this.indexSelector.getIndexes();
try {
int max = searchIndexes.length;
int min=0;
if (progressMonitor != null) {
progressMonitor.beginTask("", max); //$NON-NLS-1$
}
@ -115,7 +122,15 @@ public class DependencyQueryJob implements IJob {
if (index == null)
return COMPLETE;
ReadWriteMonitor monitor = indexManager.getMonitorFor(index);
if (!(indexer instanceof SourceIndexer))
return FAILED;
SourceIndexer sourceIndexer = (SourceIndexer)indexer;
ReadWriteMonitor monitor = sourceIndexer.getMonitorFor(index);
if (monitor == null)
return COMPLETE; // index got deleted since acquired
try {
@ -126,7 +141,7 @@ public class DependencyQueryJob implements IJob {
try {
monitor.exitRead(); // free read lock
monitor.enterWrite(); // ask permission to write
this.indexManager.saveIndex(index);
sourceIndexer.saveIndex(index);
} catch (IOException e) {
return FAILED;
} finally {
@ -219,7 +234,7 @@ public class DependencyQueryJob implements IJob {
*/
public boolean isReadyToRun() {
if (this.indexSelector == null) { // only check once. As long as this job is used, it will keep the same index picture
this.indexSelector = new IndexSelector(SearchEngine.createWorkspaceScope(), null, false, this.indexManager);
this.indexSelector = new IndexSelector(SearchEngine.createWorkspaceScope(), null, false, indexManager);
this.indexSelector.getIndexes(); // will only cache answer if all indexes were available originally
}
return true;

View file

@ -20,11 +20,12 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.search.ICSearchConstants;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.PathCollector;
import org.eclipse.cdt.internal.core.search.PatternSearchJob;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
@ -38,15 +39,17 @@ import org.eclipse.core.runtime.Path;
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class UpdateDependency implements IJob {
public class UpdateDependency implements IIndexJob {
PathCollector pathCollector;
IResource resource;
SourceIndexer indexer;
/**
* @param resource
*/
public UpdateDependency(IResource resource) {
public UpdateDependency(IResource resource, SourceIndexer indexer) {
this.resource = resource;
this.indexer = indexer;
}
/* (non-Javadoc)
@ -99,7 +102,7 @@ public class UpdateDependency implements IJob {
if (fileToReindex!=null && fileToReindex.exists() ) {
// if (VERBOSE)
// System.out.println("Going to reindex " + fileToReindex.getName());
indexManager.addSource(fileToReindex,fileToReindex.getProject().getProject().getFullPath());
indexer.addSource(fileToReindex,fileToReindex.getProject().getProject().getFullPath());
}
}
return false;

View file

@ -1,3 +1,33 @@
2005-03-12 Bogdan Gheorghe
Restructured indexer framework to allow for multiple indexers in a workspace.
* index/org/eclipse/cdt/core/index/ICDTIndexer.java
* index/org/eclipse/cdt/core/index/IIndexStorage.java
* index/org/eclipse/cdt/core/index/Indexer.java
* index/org/eclipse/cdt/core/index/IndexManager.java
* index/org/eclipse/cdt/internal/core/index/IIndexer.java
* index/org/eclipse/cdt/internal/core/index/impl/Index.java
* index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java
* index/org/eclipse/cdt/internal/core/search/indexing/IndexerModelListener.java
Moved following classes to new source indexer folder:
* index/org/eclipse/cdt/internal/core/index/sourceindexer/AbstractIndexer.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/AddCompilationUnit.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/AddFileToIndex.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/AddFolderToIndex.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/CIndexStorage.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/CleanEncounteredHeaders.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/IndexAllProject.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/IndexRequest.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/RemoveFolderFromIndex.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/RemoveFromIndex.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SaveIndex.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexer.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRequestor.java
* index/org/eclipse/cdt/internal/core/index/sourceindexer/SourceIndexerRunner.java
2004-11-17 Bogdan Gheorghe
Fix for Bug 78678: Indexer stops reindexing file after repeated saves

View file

@ -0,0 +1,91 @@
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.index;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.internal.core.index.IIndexer;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.core.resources.IResourceDelta;
/**
* @author Bogdan Gheorghe
*/
/**
* An <code>ICDTIndexer</code> indexes ONE document at each time. It adds the document names and
* the words references to an IIndex. Each IIndexer can index certain types of document, and should
* not index the other files.
*
* Warning: This interface is still under development - API may change.
* @since 3.0
*/
public interface ICDTIndexer extends IIndexer {
/**
* Indexer Support bit flags
*/
static public final int _DECLARATIONS = 1;
static public final int _DEFINITIONS = 2;
static public final int _REFERENCES = 4;
static public final int _LINENUMBERS = 8;
static public final int _OFFSETINFO = 16;
static public final int _CPP = 32;
static public final int _C = 64;
/**
* Indexer Policy bit flags
*/
static public final int _NORMAL= 1;
static public final int _POSTBUILD = 2;
static public final int _MANUAL = 4;
static public final int _STATIC = 8;
static public final int _DELAYUNTILBUILDINFO = 16;
/**
* Returns what features this <code>ICDTIndexer</code> provides.
*/
public int getIndexerFeatures();
/**
* The <code>IndexManager</code> calls addRequest when it receives an event from the <code>DeltaProcessor</code>.
* The <code>IResourcDelta</code> and (TODO: <code>IResourceChangeEvent</code> are provided for indexers
* to decide how to schedule this event).
*/
public void addRequest(ICElement cElement, IResourceDelta delta/*, IResourceChangeEvent event*/);
/**
* The <code>IndexManager</code> calls addRequest when it receives an event from the <code>DeltaProcessor</code>.
* The <code>IResourcDelta</code> and (TODO:<code>IResourceChangeEvent</code> are provided for the indexder
* to decide how to schedule this event).
*/
public void removeRequest(ICElement cElement, IResourceDelta delta/*, IResourceChangeEvent event*/);
/**
* The <code>IndexManager</code> will send out a jobFinishedEvent to the indexer that
* had scheduled the previous runnign job to give that indexer a chance to update its
* state info.
*/
public void indexJobFinishedNotification(IIndexJob job);
/**
* The <code>IndexManager</code> will notify all indexers of impending shutdown events
* in order to allow indexers to perform whatever clean up they need to do.
*/
public void shutdown();
/**
* Called by the index manager when there are no index jobs queued up - can be
* used by the indexer to save indexes etc.
* @param idlingTime
*/
public void notifyIdle(long idlingTime);
}

View file

@ -0,0 +1,30 @@
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.core.index;
/**
* @author Bogdan Gheorghe
*
* IIndexStorage must be implemented by all indexStorage providers
*/
public interface IIndexStorage {
//Indexer that use this indexer storage
public ICDTIndexer[] getIndexers();
//Get path variables that are used
public String[] getPathVariables();
public void resolvePathVariables();
//Merge functionality for the storage
public void merge();
public boolean canMergeWith(IIndexStorage storage);
}

View file

@ -19,7 +19,6 @@ package org.eclipse.cdt.core.index;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
/**
* @author bgheorgh
@ -63,7 +62,8 @@ public class Indexer {
public static boolean indexEnabledOnProject(IProject project){
boolean allEnabled = true;
try {
//TODO: BOG make this generic
/*try {
Boolean indexValue = (Boolean) project.getSessionProperty(IndexManager.activationKey);
if (indexValue != null){
if(!indexValue.booleanValue()){
@ -76,7 +76,7 @@ public class Indexer {
}
}
} catch (CoreException e) {}
} catch (CoreException e) {}*/
return allEnabled;
}

View file

@ -26,11 +26,7 @@ public interface IIndexer {
*/
void index(IDocument document, IIndexerOutput output) throws java.io.IOException;
/**
* Sets the document types the <code>IIndexer</code> handles.
*/
public void setFileTypes(String[] fileTypes);
/**
* Returns whether the <code>IIndexer</code> can index the given IFile or not.
*/

View file

@ -18,12 +18,14 @@ import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.index.IIndexDelta;
import org.eclipse.cdt.internal.core.index.IDocument;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.IIndexer;
import org.eclipse.cdt.internal.core.index.IQueryResult;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
@ -66,32 +68,21 @@ public class Index implements IIndex {
protected static final int CAN_MERGE= 0;
protected static final int MERGED= 1;
private File indexFile;
private ICDTIndexer indexer = null;
/**
* String representation of this index.
*/
public String toString;
public Index(File indexDirectory, boolean reuseExistingFile) throws IOException {
this(indexDirectory,".index", reuseExistingFile); //$NON-NLS-1$
}
public Index(File indexDirectory, String indexName, boolean reuseExistingFile) throws IOException {
super();
state= MERGED;
indexFile= new File(indexDirectory, indexName);
initialize(reuseExistingFile);
}
public Index(String indexName, boolean reuseExistingFile) throws IOException {
this(indexName, null, reuseExistingFile);
}
public Index(String indexName, String toString, boolean reuseExistingFile) throws IOException {
public Index(String indexName, String toString, boolean reuseExistingFile, ICDTIndexer indexer) throws IOException {
super();
state= MERGED;
indexFile= new File(indexName);
this.toString = toString;
this.indexer = indexer;
initialize(reuseExistingFile);
}
/**
@ -278,8 +269,10 @@ public class Index implements IIndex {
CCorePlugin.getDefault().cdtLog.flushLog();
//Send out notification to listeners;
IndexDelta indexDelta = new IndexDelta(null,null,IIndexDelta.MERGE_DELTA);
CCorePlugin.getDefault().getCoreModel().getIndexManager().notifyListeners(indexDelta);
if (indexer instanceof SourceIndexer){
IndexDelta indexDelta = new IndexDelta(null,null,IIndexDelta.MERGE_DELTA);
((SourceIndexer) indexer).notifyListeners(indexDelta);
}
}
}
/**
@ -443,6 +436,11 @@ public class Index implements IIndex {
str += "(length: "+ getIndexFile().length() +")"; //$NON-NLS-1$ //$NON-NLS-2$
return str;
}
public org.eclipse.cdt.core.index.ICDTIndexer getIndexer(){
return (org.eclipse.cdt.core.index.ICDTIndexer) indexer;
}
}

View file

@ -9,7 +9,7 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
import java.util.Iterator;
@ -38,9 +38,10 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IDocument;
import org.eclipse.cdt.internal.core.index.IIndexer;
import org.eclipse.cdt.internal.core.index.IIndexerOutput;
import org.eclipse.cdt.internal.core.search.indexing.IIndexConstants;
import org.eclipse.core.resources.IFile;
public abstract class AbstractIndexer implements IIndexer, IIndexConstants, ICSearchConstants {
public abstract class AbstractIndexer implements IIndexer,IIndexConstants, ICSearchConstants {
IIndexerOutput output;
final static int CLASS = 1;

View file

@ -9,7 +9,7 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
@ -21,12 +21,13 @@ import org.eclipse.core.runtime.IPath;
public class AddCompilationUnitToIndex extends AddFileToIndex {
char[] contents;
public AddCompilationUnitToIndex(IFile resource, IPath indexedContainer, IndexManager manager, boolean checkEncounteredHeaders) {
super(resource, indexedContainer, manager, checkEncounteredHeaders);
public AddCompilationUnitToIndex(IFile resource, IPath indexedContainer, SourceIndexer indexer, boolean checkEncounteredHeaders) {
super(resource, indexedContainer, indexer, checkEncounteredHeaders);
}
protected boolean indexDocument(IIndex index) throws IOException {
if (!initializeContents()) return false;
index.add(new IFileDocument(resource, this.contents), new SourceIndexer(resource, manager.getTimeout()));
index.add(new IFileDocument(resource, this.contents), new SourceIndexerRunner(resource, indexer));
return true;
}
public boolean initializeContents() {

View file

@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
@ -16,9 +16,12 @@ import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICLogConstants;
import org.eclipse.cdt.core.filetype.ICFileType;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@ -26,19 +29,19 @@ public abstract class AddFileToIndex extends IndexRequest {
IFile resource;
private boolean checkEncounteredHeaders;
public AddFileToIndex(IFile resource, IPath indexPath, IndexManager manager, boolean checkEncounteredHeaders) {
super(indexPath, manager);
public AddFileToIndex(IFile resource, IPath indexPath, SourceIndexer indexer, boolean checkEncounteredHeaders) {
super(indexPath, indexer);
this.resource = resource;
this.checkEncounteredHeaders = checkEncounteredHeaders;
}
public AddFileToIndex(IFile resource, IPath indexPath, IndexManager manager) {
this(resource,indexPath,manager,false);
public AddFileToIndex(IFile resource, IPath indexPath, SourceIndexer indexer) {
this(resource,indexPath,indexer,false);
}
public boolean execute(IProgressMonitor progressMonitor) {
if (progressMonitor != null && progressMonitor.isCanceled()) return true;
if (checkEncounteredHeaders) {
IProject resourceProject = resource.getProject();
/* Check to see if this is a header file */
@ -46,13 +49,13 @@ public abstract class AddFileToIndex extends IndexRequest {
/* See if this file has been encountered before */
if (type.isHeader() &&
manager.haveEncounteredHeader(resourceProject.getFullPath(),resource.getLocation()))
indexer.haveEncounteredHeader(resourceProject.getFullPath(),resource.getLocation()))
return true;
}
/* ensure no concurrent write access to index */
IIndex index = manager.getIndex(this.indexPath, true, /*reuse index file*/ true /*create if none*/);
IIndex index = indexer.getIndex(this.indexPath, true, /*reuse index file*/ true /*create if none*/);
if (index == null) return true;
ReadWriteMonitor monitor = manager.getMonitorFor(index);
ReadWriteMonitor monitor = indexer.getMonitorFor(index);
if (monitor == null) return true; // index got deleted since acquired
try {
monitor.enterWrite(); // ask permission to write
@ -75,4 +78,12 @@ public abstract class AddFileToIndex extends IndexRequest {
public String toString() {
return "indexing " + this.resource.getFullPath(); //$NON-NLS-1$
}
/**
* The resource being indexed
* @return
*/
public IResource getResource(){
return resource;
}
}

View file

@ -9,7 +9,7 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.util.ArrayList;
@ -18,6 +18,8 @@ import org.eclipse.cdt.core.filetype.ICFileType;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@ -28,7 +30,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
class AddFolderToIndex extends IndexRequest {
public class AddFolderToIndex extends IndexRequest {
IPath folderPath;
IProject project;
char[][] exclusionPattern;
@ -36,8 +38,8 @@ class AddFolderToIndex extends IndexRequest {
ArrayList headerFilesToIndex;
boolean cleanEncouteredHeaders;
public AddFolderToIndex(IPath folderPath, IProject project, char[][] exclusionPattern, IndexManager manager) {
super(project.getFullPath(), manager);
public AddFolderToIndex(IPath folderPath, IProject project, char[][] exclusionPattern, SourceIndexer indexer) {
super(project.getFullPath(), indexer);
this.folderPath = folderPath;
this.project = project;
this.exclusionPattern = exclusionPattern;
@ -46,8 +48,8 @@ class AddFolderToIndex extends IndexRequest {
this.cleanEncouteredHeaders = false;
}
public AddFolderToIndex(IPath folderPath, IProject project, char[][] exclusionPattern, IndexManager manager, boolean cleanEncounteredHeaders) {
super(project.getFullPath(), manager);
public AddFolderToIndex(IPath folderPath, IProject project, char[][] exclusionPattern, SourceIndexer indexer, boolean cleanEncounteredHeaders) {
super(project.getFullPath(), indexer);
this.folderPath = folderPath;
this.project = project;
this.exclusionPattern = exclusionPattern;
@ -58,21 +60,22 @@ class AddFolderToIndex extends IndexRequest {
public boolean execute(IProgressMonitor progressMonitor) {
if (progressMonitor != null && progressMonitor.isCanceled()) return true;
if (!project.isAccessible()) return true; // nothing to do
IResource folder = this.project.getParent().findMember(this.folderPath);
if (folder == null || folder.getType() == IResource.FILE) return true; // nothing to do, source folder was removed
/* ensure no concurrent write access to index */
IIndex index = manager.getIndex(this.indexPath, true, /*reuse index file*/ true /*create if none*/);
/* ensure no concurrent write access to index */
IIndex index = indexer.getIndex(this.indexPath, true, /*reuse index file*/ true /*create if none*/);
if (index == null) return true;
ReadWriteMonitor monitor = manager.getMonitorFor(index);
ReadWriteMonitor monitor = indexer.getMonitorFor(index);
if (monitor == null) return true; // index got deleted since acquired
try {
monitor.enterRead(); // ask permission to read
final IPath container = this.indexPath;
final IndexManager indexManager = this.manager;
//final IndexManager indexManager = this.manager;
final char[][] pattern = exclusionPattern;
folder.accept(
new IResourceProxyVisitor() {
@ -114,14 +117,14 @@ class AddFolderToIndex extends IndexRequest {
private void scheduleJobs() {
//Schedule the source jobs first, then the headers
for (int i=0; i<sourceFilesToIndex.size(); i++)
this.manager.addSource((IFile)sourceFilesToIndex.get(i), this.indexPath, false);
this.indexer.addSource((IFile)sourceFilesToIndex.get(i), this.indexPath, false);
for (int i=0;i<headerFilesToIndex.size(); i++)
this.manager.addSource((IFile)headerFilesToIndex.get(i), this.indexPath, true);
this.indexer.addSource((IFile)headerFilesToIndex.get(i), this.indexPath, true);
if (cleanEncouteredHeaders){
CleanEncounteredHeaders cleanHeaders = new CleanEncounteredHeaders(this.manager);
this.manager.request(cleanHeaders);
CleanEncounteredHeaders cleanHeaders = new CleanEncounteredHeaders(this.indexer);
this.indexer.request(cleanHeaders);
}
}

View file

@ -0,0 +1,544 @@
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.zip.CRC32;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.index.IIndexStorage;
import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.impl.Index;
import org.eclipse.cdt.internal.core.search.CWorkspaceScope;
import org.eclipse.cdt.internal.core.search.IndexSelector;
import org.eclipse.cdt.internal.core.search.SimpleLookupTable;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
/**
* @author Bogdan Gheorghe
*/
public class CIndexStorage implements IIndexStorage {
/* number of file contents in memory */
public static int MAX_FILES_IN_MEMORY = 0;
public IWorkspace workspace;
public SimpleLookupTable indexNames = new SimpleLookupTable();
private Map indexes = new HashMap(5);
/* read write monitors */
private Map monitors = new HashMap(5);
/* need to save ? */
private boolean needToSave = false;
private static final CRC32 checksumCalculator = new CRC32();
private IPath cCorePluginLocation = null;
/* can only replace a current state if its less than the new one */
private SimpleLookupTable indexStates = null;
private File savedIndexNamesFile =
new File(getCCorePluginWorkingLocation().append("savedIndexNames.txt").toOSString()); //$NON-NLS-1$
private SimpleLookupTable encounteredHeaders = null;
public static Integer SAVED_STATE = new Integer(0);
public static Integer UPDATING_STATE = new Integer(1);
public static Integer UNKNOWN_STATE = new Integer(2);
public static Integer REBUILDING_STATE = new Integer(3);
public static boolean VERBOSE = false;
private SourceIndexer indexer = null;
private IndexManager indexManager = null;
public ReadWriteMonitor indexAccessMonitor = null;
public CIndexStorage(ICDTIndexer indexer){
if (indexer instanceof SourceIndexer)
this.indexer = (SourceIndexer) indexer;
this.indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
}
public synchronized void aboutToUpdateIndex(IPath path, Integer newIndexState) {
// newIndexState is either UPDATING_STATE or REBUILDING_STATE
// must tag the index as inconsistent, in case we exit before the update job is started
String indexName = computeIndexName(path);
Object state = getIndexStates().get(indexName);
Integer currentIndexState = state == null ? UNKNOWN_STATE : (Integer) state;
if (currentIndexState.equals(REBUILDING_STATE)) return; // already rebuilding the index
int compare = newIndexState.compareTo(currentIndexState);
if (compare > 0) {
// so UPDATING_STATE replaces SAVED_STATE and REBUILDING_STATE replaces everything
updateIndexState(indexName, newIndexState);
} else if (compare < 0 && this.indexes.get(path) == null) {
// if already cached index then there is nothing more to do
rebuildIndex(indexName, path);
}
}
String computeIndexName(IPath path) {
String name = (String) indexNames.get(path);
if (name == null) {
String pathString = path.toOSString();
checksumCalculator.reset();
checksumCalculator.update(pathString.getBytes());
String fileName = Long.toString(checksumCalculator.getValue()) + ".index"; //$NON-NLS-1$
if (IndexManager.VERBOSE)
JobManager.verbose("-> index name for " + pathString + " is " + fileName); //$NON-NLS-1$ //$NON-NLS-2$
name = getCCorePluginWorkingLocation().append(fileName).toOSString();
indexNames.put(path, name);
}
return name;
}
/**
* Returns the index for a given project, according to the following algorithm:
* - if index is already in memory: answers this one back
* - if (reuseExistingFile) then read it and return this index and record it in memory
* - if (createIfMissing) then create a new empty index and record it in memory
*
* Warning: Does not check whether index is consistent (not being used)
*/
public synchronized IIndex getIndex(IPath path, boolean reuseExistingFile, boolean createIfMissing) {
// Path is already canonical per construction
IIndex index = (IIndex) indexes.get(path);
if (index == null) {
String indexName = computeIndexName(path);
Object state = getIndexStates().get(indexName);
Integer currentIndexState = state == null ? UNKNOWN_STATE : (Integer) state;
if (currentIndexState == UNKNOWN_STATE) {
// should only be reachable for query jobs
// IF you put an index in the cache, then AddJarFileToIndex fails because it thinks there is nothing to do
rebuildIndex(indexName, path);
return null;
}
// index isn't cached, consider reusing an existing index file
if (reuseExistingFile) {
File indexFile = new File(indexName);
if (indexFile.exists()) { // check before creating index so as to avoid creating a new empty index if file is missing
try {
index = new Index(indexName, "Index for " + path.toOSString(), true /*reuse index file*/, indexer); //$NON-NLS-1$
indexes.put(path, index);
monitors.put(index, new ReadWriteMonitor());
return index;
} catch (IOException e) {
// failed to read the existing file or its no longer compatible
if (currentIndexState != REBUILDING_STATE) { // rebuild index if existing file is corrupt, unless the index is already being rebuilt
if (IndexManager.VERBOSE)
JobManager.verbose("-> cannot reuse existing index: "+indexName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$
rebuildIndex(indexName, path);
return null;
}
index = null; // will fall thru to createIfMissing & create a empty index for the rebuild all job to populate
}
}
if (currentIndexState == SAVED_STATE) { // rebuild index if existing file is missing
rebuildIndex(indexName, path);
return null;
}
}
// index wasn't found on disk, consider creating an empty new one
if (createIfMissing) {
try {
if (VERBOSE)
JobManager.verbose("-> create empty index: "+indexName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$
index = new Index(indexName, "Index for " + path.toOSString(), false /*do not reuse index file*/, indexer); //$NON-NLS-1$
indexes.put(path, index);
monitors.put(index, new ReadWriteMonitor());
return index;
} catch (IOException e) {
if (VERBOSE)
JobManager.verbose("-> unable to create empty index: "+indexName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$
// The file could not be created. Possible reason: the project has been deleted.
return null;
}
}
}
//System.out.println(" index name: " + path.toOSString() + " <----> " + index.getIndexFile().getName());
return index;
}
private SimpleLookupTable getIndexStates() {
if (indexStates != null) return indexStates;
this.indexStates = new SimpleLookupTable();
char[] savedIndexNames = readIndexState();
if (savedIndexNames.length > 0) {
char[][] names = CharOperation.splitOn('\n', savedIndexNames);
for (int i = 0, l = names.length; i < l; i++) {
char[] name = names[i];
if (name.length > 0)
this.indexStates.put(new String(name), SAVED_STATE);
}
}
return this.indexStates;
}
public SimpleLookupTable getEncounteredHeaders(){
if (encounteredHeaders == null){
this.encounteredHeaders = new SimpleLookupTable();
}
return this.encounteredHeaders;
}
/**
* Resets the headers table
*/
public void resetEncounteredHeaders() {
this.encounteredHeaders = null;
}
private IPath getCCorePluginWorkingLocation() {
if (this.cCorePluginLocation != null) return this.cCorePluginLocation;
return this.cCorePluginLocation = CCorePlugin.getDefault().getStateLocation();
}
/**
* Index access is controlled through a read-write monitor so as
* to ensure there is no concurrent read and write operations
* (only concurrent reading is allowed).
*/
public ReadWriteMonitor getMonitorFor(IIndex index){
return (ReadWriteMonitor) monitors.get(index);
}
private void rebuildIndex(String indexName, IPath path) {
Object target = org.eclipse.cdt.internal.core.Util.getTarget(ResourcesPlugin.getWorkspace().getRoot(), path, true);
if (target == null) return;
if (IndexManager.VERBOSE)
JobManager.verbose("-> request to rebuild index: "+indexName+" path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$
updateIndexState(indexName, REBUILDING_STATE);
IndexRequest request = null;
if (target instanceof IProject) {
IProject p = (IProject) target;
if( p.exists() && indexer.isIndexEnabled( p ) )
request = new IndexAllProject(p, indexer);
}
if (request != null)
indexManager.request(request);
}
/**
* Recreates the index for a given path, keeping the same read-write monitor.
* Returns the new empty index or null if it didn't exist before.
* Warning: Does not check whether index is consistent (not being used)
*/
public synchronized IIndex recreateIndex(IPath path) {
// only called to over write an existing cached index...
try {
IIndex index = (IIndex) this.indexes.get(path);
ReadWriteMonitor monitor = (ReadWriteMonitor) this.monitors.remove(index);
// Path is already canonical
String indexPath = computeIndexName(path);
if (IndexManager.VERBOSE)
JobManager.verbose("-> recreating index: "+indexPath+" for path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$
index = new Index(indexPath, "Index for " + path.toOSString(), false /*reuse index file*/,indexer); //$NON-NLS-1$
indexes.put(path, index);
monitors.put(index, monitor);
return index;
} catch (IOException e) {
// The file could not be created. Possible reason: the project has been deleted.
if (IndexManager.VERBOSE) {
JobManager.verbose("-> failed to recreate index for path: "+path.toOSString()); //$NON-NLS-1$ //$NON-NLS-2$
e.printStackTrace();
}
return null;
}
}
/**
* Removes the index for a given path.
* This is a no-op if the index did not exist.
*/
public synchronized void removeIndex(IPath path) {
if (IndexManager.VERBOSE)
JobManager.verbose("removing index " + path); //$NON-NLS-1$
String indexName = computeIndexName(path);
File indexFile = new File(indexName);
if (indexFile.exists())
indexFile.delete();
Object o = this.indexes.get(path);
if (o instanceof IIndex)
this.monitors.remove(o);
this.indexes.remove(path);
updateIndexState(indexName, null);
}
/**
* Removes all indexes whose paths start with (or are equal to) the given path.
*/
public synchronized void removeIndexFamily(IPath path) {
// only finds cached index files... shutdown removes all non-cached index files
ArrayList toRemove = null;
Iterator iterator = this.indexes.keySet().iterator();
while (iterator.hasNext()) {
IPath indexPath = (IPath) iterator.next();
if (path.isPrefixOf(indexPath)) {
if (toRemove == null)
toRemove = new ArrayList();
toRemove.add(indexPath);
}
}
if (toRemove != null)
for (int i = 0, length = toRemove.size(); i < length; i++)
this.removeIndex((IPath) toRemove.get(i));
}
public void saveIndex(IIndex index) throws IOException {
// must have permission to write from the write monitor
if (index.hasChanged()) {
if (IndexManager.VERBOSE)
JobManager.verbose("-> saving index " + index.getIndexFile()); //$NON-NLS-1$
index.save();
}
String indexName = index.getIndexFile().getPath();
if (indexManager.getJobEnd() > indexManager.getJobStart()) {
Object indexPath = indexNames.keyForValue(indexName);
if (indexPath != null) {
for (int i = indexManager.getJobEnd(); i > indexManager.getJobStart(); i--) { // skip the current job
IIndexJob job = indexManager.getAwaitingJobAt(i);
if (job instanceof IndexRequest)
if (((IndexRequest) job).indexPath.equals(indexPath)) return;
}
}
}
updateIndexState(indexName, SAVED_STATE);
}
/**
* Commit all index memory changes to disk
*/
public void saveIndexes() {
// only save cached indexes... the rest were not modified
ArrayList toSave = new ArrayList();
synchronized(this) {
for (Iterator iter = this.indexes.values().iterator(); iter.hasNext();) {
Object o = iter.next();
if (o instanceof IIndex)
toSave.add(o);
}
}
for (int i = 0, length = toSave.size(); i < length; i++) {
IIndex index = (IIndex) toSave.get(i);
ReadWriteMonitor monitor = getMonitorFor(index);
if (monitor == null) continue; // index got deleted since acquired
try {
monitor.enterWrite();
try {
saveIndex(index);
} catch(IOException e){
if (IndexManager.VERBOSE) {
JobManager.verbose("-> got the following exception while saving:"); //$NON-NLS-1$
e.printStackTrace();
}
//Util.log(e);
}
} finally {
monitor.exitWrite();
}
}
needToSave = false;
}
public void shutdown() {
if (IndexManager.VERBOSE)
JobManager.verbose("Shutdown"); //$NON-NLS-1$
//Get index entries for all projects in the workspace, store their absolute paths
IndexSelector indexSelector = new IndexSelector(new CWorkspaceScope(), null, false, indexManager);
IIndex[] selectedIndexes = indexSelector.getIndexes();
SimpleLookupTable knownPaths = new SimpleLookupTable();
for (int i = 0, max = selectedIndexes.length; i < max; i++) {
String path = selectedIndexes[i].getIndexFile().getAbsolutePath();
knownPaths.put(path, path);
}
//Any index entries that are in the index state must have a corresponding
//path entry - if not they are removed from the saved indexes file
if (indexStates != null) {
Object[] indexNames = indexStates.keyTable;
for (int i = 0, l = indexNames.length; i < l; i++) {
String key = (String) indexNames[i];
if (key != null && !knownPaths.containsKey(key)) //here is an index that is in t
updateIndexState(key, null);
}
}
//Clean up the .metadata folder - if there are any files in the directory that
//are not associated to an index we delete them
File indexesDirectory = new File(getCCorePluginWorkingLocation().toOSString());
if (indexesDirectory.isDirectory()) {
File[] indexesFiles = indexesDirectory.listFiles();
if (indexesFiles != null) {
for (int i = 0, indexesFilesLength = indexesFiles.length; i < indexesFilesLength; i++) {
String fileName = indexesFiles[i].getAbsolutePath();
if (!knownPaths.containsKey(fileName) && fileName.toLowerCase().endsWith(".index")) { //$NON-NLS-1$
if (IndexManager.VERBOSE)
JobManager.verbose("Deleting index file " + indexesFiles[i]); //$NON-NLS-1$
indexesFiles[i].delete();
}
}
}
}
}
public String toString() {
StringBuffer buffer = new StringBuffer(10);
buffer.append(super.toString());
buffer.append("In-memory indexes:\n"); //$NON-NLS-1$
int count = 0;
for (Iterator iter = this.indexes.values().iterator(); iter.hasNext();) {
buffer.append(++count).append(" - ").append(iter.next().toString()).append('\n'); //$NON-NLS-1$
}
return buffer.toString();
}
private char[] readIndexState() {
try {
return org.eclipse.cdt.internal.core.Util.getFileCharContent(savedIndexNamesFile, null);
} catch (IOException ignored) {
if (IndexManager.VERBOSE)
JobManager.verbose("Failed to read saved index file names"); //$NON-NLS-1$
return new char[0];
}
}
private void updateIndexState(String indexName, Integer indexState) {
getIndexStates(); // ensure the states are initialized
if (indexState != null) {
if (indexState.equals(indexStates.get(indexName))) return; // not changed
indexStates.put(indexName, indexState);
} else {
if (!indexStates.containsKey(indexName)) return; // did not exist anyway
indexStates.removeKey(indexName);
}
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(savedIndexNamesFile));
Object[] indexNames = indexStates.keyTable;
Object[] states = indexStates.valueTable;
for (int i = 0, l = states.length; i < l; i++) {
if (states[i] == SAVED_STATE) {
writer.write((String) indexNames[i]);
writer.write('\n');
}
}
} catch (IOException ignored) {
if (IndexManager.VERBOSE)
JobManager.verbose("Failed to write saved index file names"); //$NON-NLS-1$
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {}
}
}
if (IndexManager.VERBOSE) {
String state = "?"; //$NON-NLS-1$
if (indexState == SAVED_STATE) state = "SAVED"; //$NON-NLS-1$
else if (indexState == UPDATING_STATE) state = "UPDATING"; //$NON-NLS-1$
else if (indexState == UNKNOWN_STATE) state = "UNKNOWN"; //$NON-NLS-1$
else if (indexState == REBUILDING_STATE) state = "REBUILDING"; //$NON-NLS-1$
JobManager.verbose("-> index state updated to: " + state + " for: "+indexName); //$NON-NLS-1$ //$NON-NLS-2$
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexStorage#getIndexers()
*/
public ICDTIndexer[] getIndexers() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexStorage#getPathVariables()
*/
public String[] getPathVariables() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexStorage#resolvePathVariables()
*/
public void resolvePathVariables() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexStorage#merge()
*/
public void merge() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexStorage#canMergeWith(org.eclipse.cdt.core.index2.IIndexStorage)
*/
public boolean canMergeWith(IIndexStorage storage) {
// TODO Auto-generated method stub
return false;
}
public boolean getNeedToSave() {
return needToSave;
}
public void setNeedToSave(boolean needToSave) {
this.needToSave = needToSave;
}
public void jobWasCancelled(IPath path) {
Object o = this.indexes.get(path);
if (o instanceof IIndex) {
this.monitors.remove(o);
this.indexes.remove(path);
}
updateIndexState(computeIndexName(path), UNKNOWN_STATE);
}
public ReadWriteMonitor getIndexAccessMonitor() {
return indexAccessMonitor;
}
}

View file

@ -4,9 +4,9 @@
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.core.runtime.IProgressMonitor;
/**
@ -15,20 +15,18 @@ import org.eclipse.core.runtime.IProgressMonitor;
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class CleanEncounteredHeaders implements IJob {
public class CleanEncounteredHeaders implements IIndexJob {
IndexManager manager = null;
SourceIndexer indexer = null;
public CleanEncounteredHeaders(IndexManager manager){
this.manager = manager;
public CleanEncounteredHeaders(SourceIndexer indexer){
this.indexer = indexer;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.search.processing.IJob#execute(org.eclipse.core.runtime.IProgressMonitor)
*/
public boolean execute(IProgressMonitor progress) {
//Clean out the headers
this.manager.resetEncounteredHeaders();
indexer.resetEncounteredHeaders();
return true;
}
/* (non-Javadoc)

View file

@ -9,7 +9,7 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
@ -22,6 +22,8 @@ import org.eclipse.cdt.internal.core.model.CModel;
import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.core.model.SourceRoot;
import org.eclipse.cdt.internal.core.search.SimpleLookupTable;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
@ -31,8 +33,8 @@ import org.eclipse.core.runtime.IProgressMonitor;
public class IndexAllProject extends IndexRequest {
IProject project;
public IndexAllProject(IProject project, IndexManager manager) {
super(project.getFullPath(), manager);
public IndexAllProject(IProject project, SourceIndexer indexer) {
super(project.getFullPath(), indexer);
this.project = project;
}
@ -50,10 +52,12 @@ public class IndexAllProject extends IndexRequest {
if (progressMonitor != null && progressMonitor.isCanceled()) return true;
if (!project.isAccessible()) return true; // nothing to do
IIndex index = this.manager.getIndex(this.indexPath, true, /*reuse index file*/ true /*create if none*/);
String test = this.indexPath.toOSString();
IIndex index = indexer.getIndex(this.indexPath, true, /*reuse index file*/ true /*create if none*/);
if (index == null) return true;
ReadWriteMonitor monitor = this.manager.getMonitorFor(index);
ReadWriteMonitor monitor = indexer.getMonitorFor(index);
if (monitor == null) return true; // index got deleted since acquired
try {
@ -84,27 +88,27 @@ public class IndexAllProject extends IndexRequest {
ISourceEntry tempEntry = ((SourceRoot) sourceRoot[i]).getSourceEntry();
if ((i+1) != sourceRoot.length)
this.manager.request(new AddFolderToIndex(sourceRoot[i].getPath(), project, tempEntry.fullExclusionPatternChars(), this.manager));
indexer.request(new AddFolderToIndex(sourceRoot[i].getPath(), project, tempEntry.fullExclusionPatternChars(), indexer));
else
this.manager.request(new AddFolderToIndex(sourceRoot[i].getPath(), project, tempEntry.fullExclusionPatternChars(), this.manager,true));
indexer.request(new AddFolderToIndex(sourceRoot[i].getPath(), project, tempEntry.fullExclusionPatternChars(),indexer,true));
}
}
// request to save index when all cus have been indexed
this.manager.request(new SaveIndex(this.indexPath, this.manager));
indexer.request(new SaveIndex(this.indexPath, indexer));
} catch (CoreException e) {
if (IndexManager.VERBOSE) {
JobManager.verbose("-> failed to index " + this.project + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$
e.printStackTrace();
}
this.manager.removeIndex(this.indexPath);
indexer.removeIndex(this.indexPath);
return false;
} catch (IOException e) {
if (IndexManager.VERBOSE) {
JobManager.verbose("-> failed to index " + this.project + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$
e.printStackTrace();
}
this.manager.removeIndex(this.indexPath);
indexer.removeIndex(this.indexPath);
return false;
} finally {
monitor.exitRead(); // free read lock
@ -117,7 +121,7 @@ public class IndexAllProject extends IndexRequest {
}
protected Integer updatedIndexState() {
return IndexManager.REBUILDING_STATE;
return CIndexStorage.REBUILDING_STATE;
}
public String toString() {

View file

@ -9,24 +9,25 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
public abstract class IndexRequest implements IJob {
public abstract class IndexRequest implements IIndexJob {
protected boolean isCancelled = false;
protected IPath indexPath;
protected IndexManager manager;
public IndexRequest(IPath indexPath, IndexManager manager) {
protected IPath indexPath = null;
protected SourceIndexer indexer = null;
public IndexRequest(IPath indexPath, SourceIndexer indexer) {
this.indexPath = indexPath;
this.manager = manager;
this.indexer = indexer;
}
public boolean belongsTo(String projectName) {
@ -34,18 +35,18 @@ public abstract class IndexRequest implements IJob {
}
public void cancel() {
this.manager.jobFinishedNotification( this );
this.manager.jobWasCancelled(this.indexPath);
this.indexer.jobFinishedNotification( this );
this.indexer.jobWasCancelled(this.indexPath);
this.isCancelled = true;
}
public boolean isReadyToRun() {
IProject project = CCorePlugin.getWorkspace().getRoot().getProject(indexPath.segment(0));
if ( !project.isAccessible() || !this.manager.isIndexEnabled( project ) )
if ( !project.isAccessible() || !this.indexer.isIndexEnabled( project ) )
return false;
// tag the index as inconsistent
this.manager.aboutToUpdateIndex(indexPath, updatedIndexState());
indexer.aboutToUpdateIndex(indexPath, updatedIndexState());
return true;
}
/*
@ -57,7 +58,7 @@ public abstract class IndexRequest implements IJob {
try {
monitor.exitRead(); // free read lock
monitor.enterWrite(); // ask permission to write
this.manager.saveIndex(index);
indexer.saveIndex(index);
} finally {
monitor.exitWriteEnterRead(); // finished writing and reacquire read permission
}
@ -65,6 +66,10 @@ public abstract class IndexRequest implements IJob {
}
protected Integer updatedIndexState() {
return IndexManager.UPDATING_STATE;
return CIndexStorage.UPDATING_STATE;
}
public IPath getIndexPath(){
return indexPath;
}
}

View file

@ -9,26 +9,28 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.IQueryResult;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
class RemoveFolderFromIndex extends IndexRequest {
public class RemoveFolderFromIndex extends IndexRequest {
IPath folderPath;
char[][] exclusionPatterns;
IProject project;
public RemoveFolderFromIndex(IPath folderPath, char[][] exclusionPatterns, IProject project, IndexManager manager) {
super(project.getFullPath(), manager);
public RemoveFolderFromIndex(IPath folderPath, char[][] exclusionPatterns, IProject project, SourceIndexer indexer) {
super(project.getFullPath(), indexer);
this.folderPath = folderPath;
this.exclusionPatterns = exclusionPatterns;
this.project = project;
@ -38,9 +40,9 @@ class RemoveFolderFromIndex extends IndexRequest {
if (progressMonitor != null && progressMonitor.isCanceled()) return true;
/* ensure no concurrent write access to index */
IIndex index = manager.getIndex(this.indexPath, true, /*reuse index file*/ false /*create if none*/);
IIndex index = indexer.getIndex(this.indexPath, true, /*reuse index file*/ false /*create if none*/);
if (index == null) return true;
ReadWriteMonitor monitor = manager.getMonitorFor(index);
ReadWriteMonitor monitor = indexer.getMonitorFor(index);
if (monitor == null) return true; // index got deleted since acquired
try {
@ -50,7 +52,7 @@ class RemoveFolderFromIndex extends IndexRequest {
for (int i = 0, max = results == null ? 0 : results.length; i < max; i++) {
String documentPath = results[i].getPath();
if (this.exclusionPatterns == null || !Util.isExcluded(new Path(documentPath), this.exclusionPatterns)) {
manager.remove(documentPath, this.indexPath); // write lock will be acquired by the remove operation
indexer.remove(documentPath, this.indexPath); // write lock will be acquired by the remove operation
}
}
} catch (IOException e) {

View file

@ -9,20 +9,22 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
class RemoveFromIndex extends IndexRequest {
public class RemoveFromIndex extends IndexRequest {
String resourceName;
public RemoveFromIndex(String resourceName, IPath indexPath, IndexManager manager) {
super(indexPath, manager);
public RemoveFromIndex(String resourceName, IPath indexPath, SourceIndexer indexer) {
super(indexPath, indexer);
this.resourceName = resourceName;
}
@ -31,9 +33,9 @@ class RemoveFromIndex extends IndexRequest {
if (progressMonitor != null && progressMonitor.isCanceled()) return true;
/* ensure no concurrent write access to index */
IIndex index = manager.getIndex(this.indexPath, true, /*reuse index file*/ false /*create if none*/);
IIndex index = indexer.getIndex(this.indexPath, true, /*reuse index file*/ false /*create if none*/);
if (index == null) return true;
ReadWriteMonitor monitor = manager.getMonitorFor(index);
ReadWriteMonitor monitor = indexer.getMonitorFor(index);
if (monitor == null) return true; // index got deleted since acquired
try {

View file

@ -9,35 +9,37 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
/*
* Save the index of a project.
*/
public class SaveIndex extends IndexRequest {
public SaveIndex(IPath indexPath, IndexManager manager) {
super(indexPath, manager);
public SaveIndex(IPath indexPath, SourceIndexer indexer) {
super(indexPath, indexer);
}
public boolean execute(IProgressMonitor progressMonitor) {
if (progressMonitor != null && progressMonitor.isCanceled()) return true;
/* ensure no concurrent write access to index */
IIndex index = this.manager.getIndex(this.indexPath, true /*reuse index file*/, false /*don't create if none*/);
IIndex index = indexer.getIndex(this.indexPath, true /*reuse index file*/, false /*don't create if none*/);
if (index == null) return true;
ReadWriteMonitor monitor = this.manager.getMonitorFor(index);
ReadWriteMonitor monitor = indexer.getMonitorFor(index);
if (monitor == null) return true; // index got deleted since acquired
try {
monitor.enterWrite(); // ask permission to write
this.manager.saveIndex(index);
indexer.saveIndex(index);
} catch (IOException e) {
if (IndexManager.VERBOSE) {
JobManager.verbose("-> failed to save index " + this.indexPath + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$

View file

@ -0,0 +1,685 @@
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.internal.core.index.sourceindexer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ICLogConstants;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.index.IIndexChangeListener;
import org.eclipse.cdt.core.index.IIndexStorage;
import org.eclipse.cdt.core.index.IndexChangeEvent;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICModelMarker;
import org.eclipse.cdt.core.parser.util.ObjectSet;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.IDocument;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.IIndexerOutput;
import org.eclipse.cdt.internal.core.index.impl.IndexDelta;
import org.eclipse.cdt.internal.core.search.SimpleLookupTable;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.cdt.internal.core.sourcedependency.UpdateDependency;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* @author Bogdan Gheorghe
*/
public class SourceIndexer implements ICDTIndexer {
public static boolean VERBOSE = false;
//private IndexerModelListener indexModelListener = null;
/**
* Collection of listeners for indexer deltas
*/
protected List indexChangeListeners = Collections.synchronizedList(new ArrayList());
public static final String INDEX_NOTIFICATION_NAME = Util.bind( "indexNotificationJob" ); //$NON-NLS-1$
public final static String INDEX_MODEL_ID = CCorePlugin.PLUGIN_ID + ".newindexmodel"; //$NON-NLS-1$
public final static String ACTIVATION = "enable"; //$NON-NLS-1$
public final static String PROBLEM_ACTIVATION = "problemEnable"; //$NON-NLS-1$
public final static QualifiedName activationKey = new QualifiedName(INDEX_MODEL_ID, ACTIVATION);
public final static QualifiedName problemsActivationKey = new QualifiedName( INDEX_MODEL_ID, PROBLEM_ACTIVATION );
public static final String INDEXER_ENABLED = "indexEnabled"; //$NON-NLS-1$
public static final String INDEXER_PROBLEMS_ENABLED = "indexerProblemsEnabled"; //$NON-NLS-1$
public static final String SOURCE_INDEXER = "cdt_source_indexer"; //$NON-NLS-1$
public static final String INDEXER_VALUE = "indexValue"; //$NON-NLS-1$
public static final String INDEXER_PROBLEMS_VALUE = "indexProblemsValue"; //$NON-NLS-1$
public static final int PREPROCESSOR_PROBLEMS_BIT = 1;
public static final int SEMANTIC_PROBLEMS_BIT = 1 << 1;
public static final int SYNTACTIC_PROBLEMS_BIT = 1 << 2;
private CIndexStorage indexStorage = null;
public ReadWriteMonitor storageMonitor = null;
private IndexManager indexManager = null;
private HashSet jobSet = null;
public SourceIndexer(){
this.indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
this.indexStorage = (CIndexStorage) indexManager.getIndexStorageForIndexer(this);
this.jobSet = new HashSet();
this.storageMonitor = new ReadWriteMonitor();
}
/**
* @return
*/
private IIndexStorage getIndexStorage() {
return indexStorage;
}
public void addSource(IFile resource, IPath indexedContainers){
this.addSource(resource,indexedContainers, false);
}
/**
* Trigger addition of a resource to an index
* Note: the actual operation is performed in background
* @param checkEncounteredHeaders TODO
*/
public void addSource(IFile resource, IPath indexedContainers, boolean checkEncounteredHeaders){
IProject project = resource.getProject();
boolean indexEnabled = false;
if (project != null)
indexEnabled = isIndexEnabled(project);
else
org.eclipse.cdt.internal.core.model.Util.log(null, "IndexManager addSource: File has no project associated : " + resource.getName(), ICLogConstants.CDT); //$NON-NLS-1$
if (CCorePlugin.getDefault() == null) return;
if (indexEnabled){
AddCompilationUnitToIndex job = new AddCompilationUnitToIndex(resource, indexedContainers, this, checkEncounteredHeaders);
//If we are in WAITING mode, we need to kick ourselves into enablement
if (!jobSet.add(resource.getLocation()) &&
indexManager.enabledState()==IndexManager.ENABLED)
return;
if (indexManager.awaitingJobsCount() < CIndexStorage.MAX_FILES_IN_MEMORY) {
// reduces the chance that the file is open later on, preventing it from being deleted
if (!job.initializeContents()) return;
}
this.indexManager.request(job);
}
}
public void updateDependencies(IResource resource){
if (CCorePlugin.getDefault() == null || !isIndexEnabled( resource.getProject() ) )
return;
UpdateDependency job = new UpdateDependency(resource, this);
indexManager.request(job);
}
/**
* Returns the index for a given project, according to the following algorithm:
* - if index is already in memory: answers this one back
* - if (reuseExistingFile) then read it and return this index and record it in memory
* - if (createIfMissing) then create a new empty index and record it in memory
*
* Warning: Does not check whether index is consistent (not being used)
*/
public synchronized boolean haveEncounteredHeader(IPath projectPath, IPath filePath) {
if (!(indexStorage instanceof CIndexStorage))
return false;
SimpleLookupTable headerTable = ((CIndexStorage)indexStorage).getEncounteredHeaders();
// Path is already canonical per construction
ObjectSet headers = (ObjectSet) headerTable.get(projectPath);
if (headers == null) {
//First time for the project, must create a new ObjectSet
headers = new ObjectSet(4);
headerTable.put(projectPath, headers);
}
if (headers.containsKey(filePath.toOSString()))
return true;
headers.put(filePath.toOSString());
return false;
}
/**
* Trigger addition of the entire content of a project
* Note: the actual operation is performed in background
*/
public void indexAll(IProject project) {
if (CCorePlugin.getDefault() == null) return;
//check to see if indexing isEnabled for this project
boolean indexEnabled = isIndexEnabled(project);
if (indexEnabled){
if( indexManager.enabledState() == IndexManager.WAITING ){
//if we are paused because the user cancelled a previous index, this is a good
//enough reason to restart
indexManager.enable();
}
// check if the same request is not already in the queue
IndexRequest request = new IndexAllProject(project, this);
for (int i = indexManager.getJobEnd(); i > indexManager.getJobStart(); i--) // NB: don't check job at jobStart, as it may have already started (see http://bugs.eclipse.org/bugs/show_bug.cgi?id=32488)
if (request.equals(indexManager.getAwaitingJobAt(i))) return;
indexManager.request(request);
}
}
/**
* @param project
* @return
*/
public boolean isIndexEnabled(IProject project) {
if( project == null || !project.exists() || !project.isOpen() )
return false;
Boolean indexValue = null;
try {
indexValue = (Boolean) project.getSessionProperty(activationKey);
} catch (CoreException e) {
}
if (indexValue != null)
return indexValue.booleanValue();
try {
//Load value for project
indexValue = loadIndexerEnabledFromCDescriptor(project);
if (indexValue != null){
project.setSessionProperty(SourceIndexer.activationKey, indexValue);
return indexValue.booleanValue();
}
// TODO: Indexer Block Place holder for Managed Make - take out
indexValue = new Boolean(true);
project.setSessionProperty(SourceIndexer.activationKey, indexValue);
return indexValue.booleanValue();
} catch (CoreException e1) {
}
return false;
}
public int indexProblemsEnabled(IProject project) {
Integer value = null;
try {
value = (Integer) project.getSessionProperty(problemsActivationKey);
} catch (CoreException e) {
}
if (value != null)
return value.intValue();
try {
//Load value for project
value = loadIndexerProblemsEnabledFromCDescriptor(project);
if (value != null){
project.setSessionProperty(SourceIndexer.problemsActivationKey, value);
return value.intValue();
}
//TODO: Indexer Block Place holder for Managed Make - take out
value = new Integer(0);
project.setSessionProperty(SourceIndexer.problemsActivationKey, value);
return value.intValue();
} catch (CoreException e1) {
}
return 0;
}
/**
* Index the content of the given source folder.
*/
public void indexSourceFolder(IProject project, IPath sourceFolder, final char[][] exclusionPattern) {
if( !isIndexEnabled( project ) )
return;
if (indexManager.getJobEnd() > indexManager.getJobStart()) {
// check if a job to index the project is not already in the queue
IndexRequest request = new IndexAllProject(project, this);
for (int i = indexManager.getJobEnd(); i > indexManager.getJobStart(); i--) // NB: don't check job at jobStart, as it may have already started (see http://bugs.eclipse.org/bugs/show_bug.cgi?id=32488)
if (request.equals(indexManager.getAwaitingJobAt(i))) return;
}
this.request(new AddFolderToIndex(sourceFolder, project, exclusionPattern, this));
}
/**
* Trigger removal of a resource to an index
* Note: the actual operation is performed in background
*/
public void remove(String resourceName, IPath indexedContainer){
IProject project = CCorePlugin.getWorkspace().getRoot().getProject(indexedContainer.toString());
if( isIndexEnabled( project ) )
request(new RemoveFromIndex(resourceName, indexedContainer, this));
}
/**
* Remove the content of the given source folder from the index.
*/
public void removeSourceFolderFromIndex(IProject project, IPath sourceFolder, char[][] exclusionPatterns) {
if( !isIndexEnabled( project ) )
return;
if (indexManager.getJobEnd()> indexManager.getJobStart()) {
// check if a job to index the project is not already in the queue
IndexRequest request = new IndexAllProject(project, this);
for (int i = indexManager.getJobEnd(); i > indexManager.getJobStart(); i--) // NB: don't check job at jobStart, as it may have already started (see http://bugs.eclipse.org/bugs/show_bug.cgi?id=32488)
if (request.equals(indexManager.getAwaitingJobAt(i))) return;
}
this.request(new RemoveFolderFromIndex(sourceFolder, exclusionPatterns, project, this));
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.search.processing.JobManager#jobFinishedNotification(org.eclipse.cdt.internal.core.search.processing.IJob)
*/
public void jobFinishedNotification(IIndexJob job) {
this.indexJobFinishedNotification(job);
}
private Boolean loadIndexerEnabledFromCDescriptor(IProject project) throws CoreException {
// Check if we have the property in the descriptor
// We pass false since we do not want to create the descriptor if it does not exists.
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project, false);
Boolean strBool = null;
if (descriptor != null) {
Node child = descriptor.getProjectData(SOURCE_INDEXER).getFirstChild();
while (child != null) {
if (child.getNodeName().equals(INDEXER_ENABLED))
strBool = Boolean.valueOf(((Element)child).getAttribute(INDEXER_VALUE));
child = child.getNextSibling();
}
}
return strBool;
}
private Integer loadIndexerProblemsEnabledFromCDescriptor(IProject project) throws CoreException {
// we are only checking for the settings do not create the descriptor.
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project, false);
Integer strInt = null;
if( descriptor != null ){
Node child = descriptor.getProjectData(SourceIndexer.SOURCE_INDEXER).getFirstChild();
while (child != null) {
if (child.getNodeName().equals(INDEXER_PROBLEMS_ENABLED)){
String val = ((Element)child).getAttribute(INDEXER_PROBLEMS_VALUE);
try{
strInt = Integer.valueOf( val );
} catch( NumberFormatException e ){
//some old projects might have a boolean stored, translate that into just preprocessors
Boolean bool = Boolean.valueOf( val );
if( bool.booleanValue() )
strInt = new Integer( SourceIndexer.PREPROCESSOR_PROBLEMS_BIT );
else
strInt = new Integer( 0 );
}
break;
}
child = child.getNextSibling();
}
}
return strInt;
}
static private class RemoveIndexMarkersJob extends Job{
private final IResource resource;
public RemoveIndexMarkersJob( IResource resource, String name ){
super( name );
this.resource = resource;
}
protected IStatus run(IProgressMonitor monitor) {
try {
resource.deleteMarkers( ICModelMarker.INDEXER_MARKER, true, IResource.DEPTH_INFINITE );
} catch (CoreException e) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
}
public void removeIndexerProblems( IResource resource){
String jobName = "remove markers"; //$NON-NLS-1$
RemoveIndexMarkersJob job = new RemoveIndexMarkersJob( resource, jobName );
job.setRule( resource );
job.setPriority( Job.DECORATE );
job.schedule();
}
public void addIndexChangeListener(IIndexChangeListener listener) {
synchronized(indexChangeListeners) {
if (!indexChangeListeners.contains(listener)) {
indexChangeListeners.add(listener);
}
}
}
public void removeIndexChangeListener(IIndexChangeListener listener) {
synchronized(indexChangeListeners) {
int i = indexChangeListeners.indexOf(listener);
if (i != -1) {
indexChangeListeners.remove(i);
}
}
}
/**
* @param indexDelta
*/
public void notifyListeners(IndexDelta indexDelta) {
final IndexChangeEvent indexEvent = new IndexChangeEvent(indexDelta);
for (int i= 0; i < indexChangeListeners.size(); i++) {
IIndexChangeListener tempListener = null;
synchronized(indexChangeListeners){
tempListener = (IIndexChangeListener) indexChangeListeners.get(i);
}
final IIndexChangeListener listener = tempListener;
long start = -1;
if (VERBOSE) {
System.out.print("Listener #" + (i+1) + "=" + listener.toString());//$NON-NLS-1$//$NON-NLS-2$
start = System.currentTimeMillis();
}
// wrap callbacks with Safe runnable for subsequent listeners to be called when some are causing grief
Job job = new Job(INDEX_NOTIFICATION_NAME){
protected IStatus run(IProgressMonitor monitor) {
Platform.run(new ISafeRunnable() {
public void handleException(Throwable exception) {
CCorePlugin.log(exception);
}
public void run() throws Exception {
listener.indexChanged(indexEvent);
}
});
return Status.OK_STATUS;
}
};
job.schedule();
if (VERBOSE) {
System.out.println(" -> " + (System.currentTimeMillis()-start) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
/**
* No more job awaiting.
*/
public void notifyIdle(long idlingTime){
if (idlingTime > 1000 && ((CIndexStorage) indexStorage).getNeedToSave())
((CIndexStorage) indexStorage).saveIndexes();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#getIndexerFeatures()
*/
public int getIndexerFeatures() {
// TODO Auto-generated method stub
return 0;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#shouldIndex(org.eclipse.core.resources.IFile)
*/
public boolean shouldIndex(IFile file) {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#index(org.eclipse.cdt.internal.core.index.IDocument, org.eclipse.cdt.internal.core.index.IIndexerOutput)
*/
public void index(IDocument document, IIndexerOutput output) throws IOException {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#addRequest(org.eclipse.cdt.core.model.ICElement, org.eclipse.core.resources.IResourceDelta, org.eclipse.core.resources.IResourceChangeEvent)
*/
public void addRequest(ICElement element, IResourceDelta delta) {
switch (element.getElementType()) {
case ICElement.C_PROJECT :
this.indexAll(element.getCProject().getProject());
break;
case ICElement.C_CCONTAINER:
this.indexSourceFolder(element.getCProject().getProject(),element.getPath(),null);
break;
case ICElement.C_UNIT:
IFile file = (IFile) delta.getResource();
IProject filesProject = file.getProject();
this.addSource(file, filesProject.getFullPath());
break;
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#removeRequest(org.eclipse.cdt.core.model.ICElement, org.eclipse.core.resources.IResourceDelta, org.eclipse.core.resources.IResourceChangeEvent)
*/
public void removeRequest(ICElement element, IResourceDelta delta) {
switch (element.getElementType()) {
case ICElement.C_PROJECT :
IPath fullPath = element.getCProject().getProject().getFullPath();
if( delta.getKind() == IResourceDelta.CHANGED )
indexManager.discardJobs(fullPath.segment(0));
indexStorage.removeIndexFamily(fullPath);
// NB: Discarding index jobs belonging to this project was done during PRE_DELETE
break;
// NB: Update of index if project is opened, closed, or its c nature is added or removed
// is done in updateCurrentDeltaAndIndex
case ICElement.C_CCONTAINER:
this.removeSourceFolderFromIndex(element.getCProject().getProject(),element.getPath(),null);
break;
case ICElement.C_UNIT:
IFile file = (IFile) delta.getResource();
this.remove(file.getFullPath().toString(), file.getProject().getFullPath());
break;
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#indexJobFinishedNotification(org.eclipse.cdt.internal.core.search.processing.IIndexJob)
*/
public void indexJobFinishedNotification(IIndexJob job) {
((CIndexStorage)indexStorage).setNeedToSave(true);
if (job instanceof AddCompilationUnitToIndex){
AddCompilationUnitToIndex tempJob = (AddCompilationUnitToIndex) job;
jobSet.remove(tempJob.getResource().getLocation());
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.index2.IIndexer#shutdown()
*/
public void shutdown() {
indexStorage.shutdown();
//indexModelListener.shutdown();
}
/**
* Forward job request to Index Manager
* @param cleanHeaders
*/
public void request(IIndexJob indexJob) {
this.indexManager.request(indexJob);
}
public ReadWriteMonitor getStorageMonitor() {
return storageMonitor;
}
/**
*
*/
public void resetEncounteredHeaders() {
try{
storageMonitor.enterWrite();
indexStorage.resetEncounteredHeaders();
}
finally {
storageMonitor.exitWrite();
}
}
/**
* @param path
* @param reuseIndexFile
* @param createIfMissing
* @return
*/
public synchronized IIndex getIndex(IPath path, boolean reuseExistingFile, boolean createIfMissing) {
IIndex index = null;
try{
storageMonitor.enterRead();
index = indexStorage.getIndex(path,reuseExistingFile, createIfMissing);
}
finally{
storageMonitor.exitRead();
}
return index;
}
/**
* @param index
* @return
*/
public ReadWriteMonitor getMonitorFor(IIndex index) {
ReadWriteMonitor monitor = null;
try{
storageMonitor.enterRead();
monitor=indexStorage.getMonitorFor(index);
}
finally{
storageMonitor.exitRead();
}
return monitor;
}
/**
* @param path
*/
public void removeIndex(IPath path) {
try{
storageMonitor.enterWrite();
indexStorage.removeIndex(path);
}
finally{
storageMonitor.exitWrite();
}
}
/**
* @param path
*/
public void jobWasCancelled(IPath path) {
try{
storageMonitor.enterWrite();
indexStorage.jobWasCancelled(path);
}
finally{
storageMonitor.exitWrite();
}
}
/**
* @param index
*/
public void saveIndex(IIndex index) throws IOException {
try{
storageMonitor.enterWrite();
indexStorage.saveIndex(index);
}
finally {
storageMonitor.exitWrite();
}
}
/**
* @param indexPath
* @param indexState
*/
public void aboutToUpdateIndex(IPath indexPath, Integer indexState) {
try{
//storageMonitor.enterWrite();
indexStorage.aboutToUpdateIndex(indexPath, indexState);
}
finally {
//storageMonitor.exitWrite();
}
}
}

View file

@ -9,7 +9,7 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
/**
* @author bgheorgh
@ -31,7 +31,6 @@ import org.eclipse.cdt.core.parser.IParser;
import org.eclipse.cdt.core.parser.IProblem;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ParserTimeOut;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ast.IASTASMDefinition;
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
@ -72,6 +71,9 @@ import org.eclipse.cdt.core.parser.ast.IASTVariableReference;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.index.impl.IFileDocument;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.search.indexing.IIndexConstants;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.IndexProblemHandler;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
@ -94,7 +96,7 @@ import org.eclipse.core.runtime.jobs.Job;
*/
public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexConstants {
SourceIndexer indexer;
SourceIndexerRunner indexer;
IFile resourceFile;
char[] packageName;
@ -109,7 +111,6 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
private Map problemsMap = null;
private IProgressMonitor pm = new NullProgressMonitor();
private ParserTimeOut timeoutThread = null;
private static final String INDEXER_MARKER_ORIGINATOR = ICModelMarker.INDEXER_MARKER + ".originator"; //$NON-NLS-1$
private static final String INDEXER_MARKER_PREFIX = Util.bind("indexerMarker.prefix" ) + " "; //$NON-NLS-1$ //$NON-NLS-2$
@ -118,11 +119,10 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
private ArrayList filesTraversed = null;
private IParser parser;
public SourceIndexerRequestor(SourceIndexer indexer, IFile resourceFile, ParserTimeOut timeOut) {
public SourceIndexerRequestor(SourceIndexerRunner indexer, IFile resourceFile) {
super();
this.indexer = indexer;
this.resourceFile = resourceFile;
this.timeoutThread = timeOut;
this.filesTraversed = new ArrayList(15);
this.filesTraversed.add(resourceFile.getLocation().toOSString());
}
@ -236,7 +236,7 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
/* See if this file has been encountered before */
if (type.isHeader())
CCorePlugin.getDefault().getCoreModel().getIndexManager().haveEncounteredHeader(resourceProject.getFullPath(),new Path(inclusion.getFullFileName()));
indexer.haveEncounteredHeader(resourceProject.getFullPath(),new Path(inclusion.getFullFileName()));
}
@ -314,7 +314,7 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
//file number for the current file (if it has one). If the current file does not
//have a file number, we need to add it to the index.
IFile tempFile = CCorePlugin.getWorkspace().getRoot().getFileForLocation(new Path(include.getFullFileName()));
String filePath = "";
String filePath = ""; //$NON-NLS-1$
if (tempFile != null){
//File is local to workspace
filePath = tempFile.getFullPath().toString();
@ -578,56 +578,6 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
}
}
public void setParser( IParser parser )
{
this.parser = parser;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.ui.text.contentassist.ITimeoutThreadOwner#setTimeout(int)
*/
public void setTimeout(int timeout) {
timeoutThread.setTimeout(timeout);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.ui.text.contentassist.ITimeoutThreadOwner#startTimer()
*/
public void startTimer() {
createProgressMonitor(parser);
while (!timeoutThread.isReadyToRun()){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
timeoutThread.startTimer();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.ui.text.contentassist.ITimeoutThreadOwner#stopTimer()
*/
public void stopTimer() {
timeoutThread.stopTimer();
pm.setCanceled(false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ISourceElementRequestor#parserTimeout()
*/
public boolean parserTimeout() {
if ((pm != null) && (pm.isCanceled()))
return true;
return false;
}
/*
* Creates a new progress monitor with each start timer
*/
private void createProgressMonitor( IParser parser ) {
pm.setCanceled(false);
timeoutThread.setParser(parser);
}
public boolean areProblemMarkersEnabled(){
return problemMarkersEnabled != 0;
}
@ -682,9 +632,9 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo
if( problem.getSourceLineNumber() == -1 )
return false;
boolean preprocessor = ( problemMarkersEnabled & IndexManager.PREPROCESSOR_PROBLEMS_BIT ) != 0;
boolean semantics = ( problemMarkersEnabled & IndexManager.SEMANTIC_PROBLEMS_BIT ) != 0;
boolean syntax = ( problemMarkersEnabled & IndexManager.SYNTACTIC_PROBLEMS_BIT ) != 0;
boolean preprocessor = ( problemMarkersEnabled & SourceIndexer.PREPROCESSOR_PROBLEMS_BIT ) != 0;
boolean semantics = ( problemMarkersEnabled & SourceIndexer.SEMANTIC_PROBLEMS_BIT ) != 0;
boolean syntax = ( problemMarkersEnabled & SourceIndexer.SYNTACTIC_PROBLEMS_BIT ) != 0;
if( problem.checkCategory( IProblem.PREPROCESSOR_RELATED ) || problem.checkCategory( IProblem.SCANNER_RELATED ) )
return preprocessor && problem.getID() != IProblem.PREPROCESSOR_CIRCULAR_INCLUSION;

View file

@ -9,7 +9,7 @@
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
package org.eclipse.cdt.internal.core.index.sourceindexer;
/**
* @author bgheorgh
@ -27,12 +27,10 @@ import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IParser;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.parser.ParseError;
import org.eclipse.cdt.core.parser.ParserFactory;
import org.eclipse.cdt.core.parser.ParserFactoryError;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ParserTimeOut;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.index.IDocument;
@ -40,6 +38,8 @@ import org.eclipse.cdt.internal.core.index.impl.IndexDelta;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
/**
* A SourceIndexer indexes source files using the parser. The following items are indexed:
@ -52,36 +52,27 @@ import org.eclipse.core.runtime.CoreException;
* - Structs
* - Unions
*/
public class SourceIndexer extends AbstractIndexer {
public class SourceIndexerRunner extends AbstractIndexer {
//TODO: Indexer, add additional file types
//Header files: "h" , "hh", "hpp"
//Use the CModelManager defined file types
//public static final String[] FILE_TYPES= new String[] {"cpp","c", "cc", "cxx"}; //$NON-NLS-1$
//protected DefaultProblemFactory problemFactory= new DefaultProblemFactory(Locale.getDefault());
public static final String CDT_INDEXER_TIMEOUT= "CDT_INDEXER_TIMEOUT"; //$NON-NLS-1$
IFile resourceFile;
ParserTimeOut timeOut = null;
private SourceIndexer indexer;
/**
* @param resource
* @param out
*/
public SourceIndexer(IFile resource, ParserTimeOut timeOut) {
public SourceIndexerRunner(IFile resource, SourceIndexer indexer) {
this.indexer = indexer;
this.resourceFile = resource;
this.timeOut = timeOut;
}
protected void indexFile(IDocument document) throws IOException {
// Add the name of the file to the index
output.addDocument(document);
// Create a new Parser
SourceIndexerRequestor requestor = new SourceIndexerRequestor(this, resourceFile, timeOut);
// Create a new Parser
SourceIndexerRequestor requestor = new SourceIndexerRequestor(this, resourceFile);
IndexManager manager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
int problems = manager.indexProblemsEnabled( resourceFile.getProject() );
int problems = indexer.indexProblemsEnabled( resourceFile.getProject() );
requestor.setProblemMarkersEnabled( problems );
requestor.requestRemoveMarkers( resourceFile, null );
@ -108,7 +99,6 @@ public class SourceIndexer extends AbstractIndexer {
parser = ParserFactory.createParser(
ParserFactory.createScanner(reader, scanInfo, ParserMode.COMPLETE_PARSE, language, requestor, ParserUtil.getScannerLogService(), null ),
requestor, ParserMode.COMPLETE_PARSE, language, ParserUtil.getParserLogService() );
requestor.setParser(parser);
} catch( ParserFactoryError pfe ){
} catch (CoreException e) {
} finally {
@ -118,14 +108,6 @@ public class SourceIndexer extends AbstractIndexer {
}
try{
// start timer
String timeOut = CCorePlugin.getDefault().getPluginPreferences().getString(CDT_INDEXER_TIMEOUT);
Integer timeOutValue = new Integer(timeOut);
if (timeOutValue.intValue() > 0) {
requestor.setTimeout(timeOutValue.intValue());
requestor.startTimer();
}
boolean retVal = parser.parse();
if (AbstractIndexer.VERBOSE){
@ -140,23 +122,19 @@ public class SourceIndexer extends AbstractIndexer {
org.eclipse.cdt.internal.core.model.Util.log(null, "Out Of Memory error: " + vmErr.getMessage() + " on File: " + resourceFile.getName(), ICLogConstants.CDT); //$NON-NLS-1$ //$NON-NLS-2$
}
}
catch (ParseError e){
org.eclipse.cdt.internal.core.model.Util.log(null, "Parser Timeout on File: " + resourceFile.getName(), ICLogConstants.CDT); //$NON-NLS-1$ //$NON-NLS-2$
}
catch ( Exception ex ){
if (ex instanceof IOException)
throw (IOException) ex;
}
finally{
requestor.stopTimer();
//if the user disable problem reporting since we last checked, don't report the collected problems
if( manager.indexProblemsEnabled( resourceFile.getProject() ) != 0 )
if( indexer.indexProblemsEnabled( resourceFile.getProject() ) != 0 )
requestor.reportProblems();
//Report events
ArrayList filesTrav = requestor.getFilesTraversed();
IndexDelta indexDelta = new IndexDelta(resourceFile.getProject(),filesTrav, IIndexDelta.INDEX_FINISHED_DELTA);
CCorePlugin.getDefault().getCoreModel().getIndexManager().notifyListeners(indexDelta);
indexer.notifyListeners(indexDelta);
//Release all resources
parser=null;
currentProject = null;
@ -165,16 +143,19 @@ public class SourceIndexer extends AbstractIndexer {
scanInfo=null;
}
}
/**
* Sets the document types the <code>IIndexer</code> handles.
*/
public void setFileTypes(String[] fileTypes){}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer#getResourceFile()
*/
public IFile getResourceFile() {
return resourceFile;
}
/**
* @param fullPath
* @param path
*/
public boolean haveEncounteredHeader(IPath fullPath, Path path) {
return indexer.haveEncounteredHeader(fullPath, path);
}
}

View file

@ -10,12 +10,14 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.search.indexing;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ElementChangedEvent;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.model.SourceRoot;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@ -54,6 +56,13 @@ public class IndexerModelListener implements IElementChangedListener {
int kind= delta.getKind();
int flags= delta.getFlags();
ICElement element= delta.getElement();
IProject project = element.getCProject().getProject();
ICDTIndexer indexer = indexManager.getIndexerForProject(project);
if (!(indexer instanceof SourceIndexer))
return;
SourceIndexer sourceIndexer = (SourceIndexer) indexer;
switch(kind){
case ICElementDelta.CHANGED:
@ -69,27 +78,27 @@ public class IndexerModelListener implements IElementChangedListener {
switch(tempResource.getType())
{
case IResource.FILE:
indexManager.addSource((IFile) tempResource,tempResource.getProject().getFullPath());
sourceIndexer.addSource((IFile) tempResource,tempResource.getProject().getFullPath());
break;
case IResource.FOLDER:
tempRootElement = (SourceRoot) getElementSource(element);
if (tempRootElement != null){
IProject theProj = tempResource.getProject();
indexManager.indexSourceFolder(theProj,tempResource.getFullPath(),tempRootElement.getSourceEntry().fullExclusionPatternChars());
sourceIndexer.indexSourceFolder(theProj,tempResource.getFullPath(),tempRootElement.getSourceEntry().fullExclusionPatternChars());
}
break;
case IResource.PROJECT:
indexManager.indexAll(tempResource.getProject());
sourceIndexer.indexAll(tempResource.getProject());
break;
}
} else if( (flags & ICElementDelta.F_REMOVED_PATHENTRY_SOURCE) != 0 ){
IResource tempResource = element.getResource();
IProject project = tempResource.getProject();
if( indexManager.indexProblemsEnabled(project) != 0 ){
indexManager.removeIndexerProblems( tempResource );
IProject tempProject = tempResource.getProject();
if( sourceIndexer.indexProblemsEnabled(tempProject) != 0 ){
sourceIndexer.removeIndexerProblems( tempResource );
}
}
break;

View file

@ -40,6 +40,7 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
public class CoreModel {
@ -986,4 +987,6 @@ public class CoreModel {
public IndexManager getIndexManager() {
return manager.getIndexManager();
}
}

View file

@ -1113,6 +1113,7 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
public IndexManager getIndexManager() {
return this.fDeltaProcessor.indexManager;
}
public void deleting(IProject project) {
// discard all indexing jobs for this project

View file

@ -5,7 +5,6 @@ package org.eclipse.cdt.internal.core.model;
* All Rights Reserved.
*/
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IArchive;
@ -17,7 +16,6 @@ import org.eclipse.cdt.core.model.ICElementDelta;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
@ -38,7 +36,7 @@ public class DeltaProcessor {
protected CElementDelta fCurrentDelta;
protected IndexManager indexManager = new IndexManager();
/* The C element that was last created (see createElement(IResource).
* This is used as a stack of C elements (using getParent() to pop it, and
* using the various get*(...) to push it. */
@ -606,22 +604,8 @@ public class DeltaProcessor {
if (indexManager == null)
return;
switch (element.getElementType()) {
case ICElement.C_PROJECT :
this.indexManager.indexAll(element.getCProject().getProject());
break;
case ICElement.C_CCONTAINER:
indexManager.indexSourceFolder(element.getCProject().getProject(),element.getPath(),null);
break;
case ICElement.C_UNIT:
IFile file = (IFile) delta.getResource();
IProject filesProject = file.getProject();
indexManager.addSource(file, filesProject.getFullPath());
break;
}
indexManager.addResourceEvent(element.getCProject().getProject(),element,delta);
}
@ -630,40 +614,22 @@ public class DeltaProcessor {
if (indexManager == null)
return;
switch (element.getElementType()) {
case ICElement.C_PROJECT :
IPath fullPath = element.getCProject().getProject().getFullPath();
if( delta.getKind() == IResourceDelta.CHANGED )
indexManager.discardJobs(fullPath.segment(0));
indexManager.removeIndexFamily(fullPath);
// NB: Discarding index jobs belonging to this project was done during PRE_DELETE
break;
// NB: Update of index if project is opened, closed, or its c nature is added or removed
// is done in updateCurrentDeltaAndIndex
case ICElement.C_CCONTAINER:
indexManager.removeSourceFolderFromIndex(element.getCProject().getProject(),element.getPath(),null);
break;
case ICElement.C_UNIT:
IFile file = (IFile) delta.getResource();
indexManager.remove(file.getFullPath().toString(), file.getProject().getFullPath());
break;
}
indexManager.removeResourceEvent(element.getCProject().getProject(),element,delta);
}
private void updateDependencies(ICElement element){
IResource resource = element.getResource();
if (resource == null)
return;
IProject project = resource.getProject();
String filename = resource.getName();
if (CoreModel.isValidHeaderUnitName(resource.getProject(), filename)) {
indexManager.updateDependencies(resource);
if (CoreModel.isValidHeaderUnitName(project, filename)) {
indexManager.updateDependencies(project, resource);
}
}

View file

@ -61,7 +61,7 @@
<!-- =================================================================================== -->
<extension-point id="PathEntryContainerInitializer" name="%PathEntryContainerInitializer" schema="schema/PathEntryContainerInitializer.exsd"/>
<extension-point id="CodeFormatter" name="%CodeFormatter.name" schema="schema/CodeFormatter.exsd"/>
<extension-point id="CIndexer" name="C/C++ Indexer" schema="schema/CIndexer.exsd"/>
<!-- =================================================================================== -->
<!-- Define the list of the Binary Parser provided by the CDT -->
<!-- =================================================================================== -->
@ -527,5 +527,20 @@
<extension point="org.eclipse.core.runtime.preferences">
<initializer class="org.eclipse.cdt.internal.core.CCorePreferenceInitializer"/>
</extension>
<extension
point="org.eclipse.cdt.core.CIndexer">
<indexer
indexStorageID="org.eclipse.cdt.core.cindexstorage"
class="org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer"
name="Original C/C++ Indexer"
id="org.eclipse.cdt.core.originalsourceindexer">
</indexer>
</extension>
<extension
point="org.eclipse.core.runtime.applications">
<application>
<run class="org.eclipse.cdt.core.index2.IndexRunner"/>
</application>
</extension>
</plugin>

View file

@ -0,0 +1,119 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core" id="CDTIndexer" name="CDT Indexer"/>
</appInfo>
<documentation>
This extension point is used to contribute a new Indexer to the CDT. This indexer can choose to receive event notification from the index manager.
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="indexer"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="indexer">
<complexType>
<sequence>
<element ref="indexer" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique name for this indexer
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string" use="required">
<annotation>
<documentation>
a name that will be used for this indexer in the UI
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
the class that implements &lt;code&gt;org.eclipse.cdt.core.index2.IIndexer&lt;/code&gt;
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.core.index2.IIndexer"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="since"/>
</appInfo>
<documentation>
CDT 3.0
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
Plug-ins that want to extend this extension point must implement &lt;samp&gt;org.eclipse.cdt.core.index.IIndexer&lt;/samp&gt; interface.
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -1,3 +1,6 @@
2005-03-12 Bogdan Gheorghe
Updated search to work with new index framework
2004-11-02 Bogdan Gheorghe
Partial Fix for 74427: Indexer needs to store more info

View file

@ -187,17 +187,17 @@ public interface ICSearchConstants {
* has not finished indexing the workspace. Results will more likely
* not contain all the matches.
*/
int FORCE_IMMEDIATE_SEARCH = IJob.ForceImmediate;
int FORCE_IMMEDIATE_SEARCH = IIndexJob.ForceImmediate;
/**
* The search operation throws an <code>org.eclipse.core.runtime.OperationCanceledException</code>
* if the underlying indexer has not finished indexing the workspace.
*/
int CANCEL_IF_NOT_READY_TO_SEARCH = IJob.CancelIfNotReady;
int CANCEL_IF_NOT_READY_TO_SEARCH = IIndexJob.CancelIfNotReady;
/**
* The search operation waits for the underlying indexer to finish indexing
* the workspace before starting the search.
*/
int WAIT_UNTIL_READY_TO_SEARCH = IJob.WaitUntilReady;
int WAIT_UNTIL_READY_TO_SEARCH = IIndexJob.WaitUntilReady;
public static final String EXTERNAL_SEARCH_LINK_PREFIX = "cdtlnk"; //$NON-NLS-1$

View file

@ -12,11 +12,13 @@ package org.eclipse.cdt.internal.core.search;
import java.util.ArrayList;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
@ -89,7 +91,17 @@ public class IndexSelector {
int count = 0;
for (int i = 0; i < length; i++){
// may trigger some index recreation work
IIndex index = indexManager.getIndex(indexKeys[i], true /*reuse index file*/, false /*do not create if none*/);
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
ICDTIndexer indexer = indexManager.getIndexerForProject( root.getProject(indexKeys[i].toOSString()));
IIndex index = null;
if (indexer != null){
if (indexer instanceof SourceIndexer){
SourceIndexer sourceIndexer = (SourceIndexer) indexer;
index =sourceIndexer.getIndex(indexKeys[i], true /*reuse index file*/, false /*do not create if none*/);
}
}
if (index != null) indexes[count++] = index; // only consider indexes which are ready yet
}
if (count != length) {

View file

@ -15,19 +15,22 @@ package org.eclipse.cdt.internal.core.search;
import java.io.IOException;
import org.eclipse.cdt.core.index.ICDTIndexer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.impl.Index;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.ReadWriteMonitor;
import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
import org.eclipse.cdt.internal.core.search.processing.IJob;
import org.eclipse.cdt.internal.core.search.processing.IIndexJob;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
public class PatternSearchJob implements IJob {
public class PatternSearchJob implements IIndexJob {
protected CSearchPattern pattern;
@ -129,7 +132,17 @@ public class PatternSearchJob implements IJob {
if (index == null)
return COMPLETE;
ReadWriteMonitor monitor = indexManager.getMonitorFor(index);
if (!(index instanceof Index))
return FAILED;
ICDTIndexer indexer =((Index) index).getIndexer();
if (!(indexer instanceof SourceIndexer))
return FAILED;
SourceIndexer sourceIndexer = (SourceIndexer) indexer;
ReadWriteMonitor monitor = sourceIndexer.getMonitorFor(index);
if (monitor == null)
return COMPLETE; // index got deleted since acquired
try {
@ -140,7 +153,7 @@ public class PatternSearchJob implements IJob {
try {
monitor.exitRead(); // free read lock
monitor.enterWrite(); // ask permission to write
this.indexManager.saveIndex(index);
sourceIndexer.saveIndex(index);
} catch (IOException e) {
return FAILED;
} finally {

View file

@ -28,8 +28,8 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
/**

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
/**
* @author bgheorgh

View file

@ -29,8 +29,8 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
/**

View file

@ -22,7 +22,7 @@ import java.util.Iterator;
import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
/**
* @author bgheorgh

View file

@ -19,8 +19,8 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
/**
* @author bgheorgh

View file

@ -23,8 +23,8 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
/**
* @author aniefer

View file

@ -25,8 +25,8 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
/**
* @author aniefer

View file

@ -22,8 +22,8 @@ import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.impl.IndexInput;
import org.eclipse.cdt.internal.core.index.impl.IndexedFile;
import org.eclipse.cdt.internal.core.index.sourceindexer.AbstractIndexer;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.cdt.internal.core.search.indexing.AbstractIndexer;
/**
* @author aniefer

View file

@ -13,12 +13,9 @@
*/
package org.eclipse.cdt.internal.core.search.processing;
/**
* @author bgheorgh
*/
import org.eclipse.core.runtime.IProgressMonitor;
public interface IJob {
public interface IIndexJob {
/* Waiting policies */
int ForceImmediate = 1;
@ -30,20 +27,20 @@ public interface IJob {
boolean COMPLETE = true;
/**
* True if job belongs to the passed in jobFamily
* True if index job belongs to the passed in jobFamily
*/
public boolean belongsTo(String jobFamily);
/**
* Asks this job to cancel its execution. The cancellation
* Asks this index job to cancel its execution. The cancellation
* can take an undertermined amount of time.
*/
public void cancel();
/**
* Execute the current job, answer whether it was successful.
* Execute the current index job, answer whether it was successful.
*/
public boolean execute(IProgressMonitor progress);
/**
* Answer whether the job is ready to run.
* Answer whether the index job is ready to run.
*/
public boolean isReadyToRun();

View file

@ -13,11 +13,9 @@
*/
package org.eclipse.cdt.internal.core.search.processing;
import java.util.HashSet;
import org.eclipse.cdt.core.ICLogConstants;
import org.eclipse.cdt.internal.core.Util;
import org.eclipse.cdt.internal.core.search.indexing.IndexRequest;
import org.eclipse.cdt.internal.core.index.sourceindexer.IndexRequest;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
@ -27,7 +25,7 @@ import org.eclipse.core.runtime.SubProgressMonitor;
public abstract class JobManager implements Runnable {
/* queue of jobs to execute */
protected IJob[] awaitingJobs = new IJob[10];
protected IIndexJob[] awaitingJobs = new IIndexJob[10];
protected int jobStart = 0;
protected int jobEnd = -1;
protected boolean executing = false;
@ -47,8 +45,6 @@ public abstract class JobManager implements Runnable {
private int awaitingClients = 0;
protected HashSet jobSet;
protected IndexingJob indexJob = null;
static private final IStatus OK_STATUS = new Status( IStatus.OK, "org.eclipse.cdt.core", IStatus.OK, "", null ); //$NON-NLS-1$//$NON-NLS-2$
@ -87,7 +83,7 @@ public abstract class JobManager implements Runnable {
* Answers the first job in the queue, or null if there is no job available
* Until the job has completed, the job manager will keep answering the same job.
*/
public synchronized IJob currentJob() {
public synchronized IIndexJob currentJob() {
if ( enabled != ENABLED )
return null;
@ -114,7 +110,7 @@ public abstract class JobManager implements Runnable {
int oldEnabledState = 0;
try {
IJob currentJob;
IIndexJob currentJob;
// cancel current job if it belongs to the given family
synchronized(this){
currentJob = this.currentJob();
@ -208,7 +204,7 @@ public abstract class JobManager implements Runnable {
}
if( indexJob != null ){
String progressString = null;
IJob job = currentJob();
IIndexJob job = currentJob();
if( job instanceof IndexRequest ){
progressString = " ("; //$NON-NLS-1$
progressString += job.toString();
@ -241,23 +237,23 @@ public abstract class JobManager implements Runnable {
*
*/
public boolean performConcurrentJob(
IJob searchJob,
IIndexJob searchJob,
int waitingPolicy,
IProgressMonitor progress,
IJob jobToIgnore) {
IIndexJob jobToIgnore) {
if (VERBOSE)
JobManager.verbose("STARTING concurrent job - " + searchJob); //$NON-NLS-1$
if (!searchJob.isReadyToRun()) {
if (VERBOSE)
JobManager.verbose("ABORTED concurrent job - " + searchJob); //$NON-NLS-1$
return IJob.FAILED;
return IIndexJob.FAILED;
}
int concurrentJobWork = 100;
if (progress != null)
progress.beginTask("", concurrentJobWork); //$NON-NLS-1$
boolean status = IJob.FAILED;
boolean status = IIndexJob.FAILED;
if (awaitingJobsCount() > 0) {
if( enabledState() == WAITING ){
//the indexer is paused, resume now that we have been asked for something
@ -268,7 +264,7 @@ public abstract class JobManager implements Runnable {
attemptPolicy = false;
switch (waitingPolicy) {
case IJob.ForceImmediate :
case IIndexJob.ForceImmediate :
if (VERBOSE)
JobManager.verbose("-> NOT READY - forcing immediate - " + searchJob);//$NON-NLS-1$
boolean wasEnabled = ( enabledState() == ENABLED );
@ -284,7 +280,7 @@ public abstract class JobManager implements Runnable {
JobManager.verbose("FINISHED concurrent job - " + searchJob); //$NON-NLS-1$
return status;
case IJob.CancelIfNotReady :
case IIndexJob.CancelIfNotReady :
if (VERBOSE)
JobManager.verbose("-> NOT READY - cancelling - " + searchJob); //$NON-NLS-1$
if (progress != null) progress.setCanceled(true);
@ -292,10 +288,10 @@ public abstract class JobManager implements Runnable {
JobManager.verbose("CANCELED concurrent job - " + searchJob); //$NON-NLS-1$
throw new OperationCanceledException();
case IJob.WaitUntilReady :
case IIndexJob.WaitUntilReady :
int awaitingWork;
IJob previousJob = null;
IJob currentJob;
IIndexJob previousJob = null;
IIndexJob currentJob;
IProgressMonitor subProgress = null;
int totalWork = this.awaitingJobsCount();
if (progress != null && totalWork > 0) {
@ -333,7 +329,7 @@ public abstract class JobManager implements Runnable {
if( enabledState() == WAITING ){
//user canceled the index we are waiting on, force immediate
waitingPolicy = IJob.ForceImmediate;
waitingPolicy = IIndexJob.ForceImmediate;
attemptPolicy = true;
continue policy;
}
@ -372,7 +368,7 @@ public abstract class JobManager implements Runnable {
* @param jobToIgnore
* @return
*/
private boolean jobShouldBeIgnored(IJob jobToIgnore) {
private boolean jobShouldBeIgnored(IIndexJob jobToIgnore) {
if (jobToIgnore == null)
return false;
@ -384,7 +380,7 @@ public abstract class JobManager implements Runnable {
public abstract String processName();
public synchronized void request(IJob job) {
public synchronized void request(IIndexJob job) {
if (!job.isReadyToRun()) {
if (VERBOSE)
JobManager.verbose("ABORTED request of background job - " + job); //$NON-NLS-1$
@ -398,7 +394,7 @@ public abstract class JobManager implements Runnable {
System.arraycopy(
awaitingJobs,
jobStart,
(awaitingJobs = new IJob[size * 2]),
(awaitingJobs = new IIndexJob[size * 2]),
0,
jobEnd);
jobStart = 0;
@ -435,11 +431,10 @@ public abstract class JobManager implements Runnable {
thread = new Thread(this, this.processName());
thread.setDaemon(true);
// less prioritary by default, priority is raised if clients are actively waiting on it
thread.setPriority(Thread.NORM_PRIORITY-1);
thread.setPriority(Thread.MIN_PRIORITY);
thread.start();
}
jobSet = new HashSet();
}
/**
@ -452,7 +447,7 @@ public abstract class JobManager implements Runnable {
try {
while (this.thread != null) {
try {
IJob job;
IIndexJob job;
if ((job = currentJob()) == null) {
if (idlingStart < 0)
idlingStart = System.currentTimeMillis();
@ -548,6 +543,6 @@ public abstract class JobManager implements Runnable {
return buffer.toString();
}
protected abstract void jobFinishedNotification(IJob job);
protected abstract void jobFinishedNotification(IIndexJob job);
}

View file

@ -31,13 +31,13 @@ import org.eclipse.cdt.core.search.SearchEngine;
import org.eclipse.cdt.internal.core.CDTLogWriter;
import org.eclipse.cdt.internal.core.CDescriptorManager;
import org.eclipse.cdt.internal.core.PathEntryVariableManager;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexerRunner;
import org.eclipse.cdt.internal.core.model.BufferManager;
import org.eclipse.cdt.internal.core.model.CModelManager;
import org.eclipse.cdt.internal.core.model.DeltaProcessor;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.cdt.internal.core.model.Util;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.search.indexing.SourceIndexer;
import org.eclipse.cdt.internal.core.search.matching.MatchLocator;
import org.eclipse.cdt.internal.core.search.processing.JobManager;
import org.eclipse.core.resources.IProject;
@ -889,7 +889,7 @@ public class CCorePlugin extends Plugin {
} //$NON-NLS-1$
option = Platform.getDebugOption(INDEXER);
if(option != null) SourceIndexer.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
if(option != null) SourceIndexerRunner.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$
option = Platform.getDebugOption(SEARCH);
if(option != null) SearchEngine.VERBOSE = option.equalsIgnoreCase("true") ; //$NON-NLS-1$

View file

@ -1,3 +1,6 @@
2005-03-13 Bogdan Gheorghe
Updated references to IndexManager to reflect new indexing framework.
2005-02-03 Tanya Wolff
Fixed some content assist regression tests.
Added Regression tests (content assist, refactoring) to automated suite for nightly builds

View file

@ -100,8 +100,7 @@ public abstract class CompletionProposalsBaseTest extends TestCase{
}
// use the new indexer
IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
indexManager.reset();
//IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
}
private static void addNatureToProject(IProject proj, String natureId, IProgressMonitor monitor) throws CoreException {

View file

@ -30,7 +30,7 @@ import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.FileManager;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.ui.CHelpProviderManager;
import org.eclipse.cdt.internal.ui.text.CHelpBookDescriptor;
import org.eclipse.cdt.internal.ui.text.contentassist.CCompletionProcessor;
@ -65,7 +65,7 @@ public class ContentAssistTests extends TestCase {
cPrj = CProjectHelper.createCCProject("ContentAssistTestProject", "bin"); //$NON-NLS-1$ //$NON-NLS-2$
project = cPrj.getProject();
project.setSessionProperty(IndexManager.activationKey,new Boolean(false));
project.setSessionProperty(SourceIndexer.activationKey,new Boolean(false));
} catch ( CoreException e ) {
/*boo*/
}

View file

@ -1,3 +1,14 @@
2005-03-13 Bogdan Gheorghe
New UI items to support index framework
* src/org/eclipse/cdt/internal/ui/CPluginResources
* src/org/eclipse/cdt/ui/CUIPreferenceInitializer.java
* src/org/eclipse/cdt/internal/ui/dialogs/IndexerBlock.java
* src/org/eclipse/cdt/internal/ui/dialogs/IndexerOptionPropertyPage.java
* src/org/eclipse/cdt/internal/ui/dialogs/SourceIndexerBlock.java
* src/org/eclipse/cdt/ui/index/AbstractIndexerPage
* plugin.xml
2005-03-12 Alain Magloire
Plan item 79518: for PathEntry variable manager. Enable.
* src/org/eclipse/cdt/internal/ui/preferences/PathEntryVariablesGroup.java

View file

@ -44,6 +44,7 @@
<!-- Purpose: Provide a perspective specific text hovering for CEditor files -->
<!-- =========================================================================== -->
<extension-point id="textHovers" name="%textHoversName"/>
<extension-point id="IndexerPage" name="Indexer Page" schema="schema/IndexerPage.exsd"/>
<extension-point id="completionContributors" name="%completionContributors" schema="schema/completionContributors.exsd"/>
<extension
@ -616,11 +617,6 @@
class="org.eclipse.cdt.internal.ui.preferences.CFileTypesPreferencePage"
id="org.eclipse.cdt.ui.preferences.CFileTypesPreferences">
</page>
<page
class="org.eclipse.cdt.internal.ui.preferences.CSearchPreferencePage"
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
name="%CDTSearch.name"
id="org.eclipse.cdt.ui.preferences.CSearchPreferencePage"/>
<page
name="%appearancePrefName"
category="org.eclipse.cdt.ui.preferences.CPluginPreferencePage"
@ -1324,13 +1320,20 @@
file="templates/default-templates.xml">
</include>
</extension>
<extension
point="org.eclipse.cdt.ui.IndexerPage">
<indexerUI
class="org.eclipse.cdt.ui.dialogs.SourceIndexerBlock"
indexerID="org.eclipse.cdt.core.originalsourceindexer"
name="Original C/C++ Indexer"
id="org.eclipse.cdt.ui.originalSourceIndexerUI"/>
</extension>
<extension
point="org.eclipse.cdt.ui.completionContributors">
<contributor
class="org.eclipse.cdt.internal.ui.text.contentassist.DOMCompletionContributor"
id="DOM"
priority="1"/>
</extension>
</extension>
</plugin>

View file

@ -0,0 +1,123 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.ui">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.ui" id="IndexerPage" name="Indexer Page"/>
</appInfo>
<documentation>
[Enter description of this extension point.]
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="indexerUI" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="indexerUI">
<complexType>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
a unique id for this indexer page
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string" use="required">
<annotation>
<documentation>
a UI name for this page to be used in the UI
</documentation>
</annotation>
</attribute>
<attribute name="indexerID" type="string" use="required">
<annotation>
<documentation>
the unique id of the indexer that this UI is associated with
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
the class that implements &lt;code&gt;org.eclipse.cdt.ui.index2.AbstractIndexerPage&lt;/code&gt;
</documentation>
<appInfo>
<meta.attribute kind="java"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="since"/>
</appInfo>
<documentation>
[Enter the first release in which this extension point appears.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
[Enter API information here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -38,8 +38,9 @@ ErrorParserBlock.desc=Set the error parsers for this project
BinaryParserBlock.label=Binary Parser
BinaryParserBlock.desc=Set required binary parser for this project
IndexerBlock.label=C/C++ Indexer
IndexerBlock.desc=C/C++ Indexer setting for this project.
BaseIndexerBlock.label=C/C++ Indexer
BaseIndexerBlock.desc=C/C++ Indexer setting for this project.
BaseIndexerBlock.comboLabel=Available indexers
ReferenceBlock.label= Projects
ReferenceBlock.desc= Referenced C/C++ Projects

View file

@ -1,191 +0,0 @@
/**********************************************************************
Copyright (c) 2002, 2004 IBM Rational Software and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
Contributors:
IBM Rational Software - Initial Contribution
**********************************************************************/
package org.eclipse.cdt.internal.ui.preferences;
import java.util.ArrayList;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.internal.core.search.indexing.SourceIndexer;
import org.eclipse.cdt.internal.ui.search.CSearchPage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
public class CSearchPreferencePage extends PreferencePage
implements
IWorkbenchPreferencePage {
private Combo fExternLinks;
private Button fExternEnabled;
protected OverlayPreferenceStore fOverlayStore;
private Text fTextControl;
private static final String TIMEOUT_VALUE = "20000"; //$NON-NLS-1$
public CSearchPreferencePage(){
setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
fOverlayStore = createOverlayStore();
}
private OverlayPreferenceStore createOverlayStore() {
ArrayList overlayKeys = new ArrayList();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CSearchPage.EXTERNALMATCH_ENABLED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CSearchPage.EXTERNALMATCH_VISIBLE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, SourceIndexer.CDT_INDEXER_TIMEOUT));
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(getPreferenceStore(), keys);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
protected Control createContents(Composite parent) {
fOverlayStore.load();
fOverlayStore.start();
initializeDialogUnits(parent);
Composite result= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth= 0;
layout.verticalSpacing= convertVerticalDLUsToPixels(10);
layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
result.setLayout(layout);
Group indexerTimeoutGroup= new Group(result, SWT.NONE);
indexerTimeoutGroup.setLayout(new GridLayout());
indexerTimeoutGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
indexerTimeoutGroup.setText(PreferencesMessages.getString("CSearchPreferences.IndexerTimeout.IndexerTimeoutGroup")); //$NON-NLS-1$
fTextControl = (Text) addTextField( indexerTimeoutGroup, PreferencesMessages.getString("CSearchPreferences.IndexerTimeout.Timeout"),"TimeOut",6,0,true); //$NON-NLS-1$ //$NON-NLS-2$
initialize();
return result;
}
private void initialize(){
fTextControl.setText(fOverlayStore.getString(SourceIndexer.CDT_INDEXER_TIMEOUT));
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
// TODO Auto-generated method stub
}
/**
* Creates a button with the given label and sets the default
* configuration data.
*/
private Combo createComboBox( Composite parent, String label, String[] items, String selection )
{
ControlFactory.createLabel( parent, label );
Combo combo = ControlFactory.createSelectCombo( parent, items, selection );
combo.setLayoutData( new GridData() );
return combo;
}
/**
* Creates a button with the given label and sets the default
* configuration data.
*/
private Button createCheckButton( Composite parent, String label )
{
Button button = new Button( parent, SWT.CHECK | SWT.LEFT );
button.setText( label );
// FieldEditor GridData
GridData data = new GridData();
button.setLayoutData( data );
return button;
}
private Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
Label labelControl = new Label(composite, SWT.NONE);
labelControl.setText(label);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent = indentation;
labelControl.setLayoutData(gd);
Text textControl = new Text(composite, SWT.BORDER | SWT.SINGLE);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = convertWidthInCharsToPixels(textLimit + 1);
textControl.setLayoutData(gd);
textControl.setTextLimit(textLimit);
return textControl;
}
/*
* @see IPreferencePage#performOk()
*/
public boolean performOk() {
String timeOut = fTextControl.getText();
try {
// Check the string number
Integer.parseInt(timeOut);
} catch (NumberFormatException ex){
timeOut = TIMEOUT_VALUE;
}
fOverlayStore.setValue(SourceIndexer.CDT_INDEXER_TIMEOUT, timeOut);
fOverlayStore.propagate();
// Store IProblem Marker value in CCorePlugin Preferences
Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
prefs.setValue(SourceIndexer.CDT_INDEXER_TIMEOUT,timeOut);
CCorePlugin.getDefault().savePluginPreferences();
return true;
}
/**
* @param store
*/
public static void initDefaults(IPreferenceStore store) {
store.setDefault(SourceIndexer.CDT_INDEXER_TIMEOUT,TIMEOUT_VALUE);
}
/*
* @see PreferencePage#performDefaults()
*/
protected void performDefaults() {
fOverlayStore.loadDefaults();
initialize();
super.performDefaults();
}
}

View file

@ -1,210 +0,0 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on Mar 30, 2004
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package org.eclipse.cdt.internal.ui.preferences;
import java.util.ArrayList;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.browser.AllTypesCache;
import org.eclipse.cdt.internal.core.search.indexing.SourceIndexer;
import org.eclipse.cdt.internal.ui.search.CSearchPage;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
/**
* @author bgheorgh
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class WorkInProgressPreferencePage extends PreferencePage
implements
IWorkbenchPreferencePage {
private Button fBackgroundTypeCacheEnabled;
protected OverlayPreferenceStore fOverlayStore;
public WorkInProgressPreferencePage(){
setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
fOverlayStore = createOverlayStore();
}
private OverlayPreferenceStore createOverlayStore() {
ArrayList overlayKeys = new ArrayList();
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, CSearchPage.EXTERNALMATCH_ENABLED));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.INT, CSearchPage.EXTERNALMATCH_VISIBLE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, SourceIndexer.CDT_INDEXER_TIMEOUT));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE));
OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
overlayKeys.toArray(keys);
return new OverlayPreferenceStore(getPreferenceStore(), keys);
}
/* (non-Javadoc)
* @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
*/
protected Control createContents(Composite parent) {
fOverlayStore.load();
fOverlayStore.start();
initializeDialogUnits(parent);
Composite result= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth= 0;
layout.verticalSpacing= convertVerticalDLUsToPixels(10);
layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
result.setLayout(layout);
Group backgroundTypeCacheGroup= new Group(result, SWT.NONE);
backgroundTypeCacheGroup.setLayout(new GridLayout());
backgroundTypeCacheGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
backgroundTypeCacheGroup.setText("Open Type"); //$NON-NLS-1$
fBackgroundTypeCacheEnabled = createCheckButton(backgroundTypeCacheGroup, "Cache types in background"); //$NON-NLS-1$
fBackgroundTypeCacheEnabled.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
Button button = (Button) e.widget;
fOverlayStore.setValue(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE, button.getSelection());
}
});
Group editorCorrectionGroup= new Group(result, SWT.NONE);
editorCorrectionGroup.setLayout(new GridLayout());
editorCorrectionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
editorCorrectionGroup.setText("Editor"); //$NON-NLS-1$
initialize();
return result;
}
private void initialize(){
fBackgroundTypeCacheEnabled.setSelection(fOverlayStore.getBoolean(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE));
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
*/
public void init(IWorkbench workbench) {
// TODO Auto-generated method stub
}
/**
* Creates a button with the given label and sets the default
* configuration data.
*/
private Combo createComboBox( Composite parent, String label, String[] items, String selection )
{
ControlFactory.createLabel( parent, label );
Combo combo = ControlFactory.createSelectCombo( parent, items, selection );
combo.setLayoutData( new GridData() );
return combo;
}
/**
* Creates a button with the given label and sets the default
* configuration data.
*/
private Button createCheckButton( Composite parent, String label )
{
Button button = new Button( parent, SWT.CHECK | SWT.LEFT );
button.setText( label );
// FieldEditor GridData
GridData data = new GridData();
button.setLayoutData( data );
return button;
}
private Control addTextField(Composite composite, String label, String key, int textLimit, int indentation, boolean isNumber) {
Label labelControl = new Label(composite, SWT.NONE);
labelControl.setText(label);
GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.horizontalIndent = indentation;
labelControl.setLayoutData(gd);
Text textControl = new Text(composite, SWT.BORDER | SWT.SINGLE);
gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
gd.widthHint = convertWidthInCharsToPixels(textLimit + 1);
textControl.setLayoutData(gd);
textControl.setTextLimit(textLimit);
return textControl;
}
/*
* @see IPreferencePage#performOk()
*/
public boolean performOk() {
fOverlayStore.propagate();
// Store IProblem Marker value in CCorePlugin Preferences
Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
prefs.setValue(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE, fOverlayStore.getString(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE));
CCorePlugin.getDefault().savePluginPreferences();
return true;
}
/**
* @param store
*/
public static void initDefaults(IPreferenceStore store) {
store.setDefault(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE, false);
Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
if (prefs != null){
prefs.setValue(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE, store.getString(AllTypesCache.ENABLE_BACKGROUND_TYPE_CACHE));
CCorePlugin.getDefault().savePluginPreferences();
}
}
/*
* @see PreferencePage#performDefaults()
*/
protected void performDefaults() {
fOverlayStore.loadDefaults();
initialize();
super.performDefaults();
}
}

View file

@ -14,9 +14,7 @@ import org.eclipse.cdt.internal.ui.cview.CView;
import org.eclipse.cdt.internal.ui.preferences.BuildConsolePreferencePage;
import org.eclipse.cdt.internal.ui.preferences.CEditorPreferencePage;
import org.eclipse.cdt.internal.ui.preferences.CPluginPreferencePage;
import org.eclipse.cdt.internal.ui.preferences.CSearchPreferencePage;
import org.eclipse.cdt.internal.ui.preferences.CodeAssistPreferencePage;
import org.eclipse.cdt.internal.ui.preferences.WorkInProgressPreferencePage;
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.editors.text.EditorsUI;
@ -38,8 +36,6 @@ public class CUIPreferenceInitializer extends AbstractPreferenceInitializer {
PreferenceConstants.initializeDefaultValues(store);
CPluginPreferencePage.initDefaults(store);
BuildConsolePreferencePage.initDefaults(store);
WorkInProgressPreferencePage.initDefaults(store);
CSearchPreferencePage.initDefaults(store);
CView.initDefaults(store);
CEditorPreferencePage.initDefaults(store);
CodeAssistPreferencePage.initDefaults(store);

View file

@ -1,80 +1,443 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corp. - Rational Software - initial implementation
******************************************************************************/
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.dialogs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.index.AbstractIndexerPage;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.cdt.utils.ui.controls.TabFolderLayout;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* @author Bogdan Gheorghe
*/
/**
* This <code>IndexerBlock2</code> is used in the <code>MakeProjectWizardOptionPage</code> and
* the <code>NewManagedProjectOptionPage</code> to display the indexer options during the creation of
* a new project.
*/
public class IndexerBlock extends AbstractCOptionPage {
private IndexerOptionDialogPage optionPage;
private static final String INDEXER_LABEL = "IndexerBlock.label"; //$NON-NLS-1$
private static final String INDEXER_DESC = "IndexerBlock.desc"; //$NON-NLS-1$
public final static String INDEX_UI_ID = CUIPlugin.PLUGIN_ID + ".cdtindexers"; //$NON-NLS-1$
public final static String INDEXERUIID = "indexerUIID"; //$NON-NLS-1$
public final static QualifiedName indexerUIIDKey = new QualifiedName(INDEX_UI_ID, INDEXERUIID);
public IndexerBlock(){
super(CUIPlugin.getResourceString(INDEXER_LABEL));
setDescription(CUIPlugin.getResourceString(INDEXER_DESC));
optionPage = new IndexerOptionDialogPage();
public static final String INDEXER_UI = "indexerUI"; //$NON-NLS-1$
public static final String INDEXER_UI_VALUE = "indexerUIValue"; //$NON-NLS-1$
private static final String INDEXER_LABEL = CUIPlugin.getResourceString("BaseIndexerBlock.label" ); //$NON-NLS-1$
private static final String INDEXER_DESCRIPTION = CUIPlugin.getResourceString("BaseIndexerBlock.desc"); //$NON-NLS-1$
private static final String INDEXER_COMBO_LABEL = CUIPlugin.getResourceString("BaseIndexerBlock.comboLabel"); //$NON-NLS-1$
private Combo indexersComboBox;
private HashMap indexerPageMap;
private String selectedIndexerId = null;
private Composite parentComposite;
private ICOptionPage currentPage;
public IndexerBlock(){
super(INDEXER_LABEL);
setDescription(INDEXER_DESCRIPTION);
initializeIndexerPageMap();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
/**
* Create a profile page only on request
*/
protected static class IndexerPageConfiguration {
ICOptionPage page;
IConfigurationElement element;
public IndexerPageConfiguration(IConfigurationElement _element) {
element = _element;
}
public ICOptionPage getPage() throws CoreException {
if (page == null) {
page = (ICOptionPage) element.createExecutableExtension("class"); //$NON-NLS-1$
}
return page;
}
public String getName() {
return element.getAttribute("name"); //$NON-NLS-1$
}
public String getIndexerID(){
return element.getAttribute("indexerID"); //$NON-NLS-1$
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
Composite composite = ControlFactory.createComposite(parent, 1);
Font font = parent.getFont();
GridLayout layout= ((GridLayout)composite.getLayout());
layout.marginHeight= 0;
layout.marginWidth= 0;
layout.verticalSpacing= 0;
layout.horizontalSpacing= GridData.FILL_HORIZONTAL;
composite.setFont(font);
setControl(composite);
// create a composite for general scanner config discovery options
Composite scComp = ControlFactory.createComposite(composite, 1);
((GridLayout)scComp.getLayout()).marginHeight = 0;
((GridLayout)scComp.getLayout()).marginTop = 5;
scComp.setFont(font);
// Create a group for discovered indexer's UI
if (createIndexerControls(scComp)) {
// create a composite for discovery profile options
Composite indexPageComposite = ControlFactory.createComposite(composite, 1);
indexPageComposite.setFont(font);
GridData gd = (GridData) indexPageComposite.getLayoutData();
gd.grabExcessHorizontalSpace = true;
// gd.grabExcessVerticalSpace = true;
gd.horizontalAlignment = GridData.FILL;
gd.verticalAlignment = GridData.FILL;
indexPageComposite.setLayout(new TabFolderLayout());
// Must set the composite parent to super class.
parentComposite = indexPageComposite;
setPage();
}
parent.layout(true);
}
/**
*
*/
public void performApply(IProgressMonitor monitor) throws CoreException {
IProject newProject = null;
private void setPage() {
String profileId = getCurrentIndexPageId();
//If no indexer has been selected, return
if (profileId == null)
return;
ICOptionPage page = getIndexerPage(profileId);
if (page != null) {
if (page.getControl() == null) {
page.setContainer(getContainer());
page.createControl(parentComposite);
parentComposite.layout(true);
parentComposite.pack(true);
} else {
page.setVisible(false);
}
page.setVisible(true);
}
setCurrentPage(page);
}
/**
* @param page
*/
private void setCurrentPage(ICOptionPage page) {
currentPage = page;
}
protected String getCurrentIndexPageId() {
String selectedIndexPageName = getSelectedIndexerID();
if (selectedIndexPageName == null)
return null;
String selectedIndexPageId = getIndexerPageId(selectedIndexPageName);
return selectedIndexPageId;
}
/**
* @param scComp
* @param numberOfColumns
* @return
*/
private boolean createIndexerControls(Composite parent) {
//TODO: Put in some logic to deal with old CDT project: upgrade old projects
//to use the Classic CDT Indexer
Group group= ControlFactory.createGroup(parent,INDEXER_COMBO_LABEL,2);
// Add discovered indexers combo box
indexersComboBox = ControlFactory.createSelectCombo(group,"", ""); //$NON-NLS-1$ //$NON-NLS-2$
//Add combo box listener
indexersComboBox.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
setPage();
}
});
//Add button
ControlFactory.createPushButton(group,"Info ...");
// fill the combobox and set the initial value
for (Iterator items = getIndexerPageIdList().iterator(); items.hasNext();) {
String profileId = (String)items.next();
String pageName = getIndexerPageName(profileId);
if (pageName != null) {
indexersComboBox.add(pageName);
}
}
return true;
}
/**
* Adds all the contributed Indexer Pages to a map
*/
private void initializeIndexerPageMap() {
indexerPageMap = new HashMap(5);
IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(CUIPlugin.getPluginId(), "IndexerPage"); //$NON-NLS-1$
IConfigurationElement[] infos = extensionPoint.getConfigurationElements();
for (int i = 0; i < infos.length; i++) {
if (infos[i].getName().equals("indexerUI")) { //$NON-NLS-1$
String id = infos[i].getAttribute("id"); //$NON-NLS-1$
indexerPageMap.put(id, new IndexerPageConfiguration(infos[i]));
}
}
}
/**
* Returns the contributed Indexer Pages as a list
*/
protected List getIndexerPageIdList() {
return new ArrayList(indexerPageMap.keySet());
}
/**
* Returns the page name for the given id
* @param profileId
* @return String
*/
protected String getIndexerPageName(String indexerPageId) {
IndexerPageConfiguration configElement =
(IndexerPageConfiguration) indexerPageMap.get(indexerPageId);
if (configElement != null) {
return configElement.getName();
}
return null;
}
/**
* Returns the indexer page id for the give name
* @param indexerPageName
* @return String
*/
protected String getIndexerPageId(String indexerPageName) {
for (Iterator I = indexerPageMap.keySet().iterator(); I.hasNext();) {
String indexerPageId = (String) I.next();
String tempPageName = getIndexerPageName(indexerPageId);
if (indexerPageName.equals(tempPageName)) {
return indexerPageId;
}
}
return null;
}
protected ICOptionPage getIndexerPage(String indexerPageId) {
IndexerPageConfiguration configElement =
(IndexerPageConfiguration) indexerPageMap.get(indexerPageId);
if (configElement != null) {
try {
return configElement.getPage();
} catch (CoreException e) {
}
}
return null;
}
/**
* Returns the indexer id for the given name
* @param profileId
* @return String
*/
protected String getIndexerIdName(String indexerPageId) {
IndexerPageConfiguration configElement =
(IndexerPageConfiguration) indexerPageMap.get(indexerPageId);
if (configElement != null) {
return configElement.getIndexerID();
}
return null;
}
public void performApply(IProgressMonitor monitor) throws CoreException {
IProject newProject = null;
newProject = getContainer().getProject();
persistIndexerSettings(newProject, monitor);
}
/**
* Persists BasicIndexerBlock settings to disk and allows current indexer page to persist settings
* This is needed since we need to pass in the project if we are trying to save changes made to the
* property page.
*/
public void persistIndexerSettings(IProject project, IProgressMonitor monitor) throws CoreException{
persistIndexerValues(project);
optionPage.persistIndexerValues(newProject);
boolean indexProject = optionPage.getIndexerValue();
if (indexProject && newProject != null)
CCorePlugin.getDefault().getCoreModel().getIndexManager().indexAll(newProject);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
//Give the chosen indexer a chance to persist its values
if (currentPage != null){
currentPage.performApply(monitor);
}
}
public void performDefaults() {
// TODO Auto-generated method stub
}
/**
* @return
*/
public void performDefaults() {
public boolean isIndexEnabled() {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
//Storage section
public void persistIndexerValues(IProject project){
ICDescriptor descriptor = null;
Element rootElement = null;
IProject newProject = null;
//Get the currently selected indexer from the UI
String indexerName = getSelectedIndexerID();
//If no indexer has been selected, return
if (indexerName == null)
return;
//Match up the selected indexer in the UI to a corresponding
//contributed Indexer Page ID
String indexerPageID = getIndexerPageId(indexerName);
if (indexerPageID == null)
return;
//Get the id of the indexer that goes along with this UI page - this gets persisted
String indexerID = getIndexerIdName(indexerPageID);
try {
newProject = project;
descriptor = CCorePlugin.getDefault().getCProjectDescription(newProject, true);
rootElement = descriptor.getProjectData(IndexManager.CDT_INDEXER);
// Clear out all current children
Node child = rootElement.getFirstChild();
while (child != null) {
rootElement.removeChild(child);
child = rootElement.getFirstChild();
}
Document doc = rootElement.getOwnerDocument();
saveIndexerInfo(indexerID, indexerPageID, rootElement, doc);
descriptor.saveProjectData();
//Update project session property
project.setSessionProperty(IndexManager.indexerIDKey, indexerID);
project.setSessionProperty(indexerUIIDKey, indexerPageID);
} catch (CoreException e) {
e.printStackTrace();
}
}
/**
* @param oldIndexerID
* @param project
*/
public void createControl(Composite parent) {
Composite result = new Composite(parent, SWT.NONE);
result.setLayout(new GridLayout());
result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
optionPage.createControl(result);
optionPage.setIndexerValue(true);
setControl(result);
public void setIndexerID(String oldIndexerID, IProject project) {
//Get the corresponding text for the given indexer id
selectedIndexerId = getIndexerPageName(oldIndexerID);
//Set the appropriate indexer in the combo box
indexersComboBox.setText(selectedIndexerId);
//Load the appropriate page
setPage();
//Give the contributed page a chance to initialize
if (currentPage instanceof AbstractIndexerPage){
((AbstractIndexerPage) currentPage).initialize(project);
}
}
public boolean isIndexEnabled(){
return optionPage.getIndexerValue();
private static void saveIndexerInfo (String indexerID, String indexerUIID, Element rootElement, Document doc ) {
//Save the indexer id
Element indexerIDElement = doc.createElement(IndexManager.INDEXER_ID);
indexerIDElement.setAttribute(IndexManager.INDEXER_ID_VALUE,indexerID);
rootElement.appendChild(indexerIDElement);
//Save the indexer UI id
Element indexerUIIDElement = doc.createElement(INDEXER_UI);
indexerUIIDElement.setAttribute(INDEXER_UI_VALUE,indexerUIID);
rootElement.appendChild(indexerUIIDElement);
}
public String getSelectedIndexerID(){
String indexerID = null;
int selIndex = indexersComboBox.getSelectionIndex();
//If no indexer has been selected return
if (selIndex != -1)
indexerID = indexersComboBox.getItem(selIndex);
return indexerID;
}
}

View file

@ -1,172 +0,0 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Corp. - Rational Software - initial implementation
******************************************************************************/
package org.eclipse.cdt.ui.dialogs;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.ui.CUIMessages;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class IndexerOptionDialogPage extends DialogPage {
private static final String ENABLE_PREPROCESSOR_PROBLEMS = CUIMessages.getString( "IndexerOptions.enablePreprocessor" ); //$NON-NLS-1$
private static final String ENABLE_SEMANTIC_PROBLEMS = CUIMessages.getString( "IndexerOptions.enableSemantic" ); //$NON-NLS-1$
private static final String ENABLE_SYNTACTIC_PROBLEMS = CUIMessages.getString( "IndexerOptions.enableSyntactic" ); //$NON-NLS-1$
private static final String ENABLE_INDEXING = CUIMessages.getString( "IndexerOptions.enableIndexing" ); //$NON-NLS-1$
private static final String INDEXER = CUIMessages.getString("IndexerOptions.indexer" ); //$NON-NLS-1$
private static final String INDEXER_PROBLEMS = CUIMessages.getString("IndexerOptions.problemReporting" ); //$NON-NLS-1$
private Button indexerEnabled;
private Button preprocessorProblemsEnabled;
private Button syntacticProblemsEnabled;
private Button semanticProblemsEnabled;
public IndexerOptionDialogPage(){
super();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
Composite result= new Composite(parent, SWT.NONE);
GridLayout layout= new GridLayout();
layout.marginHeight= convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth= 0;
layout.verticalSpacing= convertVerticalDLUsToPixels(10);
layout.horizontalSpacing= convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
result.setLayout(layout);
Group group= new Group(result, SWT.NONE);
group.setLayout(new GridLayout());
group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
group.setText( INDEXER );
indexerEnabled = createCheckButton(group, ENABLE_INDEXING );
Group problemsGroup = new Group(result, SWT.NONE );
problemsGroup.setLayout(new GridLayout());
problemsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
problemsGroup.setText( INDEXER_PROBLEMS );
preprocessorProblemsEnabled = createCheckButton( problemsGroup, ENABLE_PREPROCESSOR_PROBLEMS );
semanticProblemsEnabled = createCheckButton( problemsGroup, ENABLE_SEMANTIC_PROBLEMS );
//uncomment when we want to report syntax problems
syntacticProblemsEnabled = createCheckButton( problemsGroup, ENABLE_SYNTACTIC_PROBLEMS );
setControl(result);
}
/**
* Creates a button with the given label and sets the default
* configuration data.
*/
private Button createCheckButton( Composite parent, String label )
{
Button button = new Button( parent, SWT.CHECK | SWT.LEFT );
button.setText( label );
// FieldEditor GridData
GridData data = new GridData();
button.setLayoutData( data );
return button;
}
public void setIndexerValue(boolean value){
indexerEnabled.setSelection(value);
}
public void setIndexerProblemValues( int value ){
preprocessorProblemsEnabled.setSelection( (value & IndexManager.PREPROCESSOR_PROBLEMS_BIT) != 0 );
if( syntacticProblemsEnabled != null )
syntacticProblemsEnabled.setSelection( (value & IndexManager.SYNTACTIC_PROBLEMS_BIT) != 0 );
semanticProblemsEnabled.setSelection( (value & IndexManager.SEMANTIC_PROBLEMS_BIT) != 0 );
}
public boolean getIndexerValue(){
return indexerEnabled.getSelection();
}
public int getIndexerProblemsValues(){
int result = 0;
result |= preprocessorProblemsEnabled.getSelection() ? IndexManager.PREPROCESSOR_PROBLEMS_BIT : 0;
if( syntacticProblemsEnabled != null )
result |= syntacticProblemsEnabled.getSelection() ? IndexManager.SYNTACTIC_PROBLEMS_BIT : 0;
result |= semanticProblemsEnabled.getSelection() ? IndexManager.SEMANTIC_PROBLEMS_BIT : 0;
return result;
}
public void persistIndexerValues(IProject project){
ICDescriptor descriptor = null;
Element rootElement = null;
IProject newProject = null;
try {
newProject = project;
descriptor = CCorePlugin.getDefault().getCProjectDescription(newProject, true);
rootElement = descriptor.getProjectData(IndexManager.CDT_INDEXER);
// Clear out all current children
Node child = rootElement.getFirstChild();
while (child != null) {
rootElement.removeChild(child);
child = rootElement.getFirstChild();
}
Document doc = rootElement.getOwnerDocument();
boolean indexProject = getIndexerValue();
int problemValues = getIndexerProblemsValues();
saveIndexerEnabled(indexProject, rootElement, doc);
saveIndexerProblemsEnabled( problemValues, rootElement, doc );
descriptor.saveProjectData();
//Update project session property
project.setSessionProperty(IndexManager.activationKey,new Boolean(indexProject));
project.setSessionProperty(IndexManager.problemsActivationKey, new Integer( problemValues ));
} catch (CoreException e) {
e.printStackTrace();
}
}
private static void saveIndexerEnabled (boolean indexerEnabled, Element rootElement, Document doc ) {
Element indexEnabled = doc.createElement(IndexManager.INDEXER_ENABLED);
Boolean tempValue= new Boolean(indexerEnabled);
indexEnabled.setAttribute(IndexManager.INDEXER_VALUE,tempValue.toString());
rootElement.appendChild(indexEnabled);
}
private static void saveIndexerProblemsEnabled ( int problemValues, Element rootElement, Document doc ) {
Element enabled = doc.createElement(IndexManager.INDEXER_PROBLEMS_ENABLED);
Integer tempValue= new Integer( problemValues );
enabled.setAttribute(IndexManager.INDEXER_PROBLEMS_VALUE, tempValue.toString());
rootElement.appendChild(enabled);
}
}

View file

@ -17,6 +17,7 @@ import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
@ -29,14 +30,16 @@ import org.w3c.dom.Node;
public class IndexerOptionPropertyPage extends PropertyPage {
private IndexerOptionDialogPage optionPage;
private boolean oldIndexerValue;
private int oldIndexerProblemsValue;
private IndexerBlock optionPage;
private String oldIndexerID;
private boolean requestedIndexAll;
public IndexerOptionPropertyPage(){
super();
optionPage = new IndexerOptionDialogPage();
optionPage = new IndexerBlock();
requestedIndexAll = false;
}
/* (non-Javadoc)
@ -63,43 +66,43 @@ public class IndexerOptionPropertyPage extends PropertyPage {
IProject project = getProject();
try {
oldIndexerValue = getIndexerEnabled(project);
oldIndexerProblemsValue = getIndexerProblemsEnabled( project );
oldIndexerID = getIndexerID(project);
} catch (CoreException e) {
e.printStackTrace();
}
optionPage.setIndexerValue(oldIndexerValue);
optionPage.setIndexerProblemValues( oldIndexerProblemsValue );
optionPage.setIndexerID(oldIndexerID, project);
}
/*
* @see IPreferencePage#performOk()
*/
public boolean performOk() {
boolean newIndexerValue = optionPage.getIndexerValue();
int newIndexerProblemsValue = optionPage.getIndexerProblemsValues();
/* String newIndexerID = optionPage.getSelectedIndexerID();
boolean indexerIDChanged = false;
boolean indexChanged = (oldIndexerValue != newIndexerValue);
boolean problemsChanged = (oldIndexerProblemsValue != newIndexerProblemsValue );
if ( indexChanged || problemsChanged){
//persist new values
IProject tempProject = getProject();
optionPage.persistIndexerValues(tempProject);
if( problemsChanged && newIndexerProblemsValue == 0)
CCorePlugin.getDefault().getCoreModel().getIndexManager().removeIndexerProblems(tempProject);
//if indexer is now on send a index all request
if( indexChanged && newIndexerValue && !requestedIndexAll ) {
CCorePlugin.getDefault().getCoreModel().getIndexManager().indexAll(tempProject);
requestedIndexAll = true;
} else if( indexChanged && !newIndexerValue ) {
CCorePlugin.getDefault().getCoreModel().getIndexManager().discardJobs( tempProject.getName() );
}
if (newIndexerID != null){
indexerIDChanged = !(oldIndexerID.equals(newIndexerID));
}
else if (oldIndexerID != null){
//newIndexerID is null, oldIndexerID wasn't null
indexerIDChanged = true;
}
if ( indexerIDChanged ){
//persist new values
IProject tempProject = getProject();
optionPage.persistIndexerValues(tempProject);
}*/
IProject tempProject = getProject();
try {
optionPage.persistIndexerSettings(tempProject, new NullProgressMonitor());
} catch (CoreException e) {}
return true;
}
@ -112,104 +115,51 @@ public class IndexerOptionPropertyPage extends PropertyPage {
return project;
}
public boolean getIndexerEnabled(IProject project) throws CoreException {
// See if there's already one associated with the resource for this
// session
Boolean indexValue = (Boolean) project.getSessionProperty(IndexManager.activationKey);
public String getIndexerID(IProject project) throws CoreException {
//See if there's already one associated with the resource for this session
String indexerID = (String) project.getSessionProperty(IndexerBlock.indexerUIIDKey);
if (indexerID != null)
return indexerID;
// Try to load one for the project
if (indexValue == null) {
indexValue = loadIndexerEnabledFromCDescriptor(project);
}
indexerID = loadIndexerIDFromCDescriptor(project);
// There is nothing persisted for the session, or saved in a file so
// create a build info object
if (indexValue != null) {
project.setSessionProperty(IndexManager.activationKey, indexValue);
if (indexerID != null) {
project.setSessionProperty(IndexerBlock.indexerUIIDKey, indexerID);
}
else{
//Hmm, no persisted indexer value. Could be an old project - set to true and persist
indexValue = new Boolean(true);
optionPage.setIndexerValue(true);
optionPage.persistIndexerValues(project);
//Hmm, no persisted indexer value. Could be an old project - need to run project
//update code here
}
return indexValue.booleanValue();
return indexerID;
}
public int getIndexerProblemsEnabled( IProject project ) throws CoreException
{
// See if there's already one associated with the resource for this session
Integer value = (Integer) project.getSessionProperty( IndexManager.problemsActivationKey );
// Try to load one for the project
if (value == null) {
value = loadIndexerProblemsEnabledFromCDescriptor(project);
}
// There is nothing persisted for the session, or saved in a file so
// create a build info object
if (value != null) {
project.setSessionProperty(IndexManager.problemsActivationKey, value);
} else {
//Hmm, no persisted indexer value. Could be an old project - set all to false and persist
value = new Integer( 0 );
optionPage.setIndexerProblemValues( 0 );
optionPage.persistIndexerValues(project);
}
return value.intValue();
}
/**
* Loads dis from .cdtproject file
* Loads indexerID from .cdtproject file
* @param project
* @param includes
* @param symbols
* @throws CoreException
*/
private Boolean loadIndexerEnabledFromCDescriptor(IProject project) throws CoreException {
private String loadIndexerIDFromCDescriptor(IProject project) throws CoreException {
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project, true);
Node child = descriptor.getProjectData(IndexManager.CDT_INDEXER).getFirstChild();
Boolean strBool = null;
String indexerID = ""; //$NON-NLS-1$
while (child != null) {
if (child.getNodeName().equals(IndexManager.INDEXER_ENABLED))
strBool = Boolean.valueOf(((Element)child).getAttribute(IndexManager.INDEXER_VALUE));
if (child.getNodeName().equals(IndexerBlock.INDEXER_UI))
indexerID = ((Element)child).getAttribute(IndexerBlock.INDEXER_UI_VALUE);
child = child.getNextSibling();
}
return strBool;
}
private Integer loadIndexerProblemsEnabledFromCDescriptor( IProject project ) throws CoreException
{
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project, true);
Node child = descriptor.getProjectData(IndexManager.CDT_INDEXER).getFirstChild();
Integer strInt = null;
while (child != null) {
if (child.getNodeName().equals(IndexManager.INDEXER_PROBLEMS_ENABLED)) {
String val = ((Element)child).getAttribute(IndexManager.INDEXER_PROBLEMS_VALUE);
try{
strInt = Integer.valueOf( val );
} catch( NumberFormatException e ){
//some old projects might have a boolean stored, translate that into just preprocessors
Boolean bool = Boolean.valueOf( val );
if( bool.booleanValue() )
strInt = new Integer( IndexManager.PREPROCESSOR_PROBLEMS_BIT );
else
strInt = new Integer( 0 );
}
break;
}
child = child.getNextSibling();
}
return strInt;
return indexerID;
}
}

View file

@ -0,0 +1,301 @@
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Corp. - Rational Software - initial implementation
******************************************************************************/
package org.eclipse.cdt.ui.dialogs;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.internal.core.index.sourceindexer.SourceIndexer;
import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
import org.eclipse.cdt.internal.ui.CUIMessages;
import org.eclipse.cdt.ui.index.AbstractIndexerPage;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class SourceIndexerBlock extends AbstractIndexerPage {
private static final String ENABLE_PREPROCESSOR_PROBLEMS = CUIMessages.getString( "IndexerOptions.enablePreprocessor" ); //$NON-NLS-1$
private static final String ENABLE_SEMANTIC_PROBLEMS = CUIMessages.getString( "IndexerOptions.enableSemantic" ); //$NON-NLS-1$
private static final String ENABLE_SYNTACTIC_PROBLEMS = CUIMessages.getString( "IndexerOptions.enableSyntactic" ); //$NON-NLS-1$
private static final String ENABLE_INDEXING = CUIMessages.getString( "IndexerOptions.enableIndexing" ); //$NON-NLS-1$
private static final String INDEXER = CUIMessages.getString("IndexerOptions.indexer" ); //$NON-NLS-1$
private static final String INDEXER_PROBLEMS = CUIMessages.getString("IndexerOptions.problemReporting" ); //$NON-NLS-1$
private Button indexerEnabled;
private Button preprocessorProblemsEnabled;
private Button syntacticProblemsEnabled;
private Button semanticProblemsEnabled;
private boolean oldIndexerValue;
private int oldIndexerProblemsValue;
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performApply(org.eclipse.core.runtime.IProgressMonitor)
*/
public void performApply(IProgressMonitor monitor) throws CoreException {
IProject newProject = null;
newProject = getContainer().getProject();
this.persistIndexerValues(newProject);
boolean indexProject = getIndexerValue();
//if (indexProject && newProject != null)
//SourceIndexer.indexAll()
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.dialogs.ICOptionPage#performDefaults()
*/
public void performDefaults() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
Composite page = ControlFactory.createComposite(parent, 1);
Group group = ControlFactory.createGroup(page,INDEXER,1);
GridData gd = (GridData) group.getLayoutData();
gd.grabExcessHorizontalSpace = true;
gd.horizontalAlignment = GridData.FILL;
indexerEnabled = ControlFactory.createCheckBox(group, ENABLE_INDEXING );
Group problemsGroup = ControlFactory.createGroup(page,INDEXER_PROBLEMS,1);
GridData gd2 = (GridData) problemsGroup.getLayoutData();
gd2.grabExcessHorizontalSpace = true;
gd2.horizontalAlignment = GridData.FILL;
preprocessorProblemsEnabled = ControlFactory.createCheckBox( problemsGroup, ENABLE_PREPROCESSOR_PROBLEMS );
semanticProblemsEnabled = ControlFactory.createCheckBox( problemsGroup, ENABLE_SEMANTIC_PROBLEMS );
//uncomment when we want to report syntax problems
syntacticProblemsEnabled = ControlFactory.createCheckBox( problemsGroup, ENABLE_SYNTACTIC_PROBLEMS );
setControl(page);
}
public void persistIndexerValues(IProject project){
ICDescriptor descriptor = null;
Element rootElement = null;
IProject newProject = null;
try {
newProject = project;
descriptor = CCorePlugin.getDefault().getCProjectDescription(newProject, true);
rootElement = descriptor.getProjectData(SourceIndexer.SOURCE_INDEXER);
// Clear out all current children
Node child = rootElement.getFirstChild();
while (child != null) {
rootElement.removeChild(child);
child = rootElement.getFirstChild();
}
Document doc = rootElement.getOwnerDocument();
boolean indexProject = getIndexerValue();
int problemValues = getIndexerProblemsValues();
saveIndexerEnabled(indexProject, rootElement, doc);
saveIndexerProblemsEnabled( problemValues, rootElement, doc );
descriptor.saveProjectData();
//Update project session property
project.setSessionProperty(SourceIndexer.activationKey,new Boolean(indexProject));
project.setSessionProperty(SourceIndexer.problemsActivationKey, new Integer( problemValues ));
} catch (CoreException e) {
e.printStackTrace();
}
}
public boolean getIndexerValue(){
return indexerEnabled.getSelection();
}
public int getIndexerProblemsValues(){
int result = 0;
result |= preprocessorProblemsEnabled.getSelection() ? SourceIndexer.PREPROCESSOR_PROBLEMS_BIT : 0;
if( syntacticProblemsEnabled != null )
result |= syntacticProblemsEnabled.getSelection() ? SourceIndexer.SYNTACTIC_PROBLEMS_BIT : 0;
result |= semanticProblemsEnabled.getSelection() ? SourceIndexer.SEMANTIC_PROBLEMS_BIT : 0;
return result;
}
private static void saveIndexerEnabled (boolean indexerEnabled, Element rootElement, Document doc ) {
Element indexEnabled = doc.createElement(SourceIndexer.INDEXER_ENABLED);
Boolean tempValue= new Boolean(indexerEnabled);
indexEnabled.setAttribute(SourceIndexer.INDEXER_VALUE,tempValue.toString());
rootElement.appendChild(indexEnabled);
}
private static void saveIndexerProblemsEnabled ( int problemValues, Element rootElement, Document doc ) {
Element enabled = doc.createElement(SourceIndexer.INDEXER_PROBLEMS_ENABLED);
Integer tempValue= new Integer( problemValues );
enabled.setAttribute(SourceIndexer.INDEXER_PROBLEMS_VALUE, tempValue.toString());
rootElement.appendChild(enabled);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.ui.index2.AbstractIndexerPage#initialize(org.eclipse.core.resources.IProject)
*/
public void initialize(IProject project) {
try {
oldIndexerValue = getIndexerEnabled(project);
oldIndexerProblemsValue = getIndexerProblemsEnabled( project );
} catch (CoreException e) {
e.printStackTrace();
}
//Set the index enabled checkbox
setIndexerValue(oldIndexerValue);
//Set the IProblem checkboxes
setIndexerProblemValues(oldIndexerProblemsValue);
}
public boolean getIndexerEnabled(IProject project) throws CoreException {
// See if there's already one associated with the resource for this
// session
Boolean indexValue = (Boolean) project.getSessionProperty(SourceIndexer.activationKey);
// Try to load one for the project
if (indexValue == null) {
indexValue = loadIndexerEnabledFromCDescriptor(project);
}
// There is nothing persisted for the session, or saved in a file so
// create a build info object
if (indexValue != null) {
project.setSessionProperty(SourceIndexer.activationKey, indexValue);
}
else{
//Hmm, no persisted indexer value. Could be an old project - set to true and persist
indexValue = new Boolean(true);
setIndexerValue(true);
persistIndexerValues(project);
}
return indexValue.booleanValue();
}
public int getIndexerProblemsEnabled( IProject project ) throws CoreException
{
// See if there's already one associated with the resource for this session
Integer value = (Integer) project.getSessionProperty( SourceIndexer.problemsActivationKey );
// Try to load one for the project
if (value == null) {
value = loadIndexerProblemsEnabledFromCDescriptor(project);
}
// There is nothing persisted for the session, or saved in a file so
// create a build info object
if (value != null) {
project.setSessionProperty(SourceIndexer.problemsActivationKey, value);
} else {
//Hmm, no persisted indexer value. Could be an old project - set all to false and persist
value = new Integer( 0 );
setIndexerProblemValues( 0 );
persistIndexerValues(project);
}
return value.intValue();
}
public void setIndexerValue(boolean value){
indexerEnabled.setSelection(value);
}
public void setIndexerProblemValues( int value ){
preprocessorProblemsEnabled.setSelection( (value & SourceIndexer.PREPROCESSOR_PROBLEMS_BIT) != 0 );
if( syntacticProblemsEnabled != null )
syntacticProblemsEnabled.setSelection( (value & SourceIndexer.SYNTACTIC_PROBLEMS_BIT) != 0 );
semanticProblemsEnabled.setSelection( (value & SourceIndexer.SEMANTIC_PROBLEMS_BIT) != 0 );
}
/**
* Loads dis from .cdtproject file
* @param project
* @param includes
* @param symbols
* @throws CoreException
*/
private Boolean loadIndexerEnabledFromCDescriptor(IProject project) throws CoreException {
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project, true);
Node child = descriptor.getProjectData(SourceIndexer.SOURCE_INDEXER).getFirstChild();
Boolean strBool = null;
while (child != null) {
if (child.getNodeName().equals(SourceIndexer.INDEXER_ENABLED))
strBool = Boolean.valueOf(((Element)child).getAttribute(SourceIndexer.INDEXER_VALUE));
child = child.getNextSibling();
}
return strBool;
}
private Integer loadIndexerProblemsEnabledFromCDescriptor( IProject project ) throws CoreException
{
ICDescriptor descriptor = CCorePlugin.getDefault().getCProjectDescription(project, true);
Node child = descriptor.getProjectData(SourceIndexer.SOURCE_INDEXER).getFirstChild();
Integer strInt = null;
while (child != null) {
if (child.getNodeName().equals(SourceIndexer.INDEXER_PROBLEMS_ENABLED)) {
String val = ((Element)child).getAttribute(SourceIndexer.INDEXER_PROBLEMS_VALUE);
try{
strInt = Integer.valueOf( val );
} catch( NumberFormatException e ){
//some old projects might have a boolean stored, translate that into just preprocessors
Boolean bool = Boolean.valueOf( val );
if( bool.booleanValue() )
strInt = new Integer( SourceIndexer.PREPROCESSOR_PROBLEMS_BIT );
else
strInt = new Integer( 0 );
}
break;
}
child = child.getNextSibling();
}
return strInt;
}
}

View file

@ -0,0 +1,32 @@
/**********************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.ui.index;
import org.eclipse.cdt.ui.dialogs.AbstractCOptionPage;
import org.eclipse.core.resources.IProject;
/**
* @author Bogdan Gheorghe
*/
public abstract class AbstractIndexerPage extends AbstractCOptionPage {
protected AbstractIndexerPage() {
super();
}
/**
* Called by BaseIndexerBlock to give the indexer page a chance to load its state from store
* @param currentProject - the project that this page is being created for
*/
abstract public void initialize(IProject currentProject);
}