Java tutorial
/******************************************************************************* * Copyright 2005, 2006, 2007, 2008 Acessibilidade Brasil * Este arquivo parte do programa ASES - Avaliador e Simulador para AcessibilidadE de Stios * O ASES um software livre; voc pode redistribui-lo e/ou modifica-lo dentro dos termos da Licena Pblica Geral GNU como * publicada pela Fundao do Software Livre (FSF); na verso 2 da Licena, ou (na sua opnio) qualquer verso posterior. * Este programa distribuido na esperana que possa ser util, mas SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAO a qualquer MERCADO ou APLICAO EM PARTICULAR. Veja a Licena Pblica Geral GNU para maiores detalhes. * Voc deve ter recebido uma cpia da Licena Pblica Geral GNU, sob o ttulo "LICENCA.txt", junto com este programa, se no, escreva para a Fundao do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *******************************************************************************/ /******************************************************************************* * Copyright (c) 2005, 2006, 2007 Acessibilidade Brasil. * * This file is part of ASES. * * ASES 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 2.1 of the License, or (at your option) any later version. * * This library 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. * A copy of the license can be found at * http://www.gnu.org/copyleft/lesser.txt. *******************************************************************************/ package br.org.acessobrasil.nucleuSilva.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethod; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.auth.CredentialsProvider; import org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.protocol.Protocol; import br.org.acessobrasil.silvinha.entidade.RelatorioDaUrl; import br.org.acessobrasil.silvinha.util.TimeOut; import br.org.acessobrasil.silvinha.vista.frames.mensagens.PaginasNaoAnalisadas; import br.org.acessobrasil.silvinha.vista.panels.PainelSenha; import br.org.acessobrasil.silvinha2.util.G_Log; /** * Classe responsvel pela captura do contedo de uma pgina na Internet. * * @author Acessibilidade Brasil, em 09/11/2005. */ public final class PegarPaginaWEB { private G_Log log = new G_Log("PegarPaginaWeb.log"); public boolean ativo; private HttpClient httpClient; private PainelSenha ps; public HttpMethod metodo; public boolean paginaObtida; /** * Construtor de PegarPaginaWEB. */ public PegarPaginaWEB(int a) { } public PegarPaginaWEB() { // me parece que o construtor aqui apenas inicializa alguns parametros e // registra o protocolo httpClient = new HttpClient(); ps = new PainelSenha(); httpClient.getParams().setParameter(CredentialsProvider.PROVIDER, ps); // coloca // no // objeto // httpclient // o // parametro // provider // associado // a ps EasySSLProtocolSocketFactory sssl = new EasySSLProtocolSocketFactory(); // StrictSSLProtocolSocketFactory sssl = new // StrictSSLProtocolSocketFactory(); // sssl.setHostnameVerification(false); Protocol easyhttps = new Protocol("https", sssl, 443); Protocol.registerProtocol("https", easyhttps); } /** * Independente de Relatorio * @param url * @return * @throws IOException * @throws HttpException * @throws NotHTML * @throws TempoExcedido * @throws IOException * @throws HttpException */ public String getContent(String url) throws HttpException, IOException { metodo = new GetMethod(url); metodo.setRequestHeader("user-agent", "Mozilla/5.0"); metodo.setFollowRedirects(true); int status = httpClient.executeMethod(metodo); String type = getContentType(metodo); String location = getLocation(metodo); //Verificar os possveis erros if (status != HttpStatus.SC_OK) { //No foi aceito, ocorreu um erro 500 404 if (status == HttpStatus.SC_NOT_FOUND) { } return ""; } if ((status == HttpStatus.SC_OK) && (type.toUpperCase().indexOf("TEXT/HTML") == -1)) { //No do tipo texto/html return ""; } //Verifica redirecionamento if (location != "") { //System.out.print(url+" to "+location+"\n"); } String conteudoHTML = metodo.getResponseBodyAsString(); return conteudoHTML; } /** * Pega o cdigo css * @param url * @return * @throws Exception */ public String getCssContent(String url) throws Exception { metodo = new GetMethod(url); metodo.setRequestHeader("user-agent", "Mozilla/5.0"); metodo.setFollowRedirects(true); int status = httpClient.executeMethod(metodo); String location = getLocation(metodo); //Verificar os possveis erros if (status != HttpStatus.SC_OK) { //No foi aceito, ocorreu um erro 500 404 if (status == HttpStatus.SC_NOT_FOUND) { } throw new Exception("Erro de http " + status + " para url='" + url + "'"); //return ""; } //Verifica redirecionamento if (location != "") { //System.out.print(url+" to "+location+"\n"); } String conteudoHTML = metodo.getResponseBodyAsString(); return conteudoHTML; } /** * Mtodo que extrai o contedo de uma pgina. * * @param url * URL da pgina a ter seu contedo extrado. * @return Contedo de uma pgina. * @throws IOException * Erro ao conectar a pgina. * @deprecated Utilize o mtodo getContent(). */ public static StringBuilder pegar(final URL url) throws IOException { StringBuilder buf = new StringBuilder(); InputStreamReader isr = new InputStreamReader(url.openStream()); BufferedReader in = new BufferedReader(isr); while (in.ready()) { buf.append(in.readLine() + "\n"); } in.close(); // aqui simplesmente lido uma pagina da internet e retornada em buf, // sem tratamentos return buf; } /** * Mtodo que extra o contedo de uma pgina web. * * @param url * Pgina que vai ser pesquisada. * @return Contedo da pgina HTML. * @throws IOException * Erro ao tentar extrair o contedo da pgina html. */ public void getContent(final RelatorioDaUrl relatorio) { /* * Melhorar este cdigo!!! */ log.addLog("getContent(" + relatorio.getUrl() + ")\n"); int status = 9999; setAtivo(false); metodo = null; final int mb = 1024; String type = new String(); InputStream ist = null; StringBuilder sbd = null; setPaginaObtida(true); TimeOut tc = new TimeOut(this); setAtivo(true); Thread thrTc = new Thread(tc); thrTc.start(); try { metodo = new GetMethod(relatorio.getUrl()); metodo.setRequestHeader("user-agent", "Mozilla/5.0"); metodo.setFollowRedirects(true); } catch (Exception e) { log.addLog("Erro no GetMetodo: " + e.getMessage() + "\n"); //Ini - nati code colocaNaTabelaErros("timeOut", relatorio); setPaginaObtida(false); setAtivo(false); //Fim - nati code metodo = null; thrTc = null; tc = null; return; } if (!tc.timeOut) { // httpClient.setConnectionTimeout(arg0) try { status = httpClient.executeMethod(metodo); type = getContentType(metodo); String tam = getContentLength(metodo); String location = getLocation(metodo); if (location != "") { //System.out.print(relatorio.getUrl()+" to "+location+"\n"); } log.addLog("type=" + type + " tam=" + tam + "\n"); if ((status == HttpStatus.SC_OK) && (type.toUpperCase().indexOf("TEXT/HTML") > -1)) { if (!tc.timeOut) { sbd = new StringBuilder(); //ist = metodo.getResponseBodyAsStream(); } else { colocaNaTabelaErros("timeOut", relatorio); setPaginaObtida(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); setAtivo(false); } if (!tc.timeOut) { /* byte[] dados = new byte[mb]; int bytesLidos = 0; while ((bytesLidos = ist.read(dados)) > 0) { sbd.append(new String(dados, 0, bytesLidos)); } ist.close(); */ sbd.append(metodo.getResponseBodyAsString()); } else { colocaNaTabelaErros("timeOut", relatorio); setPaginaObtida(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); setAtivo(false); } //verifica se existe contedo if (sbd.toString().equals("") || sbd == null || sbd.toString().trim().length() <= 1) { colocaNaTabelaErros("Sem contedo", relatorio); setPaginaObtida(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); setAtivo(false); } } else { //verifica se o tipo est errado if (type.toUpperCase().indexOf("TEXT/HTML") == -1) { colocaNaTabelaErros("No HTML", relatorio); } else if (status == HttpStatus.SC_NOT_FOUND) { colocaNaTabelaErros("No Encontrado", relatorio); } else { colocaNaTabelaErros("Status error " + status, relatorio); } setPaginaObtida(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); setAtivo(false); } if (!tc.timeOut) { metodo.abort(); metodo.releaseConnection(); } else { colocaNaTabelaErros("timeOut", relatorio); setAtivo(false); setPaginaObtida(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); } if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); } catch (Exception e) { log.addLog("Erro: " + e.getMessage() + "\n"); colocaNaTabelaErros("Erro: " + e.getMessage(), relatorio); setAtivo(false); setPaginaObtida(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); } } else { colocaNaTabelaErros("timeOut", relatorio); setPaginaObtida(false); setAtivo(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); } try { metodo.abort(); metodo.releaseConnection(); } catch (Exception e) { } if (sbd != null && (type.toUpperCase().indexOf("TEXT") > -1) && !tc.timeOut && isAtivo()) { setAtivo(false); //System.out.println("PPW:\n"+sbd.toString()); relatorio.setConteudo(sbd); } if (!tc.isTimeOut()) { setPaginaObtida(true); } tc.timeOut = false; setAtivo(false); if (!thrTc.interrupted()) if (thrTc.isAlive()) thrTc.interrupt(); log.addLog("Ok \n"); } /** * Mtodo que retorna o Content-type de uma pgina web. * * @param metodo * Uma instncia de org.apache.commons.httpclient.HttpMethod * inicializada pela pgina. * @return O Content-Type da pgina pesquisada. */ private static String getContentType(final HttpMethod metodo) { String type = ""; Header header = metodo.getResponseHeader("Content-Type"); if (header != null) { type = header.getValue(); } return type; } private static String getContentLength(final HttpMethod metodo) { String retorno = ""; Header header = metodo.getResponseHeader("Content-Length"); if (header != null) { retorno = header.getValue().toString(); } return retorno; } private static String getLocation(final HttpMethod metodo) { String retorno = ""; Header header = metodo.getResponseHeader("Location"); if (header != null) { retorno = header.getValue().toString(); } return retorno; } public boolean isAtivo() { return ativo; } public void setAtivo(boolean ativo) { this.ativo = ativo; } public boolean isPaginaObtida() { return paginaObtida; } public void setPaginaObtida(boolean paginaObtida) { this.paginaObtida = paginaObtida; } /** * Retirar desta classe * @param mensagem * @param relatorio */ private void colocaNaTabelaErros(String mensagem, RelatorioDaUrl relatorio) { RelatorioDaUrl relatorionaoavaliado = new RelatorioDaUrl(); relatorionaoavaliado.setUrl(relatorio.getUrl()); PaginasNaoAnalisadas.relatorios.add(relatorionaoavaliado); PaginasNaoAnalisadas.mensagens.add(mensagem); } }