1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.admincentral.findbar.search.apps;
35
36 import info.magnolia.periscope.operation.request.AppNavigationRequest;
37 import info.magnolia.periscope.search.SearchException;
38 import info.magnolia.periscope.search.SearchQuery;
39 import info.magnolia.periscope.search.SearchResult;
40 import info.magnolia.periscope.search.SearchResultSupplier;
41 import info.magnolia.periscope.search.SearchResultSupplierDefinition;
42 import info.magnolia.ui.api.app.launcherlayout.AppLauncherGroupEntry;
43 import info.magnolia.ui.api.app.launcherlayout.AppLauncherLayout;
44 import info.magnolia.ui.api.app.launcherlayout.AppLauncherLayoutManager;
45 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
46
47 import java.util.stream.Stream;
48
49 import org.apache.commons.lang3.StringUtils;
50
51
52
53
54
55 public class AppSearchResultSupplier implements SearchResultSupplier {
56
57 public static final String APPS_SUPPLIER_NAME = "apps";
58
59 private final SearchResultSupplierDefinition definition;
60 private final AppLauncherLayoutManager appLauncherLayoutManager;
61
62 public AppSearchResultSupplier(AppSearchResultSupplierDefinition definition, AppLauncherLayoutManager appLauncherLayoutManager) {
63 this.definition = definition;
64 this.appLauncherLayoutManager = appLauncherLayoutManager;
65 }
66
67 @Override
68 public String getName() {
69 return APPS_SUPPLIER_NAME;
70 }
71
72 @Override
73 public Stream<SearchResult> search(SearchQuery query) throws SearchException {
74 AppLauncherLayout userLayout = appLauncherLayoutManager.getLayoutForUser(query.getCurrentUser());
75
76 return userLayout.getGroups().stream()
77 .flatMap(group -> group.getApps().stream())
78 .map(AppLauncherGroupEntry::getAppDescriptor)
79 .filter(descriptor -> StringUtils.containsIgnoreCase(descriptor.getLabel(), StringUtils.substringBeforeLast(query.getQuery(), " app"))
80 || StringUtils.containsIgnoreCase(descriptor.getName(), StringUtils.substringBeforeLast(query.getQuery(), " app")))
81 .map(descriptor -> SearchResult.builder()
82 .title(descriptor.getLabel())
83 .operationRequest(new AppNavigationRequest(descriptor.getName()))
84 .type(StringUtils.defaultIfBlank(descriptor.getIcon(), "icon-app"))
85 .build()
86 )
87 .limit(definition.getResultLimit());
88 }
89 }