55
66import jpype
77import jpype .imports
8+ import orhelper
89
910logger = logging .getLogger (__name__ )
1011
@@ -143,17 +144,22 @@ def ensure_java_compatibility(jar_path: Path):
143144 )
144145
145146
146- class OpenRocketSession :
147+ class OpenRocketSession ( orhelper . OpenRocketInstance ) :
147148 def __init__ (self , jar_path , log_level = "OFF" ):
148149 self .jar_path = Path (jar_path )
149150 if not self .jar_path .exists ():
150151 raise FileNotFoundError (
151152 f"Jar file '{ self .jar_path .as_posix ()} ' does not exist"
152153 )
153154
154- self .log_level = log_level
155+ # Get the default JVM path early so we can pass it
156+ jvm_path = jpype .getDefaultJVMPath ()
157+ # Initialize the base class with kwargs to bypass auto-discovery
158+ super ().__init__ (jar = str (self .jar_path ), jvm = str (jvm_path ), loglevel = log_level )
155159 self .openrocket = None
156- self .started = False
160+ # for newest orhelper support
161+ self .openrocket_core = None
162+ self .openrocket_swing = None
157163
158164 def _resolve_packages (self ):
159165 try :
@@ -173,8 +179,6 @@ def _block_loader(gui_module, field_name):
173179 field .setAccessible (False )
174180 loader .blockUntilLoaded ()
175181 except (AttributeError , TypeError , RuntimeError , jpype .JException ):
176- # New OpenRocket versions can change internals; loading still works
177- # without explicitly waiting in most cases.
178182 pass
179183
180184 def __enter__ (self ):
@@ -200,29 +204,27 @@ def __enter__(self):
200204 f"-Djava.class.path={ self .jar_path .as_posix ()} " ,
201205 )
202206
203- self .openrocket , swing = self ._resolve_packages ()
207+ self .openrocket_core , self .openrocket_swing = self ._resolve_packages ()
208+ self .openrocket = self .openrocket_core # for legacy orhelper versions
204209
205210 guice = jpype .JPackage ("com" ).google .inject .Guice
206211 logger_factory = jpype .JPackage ("org" ).slf4j .LoggerFactory
207212 logger_class = jpype .JPackage ("ch" ).qos .logback .classic .Logger
208- logger_level = jpype .JPackage ("ch" ).qos .logback .classic .Level
209213
210- gui_module = swing .startup .GuiModule ()
211- plugin_module = self .openrocket .plugin .PluginModule ()
214+ gui_module = self . openrocket_swing .startup .GuiModule ()
215+ plugin_module = self .openrocket_core .plugin .PluginModule ()
212216
213217 injector = guice .createInjector (gui_module , plugin_module )
214218
215- app = self .openrocket .startup .Application
219+ app = self .openrocket_core .startup .Application
216220 app .setInjector (injector )
217221
218222 gui_module .startLoader ()
219223 self ._block_loader (gui_module , "presetLoader" )
220224 self ._block_loader (gui_module , "motorLoader" )
221225
222226 root_logger = logger_factory .getLogger (logger_class .ROOT_LOGGER_NAME )
223- root_logger .setLevel (
224- getattr (logger_level , str (self .log_level ), logger_level .ERROR )
225- )
227+ root_logger .setLevel (self ._translate_log_level ())
226228
227229 self .started = True
228230 return self
@@ -235,18 +237,11 @@ def __exit__(self, ex_type, ex, tb):
235237 window .dispose ()
236238 except (AttributeError , TypeError , RuntimeError , jpype .JException ):
237239 pass
238- # Do not call shutdownJVM() here: JPype <1.5 cannot restart the
239- # JVM in the same process, so shutting it down automatically would
240- # break any subsequent OpenRocketSession (e.g. in notebooks or
241- # programmatic use). The JVM is cleaned up by JPype's atexit hook
242- # when the process exits.
240+ # Do not call shutdownJVM() here: JPype <1.5 cannot restart the JVM
243241 finally :
244242 self .started = False
245243
246244 def load_doc (self , ork_filename : str ):
247245 if not self .started :
248246 raise RuntimeError ("OpenRocketSession has not been started" )
249-
250- java_file = jpype .java .io .File (ork_filename )
251- loader = self .openrocket .file .GeneralRocketLoader (java_file )
252- return loader .load ()
247+ return orhelper .Helper (self ).load_doc (ork_filename )
0 commit comments