| /******************************************************************************* |
| * Copyright (c) 2009 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.rdt.managedbuilder.xlc.ui; |
| |
| import java.util.HashMap; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.cdt.managedbuilder.internal.envvar.BuildEnvVar; |
| import org.eclipse.cdt.managedbuilder.core.IManagedProject; |
| import org.eclipse.cdt.managedbuilder.envvar.IBuildEnvironmentVariable; |
| import org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider; |
| import org.eclipse.cdt.managedbuilder.envvar.IProjectEnvironmentVariableSupplier; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.ptp.rdt.core.RDTLog; |
| import org.eclipse.ptp.rdt.core.serviceproviders.IRemoteExecutionServiceProvider; |
| import org.eclipse.ptp.rdt.core.services.IRDTServiceConstants; |
| import org.eclipse.ptp.rdt.services.core.IService; |
| import org.eclipse.ptp.rdt.services.core.IServiceConfiguration; |
| import org.eclipse.ptp.rdt.services.core.IServiceProvider; |
| import org.eclipse.ptp.rdt.services.core.ProjectNotConfiguredException; |
| import org.eclipse.ptp.rdt.services.core.ServiceModelManager; |
| import org.eclipse.ptp.remote.core.IRemoteConnection; |
| import org.eclipse.ptp.remote.core.IRemoteProcessBuilder; |
| import org.eclipse.ptp.remote.core.IRemoteServices; |
| import org.eclipse.ptp.remote.core.exception.RemoteConnectionException; |
| |
| /** |
| * Supplies environment variables from the remote system. |
| * |
| * @author crecoskie |
| * |
| */ |
| @SuppressWarnings("restriction") |
| public class RemoteProjectEnvironmentSupplier implements |
| IProjectEnvironmentVariableSupplier { |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.envvar.IProjectEnvironmentVariableSupplier#getVariable(java.lang.String, org.eclipse.cdt.managedbuilder.core.IManagedProject, org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider) |
| */ |
| public IBuildEnvironmentVariable getVariable(String variableName, |
| IManagedProject project, IEnvironmentVariableProvider provider) { |
| Map<String, String> envMap = getRemoteEnvironment(project); |
| String value = envMap.get(variableName) == null ? new String() : envMap.get(variableName); |
| IBuildEnvironmentVariable envVar = new BuildEnvVar(variableName, value); |
| return envVar; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.cdt.managedbuilder.envvar.IProjectEnvironmentVariableSupplier#getVariables(org.eclipse.cdt.managedbuilder.core.IManagedProject, org.eclipse.cdt.managedbuilder.envvar.IEnvironmentVariableProvider) |
| */ |
| public IBuildEnvironmentVariable[] getVariables(IManagedProject project, |
| IEnvironmentVariableProvider provider) { |
| |
| List<IBuildEnvironmentVariable> vars = new LinkedList<IBuildEnvironmentVariable>(); |
| Map<String, String> remoteEnvMap = null; |
| |
| remoteEnvMap = getRemoteEnvironment(project); |
| |
| if (remoteEnvMap != null) { |
| for (String var : remoteEnvMap.keySet()) { |
| String value = remoteEnvMap.get(var); |
| |
| IBuildEnvironmentVariable buildEnvVar = new BuildEnvVar(var, |
| value); |
| vars.add(buildEnvVar); |
| } |
| |
| return vars.toArray(new IBuildEnvironmentVariable[0]); |
| } |
| |
| else |
| return new IBuildEnvironmentVariable[0]; |
| |
| } |
| |
| /** |
| * @param project |
| * @param remoteEnvMap |
| * @return |
| */ |
| private Map<String, String> getRemoteEnvironment(IManagedProject project) { |
| IProject iProj = (IProject) project.getOwner(); |
| Map<String, String> remoteEnvMap = new HashMap<String, String>(); |
| |
| ServiceModelManager smm = ServiceModelManager.getInstance(); |
| |
| try { |
| IServiceConfiguration serviceConfig = smm |
| .getActiveConfiguration(iProj); |
| IService buildService = smm |
| .getService(IRDTServiceConstants.SERVICE_BUILD); |
| IServiceProvider serviceProvider = serviceConfig |
| .getServiceProvider(buildService); |
| IRemoteExecutionServiceProvider executionProvider = null; |
| if (serviceProvider instanceof IRemoteExecutionServiceProvider) { |
| executionProvider = (IRemoteExecutionServiceProvider) serviceProvider; |
| } |
| |
| if (executionProvider != null) { |
| |
| IRemoteServices remoteServices = executionProvider |
| .getRemoteServices(); |
| |
| IRemoteConnection connection = executionProvider |
| .getConnection(); |
| |
| if (!connection.isOpen()) { |
| try { |
| connection.open(null); |
| } catch (RemoteConnectionException e) { |
| RDTLog.logError(e); |
| } |
| } |
| |
| List<String> command = new LinkedList<String>(); |
| |
| IRemoteProcessBuilder processBuilder = remoteServices |
| .getProcessBuilder(connection, command); |
| |
| remoteEnvMap = processBuilder.environment(); |
| |
| } |
| } catch (ProjectNotConfiguredException e) { |
| // We can get here when the environment supplier is called during |
| // project creation, since the service model is not yet setup. |
| // Swallow the error. |
| } |
| return remoteEnvMap; |
| } |
| } |
| |
| |