ItsNatTimerImpl.java :  » Ajax » ItsNat » org » itsnat » impl » core » Java Open Source

Java Open Source » Ajax » ItsNat 
ItsNat » org » itsnat » impl » core » ItsNatTimerImpl.java
/*
  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);         
    }    
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.