blob: 934d1b34b76e886e8b4a809bcdd140215f30ddd1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.internal.rdt.core.serviceproviders;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import org.eclipse.cdt.core.index.IIndexFileLocation;
import org.eclipse.cdt.core.index.IndexLocationFactory;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceReference;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ptp.internal.rdt.core.RemoteIndexerInfoProviderFactory;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IIncludeBrowserService;
import org.eclipse.ptp.internal.rdt.core.includebrowser.IncludeBrowserServiceFactory;
import org.eclipse.ptp.internal.rdt.core.index.RemoteFastIndexer;
import org.eclipse.ptp.internal.rdt.core.model.ModelAdapter;
import org.eclipse.ptp.internal.rdt.core.model.Scope;
import org.eclipse.ptp.internal.rdt.core.model.TranslationUnit;
import org.eclipse.ptp.internal.rdt.core.model.WorkingCopy;
import org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem;
import org.eclipse.ptp.rdt.core.RDTLog;
import org.eclipse.rse.core.subsystems.IConnectorService;
import org.eclipse.rse.core.subsystems.ISubSystem;
public class AbstractRemoteService {
protected IConnectorService fConnectorService;
protected ICIndexSubsystem fIndexSubsystem;
public AbstractRemoteService(ICIndexSubsystem subSystem) {
fIndexSubsystem = subSystem;
}
public AbstractRemoteService(IConnectorService connectorService) {
fConnectorService = connectorService;
}
protected ICIndexSubsystem getSubSystem() {
if (fIndexSubsystem == null) {
if (fConnectorService != null) {
ISubSystem[] subSystems = fConnectorService.getSubSystems();
for (int k = 0; k < subSystems.length; k++) {
if (subSystems[k] instanceof ICIndexSubsystem)
fIndexSubsystem = (ICIndexSubsystem) subSystems[k];
}
}
}
return fIndexSubsystem;
}
protected ITranslationUnit adaptWorkingCopy(IWorkingCopy workingCopy) throws CModelException {
ITranslationUnit unit;
if (workingCopy.isConsistent()) {
unit = ModelAdapter.adaptElement(null, workingCopy, 0, true);
} else {
String contents = new String (workingCopy.getContents());
unit = new WorkingCopy(null, workingCopy, contents);
}
if (unit instanceof TranslationUnit) {
// can't trust getting a resource from adapted C elements
IResource resource = workingCopy.getResource(); //might be null if it is a remote TU
ICProject project = workingCopy.getCProject();
IProject rproject = project.getProject();
IResource infoResource = resource != null ? resource : rproject;
IScannerInfo scannerInfo = RemoteIndexerInfoProviderFactory.getScannerInfo(infoResource);
Map<String,String> langaugeProperties = null;
try {
String languageId = unit.getLanguage().getId();
langaugeProperties = RemoteIndexerInfoProviderFactory.getLanguageProperties(languageId, rproject);
} catch(Exception e) {
RDTLog.logError(e);
}
((TranslationUnit) unit).setASTContext(scannerInfo, langaugeProperties);
}
return unit;
}
public boolean isIndexed(ICElement element, IProgressMonitor monitor) {
if (element instanceof ISourceReference)
{
ISourceReference sf = ((ISourceReference)element);
ITranslationUnit tu= sf.getTranslationUnit();
if (tu != null)
{
IIndexFileLocation location= IndexLocationFactory.getIFL(tu);
if (location != null)
{
ICProject project = element.getCProject();
ICIndexSubsystem subsystem = getSubSystem();
return subsystem.isIndexed(Scope.WORKSPACE_ROOT_SCOPE, location, monitor);
}
}
}
return false;
}
private static AtomicBoolean showingDialog = new AtomicBoolean(false);
public static void setshowingDialog(){
showingDialog = new AtomicBoolean(false);
}
public void promptUserIfNoIndexed(ICElement element, IProgressMonitor monitor){
}
}