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