package no.niths.services.auth;
import java.util.GregorianCalendar;
import no.niths.services.auth.interfaces.KeyGeneratorService;
import no.niths.services.development.interfaces.ApplicationService;
import no.niths.services.development.interfaces.DeveloperService;
import org.apache.commons.lang.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
* Service for generating and developer and application keys
*
*/
@Service
public class KeyGeneratorServiceImpl implements KeyGeneratorService {
private static final Logger logger = LoggerFactory
.getLogger(KeyGeneratorServiceImpl.class);
private final static int DEVELOPER = 0;
private final static int APPLICATION = 1;
@Autowired
private DeveloperService developerService;
@Autowired
private ApplicationService applicationService;
/**
* {@inheritDoc}
*/
@Override
public String generateDeveloperKey() {
logger.debug("Generating developer key");
return generateKey(DEVELOPER);
}
/**
* {@inheritDoc}
*/
@Override
public String generateApplicationKey() {
logger.debug("Generating application key");
return generateKey(APPLICATION);
}
/**
* Generates a random key with ten alpha numeric digits
* Checks the DB to verify that the key is unique
*
* @param domain app or dev
* @return key as a string
*/
private String generateKey(int domain){
boolean found = false;
String key = "";
while(!found){
key = RandomStringUtils.randomAlphanumeric(5) + "-" + new GregorianCalendar().getTimeInMillis();
switch (domain) {
case DEVELOPER:
if(developerService.getDeveloperByDeveloperKey(key) == null){
found = true;
}
break;
case APPLICATION:
if(applicationService.getByApplicationKey(key, false) == null){
found = true;
}
break;
}
}
return key;
}
}