package edu.asu.spring.quadriga.service.resolver.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.PatternSyntaxException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import edu.asu.spring.quadriga.dao.resolver.IProjectHandleResolverDAO;
import edu.asu.spring.quadriga.domain.resolver.IProjectHandleResolver;
import edu.asu.spring.quadriga.domain.resolver.Status;
import edu.asu.spring.quadriga.dto.ProjectHandleResolverDTO;
import edu.asu.spring.quadriga.mapper.resolver.IProjectHandleResolverMapper;
import edu.asu.spring.quadriga.service.resolver.IProjectHandleResolverManager;
/**
* Manager class for {@link IProjectHandleResolver}s.
*
* @author jdamerow
*
*/
@Service
public class ProjectHandleResolverManager implements IProjectHandleResolverManager {
@Autowired
private IProjectHandleResolverDAO resolverDao;
@Autowired
private IProjectHandleResolverMapper mapper;
/**
* Saves or updates and object in the database.
*
* @param resolver
* The project handle resolver to save or update.
* @param username
* The username of the user that created the resolver.
*/
@Override
@Transactional
public boolean saveProjectHandleResolver(IProjectHandleResolver resolver, String username) {
if (resolver.getId() == null) {
String id = resolverDao.generateUniqueID();
resolver.setId(id);
resolver.setUsername(username);
}
ProjectHandleResolverDTO resolverDto = mapper.mapProjectHandleResolver(resolver);
resolverDao.saveOrUpdateDTO(resolverDto);
return true;
}
/*
* (non-Javadoc)
*
* @see edu.asu.spring.quadriga.service.resolver.impl.
* IProjectHandleResolverManager#getProjectHandleResolver(java.lang.String)
*/
@Override
public IProjectHandleResolver getProjectHandleResolver(String id) {
ProjectHandleResolverDTO dto = resolverDao.getDTO(id);
return mapper.mapProjectHandleResolver(dto);
}
/*
* (non-Javadoc)
*
* @see edu.asu.spring.quadriga.service.resolver.impl.
* IProjectHandleResolverManager#getProjectHandleResolvers(java.lang.String)
*/
@Override
public List<IProjectHandleResolver> getProjectHandleResolvers(String username) {
List<ProjectHandleResolverDTO> resolverDtos = resolverDao.getProjectResolversForUser(username);
List<IProjectHandleResolver> resolvers = new ArrayList<IProjectHandleResolver>();
resolverDtos.forEach(dto -> resolvers.add(mapper.mapProjectHandleResolver(dto)));
return resolvers;
}
/**
* Checks whether the given resolver is used by any project and if it's
* true, returns false. If no project is using the resolver, then the
* resolver is deleted from the database.
*
* @param resolver
* The project handle resolver to delete.
*/
@Override
@Transactional
public boolean deleteProjectHandleResolver(IProjectHandleResolver resolver) {
if (resolverDao.getProjectsForResolverId(resolver.getId()).size() > 0) {
return false;
}
ProjectHandleResolverDTO resolverDto = mapper.mapProjectHandleResolver(resolver);
resolverDao.deleteDTO(resolverDto);
return true;
}
@Transactional
@Override
public Status validateProjectResolverHandle(IProjectHandleResolver resolver, boolean setResolverValidation) {
String resolvedHandle;
try {
resolvedHandle = resolver.buildResolvedHandle(resolver.getHandleExample());
} catch (PatternSyntaxException e) {
return Status.FAILED;
}
Status status = (resolver.getResolvedHandleExample()).equals(resolvedHandle) ? Status.PASSED : Status.FAILED;
if (setResolverValidation) {
resolver.setValidation(status);
saveProjectHandleResolver(resolver, resolver.getUsername());
}
return status;
}
}