8 nov. 2012

Tratando de entender y utilizar alguna API

Desde hace tiempo llevo leyendo el blog de atareao, que es un blog dedicado a Ubuntu y software libre. Uno de los logros que me parecen más interesantes de entre los que este bloguero ha creado son las lentes para Ubuntu, entre ellas Yavol. Tan interesantes me parecieron, que quise informarme sobre cómo las había hecho. Fue ahí donde conocí el concepto de API, que me interesó tanto que quedó en mi recámara guardado para cuando tuviese tiempo, intentar usar alguna.
Actualmente estoy en la parte final de un curso de programación Java utilizando el entorno de programación multiplataforma Netbeans. Así que se me ocurrió la idea de generar una aplicación gráfica con netbeans utilizando la API de Google Translate. Busqué algo de información que me sirviese como punto de partida y encontré información tan interesante como la que podéis ver aquí en un screencast. Así que me puse manos a la obra y pronto obtuve resultados, pero no los esperados (más adelante comentaré por qué). En la siguiente imagen podéis ver el aspecto gráfico de la apliación creada
Aspecto gráfico de la aplicación

El código tuve que modificarlo con respecto al que se incluye en el screencast del enlace anterior, ya que utilicé una versión de la API  más reciente. El código completo lo podéis encontrar debajo

import com.google.api.translate.*;  //Importa todas las clases de la api

public class ApiJava extends javax.swing.JFrame {

    /**
     * Creates new form ApiJava
     */
    public ApiJava() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        panelContenedor = new javax.swing.JPanel();
        txtEspanol = new javax.swing.JTextField();
        btnTraducir = new javax.swing.JButton();
        txtIngles = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        panelContenedor.setName("Traductor básico"); // NOI18N

        txtEspanol.setPreferredSize(new java.awt.Dimension(40, 20));

        btnTraducir.setText("Spa->Eng");
        btnTraducir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTraducirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelContenedorLayout = new javax.swing.GroupLayout(panelContenedor);
        panelContenedor.setLayout(panelContenedorLayout);
        panelContenedorLayout.setHorizontalGroup(
            panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContenedorLayout.createSequentialGroup()
                .addComponent(txtEspanol, javax.swing.GroupLayout.PREFERRED_SIZE, 87, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnTraducir)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(txtIngles, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE))
        );
        panelContenedorLayout.setVerticalGroup(
            panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelContenedorLayout.createSequentialGroup()
                .addGap(15, 15, 15)
                .addGroup(panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelContenedorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtEspanol, javax.swing.GroupLayout.DEFAULT_SIZE, 34, Short.MAX_VALUE)
                        .addComponent(btnTraducir))
                    .addComponent(txtIngles)))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(panelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(panelContenedor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 12, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void btnTraducirActionPerformed(java.awt.event.ActionEvent evt) {                                            
        
        try {
            String textoOriginal=(String)this.txtEspanol.getText(); //Recoge el texto
            Translator traslador=new Translator();  //Instancia un objeto de la clase Translator
            String textoTraducido=traslador.translate(textoOriginal, Language.SPANISH, Language.ENGLISH);
            //Convierte el texto original de Spanish a English y lo almacena
            //en textoTraducido
            this.txtIngles.setText(textoTraducido); //Enviamos el textoTraducido a la caja de texto
        }catch (Exception e){   //Chequea excepciones
            System.out.println("Error"+e.getMessage());
        }
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ApiJava.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ApiJava().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton btnTraducir;
    private javax.swing.JPanel panelContenedor;
    private javax.swing.JTextField txtEspanol;
    private javax.swing.JTextField txtIngles;
    // End of variables declaration
}


Cuando todo estaba perfectamente compilado y parecía listo para funcionar, la ejecución de la aplicación me devolvió el siguiente error

Can't parse the response from Google Translate service into JSON object
org.json.JSONException: JSONObject["responseData"] is not a JSONObject.


Tras una búsqueda por internet averigué que este error está relacionado con que ahora la API  de Google Translate es de pago, así que todo mi esfuerzo se fue por la borda porque por simple curiosidad no voy a pagar para usarla.
En un futuro tengo pensado utilizar alguna otra, esta vez cerciorándome de que es gratuita. De momento he pensado en la de OpenStreetMap. ¿Me recomendáis alguna?