Project

General

Profile

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
}
(4-4/7)