From c222f79b1e37b67a866b93da5573c0c23e5ae803 Mon Sep 17 00:00:00 2001 From: Teo Sarca Date: Wed, 15 Nov 2017 09:46:16 +0200 Subject: [PATCH] introduce ViewCloseReason https://github.com/metasfresh/metasfresh-webui-api/issues/664 --- .../ui/web/handlingunits/HUEditorView.java | 3 +- .../web/order/purchase/view/OLCandView.java | 8 +---- .../purchase/view/OLCandViewService.java | 31 ++++++++++++++++ .../view/SalesOrderToOLCandViewFactory.java | 10 ++++++ .../picking/packageable/PackageableView.java | 11 ++++-- .../picking/pickingslot/PickingSlotView.java | 5 --- .../PickingSlotViewsIndexStorage.java | 3 +- .../AggregationPickingSlotView.java | 9 ++--- .../ui/web/pporder/PPOrderLinesView.java | 3 +- .../de/metas/ui/web/view/DefaultView.java | 4 +-- .../view/DefaultViewsRepositoryStorage.java | 3 +- src/main/java/de/metas/ui/web/view/IView.java | 5 ++- .../de/metas/ui/web/view/ViewCloseReason.java | 36 +++++++++++++++++++ 13 files changed, 102 insertions(+), 29 deletions(-) create mode 100644 src/main/java/de/metas/ui/web/order/purchase/view/OLCandViewService.java create mode 100644 src/main/java/de/metas/ui/web/view/ViewCloseReason.java diff --git a/src/main/java/de/metas/ui/web/handlingunits/HUEditorView.java b/src/main/java/de/metas/ui/web/handlingunits/HUEditorView.java index e0b992bb2..6f59f80e2 100644 --- a/src/main/java/de/metas/ui/web/handlingunits/HUEditorView.java +++ b/src/main/java/de/metas/ui/web/handlingunits/HUEditorView.java @@ -28,6 +28,7 @@ import de.metas.ui.web.exceptions.EntityNotFoundException; import de.metas.ui.web.process.view.ViewActionDescriptorsList; import de.metas.ui.web.view.IView; +import de.metas.ui.web.view.ViewCloseReason; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.ViewResult; import de.metas.ui.web.view.event.ViewChangesCollector; @@ -167,7 +168,7 @@ public long size() } @Override - public void close() + public void close(final ViewCloseReason reason) { invalidateAllNoNotify(); } diff --git a/src/main/java/de/metas/ui/web/order/purchase/view/OLCandView.java b/src/main/java/de/metas/ui/web/order/purchase/view/OLCandView.java index 74407cf30..65d63d192 100644 --- a/src/main/java/de/metas/ui/web/order/purchase/view/OLCandView.java +++ b/src/main/java/de/metas/ui/web/order/purchase/view/OLCandView.java @@ -15,7 +15,6 @@ import de.metas.ui.web.document.filter.DocumentFilter; import de.metas.ui.web.exceptions.EntityNotFoundException; import de.metas.ui.web.view.IEditableView; -import de.metas.ui.web.view.IView; import de.metas.ui.web.view.IViewRow; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.ViewResult; @@ -54,7 +53,7 @@ public class OLCandView implements IEditableView { - public static OLCandView cast(final IView view) + public static OLCandView cast(final Object view) { return (OLCandView)view; } @@ -113,11 +112,6 @@ public long size() return rows.size(); } - @Override - public void close() - { - } - @Override public int getQueryLimit() { diff --git a/src/main/java/de/metas/ui/web/order/purchase/view/OLCandViewService.java b/src/main/java/de/metas/ui/web/order/purchase/view/OLCandViewService.java new file mode 100644 index 000000000..1bd04a441 --- /dev/null +++ b/src/main/java/de/metas/ui/web/order/purchase/view/OLCandViewService.java @@ -0,0 +1,31 @@ +package de.metas.ui.web.order.purchase.view; + +/* + * #%L + * metasfresh-webui-api + * %% + * Copyright (C) 2017 metas GmbH + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * . + * #L% + */ + +public class OLCandViewService +{ + public void createOLCandRecords(final OLCandView view) + { + + } +} diff --git a/src/main/java/de/metas/ui/web/order/purchase/view/SalesOrderToOLCandViewFactory.java b/src/main/java/de/metas/ui/web/order/purchase/view/SalesOrderToOLCandViewFactory.java index b56001f16..8ce4585e7 100644 --- a/src/main/java/de/metas/ui/web/order/purchase/view/SalesOrderToOLCandViewFactory.java +++ b/src/main/java/de/metas/ui/web/order/purchase/view/SalesOrderToOLCandViewFactory.java @@ -14,6 +14,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import com.google.common.cache.RemovalNotification; import com.google.common.collect.ImmutableList; import de.metas.interfaces.I_C_BPartner_Product; @@ -23,6 +24,7 @@ import de.metas.ui.web.view.IView; import de.metas.ui.web.view.IViewFactory; import de.metas.ui.web.view.IViewsIndexStorage; +import de.metas.ui.web.view.ViewCloseReason; import de.metas.ui.web.view.ViewFactory; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.descriptor.ViewLayout; @@ -61,6 +63,7 @@ public class SalesOrderToOLCandViewFactory implements IViewFactory, IViewsIndexS private final Cache views = CacheBuilder.newBuilder() .expireAfterAccess(1, TimeUnit.HOURS) + .removalListener(notification -> onViewRemoved(notification)) .build(); @Override @@ -112,6 +115,13 @@ public void removeById(final ViewId viewId) views.cleanUp(); // also cleanup to prevent views cache to grow. } + private final void onViewRemoved(final RemovalNotification notification) + { + final OLCandView view = OLCandView.cast(notification.getValue()); + final ViewCloseReason closeReason = ViewCloseReason.fromCacheEvictedFlag(notification.wasEvicted()); + view.close(closeReason); + } + @Override public Stream streamAllViews() { diff --git a/src/main/java/de/metas/ui/web/picking/packageable/PackageableView.java b/src/main/java/de/metas/ui/web/picking/packageable/PackageableView.java index e40cb787e..5cc1820b9 100644 --- a/src/main/java/de/metas/ui/web/picking/packageable/PackageableView.java +++ b/src/main/java/de/metas/ui/web/picking/packageable/PackageableView.java @@ -29,6 +29,7 @@ import de.metas.ui.web.picking.pickingslot.PickingSlotView; import de.metas.ui.web.view.IView; import de.metas.ui.web.view.IViewRow; +import de.metas.ui.web.view.ViewCloseReason; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.ViewResult; import de.metas.ui.web.view.event.ViewChangesCollector; @@ -156,7 +157,7 @@ public long size() } @Override - public void close() + public void close(final ViewCloseReason reason) { final List shipmentScheduleIds = getRows() .values().stream() @@ -317,9 +318,13 @@ public void setPickingSlotView(@NonNull final DocumentId rowId, @NonNull final P pickingSlotsViewByRowId.put(rowId, pickingSlotView); } - public void removePickingSlotView(@NonNull final DocumentId rowId) + public void removePickingSlotView(@NonNull final DocumentId rowId, @NonNull final ViewCloseReason viewCloseReason) { - pickingSlotsViewByRowId.remove(rowId); + final PickingSlotView view = pickingSlotsViewByRowId.remove(rowId); + if (view != null) + { + view.close(viewCloseReason); + } } public PickingSlotView getPickingSlotViewOrNull(@NonNull final DocumentId rowId) diff --git a/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotView.java b/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotView.java index 4b889bf1f..6222f058d 100644 --- a/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotView.java +++ b/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotView.java @@ -154,11 +154,6 @@ public long size() return rows.size(); } - @Override - public void close() - { - } - @Override public int getQueryLimit() { diff --git a/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotViewsIndexStorage.java b/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotViewsIndexStorage.java index ae7ac70e3..eacb6c411 100644 --- a/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotViewsIndexStorage.java +++ b/src/main/java/de/metas/ui/web/picking/pickingslot/PickingSlotViewsIndexStorage.java @@ -15,6 +15,7 @@ import de.metas.ui.web.view.IView; import de.metas.ui.web.view.IViewsIndexStorage; import de.metas.ui.web.view.IViewsRepository; +import de.metas.ui.web.view.ViewCloseReason; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.event.ViewChangesCollector; import de.metas.ui.web.view.json.JSONViewDataType; @@ -166,7 +167,7 @@ public void removeById(@NonNull final ViewId pickingSlotViewId) { final DocumentId rowId = extractRowId(pickingSlotViewId); final PackageableView packageableView = getPackageableViewByPickingSlotViewId(pickingSlotViewId); - packageableView.removePickingSlotView(rowId); + packageableView.removePickingSlotView(rowId, ViewCloseReason.USER_REQUEST); } @Override diff --git a/src/main/java/de/metas/ui/web/pickingslot/AggregationPickingSlotView.java b/src/main/java/de/metas/ui/web/pickingslot/AggregationPickingSlotView.java index 296a12eda..514e3d9c7 100644 --- a/src/main/java/de/metas/ui/web/pickingslot/AggregationPickingSlotView.java +++ b/src/main/java/de/metas/ui/web/pickingslot/AggregationPickingSlotView.java @@ -24,6 +24,7 @@ import de.metas.ui.web.view.IView; import de.metas.ui.web.view.IViewRow; import de.metas.ui.web.view.IViewRowOverrides; +import de.metas.ui.web.view.ViewCloseReason; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.ViewResult; import de.metas.ui.web.view.event.ViewChangesCollector; @@ -139,12 +140,6 @@ public long size() return rows.size(); } - @Override - public void close() - { - // nothing - } - @Override public int getQueryLimit() { @@ -266,7 +261,7 @@ public synchronized void clearAfterPickingHUView() if (afterPickingHUView != null) { - afterPickingHUView.close(); + afterPickingHUView.close(ViewCloseReason.USER_REQUEST); } } } diff --git a/src/main/java/de/metas/ui/web/pporder/PPOrderLinesView.java b/src/main/java/de/metas/ui/web/pporder/PPOrderLinesView.java index 03245cdc3..f3cc10ede 100644 --- a/src/main/java/de/metas/ui/web/pporder/PPOrderLinesView.java +++ b/src/main/java/de/metas/ui/web/pporder/PPOrderLinesView.java @@ -27,6 +27,7 @@ import de.metas.ui.web.exceptions.EntityNotFoundException; import de.metas.ui.web.view.IView; import de.metas.ui.web.view.IViewRow; +import de.metas.ui.web.view.ViewCloseReason; import de.metas.ui.web.view.ViewId; import de.metas.ui.web.view.ViewResult; import de.metas.ui.web.view.event.ViewChangesCollector; @@ -197,7 +198,7 @@ public long size() } @Override - public void close() + public void close(final ViewCloseReason reason) { invalidateAllNoNotify(); } diff --git a/src/main/java/de/metas/ui/web/view/DefaultView.java b/src/main/java/de/metas/ui/web/view/DefaultView.java index 559696d06..20ed4492e 100644 --- a/src/main/java/de/metas/ui/web/view/DefaultView.java +++ b/src/main/java/de/metas/ui/web/view/DefaultView.java @@ -261,7 +261,7 @@ public List getAllFilters() } @Override - public void close() + public void close(final ViewCloseReason reason) { if (closed.getAndSet(true)) { @@ -271,7 +271,7 @@ public void close() // nothing now. // TODO in future me might notify somebody to remove the temporary selections from database - logger.debug("View closed: {}", this); + logger.debug("View closed with reason={}: {}", reason, this); } @Override diff --git a/src/main/java/de/metas/ui/web/view/DefaultViewsRepositoryStorage.java b/src/main/java/de/metas/ui/web/view/DefaultViewsRepositoryStorage.java index 33d42b1c8..a1cc29a77 100644 --- a/src/main/java/de/metas/ui/web/view/DefaultViewsRepositoryStorage.java +++ b/src/main/java/de/metas/ui/web/view/DefaultViewsRepositoryStorage.java @@ -49,7 +49,8 @@ public WindowId getWindowId() private final void onViewRemoved(final RemovalNotification notification) { final IView view = (IView)notification.getValue(); - view.close(); + final ViewCloseReason closeReason = ViewCloseReason.fromCacheEvictedFlag(notification.wasEvicted()); + view.close(closeReason); } @Override diff --git a/src/main/java/de/metas/ui/web/view/IView.java b/src/main/java/de/metas/ui/web/view/IView.java index 434bc9e80..163669337 100644 --- a/src/main/java/de/metas/ui/web/view/IView.java +++ b/src/main/java/de/metas/ui/web/view/IView.java @@ -83,7 +83,10 @@ default boolean isIncludedView() long size(); - void close(); + default void close(final ViewCloseReason reason) + { + // nothing + } int getQueryLimit(); diff --git a/src/main/java/de/metas/ui/web/view/ViewCloseReason.java b/src/main/java/de/metas/ui/web/view/ViewCloseReason.java new file mode 100644 index 000000000..ba29d96e5 --- /dev/null +++ b/src/main/java/de/metas/ui/web/view/ViewCloseReason.java @@ -0,0 +1,36 @@ +package de.metas.ui.web.view; + +/* + * #%L + * metasfresh-webui-api + * %% + * Copyright (C) 2017 metas GmbH + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program. If not, see + * . + * #L% + */ + +public enum ViewCloseReason +{ + /** Closed because user requested it */ + USER_REQUEST, + /** Closed because it was removed automatically from cache (expired, cache size exceeded etc) */ + CLEANUP; + + public static ViewCloseReason fromCacheEvictedFlag(final boolean wasEvicted) + { + return wasEvicted ? ViewCloseReason.CLEANUP : ViewCloseReason.USER_REQUEST; + } +}