[Résolu] Runtime.exec avec Alfresco 3.4d

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

[Résolu] Runtime.exec avec Alfresco 3.4d

Hello,

Une de mes actions exécute des commandes externes (transformation d'image, détection de code-barres). Tout fonctionne à merveille avec Alfresco 32r2 et 3.3g sur Windows et Linux.
J'aimerais mettre à jour pour 3.4d mais j'ai des problèmes sous Linux… (tout est ok sous Windows).

Dans mon action

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

[/bin/sh, -c, convert -density 125 -threshold 46% "/opt/Alfresco/tomcat/temp/Alfresco/ReadBarcodesSplit1499126559/1_splitted.pdf" +adjoin "/opt/Alfresco/tomcat/temp/Alfresco/ReadBarcodesSplit1499126559/1_splitted.pdf_B.gif"]

Error execution stdInput

Error: /invalidfont in /findfontOperand stack:   –dict:6/6(L)–   F10   8   –dict:9/9(L)–   –dict:9/9(L)–   TimesNewRomanPSMT   –dict:9/9(L)–   Times-Roman   Times-RomanExecution stack:   %interp_exit   .runexec2   –nostringval–   –nostringval–   –nostringval–   2   %stopped_push   –nostringval–   –nostringval–   –nostringval–   false   1   %stopped_push   1797   1   3   %oparray_pop   1796   1   3   %oparray_pop   1792   1   3   %oparray_pop   –nostringval–   –nostringval–   2   1   1   –nostringval–   %for_pos_int_continue   –nostringval–   –nostringval–   –nostringval–   –nostringval–   %array_continue   –nostringval–   false   1   %stopped_push   –nostringval–   %loop_continue   –nostringval–   –nostringval–   –nostringval–   –nostringval–   –nostringval–   –nostringval–   –nostringval–   1767   9   9   %oparray_popDictionary stack:   –dict:1086/1123(ro)(G)–   –dict:2/20(G)–   –dict:74/200(L)–   –dict:74/200(L)–   –dict:105/127(ro)(G)–   –dict:259/300(ro)(G)–   –dict:21/25(L)–   –dict:4/6(L)–   –dict:24/31(L)–Current allocation mode is localLast OS error: 2

Error execution stdError

GPL Ghostscript 8.56: Unrecoverable error, exit code 1.convert.bin: Postscript delegate failed `/opt/Alfresco/tomcat/temp/Alfresco/ReadBarcodesSplit1453127511/1_splitted.pdf': No such file or directory @ pdf.c/ReadPDFImage/612..convert.bin: missing an image filename `/opt/Alfresco/tomcat/temp/Alfresco/ReadBarcodesSplit1453127511/1_splitted.pdf_A.gif' @ convert.c/ConvertImageCommand/2775.
390
0
0

Une autre commande…
[/bin/sh, -c, /usr/local/bin/zbarimg -q -Sdis -Sqrcode.en "/opt/Alfresco/tomcat/temp/Alfresco/ReadBarcodesSplit45676289/0_splitted.pdf_A.gif"]

Error execution stdError
zbarimg: magick/cache.c:647: AcquireOnePixelFromCache: Assertion `image != (Image *) ((void *)0)' failed.

Les commandes effectuées sur le serveur fonctionne.

Y-a-t'il eu des nouveautés liées au Runtime.getRuntime() ? Dois-je configurer autrement Tomcat ?

Je remarque aussi avec la 34d que je dois préciser l'emplacement du programme (zbarimg) avec /usr/local/bin/ (j'ai un message qui me dit qu'il ne trouve pas le programme). Cela n'était pas le cas avant… Il semble que des variables ne sont pas accessibles depuis le tomcat…

Merci bien

(post anglais : http://forums.alfresco.com/en/viewtopic.php?f=10&t=37976)
3 Replies
dranakan
Active Member

Re: [Résolu] Runtime.exec avec Alfresco 3.4d

J'ai refait des tests…. Si j'exécute la commande sur la machine directement ou par un programme java, tout fonctionne, mais pas depuis Alfresco. Si j'utilise le convert inclu dans Alfresco, cela me provoque une autre erreur… mais pour le moment je vais tenter de faire fonctionner le "convert" installé sur la machine (qui fonctionnait avant avec Alfresco 32r2 et 33g).

Commande lancée sur le serveur : Fonctionne

[root@ged1 runexec]#/usr/bin/convert /media/lienVersPartage/test/runexec/im.pdf /media/lienVersPartage/test/runexec/im.pdf.gif

Commande lancée depuis un programme Java (compilé et exécuté avec Java d'Alfresco) : Fonctionne
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 Run {
public final static String OS_NAME = System.getProperty("os.name");
public final static String LINUX = "linux";
public final static String WINDOWS = "windows";

   public static void main (String[] args){
        System.out.println("Start…");

        String command = "/usr/bin/convert /media/lienVersPartage/test/runexec/im.pdf /media/lienVersPartage/test/runexec/im.pdf.gif";
        executeCommand(command,true,false);

   }

public static boolean executeCommand(String command, boolean waitFor,
                         boolean disableDirectOutputError) {
                BufferedReader stdInput = null;
                BufferedReader stdError = null;
                boolean returnSuccess = true;
                try {
                        String[] commands = new String[3];
                        // Depending of the OS
                        if ((OS_NAME.toLowerCase()).indexOf("windows") >= 0) {
                                // Windows
                                commands[0] = "cmd.exe";
                                commands[1] = "/C";
                        } else if ((OS_NAME.toLowerCase()).indexOf("linux") >= 0) {
                                // Linux
                                commands[0] = "/bin/sh";
                                commands[1] = "-c";
                                // Les programmes sont dans /usr/local/bin/
                                //commands[2]="/usr/local/bin/";

                        } else {
                                System.out.println("Not configurate to run external commands on : "
                                                + OS_NAME);
                                return false;
                        }

                        // Add the command to execute
                        commands[2] = command;


                                String infoMessage = "";
                                for (String cmd : commands) {
                                        infoMessage += cmd + ";";
                                }
                                System.out.println("Run the external commands : '" + infoMessage
                                                + "' and waitFor : " + waitFor);


                        Process proc = Runtime.getRuntime().exec(commands);
                        stdInput = new BufferedReader(new InputStreamReader(
                                        proc.getInputStream()));

                        stdError = new BufferedReader(new InputStreamReader(
                                        proc.getErrorStream()));

                        // Wait
                        if (waitFor) {

                                        System.out.println("Wait for…");

                                proc.waitFor();

                                        System.out.println("End of external process");

                        }

                        //
                        // Outputs
                        //
                        String outputLine = null;
                        String output = "";
                        String outputError = "";
                        while ((outputLine = stdInput.readLine()) != null) {
                                output += outputLine;
                        }
                        // Output error
                        while ((outputLine = stdError.readLine()) != null) {
                                outputError += outputLine;
                        }
                        // Write outputs
                        if (output != null && output.length() > 0) {

                                        System.out.println(output);

                                //if (outputMessage != null) {
                                //      outputMessage.message = output;
                                //}
                        }
                        if (outputError != null && outputError.length() > 0) {
                                if (!disableDirectOutputError) {
                                        System.out.println(outputError);
                                }
                                //if (outputMessage != null) {
                                //      outputMessage.messageError = output;
                                //}
                                returnSuccess = false;
                        }

                } catch (Exception e) {
                        System.out.println("Error trying using the external command");
                        return false;
                } finally {
                        // Close
                        try {
                                if (stdInput != null) {
                                        stdInput.close();
                                }
                        } catch (Exception e) {
                                System.out.println("Error trying closing flux");
                                returnSuccess = false;
                        }
                        try {
                                if (stdError != null) {
                                        stdError.close();
                                }
                        } catch (Exception e) {
                                System.out.println("Error trying closing flux");
                                returnSuccess = false;
                        }
                }
                return returnSuccess;
        }
}

Code exécuté depuis Alfresco : Erreur

commands[2]="/usr/bin/convert /media/lienVersPartage/test/runexec/im.pdf /media/lienVersPartage/test/runexec/im.pdf.gif";

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

Info erreur (stdError)

sh: -c: line 0: syntax error near unexpected token `&'sh: -c: line 0: `"gs" -q -dQUIET -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=0 "-sDEVICE=pnmraw" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72"  "-sOutputFile=/tmp/magick-XXk5sZ0E" "-f/tmp/magick-XXND5eN3" "-f/tmp/magick-XXmbSlAs"'convert: Postscript delegate failed `/media/lienVersPartage/test/runexec/im.pdf': No such file or directory.convert: missing an image filename `/media/lienVersPartage/test/runexec/im.pdf.gif'.

Une idée ?
dranakan
Active Member

Re: [Résolu] Runtime.exec avec Alfresco 3.4d

Le code qui marche en 33g ne va pas en 34d. Je supposais que c'était Tomcat 33g->version 6.0.18 et 34d-> version 6.0.26..
J'ai remplacé le répertoire /opt/Alfresco/tomcat/conf de la 34d avec ceux de la 33g mais cela ne fait aucune différence.

D'où pourrais venir la différence de comportement du "Runtime.getRuntime().exec" entre la 33g et la 34d sous Linux?

Merci bien.
dranakan
Active Member

Re: [Résolu] Runtime.exec avec Alfresco 3.4d