svn-gvsig-desktop / tags / v1_1_Build_1010 / extensions / extScripting / scripts / jython / Lib / jreload.py @ 12804
History | View | Annotate | Download (3.55 KB)
1 |
# 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)
|