Java tutorial
package au.com.alderaan.eclipselink.mojo; /* * Copyright 2001-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.classworlds.realm.ClassRealm; import org.eclipse.persistence.logging.AbstractSessionLog; import org.eclipse.persistence.logging.SessionLog; import org.eclipse.persistence.tools.weaving.jpa.StaticWeaveProcessor; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * Goal which performs Eclipselink static weaving. * * @author Craig Day <craigday@gmail.com> * @goal weave * @phase process-classes * @requiresDependencyResolution compile */ public class EclipselinkStaticWeaveMojo extends AbstractMojo { /** * @parameter expression="${weave.persistenceInfo}" */ private String persistenceInfo; /** * @parameter expression="${weave.persistenceXMLLocation}" */ private String persistenceXMLLocation; /** * @parameter expression="${project.build.outputDirectory}" */ private String source; /** * @parameter expression="${project.build.outputDirectory}" */ private String target; /** * @parameter default-value="OFF" */ private String logLevel = SessionLog.OFF_LABEL; /** * The maven project descriptor * * @parameter expression="${project}" * @required * @readonly */ private MavenProject project; /** * Include the project output directory and class path. This works around a bug in Eclipselink that uses * {@link Class#forName(String)} without referencing a class loader that knows about project classes. * Offending method is * {@link org.eclipse.persistence.internal.libraries.asm.ClassWriter#getCommonSuperClass(String, String)} * and should be fixed in Eclipselink 2.3.3. * * @parameter default-value="false" */ private boolean includeProjectClasspath = false; public void execute() throws MojoExecutionException { try { if (includeProjectClasspath) { // Thread context class loader is the ClassRealm for this plugin. ClassRealm c = (ClassRealm) Thread.currentThread().getContextClassLoader(); // Add Project output directory to class path. c.addURL(new File(project.getBuild().getOutputDirectory()).toURI().toURL()); // Add Project class path to class path. for (URL url : buildClassPath()) { c.addURL(url); } } StaticWeaveProcessor weave = new StaticWeaveProcessor(source, target); URL[] urls = buildClassPath(); if (urls.length > 0) { URLClassLoader classLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader()); weave.setClassLoader(classLoader); } if (persistenceInfo != null) { weave.setPersistenceInfo(persistenceInfo); } if (persistenceXMLLocation != null) { weave.setPersistenceXMLLocation(persistenceXMLLocation); } weave.setLog(new PrintWriter(System.out)); weave.setLogLevel(getLogLevel()); weave.performWeaving(); } catch (MalformedURLException e) { throw new MojoExecutionException("Failed", e); } catch (IOException e) { throw new MojoExecutionException("Failed", e); } catch (URISyntaxException e) { throw new MojoExecutionException("Failed", e); } } private int getLogLevel() { return AbstractSessionLog.translateStringToLoggingLevel(logLevel); } public void setLogLevel(String logLevel) { if (SessionLog.OFF_LABEL.equalsIgnoreCase(logLevel) || SessionLog.SEVERE_LABEL.equalsIgnoreCase(logLevel) || SessionLog.WARNING_LABEL.equalsIgnoreCase(logLevel) || SessionLog.INFO_LABEL.equalsIgnoreCase(logLevel) || SessionLog.CONFIG_LABEL.equalsIgnoreCase(logLevel) || SessionLog.FINE_LABEL.equalsIgnoreCase(logLevel) || SessionLog.FINER_LABEL.equalsIgnoreCase(logLevel) || SessionLog.FINEST_LABEL.equalsIgnoreCase(logLevel) || SessionLog.ALL_LABEL.equalsIgnoreCase(logLevel)) { this.logLevel = logLevel.toUpperCase(); } else { throw new IllegalArgumentException("Unknown log level: " + logLevel); } } @SuppressWarnings({ "unchecked" }) private URL[] buildClassPath() throws MalformedURLException { List<URL> urls = new ArrayList<URL>(); Set<Artifact> artifacts = (Set<Artifact>) project.getArtifacts(); for (Artifact a : artifacts) { urls.add(a.getFile().toURI().toURL()); } return urls.toArray(new URL[urls.size()]); } }