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

Michael Yuan michael.yuan at jboss.com
Mon Jun 4 18:46:26 EDT 2007


  User: myuan   
  Date: 07/06/04 18:46:26

  Added:       examples/quartz/src/org/jboss/seam/example/quartz       
                        Account.java Digits.java DigitsValidator.java
                        Payment.java PaymentController.java
                        PaymentProcessor.java package-info.java
  Log:
  Add initial support for quartz
  
  Revision  Changes    Path
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/Account.java
  
  Index: Account.java
  ===================================================================
  package org.jboss.seam.example.quartz;
  
  import java.io.Serializable;
  import java.math.BigDecimal;
  import java.util.List;
  
  import javax.persistence.CascadeType;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Id;
  import javax.persistence.OneToMany;
  
  import org.hibernate.validator.NotNull;
  
  @Entity
  public class Account
      implements Serializable
  {
      @Id @GeneratedValue 
      private Long id;
  
      @NotNull
      BigDecimal balance;
  
      @NotNull
      String accountNumber;
      //String login;
      //String password;
         
      @OneToMany(mappedBy="account", cascade=CascadeType.REMOVE)
      //@OrderBy("paymentDate")
      private List<Payment> payments;
     
      public Long getId()
      {
          return id;
      }
      public void setId(Long id)
      {
          this.id = id;
      }
  
      public String getAccountNumber()
      {
          return accountNumber;
      }
      public void setAccountNumber(String accountNumber)
      {
          this.accountNumber = accountNumber;
      }
  
  
      public BigDecimal getBalance()
      {
          return balance;
      }
  
      public BigDecimal adjustBalance(BigDecimal amount) {
          balance = balance.add(amount);
          return balance;
      }
  
      public List<Payment> getPayments() 
      {
          return payments;
      }
  }
  
  
  
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/Digits.java
  
  Index: Digits.java
  ===================================================================
  package org.jboss.seam.example.quartz;
  
  import org.hibernate.validator.*;
  
  import java.lang.annotation.*;
  
  @ValidatorClass(DigitsValidator.class)
  @Target({ElementType.METHOD, ElementType.FIELD}) 
  @Retention(RetentionPolicy.RUNTIME)
  @Documented
  public @interface Digits {
      int integerDigits();
      int fractionalDigits() default 0;
      String message() default "invalid numeric value";
  }
  
  
  
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/DigitsValidator.java
  
  Index: DigitsValidator.java
  ===================================================================
  package org.jboss.seam.example.quartz;
  
  import java.math.BigDecimal;
  import java.math.BigInteger;
  
  import org.hibernate.validator.Validator;
  
  public class DigitsValidator
      implements Validator<Digits>
  {
      int integerDigits;
      int fractionalDigits;
      
      public void initialize(Digits configuration) {
          integerDigits      = configuration.integerDigits();
          fractionalDigits = configuration.fractionalDigits();        
      }
  
      public boolean isValid(Object value) {
          if (value==null) { 
              return true;
          }
  
          String stringValue = null;
  
          if (value instanceof String) {
              try {
                  stringValue = stringValue(new BigDecimal((String) value));
              } catch (NumberFormatException nfe) {
                  return false;
              }
          } else if (value instanceof BigDecimal) {
              stringValue = stringValue((BigDecimal) value);
          } else if (value instanceof BigInteger) {
              stringValue = stringValue((BigInteger) value);
          } else {
              return false;
          }
  
  
          int pos = stringValue.indexOf(".");
  
          int left = (pos == -1) ? stringValue.length() : pos;
          int right = (pos==-1) ? 0 : stringValue.length() - pos -1;
  
          if (left==1 && stringValue.charAt(0) == '0') {
              left--;
          }
          
          if (left > integerDigits || right > fractionalDigits) {
              return false;
          }
  
          return true;
      }
  
      private String stringValue(BigDecimal number) {
          return number.abs().stripTrailingZeros().toPlainString();
      }
      private String stringValue(BigInteger number) {
          return number.abs().toString();
      }
  }
  
  
  
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/Payment.java
  
  Index: Payment.java
  ===================================================================
  package org.jboss.seam.example.quartz;
  
  import java.io.Serializable;
  import java.math.BigDecimal;
  import java.util.Date;
  
  import org.jboss.seam.core.QuartzDispatcher.QuartzTriggerHandle;
  import javax.persistence.Entity;
  import javax.persistence.GeneratedValue;
  import javax.persistence.Id;
  import javax.persistence.Lob;
  import javax.persistence.Transient;
  import javax.persistence.ManyToOne;
  
  import org.hibernate.validator.Length;
  import org.hibernate.validator.NotNull;
  
  @Entity
  public class Payment
      implements Serializable
  {
      @Id @GeneratedValue 
      private Long id;
  
      @NotNull
      @Digits(integerDigits=8,fractionalDigits=2)
      private BigDecimal amount;
  
      @NotNull @Length(min=1)
      private String payee;
  
      @NotNull @ManyToOne
      private Account account;
     
      @NotNull
      private Date paymentDate;
      @NotNull
      private Date createdDate;
      private Date lastPaid;
  
      private boolean active = true;
  
      private Frequency paymentFrequency = Frequency.DAILY;
      
      @Lob
      private QuartzTriggerHandle quartzTriggerHandle;
  
      public Long getId() {
          return id;
      }
      
      public BigDecimal getAmount() {
          return amount;
      }
      public void setAmount(BigDecimal amount) {
          this.amount = amount;
      }
  
      public String getPayee()
      {
          return payee;
      }
  
      public void setPayee(String payee) {
          this.payee = payee;
      }
  
      public Account getAccount() {
          return account;
      }
      
      public void setAccount(Account account) {
          this.account = account;
          account.getPayments().add(this);
      }
  
      public Date getPaymentDate() {
          return paymentDate;
      }
      public void setPaymentDate(Date paymentDate) {
          this.paymentDate = paymentDate;
      }  
  
      public Date getCreatedDate() {
          return createdDate;
      }    
      public void setCreatedDate(Date createdDate) {
          this.createdDate = createdDate;
      }  
  
  
      public Date getLastPaid() {
          return lastPaid;
      }    
      public void setLastPaid(Date lastPaid) {
          this.lastPaid = lastPaid;
      }  
          
      public boolean getActive() {
          return active;
      }
      public void setActive(boolean active) {
          this.active = active;
      }
     
      public Frequency getPaymentFrequency() { 
          return paymentFrequency; 
      }
      public void setPaymentFrequency(Frequency paymentFrequency) {
          this.paymentFrequency = paymentFrequency;
      }
  
      public QuartzTriggerHandle getQuartzTriggerHandle() {
          return quartzTriggerHandle;
      }
      public void setQuartzTriggerHandle(QuartzTriggerHandle quartzTriggerHandle) {
          this.quartzTriggerHandle = quartzTriggerHandle;
      }
  
  
      public enum Frequency {
          ONCE(null), 
          EVERY_MINUTE(60*1000l),
          HOURLY(60*60*1000l), 
          DAILY(24*60*60*1000l), 
          WEEKLY(7*24*60*60*1000l);
  
          Long interval; 
  
          Frequency(Long interval) {
              this.interval = interval;
          }
          
          public Long getInterval() {
              return interval;
          }
      }
  }
  
  
  
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/PaymentController.java
  
  Index: PaymentController.java
  ===================================================================
  package org.jboss.seam.example.quartz;
  
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.RequestParameter;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.core.FacesMessages;
  import org.jboss.seam.framework.EntityHome;
  import org.jboss.seam.log.Log;
  import org.jboss.seam.core.QuartzDispatcher.QuartzTriggerHandle;
  
  @Name("paymentHome")
  public class PaymentController 
      extends EntityHome<Payment>
  {
      @RequestParameter Long paymentId;
      @In PaymentProcessor processor;
      
      @Logger Log log;
  
      public String saveAndSchedule()
      {
          String result = persist();
          
          Payment payment = getInstance();
          log.info("scheduling instance #0", payment);
  
          QuartzTriggerHandle handle = processor.schedulePayment(payment.getPaymentDate(), 
                                                  payment.getPaymentFrequency().getInterval(), 
                                                  payment);
          
          payment.setQuartzTriggerHandle( handle );
  
          return result;
      }
  
      @Override
      public Object getId() {
          return paymentId;
      }
  
      @Transactional
      public void cancel() {
          Payment payment = getInstance();
          
          QuartzTriggerHandle handle = payment.getQuartzTriggerHandle();
          payment.setQuartzTriggerHandle(null);
          payment.setActive(false);
          
          try
          {
              handle.cancel();
          }
          catch (Exception nsole)
          {
              FacesMessages.instance().add("Payment already processed");
          }
      }
      
  }
  
  
  
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/PaymentProcessor.java
  
  Index: PaymentProcessor.java
  ===================================================================
  package org.jboss.seam.example.quartz;
  
  import java.math.BigDecimal;
  import java.util.Date;
  
  import javax.persistence.EntityManager;
  
  import org.jboss.seam.annotations.Asynchronous;
  import org.jboss.seam.annotations.AutoCreate;
  import org.jboss.seam.annotations.In;
  import org.jboss.seam.annotations.Logger;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Transactional;
  import org.jboss.seam.annotations.timer.Expiration;
  import org.jboss.seam.annotations.timer.IntervalDuration;
  import org.jboss.seam.log.Log;
  import org.jboss.seam.core.QuartzDispatcher.QuartzTriggerHandle;
  
  
  @Name("processor")
  @AutoCreate
  public class PaymentProcessor {
      
      @In 
      EntityManager entityManager;
  
      @Logger Log log;
  
      @Asynchronous
      @Transactional
      public QuartzTriggerHandle schedulePayment(@Expiration Date when, 
                                   @IntervalDuration Long interval, 
                                   Payment payment) 
      { 
          payment = entityManager.merge(payment);
          
          log.info("[#0] Processing payment #1", System.currentTimeMillis(), payment.getId());
  
          if (payment.getActive()) {
              BigDecimal balance = payment.getAccount().adjustBalance(payment.getAmount().negate());
              log.info(":: balance is now #0", balance);
              payment.setLastPaid(new Date());
  
              if (payment.getPaymentFrequency().equals(Payment.Frequency.ONCE)) {
                  payment.setActive(false);
              }
          }
  
          return null;
      }
  }
  
  
  
  1.1      date: 2007/06/04 22:46:26;  author: myuan;  state: Exp;jboss-seam/examples/quartz/src/org/jboss/seam/example/quartz/package-info.java
  
  Index: package-info.java
  ===================================================================
  @Namespace(value="http://jboss.com/products/seam/examples/quartz")
  package org.jboss.seam.example.quartz;
  
  import org.jboss.seam.annotations.*;
  
  
  



More information about the jboss-cvs-commits mailing list