You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

jreload.py 3.7KB

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