1
|
package eu.dnetlib.uoaadmintools.services;
|
2
|
|
3
|
import eu.dnetlib.uoaadmintools.dao.MenuDAO;
|
4
|
import eu.dnetlib.uoaadmintools.dao.MenuItemDAO;
|
5
|
import eu.dnetlib.uoaadmintools.entities.menu.Menu;
|
6
|
import eu.dnetlib.uoaadmintools.entities.menu.MenuFull;
|
7
|
import eu.dnetlib.uoaadmintools.entities.menu.MenuItem;
|
8
|
import eu.dnetlib.uoaadmintools.entities.menu.MenuItemFull;
|
9
|
import eu.dnetlib.uoaadmintoolslibrary.handlers.ContentNotFoundException;
|
10
|
import eu.dnetlib.uoaadmintoolslibrary.handlers.MismatchingContentException;
|
11
|
import org.apache.log4j.Logger;
|
12
|
import org.springframework.beans.factory.annotation.Autowired;
|
13
|
import org.springframework.stereotype.Service;
|
14
|
|
15
|
import java.util.ArrayList;
|
16
|
import java.util.List;
|
17
|
|
18
|
@Service
|
19
|
public class MenuService {
|
20
|
private final Logger log = Logger.getLogger(this.getClass());
|
21
|
|
22
|
@Autowired
|
23
|
private MenuDAO menuDAO;
|
24
|
|
25
|
@Autowired
|
26
|
private MenuItemDAO menuItemDAO;
|
27
|
|
28
|
public MenuItem getMenuItem(String id) {
|
29
|
return menuItemDAO.findById(id);
|
30
|
}
|
31
|
|
32
|
public MenuItemFull getMenuItemFull(String id) {
|
33
|
return this.getMenuItemFull(id, 1);
|
34
|
}
|
35
|
|
36
|
public MenuItemFull getMenuItemFull(String id, int maxDepth) {
|
37
|
MenuItem menuItem = menuItemDAO.findById(id);
|
38
|
MenuItemFull menuItemFull = new MenuItemFull(menuItem);
|
39
|
if(maxDepth == 0) {
|
40
|
menuItemFull.setItems(new ArrayList<>());
|
41
|
return menuItemFull;
|
42
|
}
|
43
|
|
44
|
List<MenuItemFull> menuItemsFull = new ArrayList<>();
|
45
|
for(String menuItemString : menuItem.getItems()) {
|
46
|
menuItemsFull.add(this.getMenuItemFull(menuItemString, maxDepth-1));
|
47
|
}
|
48
|
menuItemFull.setItems(menuItemsFull);
|
49
|
|
50
|
return menuItemFull;
|
51
|
}
|
52
|
|
53
|
public List<MenuItem> getMenuItemsByParent(String parentId, String portalPid) {
|
54
|
if(portalPid != null) {
|
55
|
return menuItemDAO.findByParentItemIdAndPortalPid(parentId, portalPid);
|
56
|
} else {
|
57
|
return menuItemDAO.findByParentItemId(parentId);
|
58
|
}
|
59
|
}
|
60
|
|
61
|
public List<MenuItemFull> getRootMenuItemsFull(String portalPid) {
|
62
|
List<MenuItem> rootMenuItems = this.getMenuItemsByParent(null, portalPid);
|
63
|
List<MenuItemFull> rootMenuItemsFull = new ArrayList<>();
|
64
|
for(MenuItem rootMenuItem : rootMenuItems) {
|
65
|
MenuItemFull rootMenuItemFull = new MenuItemFull(rootMenuItem);
|
66
|
|
67
|
List<MenuItemFull> childrenMenuItemsFull = new ArrayList<>();
|
68
|
for(String childMenuItemString : rootMenuItem.getItems()) {
|
69
|
childrenMenuItemsFull.add(this.getMenuItemFull(childMenuItemString));
|
70
|
}
|
71
|
rootMenuItemFull.setItems(childrenMenuItemsFull);
|
72
|
rootMenuItemsFull.add(rootMenuItemFull);
|
73
|
}
|
74
|
|
75
|
return rootMenuItemsFull;
|
76
|
}
|
77
|
|
78
|
public MenuFull getMenuFull(String portalPid) {
|
79
|
MenuFull menuFull = new MenuFull();
|
80
|
|
81
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
82
|
List<MenuItemFull> featuredMenuItems = new ArrayList<>();
|
83
|
List<MenuItemFull> menuItems = new ArrayList<>();
|
84
|
|
85
|
if(menu == null) {
|
86
|
menuFull.setFeaturedMenuEnabled(true);
|
87
|
menuFull.setMenuEnabled(true);
|
88
|
} else {
|
89
|
for (String menuItemId : menu.getFeaturedMenuItems()) {
|
90
|
featuredMenuItems.add(getFullRootMenuItemById(menuItemId, portalPid, true));
|
91
|
}
|
92
|
|
93
|
for (String menuItemId : menu.getMenuItems()) {
|
94
|
menuItems.add(getFullRootMenuItemById(menuItemId, portalPid, false));
|
95
|
}
|
96
|
|
97
|
menuFull.setFeaturedMenuEnabled(menu.getIsFeaturedMenuEnabled());
|
98
|
menuFull.setMenuEnabled(menu.getIsMenuEnabled());
|
99
|
}
|
100
|
|
101
|
menuFull.setPortalPid(portalPid);
|
102
|
menuFull.setFeaturedMenuItems(featuredMenuItems);
|
103
|
menuFull.setMenuItems(menuItems);
|
104
|
|
105
|
return menuFull;
|
106
|
}
|
107
|
|
108
|
private MenuItemFull getFullRootMenuItemById(String menuItemId, String portalPid, Boolean isFeatured) {
|
109
|
MenuItem rootMenuItem = menuItemDAO.findById(menuItemId);
|
110
|
if(rootMenuItem.getIsFeatured() != isFeatured) {
|
111
|
// EXCEPTION - MismatchingContent
|
112
|
throw new MismatchingContentException("getFullRootMenuItemById: Menu item should "+(isFeatured ? "" : "not ")+"be featured");
|
113
|
}
|
114
|
if(!rootMenuItem.getPortalPid().equals(portalPid)) {
|
115
|
// EXCEPTION - MismatchingContent
|
116
|
throw new MismatchingContentException("getFullRootMenuItemById: Menu item with id: "+rootMenuItem.getId()+" has portal pid: "+rootMenuItem.getPortalPid()+" instead of "+portalPid);
|
117
|
}
|
118
|
if(rootMenuItem.getParentItemId() != null) {
|
119
|
// EXCEPTION - MismatchingContent
|
120
|
throw new MismatchingContentException("getFullRootMenuItemById: Menu item should be root (no parentId), but instead parentId: "+rootMenuItem.getParentItemId());
|
121
|
}
|
122
|
|
123
|
MenuItemFull rootMenuItemFull = new MenuItemFull(rootMenuItem);
|
124
|
|
125
|
List<MenuItemFull> childrenMenuItemsFull = new ArrayList<>();
|
126
|
for(String childMenuItemString : rootMenuItem.getItems()) {
|
127
|
childrenMenuItemsFull.add(this.getMenuItemFull(childMenuItemString));
|
128
|
}
|
129
|
rootMenuItemFull.setItems(childrenMenuItemsFull);
|
130
|
return rootMenuItemFull;
|
131
|
}
|
132
|
|
133
|
private MenuItemFull insertMenuItem(MenuItem menuItem, String portalPid) {
|
134
|
MenuItem parent = null;
|
135
|
if(menuItem.getParentItemId() != null && !menuItem.getParentItemId().equals("")) {
|
136
|
parent = getMenuItem(menuItem.getParentItemId());
|
137
|
if (!parent.getPortalPid().equals(portalPid)) {
|
138
|
// EXCEPTION - MismatchingContent
|
139
|
throw new MismatchingContentException("insertMenuItem: parent ("+parent.getParentItemId()+") of MenuItem has portalPid: " + parent.getPortalPid() + " instead of " + portalPid);
|
140
|
}
|
141
|
} else {
|
142
|
menuItem.setParentItemId(null);
|
143
|
}
|
144
|
|
145
|
if(menuItem.getItems() == null) {
|
146
|
List<String> menuItems = new ArrayList<String>();
|
147
|
menuItem.setItems(menuItems);
|
148
|
}
|
149
|
menuItemDAO.save(menuItem);
|
150
|
|
151
|
if(parent != null) {
|
152
|
List<String> siblingsOfNew = parent.getItems();
|
153
|
siblingsOfNew.add(menuItem.getId());
|
154
|
parent.setItems(siblingsOfNew);
|
155
|
menuItemDAO.save(parent);
|
156
|
}
|
157
|
|
158
|
MenuItemFull menuItemFull = new MenuItemFull(menuItem);
|
159
|
menuItemFull.setItems(new ArrayList<>());
|
160
|
|
161
|
|
162
|
|
163
|
return menuItemFull;
|
164
|
}
|
165
|
|
166
|
public MenuItemFull insertMenuItemInMenu(MenuItem menuItem, String portalPid) {
|
167
|
MenuItemFull menuItemFull = insertMenuItem(menuItem, portalPid);
|
168
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
169
|
if(menu == null) {
|
170
|
menu = new Menu(portalPid);
|
171
|
}
|
172
|
if(menuItem.getIsFeatured() && menuItem.getParentItemId() == null) {
|
173
|
menu.getFeaturedMenuItems().add(menuItemFull.getId());
|
174
|
} else if(menuItem.getParentItemId() == null) {
|
175
|
menu.getMenuItems().add(menuItemFull.getId());
|
176
|
}
|
177
|
menuDAO.save(menu);
|
178
|
return menuItemFull;
|
179
|
}
|
180
|
|
181
|
public MenuItemFull updateMenuItem(MenuItemFull menuItemFull) {
|
182
|
MenuItem menuItem = getMenuItemByMenuItemFull(menuItemFull);
|
183
|
|
184
|
// Update should not affect parent or children - only basic info can be updated
|
185
|
MenuItem oldMenuItem = getMenuItem(menuItemFull.getId());
|
186
|
menuItem.setItems(oldMenuItem.getItems());
|
187
|
menuItem.setParentItemId(oldMenuItem.getParentItemId());
|
188
|
|
189
|
menuItemDAO.save(menuItem);
|
190
|
menuItemFull = getMenuItemFull(menuItem.getId());
|
191
|
|
192
|
return menuItemFull;
|
193
|
}
|
194
|
|
195
|
public MenuItemFull updateMenu(MenuItemFull menuItemFull, String portalPid) {
|
196
|
menuItemFull = updateMenuItem(menuItemFull);
|
197
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
198
|
if(menu == null) {
|
199
|
// EXCEPTION - ContentNotFoundException
|
200
|
throw new ContentNotFoundException("updateMenu: No Menu found for portal pid: "+portalPid);
|
201
|
}
|
202
|
List<String> featuredMenuItems = menu.getFeaturedMenuItems();
|
203
|
List<String> menuItems = menu.getMenuItems();
|
204
|
if (menuItemFull.getIsFeatured() && menuItemFull.getParentItemId() == null && !featuredMenuItems.contains(menuItemFull.getId())) {
|
205
|
featuredMenuItems.add(menuItemFull.getId());
|
206
|
} else if ((!menuItemFull.getIsFeatured() || menuItemFull.getParentItemId() != null) && featuredMenuItems.contains(menuItemFull.getId())) {
|
207
|
featuredMenuItems.remove(menuItemFull.getId());
|
208
|
} else if(!menuItemFull.getIsFeatured() && menuItemFull.getParentItemId() == null && !menuItems.contains(menuItemFull.getId())) {
|
209
|
menuItems.add(menuItemFull.getId());
|
210
|
} else if ((menuItemFull.getIsFeatured() || menuItemFull.getParentItemId() != null) && menuItems.contains(menuItemFull.getId())) {
|
211
|
menuItems.remove(menuItemFull.getId());
|
212
|
}
|
213
|
menuDAO.save(menu);
|
214
|
|
215
|
return menuItemFull;
|
216
|
}
|
217
|
|
218
|
public Boolean deleteMenuItem(String id, String portalPid) throws Exception {
|
219
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
220
|
if(menu == null) {
|
221
|
// EXCEPTION - ContentNotFoundException
|
222
|
throw new ContentNotFoundException("deleteMenuItem: No Menu found for portal pid: "+portalPid);
|
223
|
}
|
224
|
List<String> featuredMenuItems = menu.getFeaturedMenuItems();
|
225
|
List<String> menuItems = menu.getMenuItems();
|
226
|
if(featuredMenuItems.contains(id)) {
|
227
|
featuredMenuItems.remove(id);
|
228
|
} else if(menuItems.contains(id)) {
|
229
|
menuItems.remove(id);
|
230
|
}
|
231
|
menuDAO.save(menu);
|
232
|
|
233
|
// menuItemDAO.delete(id);
|
234
|
log.debug("delete menu item; "+id);
|
235
|
List<String> menuItemsToDelete = new ArrayList<>();
|
236
|
menuItemsToDelete.add(id);
|
237
|
return deleteMenuItems(menuItemsToDelete, portalPid);
|
238
|
}
|
239
|
|
240
|
public Boolean deleteMenuItems(List<String> menuItems, String portalPid) throws Exception {
|
241
|
if(menuItems == null) {
|
242
|
return true;
|
243
|
}
|
244
|
for (String id: menuItems) {
|
245
|
MenuItem menuItem = menuItemDAO.findById(id);
|
246
|
|
247
|
if(!portalPid.equals(menuItem.getPortalPid())) {
|
248
|
// EXCEPTION - MismatchingContent
|
249
|
throw new MismatchingContentException("Delete Menu Items: MenuItem with id: "+id+" has portalPid: "+menuItem.getPortalPid()+" instead of "+portalPid);
|
250
|
}
|
251
|
|
252
|
deleteMenuItems(menuItem.getItems(), portalPid);
|
253
|
|
254
|
if(menuItem.getParentItemId() != null && !menuItem.getParentItemId().equals("")) {
|
255
|
MenuItem parent = menuItemDAO.findById(menuItem.getParentItemId());
|
256
|
List<String> siblingsOfDeleted = parent.getItems();
|
257
|
siblingsOfDeleted.remove(id);
|
258
|
parent.setItems(siblingsOfDeleted);
|
259
|
menuItemDAO.save(parent);
|
260
|
}
|
261
|
|
262
|
menuItemDAO.delete(id);
|
263
|
}
|
264
|
|
265
|
return true;
|
266
|
}
|
267
|
|
268
|
public Boolean deleteMenuByPortalPid(String portalPid) throws Exception {
|
269
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
270
|
if(menu != null) {
|
271
|
deleteMenuItems(menu.getMenuItems(), portalPid);
|
272
|
deleteMenuItems(menu.getFeaturedMenuItems(), portalPid);
|
273
|
menuDAO.deleteByPortalPid(portalPid);
|
274
|
}
|
275
|
return true;
|
276
|
}
|
277
|
|
278
|
public Boolean reorderMenuItems(List<MenuItemFull> menuItemsFull, String portalPid) {
|
279
|
List<String> menuItemIds = new ArrayList<>();
|
280
|
// menuItemIds = menuItemsFull.stream().map((MenuItem menuItem) -> menuItem.getId()).collect(Collectors.toList());
|
281
|
boolean isFeatured = menuItemsFull.get(0).getIsFeatured();
|
282
|
String parentId = menuItemsFull.get(0).getParentItemId();
|
283
|
|
284
|
for (MenuItemFull menuItem: menuItemsFull) {
|
285
|
if (!portalPid.equals(menuItem.getPortalPid())) {
|
286
|
// EXCEPTION - MismatchingContent
|
287
|
throw new MismatchingContentException("reorderMenuItems: MenuItems for reordering have not the same portalPid");
|
288
|
}
|
289
|
if(menuItem.getIsFeatured() != isFeatured) {
|
290
|
// EXCEPTION - MismatchingContent
|
291
|
throw new MismatchingContentException("reorderMenuItems: MenuItems for reordering have not the same isFeatured");
|
292
|
}
|
293
|
if((menuItem.getParentItemId() == null && parentId != null) || (parentId == null && menuItem.getParentItemId() != null) || (parentId != null && !menuItem.getParentItemId().equals(parentId))) {
|
294
|
// EXCEPTION - MismatchingContent
|
295
|
throw new MismatchingContentException("reorderMenuItems: MenuItems for reordering have not the same parentItemId");
|
296
|
}
|
297
|
menuItemIds.add(menuItem.getId());
|
298
|
|
299
|
}
|
300
|
|
301
|
List<String> savedMenuItems;
|
302
|
if(parentId != null) {
|
303
|
MenuItem parent = menuItemDAO.findById(parentId);
|
304
|
savedMenuItems = parent.getItems();
|
305
|
menuItemIds = this.addSavedMenuItems(savedMenuItems, menuItemIds, menuItemsFull);
|
306
|
parent.setItems(menuItemIds);
|
307
|
menuItemDAO.save(parent);
|
308
|
} else if(isFeatured) {
|
309
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
310
|
savedMenuItems = menu.getFeaturedMenuItems();
|
311
|
menuItemIds = this.addSavedMenuItems(savedMenuItems, menuItemIds, menuItemsFull);
|
312
|
menu.setFeaturedMenuItems(menuItemIds);
|
313
|
menuDAO.save(menu);
|
314
|
} else {
|
315
|
Menu menu = menuDAO.findByPortalPid(portalPid);
|
316
|
savedMenuItems = menu.getMenuItems();
|
317
|
menuItemIds = this.addSavedMenuItems(savedMenuItems, menuItemIds, menuItemsFull);
|
318
|
menu.setMenuItems(menuItemIds);
|
319
|
menuDAO.save(menu);
|
320
|
}
|
321
|
|
322
|
return true;
|
323
|
}
|
324
|
|
325
|
private List<String> addSavedMenuItems(List<String> savedMenuItems, List<String> menuItemIds, List<MenuItemFull> menuItemsFull) {
|
326
|
for (String menuId : savedMenuItems) {
|
327
|
if (!menuItemIds.contains(menuId)) {
|
328
|
menuItemIds.add(menuId);
|
329
|
}
|
330
|
}
|
331
|
return menuItemIds;
|
332
|
}
|
333
|
|
334
|
|
335
|
private MenuItem getMenuItemByMenuItemFull(MenuItemFull menuItemFull) {
|
336
|
MenuItem menuItem = new MenuItem();
|
337
|
menuItem.setId(menuItemFull.getId());
|
338
|
menuItem.setTitle(menuItemFull.getTitle());
|
339
|
menuItem.setUrl(menuItemFull.getUrl());
|
340
|
menuItem.setType(menuItemFull.getType());
|
341
|
menuItem.setTarget(menuItemFull.getTarget());
|
342
|
menuItem.setRoute(menuItemFull.getRoute());
|
343
|
menuItem.setPortalPid(menuItemFull.getPortalPid());
|
344
|
menuItem.setParentItemId(menuItemFull.getParentItemId());
|
345
|
menuItem.setIsFeatured(menuItemFull.getIsFeatured());
|
346
|
|
347
|
List<MenuItemFull> menuItemsFull = menuItemFull.getItems();
|
348
|
List<String> menuItems = new ArrayList<String>();
|
349
|
if(menuItemsFull != null) {
|
350
|
for (MenuItemFull childMenuItemFull : menuItemsFull) {
|
351
|
menuItems.add(childMenuItemFull.getId());
|
352
|
}
|
353
|
}
|
354
|
menuItem.setItems(menuItems);
|
355
|
|
356
|
return menuItem;
|
357
|
}
|
358
|
|
359
|
public Menu toggleMenu(String pid, String status, String isFeatured) throws Exception {
|
360
|
Menu menu = menuDAO.findByPortalPid(pid);
|
361
|
if(isFeatured != null && Boolean.parseBoolean(isFeatured)) {
|
362
|
menu.setFeaturedMenuEnabled(Boolean.parseBoolean(status));
|
363
|
} else {
|
364
|
menu.setMenuEnabled(Boolean.parseBoolean(status));
|
365
|
}
|
366
|
return menuDAO.save(menu);
|
367
|
}
|
368
|
}
|