/*****************************************************************
* 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.cayenne.tools;
import org.apache.cayenne.test.file.FileUtil;
import org.apache.cayenne.test.resource.ResourceUtil;
import org.apache.tools.ant.Location;
import org.apache.tools.ant.Project;
import org.junit.Before;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class CayenneGeneratorTaskTest {
private static final File baseDir;
private static final File map;
private static final File mapEmbeddables;
private static final File template;
static {
baseDir = FileUtil.baseTestDirectory();
map = new File(baseDir, "antmap.xml");
mapEmbeddables = new File(baseDir, "antmap-embeddables.xml");
template = new File(baseDir, "velotemplate.vm");
ResourceUtil.copyResourceToFile("testmap.map.xml", map);
ResourceUtil.copyResourceToFile("embeddable.map.xml", mapEmbeddables);
ResourceUtil.copyResourceToFile("org/apache/cayenne/tools/velotemplate.vm", template);
}
protected CayenneGeneratorTask task;
@Before
public void setUp() {
Project project = new Project();
project.setBaseDir(baseDir);
task = new CayenneGeneratorTask();
task.setProject(project);
task.setTaskName("Test");
task.setLocation(Location.UNKNOWN_LOCATION);
}
/**
* Test single classes with a non-standard template.
*/
@Test
public void testSingleClassesCustTemplate() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "single-classes-custtempl");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(map);
task.setMakepairs(false);
task.setUsepkgpath(true);
task.setTemplate(template.getPath());
// run task
task.execute();
// check results
File a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
assertTrue(a.isFile());
assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/_Artist.java"));
assertFalse(_a.exists());
}
/** Test single classes generation including full package path. */
@Test
public void testSingleClasses1() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "single-classes-tree");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(map);
task.setMakepairs(false);
task.setUsepkgpath(true);
// run task
task.execute();
// check results
File a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
assertTrue(a.isFile());
assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/_Artist.java"));
assertFalse(_a.exists());
}
/** Test single classes generation ignoring package path. */
@Test
public void testSingleClasses2() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "single-classes-flat");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(map);
task.setMakepairs(false);
task.setUsepkgpath(false);
// run task
task.execute();
// check results
File a = new File(mapDir, convertPath("Artist.java"));
assertTrue(a.exists());
assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
File _a = new File(mapDir, convertPath("_Artist.java"));
assertFalse(_a.exists());
File pkga = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
assertFalse(pkga.exists());
}
/**
* Test pairs generation including full package path, default superclass
* package.
*/
@Test
public void testPairs1() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "pairs-tree");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(map);
task.setMakepairs(true);
task.setUsepkgpath(true);
// run task
task.execute();
// check results
File a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
assertTrue(a.isFile());
assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "_Artist");
File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/auto/_Artist.java"));
assertTrue(_a.exists());
assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
}
/** Test pairs generation in the same directory. */
@Test
public void testPairs2() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "pairs-flat");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(map);
task.setMakepairs(true);
task.setUsepkgpath(false);
// run task
task.execute();
// check results
File a = new File(mapDir, convertPath("Artist.java"));
assertTrue(a.isFile());
assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "_Artist");
File _a = new File(mapDir, convertPath("_Artist.java"));
assertTrue(_a.exists());
assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap", "CayenneDataObject");
File pkga = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
assertFalse(pkga.exists());
}
/**
* Test pairs generation including full package path with superclass and
* subclass in different packages.
*/
@Test
public void testPairs3() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "pairs-tree-split");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(map);
task.setMakepairs(true);
task.setUsepkgpath(true);
task.setSuperpkg("org.apache.cayenne.testdo.testmap.superart");
// run task
task.execute();
// check results
File a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/Artist.java"));
assertTrue(a.isFile());
assertContents(a, "Artist", "org.apache.cayenne.testdo.testmap", "_Artist");
File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/testmap/superart/_Artist.java"));
assertTrue(_a.exists());
assertContents(_a, "_Artist", "org.apache.cayenne.testdo.testmap.superart", "CayenneDataObject");
}
@Test
public void testPairsEmbeddable3() throws Exception {
// prepare destination directory
File mapDir = new File(baseDir, "pairs-embeddables3-split");
assertTrue(mapDir.mkdirs());
// setup task
task.setDestDir(mapDir);
task.setMap(mapEmbeddables);
task.setMakepairs(true);
task.setUsepkgpath(true);
task.setSuperpkg("org.apache.cayenne.testdo.embeddable.auto");
// run task
task.execute();
// check entity results
File a = new File(mapDir, convertPath("org/apache/cayenne/testdo/embeddable/EmbedEntity1.java"));
assertTrue(a.isFile());
assertContents(a, "EmbedEntity1", "org.apache.cayenne.testdo.embeddable", "_EmbedEntity1");
File _a = new File(mapDir, convertPath("org/apache/cayenne/testdo/embeddable/auto/_EmbedEntity1.java"));
assertTrue(_a.exists());
assertContents(_a, "_EmbedEntity1", "org.apache.cayenne.testdo.embeddable.auto", "CayenneDataObject");
// check embeddable results
File e = new File(mapDir, convertPath("org/apache/cayenne/testdo/embeddable/Embeddable1.java"));
assertTrue(e.isFile());
assertContents(e, "Embeddable1", "org.apache.cayenne.testdo.embeddable", "_Embeddable1");
File _e = new File(mapDir, convertPath("org/apache/cayenne/testdo/embeddable/auto/_Embeddable1.java"));
assertTrue(_e.exists());
assertContents(_e, "_Embeddable1", "org.apache.cayenne.testdo.embeddable.auto", "Object");
}
private String convertPath(String unixPath) {
return unixPath.replace('/', File.separatorChar);
}
private void assertContents(File f, String className, String packageName, String extendsName) throws Exception {
try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(f)));) {
assertPackage(in, packageName);
assertClass(in, className, extendsName);
}
}
private void assertPackage(BufferedReader in, String packageName) throws Exception {
String s = null;
while ((s = in.readLine()) != null) {
if (Pattern.matches("^package\\s+([^\\s;]+);", s)) {
assertTrue(s.indexOf(packageName) > 0);
return;
}
}
fail("No package declaration found.");
}
private void assertClass(BufferedReader in, String className, String extendsName) throws Exception {
Pattern classPattern = Pattern.compile("^public\\s+");
String s = null;
while ((s = in.readLine()) != null) {
if (classPattern.matcher(s).find()) {
assertTrue(s.indexOf(className) > 0);
assertTrue(s.indexOf(extendsName) > 0);
assertTrue(s.indexOf(className) < s.indexOf(extendsName));
return;
}
}
fail("No class declaration found.");
}
}