/*******************************************************************************
* Copyright (c) 2012, 2014 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.tcf.te.launch.core.bindings.internal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.expressions.EvaluationContext;
import org.eclipse.core.expressions.EvaluationResult;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.tcf.te.launch.core.activator.CoreBundleActivator;
import org.eclipse.tcf.te.launch.core.selection.interfaces.ILaunchSelection;
import org.eclipse.tcf.te.launch.core.selection.interfaces.ISelectionContext;
/**
* Launch configuration type unbinding implementation.
*/
public class LaunchConfigTypeUnBinding {
// The launch configuration type id
private final String typeId;
// The list of enablement expressions
private final List<Expression> expressions = new ArrayList<Expression>();
/**
* Constructor.
*
* @param typeId The launch configuration type id the unbinding applies to. Must not be
* <code>null</code>.
*/
public LaunchConfigTypeUnBinding(String typeId) {
Assert.isNotNull(typeId);
this.typeId = typeId;
}
/**
* Returns the launch configuration type id the unbinding applies to.
*
* @return The launch configuration type id.
*/
public String getTypeId() {
return typeId;
}
/**
* Adds the given enablement expression.
*
* @param enablement The enablement expression. Must not be <code>null</code>.
*/
public void addEnablement(Expression expression) {
Assert.isNotNull(expression);
if (!expressions.contains(expression)) {
expressions.add(expression);
}
}
/**
* Evaluates the enablement expressions with the given launch selection.
*
* @param selection The launch selection. Must not be <code>null</code>.
* @return The result of the enablement expression evaluation.
*/
public EvaluationResult validate(ILaunchSelection selection) {
Assert.isNotNull(selection);
EvaluationResult result = EvaluationResult.NOT_LOADED;
EvaluationResult valresult;
for (ISelectionContext context : selection.getSelectedContexts()) {
if (context.isPreferredContext()) {
valresult = validate(selection.getLaunchMode(), context);
if (valresult == EvaluationResult.FALSE) {
return EvaluationResult.FALSE;
}
else if (valresult != EvaluationResult.NOT_LOADED) {
result = valresult;
}
}
}
return result;
}
/**
* Evaluates the enablement expressions with the given launch mode and selection context.
*
* @param mode The launch mode. Must not be <code>null</code>.
* @param context The launch selection context or <code>null</code>.
*
* @return The result of the enablement expression evaluation.
*/
public EvaluationResult validate(String mode, ISelectionContext context) {
EvaluationResult result = context.isPreferredContext() ? EvaluationResult.FALSE : EvaluationResult.NOT_LOADED;
if (expressions.isEmpty()) {
return EvaluationResult.TRUE;
}
EvaluationResult valresult;
for (Expression expression : expressions) {
// Set the default variable and "selection" is the selection context
EvaluationContext evalContext = new EvaluationContext(null, context);
evalContext.addVariable("context", context.getContext()); //$NON-NLS-1$
evalContext.addVariable("selection", context.getSelections() != null ? Arrays.asList(context.getSelections()) : Collections.EMPTY_LIST); //$NON-NLS-1$
evalContext.addVariable("type", context.getType() != null ? context.getType() : ""); //$NON-NLS-1$ //$NON-NLS-2$
evalContext.addVariable("mode", mode != null ? mode : ""); //$NON-NLS-1$ //$NON-NLS-2$
// Allow plugin activation
evalContext.setAllowPluginActivation(true);
// Evaluate the expression
try {
valresult = expression.evaluate(evalContext);
} catch (CoreException e) {
valresult = EvaluationResult.FALSE;
if (Platform.inDebugMode()) {
IStatus status = new Status(IStatus.ERROR, CoreBundleActivator.getUniqueIdentifier(), e.getLocalizedMessage(), e);
Platform.getLog(CoreBundleActivator.getContext().getBundle()).log(status);
}
}
if (valresult == EvaluationResult.TRUE) {
return EvaluationResult.TRUE;
}
if (valresult != EvaluationResult.NOT_LOADED) {
result = valresult;
}
}
return result;
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuffer toString = new StringBuffer();
toString.append("LaunchConfigTypeUnBinding("); //$NON-NLS-1$
toString.append(typeId);
toString.append(")"); //$NON-NLS-1$
return toString.toString();
}
}