001    package org.sonar.jpa.session;
002    
003    import org.sonar.api.database.DatabaseSession;
004    
005    public class ThreadLocalDatabaseSessionFactory implements DatabaseSessionFactory {
006    
007      private final ThreadLocal<JpaDatabaseSession> threadSession = new ThreadLocal<JpaDatabaseSession>();
008      private final DatabaseConnector connector;
009    
010      public ThreadLocalDatabaseSessionFactory(DatabaseConnector connector) {
011        this.connector = connector;
012      }
013    
014      public DatabaseSession getSession() {
015        JpaDatabaseSession session = threadSession.get();
016        if (session == null) {
017          session = new JpaDatabaseSession(connector);
018          session.start();
019          threadSession.set(session);
020        }
021        return session;
022      }
023    
024      public void clear() {
025        JpaDatabaseSession session = threadSession.get();
026        if (session != null) {
027          session.stop();
028        }
029        threadSession.set(null);
030      }
031    
032      public void stop() {
033        clear();
034      }
035    }