package org.docbag.template.transformer.velocity;
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.docbag.Context;
import org.docbag.DefaultContext;
import org.docbag.template.DocumentTemplateStream;
import org.docbag.template.repo.DefaultDocumentTemplateRepository;
import org.docbag.template.repo.DocumentTemplateRepository;
import org.junit.Test;
/**
* VelocityTemplateTransformerTest
*
* @author Jakub Torbicki
*/
public class VelocityTemplateTransformerTest {
private static final VelocityTemplateTransformer transformer = new VelocityTemplateTransformer();
private static final DocumentTemplateRepository<DocumentTemplateStream> repo = DefaultDocumentTemplateRepository.getInstance();
private static final int THREADS_NUMBER = 200;
private static final int TEMPLATES_NUMBER = 1000;
private static final Context c = createContext();
private static Exception exception;
private static Context createContext() {
Context<String, Object> context = new DefaultContext();
context.put("name", "Friend");
return context;
}
@Test
public void testThreadSafety() throws Exception {
System.out.println("Transforming " + TEMPLATES_NUMBER + " templates 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 class DocumentGenerator implements Runnable {
public void run() {
int n = TEMPLATES_NUMBER / THREADS_NUMBER;
for (int i = 0; i < n; i++) {
try {
transformer.transform(repo.findTemplate("templates/test-velocity.html"), c);
} catch (Exception e) {
exception = e;
break;
}
}
}
}
}