From cb4e6a8b27bdf3f9129eeb3a9bd85d7dcb985d32 Mon Sep 17 00:00:00 2001 From: midorum Date: Sun, 28 May 2023 10:13:50 +0300 Subject: [PATCH 1/3] check base window rendering via account info --- .../setting/TargetBaseAppSettings.java | 5 +++ .../settings/stamp/TargetBaseAppStamps.java | 2 + pom.xml | 2 +- .../midorum/melbone/settings/SettingKeys.java | 3 ++ .../midorum/melbone/settings/StampKeys.java | 3 +- .../setting/TargetBaseAppSettingsImpl.java | 15 +++++++ .../stamp/TargetBaseAppStampsImpl.java | 5 +++ .../ui/internal/util/CaptureWindow.java | 3 +- .../internal/baseapp/BaseAppWindowImpl.java | 38 +++++++++++++---- .../baseapp/BaseAppWindowImplTest.java | 42 +++++++++++++++++++ 10 files changed, 108 insertions(+), 10 deletions(-) diff --git a/model/src/main/java/midorum/melbone/model/settings/setting/TargetBaseAppSettings.java b/model/src/main/java/midorum/melbone/model/settings/setting/TargetBaseAppSettings.java index 05ce127..5e7e7c9 100644 --- a/model/src/main/java/midorum/melbone/model/settings/setting/TargetBaseAppSettings.java +++ b/model/src/main/java/midorum/melbone/model/settings/setting/TargetBaseAppSettings.java @@ -109,4 +109,9 @@ public interface TargetBaseAppSettings { KeyShortcut openMenuHotkey(); + KeyShortcut openAccountInfoHotkey(); + + int accountInfoPopupRenderingTimeout(); + + int accountInfoPopupRenderingDelay(); } diff --git a/model/src/main/java/midorum/melbone/model/settings/stamp/TargetBaseAppStamps.java b/model/src/main/java/midorum/melbone/model/settings/stamp/TargetBaseAppStamps.java index fa22dc3..42b760a 100644 --- a/model/src/main/java/midorum/melbone/model/settings/stamp/TargetBaseAppStamps.java +++ b/model/src/main/java/midorum/melbone/model/settings/stamp/TargetBaseAppStamps.java @@ -21,4 +21,6 @@ public interface TargetBaseAppStamps { Stamp startButton(); Stamp dailyTrackerPopupCaption(); + + Stamp accountInfoPopupCaption(); } diff --git a/pom.xml b/pom.xml index df13298..61c07e6 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ - 2.0.1-rc.0.1.0 + 2.0.1-new-base-window-check-order.0.1.0 app-build.properties UTF-8 16 diff --git a/settings/src/main/java/midorum/melbone/settings/SettingKeys.java b/settings/src/main/java/midorum/melbone/settings/SettingKeys.java index 3156edf..c2be16f 100644 --- a/settings/src/main/java/midorum/melbone/settings/SettingKeys.java +++ b/settings/src/main/java/midorum/melbone/settings/SettingKeys.java @@ -390,6 +390,9 @@ enum TargetBaseApp implements SettingKey { SettingObtainWays.pressHotkey), openMenuHotkey(KeyShortcut.class, "Hot key to open menu popup", + SettingObtainWays.pressHotkey), + openAccountInfoHotkey(KeyShortcut.class, + "Hot key to open account info popup", SettingObtainWays.pressHotkey); private final SettingData settingData; diff --git a/settings/src/main/java/midorum/melbone/settings/StampKeys.java b/settings/src/main/java/midorum/melbone/settings/StampKeys.java index 73ba574..f847e97 100644 --- a/settings/src/main/java/midorum/melbone/settings/StampKeys.java +++ b/settings/src/main/java/midorum/melbone/settings/StampKeys.java @@ -62,7 +62,8 @@ enum TargetBaseApp implements StampKey { serverLineUnselected("Base window - Select server page - Server line; Unselected; Base scale"), needRestartPopup("Need restart popup; Base scale"), disconnectedPopup("Disconnected popup; Base scale"), - dailyTrackerPopupCaption("In-game daily tracker popup caption; Base scale"); + dailyTrackerPopupCaption("In-game daily tracker popup caption; Base scale"), + accountInfoPopupCaption("Account info popup caption; Base scale"); private final SettingData settingData; diff --git a/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java b/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java index 3fd3846..2951e3a 100644 --- a/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java +++ b/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java @@ -247,6 +247,16 @@ public int checkDailyTrackerPopupRenderingDelay() { return 500; } + @Override + public int accountInfoPopupRenderingTimeout() { + return 2_000; + } + + @Override + public int accountInfoPopupRenderingDelay() { + return 500; + } + @Override public long afterLaunchAccountDelay() { return (long) getValue(SettingKeys.TargetBaseApp.afterLaunchAccountDelay); @@ -271,4 +281,9 @@ public KeyShortcut cancelCurrentOperationHotkey() { public KeyShortcut openMenuHotkey() { return (KeyShortcut) getValue(SettingKeys.TargetBaseApp.openMenuHotkey); } + + @Override + public KeyShortcut openAccountInfoHotkey() { + return (KeyShortcut) getValue(SettingKeys.TargetBaseApp.openAccountInfoHotkey); + } } diff --git a/settings/src/main/java/midorum/melbone/settings/internal/obtaining/stamp/TargetBaseAppStampsImpl.java b/settings/src/main/java/midorum/melbone/settings/internal/obtaining/stamp/TargetBaseAppStampsImpl.java index 4a3f4cd..8be2320 100644 --- a/settings/src/main/java/midorum/melbone/settings/internal/obtaining/stamp/TargetBaseAppStampsImpl.java +++ b/settings/src/main/java/midorum/melbone/settings/internal/obtaining/stamp/TargetBaseAppStampsImpl.java @@ -60,4 +60,9 @@ public Stamp startButton() { public Stamp dailyTrackerPopupCaption() { return getStamp(StampKeys.TargetBaseApp.dailyTrackerPopupCaption); } + + @Override + public Stamp accountInfoPopupCaption() { + return getStamp(StampKeys.TargetBaseApp.accountInfoPopupCaption); + } } diff --git a/ui/src/main/java/midorum/melbone/ui/internal/util/CaptureWindow.java b/ui/src/main/java/midorum/melbone/ui/internal/util/CaptureWindow.java index eed7ff0..c82e6f4 100644 --- a/ui/src/main/java/midorum/melbone/ui/internal/util/CaptureWindow.java +++ b/ui/src/main/java/midorum/melbone/ui/internal/util/CaptureWindow.java @@ -1,6 +1,7 @@ package midorum.melbone.ui.internal.util; import com.midorum.win32api.facade.Rectangle; + import javax.swing.*; import java.awt.*; import java.awt.event.*; @@ -37,7 +38,7 @@ private JFrame constructFrame() { final Point locationOnScreen = frame.getLocationOnScreen(); final Dimension size = frame.getSize(); frame.dispose(); - this.consumer.accept(Optional.of(new Rectangle(locationOnScreen.x, locationOnScreen.y, size.width, size.height))); + this.consumer.accept(Optional.of(new Rectangle(locationOnScreen.x, locationOnScreen.y, locationOnScreen.x + size.width, locationOnScreen.y + size.height))); }; final Action closeFrame = () -> { diff --git a/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java b/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java index 01870b0..de54723 100644 --- a/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java +++ b/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java @@ -5,7 +5,6 @@ import com.midorum.win32api.facade.IMouse; import com.midorum.win32api.facade.IWindow; import com.midorum.win32api.struct.PointFloat; -import com.midorum.win32api.win32.Win32VirtualKey; import dma.flow.Waiting; import dma.function.ConsumerThrowing; import dma.util.Delay; @@ -160,18 +159,16 @@ private void checkIfInGameWindowRendered() throws InterruptedException { } private boolean waitBaseWindowRendering() throws InterruptedException { - log.info("waiting for base window rendering"); - final boolean result = new Waiting() + log.info("wait for base window rendering"); + return new Waiting() .timeout(settings.targetBaseAppSettings().baseWindowRenderingTimeout(), TimeUnit.MILLISECONDS) .withDelay(settings.targetBaseAppSettings().checkBaseWindowRenderingDelay(), TimeUnit.MILLISECONDS) .doOnEveryFailedIteration(i -> log.debug("{}: base window has not rendered yet", new DurationFormatter(i.fromStart()).toStringWithoutZeroParts())) - .waitForBoolean(this::waitForMenuRendering);// open menu - if (result) window.getKeyboard().enterHotKey(settings.targetBaseAppSettings().openMenuHotkey().toHotKey());// close menu - return result; + .waitForBoolean(this::checkAccountInfoRendering); } private Optional waitDisconnectedPopupRendering() throws InterruptedException { - log.debug("waiting for disconnected popup rendering"); + log.debug("wait for disconnected popup rendering"); final IMouse mouse = getMouse(); final Stamp checkingStamp = stamps.targetBaseApp().disconnectedPopup(); final Optional foundStamp = new Waiting() @@ -442,6 +439,33 @@ private boolean closeDailyTrackerPopupAndCheckRendering(final IMouse mouse) thro return notRendered; } + private boolean checkAccountInfoRendering() throws InterruptedException { + log.info("check account info rendering"); + final Optional maybe = openAccountInfoPopup(); + if (maybe.isPresent()) { + window.getKeyboard().enterHotKey(settings.targetBaseAppSettings().openAccountInfoHotkey().toHotKey()); + return true; + } + return false; + } + + private Optional openAccountInfoPopup() throws InterruptedException { + log.info("wait for account info popup rendering"); + final IKeyboard keyboard = window.getKeyboard(); + final Stamp checkingStamp = stamps.targetBaseApp().accountInfoPopupCaption(); + final HotKey hotKey = settings.targetBaseAppSettings().openAccountInfoHotkey().toHotKey(); + final Optional maybeStamp = new Waiting() + .timeout(settings.targetBaseAppSettings().accountInfoPopupRenderingTimeout(), TimeUnit.MILLISECONDS) + .withDelay(settings.targetBaseAppSettings().accountInfoPopupRenderingDelay(), TimeUnit.MILLISECONDS) + .doOnEveryFailedIteration(i -> { + log.debug("{}: account info popup has not rendered yet", new DurationFormatter(i.fromStart()).toStringWithoutZeroParts()); + keyboard.enterHotKey(hotKey); + }) + .waitFor(() -> commonWindowService.getStampValidator().validateStampWholeData(this.window, checkingStamp)); + maybeStamp.ifPresent(stamp -> log.debug("found stamp {}", stamp.key().internal().groupName() + "." + stamp.key().name())); + return maybeStamp; + } + private BrokenWindowException getBrokenWindowException(final String message, Stamp... stamps) { final String marker = Long.toString(System.currentTimeMillis()); final BrokenWindowException exception = new BrokenWindowException(message + " (marker=" + marker + ")"); diff --git a/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java b/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java index a3376d3..e49fb75 100644 --- a/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java +++ b/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java @@ -36,6 +36,8 @@ class BaseAppWindowImplTest { private static final float SPEED_FACTOR = 1.0f; private static final int TIMEOUT_FOR_TEST = 500; private static final int DELAY_FOR_TEST = 100; + private static final int TIMEOUT_FOR_TEST_1 = 50; + private static final int DELAY_FOR_TEST_1 = 10; private static final float ACTION_BUTTON_POINT_X = 1f; private static final float ACTION_BUTTON_POINT_X_OFFSET = 0.5f; private static final float ACTION_BUTTON_POINT_Y = 1.1f; @@ -77,6 +79,7 @@ class BaseAppWindowImplTest { private final PointFloat actionSecondButtonPoint = new PointFloat(ACTION_BUTTON_POINT_X + ACTION_BUTTON_POINT_X_OFFSET, -1f); //stamps private final Stamp menuExitOptionStamp = mock(Stamp.class); + private final Stamp accountInfoPopupCaptionStamp = mock(Stamp.class); private final Stamp disconnectedPopupStamp = mock(Stamp.class); private final Stamp optionsButtonBaseScaleStamp = mock(Stamp.class); private final Stamp optionsButtonDefaultScaleStamp = mock(Stamp.class); @@ -89,6 +92,7 @@ class BaseAppWindowImplTest { //hot keys final KeyShortcut stopAnimationHotkey = mock(KeyShortcut.class); final KeyShortcut openMenuHotkey = mock(KeyShortcut.class); + final KeyShortcut openAccountInfoHotkey = mock(KeyShortcut.class); @BeforeAll public static void beforeAll() { @@ -149,9 +153,12 @@ public void beforeEach() throws InterruptedException { when(targetBaseAppSettings.checkServerLineRenderingDelay()).thenReturn(DELAY_FOR_TEST); when(targetBaseAppSettings.dailyTrackerPopupRenderingTimeout()).thenReturn(TIMEOUT_FOR_TEST); when(targetBaseAppSettings.checkDailyTrackerPopupRenderingDelay()).thenReturn(DELAY_FOR_TEST); + when(targetBaseAppSettings.accountInfoPopupRenderingTimeout()).thenReturn(TIMEOUT_FOR_TEST_1); + when(targetBaseAppSettings.accountInfoPopupRenderingDelay()).thenReturn(DELAY_FOR_TEST_1); //settings: hot keys when(targetBaseAppSettings.stopAnimationHotkey()).thenReturn(stopAnimationHotkey); when(targetBaseAppSettings.openMenuHotkey()).thenReturn(openMenuHotkey); + when(targetBaseAppSettings.openAccountInfoHotkey()).thenReturn(openAccountInfoHotkey); //window when(window.getSystemId()).thenReturn("0xdf67"); when(window.getWindowMouse(SPEED_FACTOR)).thenReturn(mouse); @@ -166,6 +173,8 @@ public void beforeEach() throws InterruptedException { when(stamps.targetBaseApp()).thenReturn(targetBaseAppStamps); when(targetBaseAppStamps.menuExitOption()).thenReturn(menuExitOptionStamp); when(menuExitOptionStamp.key()).thenReturn(StampKeys.TargetBaseApp.menuExitOption); + when(targetBaseAppStamps.accountInfoPopupCaption()).thenReturn(accountInfoPopupCaptionStamp); + when(accountInfoPopupCaptionStamp.key()).thenReturn(StampKeys.TargetBaseApp.accountInfoPopupCaption); when(targetBaseAppStamps.disconnectedPopup()).thenReturn(disconnectedPopupStamp); when(disconnectedPopupStamp.key()).thenReturn(StampKeys.TargetBaseApp.disconnectedPopup); when(targetBaseAppStamps.optionsButtonBaseScale()).thenReturn(optionsButtonBaseScaleStamp); @@ -339,6 +348,26 @@ void chooseCharacter() throws InterruptedException { verifyGameStarted(); } + @Test + void inGameWindowNotRenderedProperly() throws InterruptedException { + System.out.println("inGameWindowNotRenderedProperly"); + //when + when(window.isExists()) + .thenReturn(true) // restoring window + .thenReturn(true) // trying close normally + .thenReturn(true) // closing window frame + .thenReturn(true) // window hasn't closed yet + .thenReturn(false); // window closed + windowIsHealthy(); + windowIsNotDisconnected(); + cannotOpenAccountInfoPopup(); + cannotOpenMenu(); + getBaseAppWindowInstance().doInGameWindow(InGameBaseAppWindow::checkInLoginTracker); + //then + verifyWindowCloseButtonClicked(); + verifyWindowDisappeared(); + } + @Test void checkInLoginTracker() throws InterruptedException { System.out.println("checkInLoginTracker"); @@ -346,6 +375,7 @@ void checkInLoginTracker() throws InterruptedException { windowIsExists(); windowIsHealthy(); windowIsNotDisconnected(); + accountInfoOpensNormally(); menuOpensNormally(); dailyTrackerPopupOpensNormally(); getBaseAppWindowInstance().doInGameWindow(InGameBaseAppWindow::checkInLoginTracker); @@ -389,6 +419,7 @@ private void checkInActionsTest(final int actionsCount) throws InterruptedExcept windowIsExists(); windowIsHealthy(); windowIsNotDisconnected(); + accountInfoOpensNormally(); menuOpensNormally(); setActionsCount(actionsCount); getBaseAppWindowInstance().doInGameWindow(InGameBaseAppWindow::checkInAction); @@ -441,6 +472,17 @@ private void menuOpensNormally() throws InterruptedException { .thenReturn(Optional.of(menuExitOptionStamp)); } + private void cannotOpenAccountInfoPopup() throws InterruptedException { + when(stampValidator.validateStampWholeData(window, accountInfoPopupCaptionStamp)) + .thenReturn(Optional.empty()); + } + + private void accountInfoOpensNormally() throws InterruptedException { + when(stampValidator.validateStampWholeData(window, accountInfoPopupCaptionStamp)) + .thenReturn(Optional.empty()) + .thenReturn(Optional.of(accountInfoPopupCaptionStamp)); + } + private void dailyTrackerPopupOpensNormally() throws InterruptedException { when(stampValidator.validateStampWholeData(window, dailyTrackerPopupCaptionStamp)) .thenReturn(Optional.empty()) //not rendered From dc17a2058e75e7bef755968f5735d0702d428e50 Mon Sep 17 00:00:00 2001 From: midorum Date: Mon, 29 May 2023 08:05:41 +0300 Subject: [PATCH 2/3] MEL-17 do not minimize base window until complete rendering when launch new account --- .../processor/LaunchAccountAction.java | 3 +- .../window/baseapp/RestoredBaseAppWindow.java | 2 + pom.xml | 2 +- .../setting/TargetBaseAppSettingsImpl.java | 2 +- .../internal/baseapp/BaseAppWindowImpl.java | 6 +++ .../baseapp/BaseAppWindowImplTest.java | 38 +++++++++++++++++++ 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/executor/src/main/java/midorum/melbone/executor/internal/processor/LaunchAccountAction.java b/executor/src/main/java/midorum/melbone/executor/internal/processor/LaunchAccountAction.java index e9a4a55..21d8e38 100644 --- a/executor/src/main/java/midorum/melbone/executor/internal/processor/LaunchAccountAction.java +++ b/executor/src/main/java/midorum/melbone/executor/internal/processor/LaunchAccountAction.java @@ -129,8 +129,7 @@ private void launchAccount(final Account account, final Delay delay) throws Inte openedBaseAppWindow.selectServer(); openedBaseAppWindow.chooseCharacter(); logger.info("account {} ({}) has been launched successfully", account.name(), account.login()); - //before minimizing delay because of window high load - delay.sleep(settings.targetBaseAppSettings().afterLaunchAccountDelay(), TimeUnit.MILLISECONDS); + openedBaseAppWindow.checkInGameWindowRendered(); }); } diff --git a/model/src/main/java/midorum/melbone/model/window/baseapp/RestoredBaseAppWindow.java b/model/src/main/java/midorum/melbone/model/window/baseapp/RestoredBaseAppWindow.java index 957c9d7..334ca4e 100644 --- a/model/src/main/java/midorum/melbone/model/window/baseapp/RestoredBaseAppWindow.java +++ b/model/src/main/java/midorum/melbone/model/window/baseapp/RestoredBaseAppWindow.java @@ -7,4 +7,6 @@ public interface RestoredBaseAppWindow { void selectServer() throws InterruptedException; void chooseCharacter() throws InterruptedException; + + void checkInGameWindowRendered() throws InterruptedException; } diff --git a/pom.xml b/pom.xml index 61c07e6..87a3a0c 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ - 2.0.1-new-base-window-check-order.0.1.0 + 2.0.1-new-base-window-check-order.0.1.1 app-build.properties UTF-8 16 diff --git a/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java b/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java index 2951e3a..d579e67 100644 --- a/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java +++ b/settings/src/main/java/midorum/melbone/settings/internal/obtaining/setting/TargetBaseAppSettingsImpl.java @@ -189,7 +189,7 @@ public int checkStartButtonRenderingDelay() { @Override public int baseWindowRenderingTimeout() { - return 180_000; + return 300_000; } @Override diff --git a/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java b/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java index de54723..57e0419 100644 --- a/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java +++ b/window/src/main/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImpl.java @@ -536,6 +536,12 @@ public void chooseCharacter() throws InterruptedException { log.info("character has been selected"); } + + @Override + public void checkInGameWindowRendered() throws InterruptedException { + checkIfNotDisconnected(); + checkIfInGameWindowRendered(); + } } private class InGameBaseAppWindowImpl implements InGameBaseAppWindow { diff --git a/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java b/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java index e49fb75..f8cf253 100644 --- a/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java +++ b/window/src/test/java/midorum/melbone/window/internal/baseapp/BaseAppWindowImplTest.java @@ -348,6 +348,40 @@ void chooseCharacter() throws InterruptedException { verifyGameStarted(); } + @Test + void checkInGameWindowRenderedButFail() throws InterruptedException { + System.out.println("checkInGameWindowRenderedButFail"); + //when + when(window.isExists()) + .thenReturn(true) // restoring window + .thenReturn(true) // trying close normally + .thenReturn(true) // closing window frame + .thenReturn(true) // window hasn't closed yet + .thenReturn(false); // window closed + windowIsHealthy(); + windowIsNotDisconnected(); + startButtonRenderedNormally(); + cannotOpenAccountInfoPopup(); + getBaseAppWindowInstance().restoreAndDo(RestoredBaseAppWindow::checkInGameWindowRendered); + //then + verifyWindowCloseButtonClicked(); + verifyWindowDisappeared(); + verifyDidNotAttemptsTerminateWindowProcess(); + } + + @Test + void checkInGameWindowRendered() throws InterruptedException { + System.out.println("checkInGameWindowRendered"); + //when + windowIsExists(); + windowIsHealthy(); + windowIsNotDisconnected(); + accountInfoOpensNormally(); + getBaseAppWindowInstance().restoreAndDo(RestoredBaseAppWindow::checkInGameWindowRendered); + //then + verifyAccountInfoHasBeenOpened(); + } + @Test void inGameWindowNotRenderedProperly() throws InterruptedException { System.out.println("inGameWindowNotRenderedProperly"); @@ -587,4 +621,8 @@ private void verifyActionWasCheckedIn(final int actionsCount) throws Interrupted } while (--i >= 0); } + private void verifyAccountInfoHasBeenOpened() throws InterruptedException { + verify(stampValidator, atLeastOnce()).validateStampWholeData(window, accountInfoPopupCaptionStamp); + } + } \ No newline at end of file From 6100d01c50d7b1aa70d6a2baed42a46330f7026e Mon Sep 17 00:00:00 2001 From: midorum Date: Mon, 29 May 2023 09:01:03 +0300 Subject: [PATCH 3/3] log settings state mode --- .../management/SettingsFactoryInternal.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/settings/src/main/java/midorum/melbone/settings/internal/management/SettingsFactoryInternal.java b/settings/src/main/java/midorum/melbone/settings/internal/management/SettingsFactoryInternal.java index 2cb9a8e..03b00b9 100644 --- a/settings/src/main/java/midorum/melbone/settings/internal/management/SettingsFactoryInternal.java +++ b/settings/src/main/java/midorum/melbone/settings/internal/management/SettingsFactoryInternal.java @@ -6,6 +6,8 @@ import midorum.melbone.model.persistence.SettingStorage; import midorum.melbone.model.settings.PropertiesProvider; import midorum.melbone.model.settings.SettingsProvider; +import midorum.melbone.settings.SettingKeys; +import midorum.melbone.settings.StampKeys; import midorum.melbone.settings.internal.management.experimental.TaskStorageImpl; import midorum.melbone.settings.internal.storage.KeyValueStorage; import midorum.melbone.settings.internal.storage.StorageHolder; @@ -14,6 +16,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Arrays; +import java.util.stream.Stream; + public class SettingsFactoryInternal implements AutoCloseable { private static final int VERSION = 1; @@ -32,6 +37,7 @@ private SettingsFactoryInternal(final SettingPropertyNaming settingPropertyNamin this.settingStorage = new SettingStorageImpl(keyValueStorage); this.accountStorage = new AccountStorageImpl(keyValueStorage); this.taskStorage = new TaskStorageImpl(); + checkAllSettingsState(); } public KeyValueStorage getKeyValueStorage() { @@ -54,7 +60,9 @@ public SettingsProvider settingsProvider() { return settingsProvider; } - public PropertiesProvider propertiesProvider() {return propertiesProvider;} + public PropertiesProvider propertiesProvider() { + return propertiesProvider; + } private KeyValueStorage openKeyValueStorage(final SettingPropertyNaming settingPropertyNaming, final boolean plainMode) { final StorageHolder storageHolder = new StorageHolder(propertiesProvider, settingPropertyNaming, plainMode); @@ -81,8 +89,17 @@ public void close() throws Exception { keyValueStorage.close(); } + private void checkAllSettingsState() { + if (!propertiesProvider.isModeSet("check_settings_on_start")) return; + Stream.concat(Arrays.stream(SettingKeys.values()), Arrays.stream(StampKeys.values())).forEach(key -> + settingStorage.read(key).ifPresentOrElse(o -> logger.info("{} is kept in storage", key), + () -> key.internal().defaultValue().ifPresentOrElse(o -> logger.info("{} used default value", key), + () -> logger.warn("{} not found in storage nor has default value", key)))); + } + public static class Builder { + private SettingPropertyNaming settingPropertyNaming; private boolean plainMode = false; private String propertyFileName;