com.joseflavio.unhadegato.Concentrador.java Source code

Java tutorial

Introduction

Here is the source code for com.joseflavio.unhadegato.Concentrador.java

Source

/*
 *  Copyright (C) 2016-2018 Jos Flvio de Souza Dias Jnior
 *  
 *  This file is part of Unha-de-gato - <http://joseflavio.com/unhadegato/>.
 *  
 *  Unha-de-gato is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  
 *  Unha-de-gato 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 Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with Unha-de-gato. If not, see <http://www.gnu.org/licenses/>.
 */

/*
 *  Direitos Autorais Reservados (C) 2016-2018 Jos Flvio de Souza Dias Jnior
 * 
 *  Este arquivo  parte de Unha-de-gato - <http://joseflavio.com/unhadegato/>.
 * 
 *  Unha-de-gato  software livre: voc pode redistribu-lo e/ou modific-lo
 *  sob os termos da Licena Pblica Menos Geral GNU conforme publicada pela
 *  Free Software Foundation, tanto a verso 3 da Licena, como
 *  (a seu critrio) qualquer verso posterior.
 * 
 *  Unha-de-gato  distribudo na expectativa de que seja til,
 *  porm, SEM NENHUMA GARANTIA; nem mesmo a garantia implcita de
 *  COMERCIABILIDADE ou ADEQUAO A UMA FINALIDADE ESPECFICA. Consulte a
 *  Licena Pblica Menos Geral do GNU para mais detalhes.
 * 
 *  Voc deve ter recebido uma cpia da Licena Pblica Menos Geral do GNU
 *  junto com Unha-de-gato. Se no, veja <http://www.gnu.org/licenses/>.
 */

package com.joseflavio.unhadegato;

import com.joseflavio.copaiba.Copaiba;
import com.joseflavio.copaiba.CopaibaConexao;
import com.joseflavio.urucum.comunicacao.Consumidor;
import com.joseflavio.urucum.comunicacao.Servidor;
import com.joseflavio.urucum.comunicacao.SocketServidor;
import com.joseflavio.urucum.texto.StringUtil;
import org.apache.commons.io.IOUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

/**
 * Concentrador de {@link Copaiba}s.
 * @author Jos Flvio de Souza Dias Jnior
 */
public class Concentrador {

    private static File configuracao;

    private static Map<String, CopaibaGerenciador> gerenciadores = new HashMap<>();

    private static final Logger log = LogManager.getLogger(Concentrador.class.getPackage().getName());

    /**
     * {@link CopaibaGerenciador#iniciar() Iniciar}, {@link CopaibaGerenciador#atualizar(String, int, boolean, boolean, String, String, int) atualizar}
     * e/ou {@link CopaibaGerenciador#encerrar() encerrar} {@link CopaibaGerenciador}'s.
     * @param arquivo Arquivo de configurao de {@link CopaibaConexao}'s.
     */
    private static void executarCopaibas(File arquivo) {

        try {

            if (!arquivo.exists()) {
                try (InputStream is = Concentrador.class.getResourceAsStream("/copaibas.conf");
                        OutputStream os = new FileOutputStream(arquivo);) {
                    IOUtils.copy(is, os);
                }
            }

            Properties props = new Properties();

            try (FileInputStream fis = new FileInputStream(arquivo)) {
                props.load(fis);
            }

            for (Object chave : props.keySet()) {

                try {

                    String nome = chave.toString();

                    String[] p = props.getProperty(nome).split("\",\"");

                    String endereco = p[0].substring(1);
                    int porta = Integer.parseInt(p[1]);
                    boolean segura = p[2].equals("TLS") || p[2].equals("SSL");
                    boolean ignorarCert = p[3].equals("S");
                    String usuario = p[4];
                    String senha = p.length >= 7 ? p[5] : p[5].substring(0, p[5].length() - 1);
                    int conexoes = p.length >= 7 ? Integer.parseInt(p[6].substring(0, p[6].length() - 1)) : 5;

                    CopaibaGerenciador gerenciador = gerenciadores.get(nome);

                    if (gerenciador == null) {
                        log.info(Util.getMensagem("copaiba.iniciando", nome));
                        gerenciador = new CopaibaGerenciador(nome, endereco, porta, segura, ignorarCert, usuario,
                                senha, conexoes);
                        gerenciadores.put(nome, gerenciador);
                        gerenciador.iniciar();
                        log.info(Util.getMensagem("copaiba.iniciada", nome));
                    } else {
                        log.info(Util.getMensagem("copaiba.verificando", nome));
                        if (gerenciador.atualizar(endereco, porta, segura, ignorarCert, usuario, senha, conexoes)) {
                            log.info(Util.getMensagem("copaiba.atualizada", nome));
                        } else {
                            log.info(Util.getMensagem("copaiba.inalterada", nome));
                        }
                    }

                    try (CopaibaConexao cc = new CopaibaConexao(endereco, porta, segura, ignorarCert, usuario,
                            senha)) {
                        cc.verificar();
                        log.info(Util.getMensagem("copaiba.conexao.teste.exito", nome));
                    } catch (Exception e) {
                        log.info(Util.getMensagem("copaiba.conexao.teste.erro", nome, e.getMessage()));
                        log.error(e.getMessage(), e);
                    }

                } catch (Exception e) {
                    log.error(e.getMessage(), e);
                }

            }

            Iterator<CopaibaGerenciador> it = gerenciadores.values().iterator();
            while (it.hasNext()) {
                CopaibaGerenciador gerenciador = it.next();
                String nome = gerenciador.getNome();
                if (!props.containsKey(nome)) {
                    try {
                        log.info(Util.getMensagem("copaiba.encerrando", nome));
                        it.remove();
                        gerenciador.encerrar();
                        log.info(Util.getMensagem("copaiba.encerrada", nome));
                    } catch (Exception e) {
                        log.error(e.getMessage(), e);
                    }
                }
            }

        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

    }

    private static class Portal extends Thread {

        private Servidor servidor;

        public Portal(Servidor servidor) {
            this.servidor = servidor;
        }

        @Override
        public void run() {

            Consumidor consumidor = null;

            while (true) {

                try {

                    consumidor = servidor.aceitar();

                    consumidor.setTempoEspera(600);

                    String nome = Util.receberString(consumidor.getInputStream());
                    String resultado = null;

                    if (nome.equals("##Unha-de-gato.VERSAO")) {

                        resultado = UnhaDeGato.VERSAO;

                    } else {

                        CopaibaGerenciador gerenciador = gerenciadores.get(nome);

                        if (gerenciador != null) {
                            gerenciador.inserirConsumidor(consumidor);
                        } else {
                            resultado = "##Unha-de-gato.ERRO@" + IllegalArgumentException.class.getName() + "@"
                                    + Util.getMensagem("copaiba.desconhecida", nome);
                        }

                    }

                    if (resultado != null) {

                        Util.enviarTexto(consumidor.getOutputStream(), resultado);

                        try {
                            consumidor.getInputStream().read();
                        } catch (Exception e) {
                        } finally {
                            Util.fechar(consumidor);
                            consumidor = null;
                        }

                    }

                } catch (Exception e) {

                    if (consumidor != null) {
                        Util.fechar(consumidor);
                        consumidor = null;
                    }

                    if (e instanceof InterruptedException)
                        return;

                }

            }

        }

    }

    /**
     * @param args [0] = Diretrio de configuraes.
     */
    public static void main(String[] args) {

        log.info(Util.getMensagem("unhadegato.iniciando"));

        try {

            /***********************/

            if (args.length > 0) {
                if (!args[0].isEmpty()) {
                    configuracao = new File(args[0]);
                    if (!configuracao.isDirectory()) {
                        String msg = Util.getMensagem("unhadegato.diretorio.incorreto");
                        System.out.println(msg);
                        log.error(msg);
                        System.exit(1);
                    }
                }
            }

            if (configuracao == null) {
                configuracao = new File(System.getProperty("user.home") + File.separator + "unhadegato");
                configuracao.mkdirs();
            }

            log.info(Util.getMensagem("unhadegato.diretorio.endereco", configuracao.getAbsolutePath()));

            /***********************/

            File confGeralArq = new File(configuracao, "unhadegato.conf");

            if (!confGeralArq.exists()) {
                try (InputStream is = Concentrador.class.getResourceAsStream("/unhadegato.conf");
                        OutputStream os = new FileOutputStream(confGeralArq);) {
                    IOUtils.copy(is, os);
                }
            }

            Properties confGeral = new Properties();

            try (FileInputStream fis = new FileInputStream(confGeralArq)) {
                confGeral.load(fis);
            }

            String prop_porta = confGeral.getProperty("porta");
            String prop_porta_segura = confGeral.getProperty("porta.segura");
            String prop_seg_pri = confGeral.getProperty("seguranca.privada");
            String prop_seg_pri_senha = confGeral.getProperty("seguranca.privada.senha");
            String prop_seg_pri_tipo = confGeral.getProperty("seguranca.privada.tipo");
            String prop_seg_pub = confGeral.getProperty("seguranca.publica");
            String prop_seg_pub_senha = confGeral.getProperty("seguranca.publica.senha");
            String prop_seg_pub_tipo = confGeral.getProperty("seguranca.publica.tipo");

            if (StringUtil.tamanho(prop_porta) == 0)
                prop_porta = "8885";
            if (StringUtil.tamanho(prop_porta_segura) == 0)
                prop_porta_segura = "8886";
            if (StringUtil.tamanho(prop_seg_pri) == 0)
                prop_seg_pri = "servidor.jks";
            if (StringUtil.tamanho(prop_seg_pri_senha) == 0)
                prop_seg_pri_senha = "123456";
            if (StringUtil.tamanho(prop_seg_pri_tipo) == 0)
                prop_seg_pri_tipo = "JKS";
            if (StringUtil.tamanho(prop_seg_pub) == 0)
                prop_seg_pub = "cliente.jks";
            if (StringUtil.tamanho(prop_seg_pub_senha) == 0)
                prop_seg_pub_senha = "123456";
            if (StringUtil.tamanho(prop_seg_pub_tipo) == 0)
                prop_seg_pub_tipo = "JKS";

            /***********************/

            File seg_pri = new File(prop_seg_pri);
            if (!seg_pri.isAbsolute())
                seg_pri = new File(configuracao.getAbsolutePath() + File.separator + prop_seg_pri);

            if (seg_pri.exists()) {
                System.setProperty("javax.net.ssl.keyStore", seg_pri.getAbsolutePath());
                System.setProperty("javax.net.ssl.keyStorePassword", prop_seg_pri_senha);
                System.setProperty("javax.net.ssl.keyStoreType", prop_seg_pri_tipo);
            }

            File seg_pub = new File(prop_seg_pub);
            if (!seg_pub.isAbsolute())
                seg_pub = new File(configuracao.getAbsolutePath() + File.separator + prop_seg_pub);

            if (seg_pub.exists()) {
                System.setProperty("javax.net.ssl.trustStore", seg_pub.getAbsolutePath());
                System.setProperty("javax.net.ssl.trustStorePassword", prop_seg_pub_senha);
                System.setProperty("javax.net.ssl.trustStoreType", prop_seg_pub_tipo);
            }

            /***********************/

            new Thread() {

                File arquivo = new File(configuracao, "copaibas.conf");

                long ultimaData = -1;

                @Override
                public void run() {

                    while (true) {

                        long data = arquivo.lastModified();

                        if (data > ultimaData) {
                            executarCopaibas(arquivo);
                            ultimaData = data;
                        }

                        try {
                            Thread.sleep(5 * 1000);
                        } catch (InterruptedException e) {
                            return;
                        }

                    }

                }

            }.start();

            /***********************/

            log.info(Util.getMensagem("unhadegato.conexao.esperando"));

            log.info(Util.getMensagem("copaiba.porta.normal.abrindo", prop_porta));
            Portal portal1 = new Portal(new SocketServidor(Integer.parseInt(prop_porta), false, true));

            log.info(Util.getMensagem("copaiba.porta.segura.abrindo", prop_porta_segura));
            Portal portal2 = new Portal(new SocketServidor(Integer.parseInt(prop_porta_segura), true, true));

            portal1.start();
            portal2.start();

            portal1.join();

            /***********************/

        } catch (Exception e) {

            log.error(e.getMessage(), e);

        } finally {

            for (CopaibaGerenciador gerenciador : gerenciadores.values())
                gerenciador.encerrar();
            gerenciadores.clear();
            gerenciadores = null;

        }

    }

}