Problème d'initialisation : RuntimeExec

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

Problème d'initialisation : RuntimeExec

Bonjour à tous,

Dans le cadre de mon projet professionnel, je suis amené à faire des développements autour d'Alfresco. J'utilise la version 3.4d d'Alfresco Community sur une machine Windows Server 2003.

Afin de mener à bien mon projet, j'ai besoin d'exécuter une commande système (fichier .bat placé dans C:\ ou C:\WINDOWS\system32 permettant d'exporter un fichier .odm en .pdf à l'aide de macro OOo) à l'aide d'une action "custom" intégrée à Alfresco.
Le seul but de cette action, à son exécution, est donc d'exécuter cette commande.

J'ai donc créer une action "odm2pdf" que je rends accessible dans Alfresco.
Etant débutant en java, j'essaye de procédé par étapes. J'ai donc intégrer un exemple d'action déjà toute faite (http://www.ecmarchitect.com/images/articles/alfresco-actions/actions-article.pdf) afin d'analyser la démarche à suivre et j'ai essayer de refaire la même chose avec mes propres besoins.

J'ai également chercher la méthode permettant d'exécuter une commande externes depuis une action Alfresco
(http://forums.alfresco.com/fr/viewtopic.php?f=11&t=4798).
J'ai donc essayé d'adapter ce code selon mon besoin, voici mon Odm2PdfActionExecuter (compile sans erreur ni warning) ;

package org.alfresco.sample;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

class Odm2PdfActionExecuter
{
   public static void main (String[] args)
   {
      String command = "greg";
      executeCommand(command,true,false);
   }

   public static boolean executeCommand(String command, boolean waitFor, boolean disableDirectOutputError)
   {
      boolean returnout_value = true;
      try
      {
         String[] commands = new String[3];
         commands[0] = "cmd.exe";
         commands[1] = "/K";
         commands[2] = command;

         Process proc = Runtime.getRuntime().exec(commands);

         if (waitFor)
         {
            proc.waitFor();
         }

         catch (Exception e)
         {
            System.out.println(""Error trying using the external command"");
            returnSuccess = false;
         }
      }
      return returnout_value;
   }
}

J'ai également inclus un odm2pdf-action-context.xml :

<?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="odm2pdf" class="org.alfresco.sample.Odm2PdfActionExecuter" parent="action-executer">
      <property name="nodeService">
         <ref bean="nodeService" />
      </property>
   </bean>
   <bean id="extension.actionResourceBundles" parent="actionResourceBundles">
      <property name="resourceBundles">
         <list>
            <value>org.alfresco.sample.odm2pdf-action-messages</value>
         </list>
      </property>
   </bean>
</beans>

Une fois l'ensemble des fichiers placés dans le .jar dans le dossier ../WEB-INF/lib, je redémarre Alfresco et j'obtiens une erreur 404 Page Not Found.

Voici le contenu du fichier log stderr :

1 juin 2011 17:15:05 org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.20.
21 juin 2011 17:15:05 org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
21 juin 2011 17:15:05 org.apache.coyote.http11.Http11AprProtocol init
INFO: Initialisation de Coyote HTTP/1.1 sur http-8080
21 juin 2011 17:15:05 org.apache.coyote.ajp.AjpAprProtocol init
INFO: Initializing Coyote AJP/1.3 on ajp-8009
21 juin 2011 17:15:05 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 805 ms
21 juin 2011 17:15:05 org.apache.catalina.core.StandardService start
INFO: Démarrage du service Catalina
21 juin 2011 17:15:05 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.26
21 juin 2011 17:15:05 org.apache.catalina.startup.HostConfig deployDescriptor
INFO: Déploiement du descripteur de configuration alfresco.xml
21 juin 2011 17:15:07 org.apache.catalina.core.StandardContext addApplicationListener
INFO: The listener "org.apache.myfaces.webapp.StartupServletContextListener" is already configured for this context. The duplicate definition has been ignored.
21 juin 2011 17:15:09 org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
21 juin 2011 17:15:39 org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception lors de l'envoi de l'évènement contexte initialisé (context initialized) à l'instance de classe d'écoute (listener) org.alfresco.web.app.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'odm2pdf' defined in URL [jar:file:/C:/Alfresco/tomcat/webapps/alfresco/WEB-INF/lib/odm2pdf.jar!/alfresco/extension/odm2pdf-action-context.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'runtimeActionService' of bean class [org.alfresco.sample.Odm2PdfActionExecuter]: Bean property 'runtimeActionService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1341)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
   at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
   at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
   at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
   at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
   at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
   at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
   at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
   at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
   at org.alfresco.web.app.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:63)
   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
   at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
   at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
   at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:563)
   at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:498)
   at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
   at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
   at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
   at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
   at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
   at org.apache.catalina.core.StandardService.start(StandardService.java:519)
   at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
   at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
   at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'runtimeActionService' of bean class [org.alfresco.sample.Odm2PdfActionExecuter]: Bean property 'runtimeActionService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
   at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1012)
   at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:857)
   at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
   at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1338)
   … 38 more
21 juin 2011 17:15:39 org.apache.catalina.core.StandardContext listenerStart
GRAVE: Exception lors de l'envoi de l'évènement contexte initialisé (context initialized) à l'instance de classe d'écoute (listener) org.alfresco.web.app.ContextListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'odm2pdf' defined in URL [jar:file:/C:/Alfresco/tomcat/webapps/alfresco/WEB-INF/lib/odm2pdf.jar!/alfresco/extension/odm2pdf-action-context.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'runtimeActionService' of bean class [org.alfresco.sample.Odm2PdfActionExecuter]: Bean property 'runtimeActionService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1341)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1067)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
   at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
   at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
   at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
   at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
   at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
   at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
   at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
   at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
   at org.alfresco.web.app.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:63)
   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
   at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
   at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
   at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:563)
   at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:498)
   at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
   at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
   at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
   at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
   at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
   at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
   at org.apache.catalina.core.StandardService.start(StandardService.java:519)
   at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
   at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
   at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'runtimeActionService' of bean class [org.alfresco.sample.Odm2PdfActionExecuter]: Bean property 'runtimeActionService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
   at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1012)
   at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:857)
   at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)
   at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58)
   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1338)
   … 38 more

Il m'indique : Bean property 'runtimeActionService' is not writable or has an invalid setter method.

Quelqu'un sait d'où peut provenir cette erreur ? Car j'ai bien essayé de modifier le context.xml en rajoutant une du style
<property name="runtimeActionservice" />
mais en vain.
J'ai aussi essayé avec le code fourni directement sur le topic, mais il me fait la même erreur.

Merci d'avance pour votre aide.
Greg.
4 Replies
rguinot
Customer

Re: Problème d'initialisation : RuntimeExec

[org.alfresco.sample.Odm2PdfActionExecuter]: Bean property 'runtimeActionService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

Tout est dit. Vous essayez de setter runtimeActionService sans avoir le setter correspondant dans le code. La propriété runtimeActionService est déclarée sur le bean action-executer (le bean parent du bean de l'action).

Cette propriété n'est pas présente dans votre code, car vous avez oublié de spécifier que votre classe étends la classe abstraite.

Dans votre code Java, remplacez la définition de la classe par :
public class Odm2PdfActionExecuter  extends ActionExecuterAbstractBase
, comme expliqué sur le wiki : http://wiki.alfresco.com/wiki/Custom_Actions

A noter que pour executer une ligne de commande externe, il n'est pas nécessaire de créer une action custom, voir par exemple les transformations faites avec pdf2swf (tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/thirdparty/default/swf-transform-context.xml).
dranakan
Active Member

Re: Problème d'initialisation : RuntimeExec

Bonjour,

Je pense qu'il serait préférable d'utiliser un transformer au lieu d'une action personnalisée : voici un exemple : http://www.intelliant.fr/blog/ged/comment-integrer-une-ocr-a-alfresco-sous-linux/
Voir aussi : http://wiki.alfresco.com/wiki/Content_Transformations
Je pense que votre but est bien d'utiliser ce .bat, car sinon Alfresco peut transformer du OpenOffice en pdf sans développement particulier (sauf erreur).

Sinon, votre action n'est pas correcte. La méthode qui est démarrée par Alfresco est "executeImpl" et non la "main". Il faut aussi étendre l'action :  http://wiki.alfresco.com/wiki/Custom_Actions

Bonne chance
greg_2363
Member II

Re: Problème d'initialisation : RuntimeExec

Merci d'avoir répondu si vite.
Concernant l'extension de la classe ActionExecuterAbstractBase, c'est un oubli de ma part.

Pour le transfomer, je suis également en train d'étudier cette possibilité. Cependant le fichier que je souhaite transformer (.odm = Document maître) est un fichier principal comportant des liens vers des sous-documents (.odt).
Chaque sous-document est représenté comme un paragraphe au sein du document maître.

Il est nécessaire de rafraichir les liens des différents sous-documents vers le document maître. Je ne sais pas Alfresco fera correctement le rafraichissement, ce sans quoi, l'exportation en pdf me donnera une feuille blanche De plus, je possède déjà le script qui exécute automatiquement cette tâche. J'aimerais également intégrer un bouton (lié à mon action) qui me permettrai d'exécuter ce script, c'est pourquoi j'hésite à m'aventurer dans le transformer.

Le but final étant de donner à l'utilisateur la possibilité de faire cette transformation en un seul clic (depuis l'espace contenant le fichier, depuis les détails du document…).

Je vais corriger mes erreurs et ré-essayer.
Greg.
greg_2363
Member II

Re: Problème d'initialisation : RuntimeExec

Bonjour,
le problème à été résolu.
Merci pour votre aide et bonne continuation.
Cordialement.
Greg.