Java tutorial
/** * 28/01/2011 13:55:29 Copyright (C) 2006 Daro L. Garca * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 2 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 * General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; if * not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA */ package ar.com.iron.android.helpers; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.InetAddress; import java.net.UnknownHostException; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import android.net.ConnectivityManager; import ar.com.iron.helpers.CantCopyException; import ar.com.iron.helpers.FileHelper; import ar.com.iron.httpclient.ConnectionClientException; import ar.com.iron.httpclient.BadStatusCodeException; import ar.com.iron.httpclient.ConnectionClient; /** * Esta clase ofrece algunos mtodos que facilitan la conexin y obtencin de datos desde servidores * remotos * * @author D. Garca */ public class UrlHelper { /** * Realiza un request http y toma de la respuesta el cuerpo principal como si fuera un string.<br> * Se asume que el servidor responde un texto pequeo como contenido de la respuesta.<br> * Utilizar este mtodo con precaucin ya que dependiendo de la respuesta puede excederse la * memoria disponible para la aplicacin * * @param remoteUrl * Direccin donde se har un pedido GET y se obtendr la respuesta * @return La cadena que representa el cuerpo de la respuesta HTTP devuelta */ public static String getStringFrom(String remoteUrl) throws FailedConnectionException { InputStream contentStream = getContentStreamFrom(remoteUrl); ByteArrayOutputStream outputStream; try { outputStream = new ByteArrayOutputStream(); FileHelper.copyTo(outputStream, contentStream); } catch (CantCopyException e) { throw new FailedConnectionException( "No fue posible construir el String con el contenido bajado del servidor", e); } finally { FileHelper.cerrarStream(contentStream); } String responseString = outputStream.toString(); FileHelper.cerrarStream(outputStream); return responseString; } /** * Realiza un request a la URL remota y devuelve un stream de entrada con el contenido devuelto * dentro de la respuesta * * @param remoteUrl * URL a la que se le realizar el request * @return El stream abierto con el contenido (debe cerrarse despus de usarlo) * @throws FailedConnectionException * Si se produjo un error en la conexin */ public static InputStream getContentStreamFrom(String remoteUrl) throws FailedConnectionException { ConnectionClient remoteConnection; try { remoteConnection = new ConnectionClient(); } catch (ConnectionClientException e) { throw new FailedConnectionException("No se pudo crear la conexin cliente antes de conectarse", e); } HttpResponse remoteResponse; try { remoteResponse = remoteConnection.executeGetMethod(remoteUrl); } catch (BadStatusCodeException e) { throw new FailedConnectionException("El servidor no respondi correctamente: " + e.getHttpStatusCode(), e); } catch (ConnectionClientException e) { throw new FailedConnectionException("Error en la comunicacin HTTP con el servidor", e); } HttpEntity entity = remoteResponse.getEntity(); if (entity == null) { throw new FailedConnectionException("El servidor no envi contenido en la respuesta"); } InputStream contentStream; try { contentStream = entity.getContent(); } catch (IllegalStateException e) { throw new FailedConnectionException( "No se puede bajar el contenido de la respuesta del servidor en el estado actual", e); } catch (IOException e) { throw new FailedConnectionException( "No se pudo bajar el contenido de la respuesta del servidor. Desconexin?", e); } return contentStream; } /** * Realiza un request a la url remota indicada y baja el contenido recibido como archivo en el * archivo que se indique.<br> * El archivo debe existir antes de llamar a este mtodo. El contenido del archivo indicado ser * reemplazado * * @param remoteUrl * Url desde la cual bajar el archivo * @param destinationFile * Archivo en el que se escribir el contenido del archivo bajado * @throws FailedConnectionException * Si se produce un error en la conexin y no se puede bajar el archivo * @throws FileNotFoundException * Si el archivo pasado no existe */ public static void getFileFrom(String remoteUrl, File destinationFile) throws FailedConnectionException, FileNotFoundException { InputStream contentStream = getContentStreamFrom(remoteUrl); FileOutputStream outputStream; try { outputStream = new FileOutputStream(destinationFile, false); } catch (FileNotFoundException e) { FileHelper.cerrarStream(contentStream); throw e; } try { FileHelper.copyTo(outputStream, contentStream); } catch (CantCopyException e) { throw new FailedConnectionException("No se pudo copiar el contenido de la respuesta al archivo", e); } finally { FileHelper.cerrarStream(contentStream); FileHelper.cerrarStream(outputStream); } } /** * Tomado de http://stackoverflow.com/questions/2295998/requestroutetohost-ip-argument * * @param hostname * Url del host * @return int que lo representa para {@link ConnectivityManager#requestRouteToHost(int, int)} */ public static int lookupHost(String hostname) { InetAddress inetAddress; try { inetAddress = InetAddress.getByName(hostname); } catch (UnknownHostException e) { return -1; } byte[] addrBytes; int addr; addrBytes = inetAddress.getAddress(); addr = ((addrBytes[3] & 0xff) << 24) | ((addrBytes[2] & 0xff) << 16) | ((addrBytes[1] & 0xff) << 8) | (addrBytes[0] & 0xff); return addr; } }