blob: 6be3700936da7fb914663b8ff8fc82cdd939a91e [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.sdo.helper.classgen;
import java.io.File;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.sdo.helper.ClassBuffer;
import org.eclipse.persistence.sdo.helper.SDOClassGenerator;
import org.eclipse.persistence.testing.sdo.helper.xmlhelper.SDOXMLHelperTestCases;
import org.eclipse.persistence.testing.sdo.util.CompileUtil;
public abstract class SDOClassGenTestCases extends SDOXMLHelperTestCases {
protected SDOClassGenerator classGenerator;
protected String xsdString;
/** Cache the packageNames ArrayList for memory performance improvement, fileNames should be optimized as well*/
protected List<String> packageNames;
public SDOClassGenTestCases(String name) {
super(name);
}
@Override
public void setUp() {
super.setUp();
File f = new File(getSourceFolder());
emptyAndDeleteDirectory(f);
xsdString = getSchema(getSchemaName());
classGenerator = new SDOClassGenerator(aHelperContext);
}
@Override
public void tearDown() throws Exception{
super.tearDown();
List<String> packages = getPackages();
for (int i = 0; i < getFileNamesToCompile().size(); i++) {
String nextFileName = getFileNamesToCompile().get(i);
String nextPackageDir = packages.get(i);
StringBuffer fullJavaName = new StringBuffer(getControlSourceFolder());
fullJavaName.append("/");
fullJavaName.append(nextPackageDir);
fullJavaName.append("/");
fullJavaName.append(nextFileName);
File f = new File(fullJavaName.toString().replace(".java", ".class"));
if(f.exists()){
f.delete();
}
}
}
protected abstract String getSourceFolder();
protected abstract String getControlSourceFolder();
protected abstract String getSchemaName();
protected abstract List<String> getControlFileNames();
protected HashMap<String, String> getGeneratedFiles(Map<Object, ClassBuffer> generatedBuffers) {
HashMap<String, String> generatedFiles = new HashMap<String, String>();
Iterator<Object> keysIter = generatedBuffers.keySet().iterator();
while (keysIter.hasNext()) {
Object nextKey = keysIter.next();
ClassBuffer next = generatedBuffers.get(nextKey);
generatedFiles.put(Helper.getShortClassName(next.getSdoType().getInstanceClassName()) + ".java", next.getInterfaceBuffer().toString());
generatedFiles.put(Helper.getShortClassName(next.getSdoType().getImplClassName()) +".java", next.getClassBuffer().toString());
}
return generatedFiles;
}
protected HashMap<String, String> getControlFiles() {
HashMap<String, String> controlFiles = new HashMap<String, String>();
List<String> controlFileNames = getControlFileNames();
List<String> packages = getPackages();
for (int i = 0; i < controlFileNames.size(); i++) {
String nextFileName = controlFileNames.get(i);
String nextPackageDir = packages.get(i);
StringBuffer fullName = new StringBuffer(getControlSourceFolder());
fullName.append("/");
fullName.append(nextPackageDir);
fullName.append("/");
fullName.append(nextFileName);
String classContents = getSchema(fullName.toString());
controlFiles.put(nextFileName, classContents);
}
return controlFiles;
}
// Override package generation based on the JAXB 2.0 algorithm in SDOUtil.java
protected List<String> getPackages() {
if(null != packageNames && packageNames.size() > 0) {
return packageNames;
} else {
packageNames = new ArrayList<String>();
for(int i = 0;i < getControlFileNames().size();i++) {
packageNames.add(NON_DEFAULT_JAVA_PACKAGE_DIR);
}
}
return packageNames;
}
protected void compareFiles(HashMap<String, String> controlFiles, HashMap<String, String> generatedFiles) {
assertEquals(controlFiles.size(), generatedFiles.size());
Iterator<String> keysIter = controlFiles.keySet().iterator();
while (keysIter.hasNext()) {
String nextKey = keysIter.next();
String nextControlValue = removeCopyrightFromString(controlFiles.get(nextKey));
String nextGeneratedValue = generatedFiles.get(nextKey);
assertNotNull(nextControlValue);
assertNotNull(nextGeneratedValue);
// convert ignoreCRLF
assertStringsEqual(nextControlValue.trim(), nextGeneratedValue.trim());
}
}
protected List<String> getFileNamesToCompile(){
return getControlFileNames();
}
public void compileFiles(){
Object[] javaFiles = new Object[getFileNamesToCompile().size()];
List<String> packages = getPackages();
for (int i = 0; i < getFileNamesToCompile().size(); i++) {
String nextFileName = getFileNamesToCompile().get(i);
String nextPackageDir = packages.get(i);
StringBuffer fullName = new StringBuffer(getControlSourceFolder());
fullName.append("/");
fullName.append(nextPackageDir);
fullName.append("/");
fullName.append(nextFileName);
javaFiles[i] = fullName.toString();
}
int returnVal = CompileUtil.instance().compile(classgenCompilePath, javaFiles);
assertEquals(0, returnVal);
}
// The following test case is out of scope for ClassGenElements - we let it fail with a NPE that generates an empty xsdString for this suite
public void testClassGen() throws Exception {
//compileFiles(getControlSourceFolder() + "/" + getPackageDir());
compileFiles();
StringReader reader = new StringReader(xsdString);
classGenerator.generate(reader, getSourceFolder());
int numGenerated = classGenerator.getGeneratedBuffers().size();
assertEquals(getControlFileNames().size() / 2, numGenerated);
compareFiles(getControlFiles(), getGeneratedFiles(classGenerator.getGeneratedBuffers()));
}
}