source: contrib/MailArchiver/sources/src/serpro/mailarchiver/service/Utils.java @ 6785

Revision 6785, 16.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.service;
31
32import java.io.IOException;
33import java.nio.file.DirectoryStream;
34import java.nio.file.Files;
35import java.nio.file.Path;
36import java.text.SimpleDateFormat;
37import java.util.Date;
38
39import javax.jdo.annotations.PersistenceAware;
40
41import org.springframework.beans.factory.annotation.Autowired;
42
43import serpro.mailarchiver.domain.metaarchive.*;
44import serpro.mailarchiver.service.dto.TFolder;
45import serpro.mailarchiver.service.dto.TMessage;
46import serpro.mailarchiver.service.find.FFolder;
47import serpro.mailarchiver.service.web.ArchiveServices;
48import serpro.mailarchiver.service.web.ServiceFault;
49import serpro.mailarchiver.session.Session;
50import serpro.mailarchiver.util.*;
51import serpro.mailarchiver.util.jdo.PersistenceManager;
52import serpro.mailarchiver.util.transaction.WithReadWriteTx;
53
54@PersistenceAware
55public class Utils
56    extends BaseService
57{
58    private static final Logger log = Logger.getLocalLogger();
59
60    @Autowired
61    private Environment env;
62
63    @Autowired
64    private FFolder findFolder;
65
66    @Autowired
67    private ArchiveServicesProxyFactory archiveServicesProxyFactory;
68
69    @Autowired
70    private UserAppConfig userAppConfig;
71
72    @Autowired
73    private TrayIconAdapter trayIcon;
74
75    @WithReadWriteTx
76    public void provideMailHome(String userId) throws IOException {
77
78        PersistenceManager pm = getPersistenceManager();
79
80        String homeFolderId = Session.getHomeFolderId();
81        Folder homeFolder = findFolder.byId(homeFolderId);
82        if(homeFolder == null) {
83            homeFolder = new Folder();
84            homeFolder.setOid(homeFolderId);
85            homeFolder.setName(userId);
86            homeFolder.setParent(null);
87            Path homeAbsolutePath = homeFolder.getAbsolutePath();
88            if(Files.notExists(homeAbsolutePath)) {
89                Files.createDirectory(homeAbsolutePath);
90            }
91            pm.makePersistent(homeFolder);
92
93            String inboxFolderId = Session.getInboxFolderId();
94            Folder inboxFolder = new Folder();
95            inboxFolder.setOid(inboxFolderId);
96            inboxFolder.setName("Inbox");
97            inboxFolder.setParent(homeFolder);
98            Path inboxAbsolutePath = inboxFolder.getAbsolutePath();
99            if(Files.notExists(inboxAbsolutePath)) {
100                Files.createDirectory(inboxAbsolutePath);
101            }
102            pm.makePersistent(inboxFolder);
103
104            String outboxFolderId = Session.getOutboxFolderId();
105            Folder outboxFolder = new Folder();
106            outboxFolder.setOid(outboxFolderId);
107            outboxFolder.setName("Outbox");
108            outboxFolder.setParent(homeFolder);
109            Path outboxAbsolutePath = outboxFolder.getAbsolutePath();
110            if(Files.notExists(outboxAbsolutePath)) {
111                Files.createDirectory(outboxAbsolutePath);
112            }
113            pm.makePersistent(outboxFolder);
114
115            String draftsFolderId = Session.getDraftsFolderId();
116            Folder draftsFolder = new Folder();
117            draftsFolder.setOid(draftsFolderId);
118            draftsFolder.setName("Drafts");
119            draftsFolder.setParent(homeFolder);
120            Path draftsAbsolutePath = draftsFolder.getAbsolutePath();
121            if(Files.notExists(draftsAbsolutePath)) {
122                Files.createDirectory(draftsAbsolutePath);
123            }
124            pm.makePersistent(draftsFolder);
125
126            String sentFolderId = Session.getSentFolderId();
127            Folder sentFolder = new Folder();
128            sentFolder.setOid(sentFolderId);
129            sentFolder.setName("Sent");
130            sentFolder.setParent(homeFolder);
131            Path sentAbsolutePath = sentFolder.getAbsolutePath();
132            if(Files.notExists(sentAbsolutePath)) {
133                Files.createDirectory(sentAbsolutePath);
134            }
135            pm.makePersistent(sentFolder);
136
137            String spamFolderId = Session.getSpamFolderId();
138            Folder spamFolder = new Folder();
139            spamFolder.setOid(spamFolderId);
140            spamFolder.setName("Spam");
141            spamFolder.setParent(homeFolder);
142            Path spamAbsolutePath = spamFolder.getAbsolutePath();
143            if(Files.notExists(spamAbsolutePath)) {
144                Files.createDirectory(spamAbsolutePath);
145            }
146            pm.makePersistent(spamFolder);
147
148            String trashFolderId = Session.getTrashFolderId();
149            Folder trashFolder = new Folder();
150            trashFolder.setOid(trashFolderId);
151            trashFolder.setName("Trash");
152            trashFolder.setParent(homeFolder);
153            Path trashAbsolutePath = trashFolder.getAbsolutePath();
154            if(Files.notExists(trashAbsolutePath)) {
155                Files.createDirectory(trashAbsolutePath);
156            }
157            pm.makePersistent(trashFolder);
158        }
159    }
160
161    @WithReadWriteTx
162    public final void bootstrapJdoMetadata() {
163
164        PersistenceManager pm = getPersistenceManager();
165
166        log.info("Beginning jdo metadata bootstrap process");
167
168        String tmp = "x-" + env.getExecTimestamp() + "-";
169        String oid;
170
171        AddressListField_Group_Mailbox alfGroupMailbox = new AddressListField_Group_Mailbox();
172        oid = tmp + "alf-group-mailbox";
173        alfGroupMailbox.setOid(oid);
174        pm.makePersistent(alfGroupMailbox);
175        log.debug("Persisted %s", oid);
176        pm.deletePersistent(alfGroupMailbox);
177        log.debug("Deleted %s", oid);
178
179        AddressListField_Group alfGroup = new AddressListField_Group();
180        oid = tmp + "alf-group";
181        alfGroup.setOid(oid);
182        pm.makePersistent(alfGroup);
183        log.debug("Persisted %s", oid);
184        pm.deletePersistent(alfGroup);
185        log.debug("Deleted %s", oid);
186
187        AddressListField_Mailbox alfMailbox = new AddressListField_Mailbox();
188        oid = tmp + "alf-mailbox";
189        alfMailbox.setOid(oid);
190        pm.makePersistent(alfMailbox);
191        log.debug("Persisted %s", oid);
192        pm.deletePersistent(alfMailbox);
193        log.debug("Deleted %s", oid);
194
195        MailboxListField_Mailbox mlfMailbox = new MailboxListField_Mailbox();
196        oid = tmp + "mlf-mailbox";
197        mlfMailbox.setOid(oid);
198        pm.makePersistent(mlfMailbox);
199        log.debug("Persisted %s", oid);
200        pm.deletePersistent(mlfMailbox);
201        log.debug("Deleted %s", oid);
202
203        MailboxField_Mailbox mfMailbox = new MailboxField_Mailbox();
204        oid = tmp + "mf-mailbox";
205        mfMailbox.setOid(oid);
206        pm.makePersistent(mfMailbox);
207        log.debug("Persisted %s", oid);
208        pm.deletePersistent(mfMailbox);
209        log.debug("Deleted %s", oid);
210
211        EmbeddedMessage embeddedMessage = new EmbeddedMessage();
212        oid = tmp + "embedded-message";
213        embeddedMessage.setOid(oid);
214        pm.makePersistent(embeddedMessage);
215        log.debug("Persisted %s", oid);
216        pm.deletePersistent(embeddedMessage);
217        log.debug("Deleted %s", oid);
218
219        BodyPart bodyPart = new BodyPart();
220        oid = tmp + "body-part";
221        bodyPart.setOid(oid);
222        pm.makePersistent(bodyPart);
223        log.debug("Persisted %s", oid);
224        pm.deletePersistent(bodyPart);
225        log.debug("Deleted %s", oid);
226
227        Message message = new Message();
228        oid = tmp + "message";
229        message.setOid(oid);
230        pm.makePersistent(message);
231        log.debug("Persisted %s", oid);
232
233        UnstructuredField unstructuredField = new UnstructuredField();
234        oid = tmp + "unstructured";
235        unstructuredField.setOid(oid);
236        unstructuredField.setName("x");
237        unstructuredField.setEntity(message);
238        pm.makePersistent(unstructuredField);
239        log.debug("Persisted %s", oid);
240        pm.deletePersistent(unstructuredField);
241        log.debug("Deleted %s", oid);
242
243        ContentTypeField contentTypeField = new ContentTypeField();
244        oid = tmp + "content-type";
245        contentTypeField.setOid(oid);
246        contentTypeField.setName("x");
247        contentTypeField.setEntity(message);
248        pm.makePersistent(contentTypeField);
249        log.debug("Persisted %s", oid);
250        pm.deletePersistent(contentTypeField);
251        log.debug("Deleted %s", oid);
252
253        ContentDispositionField contentDispositionField = new ContentDispositionField();
254        oid = tmp + "content-disposition";
255        contentDispositionField.setOid(oid);
256        contentDispositionField.setName("x");
257        contentDispositionField.setEntity(message);
258        pm.makePersistent(contentDispositionField);
259        log.debug("Persisted %s", oid);
260        pm.deletePersistent(contentDispositionField);
261        log.debug("Deleted %s", oid);
262
263        DateTimeField dateTimeField = new DateTimeField();
264        oid = tmp + "datetime";
265        dateTimeField.setOid(oid);
266        dateTimeField.setName("x");
267        dateTimeField.setEntity(message);
268        pm.makePersistent(dateTimeField);
269        log.debug("Persisted %s", oid);
270        pm.deletePersistent(dateTimeField);
271        log.debug("Deleted %s", oid);
272
273        AddressListField addressListField = new AddressListField();
274        oid = tmp + "address-list";
275        addressListField.setOid(oid);
276        addressListField.setName("x");
277        addressListField.setEntity(message);
278        pm.makePersistent(addressListField);
279        log.debug("Persisted %s", oid);
280        pm.deletePersistent(addressListField);
281        log.debug("Deleted %s", oid);
282
283        MailboxListField mailboxListField = new MailboxListField();
284        oid = tmp + "mailbox-list";
285        mailboxListField.setOid(oid);
286        mailboxListField.setName("x");
287        mailboxListField.setEntity(message);
288        pm.makePersistent(mailboxListField);
289        log.debug("Persisted %s", oid);
290        pm.deletePersistent(mailboxListField);
291        log.debug("Deleted %s", oid);
292
293        MailboxField mailboxField = new MailboxField();
294        oid = tmp + "mailbox";
295        mailboxField.setOid(oid);
296        mailboxField.setName("x");
297        mailboxField.setEntity(message);
298        pm.makePersistent(mailboxField);
299        log.debug("Persisted %s", oid);
300        pm.deletePersistent(mailboxField);
301        log.debug("Deleted %s", oid);
302
303        TextBody textBody = new TextBody();
304        oid = tmp + "text-body";
305        textBody.setOid(oid);
306        textBody.setEntity(message);
307        pm.makePersistent(textBody);
308        log.debug("Persisted %s", oid);
309        pm.deletePersistent(textBody);
310        log.debug("Deleted %s", oid);
311
312        BinaryBody binaryBody = new BinaryBody();
313        oid = tmp + "binary-body";
314        binaryBody.setOid(oid);
315        binaryBody.setEntity(message);
316        pm.makePersistent(binaryBody);
317        log.debug("Persisted %s", oid);
318        pm.deletePersistent(binaryBody);
319        log.debug("Deleted %s", oid);
320
321        Multipart multipart = new Multipart();
322        oid = tmp + "multipart";
323        multipart.setOid(oid);
324        multipart.setEntity(message);
325        pm.makePersistent(multipart);
326        log.debug("Persisted %s", oid);
327        pm.deletePersistent(multipart);
328        log.debug("Deleted %s", oid);
329
330        MessageBody messageBody = new MessageBody();
331        oid = tmp + "message-body";
332        messageBody.setOid(oid);
333        messageBody.setEntity(message);
334        pm.makePersistent(messageBody);
335        log.debug("Persisted %s", oid);
336        pm.deletePersistent(messageBody);
337        log.debug("Deleted %s", oid);
338
339        oid = message.getOid();
340        pm.deletePersistent(message);
341        log.debug("Deleted %s", oid);
342
343        Folder folder = new Folder();
344        oid = tmp + "folder";
345        folder.setOid(oid);
346        folder.setName("x");
347        pm.makePersistent(folder);
348        log.debug("Persisted %s", oid);
349        pm.deletePersistent(folder);
350        log.debug("Deleted %s", oid);
351
352        log.info("Jdo metadata bootstrapping finished");
353    }
354
355    @WithReadWriteTx
356    public final void bootstrapServices() throws Exception {
357
358        log.info("Beginning services bootstrap process");
359        Date startWarmUp = new Date();
360        System.out.println("WARM UP ---> Inicializando rotinas de warm up [" + new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(startWarmUp) + "]");
361
362        String warmingUpTooltip = "Warming up...";
363        trayIcon.addToolTip(warmingUpTooltip);
364
365        ArchiveServices proxy = archiveServicesProxyFactory.getProxy();
366
367        proxy.getState();
368
369        Path mailPath = userAppConfig.SERVER.getArchiveDir().resolve("mail");
370
371        DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
372            @Override
373            public boolean accept(Path file) throws IOException {
374                return Files.isDirectory(file);
375            }
376        };
377
378        DirectoryStream<Path> dirStream = Files.newDirectoryStream(mailPath, filter);
379
380        try {
381            for(Path path: dirStream) {
382                String userId = path.getFileName().toString();
383                String sessionId = null;
384                try {
385                    Session session = new Session(userId);
386                    sessionId = session.getSessionId();
387
388//                    System.out.println("#####  LOGIN " + userId + " " + sessionId + "  #####");
389
390                    visitFolder(proxy, sessionId, "home");
391                }
392                finally {
393                    if(sessionId != null) {
394                        proxy.logout(sessionId);
395//                        System.out.println("#####  LOGOUT " + userId + " " + sessionId + "  #####");
396                    }
397                }
398            }
399        }
400        finally {
401            if(dirStream != null) {
402                dirStream.close();
403            }
404        }
405
406        trayIcon.removeToolTip(warmingUpTooltip);
407
408        Date endWarmUp = new Date();
409        System.out.println("WARM UP ---> Rotinas de warm up finalizadas. Meta arquivamento pronto [" + new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(endWarmUp) + "]");
410        log.info("Services bootstrapping finished");
411    }
412
413    private void visitFolder(ArchiveServices proxy, String sessionId, String folderId) throws ServiceFault {
414
415        TFolder[] listFolders = proxy.listFolders(sessionId, folderId);
416
417        if(listFolders != null) {
418            for(TFolder child : listFolders) {
419                visitFolder(proxy, sessionId, child.getId());
420            }
421        }
422
423        TFolder folderDto = proxy.getFolderInfo(sessionId, folderId);
424
425//        System.out.println("VISITING FOLDER: " + folderDto.getPath());
426
427        String queryConfig =
428            "  <query " +
429//            "      body=\"term\" \n" +
430//            "      subject=\"term\" \n" +
431//            "      from=\"term\" \n" +
432//            "      to=\"term\" toOrCc=\"term\" toOrCcOrBcc=\"term\" \n" +
433//            "      cc=\"term\" ccOrBcc=\"term\" \n" +
434//            "      bcc=\"term\" \n" +
435//            "      lowerDate=\"time\" upperDate=\"time\" \n" +
436//            "      date=\"time\" \n" +
437//            "      lowerIndex=\"idx\" upperIndex=\"idx\" \n" +
438            "      > \n" +
439
440            "      <folder id=\"" + folderId + "\"/> " +
441
442//            "      <tags contains=\"tag\"/> " +
443//            "      <tags notContains=\"tag\"/> " +
444
445            "      <order date=\"desc\"/> " +
446            "      <order from=\"asc\"/> " +
447            "      <order subject=\"asc\"/> " +
448            "      <order size=\"desc\"/> " +
449            "  </query> ";
450
451
452        TMessage[] listMessages = proxy.listMessages(sessionId, queryConfig);
453
454        if(listMessages != null) {
455            for(TMessage message : listMessages) {
456                TMessage messageDto = proxy.getMessageInfo(sessionId, message.getId());
457//                System.out.println("VISITING MESSAGE: " + messageDto.getId());
458            }
459        }
460    }
461}
Note: See TracBrowser for help on using the repository browser.