AbstractEventResource.java :  » HTTP » cipango » org » cipango » kaleo » event » Java Open Source

Java Open Source » HTTP » cipango 
cipango » org » cipango » kaleo » event » AbstractEventResource.java
// ========================================================================
// Copyright 2008-2009 NEXCOM Systems
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at 
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================

package org.cipango.kaleo.event;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.cipango.kaleo.AbstractResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public abstract class AbstractEventResource extends AbstractResource implements EventResource
{
  private static final Logger __log = LoggerFactory.getLogger(AbstractEventResource.class);
    
  private Map<String, Subscription> _subscriptions = new HashMap<String, Subscription>();
  private List<EventResourceListener> _listeners = new ArrayList<EventResourceListener>();
  
  public AbstractEventResource(String uri)
  {
    super(uri);
  }
    
  public void addListener(EventResourceListener listener)
  {
    synchronized (_listeners)
    {
      _listeners.add(listener);
    }
  }
  
  public List<EventResourceListener> getListeners()
  {
    synchronized (_listeners)
    {
      return new ArrayList<EventResourceListener>(_listeners);
    }
  }
  
  protected void fireStateChanged()
  {
    for (EventResourceListener listener : _listeners)
    {
      listener.stateChanged(this);
    }
  }
  
  protected void fireSubscriptionExpired(Subscription subscription)
  {
    for (EventResourceListener listener : _listeners)
    {
      listener.subscriptionExpired(subscription);
    }
  }
    
  public void addSubscription(Subscription subscription) 
  {
    synchronized (_subscriptions)
    {
      _subscriptions.put(subscription.getId(), subscription);
    }
    __log.debug("Add subscription {} to resource {}", subscription, this);
  }
  
  public List<Subscription> getSubscriptions()
  {
    synchronized (_subscriptions)
    {
      return new ArrayList<Subscription>(_subscriptions.values());
    }
  }
  
  public Subscription getSubscription(String id)
  {
    synchronized (_subscriptions)
    {
      return _subscriptions.get(id);
    }
  }
  
  public void refreshSubscription(String id, int expires) 
  {
    // TODO Auto-generated method stub  
  }
  
  public boolean hasSubscribers()
  {
    return (_subscriptions.size() != 0);
  }
  
  public long nextTimeout()
  {
    long next = -1;
    
    for (Subscription subscription : _subscriptions.values())
    {
      long time = subscription.getExpirationTime();
      
      if (time > 0 && (time < next || next < 0))
        next = time;
    }
    return next;
  }
  
  public Subscription removeSubscription(String id) 
  {
    Subscription subscription = null;
    synchronized (_subscriptions) 
    {
      subscription = _subscriptions.remove(id);
    }
    if (subscription != null)
      __log.debug("Remove subscription {} to resource {}", subscription, this);
    return subscription;
  }
  
  public void doTimeout(long time)
  {
    Iterator<Subscription> it = _subscriptions.values().iterator();
    while (it.hasNext())
    {
      Subscription subscription = it.next();
      if (subscription.getExpirationTime() <= time)
      {
        it.remove();
        fireSubscriptionExpired(subscription);
      }
    }
  }

}
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.