details: https://code.openbravo.com/erp/devel/pi/rev/81e679715102 changeset: 33421:81e679715102 user: Mark <markmm82 <at> gmail.com> date: Thu Feb 08 16:23:59 2018 -0500 summary: Fixes issue 37843: OrderEventHandler does useless and repeated queries when not needed.
OrderEventHandler class has been refactorized: - Removed unused vars. - Renamed newWarehouseId to newWarehouse as it store a Warehouse object instead of an ID - Renamed oldWarehouseId to oldWarehouse as it store a Warehouse object instead of an ID - Only executed query to get preferences after verify that values have changed. This way it avoids to execute unneeded queries. - Saved the orderLineCriteria.list() in a variable to avoid execute the same query more than once. - Merged the three used loops updating fields in only one that updates fields if needed. - Only loop is executed if at least one of the expected fields is changed and it is not activated the related preference. - Created new methods to make code more cleaned and reuse in similar cases. details: https://code.openbravo.com/erp/devel/pi/rev/3caf66446c5c changeset: 33422:3caf66446c5c user: David Miguelez <david.miguelez <at> openbravo.com> date: Fri Feb 09 12:43:18 2018 +0100 summary: Related to Issue 37843. Code Review changes. Refactor code to improve redability: * Encapsulated order parameters into a sub class that can be shared between methods * Split code of methods to reduce cognitive complexity * Removed comments since the code is self explanatory enough diffstat: src/org/openbravo/event/OrderEventHandler.java | 313 ++++++++++++++++++------ 1 files changed, 232 insertions(+), 81 deletions(-) diffs (truncated from 368 to 300 lines): diff -r 8a3e9044ea5e -r 3caf66446c5c src/org/openbravo/event/OrderEventHandler.java --- a/src/org/openbravo/event/OrderEventHandler.java Fri Feb 09 17:42:37 2018 -0500 +++ b/src/org/openbravo/event/OrderEventHandler.java Fri Feb 09 12:43:18 2018 +0100 @@ -11,7 +11,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU - * All portions are Copyright (C) 2013-2017 Openbravo SLU + * All portions are Copyright (C) 2013-2018 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************ @@ -19,9 +19,11 @@ package org.openbravo.event; import java.util.Date; +import java.util.List; import javax.enterprise.event.Observes; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.hibernate.Query; @@ -29,6 +31,7 @@ import org.openbravo.base.model.Entity; import org.openbravo.base.model.ModelProvider; import org.openbravo.base.model.Property; +import org.openbravo.base.structure.BaseOBObject; import org.openbravo.client.kernel.event.EntityDeleteEvent; import org.openbravo.client.kernel.event.EntityPersistenceEventObserver; import org.openbravo.client.kernel.event.EntityUpdateEvent; @@ -45,6 +48,9 @@ public class OrderEventHandler extends EntityPersistenceEventObserver { + private static final String DO_NOT_SYNC_WAREHOUSE_PREFERENCE = "DoNotSyncWarehouse"; + private static final String DO_NOT_SYNC_DATE_DELIVERED_PREFERENCE = "DoNotSyncDateDelivered"; + private static final String DO_NOT_SYNC_DATE_ORDERED_PREFERENCE = "DoNotSyncDateOrdered"; private static Entity[] entities = { ModelProvider.getInstance().getEntity(Order.ENTITY_NAME) }; protected Logger logger = Logger.getLogger(this.getClass()); @@ -53,95 +59,24 @@ return entities; } - public void onUpdate(@Observes - EntityUpdateEvent event) { + public void onUpdate(@Observes EntityUpdateEvent event) { if (!isValidEvent(event)) { return; } - final Entity orderEntity = ModelProvider.getInstance().getEntity(Order.ENTITY_NAME); - final Property orderDateProperty = orderEntity.getProperty(Order.PROPERTY_ORDERDATE); - final Property scheduledDateProperty = orderEntity - .getProperty(Order.PROPERTY_SCHEDULEDDELIVERYDATE); - final Property warehouseProperty = orderEntity.getProperty(Order.PROPERTY_WAREHOUSE); - final Property businessPartnerProperty = orderEntity - .getProperty(Order.PROPERTY_BUSINESSPARTNER); - String syncDateOrdered = null, syncDateDelivered = null, syncWarehouse = null; - String orderId = (String) event.getTargetInstance().getId(); - Date newOrderDate = (Date) event.getCurrentState(orderDateProperty); - Date oldOrderDate = (Date) event.getPreviousState(orderDateProperty); - Date newScheduledDate = (Date) event.getCurrentState(scheduledDateProperty); - Date oldScheduledDate = (Date) event.getPreviousState(scheduledDateProperty); - Warehouse newWarehouseId = (Warehouse) event.getCurrentState(warehouseProperty); - Warehouse oldWarehouseId = (Warehouse) event.getPreviousState(warehouseProperty); - String newBPId = ((BusinessPartner) event.getCurrentState(businessPartnerProperty)).getId(); - String oldBPId = ((BusinessPartner) event.getPreviousState(businessPartnerProperty)).getId(); - // Check whether the preference is set to sync with order header - try { - syncDateOrdered = Preferences.getPreferenceValue("DoNotSyncDateOrdered", true, OBContext - .getOBContext().getCurrentClient(), OBContext.getOBContext().getCurrentOrganization(), - OBContext.getOBContext().getUser(), OBContext.getOBContext().getRole(), null); - } catch (PropertyException e) { - // if property not found, sync the ordered date - syncDateOrdered = Preferences.NO; - } - try { - syncDateDelivered = Preferences.getPreferenceValue("DoNotSyncDateDelivered", true, OBContext - .getOBContext().getCurrentClient(), OBContext.getOBContext().getCurrentOrganization(), - OBContext.getOBContext().getUser(), OBContext.getOBContext().getRole(), null); - } catch (PropertyException e) { - // if property not found, sync the delivered date - syncDateDelivered = Preferences.NO; - } - OBCriteria<OrderLine> orderLineCriteria = OBDal.getInstance().createCriteria(OrderLine.class); - orderLineCriteria.add(Restrictions.eq(OrderLine.PROPERTY_SALESORDER, - OBDal.getInstance().get(Order.class, orderId))); - if (orderLineCriteria.count() > 0) { - if (newOrderDate.compareTo(oldOrderDate) != 0 && !Preferences.YES.equals(syncDateOrdered)) { - for (OrderLine lines : orderLineCriteria.list()) { - lines.setOrderDate(newOrderDate); - } - } - if (newScheduledDate != null && oldScheduledDate != null - && newScheduledDate.compareTo(oldScheduledDate) != 0 - && !Preferences.YES.equals(syncDateDelivered)) { - for (OrderLine lines : orderLineCriteria.list()) { - lines.setScheduledDeliveryDate(newScheduledDate); - } - } - // check preferences is set to sync warehouse in header and lines - if (newWarehouseId != null && oldWarehouseId != null - && !newWarehouseId.getId().equals(oldWarehouseId.getId())) { - try { - syncWarehouse = Preferences.getPreferenceValue("DoNotSyncWarehouse", true, OBContext - .getOBContext().getCurrentClient(), - OBContext.getOBContext().getCurrentOrganization(), - OBContext.getOBContext().getUser(), OBContext.getOBContext().getRole(), null); - } catch (PropertyException e) { - // if property not found, sync the warehouse - syncWarehouse = Preferences.NO; - } - if (!Preferences.YES.equals(syncWarehouse)) { - for (OrderLine lines : orderLineCriteria.list()) { - lines.setWarehouse(newWarehouseId); - } - } - } + OrderParameters orderParameters = getOrderParameters(event); + + List<OrderLine> orderLines = getOrderLines(orderParameters); + if (CollectionUtils.isNotEmpty(orderLines)) { + updateOrderLinesValues(orderParameters, orderLines); } - // Remove discount information - if (!StringUtils.equals(newBPId, oldBPId)) { - StringBuilder deleteHql = new StringBuilder(); - deleteHql.append(" delete from " + OrderDiscount.ENTITY_NAME); - deleteHql.append(" where " + OrderDiscount.PROPERTY_SALESORDER + ".id = :orderId"); - Query deleteQry = OBDal.getInstance().getSession().createQuery(deleteHql.toString()); - deleteQry.setParameter("orderId", orderId); - deleteQry.executeUpdate(); + if (businessPartnerHasChanged(orderParameters)) { + removeDiscountInformationFromOrder(orderParameters); } } - public void onDelete(@Observes - EntityDeleteEvent event) { + public void onDelete(@Observes EntityDeleteEvent event) { if (!isValidEvent(event)) { return; } @@ -152,4 +87,220 @@ quotation.setDocumentStatus("UE"); } } + + private OrderParameters getOrderParameters(final EntityUpdateEvent event) { + OrderParameters orderParameters = new OrderParameters(); + final Entity orderEntity = ModelProvider.getInstance().getEntity(Order.ENTITY_NAME); + final Property orderDateProperty = orderEntity.getProperty(Order.PROPERTY_ORDERDATE); + final Property scheduledDateProperty = orderEntity + .getProperty(Order.PROPERTY_SCHEDULEDDELIVERYDATE); + final Property warehouseProperty = orderEntity.getProperty(Order.PROPERTY_WAREHOUSE); + final Property businessPartnerProperty = orderEntity + .getProperty(Order.PROPERTY_BUSINESSPARTNER); + + orderParameters.setOrderId((String) event.getTargetInstance().getId()); + orderParameters.setNewOrderDate((Date) event.getCurrentState(orderDateProperty)); + orderParameters.setOldOrderDate((Date) event.getPreviousState(orderDateProperty)); + orderParameters.setNewScheduledDate((Date) event.getCurrentState(scheduledDateProperty)); + orderParameters.setOldScheduledDate((Date) event.getPreviousState(scheduledDateProperty)); + orderParameters.setNewWarehouse((Warehouse) event.getCurrentState(warehouseProperty)); + orderParameters.setOldWarehouse((Warehouse) event.getPreviousState(warehouseProperty)); + orderParameters.setNewBPId(((BusinessPartner) event.getCurrentState(businessPartnerProperty)) + .getId()); + orderParameters.setOldBPId(((BusinessPartner) event.getPreviousState(businessPartnerProperty)) + .getId()); + + return orderParameters; + } + + private List<OrderLine> getOrderLines(final OrderParameters orderParameters) { + OBCriteria<OrderLine> orderLineCriteria = OBDal.getInstance().createCriteria(OrderLine.class); + orderLineCriteria.add(Restrictions.eq(OrderLine.PROPERTY_SALESORDER, + OBDal.getInstance().get(Order.class, orderParameters.getOrderId()))); + return orderLineCriteria.list(); + } + + private void updateOrderLinesValues(final OrderParameters orderParameters, + final List<OrderLine> orderLines) { + final boolean syncOrderDate = isOrderDateChangedAndPreferenceIsNotActivated(orderParameters); + final boolean syncDeliveredDate = isScheduledDateChangedAndPreferenceIsNotActivated(orderParameters); + final boolean syncWarehouse = isWarehouseChangedAndPreferenceIsNotActivated(orderParameters); + + if (syncOrderDate || syncDeliveredDate || syncWarehouse) { + for (OrderLine lines : orderLines) { + if (syncOrderDate) { + lines.setOrderDate(orderParameters.getNewOrderDate()); + } + if (syncDeliveredDate) { + lines.setScheduledDeliveryDate(orderParameters.getNewScheduledDate()); + } + if (syncWarehouse) { + lines.setWarehouse(orderParameters.getNewWarehouse()); + } + } + } + } + + private boolean isOrderDateChangedAndPreferenceIsNotActivated( + final OrderParameters orderParameters) { + boolean syncField = false; + if (areDatesDifferent(orderParameters.getNewOrderDate(), orderParameters.getOldOrderDate())) { + syncField = !StringUtils.equals(Preferences.YES, + getPreferenceValue(DO_NOT_SYNC_DATE_ORDERED_PREFERENCE)); + } + return syncField; + } + + private boolean isScheduledDateChangedAndPreferenceIsNotActivated( + final OrderParameters orderParameters) { + boolean syncField = false; + if (areDatesDifferent(orderParameters.getNewScheduledDate(), + orderParameters.getOldScheduledDate())) { + syncField = !StringUtils.equals(Preferences.YES, + getPreferenceValue(DO_NOT_SYNC_DATE_DELIVERED_PREFERENCE)); + } + return syncField; + } + + private boolean isWarehouseChangedAndPreferenceIsNotActivated( + final OrderParameters orderParameters) { + boolean syncField = false; + if (areObjectsDifferent(orderParameters.getNewWarehouse(), orderParameters.getOldWarehouse())) { + syncField = !StringUtils.equals(Preferences.YES, + getPreferenceValue(DO_NOT_SYNC_WAREHOUSE_PREFERENCE)); + } + return syncField; + } + + private boolean areDatesDifferent(final Date newDate, final Date oldDate) { + return newDate != null && oldDate != null && newDate.compareTo(oldDate) != 0; + } + + private boolean areObjectsDifferent(final BaseOBObject newObject, final BaseOBObject oldObject) { + return newObject != null && oldObject != null + && !StringUtils.equals(newObject.getId().toString(), oldObject.getId().toString()); + } + + private String getPreferenceValue(final String preferenceKey) { + String syncField; + try { + syncField = Preferences.getPreferenceValue(preferenceKey, true, OBContext.getOBContext() + .getCurrentClient(), OBContext.getOBContext().getCurrentOrganization(), OBContext + .getOBContext().getUser(), OBContext.getOBContext().getRole(), null); + } catch (PropertyException e) { + // if property not found, sync the field + syncField = Preferences.NO; + } + return syncField; + } + + private boolean businessPartnerHasChanged(final OrderParameters orderParameters) { + return !StringUtils.equals(orderParameters.getNewBPId(), orderParameters.getOldBPId()); + } + + private void removeDiscountInformationFromOrder(final OrderParameters orderParameters) { + StringBuilder deleteHql = new StringBuilder(); + deleteHql.append(" delete from " + OrderDiscount.ENTITY_NAME); + deleteHql.append(" where " + OrderDiscount.PROPERTY_SALESORDER + ".id = :orderId"); + Query deleteQry = OBDal.getInstance().getSession().createQuery(deleteHql.toString()); + deleteQry.setParameter("orderId", orderParameters.getOrderId()); + deleteQry.executeUpdate(); + } + + private class OrderParameters { + String orderId; + Date newOrderDate; + Date oldOrderDate; + Date newScheduledDate; + Date oldScheduledDate; + Warehouse newWarehouse; + Warehouse oldWarehouse; + String newBPId; + String oldBPId; + + public OrderParameters() { + this.orderId = null; + this.newOrderDate = null; + this.oldOrderDate = null; + this.newScheduledDate = null; + this.oldScheduledDate = null; + this.newWarehouse = null; + this.oldWarehouse = null; + this.newBPId = null; + this.oldBPId = null; + } + + public String getOrderId() { + return orderId; + } + + public void setOrderId(String orderId) { + this.orderId = orderId; ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Openbravo-commits mailing list Openbravo-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openbravo-commits