1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

write project properties to the project pdom (fragment id)

This commit is contained in:
Andrew Ferguson 2007-03-15 14:37:00 +00:00
parent 00d0168452
commit 3fa2470a54
3 changed files with 101 additions and 0 deletions

View file

@ -10,14 +10,20 @@
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import java.io.File;
import junit.framework.Test;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.index.IIndexLocationConverter;
import org.eclipse.cdt.core.index.ResourceContainerRelativeLocationConverter;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.testplugin.CProjectHelper;
import org.eclipse.cdt.core.testplugin.util.BaseTestCase;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.NullProgressMonitor;
@ -59,4 +65,50 @@ public class PDOMBugsTest extends BaseTestCase {
pdom.releaseWriteLock(0);
}
}
public void testProjectPDOMProperties() throws Exception {
IWritableIndexFragment pdom = (IWritableIndexFragment) CCoreInternals.getPDOMManager().getPDOM(cproject);
pdom.acquireReadLock();
try {
String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
assertNotNull(id);
CCoreInternals.getPDOMManager().reindex(cproject);
String id2= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
assertNotNull(id2);
assertEquals(id, id2);
} finally {
pdom.releaseReadLock();
}
}
public void testProjectPDOMPropertiesOnExport() throws Exception {
File tmp= new File(System.getProperty("java.io.tmpdir")+"/temp"+System.currentTimeMillis()+".pdom");
IIndexLocationConverter cvr= new ResourceContainerRelativeLocationConverter(cproject.getProject());
CCoreInternals.getPDOMManager().exportProjectPDOM(cproject, tmp, cvr);
IWritableIndexFragment pdom = new WritablePDOM(tmp, cvr);
pdom.acquireReadLock();
try {
String id= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
assertNotNull(id);
String id2= ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
assertNotNull(id2);
assertFalse(id2.equals(id));
CCoreInternals.getPDOMManager().reindex(cproject);
String id3= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
assertNotNull(id3);
assertEquals(id,id3);
String id4= ((PDOM)CCoreInternals.getPDOMManager().getPDOM(cproject)).getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
assertNotNull(id4);
assertFalse(id4.equals(id));
} finally {
pdom.releaseReadLock();
}
}
}

View file

@ -42,6 +42,7 @@ import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IElementChangedListener;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
import org.eclipse.cdt.internal.core.index.IndexChangeEvent;
@ -195,7 +196,11 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
storeDatabaseName(rproject, dbName);
}
boolean newPDOM= !dbFile.exists();
pdom = new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject));
if(newPDOM) {
writeProjectPDOMProperties(pdom, rproject);
}
pdom.addListener(this);
}
@ -873,6 +878,11 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
PDOMFile file = (PDOMFile) i.next();
file.clear();
}
// ensure fragment id has a sensible value, in case callee's do not
// overwrite their own values
String oldId= pdom.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID);
newPDOM.setProperty(IIndexFragment.PROPERTY_FRAGMENT_ID, "exported."+oldId); //$NON-NLS-1$
} finally {
newPDOM.releaseWriteLock();
}
@ -914,6 +924,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
try {
pdom.reloadFromFile(newFile);
storeDatabaseName(project.getProject(), newName);
writeProjectPDOMProperties(pdom, project.getProject());
}
finally {
pdom.releaseWriteLock();
@ -926,4 +937,16 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
operation.setOptions(options);
operation.run(monitor);
}
/**
* Write metadata appropriate for a project pdom
* @param pdom the pdom to write to
* @param project the project to write metadata about
* @throws CoreException
*/
public static void writeProjectPDOMProperties(WritablePDOM pdom, IProject project) throws CoreException {
String DELIM = "\0"; //$NON-NLS-1$
String id= CCorePlugin.PLUGIN_ID + ".pdom.project." + DELIM + project.getName() + DELIM; //$NON-NLS-1$
pdom.setProperty(IIndexFragment.PROPERTY_FRAGMENT_ID, id);
}
}

View file

@ -20,9 +20,12 @@ import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.core.CCoreInternals;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
import org.eclipse.cdt.internal.core.pdom.IndexerProgress;
import org.eclipse.cdt.internal.core.pdom.PDOMManager;
import org.eclipse.cdt.internal.core.pdom.WritablePDOM;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osgi.util.NLS;
@ -69,6 +72,29 @@ public class PDOMRebuildTask implements IPDOMIndexerTask {
if (fDelegate != null) {
fDelegate.run(monitor);
writeProjectProperties(project);
}
}
/**
* Writes project metadata to the pdom
* @see PDOMManager#writeProjectPDOMProperties(WritablePDOM, org.eclipse.core.resources.IProject)
* @param project the project to write project metadata about
*/
private void writeProjectProperties(ICProject project) {
try {
PDOMManager mgr= CCoreInternals.getPDOMManager();
WritablePDOM projectPDOM= (WritablePDOM) mgr.getPDOM(project);
projectPDOM.acquireWriteLock();
try {
PDOMManager.writeProjectPDOMProperties(projectPDOM, project.getProject());
} finally {
projectPDOM.releaseWriteLock();
}
} catch(CoreException ce) {
CCorePlugin.log(ce);
} catch(InterruptedException ie) {
// no-op
}
}