package org.okip.okifunc.dictionary.impl;

public class ResourceDictionary
implements org.okip.okifunc.dictionary.api.ResourceDictionary
{
    private java.util.Hashtable dictionary = new java.util.Hashtable();
    private static java.util.Locale defaultLocale = java.util.Locale.US;
    private org.okip.service.shared.api.Factory factory;
    private java.util.Properties propertiesFile = new java.util.Properties();
    private String delimiter = ":";
    private static String filename = "org/okip/okifunc/dictionary/impl/mit.dictionary";
    
    public ResourceDictionary(org.okip.service.shared.api.Factory factory)
    {
        this.factory = factory;
    }
    
    public void addResource(String tag, java.util.Locale locale, Object localization)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        String key = tag + "_" + locale;   
        if (dictionary.containsKey(key))
        {
            dictionary.remove(key);
        }
        dictionary.put(key,localization);
    }
    
    public void removeResource(String tag, java.util.Locale locale)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        String key = tag + "_" + locale;   
        dictionary.remove(key);
    }
    
    public boolean containsResource(String tag, java.util.Locale locale)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        String key = tag + "_" + locale;   
        return dictionary.containsKey(key);
    }
    
    public Object getResource(String tag, java.util.Locale locale)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        String key = tag + "_" + locale;   
        Object result;
        if ((result = dictionary.get(key)) != null)
        {
            return result;
        }
        else
        {
            // check default if localization was not found
            if (locale != defaultLocale) 
            {
                key = tag + "_" + defaultLocale;   
                if ((result = dictionary.get(key)) != null)
                {
                    return result;
                }
                else
                {
                    return null;
                }
            }
            else
            {
                return null;
            }
        }
    }
    
    public Object getResource(String tag)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        return getResource(tag,defaultLocale);
    }
    
    public Object[] getAllResourcesForLocale(java.util.Locale locale)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        java.util.Vector v = new java.util.Vector();
        Object keys[] = (dictionary.keySet()).toArray();
        for (int i=0; i < keys.length; i++)
        {
            String k = (String)keys[i];
            if (k.endsWith(locale.toString()))
            {
                v.addElement(getResource(k,locale));
            }
        }
        return v.toArray();
    }
    
    public Object[] getAllResourceTagsForLocale(java.util.Locale locale)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        java.util.Vector v = new java.util.Vector();
        Object keys[] = (dictionary.keySet()).toArray();
        for (int i=0; i < keys.length; i++)
        {
            String k = (String)keys[i];
            if (k.endsWith(locale.toString()))
            {
                v.addElement(k);
            }
        }
        return v.toArray();
    }
    
    public Object[] getAllResources()
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        return (dictionary.values()).toArray();
    }
    
    public Object[] getAllResourceTags()
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        return (dictionary.keySet()).toArray();
    }
    
    public void setDefaultLocale(java.util.Locale locale)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        defaultLocale = locale;
    }
    
    public java.util.Locale getDefaultLocale()
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        return defaultLocale;
    }
    
    public void load()
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        java.io.File file = new java.io.File(filename);
        try
        {
            java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.FileInputStream(file));
            dictionary = (java.util.Hashtable)ois.readObject();
            ois.close();
        }
        catch (Exception ex)
        {
            System.out.println("cannot access dictionary " + filename);
        }
    }
    
    public void store()
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        java.io.File file = new java.io.File(filename);
        try
        {
            java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(new java.io.FileOutputStream(file));
            oos.writeObject(dictionary);
            oos.close();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    
    public void setDictionaryFilename(String filename)
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        this.filename = filename;
    }

    public String getDictionaryFilename()
    throws org.okip.okifunc.dictionary.api.DictionaryException
    {
        return this.filename;
    }
}