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 make_app(handler, appdir, webstack_home): 76 77 """ 78 Make the application directory from the given 'handler', application 79 directory 'appdir' and the 'webstack_home' where the WebStack package can be 80 found. 81 """ 82 83 appname = os.path.split(os.path.splitext(handler)[0])[1] 84 print "Making", appname 85 86 os.mkdir(appname) 87 os.mkdir(os.path.join(appname, "WEB-INF")) 88 os.mkdir(os.path.join(appname, "WEB-INF", "classes")) 89 os.mkdir(os.path.join(appname, "WEB-INF", "jython")) 90 os.mkdir(os.path.join(appname, "WEB-INF", "lib")) 91 92 # Copy the Jython runtime. 93 94 jython_home = sys.exec_prefix 95 copy_file(os.path.join(jython_home, "jython.jar"), 96 os.path.join(appname, "WEB-INF", "lib", "jython.jar")) 97 98 # Copy the WebStack package. 99 100 copy_directory(os.path.join(webstack_home, "WebStack"), 101 os.path.join(appname, "WEB-INF", "jython")) 102 103 # Copy the application itself. 104 105 copy_directory(appdir, os.path.join(appname, "WEB-INF", "jython")) 106 107 # Copy the handler. 108 109 handler_filename = os.path.split(handler)[1] 110 copy_file(handler, os.path.join(appname, handler_filename)) 111 112 # Configure the deployment descriptor. 113 114 f = open(os.path.join(webstack_home, "examples", "JavaServlet", "web.xml")) 115 web_xml = f.read() 116 f.close() 117 web_xml = web_xml % jython_home 118 119 # Write the deployment descriptor. 120 121 f = open(os.path.join(appname, "WEB-INF", "web.xml"), "w") 122 f.write(web_xml) 123 f.close() 124 125 if __name__ == "__main__": 126 import sys 127 if len(sys.argv) < 4: 128 print "Please specify..." 129 print " * The location of the application handler." 130 print " eg. .../WebStack-x.y/examples/JavaServlet/SimpleApp.py" 131 print " * The location of the application." 132 print " eg. .../WebStack-x.y/examples/Common/Simple" 133 print " * The location of the WebStack package distribution." 134 print " eg. .../WebStack-x.y" 135 sys.exit(1) 136 137 print "Making application directory..." 138 make_app(sys.argv[1], sys.argv[2], sys.argv[3]) 139 140 print "Now copy or move the application directory to your servlet container." 141 142 # vim: tabstop=4 expandtab shiftwidth=4