AnsweredAssumed Answered

Problema con busquedas --RESUELTO--

Question asked by osksp on Jul 22, 2009
Latest reply on Jul 23, 2009 by osksp
Hola, saludos al foro.

Antes de nada, he estado buscando información y otros posts en el foro (también en el wiki y en el foro en ingles), y no he encontrado solución, por eso he decidido colgar este tema.

Os planteo un problema que estoy teniendo. He creado una accion con el objetivo de buscar un documento a partir de las propiedades del otro. Para ello, he creado una clase a partir de un ejemplo que viene explicado en el Developer Guide (pagina 96). Esta clase realiza una busqueda en el repositorio y me devuelve la id del documento que busco.

La cuestión es que la clase funciona, pero cuando la implemento en la accion que he creado, "deja de funcionar" por decirlo de alguna manera, me explico:

1.- Arranco Alfresco.
2.- Desde Eclipse, ejecuto la clase como una aplicación Java (con su main) y funciona perfectamente, busca en el repositorio y todo OK.
3.- Desde Alfresco llamo a la acción que he creado, la cual tiene una instancia de la clase que busca, y una llamada al método de búsqueda, a grandes rasgos:

    FirmaQuery fq = new FirmaQuery();
    fq.getIdNode(nombre_del_archivo);

El problema es que al hacerlo de esa manera, la búsqueda no devuelve ningún resultado. ¿Sabría alguien decirme por qué puede ser? A continuación pego el código de ambas clases, por si veis algun fallo (que no dudo que los haya jeje).

Esta es la parte de código de la clase de búsqueda que realiza la búsqueda:

public String getIdNode(String valor){
       String queryString;
       
       try{
                 queryString = "@cm\\:name:"+'"'+valor+'"';
                 AuthenticationUtils.startSession(getUser(),getPassword());

          List<ContentResult> resultados = getQueryResults(queryString);
          
          if(resultados.size()==0)return "Sin resultados";
          
          else return resultados.get(0).id;
       }
       catch (Exception serviceException) {
          System.out.println("Traza error: "+serviceException.getMessage());
          throw new RuntimeException("Unable to perform search."+serviceException.getMessage(), serviceException);
       } finally {           
          // End the session
          AuthenticationUtils.endSession();
       }
}

El método getQueryResults, que como comentaba, lo cogi del libro:

public List<ContentResult> getQueryResults(String queryString) throws Exception {
       System.out.println("Query:" + queryString);
        List<ContentResult> results = new ArrayList<ContentResult>();
        Query query = new Query(Constants.QUERY_LANG_LUCENE, queryString );
        QueryResult queryResult = getRepositoryService().query(getStoreRef(), query, false);
             
        ResultSet resultSet = queryResult.getResultSet();
        ResultSetRow[] rows = resultSet.getRows();
               
        if (rows != null) {
            // Get the infomation from the result set
            for(ResultSetRow row : rows) {
                String nodeId = row.getNode().getId();
                ContentResult contentResult = new ContentResult(nodeId);
           
                // iterate through the columns of the result set to extract specific named values
                for (NamedValue namedValue : row.getColumns()) {
                    if (namedValue.getName().endsWith(Constants.PROP_CREATED) == true) {
                        contentResult.setCreateDate(namedValue.getValue());
                    } else if (namedValue.getName().endsWith(Constants.PROP_NAME) == true) {
                        contentResult.setName(namedValue.getValue());
                    }
                }

                // Use the content service to figure out the URL
                Content[] readResult = WebServiceFactory.getContentService().read(new Predicate(new Reference[]{new Reference(storeRef, nodeId, null)}, storeRef, null), Constants.PROP_CONTENT);
                Content content = readResult[0];
                contentResult.setUrl(content.getUrl());
                // note: append "?ticket=" + AuthenticationUtils.getCurrentTicket() call results
                // to the url to avoid another login
                 results.add(contentResult);
            } //next row
        } // end if
       return results;
}

Su método main, con el que realizo las pruebas, el nombre del archivo que le indico, existe:

public static void main(String[] args) throws Exception {
       FirmaQuery scdq = new FirmaQuery("admin","admin","");
       System.out.println(scdq.getIdNode("Reunion_de_pleno_del_20090720.pdf"));
}

Y esta es la llamada desde la acción:

//Con esto termino una autenticacion que habia realizado anteriormente, lo pongo por si es importante
AuthenticationUtils.endSession();
      
FirmaQuery fq = new FirmaQuery("admin","admin",""); //Esta es la creacion de la clase de busqueda, le paso el username y password para autenticarse
System.out.println(fq.getIdNode(nombrevideo)); //Y aqui le pido que busque el fichero con este nombre

Como os comentaba, cuando utilizo la clase de busqueda con su metodo main, me devuelve un id, cuando lo hago desde la otra clase, me devuelve 'Sin resultados'.

¿Alguna idea?.

Gracias por adelantado!

Oscar Salguero.

Outcomes