/*
* Copyright [2014] [Christian Loehnert, krampenschiesser@gmail.com]
* 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.
*/
package de.ks.idnadrev.expimp.xls;
import de.ks.LauncherRunner;
import de.ks.idnadrev.entity.Cleanup;
import de.ks.idnadrev.entity.Tag;
import de.ks.idnadrev.entity.Task;
import de.ks.idnadrev.entity.Thought;
import de.ks.idnadrev.expimp.EntityExportSource;
import de.ks.persistence.PersistentWork;
import de.ks.reflection.PropertyPath;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import java.io.File;
import java.sql.Timestamp;
import java.util.*;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.junit.Assert.*;
@RunWith(LauncherRunner.class)
public class XlsxExporterTest {
private static final Logger log = LoggerFactory.getLogger(XlsxExporterTest.class);
public static final int COUNT = 142;
@Inject
protected Cleanup cleanup;
@Before
public void setUp() throws Exception {
cleanup.cleanup();
PersistentWork.run(em -> {
for (int i = 0; i < COUNT; i++) {
em.persist(new Thought(String.format("Thought%03d", i)));
}
Tag tag1 = new Tag("tag" + ToManyColumn.SEPARATOR + "1");
Tag tag2 = new Tag("tag2");
Task testTask = new Task("testTask");
testTask.addTag(tag1);
testTask.addTag(tag2);
em.persist(testTask);
});
}
protected List<Long> getAllIds() {
return PersistentWork.read(em -> {
CriteriaQuery<Long> criteriaQuery = em.getCriteriaBuilder().createQuery(Long.class);
Root<Thought> root = criteriaQuery.from(Thought.class);
Path<Long> id = root.<Long>get("id");
criteriaQuery.select(id);
return em.createQuery(criteriaQuery).getResultList();
});
}
@Test
public void testExportThoughts() throws Exception {
File tempFile = File.createTempFile("thoughtExport", ".xlsx");
EntityExportSource<Thought> source = new EntityExportSource<>(getAllIds(), Thought.class);
XlsxExporter exporter = new XlsxExporter();
exporter.export(tempFile, source);
Workbook wb = WorkbookFactory.create(tempFile);
Sheet sheet = wb.getSheetAt(0);
assertEquals(Thought.class.getName(), sheet.getSheetName());
int lastRowNum = sheet.getLastRowNum();
assertEquals(COUNT, lastRowNum);
Row firstRow = sheet.getRow(0);
ArrayList<String> titles = new ArrayList<>();
firstRow.cellIterator().forEachRemaining(col -> titles.add(col.getStringCellValue()));
assertThat(titles.size(), greaterThanOrEqualTo(3));
log.info("Found titles {}", titles);
String creationTime = PropertyPath.property(Thought.class, t -> t.getCreationTime());
String name = PropertyPath.property(Thought.class, t -> t.getName());
String description = PropertyPath.property(Thought.class, t -> t.getDescription());
assertTrue(titles.contains(creationTime));
assertTrue(titles.contains(name));
assertTrue(titles.contains(description));
int nameColumn = titles.indexOf(name);
ArrayList<String> names = new ArrayList<String>(COUNT);
for (int i = 1; i <= COUNT; i++) {
Row row = sheet.getRow(i);
names.add(row.getCell(nameColumn).getStringCellValue());
}
Collections.sort(names);
assertEquals("Thought000", names.get(0));
assertEquals("Thought141", names.get(COUNT - 1));
Date excelDate = sheet.getRow(1).getCell(titles.indexOf(creationTime)).getDateCellValue();
Thought thought = PersistentWork.forName(Thought.class, "Thought000");
Timestamp timestamp = java.sql.Timestamp.valueOf(thought.getCreationTime());
Date creationDate = new Date(timestamp.getTime());
assertEquals(creationDate, excelDate);
}
@Test
public void testExportToManyRelation() throws Exception {
File tempFile = File.createTempFile("taskExportTest", ".xlsx");
EntityExportSource<Task> tasks = new EntityExportSource<>(PersistentWork.idsFrom(Task.class), Task.class);
EntityExportSource<Tag> tags = new EntityExportSource<>(PersistentWork.idsFrom(Tag.class), Tag.class);
XlsxExporter exporter = new XlsxExporter();
exporter.export(tempFile, tasks, tags);
Workbook wb = WorkbookFactory.create(tempFile);
Sheet taskSheet = wb.getSheet(Task.class.getName());
Sheet tagSheet = wb.getSheet(Tag.class.getName());
assertNotNull(taskSheet);
assertNotNull(tagSheet);
Row firstRow = taskSheet.getRow(0);
int pos = 0;
Iterator<Cell> cellIterator = firstRow.cellIterator();
String property = PropertyPath.property(Task.class, t -> t.getTags());
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if (cell.getStringCellValue().equals(property)) {
break;
}
pos++;
}
assertNotEquals(Task.class.getSimpleName() + "." + property + " not exported", firstRow.getLastCellNum(), pos);
Cell cell = taskSheet.getRow(1).getCell(pos);
String[] split = StringUtils.split(cell.getStringCellValue(), ToManyColumn.SEPARATOR);
assertEquals(2, split.length);
assertTrue(Arrays.asList(split).contains("tag" + ToManyColumn.SEPARATOR_REPLACEMENT + "1"));
assertTrue(Arrays.asList(split).contains("tag2"));
}
}