/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. *******************************************************************************/ package org.apache.ofbiz.widget.renderer.html; import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.xml.parsers.ParserConfigurationException; import org.apache.ofbiz.base.util.Debug; import org.apache.ofbiz.base.util.UtilGenerics; import org.apache.ofbiz.base.util.UtilHttp; import org.apache.ofbiz.base.util.UtilValidate; import org.apache.ofbiz.entity.GenericValue; import org.apache.ofbiz.widget.model.MenuFactory; import org.apache.ofbiz.widget.model.ModelMenu; import org.apache.ofbiz.widget.renderer.MenuStringRenderer; import org.xml.sax.SAXException; /** * Widget Library - HTML Menu Wrapper class - makes it easy to do the setup and render of a menu */ public class HtmlMenuWrapper { public static final String module = HtmlMenuWrapper.class.getName(); protected String resourceName; protected String menuName; protected HttpServletRequest request; protected HttpServletResponse response; protected ModelMenu modelMenu; protected MenuStringRenderer renderer; protected Map<String, Object> context; protected HtmlMenuWrapper() {} public HtmlMenuWrapper(String resourceName, String menuName, HttpServletRequest request, HttpServletResponse response) throws IOException, SAXException, ParserConfigurationException { init(resourceName, menuName, request, response); } public void init(String resourceName, String menuName, HttpServletRequest request, HttpServletResponse response) throws IOException, SAXException, ParserConfigurationException { this.resourceName = resourceName; this.menuName = menuName; this.request = request; this.response = response; this.modelMenu = MenuFactory.getMenuFromWebappContext(resourceName, menuName, request); this.renderer = getMenuRenderer(); this.context = new HashMap<String, Object>(); Map<String, Object> parameterMap = UtilHttp.getParameterMap(request); context.put("parameters", parameterMap); HttpSession session = request.getSession(); GenericValue userLogin = (GenericValue)session.getAttribute("userLogin"); context.put("userLogin", userLogin); //make sure the locale is in the context context.put("locale", UtilHttp.getLocale(request)); // if there was an error message, this is an error if (UtilValidate.isNotEmpty(request.getAttribute("_ERROR_MESSAGE_"))) { context.put("isError", Boolean.TRUE); } else { context.put("isError", Boolean.FALSE); } // if a parameter was passed saying this is an error, it is an error if ("true".equals(parameterMap.get("isError"))) { context.put("isError", Boolean.TRUE); } } public MenuStringRenderer getMenuRenderer() { return new HtmlMenuRenderer(request, response); } public String renderMenuString() throws IOException { HttpServletRequest req = ((HtmlMenuRenderer)renderer).request; ServletContext ctx = (ServletContext) req.getAttribute("servletContext"); if (ctx == null) { if (Debug.infoOn()) Debug.logInfo("in renderMenuString, ctx is null(0)" , ""); } Writer writer = new StringWriter(); modelMenu.renderMenuString(writer, context, renderer); HttpServletRequest req2 = ((HtmlMenuRenderer)renderer).request; ServletContext ctx2 = (ServletContext) req2.getAttribute("servletContext"); if (ctx2 == null) { if (Debug.infoOn()) Debug.logInfo("in renderMenuString, ctx is null(2)" , ""); } return writer.toString(); } /** * Tells the menu library whether this is a response to an error or not. * Defaults on initialization according to the presense of an errorMessage * in the request or if an isError parameter was passed to the page with * the value "true". If true then the prefilled values will come from the * parameters Map instead of the value Map. */ public void setIsError(boolean isError) { this.context.put("isError", Boolean.valueOf(isError)); } public boolean getIsError() { Boolean isErrorBoolean = (Boolean) this.context.get("isError"); if (isErrorBoolean == null) { return false; } else { return isErrorBoolean.booleanValue(); } } public void setMenuOverrideName(String menuName) { this.context.put("menuName", menuName); } public void putInContext(String name, Object value) { this.context.put(name, value); } public void putInContext(String menuItemName, String valueName, Object value) { Map<String, Object> valueMap = UtilGenerics.toMap(context.get(menuItemName)); if (valueMap == null) { valueMap = new HashMap<String, Object>(); context.put(menuItemName, valueMap); } valueMap.put(valueName, value); } public Object getFromContext(String name) { return this.context.get(name); } public Object getFromContext(String menuItemName, String valueName) { Map<String, Object> valueMap = UtilGenerics.toMap(context.get(menuItemName)); if (valueMap == null) { valueMap = new HashMap<String, Object>(); context.put(menuItemName, valueMap); } return valueMap.get(valueName); } public ModelMenu getModelMenu() { return modelMenu; } public MenuStringRenderer getRenderer() { return renderer; } public void setRenderer(MenuStringRenderer renderer) { this.renderer = renderer; } public void setRequest(HttpServletRequest request) { this.request = request; ((HtmlMenuRenderer)renderer).setRequest(request); } public void setResponse(HttpServletResponse response) { this.response = response; ((HtmlMenuRenderer)renderer).setResponse(response); } public HttpServletRequest getRequest() { return ((HtmlMenuRenderer)renderer).request; } public HttpServletResponse getResponse() { return ((HtmlMenuRenderer)renderer).response; } public static HtmlMenuWrapper getMenuWrapper(HttpServletRequest request, HttpServletResponse response, HttpSession session, String menuDefFile, String menuName, String menuWrapperClassName) { HtmlMenuWrapper menuWrapper = null; String menuSig = menuDefFile + "__" + menuName; if (session != null) { menuWrapper = (HtmlMenuWrapper)session.getAttribute(menuSig); } if (menuWrapper == null) { try { Class<?> cls = Class.forName("org.apache.ofbiz.widget.html." + menuWrapperClassName); menuWrapper = (HtmlMenuWrapper)cls.newInstance(); menuWrapper.init(menuDefFile, menuName, request, response); } catch (InstantiationException e) { throw new RuntimeException(e.getMessage()); } catch (IllegalAccessException e2) { throw new RuntimeException(e2.getMessage()); } catch (ClassNotFoundException e3) { throw new RuntimeException("Class not found:" + e3.getMessage()); } catch (IOException e4) { throw new RuntimeException(e4.getMessage()); } catch (SAXException e5) { throw new RuntimeException(e5.getMessage()); } catch (ParserConfigurationException e6) { throw new RuntimeException(e6.getMessage()); } } else { menuWrapper.setRequest(request); menuWrapper.setResponse(response); Map<String, Object> parameterMap = UtilHttp.getParameterMap(request); menuWrapper.setParameters(parameterMap); GenericValue userLogin = (GenericValue)session.getAttribute("userLogin"); menuWrapper.putInContext("userLogin", userLogin); } if (session != null) { session.setAttribute(menuSig, menuWrapper); } return menuWrapper; } public void setParameters(Map<String, Object> paramMap) { context.put("parameters", paramMap); } }