package org.csstudio.dal.simple.impl; import org.apache.log4j.Logger; import org.csstudio.dal.CharacteristicInfo; import org.csstudio.dal.DataExchangeException; import org.csstudio.dal.DynamicValueProperty; import org.csstudio.dal.Response; import org.csstudio.dal.Timestamp; import org.csstudio.dal.impl.ResponseImpl; import org.csstudio.dal.simple.AnyData; import org.csstudio.dal.simple.AnyDataChannel; import org.csstudio.dal.simple.MetaData; import org.csstudio.dal.simple.Severity; public abstract class AbstractAnyDataImpl<T> implements AnyData { private final DynamicValueProperty<T> property; protected final Response<T> response; private MetaData metaData; private long beamID; public AbstractAnyDataImpl(DynamicValueProperty<T> property, long beamID) { this.property = property; T latestReceivedValue = this.property.getLatestReceivedValue(); T confirmValue = confirmValue(latestReceivedValue); response = new ResponseImpl<T>(property, null, confirmValue, "value", false, null, property.getCondition(), null, true); if (property.isMetaDataInitialized()) { metaData = extractMetaData(); } else { metaData = MetaDataImpl.createUninitializedMetaData(); } this.beamID=beamID; } protected abstract T confirmValue(T value); @Override public long getBeamID() { return beamID; } @Override public AnyDataChannel getParentChannel() { return property; } @Override public DynamicValueProperty<?> getParentProperty() { return property; } @Override public MetaData getMetaData() { // TODO if MetaData changes this is how it could be reset // if (metaData == null) { // metaData = extractMetaData(); // } return metaData; } @Override public Quality getQuality() { return Quality.Original; } @Override public Severity getSeverity() { return response.getCondition(); } @Override public String getStatus() { return DynamicValueConditionConverterUtil.extractStatusInfo(response.getCondition()); } @Override public Timestamp getTimestamp() { return DynamicValueConditionConverterUtil.extractTimestampInfo(response.getCondition()); } @Override public boolean isValid() { // TODO other option: response.getCondition().hasValue() return response.getError() == null; } private MetaData extractMetaData() { try { return (MetaData) property.getCharacteristic(CharacteristicInfo.C_META_DATA.getName()); } catch (DataExchangeException e) { Logger.getLogger(this.getClass()).error("Metadata extraction failed.", e); return null; } } }