/*
ItsNat Java Web Application Framework
Copyright (C) 2007 Innowhere Software Services S.L., Spanish Company
Author: Jose Maria Arranz Santamaria
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. See the GNU Affero General Public
License for more details. See the copy of the GNU Affero General Public License
included in this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.itsnat.impl.core;
import org.itsnat.core.ItsNatDocument;
import org.itsnat.core.ItsNatException;
import org.itsnat.core.ItsNatTimer;
import org.itsnat.core.event.TimerHandle;
import org.itsnat.impl.core.listener.domext.TimerEventListenerWrapperImpl;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.itsnat.core.event.ParamTransport;
import org.itsnat.impl.core.js.listener.TimerEventListenerJSRenderImpl;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
/**
*
* @author jmarranz
*/
public class ItsNatTimerImpl implements ItsNatTimer
{
protected Map listeners;
protected ItsNatDocumentImpl itsNatDoc;
protected boolean canceled = false;
/**
* Creates a new instance of ItsNatTimerImpl
*/
public ItsNatTimerImpl(ItsNatDocumentImpl itsNatDoc)
{
this.itsNatDoc = itsNatDoc;
}
public ItsNatDocument getItsNatDocument()
{
return itsNatDoc;
}
public ItsNatDocumentImpl getItsNatDocumentImpl()
{
return itsNatDoc;
}
public Map getListeners()
{
if (listeners == null)
this.listeners = new HashMap();
return listeners;
}
public void cancel()
{
if (canceled) return;
Map listeners = getListeners();
if (!listeners.isEmpty())
{
// Convertimos en array porque al cancelar cada timer task se modifica el propio Map (un iterador dara error)
TimerEventListenerWrapperImpl[] listenerArray = (TimerEventListenerWrapperImpl[])listeners.values().toArray(new TimerEventListenerWrapperImpl[listeners.size()]);
for(int i = 0; i < listenerArray.length; i++)
{
TimerEventListenerWrapperImpl listener = (TimerEventListenerWrapperImpl)listenerArray[i];
listener.cancel(); // Automticamente desregistra de este timer y en el documento. Si en este momento est ejecutndose el mtodo TimerEventListener.handleEvent(Event) asegura que no se genera cdigo JavaScript para enviar ms
}
listeners.clear(); // No hace falta pero por si acaso
}
this.canceled = true;
}
public TimerEventListenerWrapperImpl getTimerEventListenerWrapper(String id)
{
Map listeners = getListeners();
return (TimerEventListenerWrapperImpl)listeners.get(id);
}
public void removeListener(TimerEventListenerWrapperImpl listener)
{
removeListenerById(listener.getId());
}
public void removeListenerById(String id)
{
// Desregistro local
Map listeners = getListeners();
TimerEventListenerWrapperImpl listener = (TimerEventListenerWrapperImpl)listeners.remove(id);
if (listener == null)
return; // Ya se elimin o nunca se aadi (raro)
getItsNatDocumentImpl().getTimerEventListenerRegistry().removeTimerEventListenerByIdOnly(id);
}
private TimerHandle scheduleGeneric(EventTarget target,EventListener listener,long time,long period,boolean fixedRate,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
if (canceled) throw new ItsNatException("This timer is cancelled");
if (!itsNatDoc.isAJAXEnabled()) return null;
TimerEventListenerWrapperImpl listenerWrapper = getItsNatDocumentImpl().getTimerEventListenerRegistry().addTimerEventListener(target,listener,time,period,fixedRate,syncMode,extraParams,preSendCode,ajaxTimeout,this);
// Registro local
Map listeners = getListeners();
listeners.put(listenerWrapper.getId(),listenerWrapper);
return listenerWrapper;
}
public TimerHandle schedule(EventTarget target,EventListener task, Date time)
{
int syncMode = getItsNatDocument().getDefaultSyncMode();
long ajaxTimeout = getItsNatDocument().getAJAXTimeout();
return schedule(target,task,time,syncMode,null,null,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, Date time,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
return scheduleGeneric(target,task,time.getTime(),0,false,syncMode,extraParams,preSendCode,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, Date firstTime, long period)
{
int syncMode = getItsNatDocument().getDefaultSyncMode();
long ajaxTimeout = getItsNatDocument().getAJAXTimeout();
return schedule(target,task,firstTime,period,syncMode,null,null,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, Date firstTime, long period,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
return scheduleGeneric(target,task,firstTime.getTime(),period,false,syncMode,extraParams,preSendCode,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, long delay)
{
int syncMode = getItsNatDocument().getDefaultSyncMode();
long ajaxTimeout = getItsNatDocument().getAJAXTimeout();
return schedule(target,task,delay,syncMode,null,null,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, long delay,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
if (delay < 0)
throw new IllegalArgumentException("Negative delay");
return scheduleGeneric(target,task,System.currentTimeMillis() + delay,0,false,syncMode,extraParams,preSendCode,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, long delay, long period)
{
int syncMode = getItsNatDocument().getDefaultSyncMode();
long ajaxTimeout = getItsNatDocument().getAJAXTimeout();
return schedule(target,task,delay,period,syncMode,null,null,ajaxTimeout);
}
public TimerHandle schedule(EventTarget target,EventListener task, long delay, long period,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
if (delay < 0)
throw new IllegalArgumentException("Negative delay");
return scheduleGeneric(target,task,System.currentTimeMillis() + delay,period,false,syncMode,extraParams,preSendCode,ajaxTimeout);
}
public TimerHandle scheduleAtFixedRate(EventTarget target,EventListener task, Date firstTime, long period)
{
int syncMode = getItsNatDocument().getDefaultSyncMode();
long ajaxTimeout = getItsNatDocument().getAJAXTimeout();
return scheduleAtFixedRate(target,task,firstTime,period,syncMode,null,null,ajaxTimeout);
}
public TimerHandle scheduleAtFixedRate(EventTarget target,EventListener task, Date firstTime, long period,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
return scheduleGeneric(target,task,firstTime.getTime(),period,true,syncMode,extraParams,preSendCode,ajaxTimeout);
}
public TimerHandle scheduleAtFixedRate(EventTarget target,EventListener task, long delay, long period)
{
int syncMode = getItsNatDocument().getDefaultSyncMode();
long ajaxTimeout = getItsNatDocument().getAJAXTimeout();
return scheduleAtFixedRate(target,task,delay,period,syncMode,null,null,ajaxTimeout);
}
public TimerHandle scheduleAtFixedRate(EventTarget target,EventListener task, long delay, long period,int syncMode,ParamTransport[] extraParams,String preSendCode,long ajaxTimeout)
{
if (delay < 0)
throw new IllegalArgumentException("Negative delay");
return scheduleGeneric(target,task,System.currentTimeMillis() + delay,period,true,syncMode,extraParams,preSendCode,ajaxTimeout);
}
}
|