compiles
[org.ibex.mail.git] / src / org / ibex / mail / target / Mailbox.java
1 package org.ibex.mail.target;
2 import org.ibex.mail.*;
3 import org.ibex.util.*;
4 import org.ibex.mail.*;
5 import java.io.*;
6 import java.net.*;
7 import java.util.*;
8 import java.text.*;
9
10 public abstract class Mailbox extends Target {
11
12     public static final String STORAGE_ROOT =
13         System.getProperty("ibex.mail.root", File.separatorChar + "var" + File.separatorChar + "org.ibex.mail");
14
15
16     // Required Methods //////////////////////////////////////////////////////////////////////////////
17
18     public abstract Mailbox.Iterator iterator(Query q);
19     public abstract int              add(Message message);
20     public abstract void             move(Query q, Mailbox dest);
21     public abstract void             copy(Query q, Mailbox dest);
22     public abstract int              count(Query q);
23     public abstract int              uidNext();
24     public abstract int              uidValidity();
25     public abstract void             rename(String newName);
26     public abstract void             destroy();
27     public abstract Mailbox          slash(String name, boolean create);
28
29
30     // Thunks ////////////////////////////////////////////////////////////////////////////
31
32     public final    void             accept(Message m) { add(m); }
33     public          Mailbox.Iterator iterator() { return iterator(Query.all()); }
34
35
36     // Default Implementation //////////////////////////////////////////////////////////////////////////////
37
38     /** default, inefficient implementation of Mailbox; only requires a few methods to be implemented */
39     public static abstract class Default extends Mailbox {
40         public Mailbox.Iterator iterator(Query q) { return new Mailbox.Iterator.QueryIterator(q, this); }
41         public void copy(Query q, Mailbox dest) { for(Mailbox.Iterator it = iterator(q); it.next();) dest.add(it.cur()); }
42         public int count(Query q) { int count = 0; for(Mailbox.Iterator it = iterator(q); it.next();) count++; return count; }
43         public void rename(String newName) { throw new MailException("not supported"); }
44         public void  destroy() { throw new MailException("not supported"); }
45         public Mailbox slash(String name, boolean create) { throw new MailException("not supported"); }
46         public void move(Query q, Mailbox dest) {
47             for(Mailbox.Iterator it = iterator(q);it.next();) { dest.add(it.cur()); it.delete(); }
48         }
49     }
50
51
52     // Iterator Definition //////////////////////////////////////////////////////////////////////////////
53
54     public static interface Iterator {
55         public abstract Message cur();
56         public abstract boolean next();
57         public abstract int     uid();
58         public abstract int     num();
59         public abstract void    delete();
60         public abstract void    set(String key, String val);
61         public abstract String  get(String key);
62         public abstract boolean seen();
63         public abstract boolean deleted();
64         public abstract boolean flagged();
65         public abstract boolean draft();
66         public abstract boolean answered();
67         public abstract boolean recent();
68         public abstract void    seen(boolean on);
69         public abstract void    deleted(boolean on);
70         public abstract void    flagged(boolean on);
71         public abstract void    draft(boolean on);
72         public abstract void    answered(boolean on);
73         public abstract void    recent(boolean on);
74
75         public static class Wrapper implements Iterator {
76             private Iterator it;
77             public Wrapper(Iterator it) { this.it = it; }
78             public Message cur() { return it.cur(); }
79             public boolean next() { return it.next(); }
80             public int     uid() { return it.uid(); }
81             public int     num() { return it.num(); }
82             public void    set(String key, String val) { it.set(key, val); }
83             public String  get(String key) { return it.get(key); }
84             public void    delete() { it.delete(); }
85             public boolean seen() { return it.seen(); }
86             public boolean deleted() { return it.deleted(); }
87             public boolean flagged() { return it.flagged(); }
88             public boolean draft() { return it.draft(); }
89             public boolean answered() { return it.answered(); }
90             public boolean recent() { return it.recent(); }
91             public void    seen(boolean on) { it.seen(on); }
92             public void    deleted(boolean on) { it.deleted(on); }
93             public void    flagged(boolean on) { it.flagged(on); }
94             public void    draft(boolean on) { it.draft(on); }
95             public void    answered(boolean on) { it.answered(on); }
96             public void    recent(boolean on) { it.recent(on); }
97         }
98
99         class QueryIterator extends Mailbox.Iterator.Wrapper {
100             Query q;
101             public QueryIterator(Query q, Mailbox m) { super(m.iterator()); this.q = q; }
102             public boolean next() { do { if (!super.next()) return false; } while(!q.match(this)); return true; }
103         }
104     }
105     
106 }