package haipham.webnntp.ejb.folder;

import javax.rmi.*;
import javax.ejb.*;
import java.util.Collection;
import haipham.webnntp.ejb.EJBUtils;
import haipham.webnntp.ejb.user.User;
import haipham.webnntp.ejb.message.Message;

/** The EJB class of FolderBean.
 *  A folder can contains other sub folders and messages.
 *  When a folder is removed, all messages belongs to this folder are also
 *  removed; all subfolders are also removed.
 *  @see haipham.webnntp.ejb.Folder
 *  @see haipham.webnntp.ejb.FolderHome
 *  @author Hai Pham January 05, 2000
 *  @version 1.0
 */ 

public class FolderEJB extends FolderModel implements EntityBean{

    /** Create a folder.
     *  @param parent the parent folder, null if this folder is a top-level
     */ 
    public java.lang.Long ejbCreate(
            Folder parent, String folderName, User user,
                                    String folderType) throws CreateException{

        if ( folderName == null || folderName.equals("")
                || user == null ){
            throw new CreateException("invalid input");
        }

        this.owner = user;
        this.folderName = folderName;
        this.folderType = folderType;
        this.parentFolder = parent;
        this.folderId = getNextId();

        if ( this.folderId == -1 ){
            throw new CreateException("Cannot get PrimKey");
        }

        System.out.println("FolderID: " + this.folderId);

        return null;
    }

    public Long ejbCreate(Folder parentFolder, String name, String type)
        throws CreateException{

        if ( parentFolder == null ){
            throw new CreateException("parentFolder must not be null");
        }

        try{
            return ejbCreate(parentFolder, name, parentFolder.getOwner(), type);
        }catch(Exception e){
            throw new CreateException(e.getMessage());
        }
    }

    
    public void setEntityContext(EntityContext context){
        m_context = context;
    }

    public void unsetEntityContext(){
        m_context = null;
    }

    public void ejbPostCreate(Folder folder, String folderName,
                      User userName, String folderType){}
    public void ejbPostCreate(Folder folder, String folderName, String type){}

    public void ejbLoad(){}
    public void ejbStore(){}

    /** Remove all messages belong to this folder */
    public void ejbRemove(){
        Collection  collection;
        Object[]    objects;

        // remove messages
        try{
            collection = ((Folder) m_context.getEJBObject()).getMessages();
            objects = collection.toArray();

            for ( int x = 0; x < objects.length; x++ ){
                try{
                    ((Message) objects[x]).remove();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }catch(Exception f){
            f.printStackTrace();
        }

        // remove subfolders
        try{
            collection = ((Folder) m_context.getEJBObject()).getChildren();
            objects = collection.toArray();

            for ( int x = 0; x < objects.length; x++ ){
                try{
                    ((Folder) objects[x]).remove();
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }catch(Exception f){
            f.printStackTrace();
        }
    }

    public void ejbActivate(){
        //folderId = ((Long) m_context.getPrimaryKey()).longValue();
    }

    public void ejbPassivate(){
        //folderId = -1;
    }

    private long getNextId(){
        try{
            return com.evermind.ejb.CounterUtils.getNextID(
                        "java:comp/env/ejb/Counter", "ejb/Folder");
        }catch(Exception e){
            e.printStackTrace();
            return -1;
        }
    }
}
