diff --git a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
index 235ff200e27..2f77e84b027 100644
--- a/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
+++ b/core/org.eclipse.cdt.core.tests/suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
@@ -9,6 +9,7 @@ package org.eclipse.cdt.core.suite;
import junit.framework.Test;
import junit.framework.TestSuite;
+import org.eclipse.cdt.core.CCorePlugin;
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;
@@ -50,6 +51,9 @@ public class AutomatedIntegrationSuite extends TestSuite {
public static Test suite() {
final AutomatedIntegrationSuite suite = new AutomatedIntegrationSuite();
+ //TODO: BOG take this out once TypeCache issues resolved
+ disableIndexUpgrades();
+
// Add all success tests
suite.addTest(CDescriptorTests.suite());
//suite.addTest(GCCErrorParserTests.suite());
@@ -75,5 +79,13 @@ public class AutomatedIntegrationSuite extends TestSuite {
return suite;
}
+
+ /**
+ *
+ */
+ private static void disableIndexUpgrades() {
+ CCorePlugin.getDefault().getCoreModel().getIndexManager().disableUpgrades();
+
+ }
}
diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java
index 0ce829d9bf3..b913d1b1d07 100644
--- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java
+++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java
@@ -34,6 +34,7 @@ import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.QualifiedName;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
@@ -46,6 +47,8 @@ public class IndexManager extends JobManager{
public final static String INDEXERID = "indexerID"; //$NON-NLS-1$
public final static QualifiedName indexerIDKey = new QualifiedName(INDEX_MODEL_ID, INDEXERID);
+ public static final String nullIndexerID = "org.eclipse.cdt.core.nullindexer"; //$NON-NLS-1$
+
public static final String CDT_INDEXER = "cdt_indexer"; //$NON-NLS-1$
public static final String INDEXER_ID = "indexerID"; //$NON-NLS-1$
public static final String INDEXER_ID_VALUE = "indexerIDValue"; //$NON-NLS-1$
@@ -58,6 +61,12 @@ public class IndexManager extends JobManager{
//Map of Persisted Indexers; keyed by project
private HashMap indexerMap = null;
+ //Upgrade index version
+ private boolean upgradeIndexEnabled = false;
+ private int upgradeIndexProblems = 0;
+ private boolean upgradeProjects = true;
+
+
/**
* Create an indexer only on request
*/
@@ -343,7 +352,15 @@ public class IndexManager extends JobManager{
}
//Make sure that we have an indexer ID
- if (indexerID == null)
+ if (indexerID == null && upgradeProjects) {
+ //No persisted info on file? Must be old project - run temp. upgrade
+ indexerID = doProjectUpgrade(project);
+ doSourceIndexerUpgrade(project);
+ }
+
+ //If we're asking for the null indexer,return null
+ if (indexerID == null ||
+ indexerID.equals(nullIndexerID))
return null;
//Create the indexer and store it
@@ -354,7 +371,178 @@ public class IndexManager extends JobManager{
return indexer;
}
- protected ICDTIndexer getIndexer(String indexerId) {
+ /**
+ * @param project
+ */
+ private void doSourceIndexerUpgrade(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();
+
+
+ saveIndexerEnabled(upgradeIndexEnabled, rootElement, doc);
+ saveIndexerProblemsEnabled( upgradeIndexProblems, rootElement, doc );
+
+ descriptor.saveProjectData();
+
+ //Update project session property
+
+ project.setSessionProperty(SourceIndexer.activationKey,new Boolean(upgradeIndexEnabled));
+ project.setSessionProperty(SourceIndexer.problemsActivationKey, new Integer( upgradeIndexProblems ));
+
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ }
+
+ 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);
+ }
+
+/**
+ * @return
+ */
+ private String doProjectUpgrade(IProject project) {
+ ICDescriptor descriptor = null;
+ Element rootElement = null;
+ IProject newProject = null;
+
+ try {
+ //Get the old values from .cdtproject before upgrading
+ Boolean tempEnabled = loadIndexerEnabledFromCDescriptor(project);
+ if (tempEnabled != null)
+ upgradeIndexEnabled = tempEnabled.booleanValue();
+
+ Integer tempProblems = loadIndexerProblemsEnabledFromCDescriptor(project);
+ if (tempProblems != null)
+ upgradeIndexProblems = tempProblems.intValue();
+
+ } catch (CoreException e1) {}
+
+
+ //For now all upgrades will be to the old source indexer
+ String indexerPageID = "org.eclipse.cdt.ui.originalSourceIndexerUI"; //$NON-NLS-1$
+ String indexerID = "org.eclipse.cdt.core.originalsourceindexer"; //$NON-NLS-1$
+
+ 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();
+ }
+
+ return null;
+ }
+
+
+ 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("indexerUI"); //$NON-NLS-1$
+ indexerUIIDElement.setAttribute("indexerUIValue",indexerUIID); //$NON-NLS-1$
+ rootElement.appendChild(indexerUIIDElement);
+ }
+
+ 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(CDT_INDEXER).getFirstChild();
+
+ 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 {
+ // 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(CDT_INDEXER).getFirstChild();
+
+ 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;
+ }
+
+protected ICDTIndexer getIndexer(String indexerId) {
CDTIndexer configElement = (CDTIndexer) contributedIndexerMap.get(indexerId);
if (configElement != null) {
try {
@@ -377,6 +565,15 @@ public class IndexManager extends JobManager{
indexer.notifyIdle(idlingTime);
}
}
-
-
+
+
+
+
+/**
+ *
+ */
+public void disableUpgrades() {
+ upgradeProjects = false;
+}
+
}
diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index 27fe7fe1e8e..16ccc1141fc 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -1327,6 +1327,11 @@
indexerID="org.eclipse.cdt.core.originalsourceindexer"
name="Original C/C++ Indexer"
id="org.eclipse.cdt.ui.originalSourceIndexerUI"/>
+
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java
index c1c23a2f6c7..cd188c16054 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/dialogs/IndexerBlock.java
@@ -216,7 +216,7 @@ public class IndexerBlock extends AbstractCOptionPage {
}
});
//Add button
- ControlFactory.createPushButton(group,"Info ...");
+ ControlFactory.createPushButton(group,"Info ..."); //$NON-NLS-1$
// fill the combobox and set the initial value
for (Iterator items = getIndexerPageIdList().iterator(); items.hasNext();) {
@@ -227,6 +227,15 @@ public class IndexerBlock extends AbstractCOptionPage {
}
}
+ String[] indexerList = indexersComboBox.getItems();
+ int selectedIndex = 0;
+ for (int i=0; i