[jboss-cvs] jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking ...

Peter Muir peter at bleepbleep.org.uk
Sun Nov 25 08:12:01 EST 2007


  User: pmuir   
  Date: 07/11/25 08:12:01

  Added:       examples/nestedbooking/src/org/jboss/seam/example/booking                    
                        Hotel.java HotelBookingAction.java
                        HotelSearchingAction.java BookingList.java
                        RoomHome.java RoomPreference.java Booking.java
                        RoomPreferenceAction.java Register.java
                        RoomList.java AuthenticatorAction.java User.java
                        Room.java HotelBooking.java ChangePassword.java
                        HotelSearching.java ChangePasswordAction.java
                        RegisterAction.java BookingListAction.java
                        Authenticator.java
  Log:
  JBSEAM-2293 - nested conversations example - thanks to Jacob Orshalick
  
  Revision  Changes    Path
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/Hotel.java
  
  Index: Hotel.java
  ===================================================================
  //$Id: Hotel.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import java.io.Serializable;
  import java.math.BigDecimal;
  import java.util.ArrayList;
  import java.util.Date;
  import java.util.List;
  
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Id;
  import javax.persistence.JoinColumn;
  import javax.persistence.OneToMany;
  import javax.persistence.Transient;
  
  import org.hibernate.validator.Length;
  import org.hibernate.validator.NotNull;
  import org.jboss.seam.annotations.Name;
  
  @Entity
  @Name("hotel")
  public class Hotel implements Serializable
  {
     private Long id;
     private String name;
     private String address;
     private String city;
     private String state;
     private String zip;
     private String country;
     private List<Room> rooms;
     
     Hotel() {
  	   this.rooms = new ArrayList<Room>();
     }
     
     @Id @GeneratedValue
     public Long getId()
     {
        return id;
     }
     public void setId(Long id)
     {
        this.id = id;
     }
     
     @Length(max=50) @NotNull
     public String getName()
     {
        return name;
     }
     public void setName(String name)
     {
        this.name = name;
     }
     
     @Length(max=100) @NotNull
     public String getAddress()
     {
        return address;
     }
     public void setAddress(String address)
     {
        this.address = address;
     }
     
     @Length(max=40) @NotNull
     public String getCity()
     {
        return city;
     }
     public void setCity(String city)
     {
        this.city = city;
     }
     
     @Length(min=4, max=6) @NotNull
     public String getZip()
     {
        return zip;
     }
     public void setZip(String zip)
     {
        this.zip = zip;
     }
     
     @Length(min=2, max=10) @NotNull
     public String getState()
     {
        return state;
     }
     public void setState(String state)
     {
        this.state = state;
     }
     
     @Length(min=2, max=40) @NotNull
     public String getCountry()
     {
        return country;
     }
     public void setCountry(String country)
     {
        this.country = country;
     }
  
     @Transient
     public BigDecimal getMinPrice()
     {
        return this.getStandardRoom().getPrice();
     }
     
     @Transient
     public BigDecimal getMaxPrice()
     {
  	  BigDecimal maxPrice = this.getRooms().get(0).getPrice();
  	  
  	  for(int i = 1; i < this.getRooms().size(); i++) {
  		  Room room = this.getRooms().get(i);
  		  
   		  if(maxPrice.compareTo(room.getPrice()) < 0) {
   			  maxPrice = room.getPrice();
   		  }
   	  }
  	  
        return maxPrice;
     }
     
     @OneToMany
     @JoinColumn(name="HOTEL_ID")
     public List<Room> getRooms() {
   	return rooms;
     }
     
     public void setRooms(List<Room> roomsSelections) {
   	this.rooms = roomsSelections;
     }
     
     @Transient
     public List<Room> getAvailableRooms(Date checkinDate, Date checkoutDate) {
  	   // checking could be performed here to determine which
  	   // rooms are available for the provided dates. to simplify
  	   // the example, just return the list of rooms
  	   
  	   return rooms;
     }
     
     @Transient
     public Room getStandardRoom() {
   	  for(Room room : this.getRooms()) {
   		  if(room.isIncluded()) {
   			  return room;
   		  }
   	  }
   	  
   	  return null;
     }
     
     @Override
     public String toString()
     {
        return "Hotel(" + name + "," + address + "," + city + "," + zip + ")";
     }
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/HotelBookingAction.java
  
  Index: HotelBookingAction.java
  ===================================================================
  //$Id: HotelBookingAction.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  import static javax.persistence.PersistenceContextType.EXTENDED;
  import java.util.Calendar;
  import javax.ejb.Remove;
  import javax.ejb.Stateful;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import org.jboss.seam.annotations.Begin;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Out;
  import org.jboss.seam.annotations.security.Restrict;
  import org.jboss.seam.core.Conversation;
  import org.jboss.seam.core.Events;
  import org.jboss.seam.faces.FacesMessages;
  import org.jboss.seam.log.Log;
  
  @Stateful
  @Name("hotelBooking")
  @Restrict("#{identity.loggedIn}")
  public class HotelBookingAction implements HotelBooking
  {
     
     @PersistenceContext(type=EXTENDED)
     private EntityManager em;
     
     @In 
     private User user;
     
     @In(required=false) @Out
     private Hotel hotel;
     
     @In(required=false) 
     @Out(required=false)
     private Booking booking;
     
     @In(required=false)
     private Room roomSelection;
     
     @In
     private FacesMessages facesMessages;
        
     @In
     private Events events;
     
     @Logger 
     private Log log;
     
     @Begin
     public void selectHotel(Hotel selectedHotel)
     {
        hotel = em.merge(selectedHotel);
     }
     
     public String setBookingDates()
     {
  		// the result will indicate whether or not to begin the nested conversation
  		// as well as the navigation.  if a null result is returned, the nested
  		// conversation will not begin, and the user will be returned to the current
  		// page to fix validation issues
  		String result = null;
  	  
  		Calendar calendar = Calendar.getInstance();
  		calendar.add(Calendar.DAY_OF_MONTH, -1);
  		   
  		// validate what we have received from the user so far
  		if ( booking.getCheckinDate().before( calendar.getTime() ) )
  		{
  			facesMessages.addToControl("checkinDate", "Check in date must be a future date");
  		}
  		else if ( !booking.getCheckinDate().before( booking.getCheckoutDate() ) )
  		{
  			facesMessages.addToControl("checkoutDate", "Check out date must be later than check in date");
  		}
  		else
  		{
  			result = "rooms";
  		}
  		
  		return result;
     }
     
     public void bookHotel()
     {      
        booking = new Booking(hotel, user);
        Calendar calendar = Calendar.getInstance();
        booking.setCheckinDate( calendar.getTime() );
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        booking.setCheckoutDate( calendar.getTime() );
     }
     
     public void confirm()
     {
  	  // on confirmation we set the room preference in the booking.  the room preference
  	  // will be injected based on the nested conversation we are in.
  	  booking.setRoomPreference(roomSelection);
  	  
        em.persist(booking);
        facesMessages.add("Thank you, #{user.name}, your confimation number for #{hotel.name} is #{booking.id}");
        log.info("New booking: #{booking.id} for #{user.username}");
        events.raiseTransactionSuccessEvent("bookingConfirmed");
        
        this.endRoot();
     }
     
     public void cancel() {
  	   this.endRootBeforeRedirect();
     }
     
     @Destroy @Remove
     public void destroy() {}
     
     /**
      * End the root conversation in case we are currently in a nested conversation.
      * Currently this can only be done programatically, but if you are interested
      * in this feature being supported by Seam vote on:
      * 
      *	http://jira.jboss.org/jira/browse/JBSEAM-1943
      */
     private void endRoot() {
  	   Conversation conversation = Conversation.instance();
  	   
  	   if(conversation.isNested()) {
  		   conversation.root();
  	   }
  	
  	   conversation.end();
     }
  	
     /**
  	 * End the root conversation prior to redirect in case we are currently in a 
  	 * nested conversation.  Currently this can only be done programatically, but 
  	 * if you are interested in this feature being supported by Seam vote on:
  	 * 
  	 *	http://jira.jboss.org/jira/browse/JBSEAM-1943
  	 */
     private void endRootBeforeRedirect() {
  		Conversation conversation = Conversation.instance();
  	   
  		if(conversation.isNested()) {
  			conversation.root();
  		}
  	   
  		conversation.endBeforeRedirect();
  	}
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/HotelSearchingAction.java
  
  Index: HotelSearchingAction.java
  ===================================================================
  //$Id: HotelSearchingAction.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  import java.util.List;
  import javax.ejb.Remove;
  import javax.ejb.Stateful;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.Factory;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.datamodel.DataModel;
  import org.jboss.seam.annotations.security.Restrict;
  
  @Stateful
  @Name("hotelSearch")
  @Scope(ScopeType.SESSION)
  @Restrict("#{identity.loggedIn}")
  public class HotelSearchingAction implements HotelSearching
  {
     
     @PersistenceContext
     private EntityManager em;
     
     private String searchString;
     private int pageSize = 10;
     private int page;
     
     @DataModel
     private List<Hotel> hotels;
     
     public void find()
     {
        page = 0;
        queryHotels();
     }
     public void nextPage()
     {
        page++;
        queryHotels();
     }
        
     private void queryHotels()
     {
        hotels = em.createQuery("select h from Hotel h where lower(h.name) like #{pattern} or lower(h.city) like #{pattern} or lower(h.zip) like #{pattern} or lower(h.address) like #{pattern}")
              .setMaxResults(pageSize)
              .setFirstResult( page * pageSize )
              .getResultList();
     }
     
     public boolean isNextPageAvailable()
     {
        return hotels!=null && hotels.size()==pageSize;
     }
     
     public int getPageSize() {
        return pageSize;
     }
     
     public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
     }
     
     @Factory(value="pattern", scope=ScopeType.EVENT)
     public String getSearchPattern()
     {
        return searchString==null ? 
              "%" : '%' + searchString.toLowerCase().replace('*', '%') + '%';
     }
     
     public String getSearchString()
     {
        return searchString;
     }
     
     public void setSearchString(String searchString)
     {
        this.searchString = searchString;
     }
     
     @Destroy @Remove
     public void destroy() {}
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/BookingList.java
  
  Index: BookingList.java
  ===================================================================
  //$Id: BookingList.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import javax.ejb.Local;
  
  @Local
  public interface BookingList
  {
     public void getBookings();
     public Booking getBooking();
     public void cancel();
     public void destroy();
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/RoomHome.java
  
  Index: RoomHome.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Begin;
  import org.jboss.seam.annotations.web.RequestParameter;
  import org.jboss.seam.framework.EntityHome;
  
  import org.jboss.seam.example.booking.Room;
  
  @Name("roomHome")
  public class RoomHome extends EntityHome<Room>
  {
  
      @RequestParameter
      Long roomId;
      
      @Override
      public Object getId() 
      { 
          if (roomId==null)
          {
              return super.getId();
          }
          else
          {
              return roomId;
          }
      }
      
      @Override @Begin
      public void create() {
          super.create();
      }
   	
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/RoomPreference.java
  
  Index: RoomPreference.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import java.math.BigDecimal;
  
  import javax.ejb.Local;
  
  @Local
  public interface RoomPreference {
  	public void loadAvailableRooms();
  	
  	public String selectPreference();
  	
  	public BigDecimal getExpectedPrice();
  	
  	public String requestConfirmation();
  	
  	public String cancel();
  	
  	public void destroy();
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/Booking.java
  
  Index: Booking.java
  ===================================================================
  //$Id: Booking.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import java.io.Serializable;
  import java.math.BigDecimal;
  import java.text.DateFormat;
  import java.util.Date;
  
  import javax.persistence.Basic;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Id;
  import javax.persistence.ManyToOne;
  import javax.persistence.Temporal;
  import javax.persistence.TemporalType;
  import javax.persistence.Transient;
  
  import org.hibernate.validator.Length;
  import org.hibernate.validator.NotNull;
  import org.hibernate.validator.Pattern;
  import org.jboss.seam.annotations.Name;
  
  @Entity
  @Name("booking")
  public class Booking implements Serializable
  {
     private Long id;
     private User user;
     private Hotel hotel;
     private Date checkinDate;
     private Date checkoutDate;
     private String creditCard;
     private String creditCardName;
     private int creditCardExpiryMonth;
     private int creditCardExpiryYear;
     private Room roomPreference;
     
     public Booking() {}
     
     public Booking(Hotel hotel, User user)
     {
        this.hotel = hotel;
        this.user = user;
        this.roomPreference = this.hotel.getStandardRoom();
     }
     
     @Transient
     public BigDecimal getTotal()
     {
        return getTotal(roomPreference);
     }
     
     @Transient
     public BigDecimal getTotal(Room room)
     {
  	   return room.getPrice().multiply(new BigDecimal(getNights()));
     }
     
     @Transient
     public int getNights()
     {
        return (int) ( checkoutDate.getTime() - checkinDate.getTime() ) / 1000 / 60 / 60 / 24;
     }
  
     @Id @GeneratedValue
     public Long getId()
     {
        return id;
     }
     public void setId(Long id)
     {
        this.id = id;
     }
     
     @NotNull
     @Basic @Temporal(TemporalType.DATE) 
     public Date getCheckinDate()
     {
        return checkinDate;
     }
     public void setCheckinDate(Date datetime)
     {
        this.checkinDate = datetime;
     }
  
     @ManyToOne @NotNull
     public Hotel getHotel()
     {
        return hotel;
     }
     public void setHotel(Hotel hotel)
     {
        this.hotel = hotel;
     }
     
     @ManyToOne @NotNull
     public User getUser()
     {
        return user;
     }
     public void setUser(User user)
     {
        this.user = user;
     }
     
     @Basic @Temporal(TemporalType.DATE) 
     @NotNull
     public Date getCheckoutDate()
     {
        return checkoutDate;
     }
     public void setCheckoutDate(Date checkoutDate)
     {
        this.checkoutDate = checkoutDate;
     }
     
     @NotNull(message="Credit card number is required")
     @Length(min=16, max=16, message="Credit card number must 16 digits long")
     @Pattern(regex="^\\d*$", message="Credit card number must be numeric")
     public String getCreditCard()
     {
        return creditCard;
     }
  
     public void setCreditCard(String creditCard)
     {
        this.creditCard = creditCard;
     }
     
     @Transient
     public String getDescription()
     {
        DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
        return hotel==null ? null : hotel.getName() + 
              ", " + df.format( getCheckinDate() ) + 
              " to " + df.format( getCheckoutDate() );
     }
  
     @ManyToOne @NotNull
     public Room getRoomPreference() {
  	  return roomPreference;
     }
  	
     public void setRoomPreference(Room roomPreference) {
  	  this.roomPreference = roomPreference;
     }
     
     @NotNull(message="Credit card name is required")
     @Length(min=3, max=70, message="Credit card name is required")
     public String getCreditCardName()
     {
        return creditCardName;
     }
  
     public void setCreditCardName(String creditCardName)
     {
        this.creditCardName = creditCardName;
     }
  
     public int getCreditCardExpiryMonth()
     {
        return creditCardExpiryMonth;
     }
  
     public void setCreditCardExpiryMonth(int creditCardExpiryMonth)
     {
        this.creditCardExpiryMonth = creditCardExpiryMonth;
     }
  
     public int getCreditCardExpiryYear()
     {
        return creditCardExpiryYear;
     }
  
     public void setCreditCardExpiryYear(int creditCardExpiryYear)
     {
        this.creditCardExpiryYear = creditCardExpiryYear;
     }
     
     @Override
     public String toString()
     {
        return "Booking(" + user + ","+ hotel + ")";
     }
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/RoomPreferenceAction.java
  
  Index: RoomPreferenceAction.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import java.math.BigDecimal;
  import java.util.List;
  
  import javax.ejb.Remove;
  import javax.ejb.Stateful;
  
  import org.jboss.seam.annotations.Begin;
  import org.jboss.seam.annotations.Factory;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.End;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Out;
  import org.jboss.seam.annotations.datamodel.DataModel;
  import org.jboss.seam.annotations.datamodel.DataModelSelection;
  import org.jboss.seam.annotations.security.Restrict;
  import org.jboss.seam.log.Log;
  
  @Stateful
  @Name("roomPreference")
  @Restrict("#{identity.loggedIn}")
  public class RoomPreferenceAction implements RoomPreference {
  	
      @Logger private Log log;
      
      @In(required=false)
      @Out
      private Hotel hotel;
      
      @In(required=false) 
      @Out(required=false)
      private Booking booking;
      
      @DataModel(value="availableRooms")
      private List<Room> availableRooms;
      
      @DataModelSelection(value="availableRooms")
  	@In(required=false, value="roomSelection")
  	@Out(required=false, value="roomSelection")
  	private Room roomSelection;
      
      @Factory("availableRooms")
      public void loadAvailableRooms()
      {
      	this.availableRooms = 
      		this.hotel.getAvailableRooms(booking.getCheckinDate(), booking.getCheckoutDate());
      	
      	log.info("Retrieved #0 available rooms", availableRooms.size());
      }
      
      public BigDecimal getExpectedPrice()
      {
      	log.info("Retrieving price for room #0", roomSelection.getName());
      	
      	return booking.getTotal(roomSelection);
      }
      
      @Begin(nested=true)
  	public String selectPreference()
  	{
      	// seam takes care of everything for us here.  we don't have to do anything other
      	// than send the appropriate outcome to forward to the payment screen.
  		log.info("Room selected");
  		
  		return "payment";
  	}
  	
  	public String requestConfirmation()
  	{
  		// all validations are performed through the s:validateAll, so checks are already
  		// performed
  		log.info("Request confirmation from user");
  		
  		return "confirm";
  	}
  	
  	@End(beforeRedirect=true)
  	public String cancel()
  	{
          log.info("ending conversation");
          
  		return "cancel";
  	}
  	
  	@Destroy @Remove                                                                      
  	public void destroy() {}	
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/Register.java
  
  Index: Register.java
  ===================================================================
  //$Id: Register.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import javax.ejb.Local;
  
  @Local
  public interface Register
  {
     public void register();
     public void invalid();
     public String getVerify();
     public void setVerify(String verify);
     public boolean isRegistered();
     
     public void destroy();
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/RoomList.java
  
  Index: RoomList.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.framework.EntityQuery;
  
  @Name("roomList")
  public class RoomList extends EntityQuery
  {
      @Override
      public String getEjbql() 
      { 
          return "select room from Room room";
      }
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/AuthenticatorAction.java
  
  Index: AuthenticatorAction.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import static org.jboss.seam.ScopeType.SESSION;
  
  import java.util.List;
  
  import javax.ejb.Stateless;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Out;
  
  @Stateless
  @Name("authenticator")
  public class AuthenticatorAction implements Authenticator
  {
     @PersistenceContext EntityManager em;
     
     @Out(required=false, scope = SESSION)
     private User user;
     
     public boolean authenticate()
     {
        List results = em.createQuery("select u from User u where u.username=#{identity.username} and u.password=#{identity.password}")
              .getResultList();
        
        if ( results.size()==0 )
        {
           return false;
        }
        else
        {
           user = (User) results.get(0);
           return true;
        }
     }
  
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/User.java
  
  Index: User.java
  ===================================================================
  //$Id: User.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import static org.jboss.seam.ScopeType.SESSION;
  
  import java.io.Serializable;
  
  import javax.persistence.Entity;
  import javax.persistence.Id;
  import javax.persistence.Table;
  
  import org.hibernate.validator.Length;
  import org.hibernate.validator.NotNull;
  import org.hibernate.validator.Pattern;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  
  @Entity
  @Name("user")
  @Scope(SESSION)
  @Table(name="Customer")
  public class User implements Serializable
  {
     private String username;
     private String password;
     private String name;
     
     public User(String name, String password, String username)
     {
        this.name = name;
        this.password = password;
        this.username = username;
     }
     
     public User() {}
  
     @NotNull
     @Length(max=100)
     public String getName()
     {
        return name;
     }
     public void setName(String name)
     {
        this.name = name;
     }
     
     @NotNull
     @Length(min=4, max=15)
     public String getPassword()
     {
        return password;
     }
     public void setPassword(String password)
     {
        this.password = password;
     }
     
     @Id
     @Length(min=4, max=15)
     @Pattern(regex="^\\w*$", message="not a valid username")
     public String getUsername()
     {
        return username;
     }
     public void setUsername(String username)
     {
        this.username = username;
     }
     
     @Override
     public String toString() 
     {
        return "User(" + username + ")";
     }
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/Room.java
  
  Index: Room.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import java.io.Serializable;
  import java.math.BigDecimal;
  
  import javax.persistence.Entity;
  import javax.persistence.Id;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Transient;
  
  import org.hibernate.validator.Length;
  import org.jboss.seam.annotations.Name;
  
  @Entity
  @Name("room")
  public class Room implements Serializable {
  	private Long id;
  	private String name;
  	private String description;
  	private boolean included;
  	private BigDecimal price;
  	
  	@Id @GeneratedValue
  	public Long getId() {
  	     return id;
  	}
  
  	public void setId(Long id) {
  	     this.id = id;
  	}
  	
  	@Length(max=20)
  	public String getName() {
  	     return name;
  	}
  
  	public void setName(String name) {
  	     this.name = name;
  	}
  	
  	public String getDescription() {
  		return description;
  	}
  	
  	public void setDescription(String description) {
  		this.description = description;
  	}
  	
  	public boolean isIncluded() {
  		return included;
  	}
  	
  	public void setIncluded(boolean included) {
  		this.included = included;
  	}
  
  	public BigDecimal getPrice() {
  		return price;
  	}
  
  	public void setPrice(BigDecimal price) {
  		this.price = price;
  	}	
  	
  	@Transient
  	public BigDecimal getPrice(int numNights) {
  		return price.multiply(new BigDecimal(numNights));
  	}
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/HotelBooking.java
  
  Index: HotelBooking.java
  ===================================================================
  //$Id: HotelBooking.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import javax.ejb.Local;
  
  @Local
  public interface HotelBooking
  {
     public void selectHotel(Hotel selectedHotel);
     
     public void bookHotel();
     
     public String setBookingDates();
     
     public void confirm();
     
     public void cancel();
     
     public void destroy();
     
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/ChangePassword.java
  
  Index: ChangePassword.java
  ===================================================================
  //$Id: ChangePassword.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import javax.ejb.Local;
  
  @Local
  public interface ChangePassword
  {
     public void changePassword();
     public boolean isChanged();
     
     public String getVerify();
     public void setVerify(String verify);
     
     public void destroy();
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/HotelSearching.java
  
  Index: HotelSearching.java
  ===================================================================
  //$Id: HotelSearching.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  
  import javax.ejb.Local;
  
  @Local
  public interface HotelSearching
  {
     public int getPageSize();
     public void setPageSize(int pageSize);
     
     public String getSearchString();
     public void setSearchString(String searchString);
     
     public String getSearchPattern();
     
     public void find();
     public void nextPage();
     public boolean isNextPageAvailable();
  
     public void destroy();
     
  }
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/ChangePasswordAction.java
  
  Index: ChangePasswordAction.java
  ===================================================================
  //$Id: ChangePasswordAction.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  import static org.jboss.seam.ScopeType.EVENT;
  import javax.ejb.Remove;
  import javax.ejb.Stateful;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Out;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.security.Restrict;
  import org.jboss.seam.faces.FacesMessages;
  
  @Stateful
  @Scope(EVENT)
  @Name("changePassword")
  @Restrict("#{identity.loggedIn}")
  public class ChangePasswordAction implements ChangePassword
  {
     @In @Out
     private User user;
     
     @PersistenceContext
     private EntityManager em;
     
     private String verify;
     
     private boolean changed;
     
     @In
     private FacesMessages facesMessages;
     
     public void changePassword()
     {
        if ( user.getPassword().equals(verify) )
        {
           user = em.merge(user);
           facesMessages.add("Password updated");
           changed = true;
        }
        else 
        {
           facesMessages.addToControl("verify", "Re-enter new password");
           revertUser();
           verify=null;
        }
     }
     
     public boolean isChanged()
     {
        return changed;
     }
     
     private void revertUser()
     {
        user = em.find(User.class, user.getUsername());
     }
     public String getVerify()
     {
        return verify;
     }
     public void setVerify(String verify)
     {
        this.verify = verify;
     }
     
     @Destroy @Remove
     public void destroy() {}
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/RegisterAction.java
  
  Index: RegisterAction.java
  ===================================================================
  //$Id: RegisterAction.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  import static org.jboss.seam.ScopeType.EVENT;
  import java.util.List;
  import javax.ejb.Remove;
  import javax.ejb.Stateful;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.faces.FacesMessages;
  @Stateful
  @Scope(EVENT)
  @Name("register")
  public class RegisterAction implements Register
  {
     @In
     private User user;
     
     @PersistenceContext
     private EntityManager em;
     
     @In
     private FacesMessages facesMessages;
     
     private String verify;
     
     private boolean registered;
     
     public void register()
     {
        if ( user.getPassword().equals(verify) )
        {
           List existing = em.createQuery("select u.username from User u where u.username=#{user.username}")
              .getResultList();
           if (existing.size()==0)
           {
              em.persist(user);
              facesMessages.add("Successfully registered as #{user.username}");
              registered = true;
           }
           else
           {
              facesMessages.addToControl("username", "Username #{user.username} already exists");
           }
        }
        else 
        {
           facesMessages.addToControl("verify", "Re-enter your password");
           verify=null;
        }
     }
     
     public void invalid()
     {
        facesMessages.add("Please try again");
     }
     
     public boolean isRegistered()
     {
        return registered;
     }
     public String getVerify()
     {
        return verify;
     }
     public void setVerify(String verify)
     {
        this.verify = verify;
     }
     
     @Destroy @Remove
     public void destroy() {}
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/BookingListAction.java
  
  Index: BookingListAction.java
  ===================================================================
  //$Id: BookingListAction.java,v 1.1 2007/11/25 13:12:01 pmuir Exp $
  package org.jboss.seam.example.booking;
  import static javax.ejb.TransactionAttributeType.REQUIRES_NEW;
  import static org.jboss.seam.ScopeType.SESSION;
  import java.io.Serializable;
  import java.util.List;
  import javax.ejb.Remove;
  import javax.ejb.Stateful;
  import javax.ejb.TransactionAttribute;
  import javax.persistence.EntityManager;
  import javax.persistence.PersistenceContext;
  import org.jboss.seam.annotations.Destroy;
  import org.jboss.seam.annotations.Factory;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Observer;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.datamodel.DataModel;
  import org.jboss.seam.annotations.datamodel.DataModelSelection;
  import org.jboss.seam.annotations.security.Restrict;
  import org.jboss.seam.faces.FacesMessages;
  import org.jboss.seam.log.Log;
  
  @Stateful
  @Scope(SESSION)
  @Name("bookingList")
  @Restrict("#{identity.loggedIn}")
  @TransactionAttribute(REQUIRES_NEW)
  public class BookingListAction implements BookingList, Serializable
  {
     private static final long serialVersionUID = 1L;
     @PersistenceContext
     private EntityManager em;
     
     @In
     private User user;
     
     @DataModel
     private List<Booking> bookings;
     @DataModelSelection 
     private Booking booking;
     
     @Logger 
     private Log log;
     
     @Factory
     @Observer("bookingConfirmed")
     public void getBookings()
     {
        bookings = em.createQuery("select b from Booking b where b.user.username = :username order by b.checkinDate")
              .setParameter("username", user.getUsername())
              .getResultList();
     }
     
     public void cancel()
     {
        log.info("Cancel booking: #{bookingList.booking.id} for #{user.username}");
        Booking cancelled = em.find(Booking.class, booking.getId());
        if (cancelled!=null) em.remove( cancelled );
        getBookings();
        FacesMessages.instance().add("Booking cancelled for confirmation number #{bookingList.booking.id}");
     }
     
     public Booking getBooking()
     {
        return booking;
     }
     
     @Destroy @Remove
     public void destroy() {}
  }
  
  
  
  1.1      date: 2007/11/25 13:12:01;  author: pmuir;  state: Exp;jboss-seam/examples/nestedbooking/src/org/jboss/seam/example/booking/Authenticator.java
  
  Index: Authenticator.java
  ===================================================================
  package org.jboss.seam.example.booking;
  
  import javax.ejb.Local;
  
  @Local
  public interface Authenticator
  {
     boolean authenticate();
  }
  
  
  



More information about the jboss-cvs-commits mailing list