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,

Lo uso para enviar notificaciones de correo a los usuarios de forma que al pinchar sobre el enlace, les muestre solo en contenido del documento, sin mas.

No te parece buena idea lo del uso del FileFolderService?

Saludos

showbiz
Champ on-the-rise
Champ on-the-rise
Gracias Pedro,

al final he podido acceder al documento a traves del interfaz FileFolderService como tu indicabas, lo que pasa es que he tardado en averiguar como obtener la referencia.

A continuación listo el codigo y los xml necesarios por si a alguien le sirve de referencia.

Muchísimas gracias por tu ayuda.

Pasos para crear un Action que genera una copia local de un documento

1- Declarar la configuracion de un action en el fichero web-client-config-custom.xml y añadirla a los posibles
acciones que se pueden lanzar desde un documento

   <config>
      <actions>
         <action id="copia">
            <label>Copia</label>
            <image>/images/icons/add.gif</image>           
            <tooltip>Crea una copia local del documento</tooltip>
            <action-listener>#{copia.crearCopiaLocal}</action-listener>
       <params>
                <param name="id">#{actionContext.id}</param>         
          <param name="name">#{actionContext.properties['cm:name']}</param>
          <param name="url">#{actionContext.properties['cm:url']}</param>
          <param name="nodeRef">#{actionContext.nodeRef}</param>          
                 </params>
           
         </action>
           
         <!– Add action to more actions menu for each space –>
         <action-group id="document_browse_menu">
            <action idref="custodia" />
         </action-group>
        
      </actions>
   </config>

2- Declarar un bean para identificar la accion con sus fuentes. Crear el fichero copia-action-context.xml y ubicarlo
en el directorio extension de la instalación de Alfresco


<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
   <bean id="copia"
         class="es.alfresco.action.executer.CopiaActionExecuter"
         parent="action-executer">
      <property name="nodeService">
         <ref bean="NodeService" />
      </property>
      <property name="fileFolderService">
         <ref bean="FileFolderService" />
      </property>     
   </bean>   
   <bean id="extension.actionResourceBundles" parent="actionResourceBundles">
      <property name="resourceBundles">
         <list>
            <value>alfresco.extension.custodiaactionmessages</value>
         </list>
      </property>
   </bean>
</beans>

3- Codigo Java del action que accede al documento y genera una copia local


public class es.alfresco.action.executer.CopiaActionExecuter extends ActionExecuterAbstractBase{
   


   /**   
    * Referencia al interfaz que tiene acceso a los nodos de Alfresco.
    * Para tener este referencia es necesario declarar un parametro
    * con el mismo nombre en la declaracion del bean de la accion
    */
   private NodeService nodeService;
  
   /**   
    * Referencia al interfaz que tiene acceso a los ficheros(contenidos)
    * y a los directorios(spaces) de alfresco.
    * Para tener este referencia es necesario declarar un parametro
    * con el mismo nombre en la declaracion del bean de la accion
    */  
   private FileFolderService fileFolderService;

      
   /**
    * Constructor de la clase    
    */
   public CustodiaSIAVALActionExecuter(){
      super();      
   }
    
   /**
    * Obtiene referencia al Node Service
    * @return referencia al NodeService
    */
   public NodeService getNodeService() {
      return nodeService;
   }  
   /**
    * Da valor a la referencia al nodeService de la clase.
    * Este metodo se lanza por el hecho de tener definido
    * el parametro nodeService en la declaracion del bean de la accion
    * @param nodeService referencia al nodeService
    */   
   public void setNodeService(NodeService nodeService){
       this.nodeService = nodeService;       
   }
  
   /**
    * Da valor a la referencia al fileFolderService de la clase.
    * Este metodo se lanza por el hecho de tener definido
    * el parametro fileFolderService en la declaracion del bean de la accion
    * @param fileFolderService referencia al fileFolderService
    */
   public void setFileFolderService(FileFolderService fileFolderService){
       this.fileFolderService = fileFolderService;
   }
   

  
   /**
    * Crea una copìa local del documento que lanza el evento en la unidad C. El nombre de la copia
    * siuue el siguiente patron: "Copia_<nombre_doc_original>.<ext_doc_original>"
    * @param e referencia al evento que lanza la accion
    */
   public void crearCopiaLocal(ActionEvent e){
      try {
         // obtengo los parámetros recibidos
         UIActionLink link = (UIActionLink)e.getComponent();      
         Map params = link.getParameterMap();         
         // obtengo instancia del noderef
         String nodeRefStr = (String) params.get("nodeRef");      
         NodeRef nodeRef = new NodeRef(nodeRefStr);         
         if (fileFolderService==null){
            // otra forma de obtener el filefolderservice
            fileFolderService = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getFileFolderService();
         }
         if (fileFolderService!=null){
            // obtengo el reader a partir del filefolderservice
            ContentReader reader = fileFolderService.getReader(nodeRef);
            InputStream is =  reader.getContentInputStream();
            // obtengo el nombre que le pondremos a la copia
            String nombreCopia = getNombreCopia(nodeRef);
            // creo un outputstream, ubicare el fichero en la unidad C:
            OutputStream os = new FileOutputStream(new File("c:\\"+nombreCopia));
            byte[] bytes = new byte[4096];
            int len; 
            // copio el fichero en  bloques de 4k
            while ((len = is.read(bytes)) >= 0) {    
               os.write(bytes, 0, len);    
            } 
            os.close();
            System.out.println("fin de la copia");
         }else{
            System.out.println("el FileFolder es null");
         }
      } catch (ContentIOException e1) {
         e1.printStackTrace();
      } catch (FileNotFoundException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
     
   }
  
   private String getNombreCopia(NodeRef nodeRef){
      Map propiedades = nodeService.getProperties(nodeRef);
      QName qName = QName.createQName("{http://www.alfresco.org/model/content/1.0}name");
      String nombre = (String)propiedades.get(qName);
      int indicePunto = nombre.indexOf(".");
      String nombreSinExt = nombre.substring(0,indicePunto);
      String nombreCopia = "Copia_" + nombreSinExt +"." + nombre.substring(indicePunto+1);
      return nombreCopia;
   }
  
   protected void executeImpl(Action arg0, NodeRef arg1) {
   }

   protected void addParameterDefinitions(List arg0) {
   }
  
}

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
Gracias a ti por la aportacion, muy util.

Saludos

cybermakoki
Champ in-the-making
Champ in-the-making
Hola!

Me gustaria retomar este tema porque yo estoy intentando hacer algo parecido y me he encontrado con un problema…

Quiero hacer lo mismo pero con la acción de enviar un email, el problema que tengo es que necesito ejecutar el handler que muestra la jsp, y no tengo forma de meter ese handler en la acción de menú… alguna idea?

yiyocomas
Champ in-the-making
Champ in-the-making
Hola.

  Nesesitas crear una accion para llamar tu Jsp. :?:
  soy nuevo en esto, pero he logrado realizar una pequña aplicacion dentro de alfresco.


1-   configura el bean (Si es que vas ocupar una clase);
 
  2-   debes crear una Accion ( sigue los post antriores);

  

                        <action id="mi_accion">
          <label-id>miaccion</label-id>
         <image>/image/icons/miaccion.gif</image>
         <action>dialog:miaction</action> <!– esta es la parte importante ya que llamara un dialogo–>
         </action>
 
 

3- luego agregas la accion en un grupo.



     <action-group id="browse_actions_menu">
         
         <action idref="mi_accion"/><!– aca agregaras el link de la accion.–>
    
             </action-group>

     

4- debes crear un dialogo.
 
                       <dialog name="miaccion" page="/jsp/extension/miaccion.jsp" managed-bean="si es que tengo"
               icon="/images/icons/miaccion.gif" title-id="mi-accion" />



5- para que los cambios tengan efecto debes crear una regla de navegacion.




  <navigation-rule>
      <from-view-id>/jsp/*</from-view-id>
      <navigation-case>
         <from-outcome>miaccion</from-outcome>
         <to-view-id>/jsp/extension/miaccion.jsp</to-view-id>
      </navigation-case>
    
   </navigation-rule>


  No se cual es la meor manera de modificar alfresco. si alguno de los usuarios mas avanzados te puedan dar una mejor referencia. pero estos son los archivos que estoy trabajando directamente.
asi que revisa estos:


Alfresco\tomcat\webapps\alfresco\WEB-INF/faces-config-beans.xml
Alfresco\tomcat\webapps\alfresco\WEB-INF/faces-config-navigation.xml
C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco/web-client-config-actions.xml
C:\Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco/web-client-config-dialogs.xml



   hasta aca ya podras ver tu archivo.jsp

pablo_zapico
Champ in-the-making
Champ in-the-making
Buenas. yo estoy intentando tener una accion que me pertima añadir firmas a los documentos… algo parecido a cuando un documento tiene el aspecto versionable que se van añadiendo las versiones… pero realmente no se que tengo que modificar en alfresco para listar todas las firmas que tiene asociadas un documento… no se si me he explicado muy bien.

Alguien tiene alguna idea?

kara
Confirmed Champ
Confirmed Champ

Buenas tardes, me gustaría retomar este hilo porque tengo que hacer algo parecido, lo que quiero es llamar a una aplicación que tengo desplegada en tomcat (el mismo donde está mi Alfresco que por cierto es el 3.4.d) he seguido todos los pasos pero lo que no sé es cómo implementar el método dentro del actionexecuter.java para  que llame a otra aplicación, ya que en el código de showbiz_  lo que hace es una copia del documento. gracias de antemano por cualquier ayuda que puedan prestarme. un saludo.

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.