/*
* Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
* 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.dal.impl;
import org.csstudio.dal.DataAccess;
import org.csstudio.dal.DataExchangeException;
import org.csstudio.dal.DynamicValueEvent;
import org.csstudio.dal.DynamicValueListener;
import org.csstudio.dal.SimpleProperty;
import com.cosylab.util.ListenerList;
public abstract class AbstractDataAccessWrapper<T> implements DataAccess<T>
{
protected static final int UNKNOWN = -1;
protected DataAccess sourceDA;
protected Class<T> valClass;
private ListenerList dvListeners;
//protected T lastValue;
protected int conversion = UNKNOWN;
public class DADynamicValueListener implements DynamicValueListener
{
private void fireEvent(DynamicValueEvent event, int id)
{
if (!hasDynamicValueListeners()) {
return;
}
//this event violates generics usage - Property is of different type than
//value
DynamicValueEvent newEvent =
new DynamicValueEvent(
AbstractDataAccessWrapper.this,
event.getProperty(),
convertFromOriginal(event.getValue(),
(DataAccess)event.getSource()), event.getCondition(),
event.getTimestamp(), event.getMessage(), event.getError(),
event.getEventID());
DynamicValueListener<T, SimpleProperty<T>>[] listeners = (DynamicValueListener<T, SimpleProperty<T>>[])getDvListeners()
.toArray();
for (int i = 0; i < listeners.length; i++) {
switch (id) {
case 0:
listeners[i].valueUpdated(newEvent);
//lastValue = (T)newEvent.getValue();
break;
case 1:
listeners[i].valueChanged(newEvent);
//lastValue = (T)newEvent.getValue();
break;
case 2:
listeners[i].timeoutStarts(newEvent);
break;
case 3:
listeners[i].timeoutStops(newEvent);
break;
case 4:
listeners[i].timelagStarts(newEvent);
break;
case 5:
listeners[i].timelagStops(newEvent);
break;
case 6:
listeners[i].errorResponse(newEvent);
break;
case 7:
listeners[i].conditionChange(newEvent);
break;
}
}
}
@Override
public void valueUpdated(DynamicValueEvent event)
{
fireEvent(event, 0);
}
@Override
public void valueChanged(DynamicValueEvent event)
{
fireEvent(event, 1);
}
@Override
public void timeoutStarts(DynamicValueEvent event)
{
fireEvent(event, 2);
}
@Override
public void timeoutStops(DynamicValueEvent event)
{
fireEvent(event, 3);
}
@Override
public void timelagStarts(DynamicValueEvent event)
{
fireEvent(event, 4);
}
@Override
public void timelagStops(DynamicValueEvent event)
{
fireEvent(event, 5);
}
@Override
public void errorResponse(DynamicValueEvent event)
{
fireEvent(event, 6);
}
@Override
public void conditionChange(DynamicValueEvent event)
{
fireEvent(event, 7);
}
}
public AbstractDataAccessWrapper(Class<T> valClass, DataAccess sourceDA)
{
this.sourceDA = sourceDA;
this.valClass = valClass;
conversion = getConversion();
if (conversion == UNKNOWN) {
throw new IllegalArgumentException();
}
sourceDA.addDynamicValueListener(new DADynamicValueListener());
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#addDynamicValueListener(org.csstudio.dal.DynamicValueListener)
*/
@Override
public <P extends SimpleProperty<T>> void addDynamicValueListener(DynamicValueListener<T, P> l)
{
getDvListeners().add(l);
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#removeDynamicValueListener(org.csstudio.dal.DynamicValueListener)
*/
@Override
public <P extends SimpleProperty<T>> void removeDynamicValueListener(DynamicValueListener<T, P> l)
{
getDvListeners().remove(l);
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#getDynamicValueListeners()
*/
@Override
public DynamicValueListener<T, SimpleProperty<T>>[] getDynamicValueListeners()
{
if (hasDynamicValueListeners()) {
return (DynamicValueListener<T, SimpleProperty<T>>[])
getDvListeners().toArray(
new DynamicValueListener[getDvListeners().size()]);
}
return new DynamicValueListener[0];
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#getDataType()
*/
@Override
public Class<T> getDataType()
{
return valClass;
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#isSettable()
*/
@Override
public boolean isSettable()
{
return sourceDA.isSettable();
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#setValue(java.lang.Object)
*/
@Override
public void setValue(T value) throws DataExchangeException
{
Object newVal = convertToOriginal(value, sourceDA);
if (newVal != null) {
sourceDA.setValue(newVal);
}
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#getValue()
*/
@Override
public T getValue() throws DataExchangeException
{
T value = convertFromOriginal(sourceDA.getValue(), sourceDA);
if (value != null) {
return value;
}
return null;
}
/*
* (non-Javadoc)
* @see org.csstudio.dal.DataAccess#getLatestReceivedValue()
*/
@Override
public T getLatestReceivedValue()
{
T value = convertFromOriginal(sourceDA.getLatestReceivedValue(), sourceDA);
if (value != null) {
return value;
}
return null;
}
protected abstract int getConversion();
protected abstract Object convertToOriginal(T value,
DataAccess dataAccess);
protected abstract T convertFromOriginal(Object value,
DataAccess dataAccess);
protected ListenerList getDvListeners() {
if (dvListeners==null) {
synchronized (this) {
if (dvListeners==null) {
dvListeners= new ListenerList(DynamicValueListener.class);
}
}
}
return dvListeners;
}
@Override
public boolean hasDynamicValueListeners() {
return dvListeners!=null && dvListeners.size()>0;
}
}
/* __oOo__ */