cancel
Showing results for 
Search instead for 
Did you mean: 

Problema con busquedas --RESUELTO--

osksp
Champ in-the-making
Champ in-the-making
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.
9 REPLIES 9

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
Buenas,

Porque no pones mas traza en la clase de forma que se pueda ver cuando la llamas desde una accion los valores mas significativos, asi quizas se pueda detectar mas facil el error.

Saludos

osksp
Champ in-the-making
Champ in-the-making
Hola, primero muchas gracias por responder.

¿A que te refieres con los valores mas significativos? Quiero decir, no llevo demasiado tiempo programando con alfresco y no se exactamente a que valores te refieres…

Gracias!

Oscar.

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
El contenido del queryString seria interesarlo verlo antes de ejecutar la consulta.

Saludos

osksp
Champ in-the-making
Champ in-the-making
Buenas.

A ver, el contenido del query es este:

@cm\:name:"Reunion_de_pleno_del_20090720.mpg"

Cuando lo ejecuto desde Eclipse, si que encuentra el documento, pero cuando lo ejecuto desde Alfresco, llamando a la acción que a su vez llama a la búsqueda, no lo encuentra.

Además he observado algo curioso que no se por qué es:

Cuando realizo la búsqueda desde Alfresco, y no encuentra el documento, trato de hacerlo desde Eclipse (inmediatamente) y tampoco lo encuentra, pero si dejo que pase un poco de tiempo, unos 15 segundos aproximadamente, y vuelvo a realizar la búsqueda desde Eclipse, vuelve a encontrar el documento sin problema.

Esto me ha hecho pensar que posiblemente la búsqueda que se realiza llamando a la acción desde Alfresco, no funcione por algún problema de indexación/sincronización del repositorio, o algo similar, pero se me escapa a mis conocimientos actuales de Alfresco. ¿Puede ser por esto? ¿Alguna idea de como arreglarlo o como hacer que funcione la búsqueda?

Gracias!

Oscar Salguero.

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
pero cuando lo ejecuto desde Alfresco, llamando a la acción que a su vez llama a la búsqueda, no lo encuentra.

Como tienes definida dicha accion??

Es mas, si usas el buscador de alfresco para buscar el documento, lo encuentras ¿no?

Saludos

osksp
Champ in-the-making
Champ in-the-making
La accion la tengo definida en el web-client-custom-config.xml:

<action id="procesar_descriptor">
   <label-id>procesarDescriptor</label-id>
   <image>/ambiser/images/icons/firma.gif</image>
   <action-listener>#{WebSettingsBean.procesar}</action-listener>
   <evaluator>com.ambiser.web.action.evaluator.ProcesarDescriptorEvaluator</evaluator>
   <params>
      <param name="id">#{actionContext.id}</param>
   </params>
</action>

y en el faces-config-custom.xml:

<managed-bean>
   <description>The bean that manages AMB Video</description>
   <managed-bean-name>WebSettingsBean</managed-bean-name>
   <managed-bean-class>com.ambiser.web.bean.WebSettingsBean</managed-bean-class>
   <managed-bean-scope>session</managed-bean-scope>
   <managed-property>
      <property-name>browseBean</property-name>
      <value>#{BrowseBean}</value>
   </managed-property>
</managed-bean>

Y desde el método procesar, que es el que se ejecuta, llamo a la clase de búsqueda de esta manera:

FirmaQuery fq = new FirmaQuery();
fq.getIdNode(valor) //Con esto debe devolverme el id del nodo que busco.

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
Por cierto,

HAS definido el fichero 'procesardescriptor-action-context.xml'  en la ruta ''tomcat>/shared/classes/alfresco/extension/

¿Como le pasas el parametro a la accion? En fin pistas que nos den algo de luz.

Saludos

osksp
Champ in-the-making
Champ in-the-making
Hola. Pues a ver porque me estoy liando un poco jeje, y creo que debo tener algun error bastante gordo.

Lo que yo tengo definido no es una action como tal, si no una UIAction (o por lo menos asi lo llaman en el DeveloperGuide). Esto es, a traves del faces-config-custom.xml señalo un bean, en este caso WebSettingsBean, el cual tiene un metodo llamado procesar. Este metodo lo asocio a una llamada, mediante el web-client-config-custom.xml, para ejecutarlo (en mi caso) al pulsar un botoncito que aparece debajo del documento.

No tengo nada definido en mi archivo action-context.xml, mas que nada porque no le paso ningún parámetro más que el que le señalo en el faces-config-custom.xml, en este caso el BrowseBean porque lo uso para mostrar mensajes de error/informacion. ¿Deberia pasarle algún parámetro a través de este archivo? ¿Me falta algo? Es que estoy mirando en el libro y ando un poco perdido…

Te agradeceria cualquier orientación, muchas gracias.

Oscar Salguero.

osksp
Champ in-the-making
Champ in-the-making
Bueno, lo he resuelto!! Jeje, o por lo menos he visto que es lo que estaba haciendo mal, lo cuento por si a alguien mas le pasa:

Veamos, la busqueda que yo realizaba, lo hacía con la siguiente llamada:

QueryResult queryResult = getRepositoryService().query(getStoreRef(), query, false);

donde getRepositoryService(), me devolvia: WebServiceFactory.getRepositoryService();

es decir, instruccion completa:

QueryResult queryResult = WebServiceFactory.getRepositoryService().query(getStoreRef(), query, false);
ResultSet resultSet = queryResult.getResultSet();

Bueno, pues el error estaba en esa manera de realizar la búsqueda. NO SE decir por qué, pero de esa manera digamos que el bean no entraba en el repositorio, asi que lo he cambiado por:

ResultSet rs = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getSearchService().query(ref, Constants.QUERY_LANG_LUCENE,queryString);

que por lo que entiendo, recoge el searchService del entorno actual.

Ya os digo, no se por qué ocurre aunque me imagino que la manera en que lo hacía la primera vez era por decirlo de alguna manera "desde fuera", y por eso no funcionaba.

Si alguien mas entendido quiere comentarlo y explicar a qué se debe, me interesa mucho saberlo.

Gracias pjcaracuel, tanto por el interés como por la ayuda.

Saludos, Oscar Salguero.

P.D. Seguro que a muchos os parece un error bastante tonto, espero que entendais mi posicion de novato jeje.