lunes, 13 de mayo de 2019

Pasar un array de java a Nested

Buenos días, tardes, noches.

Este día les traigo la creacion de un nuevo desarrollo el cual se trata de el paso de informacion de java a Oracle, usando del lado de Oracle lo que se conoce como Nested Table del cual encuentran mas informacion aquí.

Dejando a un lado la estructura de la tabla en Oracle, nos vamos directo al código en el lado de Java.


He creado la siguiente estructura, una clase Pojo, una clase Dao y por ultimo una clase Library, empezando por el Pojo tenemos lo siguiente.

public class ObjetoPojo{

    // creamos la clase que servira de estructura para los valores que se envian y reciben

    // con su respectivo constructor

    private int clave = 0;

    private String valor = "N/A";

    public ObjetoPOJO(int clave, String valor){

        this.clave = clave;

        this.valor = valor;

    }

    public int getClave() {

        return clave;

    }



    public void setClave(int clave) {

        this.clave = clave;

    }



    public String getValor() {

        return valor;

    }



    public void setValor(String valor) {

        this.valor = valor;

    }

 

}

pasando a la clase Dao quedaria de la siguiente manera

 
public class conexionDao {
    // el metodo pasaNestedPrueba: cuenta con un parametro del tipo lista< ObjetoPOJO>

    public ListpasaNestedPrueba(List item) {
        /*
        * se crea una varible para el retorno
         */
        List adds = new ArrayList<>();
        try {
            /*
             * se crean los descriptores para la estructura y el arreglo que llevara la informacion a la tabla en base de datos y al final se prepara la llamada al procedimiento almacenado
             */ 
            conecta();
            StructDescriptor desc2 = StructDescriptor.createDescriptor("TABLA_STRUCT", conexion);
            ArrayDescriptor des = ArrayDescriptor.createDescriptor("TABLA_DATA", conexion);
            CallableStatement st = conexion.prepareCall("call schema.package.procedure( ? , ? )");

            /*
             * se necesita de un arreglo de objetos, en este caso lo creamos a la longitud de la lista que recibimos, al igual que el arreglo que posteriormente se pasara a la base
             */ 
            Object[] itemAtributes = new Object[item.size()];
            STRUCT itemObject = null;
            STRUCT[] idsArray = new STRUCT[item.size()];

            /*
             * recorremos la lista que pasa como parametro y llenamos instantáneamente el arreglo de tipo Objeto , para asignarlo a la estructura y agregarlo al arreglo final.
             */
            for (int i = 0; i < item.size(); i++) {
                itemAtributes = new Object[]{
                    item.get(i).getClave(),
                    item.get(i).getValor()
                };
                itemObject = new STRUCT(desc2, conexion, itemAtributes);
                idsArray[i] = itemObject;
            }

            /*
             * creamos un ARRAY del tipo oracle.sql.ARRAY pasandole el arreglo de objetos estructurados
             */
            ARRAY array_to_pass = new ARRAY(des, conexion, idsArray);

            /*
             * seteamos los parametros de la llamada
             */
            st.setArray(1, array_to_pass);
            st.registerOutParameter(2, OracleTypes.CURSOR);
            st.executeQuery();
            /*
             *     despues de haber ejecutado el comando en oracle recorremos el set de resultados y asignamos los valores otenidos en la variable retorno
             */
            ResultSet rs = (ResultSet) st.getObject(2);

            while (rs.next()) {
                ObjetoPOJO _consulta = new ObjetoPOJO();

                _consulta.setClave(rs.getInt("clave"));
                _consulta.setValor(rs.getString("valor"));

                adds.add(_consulta);
            }
            desconecta();

        } catch (SQLException e) {
            System.err.println("Exception in Method DAO: " + e);
        } finally {
            desconecta();
        }
        return adds;
    }
}


ahora vamos a la clase library

 
public class ConexionNestedLibrary {

    /*
     * este metodo asigna los valores a una lista que sera enviada al Dao
     * para su guardado en la base,
     * llenando 100 elementos y posteriormente recibidos 
     */
    public void estableseMatriz() {
        List lista = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            ObjetoPOJO _item = new ObjetoPOJO(i + 1, "Dato: " + i + " : con valor " + (i + 1));
            lista.add(_item);
        }
        ConexionNestedDAO cnd = new ConexionNestedDAO();

        List recibido = cnd.pasaNestedPrueba(lista);
        for (int i = 0; i < recibido.size(); i++) {
            System.out.println("Clavedel producto: " + recibido.get(i).getClave()
                    + " con valor: " + recibido.get(i).getValor());
        }
    }
}



Una vez finalizado el ejercicio no me queda mas que esperar sus comentarios, sean buenos o malos, aquí los espero... hasta pronto y buen día.


domingo, 12 de mayo de 2019

Creacion de alarma en java parte 3

Continuando con lo anterior...

La clase setAlarma se encargara de la construcción de una ventana en la se pueda seleccionar la hora, minuto y segundo de un respectivo dropdown.

Sin mas el codigo esta aquí.


---
import com.alarma.Principal;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;

public final class SetAlarma extends JFrame implements ActionListener {

    private JComboBox hora;
    private JComboBox minutos;
    private JComboBox segundos;
    Principal p;
    
    public SetAlarma(Principal p) {
        this.p = p;
        elements();
    }

    public void elements() {
        this.setTitle("Seteo de alarma");
        this.setSize(300, 100);
        this.setLayout(null);
        this.setResizable(false);
        this.setLocationRelativeTo(null);

        hora = new JComboBox();
        minutos = new JComboBox();
        segundos = new JComboBox();
        for (int i = 0; i < 24; i++) {
            if (i < 10) {
                hora.addItem("0" + i);
            } else {
                hora.addItem(i + "");
            }
        }
        for (int i = 0; i < 60; i++) {
            if (i < 10) {
                minutos.addItem("0" + i);
                segundos.addItem("0" + i);
            } else {
                minutos.addItem(i + "");
                segundos.addItem(i + "");
            }
        }
        hora.addActionListener(this);
        hora.setActionCommand("hora");
        minutos.addActionListener(this);
        minutos.setActionCommand("minuto");
        segundos.addActionListener(this);
        segundos.setActionCommand("segundo");
        if( p._hora>-1 ){
            String h = "";
            if( p._hora < 10 ){h = "0"+p._hora;}else{ h = p._hora + "";}
            hora.setSelectedItem(h);
        }
        if( p._minuto>-1 ){
            String m = "";
            if( p._minuto < 10 ){m = "0"+p._minuto;}else{ m = p._minuto + "";}
            minutos.setSelectedItem(m);
        }
        if( p._segundo>-1 ){
            String s = "";
            if( p._segundo < 10 ){s= "0"+p._segundo;}else{ s= p._segundo + "";}
            segundos.setSelectedItem(s);
        }
        hora.setBounds(5, 5, 50, 25);
        minutos.setBounds(60, 5, 50, 25);
        segundos.setBounds(115, 5, 50, 25);
        this.add(hora);
        this.add(minutos);
        this.add(segundos);

        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if( "hora".equals(e.getActionCommand() ) ){
            p._hora = Integer.parseInt( hora.getSelectedItem().toString() );
        }
        if( "minuto".equals(e.getActionCommand() ) ){
            p._minuto = Integer.parseInt( minutos.getSelectedItem().toString() );
        }
        if( "segundo".equals(e.getActionCommand() ) ){
            p._segundo = Integer.parseInt( segundos.getSelectedItem().toString() );
        }
    }

}

---

vallamos a la explicación

vamonos directo a la accion...
En la construccion de el cada uno de los elementos en esta ventana. creamos un ciclo para llenar dichos espacios, por ejemplo.  para la hora. creamos el ciclo que va de 0 a 23, para generar un horario extendido de 24 horas considerando las 12:00 pm como las 00:00 pm. con esto hay que espesificar que todo valor menor a 10 es necesario agregar un 0 al comienzo de la cadena. Por otro lado construimos otro ciclo, el cual ira del 0 al 59, para crear tanto los minutos como los segundos., de igual manera  los primeros numeros menores a 10 se les agrega un 0 al comienzo de la cadena.


Seguido de esto es necesrio validar si se tiene seteada una hora en particular para asi inicializar los componentes con un valor en espesifico.

Para finalizar se agregan los action listener a cada uno de estos componentes.

En el ActionEvent los distinguimos por el actionCommand que se agrego a cada uno... así al seleccionar un valor se setea el valor a cada correspondiente variable.

De esta manera quedan seteadas las variables correspondientes.


No te olvides de dejar tu comentario.

Si eres usuario de blogger. No te olvides de seguirme y asi poder finalizar esta aplicacion.

jueves, 9 de mayo de 2019

Creacion de alarma en Java Parte 2

En continuidad con lo anterior, veremos la creación de las operaciones en la cual aremos el seteo de las horas, minutos y segundos  junto con la fecha...

En este código lo que are sera en primera instancia el get de la hora del sistema para setear el label de la vista.

El código queda así.
---
public class Operations implements Runnable{
 Principal p;

 public Operations( Principal p ){
  this.p = p;
 }

 public void getHora(){
  run();
 }

 @Override
 public void run(){
   Calendar calen = Calendar.getInstance();
        long lastTime = System.nanoTime();
        double unprocessed = 0;
        double nsPerTick = 1000000000.0/60;
        int frames = 0;
        int ticks = 0;
        long lastTimer1 = System.currentTimeMillis();
        while( true ){
            long now = System.nanoTime();
            unprocessed += ( now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;
            while( unprocessed >= 1 ){
                ticks ++;
                unprocessed -= 1;
                shouldRender = true;
            }
            try{
                Thread.sleep( 2 );
            }catch( InterruptedException e ){
                System.err.println( e.getMessage() );
            }
            if( shouldRender ){
                frames ++;
                calen = Calendar.getInstance();
                p.lblReloj.setText( fechaActual(calen) );
    /*+ ":" +  calen.get(Calendar.MILLISECOND)*/
            }
            if( System.currentTimeMillis() - lastTimer1 > 1000 ){
                System.out.println( "Frames & ticks [ " + frames + "," + ticks + "]");
                lastTimer1 += 1000;
                frames = 0;
                ticks = 0;
            }
        }
 }
    public String fechaActual(Calendar calen ){
        String dia =  calen.get( Calendar.DAY_OF_MONTH ) +""; dia = ( Integer.parseInt( dia ) < 10 )? "0" + dia: dia;
        String mes =  calen.get( Calendar.MONTH ) +""; mes = ( Integer.parseInt( mes ) < 10 )? "0" + mes: mes;
        int hora_ = calen.get(Calendar.HOUR_OF_DAY );
        int minuto_ = calen.get( Calendar.MINUTE );
        int segundo_ = calen.get( Calendar.SECOND );
        String fecha = dias(calen.get( Calendar.DAY_OF_WEEK) ) + " " + 
            dia + " de " + 
            mesAn( Integer.parseInt( mes ) ) + " del " + 
            calen.get( Calendar.YEAR ) + " " +
            hora_ + ":" + minuto_+":" + segundo_ ;

        if( p.chkActive.isSelected() ){
            if( p._hora > -1 && p._minuto > -1 && p._segundo > -1 ){
                if ((hora_ == p._hora) && (minuto_ == p._minuto) && (segundo_ == p._segundo)) {
                    if (!p.estaSonando) {
                        new SoundClipTest();
                    }
                    p.estaSonando = true;
                }
            }
        }
        return fecha;
    }
    public String dias(int dia ){
        String[] semana = { "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo" };
        return semana[ dia ];
    }
    public String mesAn( int mes ){
        String[] mesAnio = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
        return mesAnio[ mes ];
    }
    class SoundClipTest extends JFrame implements ActionListener{
        JButton btnPause = new JButton("Pause");
        public SoundClipTest() {
                this.setTitle("Test Sound Clip");
                this.setSize(300, 200);
                this.setVisible(true);
                this.setLayout(null);
                
                btnPause.setBounds(5,5,100,25);
                btnPause.setActionCommand("pause");
                btnPause.addActionListener(this);
                this.add(btnPause);
                play();
        }
        public void play(){
            reproduce();
        }
        AudioClip s;
        public void reproduce(){
            
            try {
                File f = new File("a1.wav");
                if (f.exists()) {
                    System.out.println("validando que el archivo exista");
                }
                URL url = f.toURL();
                s = Applet.newAudioClip(url);
                s.play();
            } catch (MalformedURLException ex) {
                Logger.getLogger(Operations.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if( "pause".equals(e.getActionCommand())){
                s.stop();
                btnPause.setActionCommand( "play");
                btnPause.setText("Play");
            }
            if( "play".equals(e.getActionCommand())){
                s.play();
                btnPause.setActionCommand( "pause");
                btnPause.setText("Pause");
            }
            
        }
    }

}
---
Explicaciones...
Principal p;

 public Operations( Principal p ){
  this.p = p;
 }
Es necesario hacer una instancia de la clase principal, para poder acceder a sus
propiedaddes y sus elementos.
 public void getHora(){
  run();
 }

El método getHora() inicia el thread que estará seteando la hora cada segundo.


 @Override
 public void run(){
   Calendar calen = Calendar.getInstance();
        long lastTime = System.nanoTime();
        double unprocessed = 0;
        double nsPerTick = 1000000000.0/60;
        int frames = 0;
        int ticks = 0;
        long lastTimer1 = System.currentTimeMillis();
        while( true ){
            long now = System.nanoTime();
            unprocessed += ( now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;
            while( unprocessed >= 1 ){
                ticks ++;
                unprocessed -= 1;
                shouldRender = true;
            }
            try{
                Thread.sleep( 2 );
            }catch( InterruptedException e ){
                System.err.println( e.getMessage() );
            }
            if( shouldRender ){
                frames ++;
                calen = Calendar.getInstance();
                p.lblReloj.setText( fechaActual(calen) );
    /*+ ":" +  calen.get(Calendar.MILLISECOND)*/
            }
            if( System.currentTimeMillis() - lastTimer1 > 1000 ){
                System.out.println( "Frames & ticks [ " + frames + "," + ticks + "]");
                lastTimer1 += 1000;
                frames = 0;
                ticks = 0;
            }
        }
 }

El método run() se encarga de construir el thread y reproducirlo cada determinado tiempo...
para ello se ocupa el nanotiempo del sistema mostrando frames y ticks cada segundo.


Nota: Este método lo tengo agregado en un proyecto diferente ( un juego ) es por ello
que tiene las variables de frames y ticks.



    public String fechaActual(Calendar calen ){
        String dia =  calen.get( Calendar.DAY_OF_MONTH ) +""; dia = ( Integer.parseInt( dia ) < 10 )? "0" + dia: dia;
        String mes =  calen.get( Calendar.MONTH ) +""; mes = ( Integer.parseInt( mes ) < 10 )? "0" + mes: mes;
        int hora_ = calen.get(Calendar.HOUR_OF_DAY );
        int minuto_ = calen.get( Calendar.MINUTE );
        int segundo_ = calen.get( Calendar.SECOND );
        String fecha = dias(calen.get( Calendar.DAY_OF_WEEK) ) + " " + 
            dia + " de " + 
            mesAn( Integer.parseInt( mes ) ) + " del " + 
            calen.get( Calendar.YEAR ) + " " +
            hora_ + ":" + minuto_+":" + segundo_ ;

        if( p.chkActive.isSelected() ){
            if( p._hora > -1 && p._minuto > -1 && p._segundo > -1 ){
                if( ( hora_ == p._hora ) && (minuto_ == p._minuto) && (segundo_ == p._segundo) ){
                    System.out.println( "esta sonando" );
                    p.estaSonando = !true;
                }
            }
        }
        return fecha;
    }
El metodo fechaActual( calendar calen ) se encarga de extraer lo necesario para crear
el string que se mostrara en el label del reloj.

Nota: Por el momento es un string seteado manualmente mas adelante lo que are sera agregar un date Format



    public String dias(int dia ){
        String[] semana = { "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo" };
        return semana[ dia ];
    }
    public String mesAn( int mes ){
        String[] mesAnio = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };
        return mesAnio[ mes ];
    }

Por ultimo los metodos dias y mesAn se encargan de cambiar el dia y el mes de un entero a un string con su respectiva descripción...



Con esto finalizamos la clase Operations...

No te olvides de dejar tu comentario y seguirme para que de esta manera puedas recibir mis próximas publicaciones.


Hasta la próxima.