Acceder a función java

Hola.
Tengo un problema a la hora de realizar una llamada a una función.
Es un proyecto con struts2 donde tengo distintos paquetes (modelo, negocio, persistencia... Etc) y dentro de ellos ficheros.java
Entonces desde 1 fichero del paquete "modelo" llamo a una funcion de un fichero que se encuentra en el paquete "negocio" del siguiente modo negocio.fichero.funcion(string1, string2, entero);
Desde el primer fichero le paso 3 arguentos al segundo (2 strings y 1 entero) que recibe el 2º y con estos datos se "trabaja" con los ficheros que se encuentran en la carpeta indicada en la linea "conflictiva".
Searcher searcher = new IndexSearcher(FSDirectory.getDirectory("C:\\carpeta"));
Esta línea me obliga a añadir 2 excepciones throws IOException, ParseException que no se si puede ser la causa de que no me funcione esto.
Os pongo el código por si sabéis que puede ser:
Función buscar en paquete modelo
public class Buscar {
public void llamaARecibo() {
    String cadenabuscar;
    String tipobusqueda;
    int numeropalabras;  
          try{    
           System.out.println("\n ANTES DE LLAMADA ");
          negocio.SearchIndex.recibo2(cadenabuscar, tipobusqueda, numeropalabras);        
              System.out.println("\n DESPUES LLAMADA " );
        }catch(Exception ex) {
           System.out.println("\n ex" + ex.toString() );
        }
  }    
}
FUNCION SEARCH EN PAQUETE NEGOCIO
public class Search {
public static void recibo2(String cadenabuscar, String tipobusqueda, int numeropalabras) throws CorruptIndexException, IOException {
System.out.println("\n RECIBOOOOOOOOOO 2222 cadenabuscar " + cadenabuscar + " tipobusqueda " + tipobusqueda + " numeropalabras " + numeropalabras);
 Searcher searcher = new IndexSearcher(FSDirectory.getDirectory("C:\\carpeta"));
// LA LINEA ANTERIOR ES LA Q FALLA !!!
}
}
Saludos

1 Respuesta

Respuesta
1
¿Cuál es realmente el problema?, ¿Te falla al compilar?, ¿Qué error es el que te manda?
Hola
El problema es que se queda "parado" puesto que no me muestra el 2º mensaje que sería System.out.println("\n DESPUES LLAMADA " );
Eso si, si comento la linea
Searcher searcher = new IndexSearcher(FSDirectory.getDirectory("C:\\carpeta"));
Salen los 2 mensajes...
Estoy sorprendido porque es simplemente una llamada a una función pero por alguna extraña razón cuando descomento esa linea no funciona...
GRACIAS por tu rápida respuesta.
Ok, entonces el primer system. Out si te lo muestra pero el segundo no, veo que estas "cachando" una excepción en esa parte del código, ¿te muestra el mensaje que esta dentro de la excepción?.
Ademas de esta linea en tu excepción: System. Out.println("\n ex" + ex. toString() );, añade estas dos mas:
System.out.println(ex.getMessage());
ex.printStackTrace();
Por lo que puedo ver es que tu método recibo2 esta tirando una excepción, por lo que no ves el mensaje de "DESPUÉS LLAMADA", con estas dos lineas que añadas podemos ver cual es la excepción que esta tirando y de ahí detectar el error.
Cuando tengas la excepción si quieres mandame otro mensaje con al excepción y la revisamos.
Hola
Si lo que tenía que hacer que creo que si era dejar la parte de la excepción así
}catch(Exception ex) {
              System.out.println("\n ex" + ex.toString() );
                    System.out.println(ex.getMessage());
                    ex.printStackTrace();
          }
Me sigue saliendo solo el primer mensaje.
¿Podríamos "crear" el mensaje de la excepción dentro del método recibo2?
Como te imaginaras he probado miles de cosas antes de preguntar aquí en el foro porque me parece una cosa bastante sencilla la llamada entre funciones y que en el mismo programa lo hago bastantes veces pero en esta función no funciona...
GRACIAS por tus rápidas respuestas... aunque espero que demos con el problema y ahí te las volveré a dar.
Un saludo
¿No ves entonces ninguna mensaje con la descripción de la excepción?.
Otra cosa que veo es la forma en como llamas a negocio2:
negocio.SearchIndex.recibo2(cadenabuscar, tipobusqueda, numeropalabras);
Sin embargo el método recibo2 esta dentro de una clase llamada Search, en todo caso la llamada debería ser
negocio.Search.recibo2(cadenabuscar, tipobusqueda, numeropalabras);
Quizás hay algo que me estoy perdiendo, ¿podrías pegar las 2 clases completas por favor?
Porque en teoría después del mensaje "ANTES DE LLAMADA" deberías de ver "RECIBOOOOOOOOOO 2222"
Hola
Te pego los 2 ficheros simplificados:
principal.java en modelo
package modelo;
public class Principal {
public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("\n COMIENZO ");
        llamaSearchIndex();
    }
      public static void llamaSearchIndex() {
        try{
              String cadenabuscar = null;
              String tipobusqueda = null;
              int numeropalabras = 0;
              System.out.println("\n ANTES DE LLAMADA ");
          negocio.Buscar.recibo2(cadenabuscar, tipobusqueda, numeropalabras);
          System.out.println("\n DESPUES LLAMADA " );
        }catch(Exception ex) {
            System.out.println("\n ex" + ex.toString() );
                  System.out.println(ex.getMessage());
                  ex.printStackTrace();
        }
    }        
}
BUSCAR:JAVA   EN NEGOCIO
package negocio;
import java.io.IOException;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.store.FSDirectory;
public class Buscar {
    public static void  recibo2(String cadenabuscar, String tipobusqueda, int numeropalabras) throws CorruptIndexException, IOException {
        System.out.println("\n RECIBOOOOOOOOOO 2222 cadenabuscar " + cadenabuscar + " tipobusqueda " +  tipobusqueda + " numeropalabras " + numeropalabras);
        Searcher searcher = new IndexSearcher(FSDirectory.getDirectory("C:\\carpeta"));                            
    }
}
Es curioso que en Eclipse si ahora doy al fichero Principal ejecutar como Aplicación de Java me lo haga bien... pero si comento el main y hago una llamada a la función llamaSearchIndex() no me funcione...
¿Puede qué este mal la forma en que realizo la llamada?
Ya no estoy seguro ni de sacar un mensaje por pantalla... no se si me estoy ocecando o que...
Un saludo.
De hecho como mandas llamar la función esta bien, de hecho se confirma más cuando dices que si lo ejecutas como una aplicación java todo funciona bien, pero cuando lo haces como una web app ya no te funcione.
Con esto que comentas se puede descartar que haya algo mal en estas dos funciones o inclusive en la clase Searcher, lo que te recomiendo que hagas es que pongas un break point antes o en la llamada a recibo2 y verficiques el valor de todas las variables, quizás en algún lado dentro del workflow de la aplicación web se están perdiendo valores. Lo raro es que no estas recibiendo ninguna excepción. Con el breakpoint podrás saber un poco más donde es donde es donde la aplicación deja de funcionar, inclusive si hay una excepción no manejada la podrás ver ahí.
Hola
El problema es que ya hice debug, también metí los valores de cadenabuscar, tipobusqueda y numeropalabras dentro de la clase no fuera que no estuvieran llegando bien desde la "parte web" pero ni así...
La verdad es que no estoy muy seguro que es lo que puede estar pasando ya que he creado nuevos ficheros, funciones más simples incluso solo con un System y la línea conflictiva...
Por eso lancé la pregunta... lo raro es que si comento la linea
Searcher searcher = new IndexSearcher(FSDirectory.getDirectory("C:\\carpeta"));  funciona tanto como aplicación java y como aplicación web... que puede estar pasando con esa línea...la carpeta existe y tiene ficheros q probé a poner otro nombre y me dió error de q la carpeta no existía....
¿Alguna propuesta o prueba más que hacer?
GRACIAS porque la verdad es que es pa volverse loco...
Ya con todo lo que hemos descartado y con esto ultimo que comentas de que funciona todo bien quitando la parte del Searcher no queda más que el problema esta en esa clase, por lo que veo esa clase pertenece a la librería de apache lucene, no la he utilizado la verdad, pero leyendo el javadoc veo que sirve para indexar directorios.
Puedes probar con algo así:
Searcher searcher = new IndexSearcher("c:/carpeta");
Para ver si funciona.
Ahora recuerda una cosa en java los paths son mejor manejados con /, la \ es solo usada por windows y yo a veces he tenido incosistencias usándolo, por eso normalmente sustituyo las \ con /, aparte de que esto te permite usarlo más en otras plataformas como Linux.
Has la prueba cambiando la linea conflictiva con que puse anteriormente, si funciona bien, entonces el problema esta en FSDirectory.
Hola
Efectivamente esa clase es de la Librería de Lucene y la carpeta que indico es donde tiene los "ficheros Lucene" generados con un fichero indexador.
Para comprobar si estaba ahí el problema o podría ser un problema con dicha librería probé lo que me comentaste y probé cambiando las barras de sentido / y \
Searcher searcher = new IndexSearcher("c:/carpeta");
Y cuando ejecuto el principal.java como aplicación de JAVA funciona a la perfección pero cuando lo pruebo como aplicación web no funciona y se queda "parado" sin mostrar ninguna excepción.
Probé también esta otra forma pero tampoco...
    String path = "C:\\carpeta");
    IndexReader reader = IndexReader.open(path);
    Searcher searcher = new IndexSearcher(reader);
Esta claro que el problema está a la hora de llamar a la carpeta, la cual he comprobado una y mil veces que existe, he probado con otras carpetas existentes, con carpetas que contienen ficheros con extensión .txt por si estaba dando problemas el que los ficheros generados por Lucene que son extensiones más raras... pero nada de nada.
¿A qué se puede deber que como "Run on server" no me deje llamar a la carpeta y como "java application" si?
Cada día que pasa estoy más sorprendido.
GRACIAS una vez más por tus respuestas.
Un saludo
Pudiera ser que tu application server (¿Cuál estas usando tomcat?), te este bloqueando el acceso al sistema de archivos. Por lo general esto no pasa, pero si lucene en su interior utiliza algo del java security para evitar tirar excepciones de seguridad (como pudiera ser en el caso de los applets) entonces si se podría explicar el porque en una webapp se queda "parado" y como una aplicación standalone funciona perfectamente.
Intenta poner esos archivos dentro de tu root de la aplicación y referenciar este directorio con rutas relativas (/ficheros) al root de la aplicación y no con el full path.
Si esto funciona, entonces si va a ser cuestión de que cambies los privilegios de seguridad de tu webapp en el servidor.
¿Has notado si la aplicación se queda como "trabada" y ya nada funciona? ¿O si al contrario sigue respondiendo?, parece ser que el Searcher entra en un loop infinito y ahí se queda, si usas tomcat y tienes acceso al manager quizás pudieras notar un incremento del uso de memoria y después de un rato hasta quizás una excepción de out of memory.
Hola.
Perdón por tardar en contestar algo más de lo que tardas tu pero es que me parece tan increíble que no funcione que no paro de probar cosas, meterlo en otras carpetas, mirar lo que me dices tu, probarlo en otros PC pero por ahora nada de nada.
Estoy usando el Tomcat 5.5 desde eclipse.
Lo que me dices que quizás me este bloqueando el sistema de archivos quizás pueda ser pero no al 100% porque si en vez de poner la ruta C:\\carpeta  pongo C:\\carpetainexistente  me genera una carpeta llamada carpetainexistente en C: aunque luego el programa se queda como cuando la carpeta si que existe como en pause... otra cosa que he probado a través de esta idea que me diste fue la de crear un fichero.txt sustituyendo la línea de llamada a la carpeta por la creación de un fichero y se realizó de forma correcta por lo que quizás esté bloqueando el sistema de archivos de acceso a carpetas pero no la creación de las mismas o de ficheros... pero lo del cómo acceder ahí si que no sé como se podría arreglar.
¿Cómo puedo saber si lucene en su interior utiliza algo del java security para evitar tirar excepciones de seguridad? No se donde se podría mirar eso...
Lo raro es que he buscado "searcher lucene" o cosas similares en google y todo los ejemplos, minimanuales y tal que he encontrado dicen que la forma de acceder a la carpeta es la que usaba inicialmente pero que no funciona que es esta linea:
Searcher searcher = new IndexSearcher(FSDirectory.getDirectory(path));   asique ahí ya si que me quedé más confundido aún de lo que estoy.
Cuando me pusiste esto Intenta poner esos archivos dentro de tu root de la aplicación y referenciar este directorio con rutas relativas (/ficheros) al root de la aplicación y no con el full path. ¿Entendí qué querías que pusiera la carpeta de lazarillo en la carpeta ROOT de dentro del Tomcat no? entonces la llamada a la ruta la hice asi    String path="..\\ROOT\\carpeta";    como eso no me funciono lo copie en distintas carpetas de web-inf, WebContent, en la del proyecto xo nada de nada...
Estuve mirando el manager del Tomcat y advirtiéndote que no me enteraba de mucho como iba aquello ya que era la 1ª vez que llegaba hasta ahí tras ejecutarlo y tal no vi cosas raras... pero si las hubo quizás no las supe ver.
Pues no se que más decirta salvo que GRACIAS otra vez, que sigo probando múltiples cosas pero que no consigo acceder a la carpeta...¿alguna propuesta más?
Un saludo y GRACIAS !
Pues si que esta bastante raro lo que esta pasando, he estado leyendo un poco la documentación de Lucene, y por lo que veo tu código aparentenmente esta bien, dos cosas, la primera el sitio de Lucene trae una webapp de demo, ¿la has probado?, en caso de que no, descárgala y pruébalas a ver si te funciona bien. La segunda, ¿seria posible que me pasaras tu código para revisarlo?, me lo puedes mandar a [email protected].
Al final como suele pasar los errores "imposibles" son por los fallos más simples.
Resulta que había añadido la librería al proyecto pero no debí copiar la librería a la carpeta lib del WEB-INF asique una vez añadida ha empezado todo a funcionar de manera correcta.
Lo raro es que no saliera ningún error pero una vez solucionado eso ya es lo de menos.
MUCHAS GRACIAS por tu ayuda.
1 saludo !

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas