// Path: home-core/src/main/java/com/sismics/home/core/model/dbi/AuthenticationToken.java
// public class AuthenticationToken {
//     /**
//      * Token.
//      */
//     private String id;
// 
//     /**
//      * User ID.
//      */
//     private String userId;
//     
//     /**
//      * Remember the user next time (long lasted session).
//      */
//     private boolean longLasted;
//     
//     /**
//      * Token creation date.
//      */
//     private Date createDate;
// 
//     /**
//      * Last connection date using this token.
//      */
//     private Date lastConnectionDate;
// 
//     public AuthenticationToken() {
//     }
// 
//     public AuthenticationToken(String id, String userId, boolean longLasted, Date createDate, Date lastConnectionDate) {
//         this.id = id;
//         this.userId = userId;
//         this.longLasted = longLasted;
//         this.createDate = createDate;
//         this.lastConnectionDate = lastConnectionDate;
//     }
// 
//     /**
//      * Getter of id.
//      *
//      * @return id
//      */
//     public String getId() {
//         return id;
//     }
// 
//     /**
//      * Setter of id.
//      *
//      * @param id id
//      */
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     /**
//      * Getter of userId.
//      *
//      * @return userId
//      */
//     public String getUserId() {
//         return userId;
//     }
// 
//     /**
//      * Setter of userId.
//      *
//      * @param userId userId
//      */
//     public void setUserId(String userId) {
//         this.userId = userId;
//     }
// 
//     /**
//      * Getter of longLasted.
//      *
//      * @return longLasted
//      */
//     public boolean isLongLasted() {
//         return longLasted;
//     }
// 
//     /**
//      * Setter of longLasted.
//      *
//      * @param longLasted longLasted
//      */
//     public void setLongLasted(boolean longLasted) {
//         this.longLasted = longLasted;
//     }
// 
//     /**
//      * Getter of createDate.
//      *
//      * @return createDate
//      */
//     public Date getCreateDate() {
//         return createDate;
//     }
// 
//     /**
//      * Setter of createDate.
//      *
//      * @param createDate createDate
//      */
//     public void setCreateDate(Date createDate) {
//         this.createDate = createDate;
//     }
// 
//     /**
//      * Getter of lastConnectionDate.
//      *
//      * @return lastConnectionDate
//      */
//     public Date getLastConnectionDate() {
//         return lastConnectionDate;
//     }
// 
//     /**
//      * Setter of lastConnectionDate.
//      *
//      * @param lastConnectionDate lastConnectionDate
//      */
//     public void setLastConnectionDate(Date lastConnectionDate) {
//         this.lastConnectionDate = lastConnectionDate;
//     }
// 
//     @Override
//     public String toString() {
//         return Objects.toStringHelper(this)
//                 .add("id", "**hidden**")
//                 .add("userId", userId)
//                 .add("longLasted", longLasted)
//                 .toString();
//     }
// }
// 
// Path: home-core/src/main/java/com/sismics/util/context/ThreadLocalContext.java
// public class ThreadLocalContext {
//     /**
//      * ThreadLocal to store the context.
//      */
//     public static final ThreadLocal<ThreadLocalContext> threadLocalContext = new ThreadLocal<ThreadLocalContext>();
//     
//     /**
//      * JDBI handle.
//      */
//     private Handle handle;
//     
//     /**
//      * Private constructor.
//      */
//     private ThreadLocalContext() {
//         // NOP
//     }
//     
//     /**
//      * Returns an instance of this thread context.
//      * 
//      * @return Thread local context
//      */
//     public static ThreadLocalContext get() {
//         ThreadLocalContext context = threadLocalContext.get();
//         if (context == null) {
//             context = new ThreadLocalContext();
//             threadLocalContext.set(context);
//         }
//         return context;
//     }
// 
//     /**
//      * Cleans up the instance of this thread context.
//      */
//     public static void cleanup() {
//         threadLocalContext.set(null);
//     }
//     
//     /**
//      * Getter of handle.
//      *
//      * @return handle
//      */
//     public Handle getHandle() {
//         return handle;
//     }
// 
//     /**
//      * Setter of handle.
//      *
//      * @param handle handle
//      */
//     public void setHandle(Handle handle) {
//         this.handle = handle;
//     }
// }


import com.sismics.home.core.model.dbi.AuthenticationToken;
import com.sismics.util.context.ThreadLocalContext;
import org.joda.time.DateTime;
import org.skife.jdbi.v2.Handle;
import java.util.Date;
import java.util.UUID;
    /**
     * Deletes the authentication token.
     * 
     * @param authenticationTokenId Authentication token ID
     * @throws Exception
     */
    public void delete(String authenticationTokenId) throws Exception {
        final Handle handle = ThreadLocalContext.get().getHandle();
        AuthenticationToken authenticationToken = get(authenticationTokenId);
        if (authenticationToken != null) {
            handle.createStatement("delete from " +
                    "  T_AUTHENTICATION_TOKEN" +
                    "  where AUT_ID_C = :id")
                    .bind("id", authenticationToken.getId())
                    .execute();
        } else {
            throw new Exception("Token not found: " + authenticationTokenId);
        }
    }

    /**
     * Deletes old short lived tokens.
     *
     * @param userId User ID
     */
    public void deleteOldSessionToken(String userId) {
        final Handle handle = ThreadLocalContext.get().getHandle();
        handle.createStatement("delete from T_AUTHENTICATION_TOKEN AS ato " +
                "  where ato.AUT_IDUSER_C = :userId and ato.AUT_LONGLASTED_B = :longLasted" +
                "  and ato.AUT_LASTCONNECTIONDATE_D < :minDate")
// Path: home-core/src/main/java/com/sismics/home/core/model/dbi/AuthenticationToken.java
// public class AuthenticationToken {
//     /**
//      * Token.
//      */
//     private String id;
// 
//     /**
//      * User ID.
//      */
//     private String userId;
//     
//     /**
//      * Remember the user next time (long lasted session).
//      */
//     private boolean longLasted;
//     
//     /**
//      * Token creation date.
//      */
//     private Date createDate;
// 
//     /**
//      * Last connection date using this token.
//      */
//     private Date lastConnectionDate;
// 
//     public AuthenticationToken() {
//     }
// 
//     public AuthenticationToken(String id, String userId, boolean longLasted, Date createDate, Date lastConnectionDate) {
//         this.id = id;
//         this.userId = userId;
//         this.longLasted = longLasted;
//         this.createDate = createDate;
//         this.lastConnectionDate = lastConnectionDate;
//     }
// 
//     /**
//      * Getter of id.
//      *
//      * @return id
//      */
//     public String getId() {
//         return id;
//     }
// 
//     /**
//      * Setter of id.
//      *
//      * @param id id
//      */
//     public void setId(String id) {
//         this.id = id;
//     }
// 
//     /**
//      * Getter of userId.
//      *
//      * @return userId
//      */
//     public String getUserId() {
//         return userId;
//     }
// 
//     /**
//      * Setter of userId.
//      *
//      * @param userId userId
//      */
//     public void setUserId(String userId) {
//         this.userId = userId;
//     }
// 
//     /**
//      * Getter of longLasted.
//      *
//      * @return longLasted
//      */
//     public boolean isLongLasted() {
//         return longLasted;
//     }
// 
//     /**
//      * Setter of longLasted.
//      *
//      * @param longLasted longLasted
//      */
//     public void setLongLasted(boolean longLasted) {
//         this.longLasted = longLasted;
//     }
// 
//     /**
//      * Getter of createDate.
//      *
//      * @return createDate
//      */
//     public Date getCreateDate() {
//         return createDate;
//     }
// 
//     /**
//      * Setter of createDate.
//      *
//      * @param createDate createDate
//      */
//     public void setCreateDate(Date createDate) {
//         this.createDate = createDate;
//     }
// 
//     /**
//      * Getter of lastConnectionDate.
//      *
//      * @return lastConnectionDate
//      */
//     public Date getLastConnectionDate() {
//         return lastConnectionDate;
//     }
// 
//     /**
//      * Setter of lastConnectionDate.
//      *
//      * @param lastConnectionDate lastConnectionDate
//      */
//     public void setLastConnectionDate(Date lastConnectionDate) {
//         this.lastConnectionDate = lastConnectionDate;
//     }
// 
//     @Override
//     public String toString() {
//         return Objects.toStringHelper(this)
//                 .add("id", "**hidden**")
//                 .add("userId", userId)
//                 .add("longLasted", longLasted)
//                 .toString();
//     }
// }
// 
// Path: home-core/src/main/java/com/sismics/util/context/ThreadLocalContext.java
// public class ThreadLocalContext {
//     /**
//      * ThreadLocal to store the context.
//      */
//     public static final ThreadLocal<ThreadLocalContext> threadLocalContext = new ThreadLocal<ThreadLocalContext>();
//     
//     /**
//      * JDBI handle.
//      */
//     private Handle handle;
//     
//     /**
//      * Private constructor.
//      */
//     private ThreadLocalContext() {
//         // NOP
//     }
//     
//     /**
//      * Returns an instance of this thread context.
//      * 
//      * @return Thread local context
//      */
//     public static ThreadLocalContext get() {
//         ThreadLocalContext context = threadLocalContext.get();
//         if (context == null) {
//             context = new ThreadLocalContext();
//             threadLocalContext.set(context);
//         }
//         return context;
//     }
// 
//     /**
//      * Cleans up the instance of this thread context.
//      */
//     public static void cleanup() {
//         threadLocalContext.set(null);
//     }
//     
//     /**
//      * Getter of handle.
//      *
//      * @return handle
//      */
//     public Handle getHandle() {
//         return handle;
//     }
// 
//     /**
//      * Setter of handle.
//      *
//      * @param handle handle
//      */
//     public void setHandle(Handle handle) {
//         this.handle = handle;
//     }
// }


// Path: home-core/src/main/java/com/sismics/home/core/dao/dbi/AuthenticationTokenDao.java
import com.sismics.home.core.model.dbi.AuthenticationToken;
import com.sismics.util.context.ThreadLocalContext;
import org.joda.time.DateTime;
import org.skife.jdbi.v2.Handle;
import java.util.Date;
import java.util.UUID;

    /**
     * Deletes the authentication token.
     * 
     * @param authenticationTokenId Authentication token ID
     * @throws Exception
     */
    public void delete(String authenticationTokenId) throws Exception {
        final Handle handle = ThreadLocalContext.get().getHandle();
        AuthenticationToken authenticationToken = get(authenticationTokenId);
        if (authenticationToken != null) {
            handle.createStatement("delete from " +
                    "  T_AUTHENTICATION_TOKEN" +
                    "  where AUT_ID_C = :id")
                    .bind("id", authenticationToken.getId())
                    .execute();
        } else {
            throw new Exception("Token not found: " + authenticationTokenId);
        }
    }

    /**
     * Deletes old short lived tokens.
     *
     * @param userId User ID
     */
    public void deleteOldSessionToken(String userId) {
        final Handle handle = ThreadLocalContext.get().getHandle();
        handle.createStatement("delete from T_AUTHENTICATION_TOKEN AS ato " +
                "  where ato.AUT_IDUSER_C = :userId and ato.AUT_LONGLASTED_B = :longLasted" +
                "  and ato.AUT_LASTCONNECTIONDATE_D < :minDate")
                .bind("userId", userId)