/* * Copyright (c) 2010 Mysema Ltd. * All rights reserved. * */ package com.mysema.rdfbean.testutil; import java.lang.reflect.Field; import java.util.Locale; import org.junit.rules.MethodRule; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import com.mysema.rdfbean.model.RDFBeanTransaction; import com.mysema.rdfbean.model.Repository; import com.mysema.rdfbean.object.Session; import com.mysema.rdfbean.object.SessionUtil; public class SessionRule implements MethodRule { private final Repository repository; private final boolean transactional; public SessionRule(Repository repository, boolean transactional) { this.repository = repository; this.transactional = transactional; } public SessionRule(Repository repository) { this(repository, true); } @Override public Statement apply(final Statement base, FrameworkMethod method, final Object target) { final SessionConfig config = target.getClass().getAnnotation(SessionConfig.class); if (config != null) { return new Statement() { @Override public void evaluate() throws Throwable { Session session = SessionUtil.openSession(repository, new Locale("fi"), config.value()); RDFBeanTransaction tx = transactional ? session.beginTransaction() : null; try { Field field = target.getClass().getField("session"); field.setAccessible(true); field.set(target, session); base.evaluate(); } finally { if (tx != null) { tx.rollback(); } session.close(); } } }; } else { return base; } } }