Action Java con acceso al documento

cancel
Showing results for 
Search instead for 
Did you mean: 
pjcaracuel_2349
Active Member II

Re: Action Java con acceso al documento

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
Active Member

Re: Action Java con acceso al documento

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
Active Member II

Re: Action Java con acceso al documento

Gracias a ti por la aportacion, muy util.

Saludos
cybermakoki
Member II

Re: Action Java con acceso al documento

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
Member II

Re: Action Java con acceso al documento

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
Member II

Re: Action Java con acceso al documento

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
Active Member

Re: Action Java con acceso al documento

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.