| /******************************************************************************* |
| * 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.cmssite.multisite; |
| |
| import java.io.IOException; |
| import java.util.Locale; |
| |
| import javax.servlet.Filter; |
| import javax.servlet.FilterChain; |
| import javax.servlet.FilterConfig; |
| import javax.servlet.ServletContext; |
| import javax.servlet.ServletException; |
| import javax.servlet.ServletRequest; |
| import javax.servlet.ServletResponse; |
| import javax.servlet.http.HttpServletRequest; |
| import javax.servlet.http.HttpServletResponse; |
| import javax.servlet.http.HttpSession; |
| |
| import org.apache.ofbiz.base.util.Debug; |
| import org.apache.ofbiz.base.util.UtilHttp; |
| import org.apache.ofbiz.base.util.UtilMisc; |
| import org.apache.ofbiz.base.util.UtilValidate; |
| import org.apache.ofbiz.entity.Delegator; |
| import org.apache.ofbiz.entity.DelegatorFactory; |
| import org.apache.ofbiz.entity.GenericEntityException; |
| import org.apache.ofbiz.entity.GenericValue; |
| import org.apache.ofbiz.entity.util.EntityQuery; |
| import org.apache.ofbiz.order.shoppingcart.CartItemModifyException; |
| import org.apache.ofbiz.order.shoppingcart.ShoppingCart; |
| import org.apache.ofbiz.security.Security; |
| import org.apache.ofbiz.security.SecurityConfigurationException; |
| import org.apache.ofbiz.security.SecurityFactory; |
| import org.apache.ofbiz.service.LocalDispatcher; |
| import org.apache.ofbiz.webapp.control.RequestHandler; |
| import org.apache.ofbiz.webapp.stats.VisitHandler; |
| |
| // Used to filter website on the basis of hosted pathAlias. |
| public class WebSiteFilter implements Filter { |
| |
| public static final String MODULE = WebSiteFilter.class.getName(); |
| |
| protected FilterConfig m_config = null; |
| |
| @Override |
| public void init(FilterConfig filterConfig) throws ServletException { |
| m_config = filterConfig; |
| m_config.getServletContext().setAttribute("MULTI_SITE_ENABLED", true); |
| } |
| |
| @Override |
| public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { |
| HttpServletRequest httpRequest = (HttpServletRequest) request; |
| HttpServletResponse httpResponse = (HttpServletResponse) response; |
| HttpSession session = httpRequest.getSession(); |
| |
| String webSiteId = (String) m_config.getServletContext().getAttribute("webSiteId"); |
| String pathInfo = httpRequest.getPathInfo(); |
| // get the WebSite id segment, cheat here and use existing logic |
| String webSiteAlias = RequestHandler.getRequestUri(pathInfo); |
| Delegator delegator = (Delegator) httpRequest.getSession().getServletContext().getAttribute("delegator"); |
| LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); |
| |
| setWebContextObjects(httpRequest, httpResponse, delegator, dispatcher); |
| |
| GenericValue webSite = null; |
| try { |
| if (UtilValidate.isNotEmpty(webSiteAlias) && webSite != null) { |
| webSite = EntityQuery.use(delegator).from("WebSite").where("hostedPathAlias", webSiteAlias).cache().queryFirst(); |
| } |
| if (UtilValidate.isEmpty(webSite)) { |
| webSite = EntityQuery.use(delegator).from("WebSite").where("isDefault", "Y").cache().queryFirst(); |
| } |
| } catch (GenericEntityException e) { |
| Debug.logError(e, MODULE); |
| } |
| if (webSite != null) { |
| webSiteId = webSite.getString("webSiteId"); |
| GenericValue productStore = null; |
| try { |
| productStore = webSite.getRelatedOne("ProductStore", false); |
| } catch (GenericEntityException e) { |
| Debug.logError(e, MODULE); |
| } |
| |
| String newLocale = request.getParameter("newLocale"); |
| if (productStore != null && newLocale == null && session.getAttribute("locale") == null) { |
| newLocale = productStore.getString("defaultLocaleString"); |
| } else if (newLocale == null && session.getAttribute("locale") != null) { |
| newLocale = session.getAttribute("locale").toString(); |
| } |
| |
| if (newLocale == null) |
| newLocale = UtilHttp.getLocale(httpRequest).toString(); |
| // If the webSiteId has changed then invalidate the existing session |
| if (!webSiteId.equals(session.getAttribute("webSiteId"))) { |
| ShoppingCart cart = (ShoppingCart) session.getAttribute("shoppingCart"); |
| if (cart != null && !(webSite.getString("productStoreId").equals(cart.getProductStoreId())) ) { |
| // clearing cart items from previous store |
| cart.clear(); |
| // Put product Store for this webSite in cart |
| cart.setProductStoreId(webSite.getString("productStoreId")); |
| } |
| if (cart != null && productStore != null) { |
| Locale localeObj = UtilMisc.parseLocale(newLocale); |
| cart.setLocale(localeObj); |
| try { |
| cart.setCurrency(dispatcher, productStore.getString("defaultCurrencyUomId")); |
| } catch (CartItemModifyException e) { |
| Debug.logError(e, MODULE); |
| } |
| } |
| session.removeAttribute("webSiteId"); |
| session.setAttribute("webSiteId", webSiteId); |
| session.setAttribute("displayMaintenancePage", webSite.getString("displayMaintenancePage")); |
| } |
| request.setAttribute("webSiteId", webSiteId); |
| session.setAttribute("displayMaintenancePage", webSite.getString("displayMaintenancePage")); |
| if(UtilValidate.isEmpty(webSite.getString("hostedPathAlias"))) { |
| request.setAttribute("removePathAlias", false); |
| } else { |
| request.setAttribute("removePathAlias", true); |
| } |
| httpRequest = new MultiSiteRequestWrapper(httpRequest); |
| UtilHttp.setLocale(httpRequest, newLocale); |
| } |
| if (webSiteId != null) { |
| request.setAttribute("webSiteId", webSiteId); |
| } |
| chain.doFilter(httpRequest, response); |
| } |
| |
| private static void setWebContextObjects(HttpServletRequest request, HttpServletResponse response, Delegator delegator, LocalDispatcher dispatcher) { |
| HttpSession session = request.getSession(); |
| Security security = null; |
| try { |
| security = SecurityFactory.getInstance(delegator); |
| } catch (SecurityConfigurationException e) { |
| Debug.logError(e, MODULE); |
| } |
| request.setAttribute("delegator", delegator); |
| request.setAttribute("dispatcher", dispatcher); |
| request.setAttribute("security", security); |
| |
| session.setAttribute("delegatorName", delegator.getDelegatorName()); |
| session.setAttribute("delegator", delegator); |
| session.setAttribute("dispatcher", dispatcher); |
| session.setAttribute("security", security); |
| session.setAttribute("_WEBAPP_NAME_", UtilHttp.getApplicationName(request)); |
| |
| // get rid of the visit info since it was pointing to the previous database, and get a new one |
| session.removeAttribute("visitor"); |
| session.removeAttribute("visit"); |
| VisitHandler.getVisitor(request, response); |
| VisitHandler.getVisit(session); |
| } |
| @Override |
| public void destroy() { |
| } |
| } |