/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.test.testbean.bean;


import java.rmi.*;
import javax.ejb.*;
import javax.naming.Context;
import javax.sql.DataSource;
import javax.naming.InitialContext;
import java.sql.Connection;
import org.jboss.test.testbean.interfaces.StatelessSession;
import org.jboss.test.testbean.interfaces.StatelessSessionHome;
import java.util.Collection;
import java.util.Collections;
import java.util.Vector;
import java.util.Enumeration;

public class EntityBMPBean implements EntityBean {
   org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(getClass());
   
  private EntityContext entityContext;
  public String name;
  private StatelessSession statelessSession;
  private boolean wasFind = false;


  public String ejbCreate() throws RemoteException, CreateException {
	  
	   log.debug("EntityBMP.ejbCreate() called");
       this.name = "noname";

       return name;
  
	  
  }
  public String ejbCreate(String name) throws RemoteException, CreateException {

       log.debug("EntityBMP.ejbCreate("+name+") called");
       this.name = name;

       return name;
  }

  public String ejbCreateMETHOD(String name) throws RemoteException, CreateException {

       log.debug("EntityBMP.ejbCreateMETHOD("+name+") called");
       this.name = name;

       return name;
  }

  // For usage in BMP only (The return is the primary key type)

  public String ejbFindByPrimaryKey(String name) throws RemoteException, FinderException {

      log.debug("EntityBMP.ejbFindByPrimaryKey() called");

      wasFind = true;

      return name;
  }

  public Collection ejbFindCollectionKeys(int num) throws RemoteException, FinderException {

      log.debug("EntityBMP.ejbFindMultipleKeys() called with num "+num);
      Collection pks = new Vector();
      pks.add("primary key number 1");
      pks.add("primary key number 2");
      pks.add("primary key number 3");

      return pks;
  }
  public Enumeration ejbFindEnumeratedKeys(int num) throws RemoteException, FinderException {

      log.debug("EntityBMP.ejbFindEnumeratedKeys() called with num "+num);
      Collection pks = new Vector();
      pks.add("primary key number 1");
      pks.add("primary key number 2");
      pks.add("primary key number 3");

      return Collections.enumeration(pks);
  }

  public void ejbPostCreate() throws RemoteException, CreateException {

       log.debug("EntityBMP.ejbPostCreate() called");
  }
  
  public void ejbPostCreate(String name) throws RemoteException, CreateException {

       log.debug("EntityBMP.ejbPostCreate("+name+") called");
  }
  
  public void ejbPostCreateMETHOD(String name) throws RemoteException, CreateException {

       log.debug("EntityBMP.ejbPostCreateMETHOD("+name+") called");
  }

  public void ejbActivate() throws RemoteException {
    log.debug("EntityBMP.ejbActivate() called");
  }

  public void ejbLoad() throws RemoteException {
   log.debug("EntityBMP.ejbLoad() called");
  }

  public void ejbPassivate() throws RemoteException {

     log.debug("Was Find "+wasFind);
     log.debug("EntityBMP.ejbPassivate() called");
  }

  public void ejbRemove() throws RemoteException, RemoveException {
   log.debug("EntityBMP.ejbRemove() called");
  }

  public void ejbStore() throws RemoteException {
	 
   log.debug("EntityBMP.ejbStore() called");
  }

  public String callBusinessMethodA() throws RemoteException{

     log.debug("EntityBMP.callBusinessMethodA() called");
     return "EntityBMP.callBusinessMethodA() called, my primaryKey is "+
            entityContext.getPrimaryKey().toString();
  }

   public String callBusinessMethodB() throws RemoteException {

     log.debug("EntityBMP.callBusinessMethodB() called, calling B2B");
     String b2bMessage = statelessSession.callBusinessMethodB();
     log.debug("EntityBMP called stateless Bean and it said "+b2bMessage);
     return "EntityBMP.callBusinessMethodB() called, called other bean (B2B) and it said \""+b2bMessage+"\"";

  }
  
   public String callBusinessMethodB(String words) throws RemoteException {
       log.debug("EntityBMP.callBusinessMethodB(String) called, calling B2B");
     String b2bMessage = statelessSession.callBusinessMethodB();
     log.debug("EntityBMP called stateless Bean and it said "+b2bMessage);
     return "EntityBMP.callBusinessMethodB() called, called other bean (B2B) and it said \""+b2bMessage+"\""+" words "+words;

  }

  public void setEntityContext(EntityContext context) throws RemoteException {
     log.debug("EntityBMP.setSessionContext() called");
     entityContext = context;

     //we use the setEntityContext to lookup the connection and the EJBReference

        try {

            Context namingContext = new InitialContext();

            Connection connection = ((DataSource) namingContext.lookup("java:comp/env/jdbc/myDatabase")).getConnection();
			connection.close();

            log.debug("EntityBMP I did get the connection to the database for BMP");
        }

        catch (Exception e) {

            log.debug("failed", e);

            log.debug("EntityBMP Could not find the database connection, check settings");

            throw new RemoteException("EntityBMP Could not find the database connection");
        }

        try {

            Context namingContext = new InitialContext();

            log.debug("EntityBMP Looking up Stateless Home");

            StatelessSessionHome statelessHome = ((StatelessSessionHome) namingContext.lookup("java:comp/env/ejb/myEJBRef"));

            log.debug("EntityBMP Calling create on Stateless Home");
            
            statelessSession = statelessHome.create();

            log.debug("EntityBMP Found the EJB Reference in my java:comp/env/ environment");


        }

        catch (Exception e) {

            log.debug("failed", e);

            log.debug("EntityBMP Could not find the EJB Reference called myEJBRef, check settings");

            throw new RemoteException("EntityBean Could not find EJB Reference");
        }
    }

    public void unsetEntityContext() throws RemoteException {

        log.debug("EntityBMP.unsetSessionContext() called");
        entityContext = null;
    }
}
