package gov.pr.celepar.tabeliao.util;
/*
Este programa � licenciado de acordo com a
LPG-AP (LICEN�A P�BLICA GERAL PARA PROGRAMAS DE COMPUTADOR DA ADMINISTRA��O P�BLICA),
vers�o 1.1 ou qualquer vers�o posterior.
A LPG-AP deve acompanhar todas PUBLICA��ES, DISTRIBUI��ES e REPRODU��ES deste Programa.
Caso uma c�pia da LPG-AP n�o esteja dispon�vel junto com este Programa,
voc� pode contatar o LICENCIANTE ou ent�o acessar diretamente:
http://www.celepar.pr.gov.br/licenca/LPG-AP.pdf
Para poder USAR, PUBLICAR, DISTRIBUIR, REPRODUZIR ou ALTERAR este Programa
� preciso estar de acordo com os termos da LPG-AP
*/
import gov.pr.celepar.tabeliao.client.autenticacao.AutenticacaoTabeliao;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.SocketTimeoutException;
import java.net.URL;
import org.apache.log4j.Logger;
/**
* Classe utilitaria para download de LCR (Lista de Certificados Revogados)
* O metodos permitem tambem a execucao atraves de proxy (com ou sem autenticacao)
*
* @author Thiago Meneghello - GIC/CELEPAR
* @author Emerson Sachio Saito - GIC/CELEPAR
*
*/
public class Download {
private static Logger log = Logger.getLogger(Download.class);
private static boolean inicializou = false;
private Download(){
}
/**
* Inicializar as configuracoes de proxy com uso de arquivo do SENTINELA
* Este metodo interfere nas configura��es globais do servidor
*
* @see fazDownload
*/
private static void inicializa(){
if(!inicializou){
final String portaProxy = AutenticacaoTabeliao.getLCRProxyPorta();
final String proxy = AutenticacaoTabeliao.getLCRProxy();
System.getProperties().put("http.proxySet", "true");
System.getProperties().put("http.proxyHost", proxy);
System.getProperties().put("http.proxyPort", portaProxy);
inicializou = true;
log.info("Modificou propriedades do sistema: " +proxy);
}
}
/**
* Inicializar as configuracoes de proxy, para sistemas NAO integrados com sentinela
* Este metodo interfere nas configura��es globais do servidor
* @see fazDownload
*/
private static void inicializa(String proxy, String proxyPorta){
if(!inicializou){
System.getProperties().put("http.proxySet", "true");
System.getProperties().put("http.proxyHost", proxy);
System.getProperties().put("http.proxyPort", proxyPorta);
inicializou = true;
log.info("Modificou propriedades do sistema: " +proxy);
}
}
/**
* Executa o download, precisa da integracao com SENTINELA para uso de proxy (configura��es globais do servidor)
* @param url -> endereco da LCR
* @return InputStream do arquivo de LCR
* @throws IOException
* @see fazDownload
*/
public static InputStream download(String url){
final String usuarioProxy = AutenticacaoTabeliao.getLCRProxyUsuario();
final String senhaProxy = AutenticacaoTabeliao.getLCRProxySenha();
final String proxy = AutenticacaoTabeliao.getLCRProxy();
InputStream isRetorno;
//log.debug("Achou Proxy em download: " + proxy);
if (proxy == null)
{
System.getProperties().put("http.proxySet", "false");
log.debug("Sem Proxy!");
} else {
inicializa();
//log.debug("Com Proxy!");
}
// codigo utilizado por causa do proxy0.celepar.parana
if(usuarioProxy != null && senhaProxy != null) {
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new
PasswordAuthentication(usuarioProxy,senhaProxy.toCharArray());
}});
//log.debug("Com Autenticacao!");
}else{
log.debug("Sem Autenticacao!");
}
java.net.HttpURLConnection con=null;
try {
URL http = new URL(url);
con = (java.net.HttpURLConnection) http.openConnection();
con.setConnectTimeout(30 * 1000); // tempo de timeout de conexao = 30 segundos
con.setReadTimeout(120 * 1000); // tempo de timeout de leitura = 2 minutos
//log.info("Resposta do servidor:"+con.getResponseCode());
isRetorno = con.getInputStream();
}catch (SocketTimeoutException e1){
log.error("Tempo excedido."+e1);
isRetorno = null;
}catch (MalformedURLException e) {
log.error("Problema de Url."+e);
isRetorno = null;
} catch (IOException e) {
log.error("Problemas de IO."+e);
isRetorno = null;
}
return isRetorno;
/* codigo utilizado com proxy.pr.gov.br
URL http = new URL(url);
URLConnection conn = http.openConnection();
if(usuarioProxy != null && senhaProxy != null) {
Base64Encoder b64 = new Base64Encoder(usuarioProxy + ":" + senhaProxy);
conn.setRequestProperty("Proxy-Authorization", "Basic " + b64.processString());
}
return conn.getInputStream();
*/
}
/**
* Executa o download, NAO precisa estar integrado com o sentinela.
* Se precisar utilizar proxy havera alteracao nas configuracoes globais do servidor
* @param url -> endereco da LCR
* @param proxy -> endereco de proxy
* @param proxyUser -> usuario do proxy
* @param proxyPass -> senha do proxy
* @return InputStream do arquivo de LCR
* @throws IOException
* @see fazDownload
*/
public static InputStream download(String url, String proxy, String proxyPorta, String proxyUser, String proxyPass){
final String usuarioProxy = proxyUser;
final String senhaProxy = proxyPass;
InputStream isRetorno;
if (proxy == null || proxy.length() == 0)
{
System.getProperties().put("http.timeout", 300000);
System.getProperties().put("http.proxySet", "false");
log.debug("Sem Proxy!");
} else {
inicializa(proxy, proxyPorta);
// log.debug("Com Proxy!");
}
if(usuarioProxy != null && senhaProxy != null) {
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new
PasswordAuthentication(usuarioProxy,senhaProxy.toCharArray());
}});
}
else{
log.debug("Sem Autenticacao");
}
java.net.HttpURLConnection con = null;
try {
URL http = new URL(url);
con = (java.net.HttpURLConnection) http.openConnection();
con.setConnectTimeout(30 * 1000); // tempo de timeout de conexao = 10 segundos
con.setReadTimeout(120 * 1000); // tempo de timeout de leitura = 2 minutos
//log.info("Resposta do servidor:"+con.getResponseCode());
isRetorno = con.getInputStream();
}catch (SocketTimeoutException e1){
log.error("Tempo excedido."+e1);
isRetorno = null;
}catch (MalformedURLException e) {
log.error("Problema de Url."+e);
isRetorno = null;
} catch (IOException e) {
log.error("Problemas de IO."+e);
isRetorno = null;
}
return isRetorno;
/* codigo utilizado com proxy.pr.gov.br
URL http = new URL(url);
URLConnection conn = http.openConnection();
if(usuarioProxy != null && senhaProxy != null) {
Base64Encoder b64 = new Base64Encoder(usuarioProxy + ":" + senhaProxy);
conn.setRequestProperty("Proxy-Authorization", "Basic " + b64.processString());
}
return conn.getInputStream();
*/
}
/**
* Executa o download, COM integracao com o uso do Sentinela
* Este metodo nao interfere nas configuracoes globais do sistema, porem depende do uso da VM da SUN
* @param url -> endereco da LCR
* @return InputStream do arquivo de LCR
* @throws IOException
*/
public static InputStream downloadSun(String url){
final String usuarioProxy = AutenticacaoTabeliao.getLCRProxyUsuario();
final String senhaProxy = AutenticacaoTabeliao.getLCRProxySenha();
final String proxy = AutenticacaoTabeliao.getLCRProxy();
final int numPorta = Integer.parseInt(AutenticacaoTabeliao.getLCRProxyPorta());
InputStream isRetorno;
//log.debug("Achou Proxy em download: " + proxy);
// codigo utilizado por causa do proxy0.celepar.parana
if(usuarioProxy != null && senhaProxy != null) {
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new
PasswordAuthentication(usuarioProxy,senhaProxy.toCharArray());
}});
//log.debug("Com Autenticacao!");
}else{
log.debug("Sem Autenticacao!");
}
sun.net.www.protocol.http.HttpURLConnection con=null;
try {
URL http = new URL(url);
con = new sun.net.www.protocol.http.HttpURLConnection(http, proxy, numPorta);
con.setConnectTimeout(30 * 1000); // tempo de timeout de conexao = 30 segundos
con.setReadTimeout(120 * 1000); // tempo de timeout de leitura = 2 minutos
//log.info("Resposta do servidor:"+con.getResponseCode());
isRetorno = con.getInputStream();
}catch (SocketTimeoutException e1){
log.error("Tempo excedido."+e1);
isRetorno = null;
}catch (MalformedURLException e) {
log.error("Problema de Url."+e);
isRetorno = null;
} catch (IOException e) {
log.error("Problemas de IO."+e);
isRetorno = null;
}
return isRetorno;
}
/**
* Executa o download, SEM uso de arquivo de configuracao.
* Este metodo nao interfere nas configuracoes globais do sistema, porem depende do uso da VM da SUN
* @param url -> endereco da LCR
* @param proxy -> endereco de proxy
* @param proxyUser -> usuario do proxy
* @param proxyPass -> senha do proxy
* @return InputStream do arquivo de LCR
* @throws IOException
*/
public static InputStream downloadSun(String url, String proxy, String proxyPorta, String proxyUser, String proxyPass){
final String usuarioProxy = proxyUser;
final String senhaProxy = proxyPass;
final int numPorta = Integer.parseInt(proxyPorta);
InputStream isRetorno;
if(usuarioProxy != null && senhaProxy != null) {
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new
PasswordAuthentication(usuarioProxy,senhaProxy.toCharArray());
}});
}
else{
log.debug("Sem Autenticacao");
}
sun.net.www.protocol.http.HttpURLConnection con = null;
try {
URL http = new URL(url);
con = new sun.net.www.protocol.http.HttpURLConnection(http, proxy, numPorta);
con.setConnectTimeout(30 * 1000); // tempo de timeout de conexao = 10 segundos
con.setReadTimeout(120 * 1000); // tempo de timeout de leitura = 2 minutos
//log.info("Resposta do servidor:"+con.getResponseCode());
isRetorno = con.getInputStream();
}catch (SocketTimeoutException e1){
log.error("Tempo excedido."+e1);
isRetorno = null;
}catch (MalformedURLException e) {
log.error("Problema de Url."+e);
isRetorno = null;
} catch (IOException e) {
log.error("Problemas de IO."+e);
isRetorno = null;
}
return isRetorno;
}
/**
* Chamada para os procedimentos do download
* Este metodo depende da integracao com o Sentinela
* Se NAO for VM da SUN, ira interferir nas configuracoes globais do servidor
* @param url -> endereco da LCR
* @return array de bytes do arquivo de LCR
* @throws IOException
*/
public static byte[] downloadByteArray(String url) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int tmp;
InputStream is = null;
String jvmVendor = System.getProperty("java.vm.vendor");
if (jvmVendor.toLowerCase().contains("sun")){
is = downloadSun(url);
}else{
is = download(url);
}
if (is != null){
while((tmp = is.read(buffer)) != -1) {
bos.write(buffer, 0, tmp);
}
buffer = bos.toByteArray();
is.close();
bos.close();
//log.info("Baixou:"+buffer.length);
}else{
log.error("download vazio");
}
return buffer;
}
/**
* Chamada para os procedimentos do download
* Download de LCR sem interacao com o Sentinela
* Se for VM da SUN, Nao ira interferir nas configuracoes globais do servidor
*
* @param url -> endereco da LCR
* @param proxy -> endereco do proxy
* @param proxyUser -> usuario do proxy
* @param proxyPass -> senha do proxy
* @return array de bytes do arquivo de LCR
* @throws IOException
*/
public static byte[] downloadByteArray(String url, String proxy, String proxyPorta, String proxyUser, String proxyPass) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int tmp;
InputStream is = null;
String jvmVendor = System.getProperty("java.vm.vendor");
if (jvmVendor.toLowerCase().contains("sun")){
is = downloadSun(url, proxy, proxyPorta, proxyUser, proxyPass);
}else{
is = download(url, proxy, proxyPorta, proxyUser, proxyPass);
}
if (is != null){
while((tmp = is.read(buffer)) != -1) {
bos.write(buffer, 0, tmp);
}
buffer = bos.toByteArray();
is.close();
bos.close();
//log.info("Baixou:"+buffer.length);
}
else{
//System.out.println("download vazio");
log.error("download vazio");
}
return buffer;
}
}