From: <Mat...@i2...> - 2002-09-27 21:48:53
|
On 09/27/2002 01:58:34 PM "Samuele Pedroni" wrote: > > do you do it only for classes or also for packages ? do you create > corresponding packages then? > at which level do you delegate ? I do it only for classes/javapackages - basically, I do the follwoing: 1) init jython 2) get default sys (rootSys) and its packageManager 3) replace rootSys.packageManager with MyPackageManager created with original rootSys.packageManager as its parent. MyPackageManager derives from SysPackageManager, and overrides lookupName(), delegating to its parent, and only looking in self if not found in parent. This seems to work, but I haven't done exhaustive testing yet, so I may be missing something else that needs to be overriden/tweaked ... any thoughts there ? 4) set rootSys.classLoader with MyClassLoader (URLClassloader derivation) which has current classloader as its parent, and has an addURL method which adds classpath entry to classloader and also adds to associated packagemanager. 5) Each new top level interpreter gets a new PySystemState whose classloader/packageManager is set in the same way, but with rootSys' classloader/packageManager as its parent. If an interpreter is created as a child of a another interpreter (convenience jython method defined for doing so), it gets that interpreter's sys.classLoader/packageManager as the parents for its own. I don't do any delegation for python modules, though I may do so in the future to maintain consistency - not as much need for them due to reload(), plus imports are expensive, so this way I can globally cache them by replacing builtin import (sys.modules as cache doesn't work due to different sys instance for each interpreter.) This all allows me to dynamically add classpath entries locally to each interpreter, with isolation between the interpreters, as well as to dynamically add classpath entries globally (by adding to rootSys.classloader). > honestly I don't believe anymore in hardcoding assumptions about importing or > what people want. Heh, I understand that sentiment... =) > I'm leaning toward in 2.2 to make all hardcoded assumptions and policies > hookable, through re/binding functions in sys or sys.packageManager on Jython > side and through instances implementing a policy interface on Java side to > which the PackageManagers will delegate policy decisions (how to do dir, what > is a java package etc) ... OTOH the PackageMangers hierachy will mostly go > away, it seems nobody has subclassed it, apart me in jreload (I should see how > to deal with that). > > For example the cache will decoupled from the PackageManagers and maybe > implemented (apart from hotspots (scanning?)) in Jython. > > All that said, the behavior out-of-the box will be mostly same, but internally > it will be implemented differently. Sounds good - Its usually a good policy to have customizable behavior with reasonable defaults. Matt |
From: <Mat...@i2...> - 2002-09-27 22:25:42
|
On 09/27/2002 05:44:13 PM jython-dev-admin wrote: > > I don't know if that happens from this description, but if you let not only > classes but javapackages migrate from parent to child you will maybe end up > with the problem you are trying to avoid. It really depends on what you do > exactly but in general if a package defined in parent migrate to child1 and > child2, then changes done to it in child1 will be visible in child2... Yes, this is desired behavior - just like in java classloaders, if in a child classloader you change a static variable of a class in parent classloader, all children see that change. Of course, jython is a lot more dynamic than java, so a lot more damage is possible ;-) However, the tool I have written is mostly for java programmers, so they all are pretty familiar with this concept and its easy to explain, so coder beware =) Since this made the performance a lot better, it is a tradeoff I am willing to live with. Thanks for the concern though. Matt |
From: Samuele P. <ped...@bl...> - 2002-09-27 21:56:47
|
From: <Mat...@i2...> > On 09/27/2002 01:58:34 PM "Samuele Pedroni" wrote: > > > > do you do it only for classes or also for packages ? do you create > > corresponding packages then? > > at which level do you delegate ? > > I do it only for classes/javapackages - basically, I do the follwoing: > > 1) init jython > > 2) get default sys (rootSys) and its packageManager > > 3) replace rootSys.packageManager with MyPackageManager created with > original rootSys.packageManager as its parent. MyPackageManager derives > from SysPackageManager, and overrides lookupName(), delegating to its > parent, and only looking in self if not found in parent. This seems to > work, but I haven't done exhaustive testing yet, so I may be missing > something else that needs to be overriden/tweaked ... any thoughts there ? I don't know if that happens from this description, but if you let not only classes but javapackages migrate from parent to child you will maybe end up with the problem you are trying to avoid. It really depends on what you do exactly but in general if a package defined in parent migrate to child1 and child2, then changes done to it in child1 will be visible in child2... regards. |