package com.salesmanager.shop.filter; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.salesmanager.core.business.services.merchant.MerchantStoreService; import com.salesmanager.core.business.services.reference.language.LanguageService; import com.salesmanager.core.business.services.user.UserService; import com.salesmanager.core.business.utils.CacheUtils; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.core.model.user.User; import com.salesmanager.shop.admin.model.web.Menu; import com.salesmanager.shop.constants.Constants; import com.salesmanager.shop.utils.LanguageUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; public class AdminFilter extends HandlerInterceptorAdapter { private static final Logger LOGGER = LoggerFactory.getLogger(AdminFilter.class); @Inject private MerchantStoreService merchantService; @Inject private UserService userService; @Inject private LanguageService languageService; @Inject private CacheUtils cache; @Inject private LanguageUtils languageUtils; public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setCharacterEncoding("UTF-8"); @SuppressWarnings("unchecked") Map<String,Menu> menus = (Map<String,Menu>) cache.getFromCache("MENUMAP"); User user = (User)request.getSession().getAttribute(Constants.ADMIN_USER); String storeCode = MerchantStore.DEFAULT_STORE; MerchantStore store = (MerchantStore)request.getSession().getAttribute(Constants.ADMIN_STORE); String userName = request.getRemoteUser(); if(userName==null) {//** IMPORTANT FOR SPRING SECURITY **// //response.sendRedirect(new StringBuilder().append(request.getContextPath()).append("/").append("/admin").toString()); } else { if(user==null) { user = userService.getByUserName(userName); request.getSession().setAttribute(Constants.ADMIN_USER, user); if(user!=null) { storeCode = user.getMerchantStore().getCode(); } else { LOGGER.warn("User name not found " + userName); } store=null; } if(user==null) { response.sendRedirect(request.getContextPath() + "/admin/unauthorized.html"); return true; } if(!user.getAdminName().equals(userName)) { user = userService.getByUserName(userName); if(user!=null) { storeCode = user.getMerchantStore().getCode(); } else { LOGGER.warn("User name not found " + userName); } store=null; } } if(store==null) { store = merchantService.getByCode(storeCode); request.getSession().setAttribute(Constants.ADMIN_STORE, store); } request.setAttribute(Constants.ADMIN_STORE, store); Language language = languageUtils.getRequestLanguage(request, response); //Language language = (Language) request.getSession().getAttribute("LANGUAGE"); if(language==null) { //TODO get the Locale from Spring API, is it simply request.getLocale() ??? //if so then based on the Locale language locale.getLanguage() get the appropriate Language //object as represented below if(user!=null) { language = user.getDefaultLanguage(); if(language==null) { language = store.getDefaultLanguage(); } } else { language = store.getDefaultLanguage(); } request.getSession().setAttribute("LANGUAGE", language); } request.setAttribute(Constants.LANGUAGE, language); if(menus==null) { InputStream in = null; ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally try { in = (InputStream) this.getClass().getClassLoader().getResourceAsStream("admin/menu.json"); Map<String,Object> data = mapper.readValue(in, Map.class); Menu currentMenu = null; menus = new LinkedHashMap<String,Menu>(); List objects = (List)data.get("menus"); for(Object object : objects) { Menu m = getMenu(object); menus.put(m.getCode(),m); } cache.putInCache(menus,"MENUMAP"); } catch (JsonParseException e) { LOGGER.error("Error while creating menu", e); } catch (JsonMappingException e) { LOGGER.error("Error while creating menu", e); } catch (IOException e) { LOGGER.error("Error while creating menu", e); } finally { if(in !=null) { try { in.close(); } catch (Exception ignore) { // TODO: handle exception } } } } List<Menu> list = new ArrayList<Menu>(menus.values()); request.setAttribute("MENULIST", list); request.setAttribute("MENUMAP", menus); response.setCharacterEncoding("UTF-8"); return true; } private Menu getMenu(Object object) { Map o = (Map)object; Map menu = (Map)o.get("menu"); Menu m = new Menu(); m.setCode((String)menu.get("code")); m.setUrl((String)menu.get("url")); m.setIcon((String)menu.get("icon")); m.setRole((String)menu.get("role")); List menus = (List)menu.get("menus"); if(menus!=null) { for(Object oo : menus) { Menu mm = getMenu(oo); m.getMenus().add(mm); } } return m; } }