I think I'll have to explain that a little more:
The current OSGi-fied version of MyFaces that I've implemented doesn't
save class names in the runtime configuration but rather a combination
of a class name and a class loader.
///
public interface ClassLoader {
public Class loadClass(String className)
throws ClassNotFoundException;
}
/**
* ClassLoader implementation that uses the context class loader
* in order to load Java classes.
*/
public class JavaVmClassLoader implements ClassLoader {
private java.lang.ClassLoader classLoader;
public JavaVmClassLoader(java.lang.ClassLoader classLoader) {
this.classLoader = classLoader;
}
public Class loadClass(String className)
throws ClassNotFoundException {
return Class.forName(className, false, classLoader);
}
}
/**
* ClassLoader implementation that uses an OSGi bundle in order to
* load Java classes.
*/
public class OsgiClassLoader implements ClassLoader {
private Bundle bundle;
public OsgiClassLoader(Bundle bundle) {
this.bundle = bundle;
}
public Class loadClass(String className)
throws ClassNotFoundException {
return bundle.loadClass(className);
}
}
\\\
However, there are other issue as well besides this one (no JSP
available, different approach to resource loading, some dependencies of
MyFaces aren't "OSGi-friendly", ...).
regards,
Bernhard
Bernhard Huemer wrote:
Hello,
well, you can't simply "attach OSGi support" to an existing MyFaces
release. There are dozens of core classes that have to be changed. As
I've already mentioned, currently MyFaces assumes that it's sufficient
to save the class names (e.g. managed bean classes) as every class will
be loaded using the context class loader, but the OSGi-fied version of
MyFaces would also have to save the bundle to use for loading that
class, etc..
Hence I don't think that it's possible to create a new MyFaces commons
module for OSGi support.
regards,
Bernhard
Leonardo Uribe wrote:
Hi
Maybe a new module in myfaces commons is the right place to put this
efforts.
regards
Leonardo Uribe
2009/5/29 Bernhard Huemer <bernhard.hue...@gmail.com
<mailto:bernhard.hue...@gmail.com>>
Hello,
recently I've thought of using JSF in an OSGi environment because of
the greater modularity it would provide for developers. JSF already
provides reusability regarding the user interface, i.e. JSF provides
the possibility to create user interface components, but what do you
do if you want to reuse more aspects of previous applications than
just user interface fragements? How to reuse dialogs, i.e. certain
workflows, etc..?
OSGi already does provide these reusability features and hence I've
adapted MyFaces in a way so that it's runnable in an OSGi container.
Basically you just have to deploy an implementation of the OSGi HTTP
Service (e.g. Pax Web [1]), the two MyFaces bundles (myfaces-api and
myfaces-impl) and your web application bundles. Basically a
BundleListener keeps track of all bundles being deployed to the OSGi
container, so if the user installs a JSF bundle MyFaces gets
notified and merges the current configuration with the configuration
of the new bundle.
However, even though I've been able to implement a running version,
I had to change major parts of MyFaces. For example, using OSGi you
can't use the context class loader if you want to create a new
instance for a class that resides in a different bundle (think of
managed beans, MyFaces is responsible for creating the instance, but
the class file is located in a different bundle) and hence I had to
rewrite the configuration module (e.g. a LifecycleProvider
implementation receives just a class name of the managed bean to
instantiate assuming that it can load the class using the context
class loader, but that won't work in the case of an OSGi
environment).
Therefore I'd like to know if I should start contributing these
changes? (and if so, should I create a different branch at first,
etc.?)
regards,
Bernhard
[1]: http://wiki.ops4j.org/display/paxweb/Pax+Web