WebStack

tools/JavaServlet/build.py

289:43e23cde36c2
2004-09-21 paulb [project @ 2004-09-21 17:59:03 by paulb] Fixed path field discovery by removing parameters with empty names. This may not be totally correct, however.
     1 #!/usr/bin/env python     2      3 "A simple Jython-based installer for the Web applications."     4      5 import os     6      7 def copy_file(source, destination):     8      9     """    10     Copy a file from 'source' to 'destination'. Note that 'destination' must    11     include the name of the file - it cannot be a directory name.    12     """    13     14     print "Copying", source, "to", destination    15     16     # Do things by the book, since Jython/Java won't copy the file contents in    17     # all cases presumably due to finalisation issues.    18     19     f = open(source, "rb")    20     s = f.read()    21     f.close()    22     23     f = open(destination, "wb")    24     f.write(s)    25     f.close()    26     27 def recurse(dirs_and_files, dirname, names):    28     29     """    30     A recursive directory and file collector for os.path.walk. The provided    31     'dirs_and_files' list must contain two lists (one for directory names, one    32     for filenames). The 'dirname' and 'names' parameters are supplied by the    33     os.path.walk mechanism.    34     """    35     36     if dirname.endswith("/CVS"):    37         return    38     dirs_and_files[0].append(dirname)    39     for name in names:    40         if os.path.isfile(os.path.join(dirname, name)):    41             dirs_and_files[1].append(os.path.join(dirname, name))    42     43 def copy_directory(source, destination):    44     45     """    46     Copy a directory found at 'source' in the filesystem to the 'destination'.    47     Note that 'destination' is the parent directory of the newly created    48     directory.    49     """    50     51     # Remove trailing directory separators.    52     53     source = os.path.normpath(source)    54     prefix = os.path.split(source)[0]    55     dirs_and_files = [[], []]    56     os.path.walk(source, recurse, dirs_and_files)    57     58     for dirname in dirs_and_files[0]:    59     60         # Remove the prefix from the name and create the object under the destination.    61         # NOTE: Joining "" to the path in Jython doesn't add the path separator.    62     63         new_dirname = dirname[len(os.path.join(prefix, "x")) - 1:]    64         print "Making", new_dirname, "under", destination    65         os.mkdir(os.path.join(destination, new_dirname))    66     67     for filename in dirs_and_files[1]:    68     69         # Remove the prefix from the name and create the object under the destination.    70         # NOTE: Joining "" to the path in Jython doesn't add the path separator.    71     72         new_filename = filename[len(os.path.join(prefix, "x")) - 1:]    73         copy_file(filename, os.path.join(destination, new_filename))    74     75 def get_appname(handler):    76     return os.path.split(os.path.splitext(handler)[0])[1]    77     78 def make_app(handler, appdir, webstack_home):    79     80     """    81     Make the application directory from the given 'handler', application    82     directory 'appdir' and the 'webstack_home' where the WebStack package can be    83     found.    84     """    85     86     appname = get_appname(handler)    87     print "Making", appname    88     89     os.mkdir(appname)    90     os.mkdir(os.path.join(appname, "WEB-INF"))    91     os.mkdir(os.path.join(appname, "WEB-INF", "jython"))    92     os.mkdir(os.path.join(appname, "WEB-INF", "lib"))    93     94     # Copy the Jython runtime.    95     96     jython_home = sys.exec_prefix    97     copy_file(os.path.join(jython_home, "jython.jar"),    98         os.path.join(appname, "WEB-INF", "lib", "jython.jar"))    99    100     # Copy the special PyServlet classes.   101    102     copy_directory(os.path.join(webstack_home, "tools", "JavaServlet", "classes"),   103         os.path.join(appname, "WEB-INF"))   104    105     # Copy the WebStack package.   106    107     copy_directory(os.path.join(webstack_home, "WebStack"),   108         os.path.join(appname, "WEB-INF", "jython"))   109    110     # Copy the application itself.   111    112     copy_directory(appdir, os.path.join(appname, "WEB-INF", "jython"))   113    114     # Copy the handler.   115    116     handler_filename = os.path.split(handler)[1]   117     copy_file(handler, os.path.join(appname, handler_filename))   118    119     # Configure the deployment descriptor.   120    121     f = open(os.path.join(webstack_home, "tools", "JavaServlet", "web.xml"))   122     web_xml = f.read()   123     f.close()   124     web_xml = web_xml % (jython_home, handler_filename)   125    126     # Write the deployment descriptor.   127    128     f = open(os.path.join(appname, "WEB-INF", "web.xml"), "w")   129     f.write(web_xml)   130     f.close()   131    132 if __name__ == "__main__":   133     import sys   134     if len(sys.argv) < 4:   135         print "Please specify..."   136         print "  * The location of the application handler."   137         print "    eg. .../WebStack-x.y/examples/JavaServlet/SimpleApp.py"   138         print "  * The location of the application."   139         print "    eg. .../WebStack-x.y/examples/Common/Simple"   140         print "  * The location of the WebStack package distribution."   141         print "    eg. .../WebStack-x.y"   142         print "You can also specify some additional libraries for the application..."   143         print "  eg. $CATALINA_HOME/common/lib/activation.jar"   144         print "      $CATALINA_HOME/common/lib/mail.jar"   145         sys.exit(1)   146    147     print "Making application directory..."   148     make_app(sys.argv[1], sys.argv[2], sys.argv[3])   149    150     if len(sys.argv) > 4:   151         print "Copying additional libraries..."   152         appname = get_appname(sys.argv[1])   153         for library in sys.argv[4:]:   154             library_dir, library_name = os.path.split(library)   155             library_dest = os.path.join(appname, "WEB-INF", "lib", library_name)   156             copy_file(library, library_dest)   157    158     print "Now copy or move the application directory to your servlet container."   159    160 # vim: tabstop=4 expandtab shiftwidth=4