Search in sources :

Example 1 with PkgSearchSpecification

use of org.haiku.haikudepotserver.pkg.model.PkgSearchSpecification in project haikudepotserver by haiku.

the class HomeController method home.

/**
 * <p>This is the entry point for the home page.  It will look at the parameters supplied and will
 * establish what should be displayed.</p>
 */
@RequestMapping(method = RequestMethod.GET)
public ModelAndView home(HttpServletRequest httpServletRequest, @RequestParam(value = KEY_OFFSET, defaultValue = "0") Integer offset, @RequestParam(value = KEY_REPOSITORIESCODES, required = false) String repositoryCodes, @RequestParam(value = KEY_ARCHITECTURECODE, required = false) String architectureCode, @RequestParam(value = KEY_PKGCATEGORYCODE, required = false) String pkgCategoryCode, @RequestParam(value = KEY_SEARCHEXPRESSION, required = false) String searchExpression, @RequestParam(value = KEY_VIEWCRITERIATYPECODE, required = false) ViewCriteriaType viewCriteriaType) {
    ObjectContext context = serverRuntime.newContext();
    if (Strings.isNullOrEmpty(architectureCode)) {
        architectureCode = defaultArchitectureCode;
    }
    if (null == repositoryCodes) {
        repositoryCodes = Repository.CODE_DEFAULT;
    }
    // ------------------------------
    // FETCH THE DATA
    PkgSearchSpecification searchSpecification = new PkgSearchSpecification();
    searchSpecification.setOffset(offset);
    searchSpecification.setLimit(PAGESIZE);
    searchSpecification.setExpression(searchExpression);
    searchSpecification.setExpressionType(AbstractSearchSpecification.ExpressionType.CONTAINS);
    Repository repository = StringUtils.isBlank(repositoryCodes) ? null : Repository.getByCode(context, repositoryCodes);
    searchSpecification.setRepositories(null == repository ? Repository.getAllActive(context) : Collections.singletonList(repository));
    Architecture architecture = Architecture.getByCode(context, architectureCode);
    searchSpecification.setArchitectures(ImmutableList.of(architecture, Architecture.getByCode(context, Architecture.CODE_ANY)));
    Optional<PkgCategory> pkgCategoryOptional = Optional.empty();
    if (null != pkgCategoryCode) {
        pkgCategoryOptional = PkgCategory.getByCode(context, pkgCategoryCode);
    }
    NaturalLanguage naturalLanguage = NaturalLanguageWebHelper.deriveNaturalLanguage(context, httpServletRequest);
    searchSpecification.setNaturalLanguage(naturalLanguage);
    switch(null == viewCriteriaType ? ViewCriteriaType.FEATURED : viewCriteriaType) {
        case FEATURED:
            searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.PROMINENCE);
            break;
        case CATEGORIES:
            searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.NAME);
            searchSpecification.setPkgCategory(pkgCategoryOptional.orElseThrow(() -> new IllegalStateException("the pkg category code was unable to be found; " + pkgCategoryCode)));
            break;
        case ALL:
            searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.NAME);
            break;
        case MOSTVIEWED:
            searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.VERSIONVIEWCOUNTER);
            break;
        case MOSTRECENT:
            searchSpecification.setSortOrdering(PkgSearchSpecification.SortOrdering.VERSIONCREATETIMESTAMP);
            break;
        default:
            throw new IllegalStateException("unhandled view criteria type");
    }
    Long totalPkgVersions = pkgService.total(context, searchSpecification);
    if (searchSpecification.getOffset() > totalPkgVersions) {
        searchSpecification.setOffset(totalPkgVersions.intValue());
    }
    List<PkgVersion> pkgVersions = pkgService.search(context, searchSpecification);
    // ------------------------------
    // GENERATE OUTPUT
    HomeData data = new HomeData();
    data.setNaturalLanguage(naturalLanguage);
    final Set<String> excludedArchitectureCode = ImmutableSet.of(Architecture.CODE_ANY, Architecture.CODE_SOURCE);
    data.setAllArchitectures(Architecture.getAll(context).stream().filter(a -> !excludedArchitectureCode.contains(a.getCode())).collect(Collectors.toList()));
    data.setArchitecture(architecture);
    data.setRepository(repository);
    data.setAllRepositories(Repository.getAllActive(context));
    data.setAllPkgCategories(PkgCategory.getAll(context));
    data.setPkgCategory(pkgCategoryOptional.orElseGet(() -> PkgCategory.getAll(context).get(0)));
    data.setAllViewCriteriaTypes(ImmutableList.copyOf(ViewCriteriaType.values()));
    data.setViewCriteriaType(viewCriteriaType);
    data.setSearchExpression(searchExpression);
    data.setPkgVersions(pkgVersions);
    if (0 != totalPkgVersions.intValue()) {
        data.setPagination(new Pagination(totalPkgVersions.intValue(), offset, PAGESIZE));
    }
    httpServletRequest.setAttribute(MultipageConstants.KEY_PKGLOCALIZATIONLOOKUPSERVICE, new FixedPkgLocalizationLookupServiceImpl(context, pkgVersions, naturalLanguage));
    httpServletRequest.setAttribute(MultipageConstants.KEY_SERVERRUNTIME, serverRuntime);
    ModelAndView result = new ModelAndView("multipage/home");
    result.addObject("data", data);
    return result;
}
Also used : FixedPkgLocalizationLookupServiceImpl(org.haiku.haikudepotserver.pkg.FixedPkgLocalizationLookupServiceImpl) ModelAndView(org.springframework.web.servlet.ModelAndView) Pagination(org.haiku.haikudepotserver.multipage.model.Pagination) ObjectContext(org.apache.cayenne.ObjectContext) PkgSearchSpecification(org.haiku.haikudepotserver.pkg.model.PkgSearchSpecification) RequestMapping(org.springframework.web.bind.annotation.RequestMapping)

Aggregations

ObjectContext (org.apache.cayenne.ObjectContext)1 Pagination (org.haiku.haikudepotserver.multipage.model.Pagination)1 FixedPkgLocalizationLookupServiceImpl (org.haiku.haikudepotserver.pkg.FixedPkgLocalizationLookupServiceImpl)1 PkgSearchSpecification (org.haiku.haikudepotserver.pkg.model.PkgSearchSpecification)1 RequestMapping (org.springframework.web.bind.annotation.RequestMapping)1 ModelAndView (org.springframework.web.servlet.ModelAndView)1