Statistics
| Revision:

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)