mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-07 17:56:01 +02:00
Partial fix for 167551, operation to create importable archive.
This commit is contained in:
parent
8f0bb1d073
commit
1e65c86123
9 changed files with 338 additions and 56 deletions
|
@ -14,6 +14,7 @@ package org.eclipse.cdt.core.dom;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.model.ICProject;
|
import org.eclipse.cdt.core.model.ICProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Doug Schaefer
|
* @author Doug Schaefer
|
||||||
|
@ -31,9 +32,19 @@ public interface IPDOMManager {
|
||||||
*/
|
*/
|
||||||
public void reindex(ICProject project) throws CoreException;
|
public void reindex(ICProject project) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export index for usage within a team.
|
||||||
|
* @param project a project for which the pdom is to be exported.
|
||||||
|
* @param location the target location for the database.
|
||||||
|
* @param options currently none are supported.
|
||||||
|
* @throws CoreException
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public void export(ICProject project, String location, int options, IProgressMonitor monitor) throws CoreException;
|
||||||
|
|
||||||
// Getting and setting indexer Ids
|
// Getting and setting indexer Ids
|
||||||
public String getDefaultIndexerId();
|
public String getDefaultIndexerId();
|
||||||
public void setDefaultIndexerId(String indexerId);
|
public void setDefaultIndexerId(String indexerId);
|
||||||
|
|
||||||
public String getIndexerId(ICProject project) throws CoreException;
|
public String getIndexerId(ICProject project) throws CoreException;
|
||||||
public void setIndexerId(ICProject project, String indexerId) throws CoreException;
|
public void setIndexerId(ICProject project, String indexerId) throws CoreException;
|
||||||
|
|
|
@ -20,9 +20,7 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.eclipse.cdt.core.CCorePlugin;
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
|
||||||
import org.eclipse.core.resources.IFile;
|
import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IResource;
|
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
import org.eclipse.core.runtime.IProgressMonitor;
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.OperationCanceledException;
|
import org.eclipse.core.runtime.OperationCanceledException;
|
||||||
|
@ -106,7 +104,7 @@ public class Checksums {
|
||||||
* @throws OperationCanceledException
|
* @throws OperationCanceledException
|
||||||
* @since 4.0
|
* @since 4.0
|
||||||
*/
|
*/
|
||||||
public static Map createChecksumMap(ITranslationUnit[] tus, MessageDigest md, IProgressMonitor pm)
|
public static Map createChecksumMap(IFile[] tus, MessageDigest md, IProgressMonitor pm)
|
||||||
throws OperationCanceledException {
|
throws OperationCanceledException {
|
||||||
Map result= new HashMap();
|
Map result= new HashMap();
|
||||||
putAlgorithm(result, md);
|
putAlgorithm(result, md);
|
||||||
|
@ -115,10 +113,8 @@ public class Checksums {
|
||||||
if (pm.isCanceled()) {
|
if (pm.isCanceled()) {
|
||||||
throw new OperationCanceledException();
|
throw new OperationCanceledException();
|
||||||
}
|
}
|
||||||
ITranslationUnit tu = tus[i];
|
IFile file = tus[i];
|
||||||
IResource res= tu.getResource();
|
if (file != null) {
|
||||||
if (res instanceof IFile) {
|
|
||||||
IFile file= (IFile) res;
|
|
||||||
IPath location= file.getLocation();
|
IPath location= file.getLocation();
|
||||||
if (location != null) {
|
if (location != null) {
|
||||||
File f= location.toFile();
|
File f= location.toFile();
|
||||||
|
|
|
@ -22,6 +22,11 @@ public class Messages extends NLS {
|
||||||
public static String PDOMManager_notifyJob_label;
|
public static String PDOMManager_notifyJob_label;
|
||||||
public static String PDOMManager_notifyTask_message;
|
public static String PDOMManager_notifyTask_message;
|
||||||
public static String PDOMManager_StartJob_name;
|
public static String PDOMManager_StartJob_name;
|
||||||
|
public static String TeamPDOMExportOperation_errorCreateArchive;
|
||||||
|
public static String TeamPDOMExportOperation_errorCreatingTempFile;
|
||||||
|
public static String TeamPDOMExportOperation_errorWriteTempFile;
|
||||||
|
public static String TeamPDOMExportOperation_subtaskCreateDatabase;
|
||||||
|
public static String TeamPDOMExportOperation_taskExportIndex;
|
||||||
public static String WritablePDOM_error_unknownLinkage;
|
public static String WritablePDOM_error_unknownLinkage;
|
||||||
static {
|
static {
|
||||||
// initialize resource bundle
|
// initialize resource bundle
|
||||||
|
|
|
@ -178,7 +178,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
|
||||||
((IListener)i.next()).handleChange(this);
|
((IListener)i.next()).handleChange(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Database getDB() throws CoreException {
|
public Database getDB() {
|
||||||
return db;
|
return db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -348,8 +348,8 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
|
||||||
}
|
}
|
||||||
|
|
||||||
// perform import
|
// perform import
|
||||||
PDOMImporter importer= new PDOMImporter(project);
|
TeamPDOMImportOperation operation= new TeamPDOMImportOperation(project);
|
||||||
importer.performImport(pm);
|
operation.run(pm);
|
||||||
|
|
||||||
synchronized (fIndexerMutex) {
|
synchronized (fIndexerMutex) {
|
||||||
Properties props= IndexerPreferences.getProperties(prj);
|
Properties props= IndexerPreferences.getProperties(prj);
|
||||||
|
@ -357,11 +357,11 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
|
||||||
|
|
||||||
registerIndexer(project, indexer);
|
registerIndexer(project, indexer);
|
||||||
IPDOMIndexerTask task= null;
|
IPDOMIndexerTask task= null;
|
||||||
if (!importer.wasSuccessful()) {
|
if (!operation.wasSuccessful()) {
|
||||||
task= new PDOMRebuildTask(indexer);
|
task= new PDOMRebuildTask(indexer);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ITranslationUnit[] tus= importer.getTranslationUnitsToUpdate();
|
ITranslationUnit[] tus= operation.getTranslationUnitsToUpdate();
|
||||||
if (tus.length > 0) {
|
if (tus.length > 0) {
|
||||||
task= indexer.createTask(NO_TUS, tus, NO_TUS);
|
task= indexer.createTask(NO_TUS, tus, NO_TUS);
|
||||||
}
|
}
|
||||||
|
@ -464,7 +464,7 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
|
||||||
Job addProject= new Job(Messages.PDOMManager_StartJob_name) {
|
Job addProject= new Job(Messages.PDOMManager_StartJob_name) {
|
||||||
protected IStatus run(IProgressMonitor monitor) {
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
monitor.beginTask("", 100); //$NON-NLS-1$
|
monitor.beginTask("", 100); //$NON-NLS-1$
|
||||||
if (project.isOpen()) {
|
if (project.isOpen() && CoreModel.hasCNature(project)) {
|
||||||
ICProject cproject= CoreModel.getDefault().create(project);
|
ICProject cproject= CoreModel.getDefault().create(project);
|
||||||
if (cproject != null) {
|
if (cproject != null) {
|
||||||
syncronizeProjectSettings(project, new SubProgressMonitor(monitor, 1));
|
syncronizeProjectSettings(project, new SubProgressMonitor(monitor, 1));
|
||||||
|
@ -919,4 +919,11 @@ public class PDOMManager implements IPDOMManager, IWritableIndexManager, IListen
|
||||||
pdom.releaseWriteLock();
|
pdom.releaseWriteLock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void export(ICProject project, String location, int options, IProgressMonitor monitor) throws CoreException {
|
||||||
|
TeamPDOMExportOperation operation= new TeamPDOMExportOperation(project);
|
||||||
|
operation.setTargetLocation(location);
|
||||||
|
operation.setOptions(options);
|
||||||
|
operation.run(monitor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,247 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2007 Wind River Systems, Inc. and others.
|
||||||
|
* All rights reserved. This program and the accompanying materials
|
||||||
|
* are made available under the terms of the Eclipse Public License v1.0
|
||||||
|
* which accompanies this distribution, and is available at
|
||||||
|
* http://www.eclipse.org/legal/epl-v10.html
|
||||||
|
*
|
||||||
|
* Contributors:
|
||||||
|
* Markus Schorn - initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
package org.eclipse.cdt.internal.core.pdom;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.zip.Deflater;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.CCorePlugin;
|
||||||
|
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.internal.core.CCoreInternals;
|
||||||
|
import org.eclipse.cdt.internal.core.index.IndexFileLocation;
|
||||||
|
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.OperationCanceledException;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.SubProgressMonitor;
|
||||||
|
|
||||||
|
public class TeamPDOMExportOperation implements IWorkspaceRunnable {
|
||||||
|
|
||||||
|
private ICProject fProject;
|
||||||
|
private String fTargetLocation;
|
||||||
|
private File fTargetLocationFile;
|
||||||
|
private MessageDigest fMessageDigest;
|
||||||
|
|
||||||
|
public TeamPDOMExportOperation(ICProject project) {
|
||||||
|
fProject= project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTargetLocation(String location) {
|
||||||
|
fTargetLocation= location;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOptions(int options) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAlgorithm(MessageDigest md) {
|
||||||
|
fMessageDigest= md;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run(IProgressMonitor monitor) throws CoreException {
|
||||||
|
getMessageDigest();
|
||||||
|
getTargetLocation();
|
||||||
|
|
||||||
|
File tmpPDOM= null;
|
||||||
|
File tmpChecksums= null;
|
||||||
|
try {
|
||||||
|
tmpPDOM = File.createTempFile("tmp", ".pdom"); //$NON-NLS-1$//$NON-NLS-2$
|
||||||
|
tmpChecksums= File.createTempFile("checksums", ".dat"); //$NON-NLS-1$ //$NON-NLS-2$
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CoreException(CCorePlugin.createStatus(Messages.TeamPDOMExportOperation_errorCreatingTempFile, e));
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
PDOMManager pdomManager= CCoreInternals.getPDOMManager();
|
||||||
|
|
||||||
|
// wait for indexer
|
||||||
|
monitor.beginTask(Messages.TeamPDOMExportOperation_taskExportIndex, 100);
|
||||||
|
pdomManager.joinIndexer(Integer.MAX_VALUE, subMonitor(monitor, 80));
|
||||||
|
checkMonitor(monitor);
|
||||||
|
|
||||||
|
// create index
|
||||||
|
IIndexLocationConverter converter= new ResourceContainerRelativeLocationConverter(ResourcesPlugin.getWorkspace().getRoot());
|
||||||
|
monitor.subTask(Messages.TeamPDOMExportOperation_subtaskCreateDatabase);
|
||||||
|
pdomManager.exportProjectPDOM(fProject, tmpPDOM, converter);
|
||||||
|
checkMonitor(monitor);
|
||||||
|
monitor.worked(5);
|
||||||
|
|
||||||
|
// create checksums
|
||||||
|
PDOM pdom= new PDOM(tmpPDOM, converter);
|
||||||
|
createChecksums(fProject, pdom, tmpChecksums, subMonitor(monitor, 10));
|
||||||
|
|
||||||
|
// create archive
|
||||||
|
createArchive(tmpPDOM, tmpChecksums);
|
||||||
|
|
||||||
|
// store preferences
|
||||||
|
IndexerPreferences.setIndexImportLocation(fProject.getProject(), fTargetLocation.toString());
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if (tmpPDOM != null) {
|
||||||
|
tmpPDOM.delete();
|
||||||
|
}
|
||||||
|
if (tmpChecksums != null) {
|
||||||
|
tmpChecksums.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getTargetLocation() throws CoreException {
|
||||||
|
fTargetLocationFile= TeamPDOMImportOperation.expandLocation(fProject.getProject(), fTargetLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getMessageDigest() throws CoreException {
|
||||||
|
if (fMessageDigest == null) {
|
||||||
|
try {
|
||||||
|
fMessageDigest= Checksums.getDefaultAlgorithm();
|
||||||
|
}
|
||||||
|
catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new CoreException(CCorePlugin.createStatus(e.getMessage(), e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createChecksums(ICProject cproject, PDOM pdom, File target, IProgressMonitor monitor) throws CoreException {
|
||||||
|
List locs;
|
||||||
|
try {
|
||||||
|
pdom.acquireReadLock();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new OperationCanceledException();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
locs = pdom.getAllFileLocations();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
pdom.releaseReadLock();
|
||||||
|
try {
|
||||||
|
pdom.getDB().close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int i=0;
|
||||||
|
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
|
||||||
|
IFile[] files= new IFile[locs.size()];
|
||||||
|
for (Iterator iterator = locs.iterator(); iterator.hasNext();) {
|
||||||
|
IndexFileLocation floc = (IndexFileLocation) iterator.next();
|
||||||
|
String fullPath= floc.getFullPath();
|
||||||
|
if (fullPath != null) {
|
||||||
|
files[i++]= root.getFile(new Path(fullPath));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Map map= Checksums.createChecksumMap(files, fMessageDigest, monitor);
|
||||||
|
writeChecksums(map, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeChecksums(Map map, File target) throws CoreException {
|
||||||
|
ObjectOutputStream out= null;
|
||||||
|
try {
|
||||||
|
out= new ObjectOutputStream(new FileOutputStream(target));
|
||||||
|
out.writeObject(map);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CoreException(CCorePlugin.createStatus(Messages.TeamPDOMExportOperation_errorWriteTempFile, e));
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
close(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void close(InputStream in) {
|
||||||
|
try {
|
||||||
|
if (in != null) {
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void close(OutputStream out) {
|
||||||
|
try {
|
||||||
|
if (out != null) {
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
CCorePlugin.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createArchive(File tmpPDOM, File tmpChecksums) throws CoreException {
|
||||||
|
fTargetLocationFile.delete();
|
||||||
|
ZipOutputStream out= null;
|
||||||
|
try {
|
||||||
|
fTargetLocationFile.getParentFile().mkdirs();
|
||||||
|
out= new ZipOutputStream(new FileOutputStream(fTargetLocationFile));
|
||||||
|
out.setLevel(Deflater.BEST_COMPRESSION);
|
||||||
|
writeEntry(out, TeamPDOMImportOperation.INDEX_NAME, tmpPDOM);
|
||||||
|
writeEntry(out, TeamPDOMImportOperation.CHECKSUMS_NAME, tmpChecksums);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new CoreException(CCorePlugin.createStatus(Messages.TeamPDOMExportOperation_errorCreateArchive, e));
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
close(out);
|
||||||
|
}
|
||||||
|
IFile[] wsResource= ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(fTargetLocationFile.getAbsolutePath()));
|
||||||
|
for (int i = 0; i < wsResource.length; i++) {
|
||||||
|
IFile file = wsResource[i];
|
||||||
|
file.refreshLocal(0, new NullProgressMonitor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeEntry(ZipOutputStream out, String name, File input) throws IOException {
|
||||||
|
ZipEntry e= new ZipEntry(name);
|
||||||
|
out.putNextEntry(e);
|
||||||
|
int read= 0;
|
||||||
|
byte[] buffer= new byte[4096];
|
||||||
|
InputStream in= new FileInputStream(input);
|
||||||
|
try {
|
||||||
|
while ((read= in.read(buffer)) >= 0) {
|
||||||
|
out.write(buffer, 0, read);
|
||||||
|
}
|
||||||
|
out.closeEntry();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
close(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SubProgressMonitor subMonitor(IProgressMonitor monitor, int ticks) {
|
||||||
|
return new SubProgressMonitor(monitor, ticks);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkMonitor(IProgressMonitor monitor) {
|
||||||
|
if (monitor.isCanceled()) {
|
||||||
|
throw new OperationCanceledException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,6 +23,7 @@ import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipException;
|
import java.util.zip.ZipException;
|
||||||
import java.util.zip.ZipFile;
|
import java.util.zip.ZipFile;
|
||||||
|
@ -44,6 +45,7 @@ import org.eclipse.core.resources.IFile;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IResource;
|
import org.eclipse.core.resources.IResource;
|
||||||
import org.eclipse.core.resources.IWorkspaceRoot;
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRunnable;
|
||||||
import org.eclipse.core.resources.ResourcesPlugin;
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
@ -51,11 +53,18 @@ import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
import org.eclipse.core.runtime.NullProgressMonitor;
|
import org.eclipse.core.runtime.NullProgressMonitor;
|
||||||
import org.eclipse.core.runtime.OperationCanceledException;
|
import org.eclipse.core.runtime.OperationCanceledException;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.variables.IStringVariableManager;
|
||||||
|
import org.eclipse.core.variables.VariablesPlugin;
|
||||||
import org.eclipse.osgi.util.NLS;
|
import org.eclipse.osgi.util.NLS;
|
||||||
|
|
||||||
public class PDOMImporter {
|
public class TeamPDOMImportOperation implements IWorkspaceRunnable {
|
||||||
private static final String CHECKSUMS_NAME = "checksums.dat"; //$NON-NLS-1$
|
static final String CHECKSUMS_NAME = "checksums.dat"; //$NON-NLS-1$
|
||||||
private static final String INDEX_NAME = "cdt-index.pdom"; //$NON-NLS-1$
|
static final String INDEX_NAME = "cdt-index.pdom"; //$NON-NLS-1$
|
||||||
|
private static Pattern PROJECT_VAR_PATTERN= Pattern.compile("\\$\\{(project_[a-zA-Z0-9]*)\\}"); //$NON-NLS-1$
|
||||||
|
private static final String PROJECT_VAR_REPLACEMENT_BEGIN = "\\${$1:"; //$NON-NLS-1$
|
||||||
|
private static final String PROJECT_VAR_REPLACEMENT_END = "}"; //$NON-NLS-1$
|
||||||
|
private static final String DOLLAR_OR_BACKSLASH_REPLACEMENT = "\\\\$0"; //$NON-NLS-1$
|
||||||
|
private static Pattern DOLLAR_OR_BACKSLASH_PATTERN= Pattern.compile("[\\$\\\\]"); //$NON-NLS-1$
|
||||||
|
|
||||||
private static final class FileAndChecksum {
|
private static final class FileAndChecksum {
|
||||||
public ITranslationUnit fFile;
|
public ITranslationUnit fFile;
|
||||||
|
@ -71,51 +80,23 @@ public class PDOMImporter {
|
||||||
private ITranslationUnit[] fTranslationUnitsToUpdate= new ITranslationUnit[0];
|
private ITranslationUnit[] fTranslationUnitsToUpdate= new ITranslationUnit[0];
|
||||||
private boolean fShowActivity;
|
private boolean fShowActivity;
|
||||||
|
|
||||||
public PDOMImporter(ICProject project) {
|
public TeamPDOMImportOperation(ICProject project) {
|
||||||
fProject= project;
|
fProject= project;
|
||||||
fShowActivity= PDOMIndexerTask.checkDebugOption(IPDOMIndexerTask.TRACE_ACTIVITY, "true"); //$NON-NLS-1$
|
fShowActivity= PDOMIndexerTask.checkDebugOption(IPDOMIndexerTask.TRACE_ACTIVITY, "true"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
public void performImport(IProgressMonitor pm) {
|
public void run(IProgressMonitor pm) {
|
||||||
if (fShowActivity) {
|
if (fShowActivity) {
|
||||||
System.out.println("Indexer: PDOMImporter start"); //$NON-NLS-1$
|
System.out.println("Indexer: PDOMImporter start"); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
IPath importLocation= getImportLocation();
|
fSuccess= false;
|
||||||
fSuccess= importIndex(importLocation, pm);
|
|
||||||
if (fShowActivity) {
|
|
||||||
System.out.println("Indexer: PDOMImporter completed, ok=" + fSuccess); //$NON-NLS-1$
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean wasSuccessful() {
|
|
||||||
return fSuccess;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ITranslationUnit[] getTranslationUnitsToUpdate() {
|
|
||||||
return fTranslationUnitsToUpdate;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private IPath getImportLocation() {
|
|
||||||
IProject project= fProject.getProject();
|
|
||||||
String locationString= IndexerPreferences.getIndexImportLocation(project);
|
|
||||||
// mstodo support variables
|
|
||||||
IPath location= new Path(locationString);
|
|
||||||
if (!location.isAbsolute()) {
|
|
||||||
location= project.getLocation().append(location);
|
|
||||||
}
|
|
||||||
return location;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean importIndex(IPath importLocation, IProgressMonitor monitor) {
|
|
||||||
File importFile= importLocation.toFile();
|
|
||||||
if (!importFile.exists()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Exception ex= null;
|
Exception ex= null;
|
||||||
try {
|
try {
|
||||||
doImportIndex(importFile, monitor);
|
File importFile= getImportLocation();
|
||||||
|
if (importFile.exists()) {
|
||||||
|
doImportIndex(importFile, pm);
|
||||||
|
fSuccess= true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e) {
|
catch (InterruptedException e) {
|
||||||
throw new OperationCanceledException();
|
throw new OperationCanceledException();
|
||||||
|
@ -132,11 +113,41 @@ public class PDOMImporter {
|
||||||
|
|
||||||
if (ex != null) {
|
if (ex != null) {
|
||||||
CCorePlugin.log(ex);
|
CCorePlugin.log(ex);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
if (fShowActivity) {
|
||||||
|
System.out.println("Indexer: PDOMImporter completed, ok=" + fSuccess); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean wasSuccessful() {
|
||||||
|
return fSuccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ITranslationUnit[] getTranslationUnitsToUpdate() {
|
||||||
|
return fTranslationUnitsToUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private File getImportLocation() throws CoreException {
|
||||||
|
IProject project= fProject.getProject();
|
||||||
|
String locationString= IndexerPreferences.getIndexImportLocation(project);
|
||||||
|
return expandLocation(project, locationString);
|
||||||
|
}
|
||||||
|
|
||||||
|
static File expandLocation(IProject project, String loc) throws CoreException {
|
||||||
|
String replacement= PROJECT_VAR_REPLACEMENT_BEGIN
|
||||||
|
+ DOLLAR_OR_BACKSLASH_PATTERN.matcher(project.getName()).replaceAll(DOLLAR_OR_BACKSLASH_REPLACEMENT)
|
||||||
|
+ PROJECT_VAR_REPLACEMENT_END;
|
||||||
|
|
||||||
|
loc= PROJECT_VAR_PATTERN.matcher(loc).replaceAll(replacement);
|
||||||
|
IStringVariableManager varManager= VariablesPlugin.getDefault().getStringVariableManager();
|
||||||
|
IPath location= new Path(varManager.performStringSubstitution(loc));
|
||||||
|
if (!location.isAbsolute()) {
|
||||||
|
location= project.getLocation().append(location);
|
||||||
|
}
|
||||||
|
return location.toFile();
|
||||||
|
}
|
||||||
|
|
||||||
private void doImportIndex(File importFile, IProgressMonitor monitor) throws CoreException, InterruptedException, IOException {
|
private void doImportIndex(File importFile, IProgressMonitor monitor) throws CoreException, InterruptedException, IOException {
|
||||||
ZipFile zip= new ZipFile(importFile);
|
ZipFile zip= new ZipFile(importFile);
|
||||||
Map checksums= null;
|
Map checksums= null;
|
|
@ -111,10 +111,10 @@ public class WritablePDOM extends PDOM implements IWritableIndexFragment {
|
||||||
String internalFormat = newConverter.toInternalFormat(file.getLocation());
|
String internalFormat = newConverter.toInternalFormat(file.getLocation());
|
||||||
if(internalFormat!=null) {
|
if(internalFormat!=null) {
|
||||||
file.setInternalLocation(internalFormat);
|
file.setInternalLocation(internalFormat);
|
||||||
|
getFileIndex().insert(file.getRecord());
|
||||||
} else {
|
} else {
|
||||||
notConverted.add(file);
|
notConverted.add(file);
|
||||||
}
|
}
|
||||||
getFileIndex().insert(file.getRecord());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return notConverted;
|
return notConverted;
|
||||||
|
|
|
@ -16,3 +16,8 @@ PDOMManager_notifyTask_message=Notify Listeners
|
||||||
PDOMManager_indexMonitorDetail={0}/{1} sources, {2} headers
|
PDOMManager_indexMonitorDetail={0}/{1} sources, {2} headers
|
||||||
PDOMManager_ExistingFileCollides=A pdom already exists at location {0}
|
PDOMManager_ExistingFileCollides=A pdom already exists at location {0}
|
||||||
Checksums_taskComputeChecksums=Computing checksums
|
Checksums_taskComputeChecksums=Computing checksums
|
||||||
|
TeamPDOMExportOperation_errorCreatingTempFile=Cannot create temp file
|
||||||
|
TeamPDOMExportOperation_taskExportIndex=Export team shared index
|
||||||
|
TeamPDOMExportOperation_subtaskCreateDatabase=Creating database
|
||||||
|
TeamPDOMExportOperation_errorWriteTempFile=Cannot write to temporary file
|
||||||
|
TeamPDOMExportOperation_errorCreateArchive=Error creating archive
|
||||||
|
|
Loading…
Add table
Reference in a new issue