package org.csstudio.sds.internal.connection;
import org.csstudio.dal.DataExchangeException;
import org.csstudio.dal.simple.AnyData;
import org.csstudio.dal.simple.AnyDataChannel;
import org.csstudio.dal.simple.ChannelListener;
import org.csstudio.platform.model.pvs.ValueType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SinglePropertyReadConnector implements ChannelListener {
private final ChannelInputProcessor channelInputProcessor;
private final ValueType valueType;
private org.csstudio.dal.context.ConnectionState latestConnectionState;
private final String characteristic;
private static final Logger LOG = LoggerFactory.getLogger(SinglePropertyReadConnector.class);
public SinglePropertyReadConnector(final ChannelInputProcessor channelInputProcessor, final ValueType valueType, final String characteristic) {
assert channelInputProcessor != null;
assert valueType != null;
this.channelInputProcessor = channelInputProcessor;
this.valueType = valueType;
this.characteristic = characteristic;
}
/**
*{@inheritDoc}
*/
@Override
public void channelDataUpdate(final AnyDataChannel channel) {
if (characteristic != null) {
try {
// FIXME: 26.03.2010: swende: asynchrones Abgreifen der Characteristics bzw. anderen Weg bei Igor erfragen!
final Object cc = channel.getProperty().getCharacteristic(characteristic);
// Changed 24.10.2011 HRickens: give the DynamicValueCondition as value not the String representation
channelInputProcessor.valueChanged(cc);
} catch (final DataExchangeException e) {
LOG.error(e.toString());
}
}
else {
final AnyData data = channel.getData();
if (data.isValid())
channelInputProcessor.valueChanged(getTypesafeValue(data));
}
}
/**
*{@inheritDoc}
*/
@Override
public void channelStateUpdate(final AnyDataChannel channel) {
final org.csstudio.dal.context.ConnectionState state = channel.getProperty().getConnectionState();
if (latestConnectionState != state) {
latestConnectionState = state;
channelInputProcessor.connectionStateChanged(latestConnectionState);
}
}
private Object getTypesafeValue(final AnyData data) {
assert data != null;
assert data.isValid();
/*
* TODO 30.06.2010 (hrickens) Der Workaround wird jetzt in der Klassse
* {@link ConnectionUtilNew#connectDynamizedProperties} behandelt.
* TODO workaround until Enum data type is introduced
*/
switch (valueType) {
case ENUM:
return data.anyValue();
case DOUBLE:
return data.doubleValue();
case DOUBLE_SEQUENCE:
return data.doubleSeqValue();
case LONG:
return data.longValue();
case LONG_SEQUENCE:
return data.longSeqValue();
case OBJECT:
return data.anyValue();
case OBJECT_SEQUENCE:
return data.anySeqValue();
case STRING:
return data.stringValue();
case STRING_SEQUENCE:
return data.stringSeqValue();
default:
throw new IllegalArgumentException("Unsupported value type. Please complete switch statement.");
}
}
}