massive cleanup, almost there!
[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 void             add(Message message);
20     public abstract void             add(Message message, int flags);
21     public abstract void             move(Query q, Mailbox dest);
22     public abstract void             copy(Query q, Mailbox dest);
23     public abstract int              count(Query q);
24     public abstract int              uidNext();
25     public abstract int              uidValidity();
26     public abstract void             rename(String newName);
27     public abstract void             destroy();
28     public abstract Mailbox          slash(String name, boolean create);
29     public abstract String[]         children();
30
31
32     // Thunks ////////////////////////////////////////////////////////////////////////////
33
34     public final    void             accept(Message m) { add(m); }
35     public          Mailbox.Iterator iterator() { return iterator(Query.all()); }
36
37
38     // Default Implementation //////////////////////////////////////////////////////////////////////////////
39
40     /** default, inefficient implementation of Mailbox; only requires a few methods to be implemented */
41     public static abstract class Default extends Mailbox {
42         public Mailbox.Iterator iterator(Query q) { return new Mailbox.Iterator.QueryIterator(q, this); }
43         public void copy(Query q, Mailbox dest) { for(Mailbox.Iterator it = iterator(q); it.next();) dest.add(it.cur()); }
44         public int count(Query q) { int count = 0; for(Mailbox.Iterator it = iterator(q); it.next();) count++; return count; }
45         public void rename(String newName) { throw new MailException("not supported"); }
46         public void  destroy() { throw new MailException("not supported"); }
47         public Mailbox slash(String name, boolean create) { throw new MailException("not supported"); }
48         public String[] children() { return new String[] { }; }
49         public void move(Query q, Mailbox dest) {
50             for(Mailbox.Iterator it = iterator(q);it.next();) { dest.add(it.cur()); it.delete(); }
51         }
52     }
53
54
55     // Iterator Definition //////////////////////////////////////////////////////////////////////////////
56
57     public static interface Iterator {
58         public abstract Message cur();
59         public abstract boolean next();
60         public abstract int     uid();
61         public abstract int     num();
62         public abstract void    delete();
63         public abstract void    set(String key, String val);
64         public abstract String  get(String key);
65         public abstract boolean seen();
66         public abstract boolean deleted();
67         public abstract boolean flagged();
68         public abstract boolean draft();
69         public abstract boolean answered();
70         public abstract boolean recent();
71         public abstract void    seen(boolean on);
72         public abstract void    deleted(boolean on);
73         public abstract void    flagged(boolean on);
74         public abstract void    draft(boolean on);
75         public abstract void    answered(boolean on);
76         public abstract void    recent(boolean on);
77
78         public static class Wrapper implements Iterator {
79             private Iterator it;
80             public Wrapper(Iterator it) { this.it = it; }
81             public Message cur() { return it.cur(); }
82             public boolean next() { return it.next(); }
83             public int     uid() { return it.uid(); }
84             public int     num() { return it.num(); }
85             public void    set(String key, String val) { it.set(key, val); }
86             public String  get(String key) { return it.get(key); }
87             public void    delete() { it.delete(); }
88             public boolean seen() { return it.seen(); }
89             public boolean deleted() { return it.deleted(); }
90             public boolean flagged() { return it.flagged(); }
91             public boolean draft() { return it.draft(); }
92             public boolean answered() { return it.answered(); }
93             public boolean recent() { return it.recent(); }
94             public void    seen(boolean on) { it.seen(on); }
95             public void    deleted(boolean on) { it.deleted(on); }
96             public void    flagged(boolean on) { it.flagged(on); }
97             public void    draft(boolean on) { it.draft(on); }
98             public void    answered(boolean on) { it.answered(on); }
99             public void    recent(boolean on) { it.recent(on); }
100         }
101
102         class QueryIterator extends Mailbox.Iterator.Wrapper {
103             Query q;
104             public QueryIterator(Query q, Mailbox m) { super(m.iterator()); this.q = q; }
105             public boolean next() { do { if (!super.next()) return false; } while(!q.match(this)); return true; }
106         }
107     }
108
109     public static class Flag {
110         public static final int DELETED  = 0x0001;
111         public static final int SEEN     = 0x0002;
112         public static final int FLAGGED  = 0x0004;
113         public static final int DRAFT    = 0x0008;
114         public static final int ANSWERED = 0x0010;
115         public static final int RECENT   = 0x0020;
116     }
117     
118 }