package org.marketcetera.photon.internal.strategy.engine.sa.ui;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.databinding.Binding;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.marketcetera.photon.commons.ui.databinding.DataBindingUtils;
import org.marketcetera.photon.commons.ui.databinding.ObservingComposite;
import org.marketcetera.photon.commons.ui.databinding.RequiredFieldSupport;
import org.marketcetera.photon.commons.ui.databinding.UpdateStrategyFactory;
import org.marketcetera.photon.strategy.engine.model.core.ConnectionState;
import org.marketcetera.photon.strategy.engine.model.sa.StrategyAgentEngine;
import org.marketcetera.photon.strategy.engine.model.sa.StrategyAgentEnginePackage;
import org.marketcetera.util.misc.ClassVersion;
/* $License$ */
/**
* A control for capturing remote strategy engine connection parameters.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: StrategyAgentConnectionComposite.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
@ClassVersion("$Id: StrategyAgentConnectionComposite.java 16154 2012-07-14 16:34:05Z colin $")
public class StrategyAgentConnectionComposite extends ObservingComposite {
/**
* Constructor.
*
* @param parent
* parent composite in which to create the widgets
* @param engine
* the model to bind to the control
*/
public StrategyAgentConnectionComposite(Composite parent,
DataBindingContext dataBindingContext,
final StrategyAgentEngine engine) {
super(parent);
GridLayoutFactory.swtDefaults().spacing(10, 5).numColumns(2).applyTo(
this);
int textStyle;
if (engine.getConnectionState() == ConnectionState.DISCONNECTED) {
textStyle = SWT.BORDER;
} else {
textStyle = SWT.READ_ONLY;
Label label = new Label(this, SWT.WRAP);
label
.setText(Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_READ_ONLY__LABEL
.getText());
GridDataFactory.defaultsFor(label).span(2, 1).applyTo(label);
}
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_JMSURL.createLabel(this);
{
Text urlText = new Text(this, textStyle);
GridDataFactory.swtDefaults().align(SWT.LEFT, SWT.CENTER).hint(180,
SWT.DEFAULT).applyTo(urlText);
final ISWTObservableValue target = SWTObservables.observeText(
urlText, SWT.Modify);
Binding binding = dataBindingContext
.bindValue(
target,
DataBindingUtils
.observeAndTrack(
getObservablesManager(),
engine,
StrategyAgentEnginePackage.Literals.STRATEGY_AGENT_ENGINE__JMS_URL),
UpdateStrategyFactory
.createEMFUpdateValueStrategyWithEmptyStringToNull()
.setBeforeSetValidator(new IValidator() {
@Override
public IStatus validate(Object value) {
final String string = (String) value;
if (StringUtils.isEmpty(string)) {
// return ok here so
// RequiredFieldSupport kicks in
return ValidationStatus.ok();
}
try {
new URI(string);
} catch (URISyntaxException e) {
return ValidationStatus
.error(
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_INVALID_JMSURL
.getText(),
e);
}
return ValidationStatus.ok();
}
}), null);
RequiredFieldSupport.initFor(dataBindingContext, target,
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_JMSURL
.getRawLabel(), true, binding);
}
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_HOSTNAME.createLabel(this);
{
Text hostnameText = new Text(this, textStyle);
GridDataFactory.swtDefaults().align(SWT.LEFT, SWT.CENTER).hint(180,
SWT.DEFAULT).applyTo(hostnameText);
DataBindingUtils
.bindRequiredField(
dataBindingContext,
SWTObservables
.observeText(hostnameText, SWT.Modify),
DataBindingUtils
.observeAndTrack(
getObservablesManager(),
engine,
StrategyAgentEnginePackage.Literals.STRATEGY_AGENT_ENGINE__WEB_SERVICE_HOSTNAME),
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_HOSTNAME
.getRawLabel());
}
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_PORT.createLabel(this);
{
Text portText = new Text(this, textStyle);
GridDataFactory.swtDefaults().align(SWT.LEFT, SWT.CENTER).hint(180,
SWT.DEFAULT).applyTo(portText);
final IObservableValue target = SWTObservables.observeText(
portText, SWT.Modify);
Binding binding = dataBindingContext
.bindValue(
target,
DataBindingUtils
.observeAndTrack(
getObservablesManager(),
engine,
StrategyAgentEnginePackage.Literals.STRATEGY_AGENT_ENGINE__WEB_SERVICE_PORT),
UpdateStrategyFactory
.withConvertErrorMessage(
UpdateStrategyFactory
.createEMFUpdateValueStrategyWithEmptyStringToNull(),
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_INVALID_PORT
.getText())
.setAfterConvertValidator(new IValidator() {
@Override
public IStatus validate(Object value) {
if (value == null) {
// return ok here so
// RequiredFieldSupport kicks in
return ValidationStatus.ok();
}
int intValue = (Integer) value;
if (intValue < 1
|| intValue > 65535) {
return ValidationStatus
.error(Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_INVALID_PORT
.getText());
}
return ValidationStatus.ok();
}
}), new EMFUpdateValueStrategy());
RequiredFieldSupport.initFor(dataBindingContext, target,
Messages.STRATEGY_AGENT_CONNECTION_COMPOSITE_PORT
.getRawLabel(), true, binding);
}
}
}