/*
 * 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.cmp2.cmr.ejb;


import java.util.Collection;

import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;

import org.jboss.test.cmp2.cmr.interfaces.CMRBugEJBLocal;

/**
 *  class <code>CMRBugBean</code> demonstrates bug 523627.  CMR fields may get changed
 * in ejbPostCreate, so newly created entities must be marked as needing ejbSave.
 * Currently this is done by putting them in GlobalTxEntityMap.
 *
 * @author <a href="mailto:MNewcomb@tacintel.com">Michael Newcomb</a>
 * @author <a href="mailto:d_jencks@users.sourceforge.net">David Jencks</a>
 * @version 1.0
 *
 * @ejb:bean   name="CMRBugEJB"
 *             local-jndi-name="LocalReadOnly"
 *             view-type="local"
 *             type="CMP"
 *             cmp-version="2.x"
 *             primkey-field="id"
 *             reentrant="true"
 *             schema="CMRBug"
 * @ejb:pk class="java.lang.String"
 * @ejb:finder signature="java.util.Collection findAll()"
 *             query="select object(cmr_bug) from CMRBug as cmr_bug"
 * @jboss:create-table create="true"
 * @jboss:remove-table remove="true"
 */
public abstract class CMRBugBean
   implements EntityBean
{
   private EntityContext context;

   /**
    * Describe <code>getId</code> method here.
    *
    * @return a <code>String</code> value
    * @ejb:persistent-field
    * @ejb:interface-method
    */
   public abstract String getId();

   /**
    * Describe <code>setId</code> method here.
    *
    * @param id a <code>String</code> value
    * @ejb:interface-method
    */
   public abstract void setId(String id);

   /**
    * Describe <code>getDescription</code> method here.
    *
    * @return a <code>String</code> value
    * @ejb:persistent-field
    * @ejb:interface-method
    */
   public abstract String getDescription();

   /**
    * Describe <code>setDescription</code> method here.
    *
    * @param description a <code>String</code> value
    * @ejb:interface-method
    */
   public abstract void setDescription(String description);

   /**
    * Describe <code>getParent</code> method here.
    *
    * @return a <code>CMRBugEJBLocal</code> value
    * @ejb:interface-method
    * @ejb:relation name="CMRBug-CMRBug"
    *               role-name="parent"
    *               cascade-delete="yes"
    * @jboss:auto-key-fields
    */
   public abstract CMRBugEJBLocal getParent();

   /**
    * Describe <code>setParent</code> method here.
    *
    * @param parent a <code>CMRBugEJBLocal</code> value
    * @ejb:interface-method
    */
   public abstract void setParent(CMRBugEJBLocal parent);

   /**
    * Describe <code>getChildren</code> method here.
    *
    * @return a <code>Collection</code> value
    * @ejb:interface-method
    * @ejb:relation name="CMRBug-CMRBug"
    *               role-name="children"
    *               multiple="yes"
    * @jboss:auto-key-fields
    */
   public abstract Collection getChildren();

   /**
    * Describe <code>setChildren</code> method here.
    *
    * @param children a <code>Collection</code> value
    * @ejb:interface-method
    */
   public abstract void setChildren(Collection children);

   /**
    * Describe <code>addChild</code> method here.
    *
    * @param child a <code>CMRBugEJBLocal</code> value
    * @return a <code>boolean</code> value
    * @ejb:interface-method
    */
   public boolean addChild(CMRBugEJBLocal child)
   {
      try
      {
         Collection children = getChildren();
         return children.add(child);
      }
      catch(Exception e)
      {
         throw new EJBException(e);
      }
   }

   /**
    * Describe <code>removeChild</code> method here.
    *
    * @param child a <code>CMRBugEJBLocal</code> value
    * @return a <code>boolean</code> value
    * @ejb:interface-method
    */
   public boolean removeChild(CMRBugEJBLocal child)
   {
      try
      {
         Collection children = getChildren();
         return children.remove(child);
      }
      catch(Exception e)
      {
         throw new EJBException(e);
      }
   }

   //
   // The following is the linked list implementation. It is implemented with unidirectional CMRs.
   // These are used to test correct foreign key state initialization when the foreign key
   // loaded is not a valid value, i.e. the relationship was already changed in the tx.
   //

   /**
    * @ejb:interface-method view-type="local"
    * @ejb:relation
    *    name="viewcomponent-prevnode"
    *    role-name="one-viewcomponent-has-one-previous-node"
    *    target-role-name="one-prev-belogs-to-one-viewcomponent"
    *    target-ejb="CMRBugEJB"
    *    target-multiple="no"
    * @jboss:relation
    *   related-pk-field="id"
    *   fk-column="prev_id_fk"
    */
   public abstract CMRBugEJBLocal getPrevNode();
   /**
    * @ejb:interface-method view-type="local"
    */
   public abstract void setPrevNode(CMRBugEJBLocal a_ViewComponent);

   /**
    * @ejb:interface-method view-type="local"
    * @ejb:relation
    *    name="viewcomponent-nextnode"
    *    role-name="one-viewcomponent-has-one-following-node"
    *    target-role-name="one-following-node-belogs-to-one-viewcomponent"
    *    target-ejb="CMRBugEJB"
    *    target-multiple="no"
    * @jboss:relation
    *   related-pk-field="id"
    *   fk-column="next_id_fk"
    */
   public abstract CMRBugEJBLocal getNextNode();
   /**
    * @ejb:interface-method view-type="local"
    */
   public abstract void setNextNode(CMRBugEJBLocal a_ViewComponent);

   // --------------------------------------------------------------------------
   // EntityBean methods
   //

   /**
    * Describe <code>ejbCreate</code> method here.
    *
    * @param id a <code>String</code> value
    * @param description a <code>String</code> value
    * @param parent a <code>CMRBugEJBLocal</code> value
    * @return an <code>Integer</code> value
    * @exception CreateException if an error occurs
    * @ejb:create-method
    */
   public String ejbCreate(String id, String description, CMRBugEJBLocal parent)
      throws CreateException
   {
      setId(id);
      setDescription(description);

      // CMP beans return null for this method
      //
      return null;
   }

   /**
    * Describe <code>ejbPostCreate</code> method here.
    *
    * @param id a <code>String</code> value
    * @param description a <code>String</code> value
    * @param parent a <code>CMRBugEJBLocal</code> value
    * @exception CreateException if an error occurs
    */
   public void ejbPostCreate(String id, String description, CMRBugEJBLocal parent)
      throws CreateException
   {
      // must set the CMR fields in the post create
      //
      setParent(parent);
   }

   public void setEntityContext(EntityContext context)
   {
      this.context = context;
   }

   public void unsetEntityContext()
   {
      context = null;
   }

   public void ejbRemove()
   {
   }

   public void ejbLoad()
   {
   }

   public void ejbStore()
   {
   }

   public void ejbActivate()
   {
   }

   public void ejbPassivate()
   {
   }
}
