/* * 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.epics.css.dal.simulation; import java.util.TimerTask; import org.apache.log4j.Logger; import org.csstudio.dal.DataExchangeException; import org.csstudio.dal.RemoteException; import org.csstudio.dal.Request; import org.csstudio.dal.ResponseListener; import org.csstudio.dal.impl.RequestImpl; import org.csstudio.dal.impl.ResponseImpl; import org.csstudio.dal.proxy.MonitorProxy; /** * Simulation implementation of MonitorProxy. * * @author Igor Kriznar (igor.kriznarATcosylab.com) */ public class MonitorProxyImpl<T> extends RequestImpl<T> implements MonitorProxy, Runnable{ protected PropertyProxyImpl<T> proxy; protected long timerTrigger = 1000; protected boolean heartbeat = true; protected TimerTask task; protected boolean destroyed = false; /** * Creates new instance. * * @param proxy parent proxy object * @param l listener for notifications */ public MonitorProxyImpl(PropertyProxyImpl<T> proxy, ResponseListener<T> l){ super(proxy, l); this.proxy = proxy; proxy.addMonitor(this); resetTimer(); } public void reInitialize(PropertyProxyImpl<T> proxy) throws RemoteException{ this.source = proxy; this.proxy = proxy; } /* (non-Javadoc) * @see org.epics.css.dal.proxy.MonitorProxy#getRequest() */ @Override public Request<T> getRequest(){ return this; } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#getTimerTrigger() */ @Override public long getTimerTrigger() throws DataExchangeException{ return timerTrigger; } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#setTimerTrigger(long) */ @Override public void setTimerTrigger(long trigger) throws DataExchangeException, UnsupportedOperationException{ timerTrigger = trigger; resetTimer(); } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#setHeartbeat(boolean) */ @Override public void setHeartbeat(boolean heartbeat) throws DataExchangeException, UnsupportedOperationException{ this.heartbeat = heartbeat; resetTimer(); } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#isHeartbeat() */ @Override public boolean isHeartbeat(){ return heartbeat; } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#getDefaultTimerTrigger() */ @Override public long getDefaultTimerTrigger() throws DataExchangeException{ return 1000; } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#isDefault() */ @Override public boolean isDefault(){ return true; } private void fireValueEvent(){ try { ResponseImpl<T> r = new ResponseImpl<T>(proxy, this, proxy.getValueSync(), "value", true, null, proxy.getCondition(), null, false); addResponse(r); } catch (DataExchangeException e) { Logger.getLogger(this.getClass()).warn("Simulator error.", e); } } /** * Fires value change event if monitor is not in heartbeat mode. */ public void fireValueChange(){ if (!heartbeat) fireValueEvent(); } /** * Run method executed at schedulet time intervals. */ @Override public void run(){ fireValueEvent(); } private synchronized void resetTimer(){ if (task != null) task.cancel(); if (heartbeat) task = SimulatorPlug.getInstance().schedule(this, timerTrigger); } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#destroy() */ @Override public void destroy(){ if (task != null) task.cancel(); destroyed = true; } /* (non-Javadoc) * @see org.epics.css.dal.SimpleMonitor#isDestroyed() */ @Override public boolean isDestroyed(){ return destroyed; } @Override public void refresh(){ // Override in order to clean up cached values. } }