ApplicationServiceImpl.java
package org.xandercat.pmdb.service;
import java.time.LocalDate;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.xandercat.pmdb.dao.ApplicationDao;
import org.xandercat.pmdb.dto.ApplicationAttribute;
@Component
public class ApplicationServiceImpl implements ApplicationService {
public static final String IMDB_SERVICE_CALLS = "IMDB Service Calls";
public static final String REGISTRATIONS_COUNT_TRIGGER_TIME = "Registrations Trigger Time";
public static final String REGISTRATIONS_COUNT = "Registrations Trigger Count";
private static final int MAX_REGISTRATIONS_COUNT = 1000;
@Autowired
private ApplicationDao applicationDao;
@Value("${registrations.interval.minutes}")
private int regMinutes;
@Override
public int getImdbServiceCallCount() {
return getImdbServiceCallCount(LocalDate.now());
}
@Override
public int getImdbServiceCallCount(LocalDate date) {
Optional<ApplicationAttribute> imdbServiceCalls = applicationDao.getApplicationAttribute(IMDB_SERVICE_CALLS, date);
return (imdbServiceCalls.isPresent())? Integer.parseInt(imdbServiceCalls.get().getValue()) : 0;
}
@Override
public void incrementImdbServiceCallCount() {
LocalDate today = LocalDate.now();
Optional<ApplicationAttribute> imdbServiceCallsOptional = applicationDao.getApplicationAttribute(IMDB_SERVICE_CALLS, today);
if (!imdbServiceCallsOptional.isPresent()) {
ApplicationAttribute imdbServiceCalls = new ApplicationAttribute();
imdbServiceCalls.setName(IMDB_SERVICE_CALLS);
imdbServiceCalls.setDate(today);
imdbServiceCalls.setValue("1");
applicationDao.addApplicationAttribute(imdbServiceCalls);
} else {
ApplicationAttribute imdbServiceCalls = imdbServiceCallsOptional.get();
int count = Integer.parseInt(imdbServiceCalls.getValue());
imdbServiceCalls.setValue(String.valueOf(count+1));
applicationDao.updateApplicationAttribute(imdbServiceCalls);
}
}
@Override
public int incrementRegistrationsTriggerCount() {
LocalDate today = LocalDate.now();
Optional<ApplicationAttribute> triggerTimeAttributeOptional = applicationDao.getApplicationAttribute(REGISTRATIONS_COUNT_TRIGGER_TIME, today);
long systemTime = System.currentTimeMillis();
if (!triggerTimeAttributeOptional.isPresent()) {
ApplicationAttribute triggerTimeAttribute = new ApplicationAttribute(REGISTRATIONS_COUNT_TRIGGER_TIME, String.valueOf(systemTime), today);
applicationDao.addApplicationAttribute(triggerTimeAttribute);
setRegistrationsTriggerCount(1, today);
return 1;
}
ApplicationAttribute triggerTimeAttribute = triggerTimeAttributeOptional.get();
long triggerTime = Long.parseLong(triggerTimeAttribute.getValue());
if ((systemTime - triggerTime) > (regMinutes * 60 * 1000)) {
triggerTimeAttribute.setValue(String.valueOf(systemTime));
applicationDao.updateApplicationAttribute(triggerTimeAttribute);
setRegistrationsTriggerCount(1, today);
return 1;
}
return incrementRegistrationsTriggerCount(today);
}
private int incrementRegistrationsTriggerCount(LocalDate date) {
Optional<ApplicationAttribute> triggerCountAttributeOptional = applicationDao.getApplicationAttribute(REGISTRATIONS_COUNT, date);
if (!triggerCountAttributeOptional.isPresent()) {
ApplicationAttribute triggerCountAttribute = new ApplicationAttribute(REGISTRATIONS_COUNT, "1", date);
applicationDao.addApplicationAttribute(triggerCountAttribute);
return 1;
}
ApplicationAttribute triggerCountAttribute = triggerCountAttributeOptional.get();
int count = Integer.parseInt(triggerCountAttribute.getValue());
count = Math.min(MAX_REGISTRATIONS_COUNT, count+1);
triggerCountAttribute.setValue(String.valueOf(count));
applicationDao.updateApplicationAttribute(triggerCountAttribute);
return count;
}
private void setRegistrationsTriggerCount(int count, LocalDate date) {
Optional<ApplicationAttribute> triggerCountAttributeOptional = applicationDao.getApplicationAttribute(REGISTRATIONS_COUNT, date);
if (!triggerCountAttributeOptional.isPresent()) {
ApplicationAttribute triggerCountAttribute = new ApplicationAttribute(REGISTRATIONS_COUNT, String.valueOf(count), date);
applicationDao.addApplicationAttribute(triggerCountAttribute);
} else {
ApplicationAttribute triggerCountAttribute = triggerCountAttributeOptional.get();
triggerCountAttribute.setValue(String.valueOf(count));
applicationDao.updateApplicationAttribute(triggerCountAttribute);
}
}
}