俊星的BLOG

          導航

          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          JAVA MAIL之我的搜索

          JAVAMAIL中提供搜索郵件的API,具體用法可以參考之前的博文,下面是我對其源代碼的學習:
          1、運行實例:
          package mysearch;

          import java.util.ArrayList;
          import java.util.Date;
          import java.util.List;

          public class Main {
              
          public static void main(String[] args) {
                  List
          <Msg> list = new ArrayList<Msg>();
                  
          long time = System.currentTimeMillis();
                  list.add(
          new Msg(new Date(time), 1"subject1"));
                  list.add(
          new Msg(new Date(time - 1000), 2"subject2"));
                  list.add(
          new Msg(new Date(time - 60 * 1000), 3"subject3"));
                  list.add(
          new Msg(new Date(time - 2 * 60 * 1000), 1"subject14"));
                  
                  
          // 查詢條件:!((subject like ject1 and senddate < time)or size>2)
                  
          // 應該得到第1、4條記錄
                  MySearchTerm subTerm = new MySubjectTerm("ject1");
                  MySearchTerm dateTerm 
          = new MySendDateTerm(MyCompTerm.LT,new Date(time));
                  MySearchTerm sizeTerm 
          = new MySizeTerm(MyCompTerm.GT,2);
                  
                  MySearchTerm term 
          = new MyAndTerm(subTerm,dateTerm);
                  term 
          = new MyOrTerm(term,sizeTerm);
                  term 
          = new MyNotTerm(term);
                  
          int count = 0;
                  
          for (Msg m : list) {
                      
          if (term.match(m)) {
                          count
          ++;
                          System.out.println(m);
                      }

                  }

                  System.out.println(
          "count:" + count);
              }

          }


          輸出結果:
          sendDate:Fri Apr 24 21:58:12 CST 2009 size:1 subject:subject1
          sendDate:Fri Apr 
          24 21:58:11 CST 2009 size:2 subject:subject2
          count:
          2

          2、代碼結構:
          file://F:\dev\eclipse\workspace\hibertest\src\mysearch
          Main.java
          Msg.java
          MyAndTerm.java
          MyCompTerm.java
          MyDateTerm.java
          MyIntTerm.java
          MyNotTerm.java
          MyOrTerm.java
          MySearchTerm.java
          MySendDateTerm.java
          MySizeTerm.java
          MyStrTerm.java
          MySubjectTerm.java

          3、具體實現:
          (1)抽象類MySearchTerm:
          package mysearch;

          public abstract class MySearchTerm {
              
          public abstract boolean match(Msg msg);
          }

          (2)與、或、非關聯關系類:
          與操作:
          package mysearch;

          /**
           * 與操作
           * 
          @author kinkding
           
          */

          public class MyAndTerm extends MySearchTerm {
              
          protected MySearchTerm terms[];

              
          public MyAndTerm(MySearchTerm t1, MySearchTerm t2) {
                  terms 
          = new MySearchTerm[2];
                  terms[
          0= t1;
                  terms[
          1= t2;
              }


              
          public MyAndTerm(MySearchTerm t[]) {
                  terms 
          = new MyAndTerm[t.length];
                  
          for (int i = 0; i < t.length; i++{
                      terms[i] 
          = t[i];
                  }

              }


              @Override
              
          public boolean match(Msg msg) {
                  
          for (MySearchTerm term : terms) {
                      
          if (!term.match(msg)) {
                          
          return false;
                      }

                  }

                  
          return true;
              }


          }


          或操作:
          package mysearch;
          /**
           * 或操作
           * 
          @author kinkding
           
          */

          public class MyOrTerm extends MySearchTerm {
              
          protected MySearchTerm terms[];

              
          public MyOrTerm(MySearchTerm t1, MySearchTerm t2) {
                  terms 
          = new MySearchTerm[2];
                  terms[
          0= t1;
                  terms[
          1= t2;
              }


              
          public MyOrTerm(MySearchTerm t[]) {
                  terms 
          = new MySearchTerm[t.length];
                  
          for (int i = 0; i < t.length; i++{
                      terms[i] 
          = t[i];
                  }

              }


              @Override
              
          public boolean match(Msg msg) {
                  
          for (MySearchTerm term : terms) {
                      
          if (term.match(msg)) {
                          
          return true;
                      }

                  }

                  
          return false;
              }

          }


          非操作:
          package mysearch;

          /**
           * 非操作
           * 
          @author kinkding
           
          */

          public class MyNotTerm extends MySearchTerm {
              
          protected MySearchTerm term;

              
          public MyNotTerm(MySearchTerm t) {
                  term 
          = t;
              }


              @Override
              
          public boolean match(Msg msg) {
                  
          return !term.match(msg);
              }

          }


          (3)數值比較類:
          package mysearch;

          public abstract class MyCompTerm extends MySearchTerm{
              
          public static final int LE = 1;// <=
              public static final int LT = 2;// <
              public static final int EQ = 3;// ==
              public static final int NE = 4;// !=
              public static final int GT = 5;// >
              public static final int GE = 6;// >=
              protected int comparison;
          }


          (3)字符、日期、整型比較類:
          字符比較:
          package mysearch;

          public abstract class MyStrTerm extends MySearchTerm {
              
          protected String str;

              
          public MyStrTerm(String s) {
                  str 
          = s;
              }

              
              
          /** 相當于 %str%=s*/
              
          protected boolean match(String s) {
                  
          for(int i=0,len = s.length()-str.length();i<=len;i++){
                      
          if(s.regionMatches(i, str, 0, str.length())){
                          
          return true;
                      }

                  }

                  
          return false;
              }


          }


          日期比較:
          package mysearch;

          import java.util.Date;

          public abstract class MyDateTerm extends MyCompTerm {
              
          protected Date date;

              
          public MyDateTerm(int comp, Date d) {
                  
          this.comparison = comp;
                  
          this.date = d;
              }


              
          /** d comp date */
              
          protected boolean match(Date d) {
                  
          long td = d.getTime();
                  
          long tt = date.getTime();
                  
          switch (comparison) {
                  
          case LT:
                      
          return td < tt;
                  
          case LE:
                      
          return td <= tt;
                  
          case EQ:
                      
          return td == tt;
                  
          case NE:
                      
          return td != tt;
                  
          case GT:
                      
          return td > tt;
                  
          case GE:
                      
          return td >= tt;
                  
          default:
                      
          return false;
                  }

              }


          }


          整型比較:
          package mysearch;


          public abstract class MyIntTerm extends MyCompTerm {
              
          protected int value;

              
          public MyIntTerm(int comp, int i) {
                  
          this.comparison = comp;
                  
          this.value = i;
              }


              
          /** i comp value */
              
          protected boolean match(int i) {
                  
          switch (comparison) {
                  
          case LT:
                      
          return i < value;
                  
          case LE:
                      
          return i <= value;
                  
          case EQ:
                      
          return i == value;
                  
          case NE:
                      
          return i != value;
                  
          case GT:
                      
          return i > value;
                  
          case GE:
                      
          return i >= value;
                  
          default:
                      
          return false;
                  }

              }

          }


          (4)具體業務類:
          消息類:
          package mysearch;

          import java.util.Date;

          public class Msg {
              
          private Date sendDate;
              
          private String subject;
              
          private int size;

              
          public Date getSendDate() {
                  
          return sendDate;
              }


              
          public String getSubject() {
                  
          return subject;
              }


              
          public int getSize() {
                  
          return size;
              }


              
          public Msg(Date sendDate, int size, String subject) {
                  
          super();
                  
          this.sendDate = sendDate;
                  
          this.size = size;
                  
          this.subject = subject;
              }


              
          public String toString() {
                  
          return "sendDate:" + sendDate + " size:" + size + " subject:" + subject;
              }


          }


          發送日期查詢:
          package mysearch;

          import java.util.Date;

          public class MySendDateTerm extends MyDateTerm {

              
          public MySendDateTerm(int comp, Date d) {
                  
          super(comp, d);
              }


              @Override
              
          public boolean match(Msg msg) {
                  
          return msg == null ? false : super.match(msg.getSendDate());
              }


          }


          大小查詢:
          package mysearch;

          public class MySizeTerm extends MyIntTerm {
              
          public MySizeTerm(int comp, int i) {
                  
          super(comp, i);
              }


              @Override
              
          public boolean match(Msg msg) {
                  
          return msg==null?false:super.match(msg.getSize());
              }


          }


          主題查詢:
          package mysearch;

          public class MySubjectTerm extends MyStrTerm {
              
          public MySubjectTerm(String s) {
                  
          super(s);
              }


              @Override
              
          public boolean match(Msg msg) {
                  
          return msg == null ? false : super.match(msg.getSubject());
              }


          }


          4、代碼下載地址mysearchrar

          posted on 2009-04-24 22:09 俊星 閱讀(246) 評論(0)  編輯  收藏 所屬分類: 代碼庫

          主站蜘蛛池模板: 阳高县| 洞头县| 商洛市| 黔西县| 重庆市| 海南省| 平山县| 富平县| 如皋市| 理塘县| 石泉县| 沧源| 左权县| 沈丘县| 建水县| 麻栗坡县| 伊金霍洛旗| 天长市| 景洪市| 泾川县| 通化市| 普陀区| 嘉兴市| 芮城县| 琼结县| 阳朔县| 平定县| 贞丰县| 牡丹江市| 兴和县| 北碚区| 霍山县| 东方市| 乌兰察布市| 日土县| 曲周县| 台州市| 达日县| 大厂| 多伦县| 汤原县|