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.ui.admincentral.compatibility;
35
36 import info.magnolia.event.EventBus;
37 import info.magnolia.event.SystemEventBus;
38 import info.magnolia.i18nsystem.I18nizer;
39 import info.magnolia.ui.admincentral.AdmincentralModule;
40 import info.magnolia.ui.api.app.launcherlayout.AppLauncherGroupDefinition;
41 import info.magnolia.ui.api.app.launcherlayout.AppLauncherGroupEntryDefinition;
42 import info.magnolia.ui.api.app.launcherlayout.AppLauncherLayoutDefinition;
43 import info.magnolia.ui.api.app.launcherlayout.AppLauncherLayoutManager;
44 import info.magnolia.ui.api.app.launcherlayout.AppLauncherLayoutManagerImpl;
45 import info.magnolia.ui.api.app.launcherlayout.ConfiguredAppLauncherGroupDefinition;
46 import info.magnolia.ui.api.app.launcherlayout.ConfiguredAppLauncherLayoutDefinition;
47 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
48
49 import java.util.Collection;
50 import java.util.stream.Collectors;
51 import java.util.stream.Stream;
52
53 import javax.inject.Inject;
54 import javax.inject.Named;
55 import javax.inject.Provider;
56 import javax.inject.Singleton;
57
58
59
60
61 @Singleton
62 public class CompatibilityAppLauncherLayoutManager extends AppLauncherLayoutManagerImpl {
63
64 private final Provider<AdmincentralModule> oldAdmincentralModule;
65 private final Provider<info.magnolia.admincentral.AdmincentralModule> newAdmincentralModule;
66
67 @Inject
68 public CompatibilityAppLauncherLayoutManager(AppDescriptorRegistry appDescriptorRegistry, @Named(SystemEventBus.NAME) EventBus systemEventBus, Provider<I18nizer> i18nizerProvider, Provider<AdmincentralModule> oldAdmincentralModule, Provider<info.magnolia.admincentral.AdmincentralModule> newAdmincentralModule) {
69 super(appDescriptorRegistry, systemEventBus, i18nizerProvider);
70 this.oldAdmincentralModule = oldAdmincentralModule;
71 this.newAdmincentralModule = newAdmincentralModule;
72 }
73
74 @Override
75 public void setLayout(AppLauncherLayoutDefinition layout) {
76 super.setLayout(mergeLayouts(
77 newAdmincentralModule.get().getAppLauncherLayout(),
78 oldAdmincentralModule.get().getAppLauncherLayout())
79 );
80 }
81
82 AppLauncherLayoutDefinition mergeLayouts(AppLauncherLayoutDefinition newConfig, AppLauncherLayoutDefinition oldConfig) {
83 final ConfiguredAppLauncherLayoutDefinition mergedConfig = new ConfiguredAppLauncherLayoutDefinition();
84
85 mergedConfig.setDefaultGroup(newConfig.getDefaultGroup() == null ? oldConfig.getDefaultGroup() : newConfig.getDefaultGroup());
86
87 mergedConfig.setHiddenApps(Stream.of(newConfig.getHiddenApps(), oldConfig.getHiddenApps())
88 .flatMap(Collection::stream)
89 .collect(Collectors.toList())
90 );
91
92 Stream<AppLauncherGroupDefinition> oldGroupsMergedWithNewGroups = mergeOldWithNewGroups(newConfig, oldConfig);
93 mergedConfig.setGroups(Stream.concat(oldGroupsMergedWithNewGroups, getUniqueGroupsFromNewConfig(newConfig, oldConfig)).collect(Collectors.toList()));
94 return mergedConfig;
95 }
96
97 private Stream<AppLauncherGroupDefinition> getUniqueGroupsFromNewConfig(AppLauncherLayoutDefinition newConfig, AppLauncherLayoutDefinition oldConfig) {
98 return newConfig.getGroups().stream().filter(appLauncherGroupDefinition -> !getGroupsFromConfig(oldConfig, appLauncherGroupDefinition.getName()).findFirst().isPresent());
99 }
100
101 private Stream<AppLauncherGroupDefinition> mergeOldWithNewGroups(AppLauncherLayoutDefinition newConfig, AppLauncherLayoutDefinition oldConfig) {
102 return oldConfig.getGroups().stream()
103 .map(oldLauncherGroupDefinition -> {
104 final ConfiguredAppLauncherGroupDefinition groupDefinition = new ConfiguredAppLauncherGroupDefinition();
105 groupDefinition.setName(oldLauncherGroupDefinition.getName());
106 groupDefinition.setLabel(oldLauncherGroupDefinition.getLabel());
107 groupDefinition.setPermissions(oldLauncherGroupDefinition.getPermissions());
108 groupDefinition.setClientGroup(oldLauncherGroupDefinition.isClientGroup());
109 groupDefinition.setColor(oldLauncherGroupDefinition.getColor());
110 groupDefinition.setPermanent(oldLauncherGroupDefinition.isPermanent());
111 groupDefinition.setApps(Stream.concat(
112 getGroupsFromConfig(newConfig, oldLauncherGroupDefinition.getName()),
113 oldLauncherGroupDefinition.getApps().stream()
114 ).collect(Collectors.toList()));
115 return groupDefinition;
116 });
117 }
118
119 private Stream<AppLauncherGroupEntryDefinition> getGroupsFromConfig(AppLauncherLayoutDefinition newConfig, String groupName) {
120 return newConfig.getGroups().stream()
121 .filter(appLauncherGroupDefinition -> appLauncherGroupDefinition.getName().equals(groupName))
122 .flatMap(appLauncherGroupDefinition -> appLauncherGroupDefinition.getApps().stream());
123 }
124 }