// Path: IBServer/src/main/java/org/ironbrain/IB.java
// @Component
// public class IB {
//     @Autowired
//     private ServletContext context;
// 
//     //For testing purpose
//     private static long msOffset = 0;
// 
//     public static Random rand() {
//         return random;
//     }
// 
//     public static void setRandom(Random random) {
//         IB.random = random;
//     }
// 
//     private static Random random = new Random();
// 
//     public static void setMsOffset(long msOffset) {
//         IB.msOffset = msOffset;
//     }
// 
//     public static long getNowMs() {
//         return System.currentTimeMillis() + msOffset;
//     }
// 
//     public static Calendar getNowCalendar() {
//         Calendar calendar = Calendar.getInstance();
//         calendar.setTimeInMillis(getNowMs());
// 
//         return calendar;
//     }
// 
//     public String getVersionStr() {
//         String version = getClass().getPackage().getImplementationVersion();
//         if (version == null) {//Tomcat bug fix
//             Properties prop = new Properties();
//             try {
//                 prop.load(context.getResourceAsStream("/META-INF/MANIFEST.MF"));
//                 version = prop.getProperty("Implementation-Version");
//             } catch (IOException e) {
//                 e.printStackTrace();
//             }
//         }
// 
//         return version;
//     }
// 
//     public boolean isPublicVersion() {
//         return publicVersion;
//     }
// 
//     public static void out(Object object){
//         System.out.println(object);
//     }
// 
//     public void setPublicVersion(boolean publicVersion) {
//         this.publicVersion = publicVersion;
//     }
// 
//     private boolean publicVersion;
// }
// 
// Path: IBServer/src/main/java/org/ironbrain/SessionData.java
// public class SessionData {
//     public SessionData() {
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public void setUser(User user) {
//         this.user = user;
//     }
// 
//     private User user;
// 
//     public Integer getUserId() {
//         return getUser().getId();
//     }
// 
//     public boolean testOwner(int owner) {
//         return getUserId() == owner;
//     }
// 
//     public Integer getBufferSectionId() {
//         return bufferSectionId;
//     }
// 
//     public void setBufferSectionId(Integer bufferSectionId) {
//         this.bufferSectionId = bufferSectionId;
//     }
// 
//     private Integer bufferSectionId;
// 
//     public File getFilesDir() {
//         String rootPath = System.getProperty("catalina.home");
//         return new File(rootPath, "files");
//     }
// 
//     public File getHomeDir() {
//         File userHomeDir = new File(getFilesDir(), user.getLogin());
// 
//         if (!userHomeDir.exists()) {
//             userHomeDir.mkdirs();
//         }
//         return userHomeDir;
//     }
// }
// 
// Path: IBServer/src/main/java/org/ironbrain/core/Exam.java
// @Table(name = "Exam")
// @Entity
// public class Exam {
//     @Id
//     @GeneratedValue
//     private Integer id;
// 
//     private Boolean done = false;
// 
//     private Integer user;
// 
//     public Boolean getDone() {
//         return done;
//     }
// 
//     public void setDone(Boolean done) {
//         this.done = done;
//     }
// 
//     public Integer getCount() {
//         return count;
//     }
// 
//     public void setCount(Integer count) {
//         this.count = count;
//     }
// 
//     private Integer count;
// 
//     private Long startMs;
// 
//     public Integer getId() {
//         return id;
//     }
// 
//     public void setId(Integer id) {
//         this.id = id;
//     }
// 
//     public Boolean isDone() {
//         return done;
//     }
// 
//     public void setDone(boolean done) {
//         this.done = done;
//     }
// 
//     public Integer getUser() {
//         return user;
//     }
// 
//     public void setUser(Integer user) {
//         this.user = user;
//     }
// 
//     public Long getStartMs() {
//         return startMs;
//     }
// 
//     public void setStartMs(Long startMs) {
//         this.startMs = startMs;
//     }
// 
//     public Long getEndMs() {
//         return endMs;
//     }
// 
//     public void setEndMs(Long endMs) {
//         this.endMs = endMs;
//     }
// 
//     private Long endMs;
// 
//     @Transient
//     public long getDurationMin() {
// 
//         return (endMs - startMs) / (1000 * 60);
//     }
// 
//     @Transient
//     public String getName() {
//         return DateUtils.getNiceDate(startMs);
//     }
// 
//     @Transient
//     public String getStrStart() {
//         return DateUtils.getNiceDate(this.getStartMs());
//     }
// }


import org.hibernate.criterion.Restrictions;
import org.ironbrain.IB;
import org.ironbrain.SessionData;
import org.ironbrain.core.Exam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
    protected SessionData data;

    public Exam create(int count) {
        Exam exam = new Exam();
        exam.setStartMs(IB.getNowMs());
        exam.setUser(data.getUser().getId());
        exam.setDone(false);
        exam.setCount(count);
        int id = (int) getSess().save(exam);
        exam.setId(id);
        return exam;
    }

    public Exam getLastUndoneExam() {
        List<Exam> exams;

        exams = getSess().createCriteria(Exam.class)
                .add(Restrictions.eq("user", data.getUser().getId()))
                .add(Restrictions.eq("done", false))
                .setMaxResults(1)
                .list();

        if (exams.isEmpty()) {
            return null;
        } else {
            return exams.get(0);
        }
    }

    public List<Exam> getDoneExams() {
// Path: IBServer/src/main/java/org/ironbrain/IB.java
// @Component
// public class IB {
//     @Autowired
//     private ServletContext context;
// 
//     //For testing purpose
//     private static long msOffset = 0;
// 
//     public static Random rand() {
//         return random;
//     }
// 
//     public static void setRandom(Random random) {
//         IB.random = random;
//     }
// 
//     private static Random random = new Random();
// 
//     public static void setMsOffset(long msOffset) {
//         IB.msOffset = msOffset;
//     }
// 
//     public static long getNowMs() {
//         return System.currentTimeMillis() + msOffset;
//     }
// 
//     public static Calendar getNowCalendar() {
//         Calendar calendar = Calendar.getInstance();
//         calendar.setTimeInMillis(getNowMs());
// 
//         return calendar;
//     }
// 
//     public String getVersionStr() {
//         String version = getClass().getPackage().getImplementationVersion();
//         if (version == null) {//Tomcat bug fix
//             Properties prop = new Properties();
//             try {
//                 prop.load(context.getResourceAsStream("/META-INF/MANIFEST.MF"));
//                 version = prop.getProperty("Implementation-Version");
//             } catch (IOException e) {
//                 e.printStackTrace();
//             }
//         }
// 
//         return version;
//     }
// 
//     public boolean isPublicVersion() {
//         return publicVersion;
//     }
// 
//     public static void out(Object object){
//         System.out.println(object);
//     }
// 
//     public void setPublicVersion(boolean publicVersion) {
//         this.publicVersion = publicVersion;
//     }
// 
//     private boolean publicVersion;
// }
// 
// Path: IBServer/src/main/java/org/ironbrain/SessionData.java
// public class SessionData {
//     public SessionData() {
//     }
// 
//     public User getUser() {
//         return user;
//     }
// 
//     public void setUser(User user) {
//         this.user = user;
//     }
// 
//     private User user;
// 
//     public Integer getUserId() {
//         return getUser().getId();
//     }
// 
//     public boolean testOwner(int owner) {
//         return getUserId() == owner;
//     }
// 
//     public Integer getBufferSectionId() {
//         return bufferSectionId;
//     }
// 
//     public void setBufferSectionId(Integer bufferSectionId) {
//         this.bufferSectionId = bufferSectionId;
//     }
// 
//     private Integer bufferSectionId;
// 
//     public File getFilesDir() {
//         String rootPath = System.getProperty("catalina.home");
//         return new File(rootPath, "files");
//     }
// 
//     public File getHomeDir() {
//         File userHomeDir = new File(getFilesDir(), user.getLogin());
// 
//         if (!userHomeDir.exists()) {
//             userHomeDir.mkdirs();
//         }
//         return userHomeDir;
//     }
// }
// 
// Path: IBServer/src/main/java/org/ironbrain/core/Exam.java
// @Table(name = "Exam")
// @Entity
// public class Exam {
//     @Id
//     @GeneratedValue
//     private Integer id;
// 
//     private Boolean done = false;
// 
//     private Integer user;
// 
//     public Boolean getDone() {
//         return done;
//     }
// 
//     public void setDone(Boolean done) {
//         this.done = done;
//     }
// 
//     public Integer getCount() {
//         return count;
//     }
// 
//     public void setCount(Integer count) {
//         this.count = count;
//     }
// 
//     private Integer count;
// 
//     private Long startMs;
// 
//     public Integer getId() {
//         return id;
//     }
// 
//     public void setId(Integer id) {
//         this.id = id;
//     }
// 
//     public Boolean isDone() {
//         return done;
//     }
// 
//     public void setDone(boolean done) {
//         this.done = done;
//     }
// 
//     public Integer getUser() {
//         return user;
//     }
// 
//     public void setUser(Integer user) {
//         this.user = user;
//     }
// 
//     public Long getStartMs() {
//         return startMs;
//     }
// 
//     public void setStartMs(Long startMs) {
//         this.startMs = startMs;
//     }
// 
//     public Long getEndMs() {
//         return endMs;
//     }
// 
//     public void setEndMs(Long endMs) {
//         this.endMs = endMs;
//     }
// 
//     private Long endMs;
// 
//     @Transient
//     public long getDurationMin() {
// 
//         return (endMs - startMs) / (1000 * 60);
//     }
// 
//     @Transient
//     public String getName() {
//         return DateUtils.getNiceDate(startMs);
//     }
// 
//     @Transient
//     public String getStrStart() {
//         return DateUtils.getNiceDate(this.getStartMs());
//     }
// }


// Path: IBServer/src/main/java/org/ironbrain/dao/ExamDao.java
import org.hibernate.criterion.Restrictions;
import org.ironbrain.IB;
import org.ironbrain.SessionData;
import org.ironbrain.core.Exam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;

    protected SessionData data;

    public Exam create(int count) {
        Exam exam = new Exam();
        exam.setStartMs(IB.getNowMs());
        exam.setUser(data.getUser().getId());
        exam.setDone(false);
        exam.setCount(count);
        int id = (int) getSess().save(exam);
        exam.setId(id);
        return exam;
    }

    public Exam getLastUndoneExam() {
        List<Exam> exams;

        exams = getSess().createCriteria(Exam.class)
                .add(Restrictions.eq("user", data.getUser().getId()))
                .add(Restrictions.eq("done", false))
                .setMaxResults(1)
                .list();

        if (exams.isEmpty()) {
            return null;
        } else {
            return exams.get(0);
        }
    }

    public List<Exam> getDoneExams() {
        List<Exam> exams;