WebStack

tools/JavaServlet/build.py

383:74ed715c5455
2005-05-01 paulb [project @ 2005-05-01 18:16:52 by paulb] Added missing example for Zope.
     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, web_xml_template_name):    79     80     """    81     Make the application directory from the given 'handler', application    82     directory 'appdir', the 'webstack_home' where the WebStack package can be    83     found, and the deployment descriptor with the given 'web_xml_template_name'.    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_template_name))   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) < 5:   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 "  * The name of the deployment descriptor template."   143         print "    eg. web.xml"   144         print "You can also specify some additional libraries for the application..."   145         print "  eg. $CATALINA_HOME/common/lib/activation.jar"   146         print "      $CATALINA_HOME/common/lib/mail.jar"   147         sys.exit(1)   148    149     print "Making application directory..."   150     make_app(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])   151    152     if len(sys.argv) > 5:   153         print "Copying additional libraries..."   154         appname = get_appname(sys.argv[1])   155         for library in sys.argv[5:]:   156             library_dir, library_name = os.path.split(library)   157             library_dest = os.path.join(appname, "WEB-INF", "lib", library_name)   158             copy_file(library, library_dest)   159    160     print "Now copy or move the application directory to your servlet container."   161    162 # vim: tabstop=4 expandtab shiftwidth=4