John Rubier wrote:
I just wanted to post this in case anyone else was interested and to draw any criticism about how this could mess something up or trigger armageddon. It allows a list of hivemodule.xml locations to be defined in a .property file.The full-site should compile the code when it is modified. But I have had some problems with this too, so I do a clean-all and then full-site if code changes are not compiled. Apparently Howard is not happy with Maven and so adding new goals will have to come from someone else, I guess ;)
I reason I wanted this was because I really wanted to split up the descriptors but still wanted all the code in the same
Eclipse project.
I realize now that I'm done that I could have used RegistryBuilder.processModule from code but I learned more about the enemy..err..classloaders this way.
Also, I grabbed the latest cvs, but I can't find a maven target that actually compiles code. It will build dist jars but
they have no code...?
-Harish
Take care,
John
------------------------------------------------------------------------
package us.insurgent.hivemind;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Vector;
import org.apache.commons.hivemind.impl.RegistryBuilder;
/**
*
* Allows multiple hivemodule.xml files to be defined in
* META-INF/hivemodulelist.properties so that the module definitions can have
* different names and exist in different locations in the classpath.
* <p>
* The regular META-INF/hivemodule.xml files are still found by the parent
* classload(s) and are not (hopefully) duplicated here. Hivemind will generate
* a warning and pick one to use if it does.
* <p>
* hivemodulelist.properties:
* <pre>
* core=META-INF/hivemodule-core.xml
* module2=META-INF/hivemodule-module2.xml
* module3=/com/example/module3/foomodule.xml
* </pre>
* <p>
* The key names in the properties file are irrelevant but must be unique.
* <p>
* The modulename.properties file should be co-located with the modulename.xml.
* Hivemind seems to find them OK.
* <p>
* Multiple META-INF/hivemodulelist.properties files in the classpath can be
* found and will be processed.
* <p>
* Example usage:
* <pre>
* ClassResolver resolver = new DefaultClassResolver(new HiveModuleListClassLoader());
* RegistryBuilder builder = new RegistryBuilder();
* ...
* </pre>
*
* @author John Rubier
*
*/
public class HiveModuleListClassLoader extends ClassLoader {
ClassLoader _parent;
public static final String HIVE_MODULE_LIST = "META-INF/hivemodulelist.properties";
public HiveModuleListClassLoader() {
super();
_parent = super.getParent();
}
public HiveModuleListClassLoader(ClassLoader parent) {
super(parent);
_parent = parent;
findResource("test");
}
/**
* Finds and parses hivemodulelist.properties file for hivemodule locations
* when called with
* [EMAIL PROTECTED] org.apache.commons.hivemind.impl.RegistryBuilder#HIVE_MODULE}
*
* @see java.lang.ClassLoader#findResources(java.lang.String)
*
*/
protected Enumeration findResources(String name) throws IOException {
if (_parent != null && name.equals(RegistryBuilder.HIVE_MODULE)) {
Enumeration moduleLists = _parent.getResources(HIVE_MODULE_LIST);
Vector modules = new Vector();
while (moduleLists.hasMoreElements()) {
URL descriptorURL = (URL) moduleLists.nextElement();
InputStream stream = descriptorURL.openStream();
Properties props = new Properties();
props.load(stream);
stream.close();
for (Iterator iter = props.entrySet().iterator(); iter
.hasNext();) {
String element = (String) ((Map.Entry) iter.next())
.getValue();
URL module = _parent.getResource(element);
if (module != null) {
modules.add(module);
}
}
}
return modules.elements();
}
return null;
}
}
------------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]