elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Filtro en J2ME
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Filtro en J2ME  (Leído 3,256 veces)
mgc

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Filtro en J2ME
« en: 26 Febrero 2015, 10:37 am »

Hola,
Tengo que buscar un cliente determinado en un RecordStore, y lo quiero hacer con un filtro así:

Código:
import javax.microedition.rms.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class ExampleSearch
{

private RecordStore recordstore = null;
private RecordEnumeration recordEnum= null;
private Filter filter = null;

// get the record store
public void getRecStore(){
recordstore= RecordStore.openRecordStore(“myRec”,true);
}
//
public boolean login(String userName,String password){
getRecStore();
filter = new Filter(userName+”#”+password); // create a filter on the search text
recordEnum= recordstore.enumerateRecords(filter, null, false);
if (recordEnum.numRecords() > 0)
{
return true;
}else{
return false;
}
}

}

Código:
/*
*    This class is used as a filter for this example which is exetnding the RecordFilter
*
*
*/
class Filter implements RecordFilter{
private String search = null;
private ByteArrayInputStream inputstream = null;
private DataInputStream datainputstream = null;
public Filter(String search)
{
this.search = search.toLowerCase();
}
public boolean matches(byte[] suspect)
{
String string = new String(suspect).toLowerCase();
if (string!= null && string.indexOf(search) != -1)
return true;
else
return false;
}
public void filterClose()
{
try
{
if (inputstream != null)
{
inputstream.close();
}
if (datainputstream != null)
{
datainputstream.close();
}
}
catch ( Exception error)
{
}
}
}

Lo que no se, es cómo llevarlo a cabo, porque si utilizo el método public boolean login(String userName,String password), me devuelve true, pero yo lo que quiero mostrar es el detalle de los datos del cliente.
¿Alguien me puede decir cómo hacerlo?

Gracias de antemano y un saludo.


En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Filtro en J2ME
« Respuesta #1 en: 26 Febrero 2015, 14:57 pm »

  • ¿Por cuál clase está representada tu entidad Cliente?
  • ¿Qué representa RecordStore?

Puedes usar una clase llamada Cliente que sea la abstracción de un cliente en la realidad. Ésto se llama entidad o clase de dominio. Los pasos serían:

1) Registrar un cliente como un Objeto Cliente:

Código
  1. Client someClient = new Client("nombre", "apellido", fechaNac, "dirección");
  2.  

2) En tu condición, buscas por el objeto cliente:

Código
  1. public Client login(String userName,String password){
  2.    getRecStore();
  3.    filter = new Filter(userName+”#”+password); // create a filter on the search text
  4.    recordEnum= recordstore.enumerateRecords(filter, null, false);
  5.    if (recordEnum.numRecords() > 0)
  6.    {
  7.        // buscas el cliente y si existe lo devuelves
  8.    }else{
  9.        // retorna null para indicar que no se han encontrando resultados
  10.    }
  11. }

No sé si será posible usar JPA con Java ME, sería muy útil en éstos casos, ya que buscarías un registro de la siguiente manera:

Código
  1. TypedQuery<Client> query = em.createQuery("SELECT * FROM Clients c WHERE c.username = :username");
  2. query.setParameter("username", clientUsername);
  3. Client client = query.getSingleResult(); // retorna el cliente buscado


Básicamente la idea es que hagas la consulta a la BBDD buscando por el usuario actual y lo devuelvas. Puedes hacer un método para ésto también:

Código
  1. public Client buildClientFromCredentials(String username, String password) {
  2. Client client = null;
  3. try(PreparedStatement ps = connection.prepareStatement
  4. ("SELECT * FROM clients WHERE username = ? AND password = ?") {
  5. ps.setString(1, username);
  6. ps.setString(2, password);
  7.  
  8. try(ResultSet rs = ps.executeQuery()) {
  9. while(rs.next()) {
  10. client = new Client();
  11. client.setId(rs.getInt("id"));
  12. client.setUsername(rs.getString("username"));
  13. client.setPassword(rs.getString("password"));
  14. }
  15. }
  16. } catch(SQLException ex) {
  17. logger.info("Error: "+ex.getMessage());
  18. throw new RuntimeException("Something was wromg, see the log for more details");
  19. }
  20. return client;
  21. }

Y desde tu método lo llamas:

Código
  1. public Client login(String userName,String password){
  2.    getRecStore();
  3.    filter = new Filter(userName+”#”+password); // create a filter on the search text
  4.    recordEnum= recordstore.enumerateRecords(filter, null, false);
  5.    if (recordEnum.numRecords() > 0)
  6.    {
  7.        return buildClientFromCredentials(username, password);
  8.    }else{
  9.        return null;
  10.    }
  11. }

Así retornas el todos los datos del cliente en un objeto para trabajar más fácil con él. Por su puesto, si estás trabajando con listas para simular BBDD, la metodología es la misma.

Salu2.


En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
mgc

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: Filtro en J2ME
« Respuesta #2 en: 26 Febrero 2015, 15:42 pm »

Te especifico algo más mi caso, porque yo las consultas no las hago a una base de datos, si no al propio RecordStore que es quien me almacena los registros.
Cada registro del RecordStore, será un cliente con su nombre y password.
Los clientes los muestro en una lista por su nombre, y seleccionándolos puedo ver el detalle (nombre y contraseña).
El constructor de la clase sería:
Código:
public bdClientes(String nombre){
        super(nombre,List.IMPLICIT);
    }

Cada registro tendrá será un String de esta forma nombre:password
El método que muestra la lista por pantalla sería este:
Código:
public void listarClientes(){
        //super.deleteAll();
        try {
            almacen= RecordStore.openRecordStore("Clientes", true);
            enumeracion=almacen.enumerateRecords(null, null, true);
            int numRegistros=0;
            
            //recorremos los registros con el enumerador
            while(enumeracion.hasNextElement()){
               // int id=enumeracion.nextRecordId();
                String registro=new String(enumeracion.nextRecord());
                numRegistros++;

                int separador=registro.indexOf(":");

                String nombre=registro.substring(0, separador);

                String password=registro.substring(separador+1);

                super.append(nombre, null);
            }
          
            //cerramos el almacen de registros
            almacen.closeRecordStore();
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }

Lo que quiero es mostrar los datos del Cliente seleccionado de esta lista.

El registro seleccionado de la lista sería este:
Código:
String registroLista=super.getString(super.getSelectedIndex());

Mi idea es buscar en el RecordStore el registro que coincide con registroLista.

Espero que esté claro al menos, mis intenciones. Mi problema es que no se llevar a cabo el Filter, en este caso.

Gracias y saludos.
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Filtro en J2ME
« Respuesta #3 en: 26 Febrero 2015, 16:45 pm »

No he tocado en mi vida Java ME :xD, pero por lógica viendo el código y lo que me has enseñado (gracias ^^), obtendría los detalles del cliente seleccionado así:

Código
  1. public String getClientDetails(String name) {
  2. try {
  3.            stock = RecordStore.openRecordStore("Clientes", true);
  4.            enumeracion=almacen.enumerateRecords(null, null, true);
  5.            int clients = 0;
  6.  
  7.            while(enumeracion.hasNextElement()){
  8.               // int id=enumeracion.nextRecordId();
  9.                String client =new String(enumeracion.nextRecord());
  10. String[] clientData = client.split(":");
  11. if(clientData[0].equals(name)) {
  12. return client;
  13. }
  14.                clients++;
  15.  
  16.            }
  17.  
  18.        } catch (RecordStoreException ex) {
  19.            ex.printStackTrace();
  20.        } finally {
  21.            almacen.closeRecordStore();
  22. }
  23.  
  24. }

Donde:

  • String[] clientData = client.split(":") -> Divide el texto obenido desde el enumerador por medio del separador ":". Es decir, que busca el separador ":" y parte el texto anterior al separador y posterior. Por lo que:

Si el cliente actual es por ejemplo: "Pepito:12345", el método split devuelve:

Código
  1. clientData[0] = "Pepito";
  2. clientData[1] = "12345";

  • Teniendo el nombre, lo comparo con el nombre proporcionado:
Código
  1. if(clientData[0].equals(name))

Si hay match es porque se ha encontrado al usuario y se devuelve al método encargado de mostrar los detalles.

NOTA: Siempre se debe cerrar las conexiones en el finally ya que, si ocurre alguna excepción nunca se cerrará la conexión. Todo lo que se coloca en el finally se ejecuta sí o sí.

Salu2.
« Última modificación: 26 Febrero 2015, 16:47 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
mgc

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: Filtro en J2ME
« Respuesta #4 en: 26 Febrero 2015, 17:02 pm »

¿Es posible que split no se pueda utilizar en j2me?
Te adjunto captura.



Muchas gracias, saludos.
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Filtro en J2ME
« Respuesta #5 en: 26 Febrero 2015, 17:17 pm »

Por lo visto JavaME no soporta el método split de String. Pero siempre podemos improvisar ;)

Código
  1. int separator = client.indexOf(":");
  2.    String username = client.substring(0,separator);
  3.    String password = client.substring(separator+1);
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
mgc

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: Filtro en J2ME
« Respuesta #6 en: 26 Febrero 2015, 17:26 pm »

Tras hacer los cambios este sería el código,
Utilizo un método para devolver el nombre y otro para devolver el password, que debo insertarlos en campos diferentes en el display.

¿Cómo lo ves?

Código:
    public String getClientPass(String name) throws RecordStoreException {
        String pass="";
        try {
            almacen = RecordStore.openRecordStore("Clientes", true);
            enumeracion = almacen.enumerateRecords(null, null, true);
            int clients = 0;

            while (enumeracion.hasNextElement()) {
                // int id=enumeracion.nextRecordId();
                String client = new String(enumeracion.nextRecord());
                int separator = client.indexOf(":");
                String username = client.substring(0, separator);
                String password = client.substring(separator + 1);
                //String[] clientData = client.split(":");
                if (username.equals(name)) {
                    // muestras los detalles del cliente
                    pass = password;
                }
                clients++;
            }

        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        } finally {
            almacen.closeRecordStore();
        }
        return pass;
    }
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Filtro en J2ME
« Respuesta #7 en: 26 Febrero 2015, 17:35 pm »

Eso ya depende de tu lógica de negocio ^^. Sólo una observación, sería más lógico inicializar pass en null, cosa que luego comparamos if(getClientPass(username) == null) para saber si se ha encontrado el cliente, en lugar de if(getClientPass(username).isEmpty()).

El resto, lo veo bien. Si fui de ayuda y resolviste tu problema, por favor marca el título del tema con un check verde. ¡Un saludo!
« Última modificación: 26 Febrero 2015, 17:51 pm por Gus Garsaky » En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
mgc

Desconectado Desconectado

Mensajes: 30


Ver Perfil
Re: Filtro en J2ME
« Respuesta #8 en: 26 Febrero 2015, 17:44 pm »

Muchas gracias por todo, yo creo que si está resuelto, ahora me queda ponerlo todo en su sitio y que funcione... Estoy iniciándome en esto, y todo me cuesta un mundo.

Saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Perdido en J2ME
Sugerencias y dudas sobre el Foro
yogo 2 2,730 Último mensaje 5 Febrero 2008, 23:21 pm
por yogo
Web Service y J2ME
Java
augusto_pr 0 2,698 Último mensaje 28 Diciembre 2008, 21:56 pm
por augusto_pr
Filtro SQL Injection y Filtro XSS
PHP
0x0309 6 6,788 Último mensaje 16 Octubre 2009, 08:22 am
por 0x0309
j2me autoenviable
Java
Foxwar 3 3,479 Último mensaje 10 Febrero 2010, 23:02 pm
por egyware
J2ME
Java
Nolohagan 0 1,563 Último mensaje 2 Abril 2017, 13:31 pm
por Nolohagan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines