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