blob: 02916f8913cbd75b07be57ff85feeaa78db3c46e [file] [log] [blame]
/*******************************************************************************
* 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() {
}
}