/*******************************************************************************
* Copyright (c) 2011, 2016 Red Hat Inc..
* 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:
* Red Hat Incorporated - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rdt.proxy;
import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.linuxtools.profiling.launch.IRemoteCommandLauncher;
import org.eclipse.linuxtools.profiling.launch.IRemoteEnvProxyManager;
import org.eclipse.linuxtools.profiling.launch.IRemoteFileProxy;
import org.eclipse.remote.core.IRemoteConnection;
import org.eclipse.remote.core.IRemoteConnectionType;
import org.eclipse.remote.core.IRemoteProcessService;
import org.eclipse.remote.core.IRemoteServicesManager;
import org.eclipse.remote.core.exception.RemoteConnectionException;
public class RDTProxyManager implements IRemoteEnvProxyManager {
public static final String SYNC_NATURE = "org.eclipse.ptp.rdt.sync.core.remoteSyncNature"; //$NON-NLS-1$
@Override
public IRemoteFileProxy getFileProxy(URI uri) throws CoreException {
return new RDTFileProxy(uri);
}
@Override
public IRemoteFileProxy getFileProxy(IProject project) throws CoreException {
return new RDTFileProxy(project);
}
@Override
public IRemoteCommandLauncher getLauncher(URI uri) {
return new RDTCommandLauncher(uri);
}
@Override
public IRemoteCommandLauncher getLauncher(IProject project) {
return new RDTCommandLauncher(project);
}
@Override
public String getOS(URI uri) {
IRemoteConnection connection = getConnection(uri);
String os = connection.getProperty(IRemoteConnection.OS_NAME_PROPERTY);
if (os == null || os.isEmpty()) {
//FIXME: need better way to get this property
return "Linux"; //$NON-NLS-1$
}
return os;
}
@Override
public String getOS(IProject project) {
URI uri = project.getLocationURI();
return getOS(uri);
}
@Override
public Map<String, String> getEnv(URI uri) {
IRemoteConnection connection = getConnection(uri);
if(!connection.isOpen()) {
try {
connection.open(null);
} catch (RemoteConnectionException e) {
Status status = new Status(IStatus.ERROR, e.getMessage(), Activator.PLUGIN_ID);
Activator.getDefault().getLog().log(status);
return Collections.emptyMap();
}
}
/*
* It is common to export functions declaration in the environment so
* this pattern filters out them because they get truncated and might
* end up on failure. When a function is exported it makes a mess in ENV
* and none of LT plugins working remotely because they are not find on
* path.
*
* Patterns added in the env list:
* var=value
* i.e: SHELL=/bin/bash
*
* Patterns not added in the env list:
* var=() { foo
* i.e: BASH_FUNC_module()=() { eval `/usr/bin/modulecmd bash $*`, }
*/
Pattern variablePattern = Pattern.compile("^(.+)=([^\\(\\)\\s{].*|)$"); //$NON-NLS-1$
Matcher m;
Map<String, String> envMap = new HashMap<>();
IRemoteProcessService ps = connection.getService(IRemoteProcessService.class);
Map<String, String> envTemp = ps.getEnv();
for (Map.Entry<String, String> entry : envTemp.entrySet()) {
String env = entry.getKey() + '=' + entry.getValue();
m = variablePattern.matcher(env);
if (m.matches()) {
envMap.put(entry.getKey(), entry.getValue());
}
}
return envMap;
}
@Override
public Map<String, String> getEnv(IProject project) {
URI uri = project.getLocationURI();
return getEnv(uri);
}
/**
* Get the remote connection
*
* @param uri any valid URI to remote
* @return a remote connection
*
* @since 1.2
*/
public static IRemoteConnection getConnection(URI uri) {
IRemoteServicesManager sm = Activator.getService(IRemoteServicesManager.class);
IRemoteConnectionType ct = sm.getConnectionType(uri);
return ct.getConnection(uri);
}
}