TclJava Hashtable

Here is a little hack to let you treat Java Hashtables (mostly) like Tcl Arrays *using TclBlend or Jacl -- Todd Coram

 package require java

 proc tcljava_hashtable {arrayname javaHashTable} {
    upvar $arrayname arr
    java::lock $javaHashTable
    for {set e [$javaHashTable keys]} {[$e hasMoreElements]} {} {    
        set key [$e nextElement]
        if {[java::instanceof $key String]} {
            # Convienence, convert it to a Tcl String...
            set key [$key toString]
        }
        set value [$javaHashTable get $key]
        if {[java::instanceof $value String]} {
            # Convienence, convert it to a Tcl String...
            set value [$value toString]
        }
        set arr($key) $value
    }
    trace add variable arr {unset write read} [list traceHashArray $javaHashTable]
 }

 proc traceHashArray {hash name index op} {
    upvar $name arr
    switch -- $op {
        write {
            $hash put $index $arr($index)
        }
        read {
            set value [$hash get $index]
            if {[java::instanceof $value String]} {
                set value [$value toString]
            }
            set arr($index) $value
        }
        unset {
            java::unlock $hash
        }
    }
 }

You can use it on newly created hashtables or existing ones. It also works with any subclass of Hashtable:

 # Associate the array 'props' with the Java System Properties.
 #
 tcljava_hashtable props [java::call System getProperties]

 # Show all of the Java system property keys.
 puts [array names props]

 # Add a property (in a Tclish manner)
 #
 set props(Hacker) "Todd Coram"
 puts $props(Hacker)

 # Make sure Java sees it.
 #
 puts [java::call System getProperty Hacker]

TclJava Tricks


Category Java