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

Revision 6785, 14.5 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;
31
32import java.io.IOException;
33import java.io.InputStream;
34import java.net.InetAddress;
35import java.nio.file.FileVisitResult;
36import java.nio.file.FileVisitor;
37import java.nio.file.Files;
38import java.nio.file.Path;
39import java.nio.file.attribute.BasicFileAttributes;
40import java.util.Map;
41import java.util.TreeMap;
42
43import org.apache.log4j.ConsoleAppender;
44import org.apache.log4j.Level;
45import org.apache.log4j.PatternLayout;
46import org.apache.log4j.net.SocketAppender;
47import org.apache.log4j.rolling.RollingFileAppender;
48import org.apache.log4j.rolling.TimeBasedRollingPolicy;
49
50import org.springframework.beans.factory.access.BeanFactoryLocator;
51import org.springframework.beans.factory.access.BeanFactoryReference;
52import org.springframework.beans.factory.config.ConfigurableBeanFactory;
53import org.springframework.context.ConfigurableApplicationContext;
54import org.springframework.context.access.ContextSingletonBeanFactoryLocator;
55import org.springframework.web.context.request.RequestScope;
56import org.springframework.web.context.request.SessionScope;
57
58import com.google.common.base.Supplier;
59
60import de.schlichtherle.truezip.file.TArchiveDetector;
61import de.schlichtherle.truezip.file.TFile;
62import de.schlichtherle.truezip.fs.archive.tar.TarBZip2Driver;
63import de.schlichtherle.truezip.fs.archive.tar.TarDriver;
64import de.schlichtherle.truezip.fs.archive.tar.TarGZipDriver;
65import de.schlichtherle.truezip.fs.archive.zip.JarDriver;
66import de.schlichtherle.truezip.fs.archive.zip.ZipDriver;
67import de.schlichtherle.truezip.socket.sl.IOPoolLocator;
68
69import serpro.mailarchiver.domain.metaarchive.*;
70import serpro.mailarchiver.util.Environment;
71import serpro.mailarchiver.util.Logger;
72import serpro.mailarchiver.util.UserAppConfig;
73import serpro.mailarchiver.util.jdo.MetadataDumper;
74import serpro.mailarchiver.util.jdo.PersistenceManagerFactory;
75
76public class Main {
77
78    private static final Logger log = Logger.getLocalLogger();
79
80    UserAppConfig userAppConfig;
81
82    public static void main(String[] args) {
83        try {
84            new Main().run();
85        }
86        catch(Exception ex) {
87            log.fatal(ex, "Falha catastrófica");
88        }
89    }
90
91    private void run() throws Exception {
92
93        setupLog();
94
95        logSystemProperties();
96
97        logSystemEnvironment();
98
99        logInternetAddresses();
100
101        logUserAppConfig();
102
103        TFile.setDefaultArchiveDetector(new TArchiveDetector(TArchiveDetector.NULL,
104            new Object[][] {
105                { "zip",             new ZipDriver(IOPoolLocator.SINGLETON)},
106                { "jar",             new JarDriver(IOPoolLocator.SINGLETON)},
107                { "tar",             new TarDriver(IOPoolLocator.SINGLETON) },
108                { "tgz|tar.gz",      new TarGZipDriver(IOPoolLocator.SINGLETON) },
109                { "tbz|tb2|tar.bz2", new TarBZip2Driver(IOPoolLocator.SINGLETON) },
110            }));
111
112        final Path archiveDir = userAppConfig.SERVER.getArchiveDir();
113        if(Files.notExists(archiveDir)) {
114            Files.createDirectories(archiveDir);
115        }
116
117        final Path mailDir = archiveDir.resolve("mail");
118        if(Files.notExists(mailDir)) {
119            Files.createDirectories(mailDir);
120        }
121
122        final Path tempDir = archiveDir.resolve("temp");
123        if(Files.notExists(tempDir)) {
124            Files.createDirectories(tempDir);
125        }
126        else {
127            Files.walkFileTree(tempDir, new FileVisitor<Path>() {
128
129                @Override
130                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
131                    return FileVisitResult.CONTINUE;
132                }
133
134                @Override
135                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
136                    Files.delete(file);
137                    return FileVisitResult.CONTINUE;
138                }
139
140                @Override
141                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
142                    log.error(exc, "temp delete failed: %s", file.toString());
143                    return FileVisitResult.TERMINATE;
144                }
145
146                @Override
147                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
148                    if(dir != tempDir) {
149                        Files.delete(dir);
150                    }
151                    return FileVisitResult.CONTINUE;
152                }
153            });
154        }
155
156        final Path indexDir = archiveDir.resolve("index");
157        if(Files.notExists(indexDir)) {
158            Files.createDirectories(indexDir);
159        }
160
161        final Path dbFile = archiveDir.resolve("metaarchive.h2.db");
162        if(Files.notExists(dbFile)) {
163            InputStream is = getClass().getResourceAsStream("/serpro/mailarchiver/resources/empty_metaarchive.h2.db");
164            Files.copy(is, dbFile);
165        }
166
167        ConfigurableApplicationContext context = getGlobalContext();
168
169        PersistenceManagerFactory pmf = context.getBean("pmf", PersistenceManagerFactory.class);
170        logJdoMetadata(pmf);
171
172        MailArchiver mailArchiver = context.getBean("mailArchiver", MailArchiver.class);
173        mailArchiver.init();
174    }
175
176    private ConfigurableApplicationContext getGlobalContext() {
177        BeanFactoryLocator bfloc = ContextSingletonBeanFactoryLocator.getInstance(
178                "classpath:/serpro/mailarchiver/config/beanRefContext.xml");
179        BeanFactoryReference bfref = bfloc.useBeanFactory("global.context");
180
181        ConfigurableApplicationContext context = (ConfigurableApplicationContext) bfref.getFactory();
182        context.registerShutdownHook();
183
184        ConfigurableBeanFactory bf = (ConfigurableBeanFactory)context.getAutowireCapableBeanFactory();
185        bf.registerScope("session", new SessionScope());
186        bf.registerScope("request", new RequestScope());
187
188        return context;
189    }
190
191    private void setupLog() {
192
193        userAppConfig = UserAppConfig.getInstance();
194
195        Exception ex1 = null, ex2 = null;
196        try {
197            userAppConfig.load();
198        }
199        catch(Exception ex) {
200            ex1 = ex;
201        }
202
203        for(Map.Entry<String,String> logger : userAppConfig.LOG.getLoggers().entrySet()) {
204            if(logger.getKey().equalsIgnoreCase("root")) {
205                Logger.getRootLogger().setLevel(Level.toLevel(logger.getValue().toUpperCase()));
206            }
207            else {
208                Logger.getLogger(logger.getKey()).setLevel(Level.toLevel(logger.getValue().toUpperCase()));
209            }
210        }
211
212        PatternLayout layout = new PatternLayout(userAppConfig.LOG.getLayout());
213
214        ConsoleAppender consoleAppender = new ConsoleAppender(layout);
215        consoleAppender.setThreshold(Level.ERROR);
216        Logger.getRootLogger().addAppender(consoleAppender);
217
218        try {
219            Path logPath = userAppConfig.LOG.getFile();
220            System.out.println("logPath: " + logPath);
221
222            TimeBasedRollingPolicy rollingPolicy = new TimeBasedRollingPolicy();
223            rollingPolicy.setFileNamePattern(logPath.toString());
224            rollingPolicy.activateOptions();
225
226            RollingFileAppender rollingFileAppender = new RollingFileAppender();
227            rollingFileAppender.setEncoding("UTF-8");
228            rollingFileAppender.setLayout(layout);
229            rollingFileAppender.setRollingPolicy(rollingPolicy);
230            rollingFileAppender.activateOptions();
231
232            Logger.getRootLogger().addAppender(rollingFileAppender);
233        }
234        catch(Exception ex) {
235            ex2 = ex;
236        }
237
238        String socketHost = userAppConfig.LOG.getSocketHost();
239        if(!socketHost.isEmpty()) {
240            SocketAppender socketAppender = new SocketAppender(socketHost, userAppConfig.LOG.getSocketPort());
241            socketAppender.setLocationInfo(true);
242            Logger.getRootLogger().addAppender(socketAppender);
243        }
244
245        log.info("Log configurado");
246
247        if(ex1 != null) {
248            log.error(ex1, "log setup");
249        }
250
251        if(ex2 != null) {
252            log.error(ex2, "log setup");
253        }
254    }
255
256    private void logSystemProperties() {
257
258        StringBuilder sb = new StringBuilder();
259        sb.append("System properties\n\n");
260        for(Map.Entry<Object, Object> entry : new TreeMap<Object, Object>(System.getProperties()).entrySet()) {
261            sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
262        }
263        log.info(sb.toString());
264    }
265
266    private void logSystemEnvironment() {
267
268        StringBuilder sb = new StringBuilder();
269        sb.append("System environment\n\n");
270        for(Map.Entry<String, String> entry : new TreeMap<String, String>(System.getenv()).entrySet()) {
271            sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
272        }
273        log.info(sb.toString());
274    }
275
276    private void logInternetAddresses() {
277
278        StringBuilder sb = new StringBuilder();
279        sb.append("Internet addresses\n\n");
280        for(InetAddress address : Environment.getInstance().getInternetAddresses()) {
281            sb.append("\t--------\n");
282            sb.append("\tHostAddress: ").append(address.getHostAddress()).append("\n");
283            sb.append("\tHostName: ").append(address.getHostName()).append("\n");
284            sb.append("\tCanonicalHostName: ").append(address.getCanonicalHostName()).append("\n");
285        }
286        log.info(sb.toString());
287    }
288
289    private void logUserAppConfig() {
290
291        if(userAppConfig.getConfigIniPath() == null) {
292            log.fatal("Configuration file 'config.ini' not found. Exiting now!");
293            System.exit(1);
294        }
295        else {
296            log.info("Configuration settings read from:\n" + userAppConfig.getConfigIniPath().toAbsolutePath());
297        }
298
299        StringBuilder sb = new StringBuilder();
300        sb.append("User application configuration\n\n");
301        sb.append("Server.port: ")
302                .append(userAppConfig.SERVER.getPort()).append("\n")
303          .append("Server.confidentialPort: ")
304                .append(userAppConfig.SERVER.getConfidentialPort()).append("\n")
305          .append("Server.archiveDir: ")
306                .append(userAppConfig.SERVER.getArchiveDir()).append("\n")
307          .append("MetaArchive.tcpPort: ")
308                .append(userAppConfig.META_ARCHIVE.getTcpPort()).append("\n")
309          .append("MetaArchive.tcpAllowOthers: ")
310                .append(userAppConfig.META_ARCHIVE.getTcpAllowOthers()).append("\n")
311          .append("MetaArchive.webPort: ")
312                .append(userAppConfig.META_ARCHIVE.getWebPort()).append("\n")
313          .append("MetaArchive.webAllowOthers: ")
314                .append(userAppConfig.META_ARCHIVE.getWebAllowOthers()).append("\n")
315          .append("Log.file: ")
316                .append(userAppConfig.LOG.getFile()).append("\n")
317          .append("Log.layout: ")
318                .append(userAppConfig.LOG.getLayout()).append("\n")
319          .append("Log.socketHost: ")
320                .append(userAppConfig.LOG.getSocketHost()).append("\n")
321          .append("Log.socketPort: ")
322                .append(userAppConfig.LOG.getSocketPort()).append("\n")
323          .append("Loggers\n");
324        for(Map.Entry<String,String> logger : new TreeMap<String,String>(userAppConfig.LOG.getLoggers()).entrySet()) {
325            sb.append("  ").append(logger.getKey()).append(": ").append(logger.getValue()).append("\n");
326        }
327        log.info(sb.toString());
328    }
329
330    private void logJdoMetadata(PersistenceManagerFactory pmf) {
331
332        logJdoMetadata(Setting.class, pmf);
333        logJdoMetadata(Address.class, pmf);
334        logJdoMetadata(FieldAddress.class, pmf);
335        logJdoMetadata(AddressListField_Address.class, pmf);
336        logJdoMetadata(AddressListField_Mailbox.class, pmf);
337        logJdoMetadata(MailboxListField_Mailbox.class, pmf);
338        logJdoMetadata(MailboxField_Mailbox.class, pmf);
339        logJdoMetadata(AddressListField_Group_Mailbox.class, pmf);
340        logJdoMetadata(AddressListField_Group.class, pmf);
341        logJdoMetadata(Field.class, pmf);
342        logJdoMetadata(UnstructuredField.class, pmf);
343        logJdoMetadata(ContentTypeField.class, pmf);
344        logJdoMetadata(ContentDispositionField.class, pmf);
345        logJdoMetadata(DateTimeField.class, pmf);
346        logJdoMetadata(AddressListField.class, pmf);
347        logJdoMetadata(MailboxListField.class, pmf);
348        logJdoMetadata(MailboxField.class, pmf);
349        logJdoMetadata(Body.class, pmf);
350        logJdoMetadata(Entity.class, pmf);
351        logJdoMetadata(BodyEntity.class, pmf);
352        logJdoMetadata(Message.class, pmf);
353        logJdoMetadata(BodyPart.class, pmf);
354        logJdoMetadata(EmbeddedMessage.class, pmf);
355        logJdoMetadata(SingleBody.class, pmf);
356        logJdoMetadata(TextBody.class, pmf);
357        logJdoMetadata(BinaryBody.class, pmf);
358        logJdoMetadata(Multipart.class, pmf);
359        logJdoMetadata(MessageBody.class, pmf);
360        logJdoMetadata(Folder.class, pmf);
361    }
362
363    private void logJdoMetadata(final Class clazz, final PersistenceManagerFactory pmf) {
364
365        log.debug("%s JDO METADATA\n\n%s", new Supplier<Object[]>() {
366            @Override
367            public Object[] get() {
368                return new Object[] { clazz.getName(), MetadataDumper.dump(clazz, pmf) };
369            }
370        });
371    }
372}
Note: See TracBrowser for help on using the repository browser.