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 or where" 141 print " WebStack documentation and extras have been installed." 142 print " eg. .../WebStack-x.y" 143 print " eg. /usr/share/doc/python2.4-webstack" 144 print " * The name of the deployment descriptor template." 145 print " eg. web.xml" 146 print "You can also specify some additional libraries for the application..." 147 print " eg. $CATALINA_HOME/common/lib/activation.jar" 148 print " $CATALINA_HOME/common/lib/mail.jar" 149 sys.exit(1) 150 151 print "Making application directory..." 152 make_app(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 153 154 if len(sys.argv) > 5: 155 print "Copying additional libraries..." 156 appname = get_appname(sys.argv[1]) 157 for library in sys.argv[5:]: 158 library_dir, library_name = os.path.split(library) 159 library_dest = os.path.join(appname, "WEB-INF", "lib", library_name) 160 copy_file(library, library_dest) 161 162 print "Now copy or move the application directory to your servlet container." 163 164 # vim: tabstop=4 expandtab shiftwidth=4