cancel
Showing results for 
Search instead for 
Did you mean: 

Action Java con acceso al documento

showbiz
Champ on-the-rise
Champ on-the-rise
Hola a tod@s.

Estoy intentando realizar una Integración de una librería que realiza tareas de firma digital con documentos con Alfresco. Soy nuevo en Alfresco y por lo poco que he visto he pensado que podía hacer esto:
1- declarar un 'action' y añadirlo al grupo de acciones que actuan sobre documentos (document_browse_menu)
2- hacer que este action llamará a un codigo Java que hiciera las llamadas pertinentes a la librería

El paso 1 lo he conseguido modificando el fichero web-client-config-custom.xml, añadiendo estas entradas:

   <config>
      <actions>
         <!– Launch Add Aspect Dialog –>
         <action id="custodia">
            <label>Custodia</label>
            <image>/images/icons/add.gif</image>           
            <tooltip>Envia el documento a custodia</tooltip>
         </action>
           
         <!– Add action to more actions menu for each space –>
         <action-group id="document_browse_menu">
            <action idref="add_aspect" />
         </action-group>
        
      </actions>
   </config>

Una vez realizada esta modificación, he comprobado que aparece una nueva opción en el menu contextual de un documento.

Para el paso dos he visto en el API de Alfresco que existe la clase 'TransformActionExecuter' , implementando una clase que herede de está tendre acceso al documento e incluso modificarlo.

El problema es que no se como modificar la declaración de action del paso1 para llamar a mi clase, he visto que existe el tag <action> y <action-listener>, pero no me permite llamar a mi clase, solo veo que puedo llamar a scripts y a dialogs.

¿Alguien podría decirme como llamar a mi clase Java desde el action declarado?

Muchas Gracias.
26 REPLIES 26

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
Buenas,

Para hacer que la acción personalizada este disponible debemos declarar como un bean de Spring. Para ello crearemos un fichero en alfresco/extension siguiendo la nomenclatura que definimos para las extensiones de ficheros de configuración de Spring, por ejemplo add-aspect-action-context.xml, y añadiremos la definición:

# Accion personalizada para añadir aspecto
  
   <bean id="tag" class="org.alfresco.sample.TagActionExecuter" parent="action-executer">
      <property name="nodeService">
         <ref bean="nodeService" />
      </property>
   </bean>

Saludos

dacedos
Champ in-the-making
Champ in-the-making
Hola!

Para poder llamar a una clase java tienes que declarar un bean en el faces-config-custom.xml

Por ejemplo algo como:

    <managed-bean>
      <description>Mi Bean para firmar</description>
      <managed-bean-name>Firmar</managed-bean-name>
      <managed-bean-class>org.alfresco.firmar.Firmar</managed-bean-class>
      <managed-bean-scope>session</managed-bean-scope>
   </managed-bean>

luego el action listener de tu action podria ser:
<action-listener>#{Firmar.firmar}</action-listener>

en el Firmar.firmar, el Firmar primero es el nombre del bean y el segundo es el nombre del metodo en la clase java.

Y solo por curiosidad… ¿Que libreria vas a utilizar y como tienes en mente hacerlo?

showbiz
Champ on-the-rise
Champ on-the-rise
Hola,

Muchas gracias a los dos por las respuestas.

En cuanto a la propuesta de Pedro, la he probado, pero sigo sin saber como llamar desde el action-listener.

Tambien he probado la propuesta de ''dacedos". Para comenzar he creado un clase simple en Java con un metodo sin parámetros que lanza un traza (System.out.println), pero al invocarlo me pide que el metodo reciba un evento como parámetro:

javax.faces.el.EvaluationException: Exception while invoking expression #{Modulo.traza}
caused by:
java.lang.NoSuchMethodException: es.sia.alfresco.action.executer.SimpleClass.traza(javax.faces.event.ActionEvent)

¿Es necesario que los metodos reciban ese parámetro?  ¿La clase debe heredar de de alguna clase o implementar algún interfaz?

Más adelante necesitaré pasar parámetros, he visto que se pueden definir los parámetros en la definición del action:

<params>
         <param name="id">#{actionContext.id}</param>
      </params>

Más concretamente necesitaré tener acceso al documento en cuestión, por eso mi intención de utilizar la clase
TransformActionExecuter
  cuyo metodo
doTransform
tiene acceso al documento. Pero, ¿hay alguna forma de que la clase tenga acceso al documento  mediante la definición de parámetros en el elemento action?

Para satisfacer tu curiosad, te puedo decir que en realidad no voy a llamar a una librería, mi empresa tiene un producto que ofrece servicios relacionados con firma digital: firma, custodia,…,etc y buscamos una forma de integrar el producto con Alfresco.

Muchas gracias otra vez.

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
Creo debes hacer uso de "Action Executer" contiene la implementación de la acción. Es donde debemos poner el código que va a hacer el trabajo. Un Action Executer debe implementar la interfaz org.alfresco.repo.action.executer.ActionExecuter

Investiga por ahi.

http://wiki.alfresco.com/wiki/Custom_Actions

Saludos

showbiz
Champ on-the-rise
Champ on-the-rise
Tienes razón Pedro, la clase que realice la implementacion debe heredar de "Action Executer" y es donde voy a tener acceso al documento, en el link que me has pasado explica muy bien como crearla, pero mi problema sigue siendo como llamarla desde la declaración de action:


<config>
      <actions>
         <!– Launch Add Aspect Dialog –>
         <action id="custodia">
            <label>Custodia</label>
            <image>/images/icons/add.gif</image>           
            <tooltip>Envia el documento a custodia</tooltip>
         </action>
           
         <!– Add action to more actions menu for each space –>
         <action-group id="document_browse_menu">
            <action idref="add_aspect" />
         </action-group>
       
      </actions>
   </config>

Y en el link no hace referencia a nada de eso.

Muchas gracias

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
¿uhmmm no debes incluir custodia en?


<!– Add action to more actions menu for each space –>
         <action-group id="document_browse_menu">
            <action idref="add_aspect" />
           <action idref="custodia" />
         </action-group>

Por otro lado, entiendo que para  usar action-listener deberas incluir en dicha etiqueta el bean que has declarado para la accion de firmar no?
<config>
      <actions>
         <!– Launch Add Aspect Dialog –>
         <action id="custodia">
            <label>Custodia</label>
            <image>/images/icons/add.gif</image>          
            <action-listener>#{Firmar.firmar}</action-listener>
            <tooltip>Envia el documento a custodia</tooltip>
         </action>
          
         <!– Add action to more actions menu for each space –>
         <action-group id="document_browse_menu">
            <action idref="add_aspect" />
         </action-group>
      
      </actions>
   </config>


Saludos

showbiz
Champ on-the-rise
Champ on-the-rise
Puede que me haya equivocado al incluir el código, perdón si te ha creado confusión.

Si tengo añadida mi action al grupo:

   <config>
      <actions>
         <action id="custodia">
            <label>Custodia</label>
            <image>/images/icons/add.gif</image>           
            <tooltip>Envia el documento a custodia</tooltip>
         </action>           
         <!– Add action to more actions menu for each space –>
         <action-group id="document_browse_menu">
            <action idref="custodia" />
         </action-group>        
      </actions>
   </config>

Por otro lado tengo definido un bean con mi Action dentro del fichero custodia-action.context.xml como tu me indicaste:


<beans>
<!–Custodia Action Bean –>
   <bean id="custodia"
         class="es.sia.alfresco.action.executer.CustodiaActionExecuter"
         parent="actionexecuter">
      <property name="nodeService">
         <ref bean="NodeService" />
      </property>
   </bean>
   <bean id="extension.actionResourceBundles" parent="actionResourceBundles">
      <property name="resourceBundles">
         <list>
            <value>alfresco.extension.custodiaactionmessages</value>
         </list>
      </property>
   </bean>
</beans>

Pero me falta modificar la declaración del action para que llame a este bean a traves del tag  action-listener y no tengo claro como debe ser esa sintaxis o si tengo que poner el nombre del método.

Muchas gracias por tu interés.

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
oki, pero no has incluido esto o el equivalente no??
<action-listener>#{Firmar.firmar}</action-listener>

Es decir la llamada al metodo del bean que has declarado. Con esto y sino necesita parametros deberia funcionar.

Saludos

showbiz
Champ on-the-rise
Champ on-the-rise
Sí, he hecho unas cuentas pruebas definiendo el tag <action-listener>,  por ejemplo:

<action-listener>#{custodia.executeImpl}</action-listener>

Y me ha mostrado el siguiente error:

javax.faces.el.EvaluationException: Exception while invoking expression #{custodia.executeImpl}
caused by:
javax.faces.el.PropertyNotFoundException: Base is null: custodia

el problema que veo que es la sintaxis:

#{Firmar.firmar}

parece propia de acciones de Java Server Faces y puede que los actions de tipo "Action Executer" no se llamen igual, (por eso hablo de que desconozco la sintaxis de la llamada o no se si hay que poner el nombre del metodo por que las 'Action Executer'  deben implementar el metodo 'executeImpl')

Seguire peleando con ello.

Muchas gracias.
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.