Index: api/src/java/javax/jdo/spi/JDOImplHelper.java =================================================================== --- api/src/java/javax/jdo/spi/JDOImplHelper.java (revision 1325829) +++ api/src/java/javax/jdo/spi/JDOImplHelper.java (working copy) @@ -839,7 +839,7 @@ public static Object construct(String className, String keyString) { StringConstructor stringConstructor; try { - Class keyClass = Class.forName(className); + Class keyClass = Class.forName(className); synchronized(stringConstructorMap) { stringConstructor = (StringConstructor) stringConstructorMap.get(keyClass); @@ -847,8 +847,8 @@ if (stringConstructor != null) { return stringConstructor.construct(keyString); } else { - Constructor keyConstructor = - keyClass.getConstructor(new Class[]{String.class}); + Constructor keyConstructor = + keyClass.getConstructor(new Class[]{String.class}); return keyConstructor.newInstance(new Object[]{keyString}); } } catch (JDOException ex) { Index: api/test/java/javax/jdo/ObjectStateTest.java =================================================================== --- api/test/java/javax/jdo/ObjectStateTest.java (revision 1325829) +++ api/test/java/javax/jdo/ObjectStateTest.java (working copy) @@ -215,7 +215,7 @@ } private static Method getDeclaredMethod - (Class clazz, String methodName, Class[] parameters) { + (Class clazz, String methodName, Class[] parameters) { try { Method result = clazz.getDeclaredMethod(methodName, parameters); return result; Index: api/test/java/javax/jdo/util/BatchTestRunner.java =================================================================== --- api/test/java/javax/jdo/util/BatchTestRunner.java (revision 1325829) +++ api/test/java/javax/jdo/util/BatchTestRunner.java (working copy) @@ -111,10 +111,10 @@ String msg = null; try { // get class instance - Class clazz = Class.forName(className); + Class clazz = Class.forName(className); // constructor taking PrintStream arg - Constructor ctor = clazz.getConstructor( - new Class[] { PrintStream.class } ); + Constructor ctor = clazz.getConstructor( + new Class[] { PrintStream.class } ); // create instance return (ResultPrinter)ctor.newInstance( new Object[] { System.out }); Index: exectck/pom.xml =================================================================== --- exectck/pom.xml (revision 1325829) +++ exectck/pom.xml (working copy) @@ -43,7 +43,14 @@ true - + + + + ${basedir}/src/conf + + + + Index: exectck/src/main/java/org/apache/jdo/exectck/Enhance.java =================================================================== --- exectck/src/main/java/org/apache/jdo/exectck/Enhance.java (revision 1325829) +++ exectck/src/main/java/org/apache/jdo/exectck/Enhance.java (working copy) @@ -1,4 +1,3 @@ - package org.apache.jdo.exectck; import java.net.MalformedURLException; @@ -34,7 +33,6 @@ "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 expression="${jdo.tck.doEnhance}" @@ -71,6 +69,13 @@ * @required */ private String impl; + /** + * Location of implementation log file. + * @parameter expression="${jdo.tck.impl.logfile}" + * default-value="${user.dir}/datanucleus.txt" + * @required + */ + private String implLogFile; /** * Location of jar files for implementation under test. * @parameter expression="${project.lib.iut.directory}" @@ -78,8 +83,14 @@ * @required */ private String iutLibsDirectory; - /** + * Location of jar files for implementation under test. + * @parameter expression="${project.lib.iut.directory}" + * default-value="${basedir}/../lib/jdori" + * @required + */ + private String jdoriLibsDirectory; + /** * List of identity types to be tested. * @parameter expression="${jdo.tck.identitytypes}" * default-value="applicationidentity datastoreidentity" @@ -100,7 +111,7 @@ PropertyUtils.string2Set(identitytypes, idtypes); // Create directory for enhancer logs - String enhanceLogsDirName = logsDirectory + File.separator + "enhancer"; + String enhanceLogsDirName = logsDirectory + File.separator + "enhanced"; File enhancerLogsDir = new File(enhanceLogsDirName); if (!(enhancerLogsDir.exists()) && !(enhancerLogsDir.mkdirs())) { throw new MojoExecutionException("Failed to create directory " @@ -121,21 +132,22 @@ File toFile = null; File fromFile = null; String fromFileName = null; - String fromDirName = null; String pkgName = null; int startIdx = -1; Iterator fi = null; String[] classArray = new String[10]; String enhancedIdDirName = null; + String classesDirName = buildDirectory + File.separator + + "classes" + File.separator; ArrayList classes = null; // Copy metadata from src to enhanced for (String idtype : idtypes) { for (String srcDir : srcDirs) { - fromDirName = srcDirectory + File.separator + srcDir; + String srcDirName = srcDirectory + File.separator + srcDir; // iterator over list of abs name of metadata files in src fi = FileUtils.iterateFiles( - new File(fromDirName), metadataExtensions, true); + new File(srcDirName), metadataExtensions, true); while (fi.hasNext()) { try { @@ -165,14 +177,12 @@ // Copy pc and pa classes from target/classes to enhanced String[] extensions = {"class"}; - fromDirName = buildDirectory + File.separator - + "classes" + File.separator; enhancedIdDirName = enhancedDirName + idtype + File.separator; classes = new ArrayList(); for (String pcPkgName : PC_PKG_DIRS) { // iterator over list of abs name of class files in target/classes fi = FileUtils.iterateFiles( - new File(fromDirName + pcPkgName), extensions, true); + new File(classesDirName + pcPkgName), extensions, true); while (fi.hasNext()) { try { fromFile = fi.next(); @@ -181,8 +191,8 @@ int index = fromFileName.indexOf(pcPkgName); if (index == -1) { throw new MojoExecutionException( - "Cannot get index of package path " + pcPkgName + - " in file name" + fromFileName); + "Cannot get index of package path " + pcPkgName + + " in file name" + fromFileName); } toFile = new File(enhancedIdDirName + fromFileName.substring(index)); FileUtils.copyFile(fromFile, toFile); @@ -197,32 +207,106 @@ } // Enhance classes - URL[] classPathURLs = new URL[2]; - ArrayList cpList = new ArrayList(); - ClassLoader loader = null; + + // Build ClassLoader for finding enhancer + URL[] classPathURLs1 = new URL[2]; + ArrayList cpList1 = new ArrayList(); + ClassLoader enhancerLoader = null; try { - cpList.add((new File(enhancedIdDirName)).toURI().toURL()); - cpList.add((new File(fromDirName)).toURI().toURL()); + // Must add enhancedIdDirName first!! + cpList1.add((new File(enhancedIdDirName)).toURI().toURL()); String[] jars = {"jar"}; - if (impl.equals("iut")) { + if (impl.equals("jdori")) { + cpList1.add((new File(jdoriLibsDirectory)).toURI().toURL()); + fi = FileUtils.iterateFiles(new File(jdoriLibsDirectory), jars, true); + while (fi.hasNext()) { + cpList1.add(fi.next().toURI().toURL()); + } + } else { + cpList1.add((new File(iutLibsDirectory)).toURI().toURL()); fi = FileUtils.iterateFiles(new File(iutLibsDirectory), jars, true); while (fi.hasNext()) { - cpList.add(fi.next().toURI().toURL()); + cpList1.add(fi.next().toURI().toURL()); } } - loader = new URLClassLoader(cpList.toArray(classPathURLs), + enhancerLoader = new URLClassLoader(cpList1.toArray(classPathURLs1), getClass().getClassLoader()); - // Utilities.printClasspath(loader); + System.out.println("ClassLoader enhancerLoader:"); + Utilities.printClasspath(enhancerLoader); } catch (MalformedURLException ex) { Logger.getLogger(Enhance.class.getName()).log(Level.SEVERE, null, ex); } - JDOEnhancer enhancer = JDOHelper.getEnhancer(loader); + + // Build ClassLoader with classes to be enhanced +// URL[] classPathURLs2 = new URL[1]; +// ArrayList cpList2 = new ArrayList(); +// ClassLoader classes2BEnhancedLoader = null; +// try { +// cpList2.add((new File(enhancedIdDirName)).toURI().toURL()); +//// cpList2.add((new File(classesDirName)).toURI().toURL()); +// classes2BEnhancedLoader = new URLClassLoader(cpList2.toArray(classPathURLs2), +// getClass().getClassLoader()); +// System.out.println("ClassLoader classes2BEnhancedLoader:"); +// Utilities.printClasspath(classes2BEnhancedLoader); +// } 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 implUrl; + if (impl.equals("jdori")) { + implUrl = (new File(jdoriLibsDirectory)).toURI().toURL(); + } else { + implUrl = (new File(iutLibsDirectory)).toURI().toURL(); + } + 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[]{implUrl, + 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); - enhancer.setClassLoader(loader); + System.out.println("enhancer.setClassLoader()"); +// enhancer.setClassLoader(classes2BEnhancedLoader); + 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); + + // TODO This is only for the RI right now, but could be made to work for UIT + if ("jdori".equals(impl)) { + // 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 + + "-datanucleus.txt"; + System.out.println("testLogFilename is " + testLogFilename); + try { + File logFile = new File(implLogFile); +// FileUtils.moveFile(logFile, new File(testLogFilename)); + FileUtils.copyFile(logFile, new File(testLogFilename)); + } catch (Exception e) { + System.out.println(">> Error moving implementation log file " + + e.getMessage()); + } + } } System.out.println(""); } Index: exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java =================================================================== --- exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java (revision 1325829) +++ exectck/src/main/java/org/apache/jdo/exectck/RunTCK.java (working copy) @@ -24,6 +24,7 @@ import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Properties; @@ -100,8 +101,14 @@ * @required */ private String iutLibsDirectory; - /** + * Location of jar files for implementation under test. + * @parameter expression="${project.lib.iut.directory}" + * default-value="${basedir}/../lib/jdori" + * @required + */ + private String jdoriLibsDirectory; + /** * Name of file in src/conf containing pmf properties. * @parameter expression="${jdo.tck.pmfproperties}" * default-value="jdori-pmf.properties" @@ -297,7 +304,9 @@ alreadyran = false; for (String idtype : idtypes) { - propsString.add("-Djdo.tck.identitytype=" + idtype); + List idPropsString = new ArrayList(); + idPropsString.addAll(propsString); + idPropsString.add("-Djdo.tck.identitytype=" + idtype); String enhancedDirName = buildDirectory + File.separator + "enhanced" + File.separator + impl + File.separator + idtype + File.separator; File enhancedDir = new File(enhancedDirName); @@ -313,6 +322,7 @@ URL url1 = enhancedDir.toURI().toURL(); URL url2 = new File(buildDirectory + File.separator + "classes" + File.separator).toURI().toURL(); + System.out.println("url2 is " + url2.toString()); cpList.add(url1); cpList.add(url2); String[] jars = {"jar"}; @@ -327,6 +337,12 @@ while (fi.hasNext()) { cpList.add(fi.next().toURI().toURL()); } + } else { + fi = FileUtils.iterateFiles( + new File(jdoriLibsDirectory), jars, true); + while (fi.hasNext()) { + cpList.add(fi.next().toURI().toURL()); + } } } catch (MalformedURLException ex) { ex.printStackTrace(); @@ -338,21 +354,22 @@ } for (String cfg : cfgs) { - + List cfgPropsString = new ArrayList(); + cfgPropsString.addAll(idPropsString); // Parse conf file and set properties String props = PropertyUtils.getProperties(confDirectory + File.separator + cfg); - propsString.add("-Djdo.tck.testdata=" + cfgPropsString.add("-Djdo.tck.testdata=" + getTrimmedPropertyValue(props, "jdo.tck.testdata")); - propsString.add("-Djdo.tck.standarddata=" + cfgPropsString.add("-Djdo.tck.standarddata=" + getTrimmedPropertyValue(props, "jdo.tck.standarddata")); - propsString.add("-Djdo.tck.mapping.companyfactory=" + cfgPropsString.add("-Djdo.tck.mapping.companyfactory=" + getTrimmedPropertyValue(props, "jdo.tck.mapping.companyfactory")); -// propsString.append("-Djdo.tck.description=\"" + +// innerPropsString.append("-Djdo.tck.description=\"" + // props.getProperty("jdo.tck.description") + "\""); - propsString.add("-Djdo.tck.requiredOptions=" + cfgPropsString.add("-Djdo.tck.requiredOptions=" + getTrimmedPropertyValue(props, "jdo.tck.requiredOptions")); - propsString.add("-Djdo.tck.signaturefile=" + cfgPropsString.add("-Djdo.tck.signaturefile=" + signaturefile); String mapping = getTrimmedPropertyValue(props, "jdo.tck.mapping"); if (mapping == null) { @@ -374,8 +391,8 @@ } List classesList = Arrays.asList(classes.split(" ")); - propsString.add("-Djdo.tck.schemaname=" + idtype + mapping); - propsString.add("-Djdo.tck.cfg=" + cfg); + cfgPropsString.add("-Djdo.tck.schemaname=" + idtype + mapping); + cfgPropsString.add("-Djdo.tck.cfg=" + cfg); runonce = getTrimmedPropertyValue(props, "runOnce"); runonce = (runonce == null) ? "false" : runonce; @@ -402,7 +419,7 @@ command.add("java"); command.add("-cp"); command.add(cpString); - command.addAll(propsString); + command.addAll(cfgPropsString); command.add(dbproperties); // TODO!!! split jvmproperties into a List!! command.add(jvmproperties); @@ -426,41 +443,41 @@ " with " + idtype + " on '" + db + "'" + " mapping=" + mapping + " ... "); - result = (new Utilities()).invokeTest(command); - if (result.getExitValue() == 0) { - System.out.println("success"); - } else { - System.out.println("FAIL"); - } - - // TODO This is only for the RI right now, but could be made to work for UIT - if ("jdori".equals(impl)) { - // Move log to per-test location - String idname = "dsid"; - if (idtype.trim().equals("applicationidentity")) { - idname = "app"; + try { + result = (new Utilities()).invokeTest(command); + if (result.getExitValue() == 0) { + System.out.println("success"); + } else { + System.out.println("FAIL"); } - String configName = cfg; - if (cfg.indexOf('.') > 0) { - configName = configName.substring(0, cfg.indexOf('.')); - } - String testLogFilename = thisLogDir + - idname + "-" + configName + "-datanucleus.txt"; - try { - File logFile = new File(implLogFile); - FileUtils.moveFile(logFile, new File(testLogFilename)); - } catch (Exception e) { - System.out.println(">> Error moving implementation log file " + - e.getMessage()); - } + if (runtckVerbose) { + System.out.println("\nCommand line is: \n" + command.toString()); + System.out.println("Test exit value is " + result.getExitValue()); + System.out.println("Test result output:\n" + result.getOutputString()); + System.out.println("Test result error:\n" + result.getErrorString()); + } + } catch (java.lang.RuntimeException re) { + System.out.println("Exception on command " + command); } - if (runtckVerbose) { - System.out.println("\nCommand line is: \n" + command.toString()); - System.out.println("Test exit value is " + result.getExitValue()); - System.out.println("Test result output:\n" + result.getOutputString()); - System.out.println("Test result error:\n" + result.getErrorString()); + // Move log to per-test location + String idname = "dsid"; + if (idtype.trim().equals("applicationidentity")) { + idname = "app"; } + String configName = cfg; + if (cfg.indexOf('.') > 0) { + configName = configName.substring(0, cfg.indexOf('.')); + } + String testLogFilename = thisLogDir + + idname + "-" + configName + "-" + impl + ".txt"; + try { + File logFile = new File(implLogFile); + FileUtils.moveFile(logFile, new File(testLogFilename)); + } catch (Exception e) { + System.out.println(">> Error moving implementation log file " + + e.getMessage()); + } if (runonce.equals("true")) { alreadyran = true; Index: exectck/src/main/java/org/apache/jdo/exectck/Utilities.java =================================================================== --- exectck/src/main/java/org/apache/jdo/exectck/Utilities.java (revision 1325829) +++ exectck/src/main/java/org/apache/jdo/exectck/Utilities.java (working copy) @@ -63,7 +63,9 @@ System.out.println(urls.length + " URL(s) for loader: "); for (int i = 0; i < urls.length; i++) { - System.out.println(" " + urls[i].getFile()); + if (urls[i] != null) { + System.out.println(" " + urls[i].getFile()); + } } } Index: pom.xml =================================================================== --- pom.xml (revision 1325829) +++ pom.xml (working copy) @@ -89,6 +89,7 @@ commons-io 1.4 + org.springframework spring-core @@ -154,11 +156,13 @@ commons-logging 1.1 + @@ -209,7 +213,7 @@ mcaisse Michelle Caisse Michelle.Caisse@Sun.COM - Sun Microsystems, Inc. + Apache.org -8 Index: tck/src/conf/log4j.properties =================================================================== --- tck/src/conf/log4j.properties (revision 1325829) +++ tck/src/conf/log4j.properties (working copy) @@ -85,8 +85,8 @@ log4j.additivity.com.mchange.v2 = false # DataNucleus appenders -#log4j.appender.DataNucleus = org.apache.jdo.tck.util.TCKFileAppender -log4j.appender.DataNucleus = org.apache.log4j.FileAppender +log4j.appender.DataNucleus = org.apache.jdo.tck.util.TCKFileAppender +#log4j.appender.DataNucleus = org.apache.log4j.FileAppender log4j.appender.DataNucleus.Enhancer.File = datanucleus.txt log4j.appender.DataNucleus.File = datanucleus.txt log4j.appender.DataNucleus.layout = org.apache.log4j.PatternLayout