/*******************************************************************************
 * Copyright (c) 2002 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.core.internal.contentmodel.util;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;



/**
 *
 */
public class CMDocumentCache
{                                     
  public static final int STATUS_NOT_LOADED = 0;
  public static final int STATUS_LOADING    = 2;
  public static final int STATUS_LOADED     = 3;
  public static final int STATUS_ERROR      = 4;

  protected class Entry
  {
    public String uri;
    public int status = STATUS_NOT_LOADED;
    public float progress;
    public CMDocument cmDocument;

    public Entry(String uri)
    {                      
      this.uri = uri;         
    }

    public Entry(String uri, int status, CMDocument cmDocument)
    {                                     
      this.uri = uri;
      this.status = status;      
      this.cmDocument = cmDocument;
    }
  }

  protected Hashtable hashtable;
  protected List listenerList = new Vector();


  /**
   * temporarily public until caching problem is solved
   */
  public CMDocumentCache()
  {
    hashtable = new Hashtable();
  }

  public void addListener(CMDocumentCacheListener listener)
  {
    listenerList.add(listener);
  }

  public void removeListener(CMDocumentCacheListener listener)
  {
    listenerList.remove(listener);
  }   

  /**
   *
   */
  public CMDocument getCMDocument(String grammarURI)
  {
    CMDocument result = null;
    if (grammarURI != null)
    {  
      Entry entry = (Entry)hashtable.get(grammarURI);
      if (entry != null)
      {
        result = entry.cmDocument;
      }   
    }
    return result;
  }    

  /**
   *
   */
  public int getStatus(String grammarURI)
  {
    int result = STATUS_NOT_LOADED;
    if (grammarURI != null)
    {  
      Entry entry = (Entry)hashtable.get(grammarURI);
      if (entry != null)
      {
        result = entry.status;
      }      
      
    }
    return result;
  }            
            
  /**
   *
   */
  protected Entry lookupOrCreate(String grammarURI)
  {
    Entry entry = (Entry)hashtable.get(grammarURI);
    if (entry == null)
    {
      entry = new Entry(grammarURI);                       
      hashtable.put(grammarURI, entry);
    }
    return entry;
  }

    
  /**
   *
   */
  public void putCMDocument(String grammarURI, CMDocument cmDocument)
  {                                    
    if (grammarURI != null && cmDocument != null)
    {                           
      Entry entry = lookupOrCreate(grammarURI);
      int oldStatus = entry.status;
      entry.status = STATUS_LOADED;
      entry.cmDocument = cmDocument;  
      notifyCacheUpdated(grammarURI, oldStatus, entry.status, entry.cmDocument);  
    }
  }
     
  /**
   *
   */
  public void setStatus(String grammarURI, int status)
  {
    if (grammarURI != null)
    {
      Entry entry = lookupOrCreate(grammarURI);
      int oldStatus = entry.status;
      entry.status = status;
      notifyCacheUpdated(grammarURI, oldStatus, entry.status, entry.cmDocument);   
    }
  }
     
  /**
   *
   */
  public void clear()
  {
    hashtable.clear();
    notifyCacheCleared();
  }  

  /**
   *
   */
  protected void notifyCacheUpdated(String uri, int oldStatus, int newStatus, CMDocument cmDocument)
  {      
    List list = new Vector();
    list.addAll(listenerList);
    for (Iterator i = list.iterator(); i.hasNext(); )
    {
      CMDocumentCacheListener listener = (CMDocumentCacheListener)i.next();
      listener.cacheUpdated(this, uri, oldStatus, newStatus, cmDocument);
    }
  }

  /**
   *
   */
  protected void notifyCacheCleared()
  {     
    List list = new Vector();
    list.addAll(listenerList);
    for (Iterator i = list.iterator(); i.hasNext(); )
    {
      CMDocumentCacheListener listener = (CMDocumentCacheListener)i.next();
      listener.cacheCleared(this);
    }
  }
  
  public List getCMDocuments()
  {
  	List list = new ArrayList();  	
  	for (Iterator i = hashtable.values().iterator(); i.hasNext(); )
  	{
  		Entry entry = (Entry)i.next();
  		list.add(entry.cmDocument);
  	}
  	return list;
  }
}
