/**
* MailArchiver is an application that provides services for storing and managing e-mail messages through a Web Services SOAP interface.
* Copyright (C) 2012 Marcio Andre Scholl Levien and Fernando Alberto Reuter Wendt and Jose Ronaldo Nogueira Fonseca Junior
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
/******************************************************************************\
*
* This product was developed by
*
* SERVIÇO FEDERAL DE PROCESSAMENTO DE DADOS (SERPRO),
*
* a government company established under Brazilian law (5.615/70),
* at Department of Development of Porto Alegre.
*
\******************************************************************************/
package serpro.mailarchiver.util.bshcommands;
import java.nio.file.Files;
import java.nio.file.Path;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import bsh.CallStack;
import bsh.Interpreter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.Panel;
import com.vaadin.ui.PasswordField;
import com.vaadin.ui.ProgressIndicator;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.Window.Notification;
import serpro.mailarchiver.service.Settings;
import serpro.mailarchiver.service.dto.TFolder;
import serpro.mailarchiver.service.dto.TMessage;
import serpro.mailarchiver.service.web.ArchiveServices;
import serpro.mailarchiver.service.web.ServiceFault;
import serpro.mailarchiver.util.Browser;
import serpro.mailarchiver.util.GearsUtil;
import serpro.mailarchiver.util.Logger;
import serpro.mailarchiver.util.Sqlite;
import serpro.mailarchiver.util.SystemAccount;
import serpro.mailarchiver.util.SystemAuthenticator;
import serpro.mailarchiver.view.admin.AdminConsoleApp;
@Configurable
public class importGears {
private static final Logger log = Logger.getLocalLogger();
@Autowired private SystemAuthenticator sysAuth;
@Autowired private Settings settings;
@Autowired private ArchiveServices archiveServices;
private Window window = new Window("MailArchiver ImportGears");
private GearsArchive gearsArchive = null;
private LoginPanel loginPanel;
private PanelWindow1 panel1;
private PanelWindow2 panel2;
private PanelWindow3 panel3;
private PanelWindow4 panel4;
private PanelWindow5 panel5;
private PanelWindow6 panel6;
private PanelWindow7 panel7;
private ThreadSearch search;
private ThreadValidateWindow validate;
private ThreadArchiverWindow archiverWindow;
private ThreadArchiverProcess archiverProcess;
private ThreadValidateProcess archiverValidateProcess;
private boolean reImporter = false;
public static void invoke(final Interpreter interpreter, final CallStack callstack) {
// System.out.println("importGears.invoke sendo executado... ");
log.debug("importGears.invoke sendo executado... ");
new importGears().init();
}
private void init() {
gearsArchive = new GearsArchive();
//apenas para inicializar a tela principal
panel1 = new PanelWindow1();
window.setHeight("300px");
window.setWidth("600px");
window.setPositionY(110);
final VerticalLayout layout = (VerticalLayout) window.getContent();
//painel que representa a tela inicial do aplicativo
layout.addComponent(panel1.getPanel());
AdminConsoleApp.getInstance().getMainWindow().addWindow(window);
}
//classe para manipulação de arquivamentos do google gears
public class GearsArchive {
private String userId = null;
private String sessionId = null;
private boolean inProcess = true;
private boolean validate = true;
private String currentInportMessageSubject = new String();
private Integer currentValidInportMessageNumber = 0;
private Integer totalMessages = 0;
private Integer totalValidMessages = 0;
private Integer totalFailMessages = 1;
private Double percentProgress = new Double("00.00");
private List listGearsBrowserArchives = new ArrayList();
private Map> validDatabasePaths = new HashMap>();
private Set listSelectedGearsBrowserArchives = new HashSet();
private String mailArchiveId = null;
private SystemAccount account = null;
public List getListGearsBrowserArchives() {
return listGearsBrowserArchives;
}
public void setListGearsBrowserArchives(List listGearsBrowserArchives) {
this.listGearsBrowserArchives = listGearsBrowserArchives;
}
public Set getListSelectedGearsBrowserArchives() {
return listSelectedGearsBrowserArchives;
}
public void setListSelectedGearsBrowserArchives(Set listSelectedGearsBrowserArchives) {
this.listSelectedGearsBrowserArchives = listSelectedGearsBrowserArchives;
}
public Map> getValidDatabasePaths() {
return validDatabasePaths;
}
public void setValidDatabasePaths(Map> validDatabasePaths) {
this.validDatabasePaths = validDatabasePaths;
}
public GearsArchive() {
//id do destino de importação
mailArchiveId = settings.get("dbid");
//carrega o sessionId
sessionId = AdminConsoleApp.getInstance().getSession().getSessionId();
//carrega user logado ao mailarchiver
userId = AdminConsoleApp.getInstance().getSession().getUserId().substring(0, 9);
}
private boolean authenticateUserOs(String userOs, String passwdOs, String domain){
account = sysAuth.authenticate(userOs, passwdOs);
if(account != null) {
return true;
}
return false;
}
private void configureGearsPaths() {
//listagem dos arquivamentos válidos encontrados
// System.out.println("importGears.configureGearsPaths sendo executado... ");
log.debug("importGears.configureGearsPaths sendo executado... ");
//armazena os arquivamentos descobertos localmente por browser
List browserArchivePaths = new ArrayList();
try{
Path chromeGearsPath = account.getGearsPath(Browser.Chrome);
if((chromeGearsPath != null) && (Files.isReadable(chromeGearsPath))) {
browserArchivePaths.add(chromeGearsPath.toString());
}
else {
// log.warn("O diretório padrão do Google Gears para o navegador Chrome não existe ou o MailArchive não tem permissões sobre a localização do mesmo.");
}
Path firefoxGearsPath = account.getGearsPath(Browser.Firefox);
if((firefoxGearsPath != null) && (Files.isReadable(firefoxGearsPath))) {
browserArchivePaths.add(firefoxGearsPath.toString());
}
else {
log.warn("O diretório padrão do Google Gears para o navegador Firefox não existe ou o MailArchive não tem permissões sobre a localização do mesmo.");
}
Path internetExplorerGearsPath = account.getGearsPath(Browser.InternetExplorer);
if((internetExplorerGearsPath != null) && (Files.isReadable(internetExplorerGearsPath))) {
browserArchivePaths.add(internetExplorerGearsPath.toString());
}
else {
log.warn("O diretório padrão do Google Gears para o navegador Internet Explorer não existe ou o MailArchive não tem permissões sobre a localização do mesmo.");
}
}
catch (Exception e) {
log.error("Falha na identificação do perfil do usuário junto ao navegador: diretório de dados do Gears não localizado para as credencias de sistema informados!");
}
finally{
for(String pathStr : browserArchivePaths) {
validateDatabasePaths(pathStr);
}
}
log.debug("importGears.configureGearsPaths sendo finalizado... ");
}
// valida as estruturas de arquivamento por browser a adiciona aos validDatabasePaths
// valida a permissão de acesso do usuário logado ao expresso
private void validateDatabasePaths(String browserArchivePath) {
List databaseFilePaths = new ArrayList();
Sqlite.getInstance().setBrowserArchiverPath(browserArchivePath);
Iterator databasePaths = Sqlite.getInstance().listDatabasePaths().values().iterator();
while(databasePaths.hasNext()) {
List databasePathValues = (List) databasePaths.next();
for(String databasePath : databasePathValues) {
if(databasePath != null && !databasePath.isEmpty()) {
// testa a permissão de usuário
if(Sqlite.getInstance().isExpressoDatabase(databasePath)
&& Sqlite.getInstance().isUserDatabase(databasePath, userId)) {
databaseFilePaths.add(databasePath);
//para listagem da tela
listGearsBrowserArchives.add(browserArchivePath);
}
}
}
}
//armazena os database válidos por raiz de arquivamento gears
validDatabasePaths.put(browserArchivePath, databaseFilePaths);
}
// contabiliza o número total de emails passíveis de importação pelo MailArchiver
// a contagem será efetuada após a seleção de arquivamentos pelo usr
public void setTotalMessages() {
totalMessages = 0;
Iterator validPaths = validDatabasePaths.keySet().iterator();
while(validPaths.hasNext()) {
String browserArchivePath = validPaths.next().toString();
if(listSelectedGearsBrowserArchives.contains(browserArchivePath)) {
List databaseFilePaths = validDatabasePaths.get(browserArchivePath);
// contabiliza email para o databasePath corrente
for(String databasePath : databaseFilePaths) {
totalMessages += Sqlite.getInstance().getTotalMessages(databasePath, mailArchiveId, userId);
// System.out.println("Número de mensagens encontradas..: " + totalMessages);
log.debug("Número de mensagens encontradas..: " + totalMessages);
}
}
}
}
// grava dados de msgs aptas a importação pelo mailarchiver na table archive_importer
// o método ArchiveServices.archive utilizará as informações salvas nesta tabela
private void preArchiveMessages() {
// System.out.println("importGears.preArchiveMessages sendo executado... ");
log.debug("importGears.preArchiveMessages sendo executado... ");
Date startArchiverDate = new Date();
Integer currentMessageNumber = 0;
System.out.println("PROCESSO DE ARQUIVAMENTO GEARS INICIANDO EM..: "
+ new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(startArchiverDate));
System.out.println("USUÁRIO LOGADO..: " + userId);
log.debug("PROCESSO DE ARQUIVAMENTO GEARS INICIANDO EM..: "
+ new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(startArchiverDate));
log.debug("USUÁRIO LOGADO..: " + userId);
//contabiliza o total de msgs a serem analisadas para posteior importação pelo MailArchiver
setTotalMessages();
Iterator selectedArchivePaths = listSelectedGearsBrowserArchives.iterator();
while(selectedArchivePaths.hasNext() && validate) {
String browserSelectedArchivePath = selectedArchivePaths.next().toString();
Sqlite.getInstance().setBrowserArchiverPath(browserSelectedArchivePath);
if(validDatabasePaths.containsKey(browserSelectedArchivePath)) {
Iterator databasePaths = validDatabasePaths.get(browserSelectedArchivePath).iterator();
// começa o pré-arquivamento por databasePath
while(databasePaths.hasNext() && validate) {
String databasePath = databasePaths.next().toString();
if(reImporter) {
//atualiza tabela de controle para possibilitar re-importação do databasePath corrente
// System.out.println("Atualizando tabela de controle para re-importação.");
try {
Sqlite.getInstance().deleteMessageParameters(databasePath, mailArchiveId, userId);
//re-contabiliza as msgs a serem analisadas
setTotalMessages();
}
catch(SQLException ex) {
log.error("Falha no processo de deleção de parâmetros de mensagens referente ao MailArChiveId..: "
+ mailArchiveId, null, ex);
}
}
// carrega listagem de folders
Iterator folders = Sqlite.getInstance().listFolders(databasePath, userId).iterator();
while(folders.hasNext() && validate) {
String folder = (String) folders.next();
// carrega as mensagens que ainda não foram importadas - teste pelo mailArchiveId
// a chave é o mail id e o value eh um map com subject de chave e mail serializado como value
Map> messages = Sqlite.getInstance().listMessages(databasePath, folder, mailArchiveId, userId);
// caso 1 - primeiro arquivamento
// executa pre-archiver
if(!messages.isEmpty()) {
Iterator messagesIds = messages.keySet().iterator();
while(messagesIds.hasNext() && validate) {
String messageId = messagesIds.next().toString();
currentMessageNumber++; //contador de mensagens passíveis de importação
Map messageValues = messages.get(messageId);
Iterator messageValuesIterator = messageValues.keySet().iterator();
while(messageValuesIterator.hasNext()) {
// parametro carregado apenas para identificação de mensagem não importada na log
String messageSubject = messageValuesIterator.next().toString();
String urlExportFile = GearsUtil.unserializeUrlEntries(messageValues.get(messageSubject).toString());
String urlFilePath = null;
try {
urlFilePath = Sqlite.getInstance().getResponseBodiesFilePath(urlExportFile);
}
catch(SQLException ex) {
// grava ocorrência de mensagem com erro no log de usuário
GearsUtil.writeInUserLogFile("FolderName..: " + folder + " Message Subject..: " + messageSubject, totalFailMessages++);
log.error("FolderName..: " + folder);
log.error("Message subject.: " + messageSubject);
log.error("Não foram encontradas ocorrências de filePath para a url " + urlExportFile
+ " na table localserver.entries", ex);
}
if(urlFilePath != null) {
// System.out.println("UrlFilePath..: " + urlFilePath);
log.debug("UrlFilePath..: " + urlFilePath);
String messageFilePath = GearsUtil.loadFilePaths(browserSelectedArchivePath, urlFilePath);
// System.out.println("MessageFilePath..: " + messageFilePath);
log.debug("MessageFilePath..: " + messageFilePath);
if(messageFilePath != null) {
try {
Sqlite.getInstance().insertMessageParameters(databasePath, folder, messageId, mailArchiveId, messageFilePath, userId);
currentValidInportMessageNumber++;
}
catch(SQLException ex) {
// grava ocorrência de mensagem com erro no log de usuário
GearsUtil.writeInUserLogFile("FolderName..: " + folder + " Message Subject..: " + messageSubject, totalFailMessages++);
log.error("FolderName..: " + folder);
log.error("Message subject.: " + messageSubject);
log.error("Falha na inserção do registro de controle referente a mensagem de mailId.: " + messageId, ex);
}
}
else {//loga informações a respeito da mensagam não validada
// grava ocorrência de mensagem com erro no log de usuário
GearsUtil.writeInUserLogFile("FolderName..: " + folder + " Message Subject..: " + messageSubject, totalFailMessages++);
log.error("FolderName..: " + folder);
log.error("Message subject.: " + messageSubject);
log.error("Não foi encontrado fonte para a mensagem: " + messageId + " e não inserida na estrututura de meta-arquivamento(h2)");
}
}
}
// totalizar percentual de mensagens analisadas
percentProgress = (currentMessageNumber.doubleValue() / totalMessages) * 100;
}
}
}
}
}
}
validate = false;
// System.out.println("importGears.preArchiveMessages sendo finalizado... ");
log.debug("importGears.preArchiveMessages sendo finalizado... ");
}
// contabiliza o total de mensagens a serem importadas pelo mailarchiver para todos os arquivamentos encontrados
// utiliza os registros já validados da tabela archive_importer
private void setTotalValidMessages() {
totalValidMessages = 0;
Iterator database = validDatabasePaths.values().iterator();
while(database.hasNext()) {
List databasePaths = (List) database.next();
for(String databasePath : databasePaths) {
totalValidMessages += Sqlite.getInstance().getTotalValidMessages(databasePath, mailArchiveId, userId);
}
}
// System.out.println("TOTAL DE MENSAGENS VÁLIDAS A SEREM IMPORTADAS PELO MAILARCHIVER..: " + totalValidMessages);
log.debug("TOTAL DE MENSAGENS VÁLIDAS A SEREM IMPORTADAS PELO MAILARCHIVER..: " + totalValidMessages);
}
private void archiveMessages() {
// System.out.println("importGears.archiveMessages sendo executado... ");
log.debug("importGears.archiveMessages sendo executado... ");
// carrega o numero total de mensagens validadas na fase de pré-arquivamento
// o número diz respeito a todos databasePaths encontrados
if(inProcess) {
setTotalValidMessages();
}
if(totalValidMessages > 0) {
currentValidInportMessageNumber = 0; //re-inicializa contador
Iterator browserArchivePaths = validDatabasePaths.keySet().iterator();
while(browserArchivePaths.hasNext() && inProcess) {
Iterator databasePaths = validDatabasePaths.get(browserArchivePaths.next()).iterator();
while(databasePaths.hasNext() && inProcess) {
String databasePath = databasePaths.next().toString();
// lê os dados de email aptos a importação da table archive_importer (imported=false)
LinkedList messageParameters = Sqlite.getInstance().listMessageParameters(databasePath, mailArchiveId, userId);
Set archivedFolders = new HashSet();
Iterator parameters = messageParameters.iterator();
TFolder archiveFolder = null;
while(parameters.hasNext() && inProcess) {
String[] parameter = (String[]) parameters.next();
String folderName = parameter[0];
String mailId = parameter[1];
String messageFilePath = parameter[2];
String messageHeader = parameter[3];
String unseen = parameter[4];
try {
// cria folder no meta-arquivamento a partir do parametro folder
if(!archivedFolders.contains(folderName)) {
archiveFolder = archiveServices.createAbsoluteFolder(sessionId, folderName);
}
}
catch(ServiceFault ex) {
log.error("Falha na criação do Folder " + folderName, ex);
}
if(archiveFolder != null) {
//adiciona ao set de controle de folders arquivados no mailarchiver
archivedFolders.add(archiveFolder.getName());
//ler os dados da mensagem do filesystem de usr a partir do parametro messagefilepath
String messageContent = GearsUtil.getMessageRFC822(messageFilePath);
if(messageContent != null && messageContent.length() > 0) {
//cria mensagem no meta-arquivamento
TMessage message = null;
try {
//TMessage archive(String sessionId, String folderId, String message) throws ServiceFault;
message = archiveServices.archive(sessionId, archiveFolder.getId(), messageContent);
}
catch(ServiceFault ex) {
// grava ocorrência de mensagem com erro no log de usuário
GearsUtil.writeInUserLogFile("FolderName..: " + archiveFolder.getName()
+ " MessageFilePath..: " + messageFilePath, totalFailMessages++);
log.error("FolderName..: " + folderName);
log.error("MessageFilepath..: " + messageFilePath, ex);
// log.error("Conteúdo da mensagem..: " + "\n" + messageContent, ex);
}
if(message != null && message.getSize() > 0) {
try {
// atualiza registro na tabela de controle a partir do parametro mailid
Sqlite.getInstance().updateMessageParameters(databasePath, mailId, mailArchiveId, userId);
try {
//aplica as tags lidas da column mail.header
String xmlQueryConfig = GearsUtil.writeQueryConfigHeaders(message.getId(), messageHeader, unseen);
if(xmlQueryConfig != null) {
archiveServices.tagMessages(sessionId, xmlQueryConfig);
}
}
catch(ServiceFault ex) {
log.error(ex);
}
currentInportMessageSubject = message.getSubject();
currentValidInportMessageNumber++;
// System.out.println("Inserindo mensagem..: " + currentValidInportMessageNumber + " de" + totalValidMessages);
}
catch(SQLException ex) {
// grava ocorrência de mensagem com erro no log de usuário
GearsUtil.writeInUserLogFile("FolderName..: " + archiveFolder.getName() + " Message Subject..: " + message.getSubject(), totalFailMessages++);
log.error("FolderName..: " + folderName);
log.error("Message subject.: " + message.getSubject());
log.error("Falha na atualização da tabela archive_importer para o mailId..: " + mailId, ex);
}
}
else {
// grava ocorrência de mensagem com erro no log de usuário
GearsUtil.writeInUserLogFile("FolderName..: " + archiveFolder.getName()
+ " MessageFilePath..: " + messageFilePath, totalFailMessages++);
log.error("Falha na criação da mensagem ao invocar ArchiveServices.archive()!!");
log.error("FolderName..: " + folderName);
log.error("MessageFilepath..: " + messageFilePath);
}
}
}
else {
log.error("Folder não inserido na estrututura de meta-arquivamento(h2)..: " + folderName);
}
}
}
}
inProcess = false;
}
Date finishArchiverDate = new Date();
System.out.println("PROCESSO DE ARQUIVAMENTO GEARS FINALIZADO EM..: "
+ new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(finishArchiverDate));
log.debug("PROCESSO DE ARQUIVAMENTO GEARS FINALIZADO EM..: "
+ new SimpleDateFormat("dd-MMMM-yyyy HH:mm:ss").format(finishArchiverDate));
log.debug("Foram inseridas " + currentValidInportMessageNumber + " mensagens na estrututura de meta-arquivamento(h2)!");
// System.out.println("importGears.archiveMessages sendo finalizado... ");
log.debug("importGears.archiveMessages sendo finalizado... ");
}
}
// login - será chamado após painel1 de boas vindas
public class LoginPanel extends VerticalLayout{
private final TextField username;
private final TextField domain;
private final PasswordField password;
private Panel panel;
public Panel getPanel() {
return panel;
}
public LoginPanel(){
panel = new Panel("Painel de autenticação da aplicação! ");
panel.addComponent(new Label("Informe os dados referentes a conta do sistema operacional."));
setSizeUndefined(); // let content 'push' size
setSpacing(true);
// Username
username = new TextField("Nome do Usuário");
panel.addComponent(username);
// Password
password = new PasswordField("Senha");
panel.addComponent(password);
// Domain
domain = new TextField("Domínio");
// panel.addComponent(domain );
HorizontalLayout footer = new HorizontalLayout();
footer.setSpacing(true);
footer.setMargin(true);
// Login button
Button loginButton = new Button("Validar", new Button.ClickListener() {
// inline click listener
public void buttonClick(ClickEvent event) {
try{
if(gearsArchive.authenticateUserOs(
username.getValue().toString(),
password.getValue().toString(),
domain.getValue().toString())){
panel.setVisible(false);
panel2 = new PanelWindow2();
window.getContent().addComponent(panel2.getPanel());
panel2.getPanel().setVisible(true);
search = new ThreadSearch();
search.setName("ARCHIVE-IMPORTGEARS-SEARCH-THREAD");
search.start();
panel2.getProgress().setEnabled(true);
panel2.getProgress().setVisible(true);
} else { // informa mensagem ao usuário
panel.getApplication().getMainWindow().
showNotification("Validação local falhou, verifique os dados informados!", Notification.TYPE_ERROR_MESSAGE);
}
}catch(Exception e){
panel.getApplication().getMainWindow().
showNotification("Validação local falhou, verifique os dados informados!", Notification.TYPE_ERROR_MESSAGE);
}
}
});
footer.addComponent(loginButton);
Button exit = new Button("Sair");
exit.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.getApplication().getMainWindow().removeWindow(window);
}
});
footer.addComponent(exit);
panel.addComponent(footer);
addComponent(panel);
// setComponentAlignment(loginButton, Alignment.TOP_RIGHT);
}
}
public class PanelWindow1 extends VerticalLayout {
private Panel panel;
public Panel getPanel() {
return panel;
}
public PanelWindow1() {
panel = new Panel("Painel de abertura da aplicação! ");
setMargin(true);
setSpacing(true);
panel.addComponent(new Label("Assistente de importação Gears/MailArchiver."));
HorizontalLayout footer = new HorizontalLayout();
footer.setSpacing(true);
footer.setMargin(true);
Button next = new Button("Avançar");
next.setDescription("Iniciar processo de importação de emails");
Button exit = new Button("Sair");
next.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.setVisible(false);
loginPanel = new LoginPanel();
window.getContent().addComponent(loginPanel.getPanel());
loginPanel.getPanel().setVisible(true);
}
});
exit.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.getApplication().getMainWindow().removeWindow(window);
}
});
footer.addComponent(next);
footer.addComponent(exit);
panel.addComponent(footer);
addComponent(panel);
}
}
public class PanelWindow2 extends VerticalLayout {
private Panel panel;
private ProgressIndicator progress;
public Panel getPanel() {
return panel;
}
public ProgressIndicator getProgress() {
return progress;
}
public PanelWindow2() {
panel = new Panel("Painel de pesquisa de arquivamentos! ");
setMargin(true);
setSpacing(true);
panel.addComponent(new Label("Procurando arquivamentos válidos... "));
progress = new ProgressIndicator();
progress.setIndeterminate(true);
progress.setPollingInterval(1000);
progress.setEnabled(false);
panel.addComponent(progress);
Button cancel = new Button("Cancelar ");
cancel.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.getApplication().getMainWindow().removeWindow(window);
}
});
panel.addComponent(cancel);
addComponent(panel);
}
}
public class PanelWindow3 extends VerticalLayout {
Panel panel;
public Panel getPanel() {
return panel;
}
public PanelWindow3() {
panel = new Panel("Painel de listagem de arquivamentos válidos! ");
setMargin(true);
setSpacing(true);
HorizontalLayout footer = new HorizontalLayout();
footer.setSpacing(true);
footer.setMargin(true);
OptionGroup gearsSelectPath = null;
Button next = new Button("Avançar");
next.setDescription("Iniciar processo de importação de emails");
Button cancel = new Button("Cancelar");
cancel.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
// System.out.println("Aplicação encerrada pelo usuário!");
panel.getApplication().getMainWindow().removeWindow(window);
log.error("Aplicação encerrada pelo usuário!");
}
});
footer.addComponent(cancel);
//carrega a listagem de arquivamentos default válidos encontrados
gearsArchive.configureGearsPaths();
// só habilitará o OptionGroup e Next se existirem arquivamentos válidos
if(!gearsArchive.getListGearsBrowserArchives().isEmpty()) {
gearsSelectPath = new OptionGroup("Selecione os arquivamentos desejados.... ",
gearsArchive.getListGearsBrowserArchives());
gearsSelectPath.setMultiSelect(true);
gearsSelectPath.setImmediate(true);
gearsSelectPath.addListener(new Property.ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
gearsArchive.getListSelectedGearsBrowserArchives().addAll((Set) event.getProperty().getValue());
}
});
panel.addComponent(gearsSelectPath);
next.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
if(gearsArchive.getListSelectedGearsBrowserArchives().size() > 0) {
panel.setVisible(false);
panel4 = new PanelWindow4();
window.getContent().addComponent(panel4.getPanel());
panel4.getPanel().setVisible(true);
}
}
});
footer.addComponent(next);
}
else { // informa mensagem ao usuário
// panel.getApplication().getMainWindow().showNotification("Dados de login incorretos!", Notification.TYPE_ERROR_MESSAGE);
panel.addComponent(new Label("Não foram encontradas mensagens a serem importadas!"));
}
panel.addComponent(footer);
addComponent(panel);
}
}
public class PanelWindow4 extends VerticalLayout {
private Panel panel;
public Panel getPanel() {
return panel;
}
public PanelWindow4() {
panel = new Panel("Painel de confirmação de importação de arquivamentos!");
setMargin(true);
setSpacing(true);
panel.addComponent(new Label("Arquivamentos a serem importados..: "));
// System.out.println("Número de arquivamentos selecionados(Raiz)..: " + gearsArchive.getListSelectedGearsBrowserArchives().size());
if(gearsArchive.getListSelectedGearsBrowserArchives().size() > 0) {
Iterator paths = gearsArchive.getListSelectedGearsBrowserArchives().iterator();
while(paths.hasNext()) {
String path = paths.next().toString();
if(path.contains(Browser.Chrome.name().toLowerCase())) {
panel.addComponent(new Label("Google Chrome"));
}
if(path.contains(Browser.InternetExplorer.name().toLowerCase())) {
panel.addComponent(new Label("Internet Explorer"));
}
if(path.contains(Browser.Firefox.name().toLowerCase())) {
panel.addComponent(new Label("Mozilla Firefox"));
}
}
}
CheckBox reImport = new CheckBox("Re-importação de emails..");
reImport.setValue(false);
reImport.setDescription("Re-importação de mails....");
reImport.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
reImporter = event.getButton().booleanValue();
}
});
reImport.setImmediate(true);
panel.addComponent(reImport);
HorizontalLayout footer = new HorizontalLayout();
footer.setSpacing(true);
footer.setMargin(true);
Button next = new Button("Avançar");
next.setDescription("Arquivar mensagens.");
next.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.setVisible(false);
panel5 = new PanelWindow5();
window.getContent().addComponent(panel5.getPanel());
panel5.getPanel().setVisible(true);
validate = new ThreadValidateWindow();
validate.setName("ARCHIVE-IMPORTGEARS-VALIDATE-WINDOW-THREAD");
validate.start();
archiverValidateProcess = new ThreadValidateProcess();
archiverValidateProcess.setName("ARCHIVE-IMPORTGEARS-VALIDATE-THREAD");
archiverValidateProcess.start();
panel5.getProgress().setEnabled(true);
panel5.getProgress().setVisible(true);
}
});
Button cancel = new Button("Cancelar");
cancel.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.getApplication().getMainWindow().removeWindow(window);
}
});
Button back = new Button("Voltar");
back.setDescription("Voltar para seleção de arquivamentos.");
back.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.setVisible(false);
window.getContent().addComponent(panel3.getPanel());
panel3.getPanel().setVisible(true);
}
});
footer.addComponent(cancel);
footer.addComponent(next);
footer.addComponent(back);
panel.addComponent(footer);
addComponent(panel);
}
}
public class PanelWindow5 extends VerticalLayout {
private Panel panel;
private ProgressIndicator progress;
private Label messageCounter = new Label();
public Panel getPanel() {
return panel;
}
public ProgressIndicator getProgress() {
return progress;
}
public Label getMessageCounter() {
return messageCounter;
}
public PanelWindow5() {
panel = new Panel("Painel de validação de emails para arquivamento! ");
setMargin(true);
setSpacing(true);
panel.addComponent(new Label("Aguarde! Analisando emails arquivados pelo Google Gears."));
panel.addComponent(new Label("Esta operação poderá levar vários minutos!"));
progress = new ProgressIndicator();
progress.setIndeterminate(true);
// progress.setPollingInterval(1);
progress.setEnabled(false);
panel.addComponent(progress);
Button cancel = new Button("Cancelar ");
cancel.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
gearsArchive.validate = false;
gearsArchive.inProcess = false;
panel.getApplication().getMainWindow().removeWindow(window);
}
});
panel.addComponent(messageCounter); // exibe um totalizador de mensagens validadas
panel.addComponent(cancel);
addComponent(panel);
}
}
public class PanelWindow6 extends VerticalLayout {
private Panel panel;
private ProgressIndicator progress;
private Label message = new Label();
private Label messageCounter = new Label();
public Panel getPanel() {
return panel;
}
public ProgressIndicator getProgress() {
return progress;
}
public Label getMessage() {
return message;
}
public Label getMessageCounter() {
return messageCounter;
}
public PanelWindow6() {
panel = new Panel("Painel de andamento do processo de arquivamento! ");
setMargin(true);
setSpacing(true);
panel.addComponent(new Label("Andamento do processo..: "));
progress = new ProgressIndicator();
progress.setIndeterminate(true);
// progress.setPollingInterval(1);//atualiza a tela via ProgressIndicator
progress.setEnabled(false);
panel.addComponent(progress);
Button cancel = new Button("Cancelar ");
cancel.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.setVisible(false);
gearsArchive.inProcess = false;//termina arquivamento
panel7 = new PanelWindow7();
window.getContent().addComponent(panel7.getPanel());
panel7.getPanel().setVisible(true);
}
});
panel.addComponent(cancel);
panel.addComponent(message); // exibe os filePaths das mensagens sendo importadas
panel.addComponent(messageCounter); // exibe um totalizador de mensagens importadas
addComponent(panel);
}
}
public class PanelWindow7 extends VerticalLayout {
private Panel panel;
public Panel getPanel() {
return panel;
}
public PanelWindow7() {
panel = new Panel("Painel de resumo do processo de importação! ");
setMargin(true);
setSpacing(true);
panel.addComponent(new Label("Importação Concluída!"));
panel.addComponent(new Label("Mensagens Arquivadas..: " + gearsArchive.currentValidInportMessageNumber));
Button ok = new Button("ok");
ok.setDescription("Terminar o aplicativo!");
ok.addListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
panel.getApplication().getMainWindow().removeWindow(window);
}
});
panel.addComponent(ok);
addComponent(panel);
}
}
public class ThreadSearch extends Thread {
@Override
public void run() {
// System.out.println("ThreadSearch.run sendo executado... ");
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
log.error(e);
}
synchronized(window.getApplication()) {
panel2.getPanel().setVisible(false);
panel3 = new PanelWindow3();
window.getContent().addComponent(panel3.getPanel());
panel3.getPanel().setVisible(true);
}
// System.out.println("ThreadSearch.run sendo finalizado... ");
}
}
public class ThreadValidateWindow extends Thread {
@Override
public void run() {
// System.out.println("ThreadValidateWindow.run sendo executado... ");
boolean condition = true;
DecimalFormat decimalFormat = new DecimalFormat("0.00");
while(condition) {
synchronized(window.getApplication()) {
panel5.getMessageCounter().setCaption(decimalFormat.format(gearsArchive.percentProgress) + "% Mensagens analisadas... ");
log.debug(decimalFormat.format(gearsArchive.percentProgress) + "% Mensagens analisadas... ");
// panel5.getMessageCounter().setEnabled(false);
if(gearsArchive.totalMessages > 0) {
panel5.getMessageCounter().setVisible(true);
}
if(!gearsArchive.validate) {
panel5.getPanel().setVisible(false);
panel6 = new PanelWindow6();
window.getContent().addComponent(panel6.getPanel());
panel6.getPanel().setVisible(true);
panel6.getProgress().setEnabled(true);
panel6.getProgress().setVisible(true);
condition = false;
}
}
}
// inicializa o processo de arquivamento no h2
archiverWindow = new ThreadArchiverWindow();
archiverWindow.setName("ARCHIVE-IMPORTGEARS-WINDOW-THREAD");
archiverWindow.start();
archiverProcess = new ThreadArchiverProcess();
archiverProcess.setName("ARCHIVE-IMPORTGEARS-THREAD");
archiverProcess.start();
// System.out.println("ThreadValidateWindow.run sendo finalizado... ");
}
}
// dispara o pré-arquivamento de mensagens
public class ThreadValidateProcess extends Thread {
@Override
public void run() {
// System.out.println("ThreadArchiverValidateProcess.run sendo executado... ");
//efetua a carga previa nos dados para posterior importação pelo mailarchiver
gearsArchive.preArchiveMessages();
// System.out.println("ThreadArchiverValidateProcess.run sendo finalizado... ");
}
}
//controla as atualizações de tela enquanto o arquivamento é processado
public class ThreadArchiverWindow extends Thread {
@Override
public void run() {
// System.out.println("ThreadArchiverWindow.run sendo executado... ");
while(gearsArchive.inProcess) {
synchronized(window.getApplication()) {
panel6.getMessage().setCaption("Arquivando a mensagem..: " + gearsArchive.currentInportMessageSubject);
panel6.getMessageCounter().setCaption(gearsArchive.currentValidInportMessageNumber + " de " + gearsArchive.totalValidMessages);
panel6.getMessage().setEnabled(false);
panel6.getMessageCounter().setEnabled(false);
panel6.getMessage().setVisible(true);
panel6.getMessageCounter().setVisible(true);
}
}
panel6.getPanel().setVisible(false);
panel7 = new PanelWindow7();
window.getContent().addComponent(panel7.getPanel());
panel7.getPanel().setVisible(true);
// System.out.println("ThreadArchiverWindow.run sendo finalizado... ");
}
}
//dispara a importação de mensagens para o h2
public class ThreadArchiverProcess extends Thread {
@Override
public void run() {
// System.out.println("ThreadArchiverProcess.run sendo executado... ");
//
// System.out.println("ThreadSearch --> "+ search.getState());
//
// System.out.println("ThreadValidateWindow --> "+ validate.getState());
//
// System.out.println("ThreadValidateProcess --> "+ archiverValidateProcess.getState());
gearsArchive.archiveMessages();
gearsArchive.inProcess = false;
// System.out.println("ThreadArchiverProcess.run sendo finalizado... ");
}
}
}