4545import java .util .ArrayList ;
4646import java .util .LinkedHashMap ;
4747import java .util .List ;
48+ import java .util .Map ;
4849import java .util .Objects ;
50+ import java .util .function .Function ;
4951
5052import javax .swing .ImageIcon ;
5153import javax .swing .JFrame ;
8082public class NeptusMain {
8183
8284 private static final LinkedHashMap <String , String > appNames = new LinkedHashMap <>();
85+ private static final Map <String , Runnable > appLauncher = new LinkedHashMap <>();
8386 private static final LinkedHashMap <String , Class <?>> fileHandlers = new LinkedHashMap <>();
8487 private static final List <Window > openAppWindows = new ArrayList <>();
8588 private static Loader loader ;
8689
90+ static String defaultApp = "auv" ;
91+
8792 private static void init () {
8893 GeneralPreferences .initialize ();
8994
9095 // appNames.put("ws", I18n.text("Workspace"));
91- appNames .put ("auv" , I18n .text ("LAUV Console" ));
92- appNames .put ("mra" , I18n .text ("Mission Review & Analysis" ));
93- appNames .put ("la" , I18n .text ("LAUV SE Console" ));
94- appNames .put ("uav" , I18n .text ("UAV Console" ));
95- appNames .put ("cl" , I18n .text ("Empty Console" ));
96+ appNames .putIfAbsent ("auv" , I18n .text ("LAUV Console" ));
97+ appNames .putIfAbsent ("mra" , I18n .text ("Mission Review & Analysis" ));
98+ appNames .putIfAbsent ("la" , I18n .text ("LAUV SE Console" ));
99+ appNames .putIfAbsent ("uav" , I18n .text ("UAV Console" ));
100+ appNames .putIfAbsent ("cl" , I18n .text ("Empty Console" ));
96101
97102 // fileHandlers.put(FileUtil.FILE_TYPE_MISSION, Workspace.class);
98103 // fileHandlers.put(FileUtil.FILE_TYPE_MISSION_COMPRESSED, Workspace.class);
99- fileHandlers .put (FileUtil .FILE_TYPE_CONFIG , EditorLauncher .class );
100- fileHandlers .put (FileUtil .FILE_TYPE_CONSOLE , ConsoleParse .class );
104+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_CONFIG , EditorLauncher .class );
105+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_CONSOLE , ConsoleParse .class );
101106 // fileHandlers.put(FileUtil.FILE_TYPE_VEHICLE, Workspace.class);
102- fileHandlers .put (FileUtil .FILE_TYPE_CHECKLIST , Workspace .class );
103- fileHandlers .put (FileUtil .FILE_TYPE_INI , EditorLauncher .class );
104- fileHandlers .put (FileUtil .FILE_TYPE_RMF , RMFEditor .class );
105- fileHandlers .put (FileUtil .FILE_TYPE_XML , EditorLauncher .class );
106-
107- fileHandlers .put (FileUtil .FILE_TYPE_LSF , NeptusMRA .class );
108- fileHandlers .put (FileUtil .FILE_TYPE_LSF_COMPRESSED , NeptusMRA .class );
109- fileHandlers .put (FileUtil .FILE_TYPE_LSF_COMPRESSED_BZIP2 , NeptusMRA .class );
107+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_CHECKLIST , Workspace .class );
108+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_INI , EditorLauncher .class );
109+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_RMF , RMFEditor .class );
110+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_XML , EditorLauncher .class );
111+
112+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_LSF , NeptusMRA .class );
113+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_LSF_COMPRESSED , NeptusMRA .class );
114+ fileHandlers .putIfAbsent (FileUtil .FILE_TYPE_LSF_COMPRESSED_BZIP2 , NeptusMRA .class );
115+ }
116+
117+ static void registerLauncher (String key , String name , Runnable launcher ) {
118+ appNames .put (key , name );
119+ if (launcher != null ) {
120+ appLauncher .put (key , launcher );
121+ }
110122 }
111123
112124 /**
@@ -120,11 +132,15 @@ public static void launch(String[] appargs) {
120132 launch (new Loader (), appargs );
121133 }
122134
135+ public static void launch (Loader loader , String [] appargs ) {
136+ launch (loader , appargs , null );
137+ }
138+
123139 /**
124140 * @param loader A {@link Loader} to use on the opening of the program
125141 * @param appargs The commandline arguments for the program
126142 */
127- public static void launch (Loader loader , String [] appargs ) {
143+ public static void launch (Loader loader , String [] appargs , Function < LaunchInitializerHolder , Boolean > afterInit ) {
128144 ConfigFetch .initialize (); // Don't touch this, leave it as it his
129145 // benchmark
130146 long start = System .currentTimeMillis ();
@@ -133,13 +149,22 @@ public static void launch(Loader loader, String[] appargs) {
133149 if (appNames .isEmpty ()) {
134150 init ();
135151 }
136-
152+
137153 String app = appargs [0 ];
138154 loader .start ();
139155 ConfigFetch .setSuperParentFrameForced (loader );
140156
141157 loadPreRequirementsDataExceptConfigFetch (loader , true );
142158
159+ if (afterInit != null ) {
160+ LaunchInitializerHolder launchInitializerHolder = new LaunchInitializerHolder (appNames , fileHandlers );
161+ Boolean ret = afterInit .apply (launchInitializerHolder );
162+ if (ret != null && !ret ) {
163+ loader .end ();
164+ return ;
165+ }
166+ }
167+
143168 // When loading one can type the application to start
144169 String typ = loader .getTypedString ();
145170 if (!typ .equalsIgnoreCase ("" )) {
@@ -161,7 +186,7 @@ JOptionPane.QUESTION_MESSAGE, new ImageIcon(ImageUtils.getImage("images/neptus-i
161186 if (appT != null )
162187 app = typ ;
163188 else
164- app = "auv" ;
189+ app = defaultApp ;
165190 }
166191 else if (app .equalsIgnoreCase ("-f" ) && appargs .length >= 2 ) {
167192 loader .setText (I18n .text ("Opening file..." ));
@@ -224,6 +249,18 @@ else if (app.equalsIgnoreCase("uav")) {
224249 appC .setVisible (true );
225250 wrapMainApplicationWindowWithCloseActionWindowAdapter (appC );
226251 }
252+ else if (appLauncher .containsKey (app )) {
253+ ConfigFetch .initialize ();
254+ try {
255+ appLauncher .get (app ).run ();
256+ }
257+ catch (Exception e ) {
258+ NeptusLog .pub ().error (I18n .textf ("Error launching application %app" , app ), e );
259+ GuiUtils .errorMessage (loader , I18n .text ("Error launching application" ),
260+ I18n .textf ("An error occurred while launching the application %app: %error" , app ,
261+ e .getMessage ()));
262+ }
263+ }
227264 // File loading
228265 else {
229266 ConfigFetch .initialize ();
0 commit comments