package ejava.ejb.personnel; 

import ejava.ejb.uid.UIDGeneratorHome;
import ejava.ejb.uid.UIDGenerator;
import ejava.ejb.uid.UID;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.ejb.EJBException;
import javax.rmi.PortableRemoteObject;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.Iterator;

public class RegistrarBean implements RegistrarBI, SessionBean {
   PersonHome pHome_;
   UIDGenerator uidGenerator_;

   /**
      Generates a uid and adds the person to the database.
   */
   public Person add(String firstName, String lastName,
                     String address, String phoneNumber) 
		     throws PersonnelException, RemoteException {
      Person newPerson = null;
      try {
         UID uid = uidGenerator_.createUID();
	 newPerson = pHome_.create(uid.toString(),
	    firstName, lastName, address, phoneNumber);
      }
      catch (CreateException ex) {
         throw new PersonnelException(ex.toString());
      }
      catch (Exception ex) {
         throw new EJBException("unable to create person:"+ex);
      }

      return newPerson;
   }

   public String listPersonnelByName(String firstName, String lastName) 
      throws PersonnelException, RemoteException {

       StringBuffer result = new StringBuffer();
       result.append("<ejava:personList>");

       try {
          Collection people = pHome_.findByLikeName(firstName, lastName);
	  for(Iterator itr=people.iterator(); itr.hasNext();) {
	     Person person = (Person)itr.next();
	     result.append(person.toXML());
	  }
       }
       catch (FinderException ex) {
          throw new PersonnelException("error locating matches:"+ex);
       }
       catch (Exception ex) {
          throw new EJBException("unable to complete search:"+ex);
       }

       result.append("</ejava:personList>");
       return result.toString();
   }

   public void ejbCreate() {}
   public void ejbActivate() {}
   public void ejbPassivate() {}
   public void ejbRemove() {}

   private SessionContext sessionCtx_;
   public void setSessionContext(SessionContext sessionCtx) 
      throws RemoteException {

      sessionCtx_ = sessionCtx;
      try {
         InitialContext ctx = new InitialContext();
	 Object object = ctx.lookup("java:comp/env/ejb/PersonHome");
         pHome_ = (PersonHome)
	    PortableRemoteObject.narrow(object, PersonHome.class);

         object = ctx.lookup("java:comp/env/ejb/UIDGeneratorHome");
	 UIDGeneratorHome uidHome_ = (UIDGeneratorHome)
	    PortableRemoteObject.narrow(object, UIDGeneratorHome.class);
         uidGenerator_ = uidHome_.find();
      }
      catch (FinderException ex) {
         throw new EJBException("uid generator not located;"+ex);
      }
      catch (NamingException ex) {
         throw new EJBException("error locating ejb objects:"+ ex);
      }
      finally {
      }
   }
}
