Re: [tcljava-dev] package unknown - looking for pkgIndex.tcl in the java classpath
Brought to you by:
mdejong
From: Christian B. <chr...@lf...> - 2007-10-15 07:54:36
|
Hello, any thoughts on the patch idea? Did anyone experience problems? If you find the idea useful, I'll be happy to send a "real" patch (diff) for tclPkgUnknown. Greetings, Christian Christian Brensing wrote: > Hello, > > I have written for a project a patch for tclPkgUnknown that allows > loading a jar bundled package (or any other package available in the > classpath) with a root pkgIndex.tcl using 'package require foo'. It's > implemented by looking first for root classpath resources named > 'pkgIndex.tcl' and sourcing them via 'source -url' (it uses the > commands from the java package). The patch itself is a procedure named > jaclPkgUnknown which delegates to the standard tclPkgUnknown found in > init.tcl for scanning the auto_path directories as well. You can use > the classpath loading by specifying this proc as the package unknown > script. The proc is as follows: > > # jaclPkgUnknown -- > # > # Tcl/Java specific procedure for the "package unknown" function. It is > # invoked when a package that's needed can't be found. It scans > first the > # current thread's ContextClassLoader looking for root resources named > # pkgIndex.tcl and sources any such resources that are found to > setup the > # package database. Subsequently it calls the standard unknown > procedure > # 'tclPkgUnknown' which scans the auto_path directories as well. > # > # Arguments: > # name Name of desired package. Not used. > # version Version of desired package. Not used. > # exact Either "-exact" or omitted. Not used. > > proc jaclPkgUnknown {name version {exact {}}} { > package require java > global dir > if {[info exists dir]} { > set save_dir $dir > } > # Looking for /pkgIndex.tcl via the the thread's ContextClassLoader > set tccl [[java::call Thread currentThread] getContextClassLoader] > set urls [$tccl getResources pkgIndex.tcl] > while {[$urls hasMoreElements]} { > set url [[$urls nextElement] toString] > if {[string first "file:" $url] == 0} { > # Extract the path from the file url and set dir to its parent > set filename [string range $url 5 [string length $url]] > set dir [file dirname $filename] > } elseif {[string first "jar:file:" $url] == 0} { > # Set dir to a root resource location > set dir "resource:/" > } else { > tclLog "can't read package index from url \"$url\": > protocol not supported" > continue > } > if [catch {source -url $url} msg] { > error "error reading package index file from url \"$url\": > $msg" > } > } > # Delegate to standard unknown procedure > tclPkgUnknown $name $version $exact > if {[info exists save_dir]} { > set dir $save_dir > } else { > unset dir > } > } > > The proc doesn't function if the sourced pkgIndex.tcl (found in a jar > file) uses file globbing since dir is set to resource:/. > > I hope the patch will be useful. > > Greetings from Munich, > > Christian > ------------------------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. > Still grepping through log files to find problems? Stop. > Now Search log events and configuration files using AJAX and a browser. > Download your FREE copy of Splunk now >> http://get.splunk.com/ > ------------------------------------------------------------------------ > > _______________________________________________ > tcljava-dev mailing list > tcl...@li... > https://lists.sourceforge.net/lists/listinfo/tcljava-dev > |