OpenRocket Architecture
This section describes the high-level architecture of OpenRocket, the important modules and their interactions, and the technology stack. It is intended for developers who want to understand the structure of the code and how it works.
Introduction
OpenRocket is a Java application that runs on the desktop. It is built using the Swing GUI toolkit. The choice of Java was originally made because it is a platform-independent language, making it possible to run OpenRocket on Windows, macOS, and Linux. While the popularity of Java has waned in recent years, it is still a good choice for desktop applications because of its mature libraries and tools. Additionally, rewriting OpenRocket in another language would be a massive undertaking that is not currently feasible given the size of the developer team. Of course, any suggestions and help in this area are welcome.
OpenRocket is released under the GNU General Public License (GPL) version 3.0. This means that the source code is open and available for anyone to use, modify, and distribute. The only major restriction is that any derivative works must also be released under the GNU GPL. This ensures that the code remains open and free for everyone. So, no one can take the code and sell it as a proprietary product.
Java Platform Module System (JPMS)
OpenRocket leverages the Java Platform Module System (JPMS) to enhance modularity, encapsulation, and maintainability.
JPMS allows OpenRocket to be organized into two distinct modules, the core
module and the swing
module,
each with its own well-defined boundaries and dependencies.
Each module in OpenRocket is described by a module-info.java file located at the root of the module’s source directory
(<module>/src/main/java.module-info.java
). This file declares:
Module Name: A unique identifier for the module (e.g., info.openrocket.core, info.openrocket.swing).
Dependencies: The modules that this module depends on to function correctly. For example, the info.openrocket.swing module depends on the info.openrocket.core module.
Exported Packages: The packages within the module that are accessible to other modules.
Services: The services provided or consumed by the module (if applicable).
By embracing JPMS, OpenRocket gains several advantages:
Strong Encapsulation: Modules explicitly control what packages are exposed, preventing accidental access to internal implementation details.
Reliable Configuration: The module system verifies dependencies at compile time and runtime, reducing the risk of missing or incompatible components.
Improved Maintainability: Modules can be developed and tested independently, making it easier to understand, modify, and evolve the codebase.
Scalability: The modular structure facilitates the addition of new features or the replacement of existing components without impacting the entire application.
Core Module
The core
module contains the core functionality of OpenRocket, such as the rocket simulation engine, the file format
parsers and writers, and the rocket design classes. This module is intended to be reusable and can be used in other
applications that need rocket simulation capabilities.
Swing Module
The swing
module contains the user interface of OpenRocket. It is built using the Swing GUI toolkit and provides a graphical
interface for designing rockets, running simulations, and viewing the results. This module depends on the core module
and uses its functionality to perform the simulations and display the results.
Rocket Components
Aerodynamic Calculators and Simulators
Simulation Listeners
Component Database
Thrust Curves
OR uses Thrustcurves.org for its thrustcurves/motors.
Scripts
Plugins
File Format (.ork)
The OpenRocket native format uses the file extension *.ork. It is an XML format file combined with any needed graphics files, contained in a ZIP archive. The extension *.ork.gz is also accepted by OpenRocket, though plain .ork is recommended. In other to view the contents of the file, you can simply rename the file extension to .zip and extract the contents.
The version
attribute of the <openrocket> tag describes the file format version used, while the creator
attribute may describe the software and version used to write the document. The file format version is increased
every time the format is changed. The minor number is increased when changes are made that are mostly backward-compatible,
meaning that older software versions should be able to read the design sans the new features. The major number is
increased when changes are made that render the design problematic or impossible to read for older software. For maximum
compatibility software should save a file in the oldest file format version that supports all the necessary design features.
For an overview of the changes between file format versions, see the fileformat.txt file in the root directory of the repository.