This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/master by this push:
     new 366a0a48b Modeler cleanup - taking PlatformInitializer out of DI
366a0a48b is described below

commit 366a0a48b61f371d7b3c263aee503f3ba2e1a712
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun May 17 13:01:31 2026 -0400

    Modeler cleanup - taking PlatformInitializer out of DI
---
 .../generic/GenericCayenneModelerModule.java       | 30 --------
 .../cayenne/modeler/generic/GenericMain.java       | 29 +-------
 .../generic/GenericPlatformInitializer.java        | 23 +++---
 .../modeler/osx/OSXCayenneModelerModule.java       | 30 --------
 .../org/apache/cayenne/modeler/osx/OSXMain.java    | 32 +--------
 .../modeler/osx/OSXPlatformInitializer.java        | 41 +++++------
 .../modeler/win/WinCayenneModelerModule.java       | 30 --------
 .../org/apache/cayenne/modeler/win/WinMain.java    | 28 +-------
 .../modeler/win/WinPlatformInitializer.java        | 18 ++---
 .../org/apache/cayenne/modeler/Application.java    | 60 ++++++++++++++--
 .../main/java/org/apache/cayenne/modeler/Main.java | 83 +---------------------
 .../org/apache/cayenne/modeler/ModelerModule.java  |  3 -
 .../platform/DefaultPlatformInitializer.java       | 38 ----------
 .../org/apache/cayenne/modeler/ui/MainFrame.java   |  2 +-
 .../UIPlatformInitializer.java}                    | 14 ++--
 .../ui/preferences/more/MorePrefsPanel.java        |  2 +-
 .../modeler/CayenneModelerValidationIT.java        | 11 +--
 17 files changed, 117 insertions(+), 357 deletions(-)

diff --git 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java
 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java
deleted file mode 100644
index 7fa1aca65..000000000
--- 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*****************************************************************
- *   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
- *
- *    https://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.cayenne.modeler.generic;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
-
-public class GenericCayenneModelerModule implements Module {
-
-    public void configure(Binder binder) {
-        
binder.bind(PlatformInitializer.class).to(GenericPlatformInitializer.class);
-    }
-}
diff --git 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericMain.java
 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericMain.java
index 13ca6e966..abdb0c40f 100644
--- 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericMain.java
+++ 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericMain.java
@@ -18,34 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.generic;
 
-import java.util.Collection;
+import org.apache.cayenne.modeler.Application;
 
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.Main;
+public final class GenericMain {
 
-public class GenericMain extends Main {
-
-    /**
-     * Main method that starts the CayenneModeler.
-     */
     public static void main(String[] args) {
-        try {
-            new GenericMain(args).launch();
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    protected GenericMain(String[] args) {
-        super(args);
-    }
-
-    @Override
-    protected Collection<Module> appendModules(Collection<Module> modules) {
-        modules = super.appendModules(modules);
-        modules.add(new GenericCayenneModelerModule());
-        return modules;
+        Application.launch(args, new GenericPlatformInitializer());
     }
 }
diff --git 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
index 717cf6e9c..5c52ab7b7 100644
--- 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
+++ 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.modeler.generic;
 import com.jgoodies.looks.plastic.PlasticLookAndFeel;
 import com.jgoodies.looks.plastic.PlasticTheme;
 import com.jgoodies.looks.plastic.PlasticXPLookAndFeel;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.ui.UIPlatformInitializer;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -29,20 +29,16 @@ import org.slf4j.LoggerFactory;
 import javax.swing.*;
 import java.awt.*;
 
-public class GenericPlatformInitializer implements PlatformInitializer {
+public class GenericPlatformInitializer implements UIPlatformInitializer {
 
-    private static Logger logger = 
LoggerFactory.getLogger(GenericPlatformInitializer.class);
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(GenericPlatformInitializer.class);
 
-    static final String DEFAULT_LAF_NAME = 
PlasticXPLookAndFeel.class.getName();
+    private static final String DEFAULT_LAF_NAME = 
PlasticXPLookAndFeel.class.getName();
 
-    // note that another theme - "Desert Blue" doesn't support Chinese and
-    // Japanese chars
-    static final String DEFAULT_THEME_NAME = "Sky Bluer";
-
-    public void setupMenus(JFrame frame) {
-        // noop - default menus are fine
-    }
+    // note that another theme - "Desert Blue" doesn't support Chinese and 
Japanese chars
+    private static final String DEFAULT_THEME_NAME = "Sky Bluer";
 
+    @Override
     public void initLookAndFeel() {
 
         PlasticTheme theme = findTheme();
@@ -56,7 +52,7 @@ public class GenericPlatformInitializer implements 
PlatformInitializer {
             // override some default styles and colors
             overrideUIDefaults();
         } catch (Exception e) {
-            logger.warn("Error installing L&F: " + DEFAULT_LAF_NAME, e);
+            LOGGER.warn("Error installing L&F: " + DEFAULT_LAF_NAME, e);
         }
     }
 
@@ -89,7 +85,7 @@ public class GenericPlatformInitializer implements 
PlatformInitializer {
         UIManager.put("MainToolBar.border",             
BorderFactory.createLineBorder(Color.GRAY));
     }
 
-    protected PlasticTheme findTheme() {
+    private PlasticTheme findTheme() {
 
         for (Object object : PlasticLookAndFeel.getInstalledThemes()) {
             PlasticTheme theme = (PlasticTheme) object;
@@ -99,5 +95,4 @@ public class GenericPlatformInitializer implements 
PlatformInitializer {
         }
         return null;
     }
-
 }
diff --git 
a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java
 
b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java
deleted file mode 100644
index 4be3efc55..000000000
--- 
a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*****************************************************************
- *   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
- *
- *    https://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.cayenne.modeler.osx;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
-
-public class OSXCayenneModelerModule implements Module {
-
-    public void configure(Binder binder) {
-        
binder.bind(PlatformInitializer.class).to(OSXPlatformInitializer.class);
-    }
-}
diff --git 
a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXMain.java
 
b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXMain.java
index af777bb28..27288d881 100644
--- 
a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXMain.java
+++ 
b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXMain.java
@@ -19,37 +19,11 @@
 
 package org.apache.cayenne.modeler.osx;
 
-import java.util.Collection;
+import org.apache.cayenne.modeler.Application;
 
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.Main;
+public final class OSXMain {
 
-/**
- * Main class to start CayenneModeler on MacOSX.
- */
-public class OSXMain extends Main {
-
-    /**
-     * Main method that starts the CayenneModeler.
-     */
     public static void main(String[] args) {
-        try {
-            new OSXMain(args).launch();
-        }
-        catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    protected OSXMain(String[] args) {
-        super(args);
-    }
-
-    @Override
-    protected Collection<Module> appendModules(Collection<Module> modules) {
-        modules = super.appendModules(modules);
-        modules.add(new OSXCayenneModelerModule());
-        return modules;
+        Application.launch(args, new OSXPlatformInitializer());
     }
 }
diff --git 
a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
 
b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
index e455a0771..fb2af6e9d 100644
--- 
a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
+++ 
b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
@@ -18,9 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.osx;
 
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.service.action.GlobalActions;
+import org.apache.cayenne.modeler.ui.UIPlatformInitializer;
 import org.apache.cayenne.modeler.ui.action.AboutAction;
 import org.apache.cayenne.modeler.ui.action.ConfigurePreferencesAction;
 import org.apache.cayenne.modeler.ui.action.ExitAction;
@@ -32,31 +32,12 @@ import java.awt.*;
 import java.util.HashSet;
 import java.util.Set;
 
-public class OSXPlatformInitializer implements PlatformInitializer {
-
-    @Inject
-    protected GlobalActions globalActions;
+public class OSXPlatformInitializer implements UIPlatformInitializer {
 
     @Override
     public void initLookAndFeel() {
-
         // override some default styles and colors, assuming that Aqua theme 
will be used
-        overrideUIDefaults();
-
-        Desktop desktop = Desktop.getDesktop();
-
-        desktop.setAboutHandler(e -> 
globalActions.getAction(AboutAction.class).showAboutDialog());
-        desktop.setPreferencesHandler(e -> 
globalActions.getAction(ConfigurePreferencesAction.class).showPreferencesDialog());
-        desktop.setQuitHandler((e, r) -> {
-            if (!globalActions.getAction(ExitAction.class).exit()) {
-                r.cancelQuit();
-            } else {
-                r.performQuit();
-            }
-        });
-    }
 
-    private void overrideUIDefaults() {
         Color lightGrey = new Color(0xEEEEEE);
         Color darkGrey = new Color(225, 225, 225);
         Border darkBorder = BorderFactory.createLineBorder(darkGrey);
@@ -108,7 +89,21 @@ public class OSXPlatformInitializer implements 
PlatformInitializer {
     }
 
     @Override
-    public void setupMenus(JFrame frame) {
+    public void setupMenus(Application app, JFrame frame) {
+
+        GlobalActions globalActions = app.getActionManager();
+
+        Desktop desktop = Desktop.getDesktop();
+        desktop.setAboutHandler(e -> 
globalActions.getAction(AboutAction.class).showAboutDialog());
+        desktop.setPreferencesHandler(e -> 
globalActions.getAction(ConfigurePreferencesAction.class).showPreferencesDialog());
+        desktop.setQuitHandler((e, r) -> {
+            if (!globalActions.getAction(ExitAction.class).exit()) {
+                r.cancelQuit();
+            } else {
+                r.performQuit();
+            }
+        });
+
         // set additional look and feel for the window
         frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", 
Boolean.TRUE);
 
diff --git 
a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java
 
b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java
deleted file mode 100644
index 6c31d16b0..000000000
--- 
a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*****************************************************************
- *   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
- *
- *    https://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.cayenne.modeler.win;
-
-import org.apache.cayenne.di.Binder;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
-
-public class WinCayenneModelerModule implements Module {
-
-    public void configure(Binder binder) {
-        
binder.bind(PlatformInitializer.class).to(WinPlatformInitializer.class);
-    }
-}
diff --git 
a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinMain.java
 
b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinMain.java
index 629bc6054..d5feccc7a 100644
--- 
a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinMain.java
+++ 
b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinMain.java
@@ -18,33 +18,11 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.win;
 
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.Main;
+import org.apache.cayenne.modeler.Application;
 
-import java.util.Collection;
+public final class WinMain {
 
-public class WinMain extends Main {
-
-    /**
-     * Main method that starts the CayenneModeler.
-     */
     public static void main(String[] args) {
-        try {
-            new WinMain(args).launch();
-        } catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    protected WinMain(String[] args) {
-        super(args);
-    }
-
-    @Override
-    protected Collection<Module> appendModules(Collection<Module> modules) {
-        modules = super.appendModules(modules);
-        modules.add(new WinCayenneModelerModule());
-        return modules;
+        Application.launch(args, new WinPlatformInitializer());
     }
 }
diff --git 
a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
 
b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
index b0e5749f4..b995808d3 100644
--- 
a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
+++ 
b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
@@ -19,23 +19,17 @@
 package org.apache.cayenne.modeler.win;
 
 import com.jgoodies.looks.windows.WindowsLookAndFeel;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.ui.UIPlatformInitializer;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.JFrame;
-import javax.swing.UIManager;
-import javax.swing.BorderFactory;
-import java.awt.Color;
+import javax.swing.*;
+import java.awt.*;
 
-public class WinPlatformInitializer implements PlatformInitializer {
+public class WinPlatformInitializer implements UIPlatformInitializer {
 
-    private static Logger logger = 
LoggerFactory.getLogger(WinPlatformInitializer.class);
-
-    @Override
-    public void setupMenus(JFrame frame) {
-    }
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(WinPlatformInitializer.class);
 
     @Override
     public void initLookAndFeel() {
@@ -44,7 +38,7 @@ public class WinPlatformInitializer implements 
PlatformInitializer {
             // override some default styles and colors
             overrideUIDefaults();
         } catch (Exception e) {
-            logger.warn("Error installing L&F: " + 
WindowsLookAndFeel.class.getName(), e);
+            LOGGER.warn("Error installing L&F: " + 
WindowsLookAndFeel.class.getName(), e);
         }
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 30fa5faba..93e6eb4e0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -21,9 +21,12 @@ package org.apache.cayenne.modeler;
 
 import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.runtime.CoreModule;
 import org.apache.cayenne.configuration.runtime.DbAdapterFactory;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.dbsync.DbSyncModule;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.modeler.dbconnector.DBConnectors;
 import org.apache.cayenne.modeler.log.ModelerLogFactory;
@@ -34,7 +37,7 @@ import org.apache.cayenne.modeler.pref.PreferencesRepository;
 import org.apache.cayenne.modeler.pref.RecentProjectsPrefs;
 import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.ui.UIPlatformInitializer;
 import 
org.apache.cayenne.modeler.service.validator.ConfigurableProjectValidator;
 import org.apache.cayenne.modeler.ui.MainFrame;
 import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
@@ -42,9 +45,12 @@ import org.apache.cayenne.modeler.ui.logconsole.LogConsole;
 import org.apache.cayenne.modeler.undo.CayenneUndoManager;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.ProjectLoader;
+import org.apache.cayenne.project.ProjectModule;
 import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.project.upgrade.UpgradeService;
 import org.apache.cayenne.project.validation.ProjectValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.swing.*;
 import java.io.File;
@@ -56,7 +62,47 @@ import java.util.stream.Collectors;
  */
 public class Application {
 
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(Application.class);
+
+    public static void launch(String[] args, UIPlatformInitializer 
platformInitializer) {
+        try {
+            // logger should go after Look And Feel or Logger Console will be 
without style
+            LOGGER.info("Starting CayenneModeler.");
+            LOGGER.info("JRE v.{} at {}", System.getProperty("java.version"), 
System.getProperty("java.home"));
+
+            // TODO: this is dirty... CoreModule is out of place inside the 
Modeler...
+            // If we need CayenneRuntime for certain operations, those should 
start their own stack...
+            Injector injector = DIBootstrap.createInjector(
+                    new CoreModule(),
+                    new ProjectModule(),
+                    new DbSyncModule(),
+                    new ModelerModule());
+
+            SwingUtilities.invokeLater(() -> {
+                new Application(injector, 
platformInitializer).launch(initialProjectFromArgs(args));
+            });
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static File initialProjectFromArgs(String[] args) {
+        if (args != null && args.length == 1) {
+            File f = new File(args[0]);
+
+            if (f.isFile()
+                    && f.getName().startsWith("cayenne")
+                    && f.getName().endsWith(".xml")) {
+                return f;
+            }
+        }
+
+        return null;
+    }
+
     private final Injector injector;
+    private final UIPlatformInitializer platformInitializer;
     private final ModelerClassLoader classLoader;
     private final PreferencesRepository preferencesRepository;
     private final GlobalActions actionManager;
@@ -66,8 +112,9 @@ public class Application {
     private CayenneUndoManager undoManager;
     private DBConnectors dbConnectors;
 
-    public Application(Injector injector) {
+    public Application(Injector injector, UIPlatformInitializer 
platformInitializer) {
         this.injector = injector;
+        this.platformInitializer = platformInitializer;
 
         this.classLoader = new ModelerClassLoader();
         this.preferencesRepository = new 
PreferencesRepository(injector.getInstance(ConfigurationNameMapper.class));
@@ -78,6 +125,7 @@ public class Application {
         this.projectValidator = new ConfigurableProjectValidator(this);
     }
 
+
     public ModelerClassLoader getClassLoader() {
         return classLoader;
     }
@@ -106,8 +154,8 @@ public class Application {
         return injector.getInstance(UpgradeService.class);
     }
 
-    public PlatformInitializer getPlatformInitializer() {
-        return injector.getInstance(PlatformInitializer.class);
+    public UIPlatformInitializer getPlatformInitializer() {
+        return platformInitializer;
     }
 
     public ConfigurationNodeParentGetter getConfigurationNodeParentGetter() {
@@ -138,7 +186,9 @@ public class Application {
         return logConsole;
     }
 
-    public void startup(File initialProject) {
+    public void launch(File initialProject) {
+        platformInitializer.initLookAndFeel();
+
         this.logConsole = new LogConsole(this);
         ModelerLogFactory.setAppender(logConsole);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java
index 3def30a94..7be3e3f15 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java
@@ -19,89 +19,12 @@
 
 package org.apache.cayenne.modeler;
 
-import org.apache.cayenne.configuration.runtime.CoreModule;
-import org.apache.cayenne.dbsync.DbSyncModule;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
-import org.apache.cayenne.project.ProjectModule;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.cayenne.modeler.ui.UIPlatformInitializer;
 
-import javax.swing.*;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
+public final class Main {
 
-/**
- * Main class responsible for starting CayenneModeler.
- */
-public class Main {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(Main.class);
-
-    protected String[] args;
-
-    /**
-     * Main method that starts the CayenneModeler.
-     */
     public static void main(String[] args) {
-        try {
-            new Main(args).launch();
-        } catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
-        }
-    }
-
-    protected Main(String[] args) {
-        this.args = args;
-    }
-
-    protected void launch() {
-
-        // TODO: use module auto-loading...
-        Injector injector = DIBootstrap.createInjector(appendModules(new 
ArrayList<>()));
-
-        // init look and feel before using any Swing classes...
-        injector.getInstance(PlatformInitializer.class).initLookAndFeel();
-
-        // logger should go after Look And Feel or Logger Console will be 
without style
-        LOGGER.info("Starting CayenneModeler.");
-        LOGGER.info("JRE v.{} at {}", System.getProperty("java.version"), 
System.getProperty("java.home"));
-
-        SwingUtilities.invokeLater(() -> {
-            Application application = new Application(injector);
-            application.startup(initialProjectFromArgs());
+        Application.launch(args, new UIPlatformInitializer() {
         });
-
-    }
-
-    protected Collection<Module> appendModules(Collection<Module> modules) {
-
-        // TODO: this is dirty... CoreModule is out of place inside the 
Modeler...
-        // If we need CayenneRuntime for certain operations, those should 
start their own stack...
-        modules.add(new CoreModule());
-
-        modules.add(new ProjectModule());
-        modules.add(new DbSyncModule());
-        modules.add(new ModelerModule());
-
-        return modules;
-    }
-
-    protected File initialProjectFromArgs() {
-        if (args != null && args.length == 1) {
-            File f = new File(args[0]);
-
-            if (f.isFile()
-                    && f.getName().startsWith("cayenne")
-                    && f.getName().endsWith(".xml")) {
-                return f;
-            }
-        }
-
-        return null;
     }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
index bebd9e39f..efe30d2f3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
@@ -26,8 +26,6 @@ import org.apache.cayenne.dbsync.xml.DbImportExtension;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.gen.xml.CgenExtension;
-import org.apache.cayenne.modeler.service.platform.DefaultPlatformInitializer;
-import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 import 
org.apache.cayenne.modeler.service.validator.extension.ValidationExtension;
 import org.apache.cayenne.project.ProjectModule;
 import org.apache.cayenne.project.extension.ExtensionAwareHandlerFactory;
@@ -41,7 +39,6 @@ public class ModelerModule implements Module {
 
     public void configure(Binder binder) {
 
-        
binder.bind(PlatformInitializer.class).to(DefaultPlatformInitializer.class);
         
binder.bind(HandlerFactory.class).to(ExtensionAwareHandlerFactory.class);
         
binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
         binder.bind(XMLReader.class).toProviderInstance(new 
XMLReaderProvider(true)).withoutScope();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/DefaultPlatformInitializer.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/DefaultPlatformInitializer.java
deleted file mode 100644
index a2ae1b3a3..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/DefaultPlatformInitializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*****************************************************************
- *   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
- *
- *    https://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.cayenne.modeler.service.platform;
-
-import javax.swing.JFrame;
-
-public class DefaultPlatformInitializer implements PlatformInitializer {
-
-    /**
-     * Does nothing, leaving unchanged the default platform Look and Feel.
-     */
-    public void initLookAndFeel() {
-        // noop
-    }
-
-    /**
-     * Does nothing, leaving unchanged the default frame menus.
-     */
-    public void setupMenus(JFrame frame) {
-        // noop - keep all the default menus...
-    }
-}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
index 548e26712..d86d84824 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
@@ -134,7 +134,7 @@ public class MainFrame extends AppFrame {
 
         setProjectView(null);
 
-        this.app.getPlatformInitializer().setupMenus(this);
+        this.app.getPlatformInitializer().setupMenus(this.app, this);
 
         this.session = new ProjectSession(this.app);
         this.session.addDirtyListener((wasDirty, isDirty) -> {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/PlatformInitializer.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/UIPlatformInitializer.java
similarity index 79%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/PlatformInitializer.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/UIPlatformInitializer.java
index 2234a11ef..3cfe0f554 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/PlatformInitializer.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/UIPlatformInitializer.java
@@ -16,22 +16,26 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.service.platform;
+package org.apache.cayenne.modeler.ui;
+
+import org.apache.cayenne.modeler.Application;
 
 import javax.swing.JFrame;
 
 /**
- * An interface that provides methods for platform-specific Modeler 
initialization.
+ * A base callback for platform-specific Modeler initialization.
  */
-public interface PlatformInitializer {
+public interface UIPlatformInitializer {
 
     /**
      * Initializes application look and feel.
      */
-    void initLookAndFeel();
+    default void initLookAndFeel() {
+    }
 
     /**
      * Updates default frame menus according to the platform specifics.
      */
-    void setupMenus(JFrame frame);
+    default void setupMenus(Application app, JFrame frame) {
+    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
index 498bb1409..727106b80 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
@@ -117,6 +117,6 @@ public class MorePrefsPanel extends AppPanel {
 
         // Defer the rebuild to a later EDT tick so the in-flight action 
handler
         // (and any pending dispose events) drain first.
-        SwingUtilities.invokeLater(() -> app.startup(null));
+        SwingUtilities.invokeLater(() -> app.launch(null));
     }
 }
diff --git 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
index 40f0e6a2e..269aa56ca 100644
--- 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
+++ 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
@@ -22,6 +22,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.modeler.ui.UIPlatformInitializer;
 import 
org.apache.cayenne.modeler.service.validator.ConfigurableProjectValidator;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectLoader;
@@ -37,9 +38,7 @@ import org.slf4j.LoggerFactory;
 import java.util.EnumSet;
 import java.util.List;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
 
 public class CayenneModelerValidationIT {
 
@@ -59,14 +58,16 @@ public class CayenneModelerValidationIT {
 
     @Test
     public void validatorProvided() {
-        Application application = new Application(injector);
+        Application application = new Application(injector, new 
UIPlatformInitializer() {
+        });
         assertTrue(application.getProjectValidator() instanceof 
ConfigurableProjectValidator);
     }
 
     @Test
     public void configLoaded() {
         URLResource projectResource = new 
URLResource(getClass().getResource(CAYENNE_CONFIGURED_VALIDATION_PROJECT));
-        Application application = new Application(injector);
+        Application application = new Application(injector, new 
UIPlatformInitializer() {
+        });
         ProjectLoader projectLoader = 
injector.getInstance(ProjectLoader.class);
         Project project = projectLoader.loadProject(projectResource);
 


Reply via email to