diff --git a/.github/workflows/SimPathsBuild.yml b/.github/workflows/SimPathsBuild.yml index 054687c48..e9d4641d1 100644 --- a/.github/workflows/SimPathsBuild.yml +++ b/.github/workflows/SimPathsBuild.yml @@ -17,10 +17,10 @@ jobs: runs-on: [ ubuntu-latest ] steps: - uses: actions/checkout@v6 - - name: Set up JDK 19 + - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: '19' + java-version: '25' distribution: 'temurin' - name: Build with Maven run: mvn -B package --file pom.xml @@ -33,10 +33,10 @@ jobs: runs-on: [ ubuntu-latest ] steps: - uses: actions/checkout@v6 - - name: Set up JDK 19 + - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: '19' + java-version: '25' distribution: 'temurin' - name: Run integration tests run: mvn verify @@ -52,10 +52,10 @@ jobs: runs-on: [ ubuntu-latest ] steps: - uses: actions/checkout@v6 - - name: Set up JDK 19 + - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: '19' + java-version: '25' distribution: 'temurin' - uses: actions/download-artifact@v8 with: @@ -74,10 +74,10 @@ jobs: runs-on: [ ubuntu-latest ] steps: - uses: actions/checkout@v6 - - name: Set up JDK 19 + - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: '19' + java-version: '25' distribution: 'temurin' - uses: actions/download-artifact@v8 with: @@ -98,10 +98,10 @@ jobs: runs-on: [ ubuntu-latest ] steps: - uses: actions/checkout@v6 - - name: Set up JDK 19 + - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: '19' + java-version: '25' distribution: 'temurin' - uses: actions/download-artifact@v8 with: diff --git a/.github/workflows/publish-javadoc.yml b/.github/workflows/publish-javadoc.yml index e425906d6..88d01a6ff 100644 --- a/.github/workflows/publish-javadoc.yml +++ b/.github/workflows/publish-javadoc.yml @@ -17,10 +17,10 @@ jobs: - name: Checkout repository uses: actions/checkout@v6 - - name: Set up JDK 19 + - name: Set up JDK uses: actions/setup-java@v5 with: - java-version: '19' + java-version: '25' distribution: 'temurin' cache: maven @@ -36,7 +36,7 @@ jobs: with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} javadoc-branch: javadoc - java-version: 19 + java-version: 25 target-folder: javadoc project: maven diff --git a/documentation/wiki/developer-guide/internals/api.md b/documentation/wiki/developer-guide/internals/api.md index b6f4cb9c0..feba3bc90 100644 --- a/documentation/wiki/developer-guide/internals/api.md +++ b/documentation/wiki/developer-guide/internals/api.md @@ -16,59 +16,7 @@ To update the API documentation, add or modify Javadoc comments in the source co [The workflow](https://github.com/simpaths/SimPaths/blob/develop/.github/workflows/publish-javadoc.yml) automates the generation and publishing of HTML documentation from Javadoc comments whenever changes are pushed to the `develop` branch. -``` -on: - push: - branches: - - develop # Only publish when pushing to develop branch -``` - -The code is checked out from the `develop` branch, Java 19 is installed, and SimPaths is compiled. - - -``` -jobs: - publish-javadoc: - runs-on: ubuntu-latest - permissions: - contents: write # Needed to push to the javadoc branch - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Set up JDK 19 - uses: actions/setup-java@v3 - with: - java-version: '19' - distribution: 'temurin' - cache: maven - - - name: Build (optional if Javadoc needs compiled sources) - run: mvn -B compile --file pom.xml -``` - -The documentation is then generated from the Javadoc comments in the code. - - -``` -- name: Generate Javadoc - run: mvn javadoc:javadoc --file pom.xml -``` - -Finally, the generated documentation is deployed to the `javadoc` branch of the SimPaths repository. - - -``` -- name: Deploy Javadoc to branch - uses: MathieuSoysal/Javadoc-publisher.yml@v3.0.2 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - javadoc-branch: javadoc - java-version: 19 - target-folder: javadoc # Specifies the folder in which the documentation is saved - project: maven -``` +The generated documentation is deployed to the `javadoc` branch of the SimPaths repository. The published documentation is hosted using [GitHub Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site). GitHub Pages is a service that hosts static websites directly from a GitHub repository. diff --git a/documentation/wiki/developer-guide/internals/multirun-implementation.md b/documentation/wiki/developer-guide/internals/multirun-implementation.md index cf7a1e53b..7c594557b 100644 --- a/documentation/wiki/developer-guide/internals/multirun-implementation.md +++ b/documentation/wiki/developer-guide/internals/multirun-implementation.md @@ -8,8 +8,7 @@ ### Prerequisites -- Java 19 -- Maven 3.8+ +- a [working environment](../../getting-started/environment-setup.md) - Optional IDE: IntelliJ IDEA (import as a Maven project) ### Build and run @@ -139,4 +138,4 @@ In our open-source project, we follow a clear and consistent branch naming conve - `docs/documentation-topic`: Prefix documentation branches with `docs` for updating or creating documentation. For example, `docs/update-readme`. These branch naming conventions are designed to make it easy for our contributors to understand the purpose of each branch and maintain consistency within our repository. Please adhere to these conventions when creating branches for your contributions. ---> \ No newline at end of file +--> diff --git a/documentation/wiki/developer-guide/working-in-github.md b/documentation/wiki/developer-guide/working-in-github.md index 2f51e33ec..acda66740 100644 --- a/documentation/wiki/developer-guide/working-in-github.md +++ b/documentation/wiki/developer-guide/working-in-github.md @@ -5,8 +5,8 @@ In this page, the various steps that are necessary to make changes to SimPaths and for them to be correctly implemented in the code and committed via GitHub (_i.e._, made available to other users) are explained. **Requirements** +- a [working environment](../getting-started/environment-setup.md) - GitHub account -- Java Development Kit (JDK) - IDE (Integrated Development Environment) In the following sections, explanatory screenshots are presented from both the GitHub browser and GitHub Desktop. While the latter is not required, GitHub Desktop provides a very user-friendly graphical user interface (GUI). It clearly visualises commits, branches, changes, and merge conflicts, and it is ideal for beginners or those who prefer not to use the command line. Additionally, it is designed for a quick setup and a seamless GitHub account integration. Thus, for the sake of contributing to SimPaths development, GitHub Desktop is a complete tool. However, it is not necessary; the user can entirely operate with the browser version in combination with the IDE or any other Git-integrated tool, _e.g._, GitKraken (GUI) or Git CLI (Command Line). diff --git a/documentation/wiki/getting-started/environment-setup.md b/documentation/wiki/getting-started/environment-setup.md index 99be75070..043273f84 100644 --- a/documentation/wiki/getting-started/environment-setup.md +++ b/documentation/wiki/getting-started/environment-setup.md @@ -6,8 +6,8 @@ ## Requirements -- Java Development Kit (JDK) 19 (the project targets Java 19 — earlier versions will not compile) -- Apache Maven 3.8 or later +- Java Development Kit (JDK) 25 or later +- Apache Maven 3.9.16 or later - Git ## Cloning the repository diff --git a/documentation/wiki/getting-started/index.md b/documentation/wiki/getting-started/index.md index 0b4ff07e4..618273f88 100644 --- a/documentation/wiki/getting-started/index.md +++ b/documentation/wiki/getting-started/index.md @@ -2,15 +2,8 @@ This section walks you through everything needed to run SimPaths for the first time. -## Prerequisites - -SimPaths is a Java project. Before running simulations you need: - -- Java Development Kit (JDK) 19 or later -- Maven (for dependency management) -- The required input data files (see [Input Data](data/index.md)) - -## Steps +SimPaths is a Java project. Follow these steps to setup a working environment +and run simulations: 1. [Environment Setup](environment-setup.md) — install dependencies and clone the repository 2. [Input Data](data/index.md) — obtain the required UK input datasets diff --git a/pom.xml b/pom.xml index 42cd38e3d..8c7488d21 100644 --- a/pom.xml +++ b/pom.xml @@ -4,6 +4,7 @@ model 1.0.0 + 25 UTF-8 @@ -11,16 +12,12 @@ maven-compiler-plugin - 3.10.1 - - 19 - 19 - + 3.15.0 org.apache.maven.plugins maven-surefire-plugin - 3.2.2 + 3.5.6 **/*IntegrationTest.java @@ -30,7 +27,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.2 + 3.5.6 **/*IntegrationTest.java @@ -48,7 +45,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.1 + 3.6.2 build-single @@ -108,27 +105,25 @@ - org.apache.commons commons-math3 3.6.1 - commons-cli commons-cli - 1.4 + 1.11.0 org.yaml snakeyaml - 1.29 + 2.6 com.github.jasmineRepo JAS-mine-core - 4.3.25 + d179a02f8e5c2c00009ec812a09e383f5a5285c4 compile @@ -148,7 +143,6 @@ xml-apis 1.4.01 - com.miglayout miglayout @@ -157,52 +151,52 @@ org.jetbrains annotations - 24.1.0 + 26.1.0 compile org.junit.jupiter junit-jupiter - 5.10.1 + 6.1.0 test org.apache.commons commons-csv - 1.10.0 + 1.14.1 com.opencsv opencsv - 5.9 + 5.12.0 org.apache.logging.log4j log4j-api - 2.17.1 + 2.26.0 org.apache.logging.log4j log4j-core - 2.17.1 + 2.26.0 org.mockito mockito-core - 5.10.0 + 5.23.0 test org.mockito mockito-junit-jupiter - 5.10.0 + 5.23.0 test net.bytebuddy byte-buddy - 1.17.8 + 1.18.10 diff --git a/src/main/java/simpaths/experiment/SimPathsCollector.java b/src/main/java/simpaths/experiment/SimPathsCollector.java index b7342fb6b..52467b3d1 100644 --- a/src/main/java/simpaths/experiment/SimPathsCollector.java +++ b/src/main/java/simpaths/experiment/SimPathsCollector.java @@ -17,7 +17,8 @@ import microsim.statistics.functions.*; // import plug-in packages import org.apache.commons.math3.util.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; // import JAS-mine packages import microsim.annotation.GUIparameter; @@ -48,7 +49,7 @@ public class SimPathsCollector extends AbstractSimulationCollectorManager implements EventListener { // default simulation parameters - private static Logger log = Logger.getLogger(SimPathsCollector.class); + private static Logger log = LogManager.getLogger(SimPathsCollector.class); @GUIparameter(description="Calculate the Gini coefficients of income (also displayed in charts)") private boolean calculateGiniCoefficients = false; diff --git a/src/main/java/simpaths/experiment/SimPathsMultiRun.java b/src/main/java/simpaths/experiment/SimPathsMultiRun.java index daf6f50bc..13afce9e2 100644 --- a/src/main/java/simpaths/experiment/SimPathsMultiRun.java +++ b/src/main/java/simpaths/experiment/SimPathsMultiRun.java @@ -2,7 +2,6 @@ package simpaths.experiment; // import Java packages -import org.apache.log4j.Level; import org.apache.commons.cli.*; import org.apache.commons.io.FileUtils; import org.yaml.snakeyaml.Yaml; @@ -22,10 +21,15 @@ import microsim.gui.shell.MultiRunFrame; import simpaths.model.enums.Country; +import org.apache.logging.log4j.Level; // Logging and file writing -import org.apache.log4j.FileAppender; -import org.apache.log4j.Logger; -import org.apache.log4j.PatternLayout; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.FileAppender; +import org.apache.logging.log4j.core.config.Configurator; +import org.apache.logging.log4j.core.layout.PatternLayout; + import java.io.*; @@ -58,7 +62,7 @@ public class SimPathsMultiRun extends MultiRun { private static double interestRateInnov = 0.0; private static double disposableIncomeFromLabourInnov = 0.0; private Long counter = 0L; - public static Logger log = Logger.getLogger(SimPathsMultiRun.class); + public static Logger log = LogManager.getLogger(SimPathsMultiRun.class); private static boolean persist_population; private static boolean persist_root; @@ -283,14 +287,17 @@ private static boolean parseCommandLineArgs(String[] args) { System.setOut(new PrintStream(new BufferedOutputStream(new FileOutputStream(logDir.getPath() + "/run_" + randomSeed + ".txt")), true)); // Writing logs to `run_[seed].log` - FileAppender appender = new FileAppender(); - appender.setName("Run logging"); - appender.setFile(logDir.getPath() + "/run_" + randomSeed + ".log"); - appender.setAppend(false); - appender.setLayout(new PatternLayout("%d{yyyy MMM dd HH:mm:ss} - %m%n")); - appender.activateOptions(); - Logger.getRootLogger().setLevel(Level.DEBUG); - Logger.getRootLogger().addAppender(appender); + var layout = PatternLayout.newBuilder().setPattern("%d{yyyy MMM dd HH:mm:ss} - %m%n").build(); + var appender = FileAppender.newBuilder() + .setFileName(logDir.getPath() + "/run_" + randomSeed + ".log") + .setName("Run logging") + .setAppend(false) + .setLayout(layout) + .build(); + Configurator.setRootLevel(Level.DEBUG); + var configuration = LoggerContext.getContext().getConfiguration(); + configuration.getRootLogger().addAppender(appender, Level.DEBUG, null); + Configurator.reconfigure(configuration); } catch (FileNotFoundException e) { throw new RuntimeException(e); } diff --git a/src/main/java/simpaths/experiment/SimPathsObserver.java b/src/main/java/simpaths/experiment/SimPathsObserver.java index 6db95b9c5..9b60c9361 100644 --- a/src/main/java/simpaths/experiment/SimPathsObserver.java +++ b/src/main/java/simpaths/experiment/SimPathsObserver.java @@ -19,7 +19,6 @@ import simpaths.model.enums.*; import org.apache.commons.collections4.map.LinkedMap; import org.apache.commons.collections4.map.MultiKeyMap; -import org.apache.log4j.Logger; import net.miginfocom.swing.MigLayout; // import JAS-mine packages @@ -57,9 +56,6 @@ */ public class SimPathsObserver extends AbstractSimulationObserverManager implements EventListener, ILongSource { - // default simulation parameters - private static Logger log = Logger.getLogger(SimPathsObserver.class); - @GUIparameter(description="Toggle to turn all charts on/off") private Boolean showCharts = true; diff --git a/src/main/java/simpaths/model/BenefitUnit.java b/src/main/java/simpaths/model/BenefitUnit.java index ff4447d84..b1cfce16e 100644 --- a/src/main/java/simpaths/model/BenefitUnit.java +++ b/src/main/java/simpaths/model/BenefitUnit.java @@ -18,7 +18,8 @@ import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.tuple.Triple; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import simpaths.data.Parameters; import simpaths.model.decisions.DecisionParams; @@ -36,7 +37,7 @@ @Entity public class BenefitUnit implements EventListener, IDoubleSource, Weight, Comparable { - @Transient private static Logger log = Logger.getLogger(BenefitUnit.class); + @Transient private static Logger log = LogManager.getLogger(BenefitUnit.class); @Transient private final SimPathsModel model; @Transient private final SimPathsCollector collector; @Transient public static long benefitUnitIdCounter = 1L; diff --git a/src/main/java/simpaths/model/Household.java b/src/main/java/simpaths/model/Household.java index aa4e147c1..805ea65b4 100644 --- a/src/main/java/simpaths/model/Household.java +++ b/src/main/java/simpaths/model/Household.java @@ -2,6 +2,9 @@ import jakarta.persistence.*; import microsim.data.db.PanelEntityKey; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import simpaths.data.startingpop.Processed; @@ -9,7 +12,6 @@ import microsim.engine.SimulationEngine; import microsim.event.EventListener; import microsim.statistics.IDoubleSource; -import org.apache.log4j.Logger; import simpaths.model.enums.SampleEntry; import java.util.LinkedHashSet; @@ -27,7 +29,7 @@ @Entity public class Household implements EventListener, IDoubleSource { - @Transient private static Logger log = Logger.getLogger(Household.class); + @Transient private static Logger log = LogManager.getLogger(Household.class); @Transient private final SimPathsModel model; @Transient private final SimPathsCollector collector; @Transient public static long householdIdCounter = 1; //Because this is static all instances of a household access and increment the same counter diff --git a/src/main/java/simpaths/model/Person.java b/src/main/java/simpaths/model/Person.java index 5982f288f..2a3e36a83 100644 --- a/src/main/java/simpaths/model/Person.java +++ b/src/main/java/simpaths/model/Person.java @@ -10,7 +10,9 @@ import microsim.statistics.Series; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import simpaths.data.ManagerRegressions; import simpaths.data.MultiValEvent; import simpaths.data.Parameters; @@ -34,7 +36,7 @@ @Entity public class Person implements EventListener, IDoubleSource, IIntSource, Weight, Comparable { - @Transient private static Logger log = Logger.getLogger(Person.class); + @Transient private static Logger log = LogManager.getLogger(Person.class); @Transient private final SimPathsModel model; @Transient public static long personIdCounter = 1L; //Could perhaps initialise this to one above the max key number in initial population, in the same way that we pull the max Age information from the input files. diff --git a/src/main/java/simpaths/model/SimPathsModel.java b/src/main/java/simpaths/model/SimPathsModel.java index eb0031d20..c9bc873d7 100644 --- a/src/main/java/simpaths/model/SimPathsModel.java +++ b/src/main/java/simpaths/model/SimPathsModel.java @@ -28,7 +28,8 @@ import org.apache.commons.lang3.time.StopWatch; import org.apache.commons.lang3.tuple.Triple; import org.apache.commons.math3.util.Pair; -import org.apache.log4j.Logger; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import simpaths.data.*; import simpaths.data.startingpop.Processed; @@ -83,7 +84,7 @@ public void setFirstRun(boolean firstRun) { private boolean isFirstRun = true; // set default to true - this is required to support single run simulations // default simulation parameters - private static Logger log = Logger.getLogger(SimPathsModel.class); + private static Logger log = LogManager.getLogger(SimPathsModel.class); //@GUIparameter(description = "Country to be simulated") private Country country; // = Country.UK; diff --git a/src/main/java/simpaths/model/lifetime_incomes/ManagerProjectLifetimeIncomes.java b/src/main/java/simpaths/model/lifetime_incomes/ManagerProjectLifetimeIncomes.java index 980840a14..c8e03a4ce 100644 --- a/src/main/java/simpaths/model/lifetime_incomes/ManagerProjectLifetimeIncomes.java +++ b/src/main/java/simpaths/model/lifetime_incomes/ManagerProjectLifetimeIncomes.java @@ -5,7 +5,6 @@ import jakarta.persistence.EntityTransaction; import jakarta.persistence.Persistence; import microsim.data.db.Experiment; -import org.apache.log4j.Logger; import simpaths.data.Parameters; import simpaths.model.enums.Gender; @@ -18,6 +17,8 @@ import java.util.random.RandomGenerator; import java.util.stream.IntStream; +import org.apache.logging.log4j.Logger; + public class ManagerProjectLifetimeIncomes {