package levik.weblet.lh;

import java.io.*;
import java.util.*;
import levik.util.*;

public class FeelingServer {
    protected ResourceBundle config;
    protected Cache feelingCache;

    public FeelingServer(ResourceBundle config) {
	this.config=config;
	feelingCache = new Cache(100);
    }

    public FeelingSet get() {
	return get(null);
    }

    public FeelingSet get(String subject) {
	Object key;
	FeelingSet result = null;
	if (subject==null) 
	    key=Feeling.class;
	else
	    key=subject.toUpperCase().trim();
	result = (FeelingSet)feelingCache.get(key);
	if (result!=null) {
	    return result;
	}
	result = loadFeelings(key);
	Object oldValue=feelingCache.put(key,result);
	if (oldValue!=null) {
	    saveFeelings((FeelingSet)oldValue);
	}
	return result;
    }

    public void saveAllCached() {
	Object oneSet;
	for (Enumeration en = feelingCache.getCacheKeys(); en.hasMoreElements();) {
	    oneSet = feelingCache.get(en.nextElement());
	    if (oneSet instanceof FeelingSet) {
		saveFeelings((FeelingSet)oneSet);
	    }
	}
    }

    public  void saveFeelings(FeelingSet feelingSet) {
	try {
	    if (!feelingSet.wasChanged()) return;
	    String fileRoot;
	    if (feelingSet.getKey().equals(Feeling.class))
		fileRoot=config.getString("SAVE_FILES");
	    else
		fileRoot=config.getString("SAVE_ROOT")+feelingSet.getKey().toString()+".ser";
	    OutputStream out = new FileOutputStream(fileRoot);
	    ObjectOutputStream objOut = new ObjectOutputStream(out);
	    objOut.writeObject(feelingSet.getLoves());
	    objOut.writeObject(feelingSet.getHates());
	    objOut.writeObject(new Integer(feelingSet.getLoveNum()));
	    objOut.writeObject(new Integer(feelingSet.getHateNum()));
	    objOut.close();
	    out.close();
	    feelingSet.setChanged(false);
	}
	catch (Exception e) {
	    e.printStackTrace();
	}
    }

    protected FeelingSet loadFeelings(Object key) {
	Vector loveFeelings=null;
	Vector hateFeelings=null;
	int loveNum;
	int hateNum;
	try {
	    String fileRoot;
	    if (key.equals(Feeling.class)) {
		fileRoot=config.getString("SAVE_FILES");
	    }
	    else
		fileRoot=config.getString("SAVE_ROOT")+key.toString()+".ser";
	    InputStream in=new FileInputStream(fileRoot);
	    ObjectInputStream objIn = new ObjectInputStream(in);
	    loveFeelings=(Vector)objIn.readObject();
	    hateFeelings=(Vector)objIn.readObject();
	    loveNum=((Integer)objIn.readObject()).intValue();
	    hateNum=((Integer)objIn.readObject()).intValue();
	    in.close();
	    FeelingSet temp = new FeelingSet(key,loveFeelings,hateFeelings);
	    temp.setLoveNum(loveNum);
	    temp.setHateNum(hateNum);
	    return temp;
	}
	catch (Exception e) {
	    e.printStackTrace();
	    boolean empty=(loveFeelings==null) && (hateFeelings==null);
	    if (loveFeelings==null) loveFeelings=new Vector();
	    if (hateFeelings==null) hateFeelings=new Vector();
	    FeelingSet temp = new FeelingSet(key,loveFeelings, hateFeelings);
	    temp.setLoveNum(loveFeelings.size());
	    temp.setHateNum(hateFeelings.size());
	    temp.setChanged(!empty);
	    return temp;
	}
    }
}

