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