Category:
Author/Contact Info Adam
Description: I am now learning to code JSP pages. To do this I installed several web/jsp servers on my NT workstation, and then got side tracked writing a PerlTK script to give me convenient control over them. I thought I might share this script, maybe some one is interested in TK, or closures, or whatever.
#!perl -w
use strict;
use Tk;
use IO::Pipe;

use constant DEBUGGING => 1; # No log. Generates trace messages as war
+nings.

SetEnv();

# Create the TK window.
my $top = MainWindow->new();

my %Servers;
$Servers{TomCat}=AddServer('TomCat',
            # Start command
                'start /min java -Dtomcat.home="%TOMCAT_HOME%" '.
                'org.apache.tomcat.startup.Tomcat', 
            # Stop command 
                'java -Dtomcat.home="%TOMCAT_HOME%" '.
                'org.apache.tomcat.startup.Tomcat -stop' 
);

$Servers{Apache}=AddServer('Apache',
            # Start command 
                "start /min $ENV{APACHE_HOME}\\Apache.exe ".
                "-d $ENV{APACHE_HOME} -s",
            # Stop command 
                "start /min $ENV{APACHE_HOME}\\Apache.exe ".
                "-d $ENV{APACHE_HOME} -k shutdown",
);

$Servers{JSWDK}=AddServer('JSWDK',
            # Start command 
                'start /min java com.sun.web.shell.Startup ', 
            # Stop command 
                'java com.sun.web.shell.Shutdown',
);

# Add the above servers to the TK window.                             
+             
foreach( sort keys %Servers )
{
    $Servers{$_}{Button}->pack();
}

# Start the TK loop:
MainLoop();

# Shut down the server if it is running when the window is closed.
END{ for( keys %Servers ){ &{$Servers{$_}{Stop}} if $Servers{$_}{Runni
+ng} } }

# Subs
######

sub ButtonHandler
{
    my $server = shift;

    return sub 
    {
        $Servers{$server}{Running} ? &{$Servers{$server}{Stop}} :
                                     &{$Servers{$server}{Start}};
        ChangeLabel( $server );
    }
}

sub StartLabel
{
    my $name = defined $_[0] ? $_[0] : chr(8);
    return "Start $name Server";
}

sub StopLabel
{
    my $name = defined $_[0] ? $_[0] : chr(8);
    return "Stop $name Server";    
}

sub ChangeLabel
{
    my $server = shift;
    $Servers{$server}{Button}->cget( 'text' ) eq StartLabel($server) ?
        $Servers{$server}{Button}->configure( 'text', StopLabel($serve
+r)  ):
        $Servers{$server}{Button}->configure( 'text', StartLabel($serv
+er) );
}

sub Cmd
{ 
    my $startcmd = IO::Pipe->new();
    my $stopcmd = IO::Pipe->new();

    my $server = shift;
    my $start_command = shift;
    my $stop_command = shift;

    my $Start = sub
    {
        close $stopcmd if defined fileno( $stopcmd );
        warn "Running \"$start_command\"\n" if DEBUGGING;
        open $startcmd, "$start_command |" or die $!;
        $Servers{$server}{Running} = 1;
    };
    
    my $Stop = sub
    {
        open $stopcmd, "$stop_command |" or die $!;
        warn "Running \"$stop_command\"\n" if DEBUGGING;        
        close $startcmd; # Clean up.
        $Servers{$server}{Running} = 0;
    };
    
    return ( $Start, $Stop );
}

sub AddServer
{
    my $SName = shift;
    my $StartCmd = shift;
    my $StopCmd = shift;

    my %entry;

    $entry{Running} = 0;
    $entry{Button}  = $top->Button( 'text', StartLabel( $SName ),
                                    'command', ButtonHandler( $SName )
+ );
    ( $entry{Start}, $entry{Stop} ) = Cmd( $SName, $StartCmd , $StopCm
+d );

    return \%entry;
}

# This env monkey buisness is taken from the various startup scripts 
# that came with the servers. It is a point of consternation.
sub SetEnv  
{
    my $TomcatRoot = 'E:\jakarta-tomcat';
    exists $ENV{TOMCAT_HOME}    ?
      $TomcatRoot = $ENV{TOMCAT_HOME}:
      $ENV{TOMCAT_HOME} = $TomcatRoot;

    my $ApacheRoot = 'E:\Progra~1\Apache~1\Apache';
    $ENV{APACHE_HOME} = $ApacheRoot;

    # Set up the CLASSPATH that we need    
    my $cp= exists $ENV{CLASSPATH} ? $ENV{CLASSPATH} : '';    
    $ENV{CLASSPATH}="$TomcatRoot\\classes;$TomcatRoot\\lib\\webserver.
+jar";
    $ENV{CLASSPATH}=$ENV{CLASSPATH}.";$TomcatRoot\\lib\\jasper.jar";
    $ENV{CLASSPATH}=$ENV{CLASSPATH}.";$TomcatRoot\\lib\\xml.jar";
    $ENV{CLASSPATH}=$ENV{CLASSPATH}.";$TomcatRoot\\lib\\servlet.jar;";
    $ENV{CLASSPATH}=$ENV{CLASSPATH}.$ENV{JAVA_HOME}."\\lib\\tools.jar;
+";
    $ENV{CLASSPATH}=$ENV{CLASSPATH} . $cp;

    my $JwsdkRoot = 'E:\jswdk-1.0.1';
    my $JwsdkJars = "$JwsdkRoot\\webserver.jar;".
                    "$JwsdkRoot\\lib\\jakarta.jar;".
                    "$JwsdkRoot\\lib\\servlet.jar;".
                    "$JwsdkRoot\\lib\\jsp.jar;".
                    "$JwsdkRoot\\lib\\jspengine.jar;".
                    "$JwsdkRoot\\lib\\moo.jar;";
                    "$JwsdkRoot\\examples\\WEB-INF\\jsp\\beans;".
                    "$JwsdkRoot\\webpages\\WEB-INF\\servlets;".
                    "$JwsdkRoot\\webpages\\WEB-INF\\jsp\\beans;";
    
    $ENV{CLASSPATH}="$ENV{CLASSPATH};$JwsdkRoot\\classes;$JwsdkJars";
    $cp = $ENV{CLASSPATH};

    warn "CLASSPATH is:\n", join("\n",split(';',$cp)), "\n" if DEBUGGI
+NG;
}