martes, 3 de junio de 2014

Importar clases estáticas en Java

Con la finalidad de acceder a métodos estáticos, es necesario especificar la clase de la que ellos provienen. A partir del JDK 1.5, Java nos proporciona un mecanismo que nos permite acceder a miembros estáticos sin la necesidad de especificar la clase a la que pertenecen.
El siguiente ejemplo nos muestra cómo sería un programa normal en Java:
public class Demo {

    public static void main(String[] args) {

        try {
            double r = Math.cos(Math.PI * 5.0);
            System.out.println("El valor de r es = " + r);
        } catch (Exception ex) {
            System.err.println("Error: " + ex);
        }

    }
}
Y utilizando la declaración static import:
import static java.lang.System.out;
import static java.lang.System.err;
import static java.lang.Math.*;

public class Demo {

    public static void main(String[] args) {

        try {
            double r = cos(PI * 5.0);
            out.println("El valor de r es = " + r);
        } catch (Exception ex) {
            err.println("Error: " + ex);
        }

    }
}
La declaración static import es análoga a la declaración import, pues mientras la segunda importa toda clases desde paquetes permitiendo su uso sin la especificación de los paquetes de donde provienen, la declaración static import permite la importación de clases permitiendo el uso de sus miembros estáticos sin la especificación de la clase de la que provienen.

lunes, 2 de junio de 2014

Controlar el tiempo de espera al consumir un webservice

Durante los últimos días, al consumir los Webservice del SRI hemos podido notar que muchas veces se queda en espera sin retornar el objeto de respuesta. Es por eso que es importante controlar el tiempo de espera máximo en nuestra aplicación (Timeout). Para aquellos quienes estén usando el JDK 1.6 este código les servirá para poder establecer un mecanismo de control:
port = service.getRecepcionComprobantesPort();
((BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 5000);
((BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 5000);
Espero que este código les sea de utilidad y no se olviden de seguirnos a través de nuestra página en Facebook.

domingo, 1 de junio de 2014

Dibujar circunferencia que pasa por tres puntos en Java

Dados tres puntos no alineados, existe una y solo una circunferencia que pasa por los tres. En este artículo voy a mostrarles la manera cómo poder determinar la ecuación de la circunferencia que pasa por estos puntos de tal forma que podamos graficarla utilizando el API Java2D.

Dada la circunferencia cuya ecuación es:


Y tres puntos que pertenecen a dicha circunferencia:


Al reemplazar los puntos por X e Y obtendremos las siguientes equivalencias [1]:

h = (1/2)((a²+b²)(f-d) + (c²+d²)(b-f) + (e²+f²)(d-b)) / (a(f-d)+c(b-f)+e(d-b)) 
k = (1/2)((a²+b²)(e-c) + (c²+d²)(a-e) + (e²+f²)(c-a)) / (b(e-c)+d(a-e)+f(c-a)) 

Calculando los valores de h y k podemos calcular el valor del radio r hallando la distancia entre los puntos (h,k) y cualquiera de los tres puntos dados inicialmente.


import java.awt.Color;
import java.awt.Graphics2D;

/**
 *
 * @author Rolando
 */
public class Circunferencia {

    private Punto centro;
    private double radio;

    public Circunferencia() {
    }

    public Circunferencia(Punto centro, int radio) {
        this.centro = centro;
        this.radio = radio;
    }

    public Punto getCentro() {
        return centro;
    }

    public void setCentro(Punto centro) {
        this.centro = centro;
    }

    public double getRadio() {
        return radio;
    }

    public void setRadio(double radio) {
        this.radio = radio;
    }

    public void dibujar(Graphics2D g2) {
        int x = (int) centro.getPunto().getX();
        int y = (int) centro.getPunto().getY();
        int r = (int) radio;
        centro.dibujar(g2);
        g2.setColor(Color.red);
        g2.drawOval(x - r, y - r, 2 * r, 2 * r);
    }
}
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;

/**
 *
 * @author Rolando
 */
public class Punto {

    private Point2D punto;

    public Punto() {
        punto = new Point2D.Double(0, 0);
    }

    public Punto(int x, int y) {
        punto = new Point2D.Double(x, y);
    }

    public Point2D getPunto() {
        return punto;
    }

    public void setPunto(Point2D punto) {
        this.punto = punto;
    }

    public void dibujar(Graphics2D g2) {
        g2.setColor(Color.blue);
        int x = (int) punto.getX();
        int y = (int) punto.getY();
        g2.fillOval(x - 2, y - 2, 4, 4);
    }
}
public static Circunferencia calcularCentro(Punto x1, Punto x2, Punto x3) {
    Circunferencia circunferencia = new Circunferencia();
    double a, b, c, d, e, f, h, k, r;
    a = x1.getPunto().getX();
    b = x1.getPunto().getY();
    c = x2.getPunto().getX();
    d = x2.getPunto().getY();
    e = x3.getPunto().getX();
    f = x3.getPunto().getY();
    h = (0.5) * ((Math.pow(a, 2) + Math.pow(b, 2)) * (f - d) + (Math.pow(c, 2) + Math.pow(d, 2)) * (b - f) + (Math.pow(e, 2) + Math.pow(f, 2)) * (d - b)) / (a * (f - d) + c * (b - f) + e * (d - b));
    k = (0.5) * ((Math.pow(a, 2) + Math.pow(b, 2)) * (e - c) + (Math.pow(c, 2) + Math.pow(d, 2)) * (a - e) + (Math.pow(e, 2) + Math.pow(f, 2)) * (c - a)) / (b * (e - c) + d * (a - e) + f * (c - a));
    r = Math.sqrt(Math.pow((h - a), 2) + Math.pow((k - b), 2));
    circunferencia.setRadio(r);
    circunferencia.setCentro(new Punto((int) h, (int) k));
    return circunferencia;
}
El siguiente Applet nos ayudará a entender un poco mejor este escenario:



También les comparto el proyecto de Netbeans pues siempre he dicho que un artículo sin código fuente es como un libro sin hojas.


Hasta una próxima publicación y no se olviden de seguirnos a través de nuestra página en Facebook.