Uwe,
Many thanks, I'll have a good look at this.
Peter
On Tue, 2003-02-11 at 17:07, [EMAIL PROTECTED] wrote:
> Hi Peter,
> Hi Slava,
>
> Here is what I have done, to run programs on the server and to reflect
> their stdout to
> a Web-Browser (I have stripped some code to make things a little bit
> clearer (temp-file handling,
> environment settings, ...) ):
>
> The key elements are a tool running in session scope and a velocity screen
> for displaying
> the output of the program.
>
> Hope that helps
>
> /Uwe
>
> java-part:
> =======
>
> // MODULE: TaskManager header
> /**
> *
> */
> package de.gea.wiegand.teben.tools.task;
>
> // java classes
> import java.lang.*;
> import java.util.*;
> import java.io.*;
>
> // turbine classes
> import org.apache.turbine.services.resources.*;
> import org.apache.turbine.services.servlet.*;
> import org.apache.turbine.util.*;
> import org.apache.turbine.util.template.TemplateLink;
> import org.apache.turbine.util.Log;
> import org.apache.turbine.om.security.TurbineUser;
> import org.apache.turbine.om.security.User;
>
> // javax classes
> import javax.servlet.http.HttpSessionBindingListener;
> import javax.servlet.http.HttpSessionBindingEvent;
>
> class Task extends Thread
> {
> private TaskManager taskMgr;
>
> public Task(TaskManager tmgr) {
> taskMgr = tmgr;
> }
>
> public void run () throws ThreadDeath
> {
> try {
>
> // get remaining parameters for exec
> // and start the process
> String complete_cmd = taskMgr.createCompleteCmd();
> String[] envp = taskMgr.getEnvironment();
> File dir = new File(TurbineServlet.getRealPath("/"));
> Process proc = Runtime.getRuntime().exec(complete_cmd,envp,dir);
>
> // cleanup stdout etc
> taskMgr.stdout.clear();
> taskMgr.stderr.clear();
>
> taskMgr.state = 1;
> taskMgr.is = proc.getInputStream();
> taskMgr.es = proc.getErrorStream();
>
> // read from process until the process terminates
> if (taskMgr.is != null) {
>
> // process stdout of the program
> BufferedReader bf = new BufferedReader(new
> InputStreamReader(taskMgr.is));
> String s;
> while ((s = bf.readLine()) != null)
> {
> synchronized(taskMgr.stdout) {
> taskMgr.stdout.addElement(s);
> }
> }
>
> // now process the error stream
> bf = new BufferedReader(new InputStreamReader(taskMgr.es));
> while ((s = bf.readLine()) != null)
> {
> synchronized(taskMgr.stdout) {
> taskMgr.stdout.addElement(s);
> }
> }
> }
> else
> System.out.println("No stdout");
>
> // wait until process has completely finished
> proc.waitFor();
>
> // set state to finished
> // so the watchdog knows he can finish
> // and at the next refresh the screen
> // knows that he should switch to show
> // the result file
> //////////////////////////////////////////////////
> taskMgr.state = 2;
> taskMgr.retCode = proc.exitValue();
> taskMgr.addTaskResult();
>
> }
> catch (ThreadDeath td) { taskMgr.state = 2; throw td; }
> catch (Exception e) {
> taskMgr.stdout.add("<p class=\"error\">Got an exception running
> program :"
> + e.getMessage());
> taskMgr.state = 2;
> }
>
> finally { taskMgr.setDefaults(); }
> }
> }
>
> public class TaskManager
> extends Thread
> implements org.apache.turbine.services.pull.ApplicationTool,
> java.io.Serializable,
> HttpSessionBindingListener
> {
> InputStream is;
> InputStream es;
> HashMap envStrings;
> String cmd;
> Vector stdout;
> Vector stderr;
> int state;
> int retCode;
>
> private Vector taskResults;
>
> /**
> * refresh time for the screen
> */
> private long refresh;
>
> /**
> * the screen to display stdout and the result file
> * should be set in turbineResource.properties
> * could be given as: tool.task.screen=run.vm
> */
> private String taskScreen;
>
> private static final String TASK_SCREEN = "tool.task.screen";
>
> /**
> * default refresh time in msec
> */
> private static final String TASK_REFRESH = "tool.task.refresh";
>
> /**
> * default task parameters passed in the commandline
> * as the parameters following the tempfile name
> */
> private static final String TASK_DEFAULT_PARMS = "tool.task.parms";
>
> /**
> * where to find scripts and binaries
> */
> private static final String TASK_BIN = "tool.task.bin";
>
> public int getState ()
> {
> return state;
> }
>
> public int getRetCode()
> {
> return retCode;
> }
>
> /**
> * returns an enumeration of the current output of the program
> * it also sets the lastRefresh time, so the watchdogs knows
> * that the user is still interested in the results ...
> * @return Enumeration of Strings
> */
> public Enumeration getOutput ()
> {
> return stdout.elements();
> }
>
> public long getRefresh()
> {
> return refresh;
> }
>
> /**
> * calculates the refresh in seconds and returns
> * them as int because velocity can�t deal with
> * longs ...
> *
> * @return timeout in seconds
> */
> public int getRefreshSeconds()
> {
> return (int) (refresh/1000);
> }
>
> public void setRefresh(long r)
> {
> refresh = r;
> }
> ....
>
> public void execute (RunData data, String cmd, boolean doWait)
> {
> Task task = new Task(this);
>
> this.cmd = cmd;
> state = 0;
>
> if (data.getSession().getAttribute("task") == null)
> data.getSession().setAttribute("task",this);
>
> if (doWait) {
> task.run();
> }
> else {
> data.setScreenTemplate(taskScreen);
> task.start();
> }
> }
>
> public TaskManager ()
> {
> cmd = null;
> state = 0;
> is = null;
> es = null;
> stdout = new Vector();
> stderr = new Vector();
> parmStrings = new Vector();
> envStrings = new HashMap();
> taskResults = new Vector();
>
> retCode = 0;
> tmpfile = null;
> tmpFiles = new Vector();
> returnLink = null;
> taskScreen = TurbineResources.getString(TASK_SCREEN,"");
>
> setDefaults();
> }
>
> /**
> * set the default values as given in TurbineResource.properties
> * (or hardcoded)
> * is called at the end of each task, and at initialization
> */
> void setDefaults()
> {
> try {
> refresh = TurbineResources.getLong(TASK_REFRESH,20000);
> envStrings.clear();
> parmStrings.clear();
> defaultParms = TurbineResources.getString(TASK_DEFAULT_PARMS,"");
> }
> catch(Exception e) {
> Log.error("task","TaskManager: Error setting defaults:" , e);
> refresh = 20000;
> }
> }
>
> /**
> * Does additional setup
> * @param u
> */
> public void init (Object u)
> {
> }
>
> public void refresh()
> {
> }
>
> }
>
>
> Velocity-part:
> ==========
>
> $page.setHttpEquiv("expires", "0")
>
> <h2>STDOUT of the program:</h2>
>
> #foreach($line in $task.Output)
> $line <br>
> #end
>
> #if( $task.State > 1 )
> <form action="$link.setPage("Result.vm")">
> <input type="hidden" name="ausgabe_anfordern" value="1">
> <input type="submit" value="Weiter ...">
> </form>
> #else
> #set( $content=$link.setPage("RunTool.vm") )
> #set( $refresh=$task.Refresh/1000 )
> $page.setHttpEquiv("refresh", "$task.RefreshSeconds; url=$content")
> #end
>
>
>
>
>
> Peter Courcoux
>
> <[EMAIL PROTECTED] An: Turbine Users List
><[EMAIL PROTECTED]>
> iz> Kopie:
>
> Thema: Re: Antwort: upload
>progress
> 07.02.2003 18:02
>
> Bitte antworten
>
> an "Turbine Users
>
> List"
>
>
>
>
>
>
>
>
>
> Hi Uwe,
>
> Yes please, could you send me the screen source as well. I have not
> thought through all the options for this yet and I would be very
> interested to see what you have done.
>
> Many thanks,
>
> Peter
>
> On Fri, 2003-02-07 at 15:44, [EMAIL PROTECTED] wrote:
> > Hi Peter
> >
> > I've implemented something similar. I am executing some long time running
> > programs
> > on the server, returning their stdout to a velocity screen. The screen
> > reloads it self every 10 seconds
> > and pulls out the stdout from the tool that controls the program. This
> > happens until the tool signals that
> > the program has finished.
> >
> > Looks like you wan�t to implement something much the same.
> > If you are interested I can send you the source of that tool ...
> >
> > /uwe
> >
> >
> >
> >
>
> > Peter Courcoux
>
> > <[EMAIL PROTECTED] An: Turbine Users
> List <[EMAIL PROTECTED]>
> > iz> Kopie:
>
> > Thema: upload progress
>
> > 07.02.2003 13:12
>
> > Bitte antworten
>
> > an "Turbine Users
>
> > List"
>
> >
>
> >
>
> >
> >
> >
> >
> > Hi all,
> >
> > I'm toying with the idea of implementing an upload progress monitor for
> > the upload service. It looks like I may have to patch the upload
> > service, write a pull tool and write a HOWTO to do this.
> >
> > Has anyone done this already or have any thoughts or comments? Is anyone
> > interested?
> > --
> > Peter Courcoux <[EMAIL PROTECTED]>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> --
> Peter Courcoux <[EMAIL PROTECTED]>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
--
Peter Courcoux <[EMAIL PROTECTED]>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]