svn-gvsig-desktop / tags / v1_1_Build_1012 / extensions / extScripting / scripts / jython / Lib / jreload.py @ 12987
History | View | Annotate | Download (3.55 KB)
1 | 5782 | jmvivo | # java classes reload support (experimental)
|
---|---|---|---|
2 | # Copyright 2000 Samuele Pedroni
|
||
3 | |||
4 | # ?? could have problem with import pkg.jclass.inner (this should not be used in any case)
|
||
5 | # ?? using import * with a load-set together with reloading can be confusing
|
||
6 | # cannot be fixed => anyway import * is not for production code
|
||
7 | |||
8 | __version__ = "0.3"
|
||
9 | |||
10 | import sys |
||
11 | from org.python.core import imp,PyJavaPackage,PyJavaClass |
||
12 | from _jython import is_lazy as _is_lazy |
||
13 | |||
14 | import jxxload_help |
||
15 | |||
16 | |||
17 | class _LoaderFactory(jxxload_help.JavaLoaderFactory): |
||
18 | def __init__(self,path): |
||
19 | vfs = jxxload_help.PathVFS() |
||
20 | for fname in path: |
||
21 | vfs.addVFS(fname) |
||
22 | self.vfs = vfs
|
||
23 | |||
24 | def makeLoader(self): |
||
25 | return jxxload_help.PathVFSJavaLoader(self.vfs,imp.getSyspathJavaLoader()) |
||
26 | |||
27 | class _Unload: |
||
28 | |||
29 | def __init__(self,ls): |
||
30 | self.ls = ls
|
||
31 | self.ls_name = ls._name
|
||
32 | self.loader = ls._mgr.loader
|
||
33 | |||
34 | def do_unload(self,pkg): |
||
35 | for n in pkg.__dict__.keys(): |
||
36 | e = pkg.__dict__[n] |
||
37 | if isinstance(e,PyJavaClass): |
||
38 | if _is_lazy(e): continue |
||
39 | if e.classLoader is self.loader: |
||
40 | del pkg.__dict__[n]
|
||
41 | if pkg.__name__:
|
||
42 | n = self.ls_name + '.' + pkg.__name__ + '.' +n |
||
43 | else:
|
||
44 | n = self.ls_name + '.' + n |
||
45 | if sys.modules.has_key(n): del sys.modules[n] |
||
46 | |||
47 | elif isinstance(e,PyJavaPackage): |
||
48 | self.do_unload(e)
|
||
49 | |||
50 | def __call__(self): |
||
51 | if self.loader: |
||
52 | if self.ls._mgr.checkLoader() is self.loader: |
||
53 | self.do_unload(self.ls._top) |
||
54 | self.ls._mgr.resetLoader()
|
||
55 | loader = self.loader
|
||
56 | jxxload_help.DiscardHelp.discard(loader,loader.interfaces) |
||
57 | self.loader = None |
||
58 | |||
59 | class LoadSet: |
||
60 | # ?? for the moment from import * and dir do not work for LoadSet, but work for
|
||
61 | # contained pkgs
|
||
62 | # need java impl as PyObject
|
||
63 | |||
64 | def __init__(self,name,path): |
||
65 | mgr = jxxload_help.PackageManager(path,_LoaderFactory(path)) |
||
66 | self._name = name
|
||
67 | self._mgr = mgr
|
||
68 | self._top = mgr.topLevelPackage
|
||
69 | |||
70 | def __getattr__(self,name): |
||
71 | try:
|
||
72 | return getattr(self._top,name) |
||
73 | except:
|
||
74 | if name == 'unload': return _Unload(self) |
||
75 | raise
|
||
76 | |||
77 | |||
78 | def __repr__(self): |
||
79 | return "<java load-set %s>" % self._name |
||
80 | |||
81 | def unloadf(ls): |
||
82 | if not isinstance(ls,LoadSet): raise TypeError,"unloadf(): arg is not a load-set" |
||
83 | return _Unload(ls)
|
||
84 | |||
85 | def makeLoadSet(name,path): |
||
86 | if sys.modules.has_key(name): return sys.modules[name] |
||
87 | sys.modules[name] = ls = LoadSet(name,path) |
||
88 | return ls
|
||
89 | |||
90 | _reload = reload
|
||
91 | |||
92 | def _do_reload(ls_name,mgr,pkg): |
||
93 | pkg_name = pkg.__name__ |
||
94 | for n in pkg.__dict__.keys(): |
||
95 | e = pkg.__dict__[n] |
||
96 | if isinstance(e,PyJavaClass): |
||
97 | if _is_lazy(e): continue |
||
98 | del pkg.__dict__[n]
|
||
99 | try :
|
||
100 | c = mgr.findClass(pkg_name,n); |
||
101 | if c:
|
||
102 | pkg.__dict__[n] = c |
||
103 | if pkg_name:
|
||
104 | n = ls_name + '.' + pkg_name + '.' + n |
||
105 | else:
|
||
106 | n = ls_name + '.' + n
|
||
107 | if sys.modules.has_key(n): sys.modules[n] = c
|
||
108 | except:
|
||
109 | pass
|
||
110 | elif isinstance(e,PyJavaPackage): |
||
111 | _do_reload(ls_name,mgr,e) |
||
112 | |||
113 | def reload(ls): |
||
114 | if isinstance(ls,LoadSet): |
||
115 | ls._mgr.resetLoader() |
||
116 | _do_reload(ls._name,ls._mgr,ls._top) |
||
117 | return ls
|
||
118 | else:
|
||
119 | return _reload(ls) |