KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > columba > mail > folder > zippedmh > ZippedMHDataStorage


1 package org.columba.mail.folder.zippedmh;
2
3 import java.io.File JavaDoc;
4 import java.io.FileFilter JavaDoc;
5 import java.io.FileOutputStream JavaDoc;
6 import java.io.InputStream JavaDoc;
7 import java.util.regex.Matcher JavaDoc;
8 import java.util.regex.Pattern JavaDoc;
9 import java.util.zip.ZipEntry JavaDoc;
10 import java.util.zip.ZipFile JavaDoc;
11 import java.util.zip.ZipOutputStream JavaDoc;
12
13 import org.columba.core.io.StreamUtils;
14 import org.columba.mail.folder.IDataStorage;
15 import org.columba.ristretto.io.Source;
16 import org.columba.ristretto.io.SourceInputStream;
17 import org.columba.ristretto.io.TempSourceFactory;
18
19 public class ZippedMHDataStorage implements IDataStorage {
20
21     private File JavaDoc directory;
22
23     private Source actSource;
24     private Object JavaDoc actUid;
25     
26     
27     public ZippedMHDataStorage(File JavaDoc directory) {
28         this.directory = directory;
29     }
30
31     public void removeMessage(Object JavaDoc uid) throws Exception JavaDoc {
32         File JavaDoc messageFile = getMessageFile(uid);
33         
34         if( !messageFile.delete() ) {
35             messageFile.deleteOnExit();
36         }
37         
38         if( actUid != null && actUid.equals(uid)) {
39             actUid = null;
40         }
41     }
42
43     public Source getMessageSource(Object JavaDoc uid) throws Exception JavaDoc {
44         return inflateToTempSource(uid);
45     }
46
47     public InputStream JavaDoc getMessageStream(Object JavaDoc uid) throws Exception JavaDoc {
48         return new SourceInputStream(inflateToTempSource(uid));
49     }
50     
51     private Source inflateToTempSource(Object JavaDoc uid) throws Exception JavaDoc {
52         if( actUid == null || !actUid.equals(uid)) {
53             ZipFile JavaDoc messageFile = new ZipFile JavaDoc(getMessageFile(uid));
54             ZipEntry JavaDoc entry = messageFile.getEntry(uid.toString());
55             
56             actUid = uid;
57             actSource =TempSourceFactory.createTempSource(messageFile.getInputStream(entry), (int)entry.getSize());
58         }
59         
60         return actSource;
61     }
62
63     public void saveMessage(Object JavaDoc uid, InputStream JavaDoc source) throws Exception JavaDoc {
64         File JavaDoc messageFile = getMessageFile(uid);
65         ZipOutputStream JavaDoc out = new ZipOutputStream JavaDoc(new FileOutputStream JavaDoc(messageFile));
66         out.setMethod(ZipOutputStream.DEFLATED);
67         
68         ZipEntry JavaDoc zipentry = new ZipEntry JavaDoc(uid.toString());
69         zipentry.setSize(source.available());
70         out.putNextEntry(zipentry);
71         
72         StreamUtils.streamCopy(source, out);
73         
74         source.close();
75         out.close();
76     }
77
78     private File JavaDoc getMessageFile(Object JavaDoc uid) {
79         File JavaDoc messageFile = new File JavaDoc(directory, uid + ".zip");
80         return messageFile;
81     }
82
83     public int getMessageCount() {
84         return directory.listFiles(new FileFilter JavaDoc() {
85
86             public boolean accept(File JavaDoc pathname) {
87                 return pathname.getName().matches("\\d*\\.zip");
88             }
89             
90         }).length;
91     }
92
93     public boolean exists(Object JavaDoc uid) throws Exception JavaDoc {
94         return getMessageFile(uid).exists();
95     }
96
97     public Object JavaDoc[] getMessageUids() {
98         File JavaDoc[] messageFiles = directory.listFiles(new FileFilter JavaDoc() {
99
100             public boolean accept(File JavaDoc pathname) {
101                 return pathname.getName().matches("\\d*\\.zip");
102             }
103             
104         });
105         
106         Matcher JavaDoc matcher = Pattern.compile("(\\d+)").matcher("");
107         
108         Object JavaDoc[] uids = new Object JavaDoc[messageFiles.length];
109         for( int i=0; i<uids.length; i++) {
110             matcher.reset(messageFiles[i].getName());
111             matcher.find();
112             uids[i] = new Integer JavaDoc(matcher.group(1));
113         }
114         
115         return uids;
116     }
117
118 }
119
Popular Tags