source: contrib/MailArchiver/sources/src/serpro/mailarchiver/domain/metaarchive/Folder.java @ 6785

Revision 6785, 9.7 KB checked in by rafaelraymundo, 12 years ago (diff)

Ticket #2946 - Liberado codigo do MailArchiver?. Documentação na subpasta DOCS.

Line 
1/**
2 * MailArchiver is an application that provides services for storing and managing e-mail messages through a Web Services SOAP interface.
3 * Copyright (C) 2012  Marcio Andre Scholl Levien and Fernando Alberto Reuter Wendt and Jose Ronaldo Nogueira Fonseca Junior
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/******************************************************************************\
20*
21*  This product was developed by
22*
23*        SERVIÇO FEDERAL DE PROCESSAMENTO DE DADOS (SERPRO),
24*
25*  a government company established under Brazilian law (5.615/70),
26*  at Department of Development of Porto Alegre.
27*
28\******************************************************************************/
29
30package serpro.mailarchiver.domain.metaarchive;
31
32import java.nio.file.Path;
33import java.nio.file.Paths;
34import java.util.ArrayList;
35import java.util.Collections;
36import java.util.List;
37
38import javax.jdo.JDOHelper;
39import javax.jdo.annotations.NotPersistent;
40import javax.jdo.annotations.PersistenceCapable;
41
42import org.springframework.beans.factory.annotation.Autowired;
43
44import serpro.mailarchiver.domain.BaseObject;
45import serpro.mailarchiver.util.ArchiveVisitor;
46import serpro.mailarchiver.util.Logger;
47import serpro.mailarchiver.util.UserAppConfig;
48
49@PersistenceCapable
50public class Folder
51    extends BaseObject
52    implements Comparable<Folder>
53{
54    @NotPersistent
55    private static final Logger log = Logger.getLocalLogger();
56
57    //**** P E R S I S T E N T ****
58    private String oid;
59    private String name;
60    private Folder parent;
61    private Integer parentIdx;
62    private ArrayList<Folder> children = new ArrayList<Folder>();
63    private ArrayList<Message> messages = new ArrayList<Message>();
64    //*****************************
65
66    @Override
67    public void jdoPreDelete() {
68        super.jdoPreDelete();
69
70        setParent(null);
71    }
72
73    public final boolean isUserHomeFolder() {
74        return oid.endsWith("_home");
75    }
76
77    public final boolean isInboxSpecialFolder() {
78        return oid.endsWith("_inbox");
79    }
80
81    public final boolean isOutboxSpecialFolder() {
82        return oid.endsWith("_outbox");
83    }
84
85    public final boolean isDraftsSpecialFolder() {
86        return oid.endsWith("_drafts");
87    }
88
89    public final boolean isSentSpecialFolder() {
90        return oid.endsWith("_sent");
91    }
92
93    public final boolean isSpamSpecialFolder() {
94        return oid.endsWith("_spam");
95    }
96
97    public final boolean isTrashSpecialFolder() {
98        return oid.endsWith("_trash");
99    }
100
101    public final boolean isSpecialFolder() {
102        return
103               isInboxSpecialFolder()
104            || isOutboxSpecialFolder()
105            || isDraftsSpecialFolder()
106            || isSentSpecialFolder()
107            || isSpamSpecialFolder()
108            || isTrashSpecialFolder();
109    }
110
111    public final String getExternalOid() {
112        if(isUserHomeFolder()) {
113            return "home";
114        }
115        else if(isInboxSpecialFolder()) {
116            return "inbox";
117        }
118        else if(isOutboxSpecialFolder()) {
119            return "outbox";
120        }
121        else if(isDraftsSpecialFolder()) {
122            return "drafts";
123        }
124        else if(isSentSpecialFolder()) {
125            return "sent";
126        }
127        else if(isSpamSpecialFolder()) {
128            return "spam";
129        }
130        else if(isTrashSpecialFolder()) {
131            return "trash";
132        }
133        else {
134            return oid;
135        }
136    }
137
138    public final String getOid() {
139        return oid;
140    }
141
142    public final void setOid(String oid) {
143        this.oid = oid;
144    }
145
146    public final String getName() {
147        return name;
148    }
149
150    public final void setName(String name) {
151        this.name = name;
152    }
153
154    //--------------------------------------------------------------------------
155    public final Folder getParent() {
156        return parent;
157    }
158
159    public final void setParent(Folder parent) {
160        if(this.parent != null) {
161            this.parent.internal_removeChild(this);
162        }
163        this.parent = parent;
164        if(this.parent != null) {
165            this.parent.internal_addChild(this);
166        }
167    }
168
169    public final int getParentIdx() {
170        return (parentIdx != null) ? parentIdx
171                : (getParent() != null) ? getParent().indexOf(this)
172                : -1;
173    }
174
175    //--------------------------------------------------------------------------
176    public final List<Folder> getChildren() {
177        return Collections.unmodifiableList(children);
178    }
179
180    public final int indexOf(Folder folder) {
181        return children.indexOf(folder);
182    }
183
184    public final void addChild(Folder folder) {
185        if(folder != null) {
186            folder.setParent(this);
187        }
188    }
189
190    final void internal_addChild(Folder folder) {
191        children.add(folder);
192    }
193
194    public final void removeChild(Folder folder) {
195        if((folder != null) && (folder.getParent() == this)) {
196            folder.setParent(null);
197        }
198    }
199
200    final void internal_removeChild(Folder folder) {
201        children.remove(folder);
202    }
203
204    //--------------------------------------------------------------------------
205    public final List<Message> getMessages() {
206        return Collections.unmodifiableList(messages);
207    }
208
209    public final int indexOf(Message message) {
210        return messages.indexOf(message);
211    }
212
213    public final void addMessage(Message message) {
214        if(message != null) {
215            message.setFolder(this);
216        }
217    }
218
219    final void internal_addMessage(Message message) {
220        messages.add(message);
221    }
222
223    public final void removeMessage(Message message) {
224        if((message != null) && (message.getFolder() == this)) {
225            message.setFolder(null);
226        }
227    }
228
229    final void internal_removeMessage(Message message) {
230        messages.remove(message);
231    }
232
233    //--------------------------------------------------------------------------
234    public final void visitArchive(ArchiveVisitor visitor) {
235        if(visitor.isQuitted()) {
236            return;
237        }
238        visitor.visitFolder(this);
239        if(visitor.isQuitted()) {
240            return;
241        }
242        for(Message message : getMessages()) {
243            visitor.visitMessage(message);
244            if(visitor.isQuitted()) {
245                return;
246            }
247        }
248        for(Folder folder : getChildren()) {
249            folder.visitArchive(visitor);
250            if(visitor.isQuitted()) {
251                return;
252            }
253        }
254    }
255
256    public final void visitArchiveDepthFirst(ArchiveVisitor visitor) {
257        if(visitor.isQuitted()) {
258            return;
259        }
260        for(Folder folder : getChildren()) {
261            folder.visitArchiveDepthFirst(visitor);
262            if(visitor.isQuitted()) {
263                return;
264            }
265        }
266        for(Message message : getMessages()) {
267            visitor.visitMessage(message);
268            if(visitor.isQuitted()) {
269                return;
270            }
271        }
272        visitor.visitFolder(this);
273    }
274
275    //--------------------------------------------------------------------------
276    @Override
277    public String toString() {
278        return String.format(
279                "Folder%n"
280              + "%1$sjdoState: %2$s%n"
281              + "%1$soid: %3$s%n"
282              + "%1$shash: %4$x%n"
283              + "%1$srelativePath: %5$s"
284              , "    "
285              , JDOHelper.getObjectState(this)
286              , getOid()
287              , hashCode()
288              , getRelativePath());
289    }
290
291    //--------------------------------------------------------------------------
292    public final Path getRelativePath() {
293        if(getParent() == null) {
294            return Paths.get("");
295        }
296        else {
297            return getParent().getRelativePath().resolve(getName());
298        }
299    }
300
301    public final Path getQualifiedPath() {
302        if(getParent() == null) {
303            return Paths.get(getName());
304        }
305        else {
306            return getParent().getQualifiedPath().resolve(getName());
307        }
308    }
309
310    @Autowired
311    @NotPersistent
312    private UserAppConfig userAppConfig;
313
314    public final Path getAbsolutePath() {
315        return userAppConfig.SERVER.getArchiveDir()
316                .resolve("mail")
317                .resolve(getQualifiedPath());
318    }
319
320    //--------------------------------------------------------------------------
321    @Override
322    public int compareTo(Folder other) {
323        return priorizeOrder().compareTo(other.priorizeOrder());
324    }
325
326    private String priorizeOrder() {
327        String path = getRelativePath().toString();
328
329        if(isUserHomeFolder()) {
330            path = "       " + path;
331        }
332        else if(isInboxSpecialFolder()) {
333            path = "      " + path;
334        }
335        else if(isOutboxSpecialFolder()) {
336            path = "     " + path;
337        }
338        else if(isDraftsSpecialFolder()) {
339            path = "    " + path;
340        }
341        else if(isSentSpecialFolder()) {
342            path = "   " + path;
343        }
344        else if(isSpamSpecialFolder()) {
345            path = "  " + path;
346        }
347        else if(isTrashSpecialFolder()) {
348            path = " " + path;
349        }
350
351        return path.toUpperCase();
352    }
353}
Note: See TracBrowser for help on using the repository browser.