/*
* Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
*
* THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
* WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
* IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
* CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
* NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
* DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
* THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
* USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
* PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
* AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
package org.csstudio.platform.internal.simpledal.local;
import org.csstudio.dal.Timestamp;
import org.csstudio.platform.ExecutionService;
import org.csstudio.platform.internal.simpledal.AbstractConnector;
import org.csstudio.platform.internal.simpledal.converters.ConverterUtil;
import org.csstudio.platform.model.pvs.IProcessVariableAddress;
import org.csstudio.platform.model.pvs.ValueType;
import org.csstudio.platform.simpledal.ConnectionState;
import org.csstudio.platform.simpledal.IProcessVariableValueListener;
import org.csstudio.platform.simpledal.IProcessVariableWriteListener;
import org.csstudio.platform.simpledal.SettableState;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Local Connectors are connected to a simulated channels that live in the local
* JVM.
*
* See {@link LocalChannelPool}.
*
* @author Sven Wende
*
*/
@SuppressWarnings("unchecked")
public class LocalConnector extends AbstractConnector implements ILocalChannelListener {
private static final Logger LOG = LoggerFactory.getLogger(LocalConnector.class);
/**
* Constructor.
*/
public LocalConnector(IProcessVariableAddress pvAddress, ValueType valueType) {
super(pvAddress, valueType);
assert valueType != null;
}
/**
* {@inheritDoc}
*/
@Override
public void valueChanged(Object value) {
doForwardValue(value, new Timestamp());
}
/**
* {@inheritDoc}
*/
@Override
protected void doGetValueAsynchronously(final IProcessVariableValueListener listener) {
Runnable r = new Runnable() {
@Override
public void run() {
Object value = LocalChannelPool.getInstance().getChannel(getProcessVariableAddress(), getValueType()).getValue();
try {
listener.valueChanged(ConverterUtil.convert(value, getValueType()), new Timestamp());
}catch(NumberFormatException nfe) {
LOG.warn(nfe.toString());
}
}
};
ExecutionService.getInstance().executeWithNormalPriority(r);
}
/**
* {@inheritDoc}
*/
@Override
protected Object doGetValueSynchronously() {
Object value = LocalChannelPool.getInstance().getChannel(getProcessVariableAddress(), getValueType()).getValue();
return value;
}
/**
* {@inheritDoc}
*/
@Override
protected void doGetCharacteristicAsynchronously(String characteristicId, ValueType valueType, IProcessVariableValueListener listener)
throws Exception {
doGetValueAsynchronously(listener);
}
/**
* {@inheritDoc}
*/
@Override
protected Object doGetCharacteristicSynchronously(String characteristicId, ValueType valueType) throws Exception {
return doGetValueSynchronously();
}
/**
* {@inheritDoc}
*/
@Override
protected void doSetValueAsynchronously(final Object value, final IProcessVariableWriteListener listener) {
Runnable r = new Runnable() {
@Override
public void run() {
LocalChannelPool.getInstance().getChannel(getProcessVariableAddress(), getValueType()).setValue(value);
if (listener != null) {
listener.success();
}
}
};
ExecutionService.getInstance().executeWithNormalPriority(r);
}
/**
* {@inheritDoc}
*/
@Override
protected boolean doSetValueSynchronously(Object value) {
LocalChannelPool.getInstance().getChannel(getProcessVariableAddress(), getValueType()).setValue(value);
return true;
}
/**
* {@inheritDoc}
*/
@Override
protected void doInit() {
LocalChannelPool.getInstance().getChannel(getProcessVariableAddress(), getValueType()).addListener(this);
forwardConnectionState(ConnectionState.CONNECTED);
}
/**
* {@inheritDoc}
*/
@Override
protected void doDispose() {
LocalChannelPool.getInstance().getChannel(getProcessVariableAddress(), getValueType()).removeListener(this);
}
/**
* {@inheritDoc}
*/
@Override
protected SettableState doIsSettable() {
return SettableState.SETTABLE;
}
}