package alien4cloud.security.users;
import java.beans.IntrospectionException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.elasticsearch.mapping.MappingBuilder;
import org.springframework.stereotype.Component;
import alien4cloud.dao.ESGenericSearchDAO;
import alien4cloud.dao.model.FacetedSearchResult;
import alien4cloud.dao.model.GetMultipleDataResult;
import alien4cloud.exception.IndexingServiceException;
import alien4cloud.security.model.User;
import com.google.common.collect.Maps;
@Component("user-dao")
public class ElasticSearchUserDao extends ESGenericSearchDAO implements IAlienUserDao {
@Resource
private MappingBuilder mappingBuilder;
@PostConstruct
public void initEnvironment() {
// init ES annotation scanning
try {
mappingBuilder.initialize(User.class.getPackage().getName());
} catch (IntrospectionException | IOException e) {
throw new IndexingServiceException("Could not initialize elastic search mapping builder", e);
}
// init indexes and mapped classes
initIndices(User.class.getSimpleName().toLowerCase(), null, new Class<?>[] { User.class });
initCompleted();
}
@Override
public void save(User user) {
super.save(user);
}
@Override
public User find(String username) {
return super.findById(User.class, username);
}
@Override
public void delete(String userName) {
super.delete(User.class, userName);
}
@Override
public FacetedSearchResult search(String searchQuery, String group, int from, int size) {
Map<String, String[]> groupFilter = Maps.newHashMap();
if (group != null && !group.isEmpty()) {
groupFilter.put("", new String[] { group });
}
return super.facetedSearch(User.class, searchQuery, groupFilter, null, from, size);
}
@Override
public GetMultipleDataResult find(Map<String, String[]> filters, int maxElements) {
// you've to put filters in lowercase for an analyzed field
// should be moved to es-mapping project (?)
List<String> lowerCaseFilters;
for (Map.Entry<String, String[]> filter : filters.entrySet()) {
lowerCaseFilters = new ArrayList<String>();
for (String f : filter.getValue()) {
lowerCaseFilters.add(f.toLowerCase());
}
filter.setValue(lowerCaseFilters.toArray(new String[filter.getValue().length]));
}
return super.find(User.class, filters, maxElements);
}
@Override
public List<User> find(String... usernames) {
return super.findByIds(User.class, usernames);
}
}