//$Id: BasicContext.java 10438 2009-04-17 21:33:42Z norman.richards@jboss.com $
package org.jboss.seam.contexts;

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

import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.Seam;
import org.jboss.seam.core.Events;

/**
 * A basic implementation of Context that keeps the state 
 * in a Map.
 * 
 * @author Gavin King
 */
public class BasicContext implements Context
{
   
   private final Map<String, Object> map;
   private final ScopeType scope;
   
   public BasicContext(ScopeType scope)
   {
      this.scope = scope;
      this.map = new HashMap<String, Object>();
   }

   protected BasicContext(ScopeType scope, Map<String, Object> map)
   {
      this.scope = scope;
      this.map = map;
   }

   public ScopeType getType()
   {
      return scope;
   }

   public Object get(Class clazz)
   {
      return get( Component.getComponentName(clazz) );
   }

   public Object get(String name)
   {
      return map.get(name);
   }

   public String[] getNames()
   {
      // yes, I know about the toArray() method,
      // but there is a bug in the RI!
      // XXX - what bug?
      ArrayList<String> keys = new ArrayList<String>();
      for (String key : map.keySet())
      {
         keys.add(key);
      }
      return keys.toArray(new String[keys.size()]);
   }

   public boolean isSet(String name)
   {
      return map.containsKey(name);
   }

   public void remove(String name)
   {
      if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.preRemoveVariable." + name);
      map.remove(name);
      if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.postRemoveVariable." + name);
   }

   public void set(String name, Object value)
   {
      // We can't raise a preSetVariable event for Events itself because it doesn't exist yet...
      if ( !Seam.getComponentName(Events.class).equals(name) && Events.exists() ) 
      {
         Events.instance().raiseEvent("org.jboss.seam.preSetVariable." + name);
      }
      map.put(name, value);
      if ( Events.exists() ) Events.instance().raiseEvent("org.jboss.seam.postSetVariable." + name);
   }

   public void flush() {}

   @Override
   public String toString()
   {
      return "BasicContext(" + scope + ")";
   }

}
