package fr.openwide.core.jpa.security.business.person.service;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import fr.openwide.core.jpa.business.generic.service.GenericEntityServiceImpl;
import fr.openwide.core.jpa.exception.SecurityServiceException;
import fr.openwide.core.jpa.exception.ServiceException;
import fr.openwide.core.jpa.search.service.IHibernateSearchService;
import fr.openwide.core.jpa.security.business.authority.model.Authority;
import fr.openwide.core.jpa.security.business.authority.service.IAuthorityService;
import fr.openwide.core.jpa.security.business.authority.util.CoreAuthorityConstants;
import fr.openwide.core.jpa.security.business.person.dao.IGenericUserDao;
import fr.openwide.core.jpa.security.business.person.model.GenericUser;
import fr.openwide.core.jpa.security.business.person.model.IUserBinding;
public abstract class GenericUserServiceImpl<U extends GenericUser<U, ?>>
extends GenericEntityServiceImpl<Long, U>
implements IGenericUserService<U> {
private static final IUserBinding BINDING = new IUserBinding();
private static final String[] SEARCH_FIELDS = new String[] { BINDING.userName().getPath() };
private static final String[] AUTOCOMPLETE_SEARCH_FIELDS = new String[] { BINDING.userName().getPath() };
private static final Sort AUTOCOMPLETE_SORT = new Sort(new SortField(GenericUser.USER_NAME_SORT_FIELD_NAME, SortField.Type.STRING));
@Autowired
private IAuthorityService authorityService;
@Autowired
private IHibernateSearchService hibernateSearchService;
@Autowired
private PasswordEncoder passwordEncoder;
private IGenericUserDao<U> personDao;
@Autowired
public GenericUserServiceImpl(IGenericUserDao<U> personDao) {
super(personDao);
this.personDao = personDao;
}
@Override
public U getByUserName(String userName) {
return getByNaturalId(userName);
}
@Override
public U getByUserNameCaseInsensitive(String userName) {
return personDao.getByUserNameCaseInsensitive(userName);
}
/**
* @deprecated use the ISearchQuery pattern instead.
*/
@Deprecated
@Override
public List<U> search(String searchPattern) throws ServiceException, SecurityServiceException {
return hibernateSearchService.search(getObjectClass(), SEARCH_FIELDS, searchPattern);
}
/**
* @deprecated use the ISearchQuery pattern instead.
*/
@Deprecated
@Override
public List<U> searchAutocomplete(String searchPattern) throws ServiceException, SecurityServiceException {
return searchAutocomplete(searchPattern, null, null);
}
/**
* @deprecated use the ISearchQuery pattern instead.
*/
@Deprecated
@Override
public <U2 extends U> List<U2> searchAutocomplete(Class<U2> clazz, String searchPattern) throws ServiceException, SecurityServiceException {
return searchAutocomplete(clazz, searchPattern, null, null);
}
/**
* @deprecated use the ISearchQuery pattern instead.
*/
@Deprecated
@Override
public List<U> searchAutocomplete(String searchPattern, Integer limit, Integer offset) throws ServiceException, SecurityServiceException {
return searchAutocomplete(getObjectClass(), searchPattern, limit, offset);
}
/**
* @deprecated use the ISearchQuery pattern instead.
*/
@Deprecated
@Override
public <U2 extends U> List<U2> searchAutocomplete(Class<U2> clazz, String searchPattern, Integer limit, Integer offset) throws ServiceException, SecurityServiceException {
return hibernateSearchService.searchAutocomplete(clazz, AUTOCOMPLETE_SEARCH_FIELDS, searchPattern,
limit, offset, AUTOCOMPLETE_SORT);
}
@Override
protected void createEntity(U person) throws ServiceException, SecurityServiceException {
super.createEntity(person);
Date date = new Date();
person.setCreationDate(date);
person.setLastUpdateDate(date);
if (person.getAuthorities().size() == 0) {
Authority defaultAuthority = authorityService.getByName(CoreAuthorityConstants.ROLE_AUTHENTICATED);
if (defaultAuthority != null) {
person.addAuthority(defaultAuthority);
super.save(person);
} else {
throw new ServiceException("Default authority ROLE_AUTHENTICATED has not been created yet");
}
}
}
@Override
protected void updateEntity(U person) throws ServiceException, SecurityServiceException {
person.setLastUpdateDate(new Date());
super.updateEntity(person);
}
@Override
public void updateProfileInformation(U person) throws ServiceException, SecurityServiceException {
super.update(person);
}
@Override
public void addAuthority(U person, Authority authority) throws ServiceException, SecurityServiceException {
person.addAuthority(authority);
super.update(person);
}
@Override
public void addAuthority(U person, String authorityName) throws ServiceException, SecurityServiceException {
addAuthority(person, authorityService.getByName(authorityName));
}
@Override
public void setActive(U person, boolean active) throws ServiceException, SecurityServiceException {
person.setActive(active);
super.update(person);
}
@Override
public Long countActive() {
return personDao.countActive();
}
@Override
public void setPasswords(U person, String clearTextPassword) throws ServiceException, SecurityServiceException {
person.setPasswordHash(passwordEncoder.encode(clearTextPassword));
super.update(person);
}
@Override
public void updateLastLoginDate(U person) throws ServiceException, SecurityServiceException {
person.setLastLoginDate(new Date());
super.updateEntity(person);
}
@Override
public void updateLocale(U person, Locale locale) throws ServiceException, SecurityServiceException {
person.setLocale(locale);
super.updateEntity(person);
}
}