package org.docbag.creator.fop;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.apache.xmlgraphics.util.MimeConstants;
import org.docbag.Context;
import org.docbag.DefaultContext;
import org.docbag.DocBagConfig;
import org.docbag.chart.jfree.PieChart;
import org.docbag.template.DocumentTemplateStream;
import org.docbag.template.repo.DefaultDocumentTemplateRepository;
import org.docbag.template.transformer.xslt.DefaultXSLTTemplateTransformer;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* FOPDocumentCreatorTest
*
* @author Jakub Torbicki
*/
public class FOPDocumentCreatorTest {
private static Exception exception = null;
private static final FOPDocumentCreator creator = new FOPDocumentCreator(MimeConstants.MIME_PDF, new DefaultXSLTTemplateTransformer(),
DefaultDocumentTemplateRepository.getInstance());
private static final String TEMPLATE = "templates/test-template.html";
private static final int THREADS_NUMBER = 20;
private static final int DOCUMENTS_NUMBER = 100;
private static final Logger Log = LoggerFactory.getLogger(FOPDocumentCreatorTest.class);
private static final Context<String, Object> c = createContext();
private static final String CONFIG_LOCATION = System.getProperty("user.dir") + "/src/test/resources/config/fop.xml";
@Test(expected = NullPointerException.class)
public void testCreateDocumentEmptyName() throws Exception {
new FOPDocumentCreator(null, null, null).createDocument("template");
}
@Test(expected = NullPointerException.class)
public void testCreateDocumentEmptyName2() throws Exception {
new FOPDocumentCreator(null, null, null).createDocument("template", new DefaultContext());
}
@Test(expected = NullPointerException.class)
public void testCreateDocumentEmptyName3() throws Exception {
new FOPDocumentCreator(null, null, null).createDocument(getNullTemplate());
}
@Test(expected = NullPointerException.class)
public void testCreateDocumentEmptyName4() throws Exception {
new FOPDocumentCreator(null, null, null).createDocument(getNullTemplate(), new DefaultContext());
}
@Test(expected = NullPointerException.class)
public void testCreateDocumentEmptyName5() throws Exception {
new FOPDocumentCreator(null, null, null, new DocBagConfig.Builder().withConfig(CONFIG_LOCATION).build()).createDocument(getNullTemplate(), new DefaultContext());
}
@Test
public void testThreadSafety() throws Exception {
System.out.println("Creating " + DOCUMENTS_NUMBER + " documents in " + THREADS_NUMBER + " threads.");
int poolSize = THREADS_NUMBER;
ExecutorService service = Executors.newFixedThreadPool(poolSize);
List<Future<Runnable>> futures = new ArrayList<Future<Runnable>>();
for (int n = 0; n < THREADS_NUMBER; n++) {
Future f = service.submit(new DocumentGenerator());
futures.add(f);
}
for (Future<Runnable> f : futures) {
f.get();
}
service.shutdownNow();
if (exception != null) {
throw exception;
}
}
private static Context<String, Object> createContext() {
Context<String, Object> context = new DefaultContext();
context.put("name", "name");
context.put("chart1", new PieChart.Builder(createPieDataSet()).title("Pie Chart").build());
return context;
}
private static PieDataset createPieDataSet() {
DefaultPieDataset result = new DefaultPieDataset();
result.setValue("A", 33);
result.setValue("B", 33);
result.setValue("C", 34);
return result;
}
public DocumentTemplateStream getNullTemplate() {
return null;
}
private static class DocumentGenerator implements Runnable {
public void run() {
int n = DOCUMENTS_NUMBER / THREADS_NUMBER;
for (int i = 0; i < n; i++) {
try {
creator.createDocument(TEMPLATE, c);
Log.debug(".");
} catch (Exception e) {
exception = e;
break;
}
}
}
}
}