package org.zalando.catwatch.backend.service; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.zalando.catwatch.backend.model.Language; import org.zalando.catwatch.backend.model.Project; import org.zalando.catwatch.backend.repo.ProjectRepository; import org.zalando.catwatch.backend.util.StringParser; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @Service public class LanguageService { public static final Logger logger = LoggerFactory.getLogger(LanguageService.class); private final ProjectRepository repository; @Autowired public LanguageService(ProjectRepository repository) { this.repository = repository; } public List<Language> filterLanguages(List<Language> languages, int limit, int offset){ return languages.stream().skip(offset).limit(limit).collect(Collectors.toList()); } public List<Language> getMainLanguages(final String organizations, final Comparator<Language> c, Optional<String> filterLanguage) { Collection<String> organizationList = StringParser.parseStringList(organizations, ","); List<Project> projectList = new ArrayList<>(); // get the projects for (String org : organizationList) { Iterable<Project> projects = repository.findProjects(org, Optional.empty(), filterLanguage); for (Project project : projects) { projectList.add(project); } } // count the languages List<String> languageList = new ArrayList<>(); for (Project p : projectList) { if (StringUtils.isEmpty(p.getPrimaryLanguage())) { logger.info(String.format("No primary programming language set for project [%s].", p.getName())); continue; } languageList.add(p.getPrimaryLanguage()); } List<Language> languages = new ArrayList<>(); Set<String> languageSet = new HashSet<>(languageList); int frequency; for (String language : languageSet) { Language l = new Language(language); frequency = Collections.frequency(languageList, language); l.setPercentage((int) Math.round(((double) frequency) / languageList.size() * 100)); l.setProjectsCount(frequency); languages.add(l); } // sort if (languages.size() > 1) { Collections.sort(languages, c); } return languages; } }