blob: 50700422135eb728f5f81d254f2d417f943a6f19 [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.ofbiz.order.shoppingcart;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilValidate;
import org.ofbiz.entity.Delegator;
import org.ofbiz.entity.DelegatorFactory;
import org.ofbiz.entity.GenericEntityException;
import org.ofbiz.entity.GenericValue;
import org.ofbiz.entity.transaction.TransactionUtil;
import org.ofbiz.webapp.stats.VisitHandler;
/**
* HttpSessionListener that saves information about abandoned carts
*/
public class CartEventListener implements HttpSessionListener {
public static final String module = CartEventListener.class.getName();
public CartEventListener() {}
public void sessionCreated(HttpSessionEvent event) {
//for this one do nothing when the session is created...
//HttpSession session = event.getSession();
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ShoppingCart cart = (ShoppingCart) session.getAttribute("shoppingCart");
if (cart == null) {
Debug.logInfo("No cart to save, doing nothing.", module);
return;
}
String delegatorName = (String) session.getAttribute("delegatorName");
Delegator delegator = null;
if (UtilValidate.isNotEmpty(delegatorName)) {
delegator = DelegatorFactory.getDelegator(delegatorName);
}
if (delegator == null) {
Debug.logError("Could not find delegator with delegatorName in session, not saving abandoned cart info.", module);
return;
}
boolean beganTransaction = false;
try {
beganTransaction = TransactionUtil.begin();
GenericValue visit = VisitHandler.getVisit(session);
if (visit == null) {
if (UtilProperties.propertyValueEqualsIgnoreCase("serverstats", "stats.persist.visit", "false")) return;
Debug.logError("Could not get the current visit, not saving abandoned cart info.", module);
return;
}
Debug.logInfo("Saving abandoned cart", module);
int seqId = 1;
for(ShoppingCartItem cartItem : cart) {
GenericValue cartAbandonedLine = delegator.makeValue("CartAbandonedLine");
cartAbandonedLine.set("visitId", visit.get("visitId"));
cartAbandonedLine.set("cartAbandonedLineSeqId", (Integer.valueOf(seqId)).toString());
cartAbandonedLine.set("productId", cartItem.getProductId());
cartAbandonedLine.set("prodCatalogId", cartItem.getProdCatalogId());
cartAbandonedLine.set("quantity", cartItem.getQuantity());
cartAbandonedLine.set("reservStart", cartItem.getReservStart());
cartAbandonedLine.set("reservLength", cartItem.getReservLength());
cartAbandonedLine.set("reservPersons", cartItem.getReservPersons());
cartAbandonedLine.set("unitPrice", cartItem.getBasePrice());
cartAbandonedLine.set("reserv2ndPPPerc", cartItem.getReserv2ndPPPerc());
cartAbandonedLine.set("reservNthPPPerc", cartItem.getReservNthPPPerc());
if (cartItem.getConfigWrapper() != null) {
cartAbandonedLine.set("configId", cartItem.getConfigWrapper().getConfigId());
}
cartAbandonedLine.set("totalWithAdjustments", cartItem.getItemSubTotal());
//not doing pre-reservations now, so this is always N
cartAbandonedLine.set("wasReserved", "N");
cartAbandonedLine.create();
seqId++;
}
} catch (GenericEntityException e) {
try {
// only rollback the transaction if we started one...
TransactionUtil.rollback(beganTransaction, "Error saving abandoned cart info", e);
} catch (GenericEntityException e2) {
Debug.logError(e2, "Could not rollback transaction: " + e2.toString(), module);
}
Debug.logError(e, "An entity engine error occurred while saving abandoned cart information", module);
} finally {
// only commit the transaction if we started one... this will throw an exception if it fails
try {
TransactionUtil.commit(beganTransaction);
} catch (GenericEntityException e) {
Debug.logError(e, "Could not commit transaction for entity engine error occurred while saving abandoned cart information", module);
}
}
}
}