俊星的BLOG

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 俊星 阅读(241) 评论(0)  编辑  收藏 所属分类: 代码库


只有注册用户登录后才能发表评论。


网站导航: