content: /**
   *  Licensed to the Apache Software Foundation (ASF) under one or more
   *  contributor license agreements.  See the NOTICE file distributed with
   *  this work for additional information regarding copyright ownership.
   *  The ASF licenses this file to You under the Apache License, Version 2.0
   *  (the "License"); you may not use this file except in compliance with
   *  the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   */
  package org.apache.aries.samples.ariestrader.entities;
  
  import java.io.Serializable;
  import java.math.BigDecimal;
  import java.util.Date;
  import javax.persistence.Column;
  import javax.persistence.Entity;
  import javax.persistence.FetchType;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.JoinColumn;
  import javax.persistence.ManyToOne;
  import javax.persistence.NamedQueries;
  import javax.persistence.NamedQuery;
  import javax.persistence.OneToOne;
  import javax.persistence.Table;
  import javax.persistence.TableGenerator;
  import javax.persistence.Temporal;
  import javax.persistence.TemporalType;
  import javax.persistence.Transient;
  
  import org.apache.aries.samples.ariestrader.api.persistence.AccountDataBean;
  import org.apache.aries.samples.ariestrader.api.persistence.HoldingDataBean;
  import org.apache.aries.samples.ariestrader.api.persistence.OrderDataBean;
  import org.apache.aries.samples.ariestrader.api.persistence.QuoteDataBean;
  import org.apache.aries.samples.ariestrader.util.Log;
  import org.apache.aries.samples.ariestrader.util.TradeConfig;
  
  @Entity(name = "orderejb")
  @Table(name = "orderejb")
  @NamedQueries( {
      @NamedQuery(name = "orderejb.findByOrderfee", query = "SELECT o FROM orderejb o WHERE o.orderFee = :orderfee"),
      @NamedQuery(name = "orderejb.findByCompletiondate", query = "SELECT o FROM orderejb o WHERE o.completionDate = :completiondate"),
      @NamedQuery(name = "orderejb.findByOrdertype", query = "SELECT o FROM orderejb o WHERE o.orderType = :ordertype"),
      @NamedQuery(name = "orderejb.findByOrderstatus", query = "SELECT o FROM orderejb o WHERE o.orderStatus = :orderstatus"),
      @NamedQuery(name = "orderejb.findByPrice", query = "SELECT o FROM orderejb o WHERE o.price = :price"),
      @NamedQuery(name = "orderejb.findByQuantity", query = "SELECT o FROM orderejb o WHERE o.quantity = :quantity"),
      @NamedQuery(name = "orderejb.findByOpendate", query = "SELECT o FROM orderejb o WHERE o.openDate = :opendate"),
      @NamedQuery(name = "orderejb.findByOrderid", query = "SELECT o FROM orderejb o WHERE o.orderID = :orderid"),
      @NamedQuery(name = "orderejb.findByAccountAccountid", query = "SELECT o FROM orderejb o WHERE o.account.accountID = :accountAccountid"),
      @NamedQuery(name = "orderejb.findByQuoteSymbol", query = "SELECT o FROM orderejb o WHERE o.quote.symbol = :quoteSymbol"),
      @NamedQuery(name = "orderejb.findByHoldingHoldingid", query = "SELECT o FROM orderejb o WHERE o.holding.holdingID = :holdingHoldingid"),
      @NamedQuery(name = "orderejb.closedOrders", query = "SELECT o FROM orderejb o WHERE o.orderStatus = 'closed' AND o.account.profile.userID  = :userID"),
      @NamedQuery(name = "orderejb.completeClosedOrders", query = "UPDATE orderejb o SET o.orderStatus = 'completed' WHERE o.orderStatus = 'closed' AND o.account.profile.userID  = :userID")
  })
  
  public class OrderDataBeanImpl implements OrderDataBean, Serializable {
  
  	@TableGenerator(name = "orderIdGen", table = "KEYGENEJB", pkColumnName = "KEYNAME", valueColumnName = "KEYVAL", pkColumnValue = "order", allocationSize = 1000)
  	@Id
  	@GeneratedValue(strategy = GenerationType.TABLE, generator = "orderIdGen")
  	@Column(name = "ORDERID", nullable = false)
  	private Integer orderID; /* orderID */
  
  	@Column(name = "ORDERTYPE", length = 255)
  	private String orderType; /* orderType (buy, sell, etc.) */
  
  	@Column(name = "ORDERSTATUS", length = 255)
  	private String orderStatus; /*
  								 * orderStatus (open, processing, completed,
  								 * closed, canceled)
  								 */
  	@Column(name = "OPENDATE")
  	@Temporal(TemporalType.TIMESTAMP)
  	private Date openDate; /* openDate (when the order was entered) */
  
  	@Column(name = "COMPLETIONDATE")
      @Temporal(TemporalType.TIMESTAMP)
  	private Date completionDate; /* completionDate */
  
  	@Column(name = "QUANTITY", nullable = false)
      	private double quantity; /* quantity */
  
  	@Column(name = "PRICE")
      private BigDecimal price; /* price */
  
  	@Column(name = "ORDERFEE")
      private BigDecimal orderFee; /* price */
  
  	@ManyToOne(fetch = FetchType.LAZY)
  	@JoinColumn(name="ACCOUNT_ACCOUNTID")
      private AccountDataBeanImpl account;
  
  	@ManyToOne(fetch = FetchType.EAGER)
  	@JoinColumn(name = "QUOTE_SYMBOL", columnDefinition="VARCHAR(255)")
      private QuoteDataBeanImpl quote;
  
  	@OneToOne(fetch = FetchType.LAZY)
  	@JoinColumn(name = "HOLDING_HOLDINGID")
      private HoldingDataBeanImpl holding;
  	
  
  	 @Transient
  	private String symbol;
  
  	public OrderDataBeanImpl() {
  	}
  
  	public OrderDataBeanImpl(Integer orderID, String orderType, String orderStatus,
  			Date openDate, Date completionDate, double quantity,
  			BigDecimal price, BigDecimal orderFee, String symbol) {
  		setOrderID(orderID);
  		setOrderType(orderType);
  		setOrderStatus(orderStatus);
  		setOpenDate(openDate);
  		setCompletionDate(completionDate);
  		setQuantity(quantity);
  		setPrice(price);
  		setOrderFee(orderFee);
  		setSymbol(symbol);
  	}
  
  	public OrderDataBeanImpl(String orderType, String orderStatus, Date openDate,
  			Date completionDate, double quantity, BigDecimal price,
  			BigDecimal orderFee, AccountDataBean account, QuoteDataBean quote,
  			HoldingDataBean holding) {
  		setOrderType(orderType);
  		setOrderStatus(orderStatus);
  		setOpenDate(openDate);
  		setCompletionDate(completionDate);
  		setQuantity(quantity);
  		setPrice(price);
  		setOrderFee(orderFee);
  		setAccount(account);
  		setQuote(quote);
  		setHolding(holding);
  	}
  
  	public static OrderDataBean getRandomInstance() {
  		return new OrderDataBeanImpl(new Integer(TradeConfig.rndInt(100000)),
  				TradeConfig.rndBoolean() ? "buy" : "sell", "open",
  				new java.util.Date(TradeConfig.rndInt(Integer.MAX_VALUE)),
  				new java.util.Date(TradeConfig.rndInt(Integer.MAX_VALUE)),
  				TradeConfig.rndQuantity(), TradeConfig.rndBigDecimal(1000.0f),
  				TradeConfig.rndBigDecimal(1000.0f), TradeConfig.rndSymbol());
  	}
  
  	public String toString() {
  		return "Order " + getOrderID() + "\n\t      orderType: "
  				+ getOrderType() + "\n\t    orderStatus: " + getOrderStatus()
  				+ "\n\t       openDate: " + getOpenDate()
  				+ "\n\t completionDate: " + getCompletionDate()
  				+ "\n\t       quantity: " + getQuantity()
  				+ "\n\t          price: " + getPrice()
  				+ "\n\t       orderFee: " + getOrderFee()
  				+ "\n\t         symbol: " + getSymbol();
  	}
  
  	public String toHTML() {
  		return "<BR>Order <B>" + getOrderID() + "</B>"
  				+ "<LI>      orderType: " + getOrderType() + "</LI>"
  				+ "<LI>    orderStatus: " + getOrderStatus() + "</LI>"
  				+ "<LI>       openDate: " + getOpenDate() + "</LI>"
  				+ "<LI> completionDate: " + getCompletionDate() + "</LI>"
  				+ "<LI>       quantity: " + getQuantity() + "</LI>"
  				+ "<LI>          price: " + getPrice() + "</LI>"
  				+ "<LI>       orderFee: " + getOrderFee() + "</LI>"
  				+ "<LI>         symbol: " + getSymbol() + "</LI>";
  	}
  
  	public void print() {
  		Log.log(this.toString());
  	}
  
  	public Integer getOrderID() {
  		return orderID;
  	}
  
  	public void setOrderID(Integer orderID) {
  		this.orderID = orderID;
  	}
  
  	public String getOrderType() {
  		return orderType;
  	}
  
  	public void setOrderType(String orderType) {
  		this.orderType = orderType;
  	}
  
  	public String getOrderStatus() {
  		return orderStatus;
  	}
  
  	public void setOrderStatus(String orderStatus) {
  		this.orderStatus = orderStatus;
  	}
  
  	public Date getOpenDate() {
  		return openDate;
  	}
  
  	public void setOpenDate(Date openDate) {
  		this.openDate = openDate;
  	}
  
  	public Date getCompletionDate() {
  		return completionDate;
  	}
  
  	public void setCompletionDate(Date completionDate) {
  		this.completionDate = completionDate;
  	}
  
  	public double getQuantity() {
  		return quantity;
  	}
  
  	public void setQuantity(double quantity) {
  		this.quantity = quantity;
  	}
  
  	public BigDecimal getPrice() {
  		return price;
  	}
  
  	public void setPrice(BigDecimal price) {
  		this.price = price;
  	}
  
  	public BigDecimal getOrderFee() {
  		return orderFee;
  	}
  
  	public void setOrderFee(BigDecimal orderFee) {
  		this.orderFee = orderFee;
  	}
  
  	public String getSymbol() {
  		if (quote != null) {
  			return quote.getSymbol();
  		}
  		return symbol;
  	}
  
  	public void setSymbol(String symbol) {
  		this.symbol = symbol;
  	}
  
  	public AccountDataBean getAccount() {
  		return account;
  	}
  
  	public void setAccount(AccountDataBean account) {
  		this.account = (AccountDataBeanImpl) account;
  	}
  
  	public QuoteDataBean getQuote() {
  		return quote;
  	}
  
  	public void setQuote(QuoteDataBean quote) {
  		this.quote = (QuoteDataBeanImpl) quote;
  	}
  
  	public HoldingDataBean getHolding() {
  		return holding;
  	}
  
  	public void setHolding(HoldingDataBean holding) {
  		this.holding = (HoldingDataBeanImpl) holding;
  	}
  
  	public boolean isBuy() {
  		String orderType = getOrderType();
  		if (orderType.compareToIgnoreCase("buy") == 0)
  			return true;
  		return false;
  	}
  
  	public boolean isSell() {
  		String orderType = getOrderType();
  		if (orderType.compareToIgnoreCase("sell") == 0)
  			return true;
  		return false;
  	}
  
  	public boolean isOpen() {
  		String orderStatus = getOrderStatus();
  		if ((orderStatus.compareToIgnoreCase("open") == 0)
  				|| (orderStatus.compareToIgnoreCase("processing") == 0))
  			return true;
  		return false;
  	}
  
  	public boolean isCompleted() {
  		String orderStatus = getOrderStatus();
  		if ((orderStatus.compareToIgnoreCase("completed") == 0)
  				|| (orderStatus.compareToIgnoreCase("alertcompleted") == 0)
  				|| (orderStatus.compareToIgnoreCase("cancelled") == 0))
  			return true;
  		return false;
  	}
  
  	public boolean isCancelled() {
  		String orderStatus = getOrderStatus();
  		if (orderStatus.compareToIgnoreCase("cancelled") == 0)
  			return true;
  		return false;
  	}
  
  	public void cancel() {
  		setOrderStatus("cancelled");
  	}
  
  	@Override
  	public int hashCode() {
  		int hash = 0;
  		hash += (this.orderID != null ? this.orderID.hashCode() : 0);
  		return hash;
  	}
  
  	@Override
  	public boolean equals(Object object) {
  		// TODO: Warning - this method won't work in the case the id fields are
  		// not set
  		if (!(object instanceof OrderDataBeanImpl)) {
  			return false;
  		}
  		OrderDataBeanImpl other = (OrderDataBeanImpl) object;
  		if (this.orderID != other.orderID
  				&& (this.orderID == null || !this.orderID.equals(other.orderID)))
  			return false;
  		return true;
  	}
  }
  