Author: jochen Date: Wed Dec 14 12:59:40 2005 New Revision: 356867 URL: http://svn.apache.org/viewcvs?rev=356867&view=rev Log: Fixed ClassLoader issues with custom SG factory chains.
Modified: webservices/jaxme/trunk/ws-jaxme/maven-jaxme-plugin/src/main/java/org/apache/ws/jaxme/maven/plugins/JaxMeGoal.java Modified: webservices/jaxme/trunk/ws-jaxme/maven-jaxme-plugin/src/main/java/org/apache/ws/jaxme/maven/plugins/JaxMeGoal.java URL: http://svn.apache.org/viewcvs/webservices/jaxme/trunk/ws-jaxme/maven-jaxme-plugin/src/main/java/org/apache/ws/jaxme/maven/plugins/JaxMeGoal.java?rev=356867&r1=356866&r2=356867&view=diff ============================================================================== --- webservices/jaxme/trunk/ws-jaxme/maven-jaxme-plugin/src/main/java/org/apache/ws/jaxme/maven/plugins/JaxMeGoal.java (original) +++ webservices/jaxme/trunk/ws-jaxme/maven-jaxme-plugin/src/main/java/org/apache/ws/jaxme/maven/plugins/JaxMeGoal.java Wed Dec 14 12:59:40 2005 @@ -16,7 +16,11 @@ package org.apache.ws.jaxme.maven.plugins; import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.apache.maven.model.Resource; @@ -45,11 +49,20 @@ * @requiresDependencyResolution test */ public class JaxMeGoal extends AbstractMojo { + /** Specifies classpath elements, which should be added to + * the plugins classpath. + * @parameter expression="${project.compileClasspathElements}" + * @required + * @readonly + */ + private List classpathElements; + /** This property specifies a set of files, which * are referenced from within the XML schema files, * but aren't processed as XML schema files for * themselves. Specifying files in the "depends" set * allows to include them into the uptodate check. + * @parameter */ private String[] depends; @@ -84,11 +97,14 @@ * produces files will also be used for removing old * files, if the "removeOldOutput" feature is turned * on. + * @parameter */ private String[] produces; /** The Maven project. * @parameter expression="${project}" + * @required + * @readonly */ private MavenProject project; @@ -116,7 +132,7 @@ * The default changes, if "extension" is set to true, * in which case the [EMAIL PROTECTED] JaxMeSchemaReader} is being * used. - * @parameter expression="org.apache.ws.jaxme.generator.sg.impl.JAXBSchemaReader" + * @parameter */ private String schemaReader; @@ -130,6 +146,7 @@ * generator. Factory chains are modifying the generators * behaviour. A good example is the * <code>org.apache.ws.jaxme.pm.generator.jdbc.JaxMeJdbcSG</code>. + * @parameter */ private String[] sgFactoryChain; @@ -150,6 +167,10 @@ */ private boolean validating; + protected List getClasspathElements() { + return classpathElements; + } + protected String[] getDepends() { return depends; } @@ -208,7 +229,17 @@ } private File[] getProducedFiles() { - return getFiles(getProduces()); + String[] prdcs = getProduces(); + if (prdcs == null) { + String t1 = getSrcTarget(); + String t2 = getResourceTarget(); + if (t2 == null) { + prdcs = new String[]{t1}; + } else { + prdcs = new String[]{t1, t2}; + } + } + return getFiles(prdcs); } private File[] getFiles(String[] pSpec) { @@ -313,10 +344,11 @@ } } - private Class getSgFactoryChainClass(String pClass) throws MojoFailureException { + private Class getSgFactoryChainClass(String pClass) + throws MojoFailureException { Class c; try { - c = Class.forName(pClass); + c = Thread.currentThread().getContextClassLoader().loadClass(pClass); } catch (ClassNotFoundException e) { throw new MojoFailureException("The factory chain class " + pClass + " was not found."); } @@ -327,9 +359,52 @@ return c; } + private ClassLoader getClassLoader(ClassLoader pParent) throws MojoFailureException { + List clElements = getClasspathElements(); + if (clElements == null && clElements.size() == 0) { + return pParent; + } + URL[] urls = new URL[clElements.size()]; + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < clElements.size(); i++) { + final String elem = (String) clElements.get(i); + File f = new File(elem); + if (!f.isAbsolute()) { + f = new File(getProject().getBasedir(), elem); + } + try { + urls[i] = f.toURL(); + } catch (MalformedURLException e) { + throw new MojoFailureException("Invalid classpath element: " + elem); + } + if (i > 0) { + sb.append(File.pathSeparator); + } + sb.append(urls[i]); + } + getLog().debug("Using classpath " + sb); + return new URLClassLoader(urls, pParent); + } + private SchemaReader getSchemaReaderInstance() throws MojoFailureException, MojoExecutionException { - String s = getSchemaReader(); + final SchemaReader result = newSchemaReaderInstance(); + getLog().debug("Schema reader class: " + result.getClass().getName()); + + String[] chains = getSgFactoryChain(); + if (chains != null) { + for (int i = 0; i < chains.length; i++) { + Class c = getSgFactoryChainClass(chains[i]); + getLog().debug("Adding SG Factory chain: " + c.getName()); + result.addSGFactoryChain(c); + } + } + + return result; + } + + private SchemaReader newSchemaReaderInstance() throws MojoFailureException, MojoExecutionException { final SchemaReader result; + final String s = getSchemaReader(); if (s == null || s.length() == 0) { if (isExtension()) { result = new JaxMeSchemaReader(); @@ -339,7 +414,7 @@ } else { Class c; try { - c = Class.forName(s); + c = Thread.currentThread().getContextClassLoader().loadClass(s); } catch (ClassNotFoundException e) { throw new MojoFailureException("The schema reader class " + s + " was not found."); } @@ -358,15 +433,6 @@ + " is not implementing " + SchemaReader.class.getName()); } } - - String[] chains = getSgFactoryChain(); - if (chains != null) { - for (int i = 0; i < chains.length; i++) { - Class c = getSgFactoryChainClass(chains[i]); - result.addSGFactoryChain(c); - } - } - return result; } @@ -387,6 +453,8 @@ } public void execute() throws MojoExecutionException, MojoFailureException { + ClassLoader oldCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(getClassLoader(SchemaReader.class.getClassLoader())); LoggerFactory lf = LoggerAccess.getLoggerFactory(); try { LoggerAccess.setLoggerFactory(new LoggerFactory(){ @@ -436,6 +504,7 @@ resource.setDirectory(getResourceTarget()); getProject().addResource(resource); } finally { + Thread.currentThread().setContextClassLoader(oldCl); LoggerAccess.setLoggerFactory(lf); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]