package org.jemos.core.framework.ejbs.entities;

import javax.ejb.CreateException;
import javax.ejb.EntityBean;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import org.apache.log4j.Category;
import org.jemos.core.framework.ejbs.BaseEntityBean;
import org.jemos.core.framework.ejbs.interfaces.AddressesData;
import org.jemos.core.framework.ejbs.interfaces.AddressesLocal;
import org.jemos.core.framework.ejbs.interfaces.AddressesLocalHome;
import org.jemos.core.framework.ejbs.interfaces.PeopleData;
import org.jemos.core.framework.ejbs.interfaces.PeopleKey;



/**
 * 
 * @ejb.bean
 *   type="CMP"
 *   name="People"
 *   reentrant="true"
 * 	 local-jndi-name="ejb/jemos/core/PeopleEJB"
 *   view-type="local"
 * 
 * @ejb.ejb-ref
 *   ejb-name="Addresses"
 *   view-type="local"
 *   ref-name="Addresses"
 *
 * 
 * @jboss.persistence 
 *   pk-constraint="true"
 *   table-name="people" 
 *
 * @ejb.value-object
 *   name="PeopleValue"
 *   match="*"
 * 
 */

public abstract class PeopleBean 
  extends BaseEntityBean implements EntityBean {
	//The logger instance
	private transient final Category log = Category.getInstance(getClass().getName());
  	
  	//cmp-fields
	/**
	 * @ejb.interface-method
	 * @ejb.persistent-field
	 * @ejb.pk-field	  
	 * @jboss.persistence	    
	 *   not-null="true"
	 * @jboss.cmp-field
	 *   field-name="email"
	 *   column-name="email"	 
	 */
	public abstract String getEmail();
	/**
	 * @ejb.interface-method
	 * @param email
	 */
	public abstract void setEmail(String email);
	/**
	 * @ejb.interface-method
	 * @ejb.persistent-field
	 * @ejb.pk-field
	 * @jboss.persistence
	 *   not-null="true"
	 * @jboss.cmp-field
	 *   field-name="password"
	 *   column-name="password" 
	 */	
	public abstract String getPassword();
	/**
	 * @ejb.interface-method
	 * @param password
	 */
	public abstract void setPassword(String password);	
	/**
	 * @ejb.persistent-field
	 * @ejb.interface-method
	 * @jboss.cmp-field
	 *   field-name="firstName"
	 *   column-name="firstName" 	 
	 */	
	public abstract String getFirstName();
	
	/**
	 * @ejb.interface-method
	 * @param firstName
	 */
	public abstract void setFirstName(String firstName);
	/**
	 * @ejb.interface-method
	 * @ejb.persistent-field	
	 * @jboss.cmp-field
	 *   field-name="lastName"
	 *   column-name="lastName" 
	 */	
	public abstract String getLastName();
	/**
	 * @ejb.interface-method
	 * @param lastName
	 */
	public abstract void setLastName(String lastName);
	
	//cmr-fields
	/**
	 * @ejb.interface-method
	 *     view-type="local"
	 * @ejb.relation
	 *     name="People-Addresses"
	 *     role-name="1-People-1-Address"
	 *     multiple="no"
	 *     target-role-name="1-Address-1-People"
	 *     target-multiple="no"
	 *     target-ejb="Addresses"
	 *     
	 * @jboss.relation
	 *     fk-constraint="false"
	 *     related-pk-field="addressId"
	 *     fk-column="addressId"
	 */
	public abstract AddressesLocal getAddresses();
	
	/**
	 * @ejb.interface-method
	 * @param address
	 */
	public abstract void setAddresses(AddressesLocal addresses);

	 /**
	  * @ejb.create-method
	  * @param pData
	  * @return
	  * @throws CreateException
	  */
	public PeopleKey ejbCreate(PeopleData pData, AddressesData aData)
		   throws CreateException {
	    
	    log.info("Now in ejbCreate: Setting People data");
	    aData.setAddressId(1);
		setEmail(pData.getEmail());		
		setPassword(pData.getPassword());
		setFirstName(pData.getFirstName());
		setLastName(pData.getLastName());		
		setCreationDate(new java.util.Date());
		log.info("Returning with null");
		return null;   	
	}
	
	public void ejbPostCreate(PeopleData pData, AddressesData aData)
	    throws CreateException {
	    	
	    log.info("Now in ejbPostCreate: ");
	   	InitialContext initial;
		try {
			initial = new InitialContext();
			log.info("Created an InitialContext. Creating the reference to the "
			 + "home interface");
			AddressesLocalHome home = (AddressesLocalHome)initial.lookup(
					  "ejb/jemos/core/AddressesEJB");
			log.info("Creating the the Address Bean");					  
			setAddresses(home.create(aData));
			
		} catch (NamingException e) {
			e.printStackTrace();
		}	   
	}
	    


}
