OPENJPA-2409 enable persistenceXmlFile parameter to handle classpath resources as well.

contributed by rmannibucau, txs!
applied with small changes and doc improvements


git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/2.3.x@1533462 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mark Struberg 2013-10-18 14:11:53 +00:00
parent 1da1af03ca
commit 722edd01da
4 changed files with 97 additions and 9 deletions

View File

@ -100,7 +100,7 @@ public abstract class AbstractOpenJpaEnhancerMojo extends AbstractOpenJpaMojo {
* *
* @return populated Options * @return populated Options
*/ */
protected Options getOptions() { protected Options getOptions() throws MojoExecutionException {
// options // options
Options opts = createOptions(); Options opts = createOptions();

View File

@ -28,6 +28,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
@ -41,6 +42,16 @@ import org.codehaus.plexus.util.FileUtils;
*/ */
public abstract class AbstractOpenJpaMojo extends AbstractMojo public abstract class AbstractOpenJpaMojo extends AbstractMojo
{ {
/**
* The working directory for putting persistence.xml and
* other stuff into if we need to.
*
*
* @parameter expression="${openjpa.workdir}"
* default-value="${project.build.directory}/openjpa-work"
* @required
*/
protected File workDir;
/** /**
* Location where <code>persistence-enabled</code> classes are located. * Location where <code>persistence-enabled</code> classes are located.
@ -79,8 +90,9 @@ public abstract class AbstractOpenJpaMojo extends AbstractMojo
/** /**
* Used if a non-default file location for the persistence.xml should be used * Used if a non-default file location for the persistence.xml should be used
* If not specified, the default one in META-INF/persistence.xml will be used. * If not specified, the default one in META-INF/persistence.xml will be used.
* Please note that this is not a resource location but a file path! * Since openjpa-2.3.0 this can also be a resource location. In prior releases
* * it was only possible to specify a file location.
*
* @parameter * @parameter
*/ */
private String persistenceXmlFile; private String persistenceXmlFile;
@ -206,7 +218,7 @@ public abstract class AbstractOpenJpaMojo extends AbstractMojo
* Get the options for the various OpenJPA tools. * Get the options for the various OpenJPA tools.
* @return populated Options * @return populated Options
*/ */
protected abstract Options getOptions(); protected abstract Options getOptions() throws MojoExecutionException;
/** /**
* <p>Determine if the mojo execution should get skipped.</p> * <p>Determine if the mojo execution should get skipped.</p>
@ -240,7 +252,7 @@ public abstract class AbstractOpenJpaMojo extends AbstractMojo
* This function will usually get called by {@link #getOptions()} * This function will usually get called by {@link #getOptions()}
* @return the Options filled with the initial values * @return the Options filled with the initial values
*/ */
protected Options createOptions() protected Options createOptions() throws MojoExecutionException
{ {
Options opts = new Options(); Options opts = new Options();
if ( toolProperties != null ) if ( toolProperties != null )
@ -250,8 +262,18 @@ public abstract class AbstractOpenJpaMojo extends AbstractMojo
if ( persistenceXmlFile != null ) if ( persistenceXmlFile != null )
{ {
fixPersistenceXmlIfNeeded(Thread.currentThread().getContextClassLoader());
opts.put( OPTION_PROPERTIES_FILE, persistenceXmlFile ); opts.put( OPTION_PROPERTIES_FILE, persistenceXmlFile );
getLog().debug( "using special persistence XML file: " + persistenceXmlFile ); getLog().debug("using special persistence XML file: " + persistenceXmlFile);
}
else if (!new File(classes, "META-INF/persistence.xml").exists())
{ // use default but try from classpath
persistenceXmlFile = "META-INF/persistence.xml";
if (!fixPersistenceXmlIfNeeded(Thread.currentThread().getContextClassLoader())) {
persistenceXmlFile = null;
} else {
opts.put( OPTION_PROPERTIES_FILE, persistenceXmlFile );
}
} }
if ( connectionDriverName != null ) if ( connectionDriverName != null )
@ -266,7 +288,71 @@ public abstract class AbstractOpenJpaMojo extends AbstractMojo
return opts; return opts;
} }
/**
*
*
* @param loader
* @return
* @throws MojoExecutionException
*/
private boolean fixPersistenceXmlIfNeeded(final ClassLoader loader) throws MojoExecutionException
{
return !new File(persistenceXmlFile).exists() &&
(findPersistenceXmlFromLoader(loader)
|| findPersistenceXmlInArtifacts(project.getCompileArtifacts())
|| findPersistenceXmlInArtifacts(project.getRuntimeArtifacts()));
}
private boolean findPersistenceXmlFromLoader(final ClassLoader loader) throws MojoExecutionException {
final URL url = loader.getResource(persistenceXmlFile);
if (url != null) // copy file to be sure to set persistenceXmlFile to a file
{
final File tmpPersistenceXml = new File(workDir,
"persistence" + System.currentTimeMillis() + ".xml");
if (!tmpPersistenceXml.getParentFile().exists() && !tmpPersistenceXml.getParentFile().mkdirs())
{
throw new MojoExecutionException("Can't create "
+ tmpPersistenceXml.getParentFile().getAbsolutePath());
}
try
{
FileUtils.copyURLToFile(url, tmpPersistenceXml);
}
catch (final IOException e)
{
throw new MojoExecutionException(e.getMessage(), e);
}
persistenceXmlFile = tmpPersistenceXml.getAbsolutePath();
return true;
}
return false;
}
private boolean findPersistenceXmlInArtifacts(final List<Artifact> artifacts) throws MojoExecutionException {
for (final Artifact artifact : artifacts) {
final File file = artifact.getFile();
if (file != null && file.exists())
{
try // find the persistence.xml using a fake classloader to not need to play with URLs
{
if (findPersistenceXmlFromLoader(new URLClassLoader(new URL[] { file.toURI().toURL() },
ClassLoader.getSystemClassLoader())))
{
return true;
}
}
catch (final MalformedURLException e)
{
// no-op
}
}
}
return false;
}
/** /**
* This will prepare the current ClassLoader and add all jars and local * This will prepare the current ClassLoader and add all jars and local
* classpaths (e.g. target/classes) needed by the OpenJPA task. * classpaths (e.g. target/classes) needed by the OpenJPA task.

View File

@ -21,6 +21,7 @@ package org.apache.openjpa.tools.maven;
import java.io.File; import java.io.File;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.openjpa.lib.util.Options; import org.apache.openjpa.lib.util.Options;
/** /**
@ -72,7 +73,7 @@ public class OpenJpaSchemaMojo extends AbstractOpenJpaMappingToolMojo {
/** /**
* @return Options filled with all necessary plugin parameters * @return Options filled with all necessary plugin parameters
*/ */
protected Options getOptions() { protected Options getOptions() throws MojoExecutionException {
// options // options
Options opts = createOptions(); Options opts = createOptions();

View File

@ -21,6 +21,7 @@ package org.apache.openjpa.tools.maven;
import java.io.File; import java.io.File;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.openjpa.lib.util.Options; import org.apache.openjpa.lib.util.Options;
/** /**
@ -86,7 +87,7 @@ public class OpenJpaSqlMojo extends AbstractOpenJpaMappingToolMojo {
/** /**
* @return Options filled with all necessary plugin parameters * @return Options filled with all necessary plugin parameters
*/ */
protected Options getOptions() { protected Options getOptions() throws MojoExecutionException {
// options // options
Options opts = createOptions(); Options opts = createOptions();