blob: 58973411f4e014bab864360e88237b32199e12a0 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.jdo.exectck;
import java.net.MalformedURLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import javax.jdo.JDOEnhancer;
import javax.jdo.JDOHelper;
/**
* Goal that enhances test classes for testing a JDO implementation.
*
* @goal enhance
*
* @phase integration-test
*/
public class Enhance extends AbstractTCKMojo {
private static final String[] PC_PKG_DIRS = {
"org" + File.separator + "apache" + File.separator + "jdo" + File.separator + "tck" + File.separator + "api" + File.separator,
"org" + File.separator + "apache" + File.separator + "jdo" + File.separator + "tck" + File.separator + "pc" + File.separator,
"org" + File.separator + "apache" + File.separator + "jdo" + File.separator + "tck" + File.separator + "models" + File.separator + "inheritance" + File.separator
};
/**
* Location of TCK generated output.
* @parameter property="jdo.tck.doEnhance"
* default-value="true"
* @required
*/
private boolean doEnhance;
/**
* Root of the TCK source installation.
* @parameter property="project.src.directory"
* default-value="${basedir}/src/main/resources"
* @required
*/
private String srcDirectory;
/**
* List of identity types to be tested.
* @parameter property="jdo.tck.identitytypes"
* default-value="applicationidentity datastoreidentity"
* @required
*/
private String identitytypes;
private Collection<String> idtypes;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if (!doEnhance) {
System.out.println("Skipping Enhance goal!");
return;
}
idtypes = new HashSet<String>();
PropertyUtils.string2Set(identitytypes, idtypes);
// Create directory for enhancer logs
String enhanceLogsDirName = logsDirectory + File.separator + "enhanced";
File enhancerLogsDir = new File(enhanceLogsDirName);
if (!(enhancerLogsDir.exists()) && !(enhancerLogsDir.mkdirs())) {
throw new MojoExecutionException("Failed to create directory "
+ enhancerLogsDir);
}
try {
copyLog4jPropertiesFile();
} catch (IOException ex) {
Logger.getLogger(Enhance.class.getName()).log(Level.SEVERE, null, ex);
}
// Create directory for enhanced classes
String enhancedDirName = buildDirectory + File.separator + "enhanced"
+ File.separator + impl + File.separator;
File enhancedDir = new File(enhancedDirName);
if (!(enhancedDir.exists()) && !(enhancedDir.mkdirs())) {
throw new MojoExecutionException("Failed to create directory "
+ enhancedDir);
}
String[] metadataExtensions = {"jdo", "jdoquery", "orm", "xml", "properties"};
String[] srcDirs = {"jdo", "orm", "testdata"};
File toFile = null;
File fromFile = null;
String fromFileName = null;
String pkgName = null;
int startIdx = -1;
Iterator<File> fi = null;
String[] classArray = new String[10];
String enhancedIdDirName = null;
String classesDirName = buildDirectory + File.separator
+ "classes" + File.separator;
ArrayList<String> classes = null;
// Copy metadata from src to enhanced
for (String idtype : idtypes) {
for (String srcDir : srcDirs) {
String srcDirName = srcDirectory + File.separator + srcDir;
// iterator over list of abs name of metadata files in src
fi = FileUtils.iterateFiles(
new File(srcDirName), metadataExtensions, true);
while (fi.hasNext()) {
try {
fromFile = fi.next();
fromFileName = fromFile.toString();
if ((startIdx = fromFileName.indexOf(idtype + File.separator)) > -1) {
// fully specified name of file (idtype + package + filename)
pkgName = fromFileName.substring(startIdx);
toFile = new File(enhancedDirName + File.separator
+ pkgName);
FileUtils.copyFile(fromFile, toFile);
} else if (srcDir.equals("testdata")) {
startIdx = fromFileName.indexOf("org" + File.separator);
pkgName = fromFileName.substring(startIdx);
toFile = new File(enhancedDirName + File.separator
+ idtype + File.separator + pkgName);
FileUtils.copyFile(fromFile, toFile);
} else {
continue; // idtype not in pathname, do not copy
}
} catch (IOException ex) {
throw new MojoExecutionException("Failed to copy files from "
+ fromFileName + " to " + toFile.toString()
+ ": " + ex.getLocalizedMessage());
}
}
// Copy pc and pa classes from target/classes to enhanced
String[] extensions = {"class"};
enhancedIdDirName = enhancedDirName + idtype + File.separator;
classes = new ArrayList<String>();
for (String pcPkgName : PC_PKG_DIRS) {
// iterator over list of abs name of class files in target/classes
fi = FileUtils.iterateFiles(
new File(classesDirName + pcPkgName), extensions, true);
while (fi.hasNext()) {
try {
fromFile = fi.next();
fromFileName = fromFile.toString();
// fully specified name of file (package + filename)
int index = fromFileName.indexOf(pcPkgName);
if (index == -1) {
throw new MojoExecutionException(
"Cannot get index of package path " + pcPkgName
+ " in file name" + fromFileName);
}
toFile = new File(enhancedIdDirName + fromFileName.substring(index));
FileUtils.copyFile(fromFile, toFile);
classes.add(toFile.toString());
} catch (IOException ex) {
throw new MojoExecutionException("Failed to copy files from "
+ fromFileName + " to " + toFile.toString()
+ ": " + ex.getLocalizedMessage());
}
}
}
}
// Enhance classes
// Build ClassLoader for finding enhancer
URL[] classPathURLs1 = new URL[2];
ArrayList<URL> cpList1 = new ArrayList<URL>();
ClassLoader enhancerLoader = null;
try {
// Must add enhancedIdDirName first!!
cpList1.add((new File(enhancedIdDirName)).toURI().toURL());
for (String dependency : this.dependencyClasspath.split(File.pathSeparator)) {
cpList1.add(new File(dependency).toURI().toURL());
}
enhancerLoader = new URLClassLoader(cpList1.toArray(classPathURLs1),
getClass().getClassLoader());
System.out.println("ClassLoader enhancerLoader:");
Utilities.printClasspath(enhancerLoader);
} catch (MalformedURLException ex) {
Logger.getLogger(Enhance.class.getName()).log(Level.SEVERE, null, ex);
}
// Context classloader for finding log4j.properties
ClassLoader prevCl = Thread.currentThread().getContextClassLoader();
try {
URL enhancedClassesUrl = (new File(enhancedIdDirName)).toURI().toURL();
// Classes dir needed for org.apache.jdo.tck.util.TCKFileAppender
URL classesUrl = (new File(classesDirName)).toURI().toURL();
ClassLoader loggingPropsCl =
URLClassLoader.newInstance(new URL[]{
enhancedClassesUrl, classesUrl}, prevCl);
Thread.currentThread().setContextClassLoader(loggingPropsCl);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ClassLoader ContextClassLoader:");
Utilities.printClasspath(Thread.currentThread().getContextClassLoader());
System.out.println("Get enhancer");
JDOEnhancer enhancer = JDOHelper.getEnhancer(enhancerLoader);
System.out.println("enhancer.setVerbose()");
enhancer.setVerbose(true);
System.out.println("enhancer.setClassLoader()");
enhancer.setClassLoader(enhancerLoader);
String[] classArr = classes.toArray(classArray);
enhancer.addClasses(classArr);
System.out.println("Enhancing classes for identity type " + idtype);
// enhancer needs org/apache/jdo/tck/util/DeepEquality
enhancer.enhance();
Thread.currentThread().setContextClassLoader(prevCl);
// Move log to per-test location
String idname = "dsid";
if (idtype.trim().equals("applicationidentity")) {
idname = "app";
}
String testLogFilename = logsDirectory + File.separator +
"enhanced" + File.separator + idname +
"-" + impl + ".txt";
System.out.println("testLogFilename is " + testLogFilename);
try {
File logFile = new File(implLogFile);
File testLogFile = new File(testLogFilename);
FileUtils.copyFile(logFile, testLogFile);
} catch (Exception e) {
System.out.println(">> Error copying implementation log file: " +
e.getMessage());
}
}
System.out.println("");
}
}