package com.loggingbox.storage;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import com.log.model.Log;
import com.log.model.command.GetLogs;
import com.log.model.result.GetLogsResult;
import com.log.storage.LogAccessor;
import com.loggingbox.storage.dao.SqlLogDao;
import com.loggingbox.storage.model.SqlLog;
public class SqlLogAccessor implements LogAccessor {
private final static SqlLogAccessor INSTANCE = new SqlLogAccessor();
public static SqlLogAccessor getInstance() {
return INSTANCE;
}
@Autowired SqlLogDao logDao;
@Override
@Transactional
public void insertLog(Log log) {
String newId = log.getApplicationId() + "_"
+ (Long.MAX_VALUE - log.getDate().getTime()) + "_"
+ Math.abs(new Random().nextInt());
log.setId(newId);
logDao.insertLog(SqlLog.fromLog(log));
}
@Override
@Transactional
public void insertLogs(List<Log> logs) {
for(Log log : logs) {
String newId = log.getApplicationId() + "_"
+ (Long.MAX_VALUE - log.getDate().getTime()) + "_"
+ Math.abs(new Random().nextInt());
log.setId(newId);
logDao.insertLog(SqlLog.fromLog(log));
}
}
@Override
@Transactional
public GetLogsResult getLogs(GetLogs getLogs) {
GetLogsResult result = new GetLogsResult();
List<Log> logsList = new ArrayList<Log>();
List<SqlLog> logs;
if(getLogs.getOffset() > 0) {
logs = new ArrayList<SqlLog>();
List<SqlLog> offsetList = logDao.getLogsPage(getLogs.getApplicationId(), getLogs.getStartLogId(), getLogs.getOffset(), !getLogs.isAscendingOrder());
for(int i= offsetList.size()-1; i > 0; i--) {
logs.add(offsetList.get(i));
}
logs.addAll(logDao.getLogsPage(getLogs.getApplicationId(), getLogs.getStartLogId(), getLogs.getMaxItemNumber()-logs.size()+1, getLogs.isAscendingOrder()));
}else {
logs = logDao.getLogsPage(getLogs.getApplicationId(), getLogs.getStartLogId(), getLogs.getMaxItemNumber(), getLogs.isAscendingOrder());
}
for(SqlLog sqlLog : logs) {
logsList.add(SqlLog.toLog(sqlLog));
}
result.setApplicationId(getLogs.getApplicationId());
result.setLogs(logsList);
result.setAscendingOrder(getLogs.isAscendingOrder());
return result;
}
@Override
@Transactional
public List<Log> getLogs(String applicationId, Date fromDate, Date toDate,
String beginLogId, Integer maxNumber) {
List<Log> result = new ArrayList<Log>();
List<SqlLog> logs = logDao.getLogs(applicationId, fromDate, toDate, beginLogId, maxNumber);
for(SqlLog sqlLog : logs) {
result.add(SqlLog.toLog(sqlLog));
}
return result;
}
}