diff --git a/docs/changelog/8-86-0-Release.md b/docs/changelog/8-86-0-Release.md new file mode 100644 index 0000000000..5491c0971b --- /dev/null +++ b/docs/changelog/8-86-0-Release.md @@ -0,0 +1,144 @@ +--- +description: What's changed in OpenRewrite version 8.86.0. +--- + +# 8.86.0 release (2026-07-01) + +_Total recipe count: 4455_ + +:::info +This changelog only shows what recipes have been added, removed, or changed. OpenRewrite may do releases that do not include these types of changes. To see these changes, please go to the [releases page](https://github.com/openrewrite/rewrite/releases). +::: + +## Corresponding CLI version + +* CLI version `4.3.7` + +## New Recipes + +* [org.axonframework.migration.UpgradeAxonFramework_4_Jakarta](https://docs.openrewrite.org/recipes/axonframework/migration/upgradeaxonframework_4_jakarta): Migration file to upgrade from an Axon Framework Javax-specific project to Jakarta. +* [org.axonframework.migration.UpgradeAxonFramework_4_Javax](https://docs.openrewrite.org/recipes/axonframework/migration/upgradeaxonframework_4_javax): Migration file to upgrade an Axon Framework Javax-specific project and remain on Javax. +* [org.openrewrite.featureflags.launchdarkly.MarkIncompatibleEvaluationDetailAccessors](https://docs.openrewrite.org/recipes/featureflags/launchdarkly/markincompatibleevaluationdetailaccessors): OpenFeature's `FlagEvaluationDetails` does not offer a direct replacement for every `EvaluationDetail` accessor. Add a `TODO` comment on `getVariationIndex()`, `isDefaultValue()` and `getReason()` calls so they are migrated by hand, since `getVariationIndex()` and `isDefaultValue()` have no equivalent and `getReason()` returns a `String` rather than an `EvaluationReason`. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDClientLifecycle](https://docs.openrewrite.org/recipes/featureflags/launchdarkly/migrateldclientlifecycle): Migrate `LDClient` lifecycle calls: `close()` becomes `OpenFeatureAPI.getInstance().shutdown()` and `isInitialized()` becomes `OpenFeatureAPI.getInstance().getClient().getProviderState() == ProviderState.READY`. OpenFeature manages provider state globally rather than per client instance, so the original receiver is dropped. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDClientToOpenFeature](https://docs.openrewrite.org/recipes/featureflags/launchdarkly/migrateldclienttoopenfeature): Replace `new LDClient(...)` with `OpenFeatureAPI.getInstance().getClient()`. When the client is assigned to a local variable, the one-time provider bootstrap `OpenFeatureAPI.getInstance().setProviderAndWait(new Provider(...))` is generated from the original SDK key and configuration. In other positions (such as fields) the original configuration is preserved in a `TODO` comment instead, as a statement cannot be inserted there. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDContextToEvaluationContext](https://docs.openrewrite.org/recipes/featureflags/launchdarkly/migrateldcontexttoevaluationcontext): Convert `LDContext.create(...)` and `LDContext.builder(...)` construction to OpenFeature's `MutableContext`, mapping `name(...)` and `set(...)` attributes to `add(...)` and dropping the terminal `build()` call. Targeting `kind`, multi-context and private attributes are left untouched for manual review. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDValueToValue](https://docs.openrewrite.org/recipes/featureflags/launchdarkly/migrateldvaluetovalue): Migrate `jsonValueVariation`/`jsonValueVariationDetail` to OpenFeature's `getObjectValue`/`getObjectDetails` (reordering the context argument to last) and convert scalar `LDValue.of(...)` and `LDValue.ofNull()` defaults to `dev.openfeature.sdk.Value`. To keep the result compilable, this recipe is skipped for files that use the structured builders `LDValue.buildObject()`, `LDValue.buildArray()`, `LDValue.parse(...)` or `LDValue.of(long)`, which require manual migration to `Structure`/`List`. +* [org.openrewrite.featureflags.launchdarkly.MigrateLaunchDarklyToOpenFeature](https://docs.openrewrite.org/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature): Migrate call sites from the LaunchDarkly server SDK to the vendor-neutral [OpenFeature](https://openfeature.dev/) API, backed by the LaunchDarkly OpenFeature provider. Flag evaluations are renamed and their arguments reordered (LaunchDarkly takes the context as the second argument; OpenFeature takes it last), `LDContext` construction becomes `MutableContext`, and `LDClient` becomes `dev.openfeature.sdk.Client`. The one-time provider bootstrap (`OpenFeatureAPI.setProviderAndWait(...)`) is intentionally left for manual configuration. +* [org.openrewrite.github.UpgradeOfficialGitHubActions](https://docs.openrewrite.org/recipes/github/upgradeofficialgithubactions): Upgrades actions from the official `actions` and `github` organizations to the newest known version, working entirely offline. Each reference is upgraded while preserving its existing precision: a major version (`v4`) moves to the newest major, a full version (`v4.1.2`) to the newest full version, and a commit SHA to the latest known commit. Actions that are not official, not known, or already up to date are left untouched. +* [org.openrewrite.java.jackson.JsonSerializeIncludeToJsonInclude](https://docs.openrewrite.org/recipes/java/jackson/jsonserializeincludetojsoninclude): Move the deprecated `include` attribute of FasterXML's `@JsonSerialize` to a separate `@JsonInclude` annotation. The `include` attribute was deprecated in Jackson 2.x and removed in Jackson 3.x; running this recipe before the Jackson 2 → 3 package rename produces a correct `tools.jackson.annotation.JsonInclude` on the Jackson 3 side. +* [org.openrewrite.java.jackson.ReadValueUrlToOpenStream](https://docs.openrewrite.org/recipes/java/jackson/readvalueurltoopenstream): Jackson 3.x removed every `URL`-accepting `readValue` overload from `ObjectMapper`. Rewrite call sites to feed `URL.openStream()` into the surviving `readValue(InputStream, ...)` overload, which is what `readValue(URL, ...)` did internally in Jackson 2.x. The caller's checked-exception story is unchanged: `URL.openStream()` declares `IOException`, the same checked exception the removed `readValue(URL, ...)` declared. +* [org.openrewrite.java.migrate.CommentJava24KotlinCap](https://docs.openrewrite.org/recipes/java/migrate/commentjava24kotlincap): Adds an explanatory comment to Maven `pom.xml` files in modules that were held at Java 24 because they compile Kotlin and depend on `kotlin-stdlib` older than 2.3, which cannot target Java 25 bytecode. The comment names the `kotlin-stdlib` version found and the next step needed to reach Java 25. Self-healing: the comment is added while the module is at Java 24 and removed again once the module reaches a higher Java version (for instance after its Kotlin was upgraded to 2.3), so it only ever remains on modules that truly stay at Java 24 — whether a Kotlin 1.x cap or a 2.0-2.2 module whose Kotlin upgrade could not be applied. Intended to run last, scoped to modules that compile Kotlin. +* [org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24](https://docs.openrewrite.org/recipes/java/migrate/commentkotlinmodulescappedatjava24): Adds an explanatory comment to Kotlin modules that remain at Java 24 after the Java 25 migration, because Kotlin before 2.3 cannot target Java 25 bytecode. This covers both a Kotlin 1.x cap (which cannot be upgraded automatically) and a Kotlin 2.0-2.2 module whose upgrade to 2.3 could not be applied. Scoped to modules that actually compile Kotlin (i.e. contain `.kt` source files); the comment is self-healing, so a module that does reach Java 25 has it removed. +* [org.openrewrite.java.migrate.UpgradeBuildToJava24ForKotlin1x](https://docs.openrewrite.org/recipes/java/migrate/upgradebuildtojava24forkotlin1x): Kotlin versions before 2.3 only support up to Java 24, and Kotlin 1.x cannot be safely upgraded automatically because crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change. Such modules are therefore capped at Java 24 and annotated with an explanation. Modules already on Kotlin 2.0-2.2 are instead bumped to Kotlin 2.3 by `UpgradeKotlinForJava25` so they can reach Java 25. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap. +* [org.openrewrite.java.migrate.UpgradeKotlinForJava25](https://docs.openrewrite.org/recipes/java/migrate/upgradekotlinforjava25): Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3. +* [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta11](https://docs.openrewrite.org/recipes/java/migrate/jakarta/migratepluginsforjakarta11): Update plugins to be compatible with Jakarta EE 11. +* [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta9](https://docs.openrewrite.org/recipes/java/migrate/jakarta/migratepluginsforjakarta9): Update plugins to be compatible with Jakarta EE 9. +* [org.openrewrite.java.migrate.jakarta.ReplaceJakartaJwsWithJakartaXmlWs](https://docs.openrewrite.org/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws): Starting with Jakarta EE 10, the standalone `jakarta.jws-api` artifact was retired and its content was merged into `jakarta.xml.ws-api`. This recipe replaces a declared `jakarta.jws:jakarta.jws-api` dependency in place with `jakarta.xml.ws:jakarta.xml.ws-api`, and adds `jakarta.xml.ws:jakarta.xml.ws-api` directly when `jakarta.jws` was only available transitively. +* [org.openrewrite.java.migrate.jakarta.UpgradeMavenEjbPluginConfiguration](https://docs.openrewrite.org/recipes/java/migrate/jakarta/upgrademavenejbpluginconfiguration): Updates the `` configuration of `maven-ejb-plugin` to `4.0` when the current value (or its resolved Maven property) indicates EJB 3.x. Handles the common pattern where `` is coupled to the `javax.ejb-api` dependency version via a shared property, decoupling them after migration. +* [org.openrewrite.java.migrate.lang.ExtractExplicitConstructorInvocationArguments](https://docs.openrewrite.org/recipes/java/migrate/lang/extractexplicitconstructorinvocationarguments): [JEP 513](https://openjdk.org/jeps/513) allows statements before an explicit `super(..)` or `this(..)` constructor invocation. When such a call computes one of its arguments through a method invocation or object creation, this recipe extracts the non-trivial arguments into local variables declared right before the call, surfacing the work done before construction. + +This is a strictly behavior-preserving transformation: argument expressions are already evaluated before the delegate constructor body runs, and such an argument can never reference the instance under construction, so hoisting them into preceding statements changes neither the order of side effects nor the set of legal references. Arguments are extracted in their original left-to-right order, and trivial arguments (literals and local variable references, which have no side effects) are left in place. Statements that follow the constructor invocation are deliberately *not* moved, as reordering them relative to the delegate constructor's side effects could change behavior. +* [org.openrewrite.java.testing.assertj.DecomposeConjunctionAssertion](https://docs.openrewrite.org/recipes/java/testing/assertj/decomposeconjunctionassertion): Split `assertThat(a && b).isTrue()` into separate `assertThat(a).isTrue()` and `assertThat(b).isTrue()` statements, so each condition is asserted (and reported) on its own. This lets the dedicated assertion recipes simplify each conjunct, and `CollapseConsecutiveAssertThatStatements` fuse them back into a single chain when the actual is a plain expression. Only the direct `assertThat(...).isTrue()` form is decomposed; `isFalse()` is left alone, as negating a conjunction is not equivalent to negating each conjunct. +* [org.openrewrite.java.testing.assertj.SimplifyArrayLengthAssertion](https://docs.openrewrite.org/recipes/java/testing/assertj/simplifyarraylengthassertion): Replace `assertThat(array.length)` size assertions with the dedicated array assertions, such as `assertThat(array).hasSize(n)`, `assertThat(array).isEmpty()` and `assertThat(array).hasSameSizeAs(other)`. Works for both object and primitive arrays. +* [org.openrewrite.java.testing.assertj.SimplifyAssertJInstanceOfAssertion](https://docs.openrewrite.org/recipes/java/testing/assertj/simplifyassertjinstanceofassertion): Replace `assertThat(x instanceof Type).isTrue()` with the dedicated `assertThat(x).isInstanceOf(Type.class)`, and the negated and `isFalse()` variants with `isNotInstanceOf`, so failures describe the actual type rather than just `expected true but was false`. +* [org.openrewrite.java.testing.assertj.SimplifyAssertJNullRelatedAssertion](https://docs.openrewrite.org/recipes/java/testing/assertj/simplifyassertjnullrelatedassertion): Replace `assertThat(x == null).isTrue()` and its variants with the dedicated `assertThat(x).isNull()` / `assertThat(x).isNotNull()`. Beyond being more expressive, this avoids the compilation error that results when the `null` literal ends up as the `assertThat` argument (e.g. `assertThat(null == x).isTrue()` becoming `assertThat(null).isSameAs(x)`). +* [org.openrewrite.java.testing.assertj.SimplifyHasSizeFromIsEqualToAssertion](https://docs.openrewrite.org/recipes/java/testing/assertj/simplifyhassizefromisequaltoassertion): Replace `assertThat().isEqualTo(collection.size())` style assertions with the dedicated `assertThat(collection).hasSize()`. Only the structural size form is rewritten, where the comparison is on a primitive `int` and reversing the assertion is behavior-preserving (unlike arbitrary `isEqualTo` object comparisons, which rely on `equals`). +* [org.openrewrite.java.testing.junit5.ImplausibleTimeoutToMinutes](https://docs.openrewrite.org/recipes/java/testing/junit5/implausibletimeouttominutes): JUnit Jupiter's `@Timeout` defaults to `TimeUnit.SECONDS`, so a value such as `@Timeout(10000)` is interpreted as almost three hours, which is most likely a mistake where milliseconds were intended. This recipe rewrites such implausibly large second-based timeouts to the equivalent number of minutes, for instance `@Timeout(value = 167, unit = TimeUnit.MINUTES)`, preserving the original (likely erroneous) semantics while making the mistake far more visible for review. +* [org.openrewrite.java.testing.mockito.PowerMockWhiteboxGetFieldToJavaReflection](https://docs.openrewrite.org/recipes/java/testing/mockito/powermockwhiteboxgetfieldtojavareflection): Replace `Whitebox.getField(Class, String)` with `Class.getDeclaredField(String)` plus `setAccessible(true)`. Unlike PowerMock, `getDeclaredField` does not traverse the class hierarchy for fields inherited from a superclass. +* [org.openrewrite.java.testing.mockito.PowerMockWhiteboxGetMethodToJavaReflection](https://docs.openrewrite.org/recipes/java/testing/mockito/powermockwhiteboxgetmethodtojavareflection): Replace `Whitebox.getMethod(Class, String, Class...)` with `Class.getDeclaredMethod(String, Class...)` plus `setAccessible(true)`. Unlike PowerMock, `getDeclaredMethod` does not traverse the class hierarchy; calls passing an explicit `Class[]` array are left unchanged for manual migration. +* [org.openrewrite.java.testing.mockito.PowerMockWhiteboxInvokeConstructorToJavaReflection](https://docs.openrewrite.org/recipes/java/testing/mockito/powermockwhiteboxinvokeconstructortojavareflection): Replace `Whitebox.invokeConstructor(..)` with `java.lang.reflect.Constructor` lookup and `newInstance()` on the named class. Constructor parameter types are taken from the unambiguously resolved constructor, falling back to each argument's compile-time class; arrays passed to the `Object...` varargs overload are left unchanged for manual migration. +* [org.openrewrite.java.testing.testng.TestNgAssertEqualsDeepToAssertThat](https://docs.openrewrite.org/recipes/java/testing/testng/testngassertequalsdeeptoassertthat): Convert TestNG-style `assertEqualsDeep()` and `assertNotEqualsDeep()` to AssertJ's `assertThat().usingRecursiveComparison().isEqualTo()` / `.isNotEqualTo()`, which performs a deep, recursive comparison of the `Map`/`Set` contents. +* [org.openrewrite.java.testing.testng.TestNgAssertEqualsNoOrderToAssertThat](https://docs.openrewrite.org/recipes/java/testing/testng/testngassertequalsnoordertoassertthat): Convert TestNG-style `assertEqualsNoOrder()` to AssertJ's `assertThat().containsExactlyInAnyOrder()` (arrays) or `assertThat().containsExactlyInAnyOrderElementsOf()` (collections). +* [org.openrewrite.java.testing.testng.TestNgAssertListToAssertThat](https://docs.openrewrite.org/recipes/java/testing/testng/testngassertlisttoassertthat): Convert TestNG-style `assertListContainsObject`/`assertListNotContainsObject` to AssertJ's `assertThat().contains()`/`.doesNotContain()`, and `assertListContains`/`assertListNotContains` (predicate-based) to `.anyMatch()`/`.noneMatch()`. +* [org.openrewrite.java.testing.testng.TestNgAssertNotSameToAssertThat](https://docs.openrewrite.org/recipes/java/testing/testng/testngassertnotsametoassertthat): Convert TestNG-style `assertNotSame()` to AssertJ's `assertThat().isNotSameAs()`. +* [org.openrewrite.java.testing.testng.TestNgAssertSameToAssertThat](https://docs.openrewrite.org/recipes/java/testing/testng/testngassertsametoassertthat): Convert TestNG-style `assertSame()` to AssertJ's `assertThat().isSameAs()`. +* [org.openrewrite.java.testing.testng.TestNgAssertThrowsToAssertThat](https://docs.openrewrite.org/recipes/java/testing/testng/testngassertthrowstoassertthat): Convert TestNG-style `assertThrows()` and `expectThrows()` to AssertJ's `assertThatExceptionOfType().isThrownBy()` (or `assertThatThrownBy()` when no exception type is given) to allow for chained assertions on the thrown exception. +* [org.openrewrite.staticanalysis.AllBranchesIdentical](https://docs.openrewrite.org/recipes/staticanalysis/allbranchesidentical): When every branch of an `if`/`else` chain executes the same code, the condition serves no purpose and the code block can be used directly. +* [org.openrewrite.staticanalysis.CollapsibleIfStatements](https://docs.openrewrite.org/recipes/staticanalysis/collapsibleifstatements): When an `if` statement body contains only another `if` with no `else`, the two conditions can be combined with `&&`. Merging the conditions reduces nesting and makes the code easier to read. +* [org.openrewrite.staticanalysis.MergeIdenticalBranches](https://docs.openrewrite.org/recipes/staticanalysis/mergeidenticalbranches): When two consecutive branches of an `if`/`else if` chain execute the same code, they can be merged by combining their conditions with `||`. This removes duplication and makes the intent clearer. +* [org.openrewrite.staticanalysis.RemoveDuplicateConditions](https://docs.openrewrite.org/recipes/staticanalysis/removeduplicateconditions): When an `if`/`else if` chain contains the same condition more than once, the second branch can never execute because the first matching branch always wins. The duplicate branch is dead code and should be removed. +* [org.openrewrite.staticanalysis.RemoveSelfAssignment](https://docs.openrewrite.org/recipes/staticanalysis/removeselfassignment): Self-assignments such as `x = x` have no effect and indicate a copy-paste error or typo where the left-hand or right-hand side should reference a different variable. +* [org.openrewrite.staticanalysis.RemoveUnconditionalValueOverwrite](https://docs.openrewrite.org/recipes/staticanalysis/removeunconditionalvalueoverwrite): When `map.put(key, value)` is called twice in a row with the same key, the first call is dead code because its value is immediately overwritten. Remove the first call to make the intent clear. +* [org.openrewrite.staticanalysis.RemoveUnreachableMultiCatchAlternative](https://docs.openrewrite.org/recipes/staticanalysis/removeunreachablemulticatchalternative): When an earlier `catch` clause already covers a type, any later `catch` (including a multi-catch alternative) for the same type or a subtype is unreachable and is a Java compile error. This commonly appears after type-substitution migrations (for example, renaming an exception so that two `catch` clauses end up overlapping). This recipe drops the unreachable alternatives from later multi-catches, collapses a multi-catch to a regular `catch` when only one alternative remains, and removes the entire `catch` clause when all of its declared types are already covered. +* [org.openrewrite.staticanalysis.SimplifyRedundantLogicalExpression](https://docs.openrewrite.org/recipes/staticanalysis/simplifyredundantlogicalexpression): When the same expression appears on both sides of `&&`, `||`, `&`, or `|`, the result is always equal to that expression. For example, `x && x` is always just `x`. This is typically a copy-paste error where one side should have been different. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes](https://docs.openrewrite.org/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes): Replaces case-insensitive string comparator lambdas and method references with the JDK constant `String.CASE_INSENSITIVE_ORDER`. Improves readability and removes one closure allocation per call site. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromLambdaRecipe](https://docs.openrewrite.org/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$fromlambdarecipe): Replace `(a, b) -> a.compareToIgnoreCase(b)` with `String.CASE_INSENSITIVE_ORDER` when used as a `Comparator`. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromMethodReferenceRecipe](https://docs.openrewrite.org/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe): Replace the method reference `String::compareToIgnoreCase` with `String.CASE_INSENSITIVE_ORDER` when used as a `Comparator`. + +## Removed Recipes + +* **io.axoniq.framework.migration.Axon4ToAxoniq5AxonServerConnector**: Relocates the Axon Server connector from `org.axonframework.axonserver.connector` to `io.axoniq.framework.axonserver.connector`. The connector now lives in the Axoniq commercial offering (`io.axoniq.framework:axon-server-connector`). Class names are mostly preserved. +* **io.axoniq.framework.migration.Axon4ToAxoniq5Bom**: Replaces the imported `org.axonframework:axon-bom` (AF4) or `org.axonframework:axon-framework-bom` (free AF5) in `` with the Axoniq Framework 5 commercial BOM `io.axoniq.framework:axoniq-framework-bom`. +* **io.axoniq.framework.migration.Axon4ToAxoniq5DeadLetter**: Relocates the Sequenced Dead-Letter Queue (DLQ) types from the open-source `axon-messaging` module to the Axoniq commercial `axoniq-dead-letter` module (`io.axoniq.framework:axoniq-dead-letter`). Class names — including `SequencedDeadLetterQueue`, `JpaSequencedDeadLetterQueue`, `JdbcSequencedDeadLetterQueue`, `DeadLetteredEventProcessingTask`, `EnqueuePolicy`, `Decisions`, `ThrowableCause` — are preserved. +* **io.axoniq.framework.migration.Axon4ToAxoniq5DistributedMessaging**: Relocates the distributed command-bus components (DistributedCommandBus, CommandBusConnector) from the AF4 open-source `axon-messaging` module into the Axoniq commercial `axoniq-distributed-messaging` module (`io.axoniq.framework.messaging.commandhandling.distributed`). Each AF4 fully-qualified name is mapped directly to its final Axoniq location, so this recipe is order-independent relative to the open-source messaging package rename. +* **io.axoniq.framework.migration.Axon4ToAxoniq5EventStreaming**: Placeholder. The Axoniq event streaming module (`io.axoniq.framework:axoniq-event-streaming`) consolidates multi-stream event consumption that lived in `MultiStreamableMessageSource` (available since Axon Framework 4.2) into a dedicated module in Axoniq Framework 5. AF4 applications using `MultiStreamableMessageSource` should migrate to `axoniq-event-streaming` once they adopt Axoniq Framework 5; this recipe will gain class-level mappings as that migration becomes deterministic. +* **io.axoniq.framework.migration.Axon4ToAxoniq5SpringBoot**: Swaps the Spring Boot starter dependency to the Axoniq commercial variant (`io.axoniq.framework:axoniq-spring-boot-starter`). Accepts both the AF4 raw coordinate (`org.axonframework:axon-spring-boot-starter`) and the post-`Axon4ToAxon5SpringBootExtension` coordinate (`org.axonframework.extensions.spring:axon-spring-boot-starter`). Class-level mappings for the Axoniq autoconfig package `io.axoniq.framework.springboot.*` are not yet implemented. +* **io.axoniq.framework.migration.Axon4ToAxoniq5Testcontainer**: Relocates the Axon Server Testcontainer types from the AF4 `axon-test` package `org.axonframework.test.server` to the dedicated Axoniq commercial artifact `io.axoniq.framework:axoniq-testcontainer` under `io.axoniq.framework.testcontainer`. The Enterprise (`AxonServerEEContainer`) and Standard (`AxonServerSEContainer`) edition variants both collapse into the unified `AxonServerContainer` in Axoniq 5. +* **io.axoniq.framework.migration.UpgradeAxon4ToAxoniq5**: Migrates an Axon Framework 4.x application to Axoniq Framework 5 (commercial). Composes `UpgradeAxon4ToAxon5` (the free leg) and then layers commercial-only migrations: BOM swap to `io.axoniq.framework:axoniq-framework-bom`, Spring Boot starter swap to `io.axoniq.framework:axoniq-spring-boot-starter`, source rewrites and Maven adds for Axon Server connector, sequenced dead-letter queue, and distributed messaging. +* **org.axonframework.migration.AddAxonTestFixtureTearDown**: Adds an `@AfterEach tearDown()` method calling `stop()` on the `AxonTestFixture` field, when the test class has such a field but no existing `@AfterEach` method (and no method named `tearDown`). Pairs with `MigrateAggregateTestFixtureSetup` which produces the field; the tear-down step was previously left for manual migration. Java sources only. +* **org.axonframework.migration.AddCommandAnnotation**: Scans @CommandHandler methods and annotates their command parameter types with @Command. Also migrates @RoutingKey on a field to @Command(routingKey = "fieldName") on the class, removing the @RoutingKey field annotation. +* **org.axonframework.migration.AddEntityCreatorAnnotation**: Annotates existing no-arg constructors with `@EntityCreator` for any class annotated with `@EventSourcedEntity` or the Spring `@EventSourced` stereotype. Required by AF5 — the framework uses this annotation to instantiate the entity before applying events. Idempotent: skips constructors that are already annotated. +* **org.axonframework.migration.AddEventAnnotation**: Scans @EventSourcingHandler methods and annotates their event parameter types with @Event. Migrates @Revision("x") on the class to @Event(version = "x"), removing the now-obsolete @Revision annotation. +* **org.axonframework.migration.AddEventTagAnnotation**: Scans event-sourced entity classes for their @AggregateIdentifier field and the event types used in @EventSourcingHandler methods, then annotates the corresponding field in each event class with @EventTag(key = "<EntitySimpleName>"). +* **org.axonframework.migration.AnnotateObsoleteSequencingPolicyProperty**: Inserts a one-line `# TODO(axon4to5): ...` comment above any `axon.eventhandling.processors..sequencing-policy` entry in `application.properties` / `application.yml`. AF5 moves the decision onto the handler class via `@SequencingPolicy`; deleting the property here would race the per-construct skill that drives the source-side annotation, so this recipe only annotates. Idempotent. +* **org.axonframework.migration.Axon4ToAxon5AmqpExtension**: Placeholder for the AMQP extension migration. The AMQP extension lives at `org.axonframework.extensions.amqp` in AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 AMQP integration ships. +* **org.axonframework.migration.Axon4ToAxon5Bom**: Renames the imported `org.axonframework:axon-bom` BOM in `` to `org.axonframework:axon-framework-bom` and pins the imported version to the current Axon Framework 5 release. The BOM artifactId changed between Axon Framework 4 and Axon Framework 5; the groupId is unchanged. +* **org.axonframework.migration.Axon4ToAxon5CdiExtension**: Placeholder for the CDI extension migration. The extension lives at `org.axonframework.extensions.cdi` in AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 CDI integration ships. +* **org.axonframework.migration.Axon4ToAxon5Common**: Migrates `org.axonframework.config` to `org.axonframework.common.configuration`, renames `ConfigurerModule` to `ConfigurationEnhancer`, `ModuleConfiguration` to `Module`, `LifecycleOperations` to `LifecycleRegistry`, relocates `EventProcessingConfigurer` under the messaging.eventhandling namespace, and swaps `@ProcessingGroup` for the AF5 `@Namespace` annotation. +* **org.axonframework.migration.Axon4ToAxon5Conversion**: Migrates the Serializer-based `org.axonframework.serialization` namespace to the new Converter-based `org.axonframework.conversion` namespace. Note: this is a package rename; concrete renames such as `JacksonSerializer` to `JacksonConverter` are NOT applied here and must be handled separately. +* **org.axonframework.migration.Axon4ToAxon5EventSourcing**: Relocates the `@EventSourcingHandler` annotation into `eventsourcing.annotation`, relocates `Snapshotter` into the new `eventsourcing.snapshot.api` API package, ensures the `org.axonframework:axon-eventsourcing` dependency is present when the app uses event-sourcing types (the AF5 Spring Boot starter no longer pulls it transitively, so apps not using the BOM need it added explicitly — it transitively brings `axon-modelling` and `axon-messaging`), and applies the source-level aggregate→entity rewrites — annotating no-arg constructors with the now-mandatory `@EntityCreator` and replacing `AggregateLifecycle.apply(...)` with an injected `EventAppender#append(...)`. +* **org.axonframework.migration.Axon4ToAxon5JGroupsExtension**: Placeholder for the JGroups extension migration. The JGroups extension at `org.axonframework.extensions.jgroups` provided distributed command bus routing in AF4. In Axon Framework 5 the distributed command bus has moved into the AxonIQ commercial offering (`io.axoniq.framework:axoniq-distributed-messaging`). Code using `JGroupsConnector` must be replaced with the AxonIQ commercial distributed messaging APIs. +* **org.axonframework.migration.Axon4ToAxon5KafkaExtension**: Placeholder for the Kafka extension migration. The Kafka extension lives at `org.axonframework.extensions.kafka` in AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 Kafka integration ships. +* **org.axonframework.migration.Axon4ToAxon5Messaging**: Migrates the messaging core (command, event, query handling) from `org.axonframework.{command,event,query}handling` into the `org.axonframework.messaging.*` namespace, relocates handler & interceptor annotations into their `.annotation.*` subpackages, renames `EventBus` to `EventSink`, fixes `MetaData` casing to `Metadata`, relocates the top-level messaging API (`Message`, `Metadata`, `UnitOfWork`, `MessageHandlerInterceptor`, `MessageHandlerInterceptorChain`, `correlation.*`) into `messaging.core.*`, moves the sequencing policy package out of `eventhandling.async` into `messaging.core.sequencing`, relocates `tokenstore` and the replay/reset annotations under their AF5 subpackages, and moves `QueryGateway` into its own gateway subpackage. +* **org.axonframework.migration.Axon4ToAxon5MetricsDropwizardExtension**: Relocates `org.axonframework.metrics` to `org.axonframework.extension.metrics.dropwizard`, reflecting the move from a flat `metrics` namespace to a per-provider layout under `extension.metrics.*`. +* **org.axonframework.migration.Axon4ToAxon5MetricsMicrometerExtension**: Relocates `org.axonframework.micrometer` to `org.axonframework.extension.metrics.micrometer`, reflecting the move into the per-provider `extension.metrics.*` layout. +* **org.axonframework.migration.Axon4ToAxon5Modelling**: Migrates the modelling layer from the `aggregate` vocabulary to the `entity` vocabulary: relocates `org.axonframework.modelling.command` to `org.axonframework.modelling.entity`, renames `TargetAggregateIdentifier` to `TargetEntityId`, `AggregateMember` to `EntityMember`, `Repository` into `modelling.repository`, and `CommandTargetResolver` to `EntityIdResolver`. Strips AF4-only modelling annotations (`@AggregateIdentifier`, `@CreationPolicy`) that have no AF5 successor — id resolution moved onto commands via `@TargetEntityId`, and the AF4 creation-policy semantics map onto static command handlers in AF5 (a manual rewrite the recipe cannot infer beyond removing the annotation itself). +* **org.axonframework.migration.Axon4ToAxon5MongoExtension**: Placeholder for the Mongo extension migration. The Mongo extension lives at `org.axonframework.extensions.mongo` in AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 Mongo integration ships. +* **org.axonframework.migration.Axon4ToAxon5MultitenancyExtension**: Placeholder for the Multitenancy extension migration. The extension lives at `org.axonframework.extensions.multitenancy` in AF4 and does not yet have a finalized Axon Framework 5 equivalent. Update this recipe once the AF5 multitenancy story ships. +* **org.axonframework.migration.Axon4ToAxon5QueryResponseTypes**: On two-argument `queryGateway.query(payload, ResponseType)` calls, unwraps the AF4 `ResponseTypes.instanceOf(...)` / `optionalInstanceOf(...)` / `multipleInstancesOf(...)` wrapper to the plain `Class` form AF5 expects, and renames `query(payload, multipleInstancesOf(R.class))` to `queryMany(payload, R.class)`. Three-argument `query(String, Object, ...)` forms, `subscriptionQuery(...)`, and `streamingQuery(...)` are left untouched so the per-construct migration skill keeps the AF4 fingerprints it needs for design decisions. Removes `ResponseType` / `ResponseTypes` imports only when no references remain. +* **org.axonframework.migration.Axon4ToAxon5ReactorExtension**: Relocates `org.axonframework.extensions.reactor.*` to `org.axonframework.extension.reactor.*` (singular `extension`) and inserts the `messaging.` segment in front of the `commandhandling`, `eventhandling`, and `queryhandling` subpackages. The bare `extensions.reactor.messaging.*` package (which holds `ReactorMessageDispatchInterceptor` and the interceptor chain) is moved under `extension.reactor.messaging.core.*`. +* **org.axonframework.migration.Axon4ToAxon5SpringAotExtension**: The `org.axonframework.extensions.spring-aot:axon-spring-aot` extension has no Axon Framework 5 port. Removes the dependency so the project compiles against AF5. Projects that need Spring AOT / native-image support against AF5 must reintroduce equivalent functionality manually — there is no drop-in replacement. +* **org.axonframework.migration.Axon4ToAxon5SpringBootActuatorExtension**: Relocates `org.axonframework.actuator` to `org.axonframework.extension.springboot.actuator`. The Actuator support is now nested under the Spring Boot extension namespace. +* **org.axonframework.migration.Axon4ToAxon5SpringBootExtension**: Relocates `org.axonframework.springboot` to `org.axonframework.extension.springboot`, matching the Maven groupId move to `org.axonframework.extensions.spring`. Covers both the autoconfigure and starter artifacts (apps depend on the starter, which transitively pulls autoconfigure). Also rewrites Spring Boot configuration property keys whose binding class moved or was renamed in AF5. +* **org.axonframework.migration.Axon4ToAxon5SpringCloudExtension**: Placeholder for the Spring Cloud extension migration. The Spring Cloud extension at `org.axonframework.extensions.springcloud` provided distributed command bus routing in AF4. In Axon Framework 5 the distributed command bus has moved into the AxonIQ commercial offering (`io.axoniq.framework:axoniq-distributed-messaging`). Code using `SpringCloudCommandRouter` must be replaced with the AxonIQ commercial distributed messaging APIs. +* **org.axonframework.migration.Axon4ToAxon5SpringExtension**: Relocates `org.axonframework.spring` to `org.axonframework.extension.spring` and renames the Spring stereotype `@Aggregate` to `@EventSourced`. The stereotype rename is mapped from both the AF4 location and the post-package- move location, so the recipe is order-independent. +* **org.axonframework.migration.Axon4ToAxon5Test**: Renames `AggregateTestFixture` and `SagaTestFixture` to the unified `AxonTestFixture` introduced in Axon Framework 5, and rewrites AF4-style flat fixture call chains (`fixture.given(...).when(...).expectEvents(...)`) to the AF5 fluent given/when/then API (`fixture.given().events(...).when().command(...).then().events(...)`). Also generates an `@AfterEach tearDown()` calling `fixture.stop()` on test classes that declare an `AxonTestFixture` field but have no existing `@AfterEach`. Targets the `axon-test` Maven artifact. Hamcrest matcher conversions and Kotlin `@AfterEach` insertion remain manual. +* **org.axonframework.migration.Axon4ToAxon5TracingOpenTelemetryExtension**: Placeholder for the OpenTelemetry tracing extension migration. Revisioning of the distributed tracing extension for Axon Framework 5 is slated for a later release (see issue #3594). Update this recipe once the AF5 OpenTelemetry tracing integration ships. +* **org.axonframework.migration.Axon4ToAxon5TracingOpenTracingExtension**: Placeholder. The OpenTracing tracing extension at `org.axonframework.extensions.tracing` is superseded by the OpenTelemetry tracing extension in Axon Framework 5 (see `Axon4ToAxon5TracingOpenTelemetryExtension`). Code using OpenTracing must be migrated to OpenTelemetry manually. +* **org.axonframework.migration.ConfigureEventSourcedAnnotation**: Adds explicit tagKey = "<EntitySimpleName>" and idType = <ResolvedType>.class to @EventSourced annotations that have no tagKey set. The tagKey is derived from the class simple name (matching the AF5 default). The idType is deduced from the type of the field annotated with @AggregateIdentifier in AF4. When that field is absent (e.g. POJO aggregate without an explicit identifier field) the idType falls back to Object.class and is flagged with a TODO(axon4to5): comment. +* **org.axonframework.migration.ConvertCommandHandlerConstructorToCompanionObject**: Rewrites Kotlin `@CommandHandler constructor(...)` declarations into `companion object { @JvmStatic @CommandHandler fun handle(...) }` on the same class, matching the AF5 contract where `@CommandHandler` no longer targets constructors. Parameter list and method body are preserved. +* **org.axonframework.migration.ConvertCommandHandlerConstructorToStaticMethod**: Rewrites Axon Framework 4 `@CommandHandler` constructors into `public static void handle(...)` methods, matching the AF5 contract where `@CommandHandler` no longer targets constructors. Parameter list and method body are preserved. +* **org.axonframework.migration.MigrateAggregateTestFixtureSetup**: Rewrites `new AggregateTestFixture(X.class)` (the AF4 aggregate-fixture constructor) to AF5's `AxonTestFixture.with(EventSourcingConfigurer.create().registerEntity(EventSourcedEntityModule.autodetected(.class, X.class)))`. The aggregate type X is read from the class-literal constructor argument; the id type is looked up via the cross-recipe map populated by AddEventTagAnnotation (while @AggregateIdentifier is still on the source). Only matches the AF4 AggregateTestFixture FQN — SagaTestFixture setups are left for manual migration. +* **org.axonframework.migration.MigrateAxonTestFixtureFluentApi**: Rewrites the flat AF4 `fixture.given(...).when(...).expectEvents(...)` call shape to the AF5 fluent `fixture.given().events(...).when().command(...).then().events(...)` shape, including the leaf-method renames (`expectNoEvents` → `noEvents`, `expectSuccessfulHandlerExecution` → `success`, `expectException` + `expectExceptionMessage` → single `exception(cls, msg)`, etc.). The fixture setup migration (constructor → `AxonTestFixture.with(configurer)`, `@AfterEach stop()`) and Hamcrest matcher conversions stay manual. +* **org.axonframework.migration.MigrateCommandGatewayInEventHandler**: Inside every `@EventHandler` method in the class, rewrites calls of the form `commandGateway.send(...)` / `commandGateway.sendAndWait(...)` (where `commandGateway` is a class-level `CommandGateway` field) to `commandDispatcher.send(...)` on a method-level `CommandDispatcher` parameter — adding the parameter when missing. For `void` handlers whose body is a single dispatch expression or a single try/catch with one dispatch per branch, the return type is widened to `CompletableFuture` and the dispatch is converted to `return ... .getResultMessage();`. Once no other references to the gateway field remain, the field, its constructor parameter, and the matching assignment are removed. +* **org.axonframework.migration.MigrateKotlinDslBomImport**: Swaps the `groupId:artifactId` prefix of a Spring Dependency Management `mavenBom("g:a:${property("...")}")` call in a `build.gradle.kts` script, leaving the `${property(...)}` indirection in place. Optionally updates the literal value of the matching `extra["..."]` declaration so the version follows the new BOM. Targets a gap in `gradle.ChangeManagedDependency` where the Kotlin string-template variant of `property(...)` is not recognized. +* **org.axonframework.migration.MigrateMessageInterceptorSignatures**: Rewrites the method signatures of `MessageHandlerInterceptor` and `MessageDispatchInterceptor` implementations to their AF5 shape: `handle(UnitOfWork, InterceptorChain) -> Object` becomes `interceptOnHandle(M, ProcessingContext, MessageHandlerInterceptorChain) -> MessageStream` (and similarly for the dispatch interceptor). The method **body is left untouched** — the dropped `unitOfWork` / `interceptorChain` references become compile errors, surfacing every call site that needs review. A class-level `// TODO(axon4to5):` comment points to the migration path doc. The message type `M` is read from the `implements` clause; raw implementations fall back to `Message`. Runs after the AF4 -> AF5 FQN renames. +* **org.axonframework.migration.MigrateSequencingPolicyLambda**: Rewrites single-argument `SequencingPolicy` lambdas (`e -> body`) to the AF5 shape `(e, ctx) -> Optional.ofNullable(body)`. The AF5 `SequencingPolicy.sequenceIdentifierFor` method takes both a message and a `ProcessingContext`, and returns `Optional` instead of a nullable `Object`. Adds the `java.util.Optional` import. Leaves block-body lambdas, multi-parameter lambdas, and anonymous inner classes alone — those need manual rewriting since the AF4 method name (`getSequenceIdentifierFor`) and the AF5 method name (`sequenceIdentifierFor`) differ. +* **org.axonframework.migration.MigrateSnapshotTriggerDefinitionToAnnotation**: Replaces AF4 Spring Boot @Bean methods returning SnapshotTriggerDefinition with the AF5 @Snapshotting annotation on the corresponding aggregate class. EventCountSnapshotTriggerDefinition maps to afterEvents; AggregateLoadTimeSnapshotTriggerDefinition maps to afterSourcingTime. Custom implementations leave a TODO comment for manual review. +* **org.axonframework.migration.RemoveTypeArguments**: Removes the generic type arguments (`<...>`) from any usage of the configured fully-qualified type. Preserves the underlying type reference and its surrounding context (variables, parameters, return types, generic bounds, etc.). +* **org.axonframework.migration.ReplaceAggregateLifecycleApply**: Replaces every `AggregateLifecycle.apply(X)` (statically imported or via the class) with `eventAppender.append(X)`, injecting an `EventAppender eventAppender` parameter into the enclosing method when one is not already declared. Drops the static `apply` import once no usages remain. +* **org.axonframework.migration.UpgradeAxon4ToAxon5**: Migrates an Axon Framework 4.x application to free (Apache 2.0) Axon Framework 5. Bumps the Axon Framework dependency versions, applies per-module rename recipes (one per core framework module), and renames Maven coordinates within the `org.axonframework.*` namespace. Does NOT touch features dropped from free AF5 (Axon Server, DLQ, DistributedCommandBus) — see `UpgradeAxon4ToAxoniq5` for the commercial path. +* **org.axonframework.migration.UpgradeJava**: Bumps the Java compiler target in pom.xml/build.gradle to the configured LTS (defaults to 21, the Axon Framework 5 minimum). No-op for modules already at or above the target — projects already on a higher Java release are left untouched. +* **org.axonframework.migration.UpgradeKotlin**: Bumps the `org.jetbrains.kotlin:*` dependency versions and the `kotlin-maven-plugin` to the configured Kotlin line (defaults to "2.x", the latest Kotlin 2.x). No-op for modules already at or above the target — the underlying upgrade recipes never downgrade. Rejects targets below Kotlin 2.0. +* **org.openrewrite.java.migrate.UpgradeBuildToJava24**: Kotlin versions before 2.3 only support up to Java 24. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap. + +## Changed Recipes + +* [org.openrewrite.github.ChangeAction](https://docs.openrewrite.org/recipes/github/changeaction) was changed: + * Old Options: + * `newAction: { type: String, required: true }` + * `newVersion: { type: String, required: true }` + * `oldAction: { type: String, required: true }` + * New Options: + * `newAction: { type: String, required: true }` + * `newVersion: { type: String, required: true }` + * `oldAction: { type: String, required: true }` + * `oldSha: { type: String, required: false }` +* [org.openrewrite.github.ChangeActionVersion](https://docs.openrewrite.org/recipes/github/changeactionversion) was changed: + * Old Options: + * `action: { type: String, required: true }` + * `version: { type: String, required: true }` + * New Options: + * `action: { type: String, required: true }` + * `oldSha: { type: String, required: false }` + * `version: { type: String, required: true }` \ No newline at end of file diff --git a/docs/recipes/amazon/awssdk/v2migration/adds3eventnotificationdependency.md b/docs/recipes/amazon/awssdk/v2migration/adds3eventnotificationdependency.md index 922160d350..2e9f8ed566 100644 --- a/docs/recipes/amazon/awssdk/v2migration/adds3eventnotificationdependency.md +++ b/docs/recipes/amazon/awssdk/v2migration/adds3eventnotificationdependency.md @@ -34,7 +34,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * [Add Gradle or Maven dependency](../../../java/dependencies/adddependency) * groupId: `software.amazon.awssdk` * artifactId: `s3-event-notifications` - * version: `2.46.12` + * version: `2.46.17` * onlyIfUsing: `com.amazonaws.services.s3.event.S3EventNotification` @@ -55,7 +55,7 @@ recipeList: - org.openrewrite.java.dependencies.AddDependency: groupId: software.amazon.awssdk artifactId: s3-event-notifications - version: 2.46.12 + version: 2.46.17 onlyIfUsing: com.amazonaws.services.s3.event.S3EventNotification ``` diff --git a/docs/recipes/amazon/awssdk/v2migration/addtransfermanagerdependency.md b/docs/recipes/amazon/awssdk/v2migration/addtransfermanagerdependency.md index cb6b07db0b..3aaa42ee68 100644 --- a/docs/recipes/amazon/awssdk/v2migration/addtransfermanagerdependency.md +++ b/docs/recipes/amazon/awssdk/v2migration/addtransfermanagerdependency.md @@ -34,7 +34,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * [Add Gradle or Maven dependency](../../../java/dependencies/adddependency) * groupId: `software.amazon.awssdk` * artifactId: `s3-transfer-manager` - * version: `2.46.12` + * version: `2.46.17` * onlyIfUsing: `com.amazonaws.services.s3.transfer.TransferManager` @@ -55,7 +55,7 @@ recipeList: - org.openrewrite.java.dependencies.AddDependency: groupId: software.amazon.awssdk artifactId: s3-transfer-manager - version: 2.46.12 + version: 2.46.17 onlyIfUsing: com.amazonaws.services.s3.transfer.TransferManager ``` diff --git a/docs/recipes/amazon/awssdk/v2migration/upgradesdkdependencies.md b/docs/recipes/amazon/awssdk/v2migration/upgradesdkdependencies.md index 002861929a..a2c123ba04 100644 --- a/docs/recipes/amazon/awssdk/v2migration/upgradesdkdependencies.md +++ b/docs/recipes/amazon/awssdk/v2migration/upgradesdkdependencies.md @@ -33,2287 +33,2287 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * [Add Gradle or Maven dependency](../../../java/dependencies/adddependency) * groupId: `software.amazon.awssdk` * artifactId: `apache-client` - * version: `2.46.12` + * version: `2.46.17` * onlyIfUsing: `com.amazonaws.ClientConfiguration` * [Add Gradle or Maven dependency](../../../java/dependencies/adddependency) * groupId: `software.amazon.awssdk` * artifactId: `netty-nio-client` - * version: `2.46.12` + * version: `2.46.17` * onlyIfUsing: `com.amazonaws.ClientConfiguration` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-core` * newGroupId: `software.amazon.awssdk` * newArtifactId: `aws-core` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-bom` * newGroupId: `software.amazon.awssdk` * newArtifactId: `bom` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iot` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotdataplane` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-oam` * newGroupId: `software.amazon.awssdk` * newArtifactId: `oam` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotwireless` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotwireless` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-forecast` * newGroupId: `software.amazon.awssdk` * newArtifactId: `forecast` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-licensemanagerlinuxsubscriptions` * newGroupId: `software.amazon.awssdk` * newArtifactId: `licensemanagerlinuxsubscriptions` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-docdbelastic` * newGroupId: `software.amazon.awssdk` * newArtifactId: `docdbelastic` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-emrcontainers` * newGroupId: `software.amazon.awssdk` * newArtifactId: `emrcontainers` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-timestreamwrite` * newGroupId: `software.amazon.awssdk` * newArtifactId: `timestreamwrite` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codebuild` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codebuild` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotdeviceadvisor` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotdeviceadvisor` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssmcontacts` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssmcontacts` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pcaconnectorscep` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pcaconnectorscep` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-paymentcryptographydata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `paymentcryptographydata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codeguruprofiler` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codeguruprofiler` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesis` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kinesis` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesisvideo` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kinesisvideo` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pinpoint` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pinpoint` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iottwinmaker` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iottwinmaker` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-organizations` * newGroupId: `software.amazon.awssdk` * newArtifactId: `organizations` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-licensemanager` * newGroupId: `software.amazon.awssdk` * newArtifactId: `licensemanager` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-shield` * newGroupId: `software.amazon.awssdk` * newArtifactId: `shield` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssm` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssm` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediastoredata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediastoredata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sagemakerruntime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemakerruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-signer` * newGroupId: `software.amazon.awssdk` * newArtifactId: `signer` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-servicecatalog` * newGroupId: `software.amazon.awssdk` * newArtifactId: `servicecatalog` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-timestreaminfluxdb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `timestreaminfluxdb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lakeformation` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lakeformation` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pcs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pcs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-licensemanagerusersubscriptions` * newGroupId: `software.amazon.awssdk` * newArtifactId: `licensemanagerusersubscriptions` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-secretsmanager` * newGroupId: `software.amazon.awssdk` * newArtifactId: `secretsmanager` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediaconnect` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediaconnect` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mwaa` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mwaa` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kms` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kms` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-quicksight` * newGroupId: `software.amazon.awssdk` * newArtifactId: `quicksight` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-workmail` * newGroupId: `software.amazon.awssdk` * newArtifactId: `workmail` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-eventbridge` * newGroupId: `software.amazon.awssdk` * newArtifactId: `eventbridge` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sagemakergeospatial` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemakergeospatial` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-frauddetector` * newGroupId: `software.amazon.awssdk` * newArtifactId: `frauddetector` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elastictranscoder` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elastictranscoder` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elasticinference` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elasticinference` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lookoutequipment` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lookoutequipment` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pcaconnectorad` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pcaconnectorad` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pinpointsmsvoice` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pinpointsmsvoice` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-securitylake` * newGroupId: `software.amazon.awssdk` * newArtifactId: `securitylake` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudwatch` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudwatch` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudwatchmetrics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudwatch` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-glue` * newGroupId: `software.amazon.awssdk` * newArtifactId: `glue` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-costoptimizationhub` * newGroupId: `software.amazon.awssdk` * newArtifactId: `costoptimizationhub` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-servicequotas` * newGroupId: `software.amazon.awssdk` * newArtifactId: `servicequotas` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-s3` * newGroupId: `software.amazon.awssdk` * newArtifactId: `s3` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appintegrations` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appintegrations` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sesv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sesv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-arczonalshift` * newGroupId: `software.amazon.awssdk` * newArtifactId: `arczonalshift` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-emr` * newGroupId: `software.amazon.awssdk` * newArtifactId: `emr` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-controltower` * newGroupId: `software.amazon.awssdk` * newArtifactId: `controltower` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotfleethub` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotfleethub` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-personalize` * newGroupId: `software.amazon.awssdk` * newArtifactId: `personalize` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-outposts` * newGroupId: `software.amazon.awssdk` * newArtifactId: `outposts` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-workdocs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `workdocs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-networkmanager` * newGroupId: `software.amazon.awssdk` * newArtifactId: `networkmanager` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-omics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `omics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediapackage` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediapackage` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-medialive` * newGroupId: `software.amazon.awssdk` * newArtifactId: `medialive` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediaconvert` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediaconvert` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-marketplaceagreement` * newGroupId: `software.amazon.awssdk` * newArtifactId: `marketplaceagreement` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cognitosync` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cognitosync` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sns` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sns` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-datasync` * newGroupId: `software.amazon.awssdk` * newArtifactId: `datasync` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sagemakeredgemanager` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemakeredge` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-greengrassv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `greengrassv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pinpointemail` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pinpointemail` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cleanroomsml` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cleanroomsml` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-augmentedairuntime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemakera2iruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-neptunedata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `neptunedata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-b2bi` * newGroupId: `software.amazon.awssdk` * newArtifactId: `b2bi` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotanalytics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotanalytics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-inspector2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `inspector2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-groundstation` * newGroupId: `software.amazon.awssdk` * newArtifactId: `groundstation` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-fis` * newGroupId: `software.amazon.awssdk` * newArtifactId: `fis` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-proton` * newGroupId: `software.amazon.awssdk` * newArtifactId: `proton` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-voiceid` * newGroupId: `software.amazon.awssdk` * newArtifactId: `voiceid` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudhsm` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudhsm` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ecrpublic` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ecrpublic` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-servermigration` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sms` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudtraildata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudtraildata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cognitoidentity` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cognitoidentity` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-config` * newGroupId: `software.amazon.awssdk` * newArtifactId: `config` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-osis` * newGroupId: `software.amazon.awssdk` * newArtifactId: `osis` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-private5g` * newGroupId: `software.amazon.awssdk` * newArtifactId: `privatenetworks` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-memorydb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `memorydb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-inspector` * newGroupId: `software.amazon.awssdk` * newArtifactId: `inspector` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-translate` * newGroupId: `software.amazon.awssdk` * newArtifactId: `translate` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mailmanager` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mailmanager` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-paymentcryptography` * newGroupId: `software.amazon.awssdk` * newArtifactId: `paymentcryptography` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chatbot` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chatbot` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-fms` * newGroupId: `software.amazon.awssdk` * newArtifactId: `fms` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssmincidents` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssmincidents` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-vpclattice` * newGroupId: `software.amazon.awssdk` * newArtifactId: `vpclattice` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-s3control` * newGroupId: `software.amazon.awssdk` * newArtifactId: `s3control` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-qapps` * newGroupId: `software.amazon.awssdk` * newArtifactId: `qapps` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-rdsdata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `rdsdata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesisanalyticsv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kinesisanalyticsv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-qbusiness` * newGroupId: `software.amazon.awssdk` * newArtifactId: `qbusiness` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-marketplacecommerceanalytics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `marketplacecommerceanalytics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-synthetics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `synthetics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-apptest` * newGroupId: `software.amazon.awssdk` * newArtifactId: `apptest` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-costexplorer` * newGroupId: `software.amazon.awssdk` * newArtifactId: `costexplorer` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotsecuretunneling` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotsecuretunneling` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudfront` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudfront` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-location` * newGroupId: `software.amazon.awssdk` * newArtifactId: `location` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-wafv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `wafv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-opensearch` * newGroupId: `software.amazon.awssdk` * newArtifactId: `opensearch` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ec2instanceconnect` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ec2instanceconnect` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotthingsgraph` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotthingsgraph` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-repostspace` * newGroupId: `software.amazon.awssdk` * newArtifactId: `repostspace` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53recoveryreadiness` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53recoveryreadiness` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-health` * newGroupId: `software.amazon.awssdk` * newArtifactId: `health` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-workmailmessageflow` * newGroupId: `software.amazon.awssdk` * newArtifactId: `workmailmessageflow` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-comprehendmedical` * newGroupId: `software.amazon.awssdk` * newArtifactId: `comprehendmedical` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotfleetwise` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotfleetwise` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53profiles` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53profiles` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-bcmdataexports` * newGroupId: `software.amazon.awssdk` * newArtifactId: `bcmdataexports` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-accessanalyzer` * newGroupId: `software.amazon.awssdk` * newArtifactId: `accessanalyzer` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-glacier` * newGroupId: `software.amazon.awssdk` * newArtifactId: `glacier` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lightsail` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lightsail` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudwatchrum` * newGroupId: `software.amazon.awssdk` * newArtifactId: `rum` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-inspectorscan` * newGroupId: `software.amazon.awssdk` * newArtifactId: `inspectorscan` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-imagebuilder` * newGroupId: `software.amazon.awssdk` * newArtifactId: `imagebuilder` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sagemakermetrics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemakermetrics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-bedrockagent` * newGroupId: `software.amazon.awssdk` * newArtifactId: `bedrockagent` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-migrationhub` * newGroupId: `software.amazon.awssdk` * newArtifactId: `migrationhub` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-simspaceweaver` * newGroupId: `software.amazon.awssdk` * newArtifactId: `simspaceweaver` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elasticbeanstalk` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elasticbeanstalk` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-freetier` * newGroupId: `software.amazon.awssdk` * newArtifactId: `freetier` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudsearch` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudsearchdomain` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-neptune` * newGroupId: `software.amazon.awssdk` * newArtifactId: `neptune` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-supportapp` * newGroupId: `software.amazon.awssdk` * newArtifactId: `supportapp` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-transfer` * newGroupId: `software.amazon.awssdk` * newArtifactId: `transfer` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-deadline` * newGroupId: `software.amazon.awssdk` * newArtifactId: `deadline` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-braket` * newGroupId: `software.amazon.awssdk` * newArtifactId: `braket` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-verifiedpermissions` * newGroupId: `software.amazon.awssdk` * newArtifactId: `verifiedpermissions` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-scheduler` * newGroupId: `software.amazon.awssdk` * newArtifactId: `scheduler` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-marketplacedeployment` * newGroupId: `software.amazon.awssdk` * newArtifactId: `marketplacedeployment` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-resourcegroups` * newGroupId: `software.amazon.awssdk` * newArtifactId: `resourcegroups` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-qldb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `qldb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-dms` * newGroupId: `software.amazon.awssdk` * newArtifactId: `databasemigration` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ecr` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ecr` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-dynamodb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `dynamodb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-resiliencehub` * newGroupId: `software.amazon.awssdk` * newArtifactId: `resiliencehub` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-qldbsession` * newGroupId: `software.amazon.awssdk` * newArtifactId: `qldbsession` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53domains` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-macie2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `macie2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chimesdkmeetings` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chimesdkmeetings` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-applicationautoscaling` * newGroupId: `software.amazon.awssdk` * newArtifactId: `applicationautoscaling` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-entityresolution` * newGroupId: `software.amazon.awssdk` * newArtifactId: `entityresolution` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-s3outposts` * newGroupId: `software.amazon.awssdk` * newArtifactId: `s3outposts` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-managedgrafana` * newGroupId: `software.amazon.awssdk` * newArtifactId: `grafana` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-storagegateway` * newGroupId: `software.amazon.awssdk` * newArtifactId: `storagegateway` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-recyclebin` * newGroupId: `software.amazon.awssdk` * newArtifactId: `rbin` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ioteventsdata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ioteventsdata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53recoverycluster` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53recoverycluster` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ecs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ecs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elasticloadbalancing` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elasticloadbalancing` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-connectcontactlens` * newGroupId: `software.amazon.awssdk` * newArtifactId: `connectcontactlens` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chimesdkmediapipelines` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chimesdkmediapipelines` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesisvideosignalingchannels` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kinesisvideosignaling` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-qconnect` * newGroupId: `software.amazon.awssdk` * newArtifactId: `qconnect` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kendraranking` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kendraranking` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudsearch` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudsearch` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-logs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudwatchlogs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appfabric` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appfabric` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lookoutforvision` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lookoutvision` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53resolver` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53resolver` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-workspaces` * newGroupId: `software.amazon.awssdk` * newArtifactId: `workspaces` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-machinelearning` * newGroupId: `software.amazon.awssdk` * newArtifactId: `machinelearning` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-costandusagereport` * newGroupId: `software.amazon.awssdk` * newArtifactId: `costandusagereport` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-taxsettings` * newGroupId: `software.amazon.awssdk` * newArtifactId: `taxsettings` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-fsx` * newGroupId: `software.amazon.awssdk` * newArtifactId: `fsx` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codepipeline` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codepipeline` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elasticloadbalancingv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elasticloadbalancingv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-directory` * newGroupId: `software.amazon.awssdk` * newArtifactId: `directory` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-bedrockruntime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `bedrockruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codestarnotifications` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codestarnotifications` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-schemas` * newGroupId: `software.amazon.awssdk` * newArtifactId: `schemas` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sqs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sqs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appregistry` * newGroupId: `software.amazon.awssdk` * newArtifactId: `servicecatalogappregistry` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appmesh` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appmesh` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-migrationhuborchestrator` * newGroupId: `software.amazon.awssdk` * newArtifactId: `migrationhuborchestrator` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-discovery` * newGroupId: `software.amazon.awssdk` * newArtifactId: `applicationdiscovery` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iot` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iot` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesisvideowebrtcstorage` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kinesisvideowebrtcstorage` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ebs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ebs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-amplify` * newGroupId: `software.amazon.awssdk` * newArtifactId: `amplify` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudcontrolapi` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudcontrol` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-wellarchitected` * newGroupId: `software.amazon.awssdk` * newArtifactId: `wellarchitected` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-marketplaceentitlement` * newGroupId: `software.amazon.awssdk` * newArtifactId: `marketplaceentitlement` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-bedrock` * newGroupId: `software.amazon.awssdk` * newArtifactId: `bedrock` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-redshift` * newGroupId: `software.amazon.awssdk` * newArtifactId: `redshift` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-connectcases` * newGroupId: `software.amazon.awssdk` * newArtifactId: `connectcases` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appflow` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appflow` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-gamelift` * newGroupId: `software.amazon.awssdk` * newArtifactId: `gamelift` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudtrail` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudtrail` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-supplychain` * newGroupId: `software.amazon.awssdk` * newArtifactId: `supplychain` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pipes` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pipes` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudwatchevidently` * newGroupId: `software.amazon.awssdk` * newArtifactId: `evidently` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-amplifyuibuilder` * newGroupId: `software.amazon.awssdk` * newArtifactId: `amplifyuibuilder` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-managedblockchainquery` * newGroupId: `software.amazon.awssdk` * newArtifactId: `managedblockchainquery` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-applicationinsights` * newGroupId: `software.amazon.awssdk` * newArtifactId: `applicationinsights` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chimesdkmessaging` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chimesdkmessaging` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediatailor` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediatailor` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediapackagev2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediapackagev2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-resourceexplorer2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `resourceexplorer2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pi` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pi` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-emrserverless` * newGroupId: `software.amazon.awssdk` * newArtifactId: `emrserverless` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appconfig` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appconfig` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-networkmonitor` * newGroupId: `software.amazon.awssdk` * newArtifactId: `networkmonitor` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sagemakerfeaturestoreruntime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemakerfeaturestoreruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chimesdkidentity` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chimesdkidentity` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-computeoptimizer` * newGroupId: `software.amazon.awssdk` * newArtifactId: `computeoptimizer` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-connectparticipant` * newGroupId: `software.amazon.awssdk` * newArtifactId: `connectparticipant` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mgn` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mgn` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-applicationcostprofiler` * newGroupId: `software.amazon.awssdk` * newArtifactId: `applicationcostprofiler` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-new-service-template` * newGroupId: `software.amazon.awssdk` * newArtifactId: `new-service-template` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-keyspaces` * newGroupId: `software.amazon.awssdk` * newArtifactId: `keyspaces` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iam` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iam` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-networkfirewall` * newGroupId: `software.amazon.awssdk` * newArtifactId: `networkfirewall` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-redshiftdataapi` * newGroupId: `software.amazon.awssdk` * newArtifactId: `redshiftdata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediastore` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediastore` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloud9` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloud9` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-connectwisdom` * newGroupId: `software.amazon.awssdk` * newArtifactId: `wisdom` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sso` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sso` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-auditmanager` * newGroupId: `software.amazon.awssdk` * newArtifactId: `auditmanager` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-snowball` * newGroupId: `software.amazon.awssdk` * newArtifactId: `snowball` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesis` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kinesisanalytics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53recoverycontrolconfig` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53recoverycontrolconfig` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-opsworks` * newGroupId: `software.amazon.awssdk` * newArtifactId: `opsworks` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-identitystore` * newGroupId: `software.amazon.awssdk` * newArtifactId: `identitystore` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-connectcampaign` * newGroupId: `software.amazon.awssdk` * newArtifactId: `connectcampaigns` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-textract` * newGroupId: `software.amazon.awssdk` * newArtifactId: `textract` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-redshiftserverless` * newGroupId: `software.amazon.awssdk` * newArtifactId: `redshiftserverless` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-eks` * newGroupId: `software.amazon.awssdk` * newArtifactId: `eks` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-support` * newGroupId: `software.amazon.awssdk` * newArtifactId: `support` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mechanicalturkrequester` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mturk` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-apigatewayv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `apigatewayv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-devopsguru` * newGroupId: `software.amazon.awssdk` * newArtifactId: `devopsguru` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-prometheus` * newGroupId: `software.amazon.awssdk` * newArtifactId: `amp` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-drs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `drs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-migrationhubconfig` * newGroupId: `software.amazon.awssdk` * newArtifactId: `migrationhubconfig` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kafkaconnect` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kafkaconnect` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kafka` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kafka` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-gluedatabrew` * newGroupId: `software.amazon.awssdk` * newArtifactId: `databrew` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codedeploy` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codedeploy` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudhsmv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudhsmv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-batch` * newGroupId: `software.amazon.awssdk` * newArtifactId: `batch` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-savingsplans` * newGroupId: `software.amazon.awssdk` * newArtifactId: `savingsplans` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-migrationhubstrategyrecommendations` * newGroupId: `software.amazon.awssdk` * newArtifactId: `migrationhubstrategy` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appsync` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appsync` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-backupgateway` * newGroupId: `software.amazon.awssdk` * newArtifactId: `backupgateway` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-dlm` * newGroupId: `software.amazon.awssdk` * newArtifactId: `dlm` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-amplifybackend` * newGroupId: `software.amazon.awssdk` * newArtifactId: `amplifybackend` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-datazoneexternal` * newGroupId: `software.amazon.awssdk` * newArtifactId: `datazone` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-billingconductor` * newGroupId: `software.amazon.awssdk` * newArtifactId: `billingconductor` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-workspacesthinclient` * newGroupId: `software.amazon.awssdk` * newArtifactId: `workspacesthinclient` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssmsap` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssmsap` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-budgets` * newGroupId: `software.amazon.awssdk` * newArtifactId: `budgets` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mainframemodernization` * newGroupId: `software.amazon.awssdk` * newArtifactId: `m2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-finspace` * newGroupId: `software.amazon.awssdk` * newArtifactId: `finspace` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-detective` * newGroupId: `software.amazon.awssdk` * newArtifactId: `detective` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lambda` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lambda` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssooidc` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssooidc` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-panorama` * newGroupId: `software.amazon.awssdk` * newArtifactId: `panorama` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotevents` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotevents` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-managedblockchain` * newGroupId: `software.amazon.awssdk` * newArtifactId: `managedblockchain` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-servicediscovery` * newGroupId: `software.amazon.awssdk` * newArtifactId: `servicediscovery` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-waf` * newGroupId: `software.amazon.awssdk` * newArtifactId: `waf` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ivs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ivs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-directconnect` * newGroupId: `software.amazon.awssdk` * newArtifactId: `directconnect` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mq` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mq` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pinpointsmsvoicev2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pinpointsmsvoicev2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-internetmonitor` * newGroupId: `software.amazon.awssdk` * newArtifactId: `internetmonitor` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-artifact` * newGroupId: `software.amazon.awssdk` * newArtifactId: `artifact` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotsitewise` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotsitewise` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lexmodelsv2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lexmodelsv2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lexruntimev2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lexruntimev2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-serverlessapplicationrepository` * newGroupId: `software.amazon.awssdk` * newArtifactId: `serverlessapplicationrepository` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-eksauth` * newGroupId: `software.amazon.awssdk` * newArtifactId: `eksauth` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-snowdevicemanagement` * newGroupId: `software.amazon.awssdk` * newArtifactId: `snowdevicemanagement` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-clouddirectory` * newGroupId: `software.amazon.awssdk` * newArtifactId: `clouddirectory` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-mediapackagevod` * newGroupId: `software.amazon.awssdk` * newArtifactId: `mediapackagevod` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codestarconnections` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codestarconnections` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codeartifact` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codeartifact` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-guardduty` * newGroupId: `software.amazon.awssdk` * newArtifactId: `guardduty` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-worklink` * newGroupId: `software.amazon.awssdk` * newArtifactId: `worklink` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cleanrooms` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cleanrooms` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-customerprofiles` * newGroupId: `software.amazon.awssdk` * newArtifactId: `customerprofiles` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-trustedadvisor` * newGroupId: `software.amazon.awssdk` * newArtifactId: `trustedadvisor` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-dax` * newGroupId: `software.amazon.awssdk` * newArtifactId: `dax` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-opsworkscm` * newGroupId: `software.amazon.awssdk` * newArtifactId: `opsworkscm` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-docdb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `docdb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-acmpca` * newGroupId: `software.amazon.awssdk` * newArtifactId: `acmpca` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kinesis` * newGroupId: `software.amazon.awssdk` * newArtifactId: `firehose` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ivschat` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ivschat` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-globalaccelerator` * newGroupId: `software.amazon.awssdk` * newArtifactId: `globalaccelerator` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ses` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ses` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codegurureviewer` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codegurureviewer` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lexmodelbuilding` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lexmodelbuilding` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-medicalimaging` * newGroupId: `software.amazon.awssdk` * newArtifactId: `medicalimaging` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-account` * newGroupId: `software.amazon.awssdk` * newArtifactId: `account` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-robomaker` * newGroupId: `software.amazon.awssdk` * newArtifactId: `robomaker` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lex` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lexruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-autoscaling` * newGroupId: `software.amazon.awssdk` * newArtifactId: `autoscaling` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-nimblestudio` * newGroupId: `software.amazon.awssdk` * newArtifactId: `nimble` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iotjobsdataplane` * newGroupId: `software.amazon.awssdk` * newArtifactId: `iotjobsdataplane` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appconfigdata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appconfigdata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-controlcatalog` * newGroupId: `software.amazon.awssdk` * newArtifactId: `controlcatalog` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-greengrass` * newGroupId: `software.amazon.awssdk` * newArtifactId: `greengrass` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-securityhub` * newGroupId: `software.amazon.awssdk` * newArtifactId: `securityhub` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-timestreamquery` * newGroupId: `software.amazon.awssdk` * newArtifactId: `timestreamquery` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-backup` * newGroupId: `software.amazon.awssdk` * newArtifactId: `backup` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-opensearchserverless` * newGroupId: `software.amazon.awssdk` * newArtifactId: `opensearchserverless` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cloudformation` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudformation` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-kendra` * newGroupId: `software.amazon.awssdk` * newArtifactId: `kendra` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-connect` * newGroupId: `software.amazon.awssdk` * newArtifactId: `connect` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elasticache` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elasticache` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-stepfunctions` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sfn` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-cognitoidp` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cognitoidentityprovider` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-chimesdkvoice` * newGroupId: `software.amazon.awssdk` * newArtifactId: `chimesdkvoice` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-workspacesweb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `workspacesweb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-comprehend` * newGroupId: `software.amazon.awssdk` * newArtifactId: `comprehend` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-applicationsignals` * newGroupId: `software.amazon.awssdk` * newArtifactId: `applicationsignals` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-marketplacemeteringservice` * newGroupId: `software.amazon.awssdk` * newArtifactId: `marketplacemetering` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-devicefarm` * newGroupId: `software.amazon.awssdk` * newArtifactId: `devicefarm` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-rekognition` * newGroupId: `software.amazon.awssdk` * newArtifactId: `rekognition` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-appstream` * newGroupId: `software.amazon.awssdk` * newArtifactId: `appstream` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-polly` * newGroupId: `software.amazon.awssdk` * newArtifactId: `polly` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-rds` * newGroupId: `software.amazon.awssdk` * newArtifactId: `rds` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-pricing` * newGroupId: `software.amazon.awssdk` * newArtifactId: `pricing` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-simpleworkflow` * newGroupId: `software.amazon.awssdk` * newArtifactId: `swf` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-events` * newGroupId: `software.amazon.awssdk` * newArtifactId: `cloudwatchevents` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssmquicksetup` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssmquicksetup` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-autoscalingplans` * newGroupId: `software.amazon.awssdk` * newArtifactId: `autoscalingplans` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-datapipeline` * newGroupId: `software.amazon.awssdk` * newArtifactId: `datapipeline` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-transcribe` * newGroupId: `software.amazon.awssdk` * newArtifactId: `transcribe` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ivsrealtime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ivsrealtime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-personalizeruntime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `personalizeruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-elasticsearch` * newGroupId: `software.amazon.awssdk` * newArtifactId: `elasticsearch` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codecommit` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codecommit` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-resourcegroupstaggingapi` * newGroupId: `software.amazon.awssdk` * newArtifactId: `resourcegroupstaggingapi` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-forecastquery` * newGroupId: `software.amazon.awssdk` * newArtifactId: `forecastquery` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-healthlake` * newGroupId: `software.amazon.awssdk` * newArtifactId: `healthlake` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-iamrolesanywhere` * newGroupId: `software.amazon.awssdk` * newArtifactId: `rolesanywhere` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-personalizeevents` * newGroupId: `software.amazon.awssdk` * newArtifactId: `personalizeevents` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-apigatewaymanagementapi` * newGroupId: `software.amazon.awssdk` * newArtifactId: `apigatewaymanagementapi` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-launchwizard` * newGroupId: `software.amazon.awssdk` * newArtifactId: `launchwizard` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-xray` * newGroupId: `software.amazon.awssdk` * newArtifactId: `xray` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ssoadmin` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ssoadmin` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-api-gateway` * newGroupId: `software.amazon.awssdk` * newArtifactId: `apigateway` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-migrationhubrefactorspaces` * newGroupId: `software.amazon.awssdk` * newArtifactId: `migrationhubrefactorspaces` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ram` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ram` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codeconnections` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codeconnections` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-efs` * newGroupId: `software.amazon.awssdk` * newArtifactId: `efs` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-bedrockagentruntime` * newGroupId: `software.amazon.awssdk` * newArtifactId: `bedrockagentruntime` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-dataexchange` * newGroupId: `software.amazon.awssdk` * newArtifactId: `dataexchange` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sts` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sts` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-sagemaker` * newGroupId: `software.amazon.awssdk` * newArtifactId: `sagemaker` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-finspacedata` * newGroupId: `software.amazon.awssdk` * newArtifactId: `finspacedata` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-marketplacecatalog` * newGroupId: `software.amazon.awssdk` * newArtifactId: `marketplacecatalog` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-acm` * newGroupId: `software.amazon.awssdk` * newArtifactId: `acm` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-athena` * newGroupId: `software.amazon.awssdk` * newArtifactId: `athena` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-route53` * newGroupId: `software.amazon.awssdk` * newArtifactId: `route53` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-codegurusecurity` * newGroupId: `software.amazon.awssdk` * newArtifactId: `codegurusecurity` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-tnb` * newGroupId: `software.amazon.awssdk` * newArtifactId: `tnb` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-ec2` * newGroupId: `software.amazon.awssdk` * newArtifactId: `ec2` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-apprunner` * newGroupId: `software.amazon.awssdk` * newArtifactId: `apprunner` - * newVersion: `2.46.12` + * newVersion: `2.46.17` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `com.amazonaws` * oldArtifactId: `aws-java-sdk-lookoutmetrics` * newGroupId: `software.amazon.awssdk` * newArtifactId: `lookoutmetrics` - * newVersion: `2.46.12` + * newVersion: `2.46.17` @@ -2330,2287 +2330,2287 @@ recipeList: - org.openrewrite.java.dependencies.AddDependency: groupId: software.amazon.awssdk artifactId: apache-client - version: 2.46.12 + version: 2.46.17 onlyIfUsing: com.amazonaws.ClientConfiguration - org.openrewrite.java.dependencies.AddDependency: groupId: software.amazon.awssdk artifactId: netty-nio-client - version: 2.46.12 + version: 2.46.17 onlyIfUsing: com.amazonaws.ClientConfiguration - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-core newGroupId: software.amazon.awssdk newArtifactId: aws-core - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-bom newGroupId: software.amazon.awssdk newArtifactId: bom - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iot newGroupId: software.amazon.awssdk newArtifactId: iotdataplane - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-oam newGroupId: software.amazon.awssdk newArtifactId: oam - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotwireless newGroupId: software.amazon.awssdk newArtifactId: iotwireless - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-forecast newGroupId: software.amazon.awssdk newArtifactId: forecast - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-licensemanagerlinuxsubscriptions newGroupId: software.amazon.awssdk newArtifactId: licensemanagerlinuxsubscriptions - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-docdbelastic newGroupId: software.amazon.awssdk newArtifactId: docdbelastic - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-emrcontainers newGroupId: software.amazon.awssdk newArtifactId: emrcontainers - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-timestreamwrite newGroupId: software.amazon.awssdk newArtifactId: timestreamwrite - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codebuild newGroupId: software.amazon.awssdk newArtifactId: codebuild - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotdeviceadvisor newGroupId: software.amazon.awssdk newArtifactId: iotdeviceadvisor - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssmcontacts newGroupId: software.amazon.awssdk newArtifactId: ssmcontacts - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pcaconnectorscep newGroupId: software.amazon.awssdk newArtifactId: pcaconnectorscep - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-paymentcryptographydata newGroupId: software.amazon.awssdk newArtifactId: paymentcryptographydata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codeguruprofiler newGroupId: software.amazon.awssdk newArtifactId: codeguruprofiler - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesis newGroupId: software.amazon.awssdk newArtifactId: kinesis - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesisvideo newGroupId: software.amazon.awssdk newArtifactId: kinesisvideo - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pinpoint newGroupId: software.amazon.awssdk newArtifactId: pinpoint - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chime newGroupId: software.amazon.awssdk newArtifactId: chime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iottwinmaker newGroupId: software.amazon.awssdk newArtifactId: iottwinmaker - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-organizations newGroupId: software.amazon.awssdk newArtifactId: organizations - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-licensemanager newGroupId: software.amazon.awssdk newArtifactId: licensemanager - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-shield newGroupId: software.amazon.awssdk newArtifactId: shield - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssm newGroupId: software.amazon.awssdk newArtifactId: ssm - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediastoredata newGroupId: software.amazon.awssdk newArtifactId: mediastoredata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sagemakerruntime newGroupId: software.amazon.awssdk newArtifactId: sagemakerruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-signer newGroupId: software.amazon.awssdk newArtifactId: signer - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-servicecatalog newGroupId: software.amazon.awssdk newArtifactId: servicecatalog - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-timestreaminfluxdb newGroupId: software.amazon.awssdk newArtifactId: timestreaminfluxdb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lakeformation newGroupId: software.amazon.awssdk newArtifactId: lakeformation - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pcs newGroupId: software.amazon.awssdk newArtifactId: pcs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-licensemanagerusersubscriptions newGroupId: software.amazon.awssdk newArtifactId: licensemanagerusersubscriptions - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-secretsmanager newGroupId: software.amazon.awssdk newArtifactId: secretsmanager - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediaconnect newGroupId: software.amazon.awssdk newArtifactId: mediaconnect - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mwaa newGroupId: software.amazon.awssdk newArtifactId: mwaa - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kms newGroupId: software.amazon.awssdk newArtifactId: kms - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-quicksight newGroupId: software.amazon.awssdk newArtifactId: quicksight - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-workmail newGroupId: software.amazon.awssdk newArtifactId: workmail - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-eventbridge newGroupId: software.amazon.awssdk newArtifactId: eventbridge - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sagemakergeospatial newGroupId: software.amazon.awssdk newArtifactId: sagemakergeospatial - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-frauddetector newGroupId: software.amazon.awssdk newArtifactId: frauddetector - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elastictranscoder newGroupId: software.amazon.awssdk newArtifactId: elastictranscoder - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elasticinference newGroupId: software.amazon.awssdk newArtifactId: elasticinference - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lookoutequipment newGroupId: software.amazon.awssdk newArtifactId: lookoutequipment - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pcaconnectorad newGroupId: software.amazon.awssdk newArtifactId: pcaconnectorad - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pinpointsmsvoice newGroupId: software.amazon.awssdk newArtifactId: pinpointsmsvoice - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-securitylake newGroupId: software.amazon.awssdk newArtifactId: securitylake - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudwatch newGroupId: software.amazon.awssdk newArtifactId: cloudwatch - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudwatchmetrics newGroupId: software.amazon.awssdk newArtifactId: cloudwatch - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-glue newGroupId: software.amazon.awssdk newArtifactId: glue - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-costoptimizationhub newGroupId: software.amazon.awssdk newArtifactId: costoptimizationhub - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-servicequotas newGroupId: software.amazon.awssdk newArtifactId: servicequotas - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-s3 newGroupId: software.amazon.awssdk newArtifactId: s3 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appintegrations newGroupId: software.amazon.awssdk newArtifactId: appintegrations - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sesv2 newGroupId: software.amazon.awssdk newArtifactId: sesv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-arczonalshift newGroupId: software.amazon.awssdk newArtifactId: arczonalshift - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-emr newGroupId: software.amazon.awssdk newArtifactId: emr - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-controltower newGroupId: software.amazon.awssdk newArtifactId: controltower - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotfleethub newGroupId: software.amazon.awssdk newArtifactId: iotfleethub - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-personalize newGroupId: software.amazon.awssdk newArtifactId: personalize - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-outposts newGroupId: software.amazon.awssdk newArtifactId: outposts - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-workdocs newGroupId: software.amazon.awssdk newArtifactId: workdocs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-networkmanager newGroupId: software.amazon.awssdk newArtifactId: networkmanager - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-omics newGroupId: software.amazon.awssdk newArtifactId: omics - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediapackage newGroupId: software.amazon.awssdk newArtifactId: mediapackage - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-medialive newGroupId: software.amazon.awssdk newArtifactId: medialive - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediaconvert newGroupId: software.amazon.awssdk newArtifactId: mediaconvert - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-marketplaceagreement newGroupId: software.amazon.awssdk newArtifactId: marketplaceagreement - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cognitosync newGroupId: software.amazon.awssdk newArtifactId: cognitosync - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sns newGroupId: software.amazon.awssdk newArtifactId: sns - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-datasync newGroupId: software.amazon.awssdk newArtifactId: datasync - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sagemakeredgemanager newGroupId: software.amazon.awssdk newArtifactId: sagemakeredge - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-greengrassv2 newGroupId: software.amazon.awssdk newArtifactId: greengrassv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pinpointemail newGroupId: software.amazon.awssdk newArtifactId: pinpointemail - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cleanroomsml newGroupId: software.amazon.awssdk newArtifactId: cleanroomsml - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-augmentedairuntime newGroupId: software.amazon.awssdk newArtifactId: sagemakera2iruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-neptunedata newGroupId: software.amazon.awssdk newArtifactId: neptunedata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-b2bi newGroupId: software.amazon.awssdk newArtifactId: b2bi - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotanalytics newGroupId: software.amazon.awssdk newArtifactId: iotanalytics - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-inspector2 newGroupId: software.amazon.awssdk newArtifactId: inspector2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-groundstation newGroupId: software.amazon.awssdk newArtifactId: groundstation - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-fis newGroupId: software.amazon.awssdk newArtifactId: fis - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-proton newGroupId: software.amazon.awssdk newArtifactId: proton - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-voiceid newGroupId: software.amazon.awssdk newArtifactId: voiceid - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudhsm newGroupId: software.amazon.awssdk newArtifactId: cloudhsm - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ecrpublic newGroupId: software.amazon.awssdk newArtifactId: ecrpublic - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-servermigration newGroupId: software.amazon.awssdk newArtifactId: sms - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudtraildata newGroupId: software.amazon.awssdk newArtifactId: cloudtraildata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cognitoidentity newGroupId: software.amazon.awssdk newArtifactId: cognitoidentity - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-config newGroupId: software.amazon.awssdk newArtifactId: config - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-osis newGroupId: software.amazon.awssdk newArtifactId: osis - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-private5g newGroupId: software.amazon.awssdk newArtifactId: privatenetworks - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-memorydb newGroupId: software.amazon.awssdk newArtifactId: memorydb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-inspector newGroupId: software.amazon.awssdk newArtifactId: inspector - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-translate newGroupId: software.amazon.awssdk newArtifactId: translate - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mailmanager newGroupId: software.amazon.awssdk newArtifactId: mailmanager - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-paymentcryptography newGroupId: software.amazon.awssdk newArtifactId: paymentcryptography - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chatbot newGroupId: software.amazon.awssdk newArtifactId: chatbot - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-fms newGroupId: software.amazon.awssdk newArtifactId: fms - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssmincidents newGroupId: software.amazon.awssdk newArtifactId: ssmincidents - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-vpclattice newGroupId: software.amazon.awssdk newArtifactId: vpclattice - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-s3control newGroupId: software.amazon.awssdk newArtifactId: s3control - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-qapps newGroupId: software.amazon.awssdk newArtifactId: qapps - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-rdsdata newGroupId: software.amazon.awssdk newArtifactId: rdsdata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesisanalyticsv2 newGroupId: software.amazon.awssdk newArtifactId: kinesisanalyticsv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-qbusiness newGroupId: software.amazon.awssdk newArtifactId: qbusiness - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-marketplacecommerceanalytics newGroupId: software.amazon.awssdk newArtifactId: marketplacecommerceanalytics - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-synthetics newGroupId: software.amazon.awssdk newArtifactId: synthetics - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-apptest newGroupId: software.amazon.awssdk newArtifactId: apptest - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-costexplorer newGroupId: software.amazon.awssdk newArtifactId: costexplorer - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotsecuretunneling newGroupId: software.amazon.awssdk newArtifactId: iotsecuretunneling - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudfront newGroupId: software.amazon.awssdk newArtifactId: cloudfront - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-location newGroupId: software.amazon.awssdk newArtifactId: location - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-wafv2 newGroupId: software.amazon.awssdk newArtifactId: wafv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-opensearch newGroupId: software.amazon.awssdk newArtifactId: opensearch - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ec2instanceconnect newGroupId: software.amazon.awssdk newArtifactId: ec2instanceconnect - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotthingsgraph newGroupId: software.amazon.awssdk newArtifactId: iotthingsgraph - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-repostspace newGroupId: software.amazon.awssdk newArtifactId: repostspace - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53recoveryreadiness newGroupId: software.amazon.awssdk newArtifactId: route53recoveryreadiness - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-health newGroupId: software.amazon.awssdk newArtifactId: health - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-workmailmessageflow newGroupId: software.amazon.awssdk newArtifactId: workmailmessageflow - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-comprehendmedical newGroupId: software.amazon.awssdk newArtifactId: comprehendmedical - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotfleetwise newGroupId: software.amazon.awssdk newArtifactId: iotfleetwise - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53profiles newGroupId: software.amazon.awssdk newArtifactId: route53profiles - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-bcmdataexports newGroupId: software.amazon.awssdk newArtifactId: bcmdataexports - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-accessanalyzer newGroupId: software.amazon.awssdk newArtifactId: accessanalyzer - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-glacier newGroupId: software.amazon.awssdk newArtifactId: glacier - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lightsail newGroupId: software.amazon.awssdk newArtifactId: lightsail - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudwatchrum newGroupId: software.amazon.awssdk newArtifactId: rum - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-inspectorscan newGroupId: software.amazon.awssdk newArtifactId: inspectorscan - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-imagebuilder newGroupId: software.amazon.awssdk newArtifactId: imagebuilder - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sagemakermetrics newGroupId: software.amazon.awssdk newArtifactId: sagemakermetrics - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-bedrockagent newGroupId: software.amazon.awssdk newArtifactId: bedrockagent - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-migrationhub newGroupId: software.amazon.awssdk newArtifactId: migrationhub - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-simspaceweaver newGroupId: software.amazon.awssdk newArtifactId: simspaceweaver - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elasticbeanstalk newGroupId: software.amazon.awssdk newArtifactId: elasticbeanstalk - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-freetier newGroupId: software.amazon.awssdk newArtifactId: freetier - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudsearch newGroupId: software.amazon.awssdk newArtifactId: cloudsearchdomain - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-neptune newGroupId: software.amazon.awssdk newArtifactId: neptune - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-supportapp newGroupId: software.amazon.awssdk newArtifactId: supportapp - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-transfer newGroupId: software.amazon.awssdk newArtifactId: transfer - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-deadline newGroupId: software.amazon.awssdk newArtifactId: deadline - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-braket newGroupId: software.amazon.awssdk newArtifactId: braket - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-verifiedpermissions newGroupId: software.amazon.awssdk newArtifactId: verifiedpermissions - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-scheduler newGroupId: software.amazon.awssdk newArtifactId: scheduler - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-marketplacedeployment newGroupId: software.amazon.awssdk newArtifactId: marketplacedeployment - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-resourcegroups newGroupId: software.amazon.awssdk newArtifactId: resourcegroups - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-qldb newGroupId: software.amazon.awssdk newArtifactId: qldb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-dms newGroupId: software.amazon.awssdk newArtifactId: databasemigration - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ecr newGroupId: software.amazon.awssdk newArtifactId: ecr - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-dynamodb newGroupId: software.amazon.awssdk newArtifactId: dynamodb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-resiliencehub newGroupId: software.amazon.awssdk newArtifactId: resiliencehub - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-qldbsession newGroupId: software.amazon.awssdk newArtifactId: qldbsession - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53 newGroupId: software.amazon.awssdk newArtifactId: route53domains - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-macie2 newGroupId: software.amazon.awssdk newArtifactId: macie2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chimesdkmeetings newGroupId: software.amazon.awssdk newArtifactId: chimesdkmeetings - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-applicationautoscaling newGroupId: software.amazon.awssdk newArtifactId: applicationautoscaling - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-entityresolution newGroupId: software.amazon.awssdk newArtifactId: entityresolution - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-s3outposts newGroupId: software.amazon.awssdk newArtifactId: s3outposts - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-managedgrafana newGroupId: software.amazon.awssdk newArtifactId: grafana - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-storagegateway newGroupId: software.amazon.awssdk newArtifactId: storagegateway - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-recyclebin newGroupId: software.amazon.awssdk newArtifactId: rbin - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ioteventsdata newGroupId: software.amazon.awssdk newArtifactId: ioteventsdata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53recoverycluster newGroupId: software.amazon.awssdk newArtifactId: route53recoverycluster - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ecs newGroupId: software.amazon.awssdk newArtifactId: ecs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elasticloadbalancing newGroupId: software.amazon.awssdk newArtifactId: elasticloadbalancing - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-connectcontactlens newGroupId: software.amazon.awssdk newArtifactId: connectcontactlens - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chimesdkmediapipelines newGroupId: software.amazon.awssdk newArtifactId: chimesdkmediapipelines - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesisvideosignalingchannels newGroupId: software.amazon.awssdk newArtifactId: kinesisvideosignaling - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-qconnect newGroupId: software.amazon.awssdk newArtifactId: qconnect - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kendraranking newGroupId: software.amazon.awssdk newArtifactId: kendraranking - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudsearch newGroupId: software.amazon.awssdk newArtifactId: cloudsearch - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-logs newGroupId: software.amazon.awssdk newArtifactId: cloudwatchlogs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appfabric newGroupId: software.amazon.awssdk newArtifactId: appfabric - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lookoutforvision newGroupId: software.amazon.awssdk newArtifactId: lookoutvision - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53resolver newGroupId: software.amazon.awssdk newArtifactId: route53resolver - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-workspaces newGroupId: software.amazon.awssdk newArtifactId: workspaces - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-machinelearning newGroupId: software.amazon.awssdk newArtifactId: machinelearning - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-costandusagereport newGroupId: software.amazon.awssdk newArtifactId: costandusagereport - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-taxsettings newGroupId: software.amazon.awssdk newArtifactId: taxsettings - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-fsx newGroupId: software.amazon.awssdk newArtifactId: fsx - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codepipeline newGroupId: software.amazon.awssdk newArtifactId: codepipeline - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elasticloadbalancingv2 newGroupId: software.amazon.awssdk newArtifactId: elasticloadbalancingv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-directory newGroupId: software.amazon.awssdk newArtifactId: directory - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-bedrockruntime newGroupId: software.amazon.awssdk newArtifactId: bedrockruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codestarnotifications newGroupId: software.amazon.awssdk newArtifactId: codestarnotifications - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-schemas newGroupId: software.amazon.awssdk newArtifactId: schemas - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sqs newGroupId: software.amazon.awssdk newArtifactId: sqs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appregistry newGroupId: software.amazon.awssdk newArtifactId: servicecatalogappregistry - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appmesh newGroupId: software.amazon.awssdk newArtifactId: appmesh - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-migrationhuborchestrator newGroupId: software.amazon.awssdk newArtifactId: migrationhuborchestrator - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-discovery newGroupId: software.amazon.awssdk newArtifactId: applicationdiscovery - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iot newGroupId: software.amazon.awssdk newArtifactId: iot - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesisvideowebrtcstorage newGroupId: software.amazon.awssdk newArtifactId: kinesisvideowebrtcstorage - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ebs newGroupId: software.amazon.awssdk newArtifactId: ebs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-amplify newGroupId: software.amazon.awssdk newArtifactId: amplify - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudcontrolapi newGroupId: software.amazon.awssdk newArtifactId: cloudcontrol - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-wellarchitected newGroupId: software.amazon.awssdk newArtifactId: wellarchitected - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-marketplaceentitlement newGroupId: software.amazon.awssdk newArtifactId: marketplaceentitlement - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-bedrock newGroupId: software.amazon.awssdk newArtifactId: bedrock - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-redshift newGroupId: software.amazon.awssdk newArtifactId: redshift - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-connectcases newGroupId: software.amazon.awssdk newArtifactId: connectcases - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appflow newGroupId: software.amazon.awssdk newArtifactId: appflow - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-gamelift newGroupId: software.amazon.awssdk newArtifactId: gamelift - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudtrail newGroupId: software.amazon.awssdk newArtifactId: cloudtrail - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-supplychain newGroupId: software.amazon.awssdk newArtifactId: supplychain - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pipes newGroupId: software.amazon.awssdk newArtifactId: pipes - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudwatchevidently newGroupId: software.amazon.awssdk newArtifactId: evidently - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-amplifyuibuilder newGroupId: software.amazon.awssdk newArtifactId: amplifyuibuilder - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-managedblockchainquery newGroupId: software.amazon.awssdk newArtifactId: managedblockchainquery - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-applicationinsights newGroupId: software.amazon.awssdk newArtifactId: applicationinsights - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chimesdkmessaging newGroupId: software.amazon.awssdk newArtifactId: chimesdkmessaging - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediatailor newGroupId: software.amazon.awssdk newArtifactId: mediatailor - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediapackagev2 newGroupId: software.amazon.awssdk newArtifactId: mediapackagev2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-resourceexplorer2 newGroupId: software.amazon.awssdk newArtifactId: resourceexplorer2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pi newGroupId: software.amazon.awssdk newArtifactId: pi - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-emrserverless newGroupId: software.amazon.awssdk newArtifactId: emrserverless - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appconfig newGroupId: software.amazon.awssdk newArtifactId: appconfig - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-networkmonitor newGroupId: software.amazon.awssdk newArtifactId: networkmonitor - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sagemakerfeaturestoreruntime newGroupId: software.amazon.awssdk newArtifactId: sagemakerfeaturestoreruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chimesdkidentity newGroupId: software.amazon.awssdk newArtifactId: chimesdkidentity - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-computeoptimizer newGroupId: software.amazon.awssdk newArtifactId: computeoptimizer - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-connectparticipant newGroupId: software.amazon.awssdk newArtifactId: connectparticipant - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mgn newGroupId: software.amazon.awssdk newArtifactId: mgn - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-applicationcostprofiler newGroupId: software.amazon.awssdk newArtifactId: applicationcostprofiler - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-new-service-template newGroupId: software.amazon.awssdk newArtifactId: new-service-template - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-keyspaces newGroupId: software.amazon.awssdk newArtifactId: keyspaces - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iam newGroupId: software.amazon.awssdk newArtifactId: iam - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-networkfirewall newGroupId: software.amazon.awssdk newArtifactId: networkfirewall - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-redshiftdataapi newGroupId: software.amazon.awssdk newArtifactId: redshiftdata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediastore newGroupId: software.amazon.awssdk newArtifactId: mediastore - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloud9 newGroupId: software.amazon.awssdk newArtifactId: cloud9 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-connectwisdom newGroupId: software.amazon.awssdk newArtifactId: wisdom - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sso newGroupId: software.amazon.awssdk newArtifactId: sso - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-auditmanager newGroupId: software.amazon.awssdk newArtifactId: auditmanager - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-snowball newGroupId: software.amazon.awssdk newArtifactId: snowball - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesis newGroupId: software.amazon.awssdk newArtifactId: kinesisanalytics - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53recoverycontrolconfig newGroupId: software.amazon.awssdk newArtifactId: route53recoverycontrolconfig - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-opsworks newGroupId: software.amazon.awssdk newArtifactId: opsworks - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-identitystore newGroupId: software.amazon.awssdk newArtifactId: identitystore - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-connectcampaign newGroupId: software.amazon.awssdk newArtifactId: connectcampaigns - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-textract newGroupId: software.amazon.awssdk newArtifactId: textract - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-redshiftserverless newGroupId: software.amazon.awssdk newArtifactId: redshiftserverless - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-eks newGroupId: software.amazon.awssdk newArtifactId: eks - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-support newGroupId: software.amazon.awssdk newArtifactId: support - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mechanicalturkrequester newGroupId: software.amazon.awssdk newArtifactId: mturk - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-apigatewayv2 newGroupId: software.amazon.awssdk newArtifactId: apigatewayv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-devopsguru newGroupId: software.amazon.awssdk newArtifactId: devopsguru - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-prometheus newGroupId: software.amazon.awssdk newArtifactId: amp - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-drs newGroupId: software.amazon.awssdk newArtifactId: drs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-migrationhubconfig newGroupId: software.amazon.awssdk newArtifactId: migrationhubconfig - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kafkaconnect newGroupId: software.amazon.awssdk newArtifactId: kafkaconnect - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kafka newGroupId: software.amazon.awssdk newArtifactId: kafka - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-gluedatabrew newGroupId: software.amazon.awssdk newArtifactId: databrew - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codedeploy newGroupId: software.amazon.awssdk newArtifactId: codedeploy - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudhsmv2 newGroupId: software.amazon.awssdk newArtifactId: cloudhsmv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-batch newGroupId: software.amazon.awssdk newArtifactId: batch - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-savingsplans newGroupId: software.amazon.awssdk newArtifactId: savingsplans - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-migrationhubstrategyrecommendations newGroupId: software.amazon.awssdk newArtifactId: migrationhubstrategy - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appsync newGroupId: software.amazon.awssdk newArtifactId: appsync - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-backupgateway newGroupId: software.amazon.awssdk newArtifactId: backupgateway - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-dlm newGroupId: software.amazon.awssdk newArtifactId: dlm - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-amplifybackend newGroupId: software.amazon.awssdk newArtifactId: amplifybackend - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-datazoneexternal newGroupId: software.amazon.awssdk newArtifactId: datazone - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-billingconductor newGroupId: software.amazon.awssdk newArtifactId: billingconductor - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-workspacesthinclient newGroupId: software.amazon.awssdk newArtifactId: workspacesthinclient - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssmsap newGroupId: software.amazon.awssdk newArtifactId: ssmsap - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-budgets newGroupId: software.amazon.awssdk newArtifactId: budgets - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mainframemodernization newGroupId: software.amazon.awssdk newArtifactId: m2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-finspace newGroupId: software.amazon.awssdk newArtifactId: finspace - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-detective newGroupId: software.amazon.awssdk newArtifactId: detective - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lambda newGroupId: software.amazon.awssdk newArtifactId: lambda - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssooidc newGroupId: software.amazon.awssdk newArtifactId: ssooidc - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-panorama newGroupId: software.amazon.awssdk newArtifactId: panorama - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotevents newGroupId: software.amazon.awssdk newArtifactId: iotevents - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-managedblockchain newGroupId: software.amazon.awssdk newArtifactId: managedblockchain - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-servicediscovery newGroupId: software.amazon.awssdk newArtifactId: servicediscovery - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-waf newGroupId: software.amazon.awssdk newArtifactId: waf - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ivs newGroupId: software.amazon.awssdk newArtifactId: ivs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-directconnect newGroupId: software.amazon.awssdk newArtifactId: directconnect - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mq newGroupId: software.amazon.awssdk newArtifactId: mq - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pinpointsmsvoicev2 newGroupId: software.amazon.awssdk newArtifactId: pinpointsmsvoicev2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-internetmonitor newGroupId: software.amazon.awssdk newArtifactId: internetmonitor - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-artifact newGroupId: software.amazon.awssdk newArtifactId: artifact - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotsitewise newGroupId: software.amazon.awssdk newArtifactId: iotsitewise - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lexmodelsv2 newGroupId: software.amazon.awssdk newArtifactId: lexmodelsv2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lexruntimev2 newGroupId: software.amazon.awssdk newArtifactId: lexruntimev2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-serverlessapplicationrepository newGroupId: software.amazon.awssdk newArtifactId: serverlessapplicationrepository - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-eksauth newGroupId: software.amazon.awssdk newArtifactId: eksauth - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-snowdevicemanagement newGroupId: software.amazon.awssdk newArtifactId: snowdevicemanagement - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-clouddirectory newGroupId: software.amazon.awssdk newArtifactId: clouddirectory - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-mediapackagevod newGroupId: software.amazon.awssdk newArtifactId: mediapackagevod - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codestarconnections newGroupId: software.amazon.awssdk newArtifactId: codestarconnections - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codeartifact newGroupId: software.amazon.awssdk newArtifactId: codeartifact - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-guardduty newGroupId: software.amazon.awssdk newArtifactId: guardduty - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-worklink newGroupId: software.amazon.awssdk newArtifactId: worklink - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cleanrooms newGroupId: software.amazon.awssdk newArtifactId: cleanrooms - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-customerprofiles newGroupId: software.amazon.awssdk newArtifactId: customerprofiles - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-trustedadvisor newGroupId: software.amazon.awssdk newArtifactId: trustedadvisor - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-dax newGroupId: software.amazon.awssdk newArtifactId: dax - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-opsworkscm newGroupId: software.amazon.awssdk newArtifactId: opsworkscm - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-docdb newGroupId: software.amazon.awssdk newArtifactId: docdb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-acmpca newGroupId: software.amazon.awssdk newArtifactId: acmpca - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kinesis newGroupId: software.amazon.awssdk newArtifactId: firehose - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ivschat newGroupId: software.amazon.awssdk newArtifactId: ivschat - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-globalaccelerator newGroupId: software.amazon.awssdk newArtifactId: globalaccelerator - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ses newGroupId: software.amazon.awssdk newArtifactId: ses - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codegurureviewer newGroupId: software.amazon.awssdk newArtifactId: codegurureviewer - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lexmodelbuilding newGroupId: software.amazon.awssdk newArtifactId: lexmodelbuilding - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-medicalimaging newGroupId: software.amazon.awssdk newArtifactId: medicalimaging - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-account newGroupId: software.amazon.awssdk newArtifactId: account - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-robomaker newGroupId: software.amazon.awssdk newArtifactId: robomaker - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lex newGroupId: software.amazon.awssdk newArtifactId: lexruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-autoscaling newGroupId: software.amazon.awssdk newArtifactId: autoscaling - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-nimblestudio newGroupId: software.amazon.awssdk newArtifactId: nimble - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iotjobsdataplane newGroupId: software.amazon.awssdk newArtifactId: iotjobsdataplane - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appconfigdata newGroupId: software.amazon.awssdk newArtifactId: appconfigdata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-controlcatalog newGroupId: software.amazon.awssdk newArtifactId: controlcatalog - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-greengrass newGroupId: software.amazon.awssdk newArtifactId: greengrass - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-securityhub newGroupId: software.amazon.awssdk newArtifactId: securityhub - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-timestreamquery newGroupId: software.amazon.awssdk newArtifactId: timestreamquery - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-backup newGroupId: software.amazon.awssdk newArtifactId: backup - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-opensearchserverless newGroupId: software.amazon.awssdk newArtifactId: opensearchserverless - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cloudformation newGroupId: software.amazon.awssdk newArtifactId: cloudformation - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-kendra newGroupId: software.amazon.awssdk newArtifactId: kendra - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-connect newGroupId: software.amazon.awssdk newArtifactId: connect - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elasticache newGroupId: software.amazon.awssdk newArtifactId: elasticache - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-stepfunctions newGroupId: software.amazon.awssdk newArtifactId: sfn - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-cognitoidp newGroupId: software.amazon.awssdk newArtifactId: cognitoidentityprovider - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-chimesdkvoice newGroupId: software.amazon.awssdk newArtifactId: chimesdkvoice - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-workspacesweb newGroupId: software.amazon.awssdk newArtifactId: workspacesweb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-comprehend newGroupId: software.amazon.awssdk newArtifactId: comprehend - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-applicationsignals newGroupId: software.amazon.awssdk newArtifactId: applicationsignals - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-marketplacemeteringservice newGroupId: software.amazon.awssdk newArtifactId: marketplacemetering - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-devicefarm newGroupId: software.amazon.awssdk newArtifactId: devicefarm - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-rekognition newGroupId: software.amazon.awssdk newArtifactId: rekognition - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-appstream newGroupId: software.amazon.awssdk newArtifactId: appstream - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-polly newGroupId: software.amazon.awssdk newArtifactId: polly - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-rds newGroupId: software.amazon.awssdk newArtifactId: rds - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-pricing newGroupId: software.amazon.awssdk newArtifactId: pricing - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-simpleworkflow newGroupId: software.amazon.awssdk newArtifactId: swf - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-events newGroupId: software.amazon.awssdk newArtifactId: cloudwatchevents - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssmquicksetup newGroupId: software.amazon.awssdk newArtifactId: ssmquicksetup - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-autoscalingplans newGroupId: software.amazon.awssdk newArtifactId: autoscalingplans - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-datapipeline newGroupId: software.amazon.awssdk newArtifactId: datapipeline - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-transcribe newGroupId: software.amazon.awssdk newArtifactId: transcribe - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ivsrealtime newGroupId: software.amazon.awssdk newArtifactId: ivsrealtime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-personalizeruntime newGroupId: software.amazon.awssdk newArtifactId: personalizeruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-elasticsearch newGroupId: software.amazon.awssdk newArtifactId: elasticsearch - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codecommit newGroupId: software.amazon.awssdk newArtifactId: codecommit - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-resourcegroupstaggingapi newGroupId: software.amazon.awssdk newArtifactId: resourcegroupstaggingapi - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-forecastquery newGroupId: software.amazon.awssdk newArtifactId: forecastquery - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-healthlake newGroupId: software.amazon.awssdk newArtifactId: healthlake - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-iamrolesanywhere newGroupId: software.amazon.awssdk newArtifactId: rolesanywhere - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-personalizeevents newGroupId: software.amazon.awssdk newArtifactId: personalizeevents - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-apigatewaymanagementapi newGroupId: software.amazon.awssdk newArtifactId: apigatewaymanagementapi - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-launchwizard newGroupId: software.amazon.awssdk newArtifactId: launchwizard - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-xray newGroupId: software.amazon.awssdk newArtifactId: xray - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ssoadmin newGroupId: software.amazon.awssdk newArtifactId: ssoadmin - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-api-gateway newGroupId: software.amazon.awssdk newArtifactId: apigateway - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-migrationhubrefactorspaces newGroupId: software.amazon.awssdk newArtifactId: migrationhubrefactorspaces - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ram newGroupId: software.amazon.awssdk newArtifactId: ram - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codeconnections newGroupId: software.amazon.awssdk newArtifactId: codeconnections - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-efs newGroupId: software.amazon.awssdk newArtifactId: efs - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-bedrockagentruntime newGroupId: software.amazon.awssdk newArtifactId: bedrockagentruntime - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-dataexchange newGroupId: software.amazon.awssdk newArtifactId: dataexchange - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sts newGroupId: software.amazon.awssdk newArtifactId: sts - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-sagemaker newGroupId: software.amazon.awssdk newArtifactId: sagemaker - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-finspacedata newGroupId: software.amazon.awssdk newArtifactId: finspacedata - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-marketplacecatalog newGroupId: software.amazon.awssdk newArtifactId: marketplacecatalog - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-acm newGroupId: software.amazon.awssdk newArtifactId: acm - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-athena newGroupId: software.amazon.awssdk newArtifactId: athena - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-route53 newGroupId: software.amazon.awssdk newArtifactId: route53 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-codegurusecurity newGroupId: software.amazon.awssdk newArtifactId: codegurusecurity - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-tnb newGroupId: software.amazon.awssdk newArtifactId: tnb - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-ec2 newGroupId: software.amazon.awssdk newArtifactId: ec2 - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-apprunner newGroupId: software.amazon.awssdk newArtifactId: apprunner - newVersion: 2.46.12 + newVersion: 2.46.17 - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.amazonaws oldArtifactId: aws-java-sdk-lookoutmetrics newGroupId: software.amazon.awssdk newArtifactId: lookoutmetrics - newVersion: 2.46.12 + newVersion: 2.46.17 ``` diff --git a/docs/recipes/core/languagecomposition.md b/docs/recipes/core/languagecomposition.md index 4e2cc0c542..2faf2a567c 100644 --- a/docs/recipes/core/languagecomposition.md +++ b/docs/recipes/core/languagecomposition.md @@ -93,6 +93,21 @@ _A list of individual files and their language composition._ + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + ### Source files that had results @@ -128,21 +143,6 @@ _Search results that were found during the recipe run._ - - -### Source files that errored on a recipe -**org.openrewrite.table.SourcesFileErrors** - -_The details of all errors produced by a recipe run._ - -| Column Name | Description | -| ----------- | ----------- | -| Source path | The file that failed to parse. | -| Recipe that made changes | The specific recipe that made a change. | -| Stack trace | The stack trace of the failure. | - - - ### Recipe performance diff --git a/docs/recipes/csharp/changemethodname.md b/docs/recipes/csharp/changemethodname.md index 7a29b24cae..425f3d2c48 100644 --- a/docs/recipes/csharp/changemethodname.md +++ b/docs/recipes/csharp/changemethodname.md @@ -85,6 +85,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) diff --git a/docs/recipes/csharp/changetype.md b/docs/recipes/csharp/changetype.md index dddb1549d7..660dc2b9b7 100644 --- a/docs/recipes/csharp/changetype.md +++ b/docs/recipes/csharp/changetype.md @@ -122,11 +122,13 @@ This recipe is used as part of the following composite recipes: * [Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`](/recipes/java/migrate/jakarta/javaxxmlbindmigrationtojakartaxmlbind.md) * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) * [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate from JMockit to Mockito](/recipes/java/testing/jmockit/jmockittomockito.md) * [Migrate from Jakarta annotation API to JSpecify](/recipes/java/jspecify/migratefromjakartaannotationapi.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) * [Migrate from JetBrains annotations to JSpecify](/recipes/java/jspecify/migratefromjetbrainsannotations.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micrometer annotations to JSpecify](/recipes/java/jspecify/migratefrommicrometerannotations.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from Micronaut 4.x to 5.x](/recipes/java/micronaut/micronaut4to5migration.md) @@ -145,6 +147,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from `oracle-xe` to `oracle-free`](/recipes/java/testing/testcontainers/migratetooraclefree.md) * [Migrate from javax annotation API to JSpecify](/recipes/java/jspecify/migratefromjavaxannotationapi.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Migrate moved types between Camel 3.x and Camel 4.x](/recipes/apache/camel/upgrade/camel40/changetypes.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) * [Migrate to Apache HttpCore Nio Classes to Apache HttpCore 5.x](/recipes/apache/httpclient5/upgradeapachehttpcore_5_nioclassmapping.md) @@ -216,7 +219,6 @@ This recipe is used as part of the following composite recipes: * [Replace elements of SpringFox's security with Swagger's security models](/recipes/java/spring/doc/securitycontexttosecurityscheme.md) * [Spring Boot 4.0 Module Starter Relocations](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/modulestarterrelocations) * [Spring Security 7 modularization](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security7/modularizespringsecurity7) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) * [Substitute deprecated Faces Managed Beans](/recipes/oracle/weblogic/rewrite/jakarta/facesmanagedbeansremoved3.md) * [Substitute removed Faces Managed Beans](/recipes/java/migrate/jakarta/facesmanagedbeansremoved.md) * [Tag Enum has been deprecated](/recipes/apache/camel/upgrade/camel41/tracingtag.md) diff --git a/docs/recipes/csharp/reordermethodarguments.md b/docs/recipes/csharp/reordermethodarguments.md index 8e62a8fcee..1606257447 100644 --- a/docs/recipes/csharp/reordermethodarguments.md +++ b/docs/recipes/csharp/reordermethodarguments.md @@ -42,6 +42,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Hamcrest assertions to JUnit Jupiter](/recipes/java/testing/hamcrest/migratehamcresttojunit5.md) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate to ApacheHttpClient 5.x Classes Namespace from 4.x](/recipes/apache/httpclient5/upgradeapachehttpclient_5_classmapping.md) * [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) * [Mockito 3.x migration from 1.x](/recipes/java/testing/mockito/mockito1to3migration.md) diff --git a/docs/recipes/docker/changefrom.md b/docs/recipes/docker/changefrom.md index 1bbdb25f90..6138b65f40 100644 --- a/docs/recipes/docker/changefrom.md +++ b/docs/recipes/docker/changefrom.md @@ -27,7 +27,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac | --- | --- | --- | --- | | `String` | oldImageName | Glob pattern to match image names (without tag/digest). | `ubuntu` | | `String` | oldTag | *Optional*. Only match images with tags matching this glob pattern. If null, matches any tag or no tag. | `20.*` | -| `String` | oldDigest | *Optional*. Only match images with digests matching this glob pattern. If null, matches any digest or no digest. | `sha256:*` | +| `String` | oldDigest | *Optional*. Only match images with digests matching this glob pattern. If null, matches any digest or no digest. If empty (`""`), matches only images that have no digest, which is useful for skipping digest-pinned `FROM`s so deliberate pins are left untouched. | `sha256:*` | | `String` | oldPlatform | *Optional*. Only change images with this platform. If null, matches any platform. | `linux/amd64` | | `String` | newImageName | *Optional*. The new image name. If null, preserves the existing name. | `ubuntu` | | `String` | newTag | *Optional*. The new tag. If null, preserves the existing tag. If empty, removes the tag. | `22.04` | diff --git a/docs/recipes/featureflags/launchdarkly/README.md b/docs/recipes/featureflags/launchdarkly/README.md index ee9e2faf99..dd9015f3e9 100644 --- a/docs/recipes/featureflags/launchdarkly/README.md +++ b/docs/recipes/featureflags/launchdarkly/README.md @@ -14,13 +14,19 @@ _Recipes to perform [LaunchDarkly](https://launchdarkly.com/) migration tasks._ _Recipes that include further recipes, often including the individual recipes below._ +* [Migrate from LaunchDarkly to OpenFeature](./migratelaunchdarklytoopenfeature.md) * [Migrate to LaunchDarkly 6.x](./upgradelaunchdarkly6.md) * [Migrate to LaunchDarkly 7.x](./upgradelaunchdarkly7.md) ## Recipes * [Change the default value for feature key](./changevariationdefault.md) +* [Mark incompatible LaunchDarkly `EvaluationDetail` accessors](./markincompatibleevaluationdetailaccessors.md) * [Migrate `LDUser` to `LDContext`](./migrateusertocontext.md) +* [Migrate LaunchDarkly `LDClient` construction to OpenFeature](./migrateldclienttoopenfeature.md) +* [Migrate LaunchDarkly `LDClient` lifecycle calls to OpenFeature](./migrateldclientlifecycle.md) +* [Migrate LaunchDarkly `LDContext` to OpenFeature `MutableContext`](./migrateldcontexttoevaluationcontext.md) +* [Migrate LaunchDarkly `LDValue` and `jsonValueVariation` to OpenFeature](./migrateldvaluetovalue.md) * [Remove LaunchDarkly's `boolVariation` for feature key](./removeboolvariation.md) * [Remove LaunchDarkly's `doubleVariation` for feature key](./removedoublevariation.md) * [Remove LaunchDarkly's `intVariation` for feature key](./removeintvariation.md) diff --git a/docs/recipes/featureflags/launchdarkly/markincompatibleevaluationdetailaccessors.md b/docs/recipes/featureflags/launchdarkly/markincompatibleevaluationdetailaccessors.md new file mode 100644 index 0000000000..850fc55e32 --- /dev/null +++ b/docs/recipes/featureflags/launchdarkly/markincompatibleevaluationdetailaccessors.md @@ -0,0 +1,124 @@ +--- +title: "Mark incompatible LaunchDarkly `EvaluationDetail` accessors" +sidebar_label: "Mark incompatible LaunchDarkly `EvaluationDetail` accessors" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Mark incompatible LaunchDarkly `EvaluationDetail` accessors + +**org.openrewrite.featureflags.launchdarkly.MarkIncompatibleEvaluationDetailAccessors** + +_OpenFeature's `FlagEvaluationDetails` does not offer a direct replacement for every `EvaluationDetail` accessor. Add a `TODO` comment on `getVariationIndex()`, `isDefaultValue()` and `getReason()` calls so they are migrated by hand, since `getVariationIndex()` and `isDefaultValue()` have no equivalent and `getReason()` returns a `String` rather than an `EvaluationReason`._ + +## Recipe source + +[GitHub: MarkIncompatibleEvaluationDetailAccessors.java](https://github.com/openrewrite/rewrite-feature-flags/blob/main/src/main/java/org/openrewrite/featureflags/launchdarkly/MarkIncompatibleEvaluationDetailAccessors.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-feature-flags/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-feature-flags/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md b/docs/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md new file mode 100644 index 0000000000..4bd4c7fc33 --- /dev/null +++ b/docs/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md @@ -0,0 +1,359 @@ +--- +title: "Migrate from LaunchDarkly to OpenFeature" +sidebar_label: "Migrate from LaunchDarkly to OpenFeature" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate from LaunchDarkly to OpenFeature + +**org.openrewrite.featureflags.launchdarkly.MigrateLaunchDarklyToOpenFeature** + +_Migrate call sites from the LaunchDarkly server SDK to the vendor-neutral [OpenFeature](https://openfeature.dev/) API, backed by the LaunchDarkly OpenFeature provider. Flag evaluations are renamed and their arguments reordered (LaunchDarkly takes the context as the second argument; OpenFeature takes it last), `LDContext` construction becomes `MutableContext`, and `LDClient` becomes `dev.openfeature.sdk.Client`. The one-time provider bootstrap (`OpenFeatureAPI.setProviderAndWait(...)`) is intentionally left for manual configuration._ + +## Recipe source + +[GitHub: launchdarkly-openfeature.yml](https://github.com/openrewrite/rewrite-feature-flags/blob/main/src/main/resources/META-INF/rewrite/launchdarkly-openfeature.yml), +[Issue Tracker](https://github.com/openrewrite/rewrite-feature-flags/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-feature-flags/) + +:::info +This recipe is composed of more than one recipe. If you want to customize the set of recipes this is composed of, you can find and copy the GitHub source for the recipe from the link above. +::: + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +* [Migrate `LDUser` to `LDContext`](../../featureflags/launchdarkly/migrateusertocontext) +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient boolVariation(String, com.launchdarkly.sdk.LDContext, boolean)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient stringVariation(String, com.launchdarkly.sdk.LDContext, String)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient intVariation(String, com.launchdarkly.sdk.LDContext, int)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient doubleVariation(String, com.launchdarkly.sdk.LDContext, double)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient boolVariationDetail(String, com.launchdarkly.sdk.LDContext, boolean)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient stringVariationDetail(String, com.launchdarkly.sdk.LDContext, String)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient intVariationDetail(String, com.launchdarkly.sdk.LDContext, int)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Reorder method arguments](../../java/reordermethodarguments) + * methodPattern: `com.launchdarkly.sdk.server.LDClient doubleVariationDetail(String, com.launchdarkly.sdk.LDContext, double)` + * newParameterNames: `[key, value, context]` + * oldParameterNames: `[key, context, value]` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient boolVariation(..)` + * newMethodName: `getBooleanValue` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient stringVariation(..)` + * newMethodName: `getStringValue` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient intVariation(..)` + * newMethodName: `getIntegerValue` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient doubleVariation(..)` + * newMethodName: `getDoubleValue` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient boolVariationDetail(..)` + * newMethodName: `getBooleanDetails` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient stringVariationDetail(..)` + * newMethodName: `getStringDetails` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient intVariationDetail(..)` + * newMethodName: `getIntegerDetails` +* [Change method name](../../java/changemethodname) + * methodPattern: `com.launchdarkly.sdk.server.LDClient doubleVariationDetail(..)` + * newMethodName: `getDoubleDetails` +* [Migrate LaunchDarkly `LDClient` construction to OpenFeature](../../featureflags/launchdarkly/migrateldclienttoopenfeature) +* [Migrate LaunchDarkly `LDContext` to OpenFeature `MutableContext`](../../featureflags/launchdarkly/migrateldcontexttoevaluationcontext) +* [Migrate LaunchDarkly `LDValue` and `jsonValueVariation` to OpenFeature](../../featureflags/launchdarkly/migrateldvaluetovalue) +* [Migrate LaunchDarkly `LDClient` lifecycle calls to OpenFeature](../../featureflags/launchdarkly/migrateldclientlifecycle) +* [Mark incompatible LaunchDarkly `EvaluationDetail` accessors](../../featureflags/launchdarkly/markincompatibleevaluationdetailaccessors) +* [Change type](../../java/changetype) + * oldFullyQualifiedTypeName: `com.launchdarkly.sdk.server.LDClient` + * newFullyQualifiedTypeName: `dev.openfeature.sdk.Client` +* [Change type](../../java/changetype) + * oldFullyQualifiedTypeName: `com.launchdarkly.sdk.LDContext` + * newFullyQualifiedTypeName: `dev.openfeature.sdk.EvaluationContext` +* [Change type](../../java/changetype) + * oldFullyQualifiedTypeName: `com.launchdarkly.sdk.ContextBuilder` + * newFullyQualifiedTypeName: `dev.openfeature.sdk.MutableContext` +* [Change type](../../java/changetype) + * oldFullyQualifiedTypeName: `com.launchdarkly.sdk.EvaluationDetail` + * newFullyQualifiedTypeName: `dev.openfeature.sdk.FlagEvaluationDetails` +* [Add Gradle or Maven dependency](../../java/dependencies/adddependency) + * groupId: `dev.openfeature` + * artifactId: `sdk` + * version: `latest.release` + * onlyIfUsing: `dev.openfeature.sdk.Client` +* [Add Gradle or Maven dependency](../../java/dependencies/adddependency) + * groupId: `com.launchdarkly` + * artifactId: `launchdarkly-openfeature-serverprovider` + * version: `latest.release` + * onlyIfUsing: `dev.openfeature.sdk.Client` + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.featureflags.launchdarkly.MigrateLaunchDarklyToOpenFeature +displayName: Migrate from LaunchDarkly to OpenFeature +description: | + Migrate call sites from the LaunchDarkly server SDK to the vendor-neutral [OpenFeature](https://openfeature.dev/) API, backed by the LaunchDarkly OpenFeature provider. Flag evaluations are renamed and their arguments reordered (LaunchDarkly takes the context as the second argument; OpenFeature takes it last), `LDContext` construction becomes `MutableContext`, and `LDClient` becomes `dev.openfeature.sdk.Client`. The one-time provider bootstrap (`OpenFeatureAPI.setProviderAndWait(...)`) is intentionally left for manual configuration. +recipeList: + - org.openrewrite.featureflags.launchdarkly.MigrateUserToContext + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient boolVariation(String, com.launchdarkly.sdk.LDContext, boolean) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient stringVariation(String, com.launchdarkly.sdk.LDContext, String) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient intVariation(String, com.launchdarkly.sdk.LDContext, int) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient doubleVariation(String, com.launchdarkly.sdk.LDContext, double) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient boolVariationDetail(String, com.launchdarkly.sdk.LDContext, boolean) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient stringVariationDetail(String, com.launchdarkly.sdk.LDContext, String) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient intVariationDetail(String, com.launchdarkly.sdk.LDContext, int) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ReorderMethodArguments: + methodPattern: com.launchdarkly.sdk.server.LDClient doubleVariationDetail(String, com.launchdarkly.sdk.LDContext, double) + newParameterNames: + - key + - value + - context + oldParameterNames: + - key + - context + - value + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient boolVariation(..) + newMethodName: getBooleanValue + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient stringVariation(..) + newMethodName: getStringValue + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient intVariation(..) + newMethodName: getIntegerValue + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient doubleVariation(..) + newMethodName: getDoubleValue + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient boolVariationDetail(..) + newMethodName: getBooleanDetails + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient stringVariationDetail(..) + newMethodName: getStringDetails + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient intVariationDetail(..) + newMethodName: getIntegerDetails + - org.openrewrite.java.ChangeMethodName: + methodPattern: com.launchdarkly.sdk.server.LDClient doubleVariationDetail(..) + newMethodName: getDoubleDetails + - org.openrewrite.featureflags.launchdarkly.MigrateLDClientToOpenFeature + - org.openrewrite.featureflags.launchdarkly.MigrateLDContextToEvaluationContext + - org.openrewrite.featureflags.launchdarkly.MigrateLDValueToValue + - org.openrewrite.featureflags.launchdarkly.MigrateLDClientLifecycle + - org.openrewrite.featureflags.launchdarkly.MarkIncompatibleEvaluationDetailAccessors + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.launchdarkly.sdk.server.LDClient + newFullyQualifiedTypeName: dev.openfeature.sdk.Client + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.launchdarkly.sdk.LDContext + newFullyQualifiedTypeName: dev.openfeature.sdk.EvaluationContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.launchdarkly.sdk.ContextBuilder + newFullyQualifiedTypeName: dev.openfeature.sdk.MutableContext + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: com.launchdarkly.sdk.EvaluationDetail + newFullyQualifiedTypeName: dev.openfeature.sdk.FlagEvaluationDetails + - org.openrewrite.java.dependencies.AddDependency: + groupId: dev.openfeature + artifactId: sdk + version: latest.release + onlyIfUsing: dev.openfeature.sdk.Client + - org.openrewrite.java.dependencies.AddDependency: + groupId: com.launchdarkly + artifactId: launchdarkly-openfeature-serverprovider + version: latest.release + onlyIfUsing: dev.openfeature.sdk.Client + +``` + + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/featureflags/launchdarkly/migrateldclientlifecycle.md b/docs/recipes/featureflags/launchdarkly/migrateldclientlifecycle.md new file mode 100644 index 0000000000..a14682e05a --- /dev/null +++ b/docs/recipes/featureflags/launchdarkly/migrateldclientlifecycle.md @@ -0,0 +1,124 @@ +--- +title: "Migrate LaunchDarkly `LDClient` lifecycle calls to OpenFeature" +sidebar_label: "Migrate LaunchDarkly `LDClient` lifecycle calls to OpenFeature" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate LaunchDarkly `LDClient` lifecycle calls to OpenFeature + +**org.openrewrite.featureflags.launchdarkly.MigrateLDClientLifecycle** + +_Migrate `LDClient` lifecycle calls: `close()` becomes `OpenFeatureAPI.getInstance().shutdown()` and `isInitialized()` becomes `OpenFeatureAPI.getInstance().getClient().getProviderState() == ProviderState.READY`. OpenFeature manages provider state globally rather than per client instance, so the original receiver is dropped._ + +## Recipe source + +[GitHub: MigrateLDClientLifecycle.java](https://github.com/openrewrite/rewrite-feature-flags/blob/main/src/main/java/org/openrewrite/featureflags/launchdarkly/MigrateLDClientLifecycle.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-feature-flags/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-feature-flags/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/featureflags/launchdarkly/migrateldclienttoopenfeature.md b/docs/recipes/featureflags/launchdarkly/migrateldclienttoopenfeature.md new file mode 100644 index 0000000000..112ce44cc8 --- /dev/null +++ b/docs/recipes/featureflags/launchdarkly/migrateldclienttoopenfeature.md @@ -0,0 +1,124 @@ +--- +title: "Migrate LaunchDarkly `LDClient` construction to OpenFeature" +sidebar_label: "Migrate LaunchDarkly `LDClient` construction to OpenFeature" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate LaunchDarkly `LDClient` construction to OpenFeature + +**org.openrewrite.featureflags.launchdarkly.MigrateLDClientToOpenFeature** + +_Replace `new LDClient(...)` with `OpenFeatureAPI.getInstance().getClient()`. When the client is assigned to a local variable, the one-time provider bootstrap `OpenFeatureAPI.getInstance().setProviderAndWait(new Provider(...))` is generated from the original SDK key and configuration. In other positions (such as fields) the original configuration is preserved in a `TODO` comment instead, as a statement cannot be inserted there._ + +## Recipe source + +[GitHub: MigrateLDClientToOpenFeature.java](https://github.com/openrewrite/rewrite-feature-flags/blob/main/src/main/java/org/openrewrite/featureflags/launchdarkly/MigrateLDClientToOpenFeature.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-feature-flags/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-feature-flags/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/featureflags/launchdarkly/migrateldcontexttoevaluationcontext.md b/docs/recipes/featureflags/launchdarkly/migrateldcontexttoevaluationcontext.md new file mode 100644 index 0000000000..5616741821 --- /dev/null +++ b/docs/recipes/featureflags/launchdarkly/migrateldcontexttoevaluationcontext.md @@ -0,0 +1,124 @@ +--- +title: "Migrate LaunchDarkly `LDContext` to OpenFeature `MutableContext`" +sidebar_label: "Migrate LaunchDarkly `LDContext` to OpenFeature `MutableContext`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate LaunchDarkly `LDContext` to OpenFeature `MutableContext` + +**org.openrewrite.featureflags.launchdarkly.MigrateLDContextToEvaluationContext** + +_Convert `LDContext.create(...)` and `LDContext.builder(...)` construction to OpenFeature's `MutableContext`, mapping `name(...)` and `set(...)` attributes to `add(...)` and dropping the terminal `build()` call. Targeting `kind`, multi-context and private attributes are left untouched for manual review._ + +## Recipe source + +[GitHub: MigrateLDContextToEvaluationContext.java](https://github.com/openrewrite/rewrite-feature-flags/blob/main/src/main/java/org/openrewrite/featureflags/launchdarkly/MigrateLDContextToEvaluationContext.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-feature-flags/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-feature-flags/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/featureflags/launchdarkly/migrateldvaluetovalue.md b/docs/recipes/featureflags/launchdarkly/migrateldvaluetovalue.md new file mode 100644 index 0000000000..0c532efaf2 --- /dev/null +++ b/docs/recipes/featureflags/launchdarkly/migrateldvaluetovalue.md @@ -0,0 +1,124 @@ +--- +title: "Migrate LaunchDarkly `LDValue` and `jsonValueVariation` to OpenFeature" +sidebar_label: "Migrate LaunchDarkly `LDValue` and `jsonValueVariation` to OpenFeature" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate LaunchDarkly `LDValue` and `jsonValueVariation` to OpenFeature + +**org.openrewrite.featureflags.launchdarkly.MigrateLDValueToValue** + +_Migrate `jsonValueVariation`/`jsonValueVariationDetail` to OpenFeature's `getObjectValue`/`getObjectDetails` (reordering the context argument to last) and convert scalar `LDValue.of(...)` and `LDValue.ofNull()` defaults to `dev.openfeature.sdk.Value`. To keep the result compilable, this recipe is skipped for files that use the structured builders `LDValue.buildObject()`, `LDValue.buildArray()`, `LDValue.parse(...)` or `LDValue.of(long)`, which require manual migration to `Structure`/`List`._ + +## Recipe source + +[GitHub: MigrateLDValueToValue.java](https://github.com/openrewrite/rewrite-feature-flags/blob/main/src/main/java/org/openrewrite/featureflags/launchdarkly/MigrateLDValueToValue.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-feature-flags/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-feature-flags/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/featureflags/launchdarkly/migrateusertocontext.md b/docs/recipes/featureflags/launchdarkly/migrateusertocontext.md index 9ce79275b2..c72f917e56 100644 --- a/docs/recipes/featureflags/launchdarkly/migrateusertocontext.md +++ b/docs/recipes/featureflags/launchdarkly/migrateusertocontext.md @@ -26,6 +26,7 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate to LaunchDarkly 6.x](/recipes/featureflags/launchdarkly/upgradelaunchdarkly6.md) ## Example diff --git a/docs/recipes/github/README.md b/docs/recipes/github/README.md index 7c81f88d5c..22d03f82da 100644 --- a/docs/recipes/github/README.md +++ b/docs/recipes/github/README.md @@ -45,6 +45,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Setup Java dependency caching](./setupjavacaching.md) * [Upgrade `actions/setup-java` `java-version`](./setupjavaupgradejavaversion.md) * [Upgrade `actions/setup-node` `node-version`](./setupnodeupgradenodeversion.md) +* [Upgrade official GitHub Actions to their latest versions](./upgradeofficialgithubactions.md) * [Upgrade `slackapi/slack-github-action`](./upgradeslacknotificationversion2.md) * [Use `actions/setup-java` IBM `semeru` distribution](./setupjavaadoptopenj9tosemeru.md) * [Use `actions/setup-java` `temurin` distribution](./setupjavaadoptopenjdktotemurin.md) diff --git a/docs/recipes/github/changeaction.md b/docs/recipes/github/changeaction.md index c2fbccf0e5..9e534c3be0 100644 --- a/docs/recipes/github/changeaction.md +++ b/docs/recipes/github/changeaction.md @@ -26,6 +26,7 @@ This recipe is available under the [Moderne Source Available License](https://do | Type | Name | Description | Example | | --- | --- | --- | --- | | `String` | oldAction | Name of the action to match. | `gradle/wrapper-validation-action` | +| `String` | oldSha | *Optional*. Restricts the change by the existing `uses:` ref. When omitted, the action is changed regardless of how it is pinned (the default; commit SHA pins are rewritten). When set to an empty string, only references that are **not** pinned to a 40-character commit SHA are changed, leaving deliberate SHA pins on the original action untouched. When set to a specific commit SHA, only references pinned to exactly that SHA are changed. | `8f4b7f84864484a7bf31766abe9204da3cbe65b3` | | `String` | newAction | Name of the action to use instead. | `gradle/actions/wrapper-validation` | | `String` | newVersion | New version to use. | `v3` | @@ -44,8 +45,9 @@ This recipe is used as part of the following composite recipes: | Parameter | Value | | --- | --- | |oldAction|`gradle/wrapper-validation-action`| -|newAction|`gradle/actions/wrapper-validation`| -|newVersion|`v3`| +|oldSha|`gradle/actions/wrapper-validation`| +|newAction|`v3`| +|newVersion|| @@ -105,6 +107,7 @@ displayName: Change GitHub Action example recipeList: - org.openrewrite.github.ChangeAction: oldAction: gradle/wrapper-validation-action + oldSha: 8f4b7f84864484a7bf31766abe9204da3cbe65b3 newAction: gradle/actions/wrapper-validation newVersion: v3 ``` @@ -116,7 +119,7 @@ recipeList: artifactId="rewrite-github-actions" versionKey="VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITHUB_ACTIONS" requiresConfiguration - cliOptions={' --recipe-option "oldAction=gradle/wrapper-validation-action" --recipe-option "newAction=gradle/actions/wrapper-validation" --recipe-option "newVersion=v3"'} + cliOptions={' --recipe-option "oldAction=gradle/wrapper-validation-action" --recipe-option "oldSha=8f4b7f84864484a7bf31766abe9204da3cbe65b3" --recipe-option "newAction=gradle/actions/wrapper-validation" --recipe-option "newVersion=v3"'} hasDataTables /> diff --git a/docs/recipes/github/changeactionversion.md b/docs/recipes/github/changeactionversion.md index d9917a17d8..4bb708cfcd 100644 --- a/docs/recipes/github/changeactionversion.md +++ b/docs/recipes/github/changeactionversion.md @@ -27,6 +27,7 @@ This recipe is available under the [Moderne Source Available License](https://do | --- | --- | --- | --- | | `String` | action | Name of the action to update. | `actions/setup-java` | | `String` | version | Version to use. | `v4` | +| `String` | oldSha | *Optional*. Restricts the change by the existing `uses:` ref. When omitted, the version is changed regardless of how the action is pinned (the default; commit SHA pins are rewritten). When set to an empty string, only references that are **not** pinned to a 40-character commit SHA are changed, preserving deliberate SHA pins. When set to a specific commit SHA, only references pinned to exactly that SHA are changed. | `8f4b7f84864484a7bf31766abe9204da3cbe65b3` | ## Used by @@ -42,6 +43,7 @@ This recipe is used as part of the following composite recipes: | --- | --- | |action|`actions/setup-java`| |version|`v4`| +|oldSha|| @@ -98,6 +100,7 @@ recipeList: - org.openrewrite.github.ChangeActionVersion: action: actions/setup-java version: v4 + oldSha: 8f4b7f84864484a7bf31766abe9204da3cbe65b3 ``` diff --git a/docs/recipes/github/githubactionsbestpractices.md b/docs/recipes/github/githubactionsbestpractices.md index becb0775d1..fb6e57cdbf 100644 --- a/docs/recipes/github/githubactionsbestpractices.md +++ b/docs/recipes/github/githubactionsbestpractices.md @@ -11,7 +11,7 @@ import RunRecipe from '@site/src/components/RunRecipe'; **org.openrewrite.github.GitHubActionsBestPractices** -_Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, and preferring block-style job dependencies._ +_Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, preferring block-style job dependencies, and upgrading official actions to their latest versions._ ### Tags @@ -40,6 +40,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Use `actions/setup-java` `temurin` distribution as they are cached in hosted runners](../github/prefertemurindistributions) * [Remove unused workflow dispatch inputs](../github/removeunusedworkflowdispatchinputs) * [Setup Java dependency caching](../github/setupjavacaching) +* [Upgrade official GitHub Actions to their latest versions](../github/upgradeofficialgithubactions) @@ -51,7 +52,7 @@ type: specs.openrewrite.org/v1beta/recipe name: org.openrewrite.github.GitHubActionsBestPractices displayName: GitHub Actions best practices description: | - Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, and preferring block-style job dependencies. + Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, preferring block-style job dependencies, and upgrading official actions to their latest versions. tags: - github - actions @@ -61,6 +62,7 @@ recipeList: - org.openrewrite.github.PreferTemurinDistributions - org.openrewrite.github.RemoveUnusedWorkflowDispatchInputs - org.openrewrite.github.SetupJavaCaching + - org.openrewrite.github.UpgradeOfficialGitHubActions ``` diff --git a/docs/recipes/github/upgradeofficialgithubactions.md b/docs/recipes/github/upgradeofficialgithubactions.md new file mode 100644 index 0000000000..c927f950c9 --- /dev/null +++ b/docs/recipes/github/upgradeofficialgithubactions.md @@ -0,0 +1,129 @@ +--- +title: "Upgrade official GitHub Actions to their latest versions" +sidebar_label: "Upgrade official GitHub Actions to their latest versions" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Upgrade official GitHub Actions to their latest versions + +**org.openrewrite.github.UpgradeOfficialGitHubActions** + +_Upgrades actions from the official `actions` and `github` organizations to the newest known version, working entirely offline. Each reference is upgraded while preserving its existing precision: a major version (`v4`) moves to the newest major, a full version (`v4.1.2`) to the newest full version, and a commit SHA to the latest known commit. Actions that are not official, not known, or already up to date are left untouched._ + +### Tags + +* [github](/reference/recipes-by-tag#github) +* [actions](/reference/recipes-by-tag#actions) + +## Recipe source + +[GitHub: UpgradeOfficialGitHubActions.java](https://github.com/openrewrite/rewrite-github-actions/blob/main/src/main/java/org/openrewrite/github/UpgradeOfficialGitHubActions.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-github-actions/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-github-actions/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [GitHub Actions best practices](/recipes/github/githubactionsbestpractices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/gradle/plugins/upgradepluginversion.md b/docs/recipes/gradle/plugins/upgradepluginversion.md index f55f53fad5..4a47391b2d 100644 --- a/docs/recipes/gradle/plugins/upgradepluginversion.md +++ b/docs/recipes/gradle/plugins/upgradepluginversion.md @@ -55,6 +55,7 @@ This recipe is used as part of the following composite recipes: * [Migrate to Spring Framework 6.0 (Community Edition)](/recipes/java/spring/framework/upgradespringframework_6_0-community-edition.md) * [Update Micronaut Gradle build plugins to 5.x](/recipes/java/micronaut/updatebuildplugins5.md) * [Upgrade Kotlin Gradle plugins to 2.x](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/kotlin/migrate/upgradekotlingradleplugins) +* [Upgrade Kotlin to 2.3 for Java 25 compatibility](/recipes/java/migrate/upgradekotlinforjava25.md) * [Upgrade to Spring Boot 2.5](/recipes/java/spring/boot2/upgradespringboot_2_5.md) ## Example diff --git a/docs/recipes/java/addcommenttoimport.md b/docs/recipes/java/addcommenttoimport.md index 36c2501174..be9584854a 100644 --- a/docs/recipes/java/addcommenttoimport.md +++ b/docs/recipes/java/addcommenttoimport.md @@ -33,6 +33,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac This recipe is used as part of the following composite recipes: +* [Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) * [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate to Apache HttpCore Nio Classes to Apache HttpCore 5.x](/recipes/apache/httpclient5/upgradeapachehttpcore_5_nioclassmapping.md) * [Migrate to ApacheHttpClient 5.x Classes Namespace from 4.x](/recipes/apache/httpclient5/upgradeapachehttpclient_5_classmapping.md) diff --git a/docs/recipes/java/addcommenttomethod.md b/docs/recipes/java/addcommenttomethod.md index ba8641d442..2ff7e6a98c 100644 --- a/docs/recipes/java/addcommenttomethod.md +++ b/docs/recipes/java/addcommenttomethod.md @@ -35,6 +35,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac This recipe is used as part of the following composite recipes: * [Comment deprecated methods in Spring 3.4](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot3/commentdeprecations) +* [Flag deprecated `ChunkListener` callbacks for manual migration to `ChunkListener<I, O>`](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/batch/flagchunklistenerformanualmigration) ## Example diff --git a/docs/recipes/java/changemethodname.md b/docs/recipes/java/changemethodname.md index 23719fa793..2fa0d24a7b 100644 --- a/docs/recipes/java/changemethodname.md +++ b/docs/recipes/java/changemethodname.md @@ -81,6 +81,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) diff --git a/docs/recipes/java/changetype.md b/docs/recipes/java/changetype.md index 32c4a3d92c..5a46fe1a91 100644 --- a/docs/recipes/java/changetype.md +++ b/docs/recipes/java/changetype.md @@ -118,11 +118,13 @@ This recipe is used as part of the following composite recipes: * [Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`](/recipes/java/migrate/jakarta/javaxxmlbindmigrationtojakartaxmlbind.md) * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) * [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate from JMockit to Mockito](/recipes/java/testing/jmockit/jmockittomockito.md) * [Migrate from Jakarta annotation API to JSpecify](/recipes/java/jspecify/migratefromjakartaannotationapi.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) * [Migrate from JetBrains annotations to JSpecify](/recipes/java/jspecify/migratefromjetbrainsannotations.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micrometer annotations to JSpecify](/recipes/java/jspecify/migratefrommicrometerannotations.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from Micronaut 4.x to 5.x](/recipes/java/micronaut/micronaut4to5migration.md) @@ -141,6 +143,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from `oracle-xe` to `oracle-free`](/recipes/java/testing/testcontainers/migratetooraclefree.md) * [Migrate from javax annotation API to JSpecify](/recipes/java/jspecify/migratefromjavaxannotationapi.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Migrate moved types between Camel 3.x and Camel 4.x](/recipes/apache/camel/upgrade/camel40/changetypes.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) * [Migrate to Apache HttpCore Nio Classes to Apache HttpCore 5.x](/recipes/apache/httpclient5/upgradeapachehttpcore_5_nioclassmapping.md) @@ -212,7 +215,6 @@ This recipe is used as part of the following composite recipes: * [Replace elements of SpringFox's security with Swagger's security models](/recipes/java/spring/doc/securitycontexttosecurityscheme.md) * [Spring Boot 4.0 Module Starter Relocations](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/modulestarterrelocations) * [Spring Security 7 modularization](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security7/modularizespringsecurity7) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) * [Substitute deprecated Faces Managed Beans](/recipes/oracle/weblogic/rewrite/jakarta/facesmanagedbeansremoved3.md) * [Substitute removed Faces Managed Beans](/recipes/java/migrate/jakarta/facesmanagedbeansremoved.md) * [Tag Enum has been deprecated](/recipes/apache/camel/upgrade/camel41/tracingtag.md) diff --git a/docs/recipes/java/dependencies/adddependency.md b/docs/recipes/java/dependencies/adddependency.md index 46b091ba6a..6373e338db 100644 --- a/docs/recipes/java/dependencies/adddependency.md +++ b/docs/recipes/java/dependencies/adddependency.md @@ -135,10 +135,12 @@ This recipe is used as part of the following composite recipes: * [Migrate deprecated `javax.xml.ws` packages to `jakarta.xml.ws`](/recipes/java/migrate/jakarta/javaxxmlwsmigrationtojakartaxmlws.md) * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from Elasticsearch 8 to 9 (legacy Apache HttpClient 4.x transport)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9legacytransport) * [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate from JMockit to Mockito](/recipes/java/testing/jmockit/jmockittomockito.md) * [Migrate from Jakarta annotation API to JSpecify](/recipes/java/jspecify/migratefromjakartaannotationapi.md) * [Migrate from JetBrains annotations to JSpecify](/recipes/java/jspecify/migratefromjetbrainsannotations.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micrometer annotations to JSpecify](/recipes/java/jspecify/migratefrommicrometerannotations.md) * [Migrate from Micronaut 4.x to 5.x](/recipes/java/micronaut/micronaut4to5migration.md) * [Migrate from Micronaut Framework annotations to JSpecify](/recipes/java/jspecify/migratefrommicronautannotations.md) @@ -192,8 +194,11 @@ This recipe is used as part of the following composite recipes: * [Replace Spring Kafka with Quarkus Kafka Client](/recipes/quarkus/spring/springkafkatoquarkusclassic.md) * [Replace Spring Kafka with Quarkus Messaging Kafka](/recipes/quarkus/spring/springkafkatoquarkusreactive.md) * [Replace SpringFox Dependencies](/recipes/java/springdoc/replacespringfoxdependencies.md) +* [Replace `jakarta.jws-api` with `jakarta.xml.ws-api`](/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws.md) * [Replace `micrometer-spring-legacy` with `spring-boot-starter-actuator`](/recipes/java/spring/boot2/maybeaddspringbootstarteractuator.md) * [Retain `javax.xml.bind:jaxb-api` when `jackson-module-jaxb-annotations` is present](/recipes/java/migrate/jakarta/retainjaxbapiforjackson.md) +* [Split the Spring gRPC test starter into server-test and client-test starters](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpccombinedteststarter) +* [Split the combined Spring gRPC starter into server and client starters](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpccombinedstarter) * [Spring Security 7 modularization](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security7/modularizespringsecurity7) * [Update Tapestry dependencies](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/tapestry/updatetapestrydependencies) * [Update the Micronaut Retry support](/recipes/java/micronaut/addmicronautretrydependencyifneeded.md) diff --git a/docs/recipes/java/dependencies/changedependency.md b/docs/recipes/java/dependencies/changedependency.md index cbd17a4b63..3177f7518e 100644 --- a/docs/recipes/java/dependencies/changedependency.md +++ b/docs/recipes/java/dependencies/changedependency.md @@ -140,6 +140,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from Spring Boot 1.x to 2.0](/recipes/java/spring/boot2/upgradespringboot_2_0.md) * [Migrate from Swagger to OpenAPI](/recipes/openapi/swagger/swaggertoopenapi.md) * [Migrate from `oracle-xe` to `oracle-free`](/recipes/java/testing/testcontainers/migratetooraclefree.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Migrate javax.javaee-web-api to jakarta.jakartaee-web-api (Jakarta EE 9)](/recipes/oracle/weblogic/rewrite/jakarta/migratejavaxwebtojakartaweb9.md) * [Migrate javax.mvc to 2.0 (Jakarta EE 9)](/recipes/oracle/weblogic/rewrite/jakarta/migratejavaxmvctojakartaee9.md) * [Migrate rider-spring (JUnit4) to rider-junit5 (JUnit5)](/recipes/java/testing/dbrider/migratedbriderspringtodbriderjunit5.md) @@ -179,6 +180,9 @@ This recipe is used as part of the following composite recipes: * [Replace Derby driver with Quarkus JDBC Derby](/recipes/quarkus/spring/derbydrivertoquarkus.md) * [Replace H2 driver with Quarkus JDBC H2](/recipes/quarkus/spring/h2drivertoquarkus.md) * [Replace Spring Framework dependencies with Spring Boot starters](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot/replacespringframeworkdepswithbootstarters) +* [Replace `jakarta.jws-api` with `jakarta.xml.ws-api`](/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws.md) +* [Split the Spring gRPC test starter into server-test and client-test starters](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpccombinedteststarter) +* [Split the combined Spring gRPC starter into server and client starters](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpccombinedstarter) * [Update Apache Commons Email to Email2 for Jakarta](/recipes/java/migrate/jakarta/updateapachecommonsemaildependencies.md) * [Update Apache Commons FileUpload2 package for EE10](/recipes/java/migrate/jakarta/updatefileupload2dependencies.md) * [Update Apache Shiro Dependencies to 2.0.x](/recipes/java/migrate/jakarta/updateapacheshirodependencies.md) diff --git a/docs/recipes/java/dependencies/dependencylist.md b/docs/recipes/java/dependencies/dependencylist.md index 358b4cd408..ff1f2e7d5e 100644 --- a/docs/recipes/java/dependencies/dependencylist.md +++ b/docs/recipes/java/dependencies/dependencylist.md @@ -35,7 +35,6 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac This recipe is used as part of the following composite recipes: * [Update Prethink context (no AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextnoaistarter) -* [Update Prethink context (with AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextstarter) ## Usage diff --git a/docs/recipes/java/dependencies/removedependency.md b/docs/recipes/java/dependencies/removedependency.md index 0f7e6b7564..c59f7ff8fc 100644 --- a/docs/recipes/java/dependencies/removedependency.md +++ b/docs/recipes/java/dependencies/removedependency.md @@ -60,6 +60,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Spring Retry to Spring Resilience](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringretry) * [Migrate Spring WS Axiom to SAAJ](/recipes/java/spring/ws/migrateaxiomtosaaj.md) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate from JMockit to Mockito](/recipes/java/testing/jmockit/jmockittomockito.md) * [Migrate from Spring Cloud Sleuth to OpenTelemetry](/recipes/java/spring/opentelemetry/migratesleuthtoopentelemetry.md) * [Migrate from Zipkin to OpenTelemetry OTLP](/recipes/java/spring/opentelemetry/migratefromzipkintoopentelemetry.md) diff --git a/docs/recipes/java/dependencies/upgradedependencyversion.md b/docs/recipes/java/dependencies/upgradedependencyversion.md index 5c3543ca7a..552f53c080 100644 --- a/docs/recipes/java/dependencies/upgradedependencyversion.md +++ b/docs/recipes/java/dependencies/upgradedependencyversion.md @@ -92,7 +92,7 @@ This recipe is used as part of the following composite recipes: * [Migrate deprecated `javax.ws` packages to `jakarta.ws`](/recipes/java/migrate/jakarta/javaxwstojakartaws.md) * [Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`](/recipes/java/migrate/jakarta/javaxxmlbindmigrationtojakartaxmlbind.md) * [Migrate deprecated `javax.xml.ws` packages to `jakarta.xml.ws`](/recipes/java/migrate/jakarta/javaxxmlwsmigrationtojakartaxmlws.md) -* [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) +* [Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) * [Migrate from Spring Boot 1.x to 2.0](/recipes/java/spring/boot2/upgradespringboot_2_0.md) * [Migrate to DataNucleus 4.0](/recipes/java/migrate/datanucleus/upgradedatanucleus_4_0.md) * [Migrate to DataNucleus 5.0](/recipes/java/migrate/datanucleus/upgradedatanucleus_5_0.md) @@ -215,6 +215,7 @@ This recipe is used as part of the following composite recipes: * [Upgrade Hibernate to 6.6](/recipes/oracle/weblogic/rewrite/hibernate/upgradehibernateto66.md) * [Upgrade JaCoCo](/recipes/java/migrate/jacoco/upgradejacoco.md) * [Upgrade Jackson 2.x dependencies to 3.x](/recipes/java/jackson/upgradejackson_2_3_dependencies.md) +* [Upgrade Kotlin to 2.3 for Java 25 compatibility](/recipes/java/migrate/upgradekotlinforjava25.md) * [Upgrade Log4j 2.x dependency version](/recipes/java/logging/log4j/upgradelog4j2dependencyversion.md) * [Upgrade MyBatis to Spring Boot 2.0](/recipes/java/spring/boot3/upgrademybatistospringboot_2_0.md) * [Upgrade MyBatis to Spring Boot 2.1](/recipes/java/spring/boot3/upgrademybatistospringboot_2_1.md) diff --git a/docs/recipes/java/jackson/README.md b/docs/recipes/java/jackson/README.md index a0daffdd84..545724ffc6 100644 --- a/docs/recipes/java/jackson/README.md +++ b/docs/recipes/java/jackson/README.md @@ -37,6 +37,8 @@ _Recipes that include further recipes, often including the individual recipes be * [Add `@JsonCreator` to non-public constructors](./addjsoncreatortoprivateconstructors.md) * [Add comment to SimpleModule method calls on modules that no longer extend SimpleModule](./commentoutsimplemodulemethodcalls.md) * [Migrate `JSONNode` field iterator for Jackson 3](./jackson3jsonnodefielditerators.md) +* [Migrate `ObjectMapper.readValue(URL, ...)` to use `openStream()`](./readvalueurltoopenstream.md) +* [Migrate deprecated `@JsonSerialize(include = ...)` to `@JsonInclude`](./jsonserializeincludetojsoninclude.md) * [Migrate factory setter calls to builder pattern](./migratefactorysetterstobuilder.md) * [Migrate mapper setter calls to builder pattern](./migratemappersetterstobuilder.md) * [Remove redundant `@JsonProperty` argument](./removeredundantjsonpropertyvalue.md) diff --git a/docs/recipes/java/jackson/codehaus/removedoublyannotatedcodehausannotations.md b/docs/recipes/java/jackson/codehaus/removedoublyannotatedcodehausannotations.md index 90ca6536d1..1e052948cb 100644 --- a/docs/recipes/java/jackson/codehaus/removedoublyannotatedcodehausannotations.md +++ b/docs/recipes/java/jackson/codehaus/removedoublyannotatedcodehausannotations.md @@ -26,7 +26,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac This recipe is used as part of the following composite recipes: -* [Migrate from Jackson Codehaus (legacy) to Jackson FasterXML](/recipes/java/jackson/codehaustofasterxml.md) +* [Migrate classes from Jackson Codehaus (legacy) to Jackson FasterXML](/recipes/java/jackson/codehausclassestofasterxml.md) ## Example diff --git a/docs/recipes/java/jackson/codehausclassestofasterxml.md b/docs/recipes/java/jackson/codehausclassestofasterxml.md index 4465f3fba5..4c2921bf3d 100644 --- a/docs/recipes/java/jackson/codehausclassestofasterxml.md +++ b/docs/recipes/java/jackson/codehausclassestofasterxml.md @@ -36,6 +36,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * [Migrate to Jackson `@JsonInclude`](../../java/jackson/codehaus/jsonincludeannotation) * [Migrate serialization annotation processor](../../java/jackson/codehaus/replaceserializationconfigannotationintrospector) +* [Remove Codehaus Jackson annotations if doubly annotated](../../java/jackson/codehaus/removedoublyannotatedcodehausannotations) * [Change type](../../java/changetype) * oldFullyQualifiedTypeName: `org.codehaus.jackson.map.JsonSerializer` * newFullyQualifiedTypeName: `com.fasterxml.jackson.databind.JsonSerializer` @@ -81,7 +82,6 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * oldPackageName: `org.codehaus.jackson.map.ser` * newPackageName: `com.fasterxml.jackson.databind.ser` * recursive: `true` -* [Add imports for fully qualified references to types](../../java/shortenfullyqualifiedtypereferences) @@ -99,6 +99,7 @@ tags: recipeList: - org.openrewrite.java.jackson.codehaus.JsonIncludeAnnotation - org.openrewrite.java.jackson.codehaus.ReplaceSerializationConfigAnnotationIntrospector + - org.openrewrite.java.jackson.codehaus.RemoveDoublyAnnotatedCodehausAnnotations - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: org.codehaus.jackson.map.JsonSerializer newFullyQualifiedTypeName: com.fasterxml.jackson.databind.JsonSerializer @@ -144,7 +145,6 @@ recipeList: oldPackageName: org.codehaus.jackson.map.ser newPackageName: com.fasterxml.jackson.databind.ser recursive: true - - org.openrewrite.java.ShortenFullyQualifiedTypeReferences ``` diff --git a/docs/recipes/java/jackson/codehaustofasterxml.md b/docs/recipes/java/jackson/codehaustofasterxml.md index 6090d79359..fab48ae3fa 100644 --- a/docs/recipes/java/jackson/codehaustofasterxml.md +++ b/docs/recipes/java/jackson/codehaustofasterxml.md @@ -34,7 +34,6 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac -* [Remove Codehaus Jackson annotations if doubly annotated](../../java/jackson/codehaus/removedoublyannotatedcodehausannotations) * [Transfer @JsonSerialize arguments from Codehaus to FasterXML](../../java/jackson/codehaus/transferjsonserializeargumentsfromcodehaustofasterxml) * [Migrate classes from Jackson Codehaus (legacy) to Jackson FasterXML](../../java/jackson/codehausclassestofasterxml) * [Migrate dependencies from Jackson Codehaus (legacy) to FasterXML](../../java/jackson/codehaus/codehausdependencytofasterxml) @@ -54,7 +53,6 @@ description: | tags: - jackson-2 recipeList: - - org.openrewrite.java.jackson.codehaus.RemoveDoublyAnnotatedCodehausAnnotations - org.openrewrite.java.jackson.codehaus.TransferJsonSerializeArgumentsFromCodehausToFasterXML - org.openrewrite.java.jackson.CodehausClassesToFasterXML - org.openrewrite.java.jackson.codehaus.CodehausDependencyToFasterXML: @@ -63,6 +61,13 @@ recipeList: ``` + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) + ## Examples ##### Example 1 `CodehausToFasterXMLTest#onlyJsonSerializeInclusion` diff --git a/docs/recipes/java/jackson/jsonserializeincludetojsoninclude.md b/docs/recipes/java/jackson/jsonserializeincludetojsoninclude.md new file mode 100644 index 0000000000..4b9887b9a8 --- /dev/null +++ b/docs/recipes/java/jackson/jsonserializeincludetojsoninclude.md @@ -0,0 +1,124 @@ +--- +title: "Migrate deprecated `@JsonSerialize(include = ...)` to `@JsonInclude`" +sidebar_label: "Migrate deprecated `@JsonSerialize(include = ...)` to `@JsonInclude`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate deprecated `@JsonSerialize(include = ...)` to `@JsonInclude` + +**org.openrewrite.java.jackson.JsonSerializeIncludeToJsonInclude** + +_Move the deprecated `include` attribute of FasterXML's `@JsonSerialize` to a separate `@JsonInclude` annotation. The `include` attribute was deprecated in Jackson 2.x and removed in Jackson 3.x; running this recipe before the Jackson 2 → 3 package rename produces a correct `tools.jackson.annotation.JsonInclude` on the Jackson 3 side._ + +## Recipe source + +[GitHub: JsonSerializeIncludeToJsonInclude.java](https://github.com/openrewrite/rewrite-jackson/blob/main/src/main/java/org/openrewrite/java/jackson/JsonSerializeIncludeToJsonInclude.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-jackson/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-jackson/) + +This recipe is available under the [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/jackson/readvalueurltoopenstream.md b/docs/recipes/java/jackson/readvalueurltoopenstream.md new file mode 100644 index 0000000000..d3e2adc1aa --- /dev/null +++ b/docs/recipes/java/jackson/readvalueurltoopenstream.md @@ -0,0 +1,124 @@ +--- +title: "Migrate `ObjectMapper.readValue(URL, ...)` to use `openStream()`" +sidebar_label: "Migrate `ObjectMapper.readValue(URL, ...)` to use `openStream()`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Migrate `ObjectMapper.readValue(URL, ...)` to use `openStream()` + +**org.openrewrite.java.jackson.ReadValueUrlToOpenStream** + +_Jackson 3.x removed every `URL`-accepting `readValue` overload from `ObjectMapper`. Rewrite call sites to feed `URL.openStream()` into the surviving `readValue(InputStream, ...)` overload, which is what `readValue(URL, ...)` did internally in Jackson 2.x. The caller's checked-exception story is unchanged: `URL.openStream()` declares `IOException`, the same checked exception the removed `readValue(URL, ...)` declared._ + +## Recipe source + +[GitHub: ReadValueUrlToOpenStream.java](https://github.com/openrewrite/rewrite-jackson/blob/main/src/main/java/org/openrewrite/java/jackson/ReadValueUrlToOpenStream.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-jackson/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-jackson/) + +This recipe is available under the [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/jackson/upgradejackson_2_3.md b/docs/recipes/java/jackson/upgradejackson_2_3.md index 0be3071f22..3ef831dd06 100644 --- a/docs/recipes/java/jackson/upgradejackson_2_3.md +++ b/docs/recipes/java/jackson/upgradejackson_2_3.md @@ -37,6 +37,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac +* [Migrate from Jackson Codehaus (legacy) to Jackson FasterXML](../../java/jackson/codehaustofasterxml) * [Replace `IOException` with `JacksonException` in catch clauses](../../java/jackson/ioexceptiontojacksonexception) * [Remove elements from a method declaration `throws` clause](../../java/removemethodthrows) * methodPattern: `com.fasterxml.jackson.databind.JsonSerializer serialize(..)` @@ -46,7 +47,6 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * exceptionTypePattern: `java.io.IOException` * [Replace `null` type in `StdDeserializer` constructor with actual type](../../java/jackson/stddeserializernullconstructor) * [Update `lombok.config` for Jackson 3 compatibility](../../java/jackson/lombokjacksonizedconfig) -* [Update configuration of serialization inclusion in `ObjectMapper` for Jackson 3](../../java/jackson/updateserializationinclusionconfiguration) * [Use format alignment `ObjectMappers`](../../java/jackson/useformatalignedobjectmappers) * [Modernize legacy `jackson-core` feature constants](../../java/jackson/upgradejackson_2_3_modernizejacksoncorefeatures) * [Remove redundant Jackson 3 feature flag configurations](../../java/jackson/upgradejackson_2_3_removeredundantfeatureflags) @@ -94,6 +94,8 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * methodPattern: `com.fasterxml.jackson.databind.ObjectMapper deserializationConfig()` * [Update Jackson 2.x types to 3.x](../../java/jackson/upgradejackson_2_3_typechanges) * [Use `JsonFactory.builder()` over `new JsonFactoryBuilder()`](../../java/jackson/usejsonfactorystaticbuilder) +* [Migrate deprecated `@JsonSerialize(include = ...)` to `@JsonInclude`](../../java/jackson/jsonserializeincludetojsoninclude) +* [Migrate `ObjectMapper.readValue(URL, ...)` to use `openStream()`](../../java/jackson/readvalueurltoopenstream) * [Update Jackson package names from 2.x to 3.x](../../java/jackson/upgradejackson_2_3_packagechanges) * [Simplify catch clauses for Jackson exceptions](../../java/jackson/simplifyjacksonexceptioncatch) @@ -111,6 +113,7 @@ description: | tags: - jackson-3 recipeList: + - org.openrewrite.java.jackson.CodehausToFasterXML - org.openrewrite.java.jackson.IOExceptionToJacksonException - org.openrewrite.java.RemoveMethodThrows: methodPattern: com.fasterxml.jackson.databind.JsonSerializer serialize(..) @@ -120,7 +123,6 @@ recipeList: exceptionTypePattern: java.io.IOException - org.openrewrite.java.jackson.StdDeserializerNullConstructor - org.openrewrite.java.jackson.LombokJacksonizedConfig - - org.openrewrite.java.jackson.UpdateSerializationInclusionConfiguration - org.openrewrite.java.jackson.UseFormatAlignedObjectMappers - org.openrewrite.java.jackson.UpgradeJackson_2_3_ModernizeJacksonCoreFeatures - org.openrewrite.java.jackson.UpgradeJackson_2_3_RemoveRedundantFeatureFlags @@ -182,6 +184,8 @@ recipeList: methodPattern: com.fasterxml.jackson.databind.ObjectMapper deserializationConfig() - org.openrewrite.java.jackson.UpgradeJackson_2_3_TypeChanges - org.openrewrite.java.jackson.UseJsonFactoryStaticBuilder + - org.openrewrite.java.jackson.JsonSerializeIncludeToJsonInclude + - org.openrewrite.java.jackson.ReadValueUrlToOpenStream - org.openrewrite.java.jackson.UpgradeJackson_2_3_PackageChanges - org.openrewrite.java.jackson.SimplifyJacksonExceptionCatch diff --git a/docs/recipes/java/jackson/upgradejackson_2_3_jsonnodemethodrenames.md b/docs/recipes/java/jackson/upgradejackson_2_3_jsonnodemethodrenames.md index dea097475a..9fb1872cec 100644 --- a/docs/recipes/java/jackson/upgradejackson_2_3_jsonnodemethodrenames.md +++ b/docs/recipes/java/jackson/upgradejackson_2_3_jsonnodemethodrenames.md @@ -52,7 +52,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac * matchOverrides: `true` * [Change method name](../../java/changemethodname) * methodPattern: `com.fasterxml.jackson.databind.JsonNode textValue()` - * newMethodName: `asString` + * newMethodName: `stringValue` * matchOverrides: `true` * [Change method name](../../java/changemethodname) * methodPattern: `com.fasterxml.jackson.databind.JsonNode with(..)` @@ -92,7 +92,7 @@ recipeList: matchOverrides: true - org.openrewrite.java.ChangeMethodName: methodPattern: com.fasterxml.jackson.databind.JsonNode textValue() - newMethodName: asString + newMethodName: stringValue matchOverrides: true - org.openrewrite.java.ChangeMethodName: methodPattern: com.fasterxml.jackson.databind.JsonNode with(..) diff --git a/docs/recipes/java/jspecify/migratetojspecify.md b/docs/recipes/java/jspecify/migratetojspecify.md index ddea0f1a49..dd0b6d1e4c 100644 --- a/docs/recipes/java/jspecify/migratetojspecify.md +++ b/docs/recipes/java/jspecify/migratetojspecify.md @@ -80,7 +80,6 @@ This recipe is used as part of the following composite recipes: * [Migrate from Micronaut 4.x to 5.x](/recipes/java/micronaut/micronaut4to5migration.md) * [Migrate to Spring Boot 4.0 (Moderne Edition)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradespringboot_4_0-moderne-edition) * [Recipe nullability best practices](/recipes/java/recipes/recipenullabilitybestpractices.md) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) ## Usage diff --git a/docs/recipes/java/migrate/README.md b/docs/recipes/java/migrate/README.md index a0bc151ec4..2f14a6241b 100644 --- a/docs/recipes/java/migrate/README.md +++ b/docs/recipes/java/migrate/README.md @@ -68,6 +68,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Replace `finalize` method in `java.util.zip.ZipFile`, `java.util.zip.Inflater` and `java.util.zip.Deflater`](./removedzipfinalizemethods.md) * [Set visibility of `premain` and `agentmain` methods to `public`](./jre17agentmainpremainpublic.md) * [Upgrade Java version](./upgradejavaversion.md) +* [Upgrade Kotlin to 2.3 for Java 25 compatibility](./upgradekotlinforjava25.md) * [Upgrade plugins to Java 11 compatible versions](./upgradepluginsforjava11.md) * [Upgrade plugins to Java 17 compatible versions](./upgradepluginsforjava17.md) * [Upgrade plugins to Java 21 compatible versions](./upgradepluginsforjava21.md) @@ -89,7 +90,9 @@ _Recipes that include further recipes, often including the individual recipes be * [Change `javax.tools.ToolProvider` methods calls to static](./removedtoolproviderconstructor.md) * [Change method invocation return type](./changemethodinvocationreturntype.md) * [Change `net.wasdev.maven.parent:java8-parent` to `:parent`](./wasdevmvnchangeparentartifactid.md) +* [Comment Kotlin modules capped at Java 24](./commentkotlinmodulescappedatjava24.md) * [Disable the persistence unit second-level cache](./jpacacheproperties.md) +* [Explain why the Java version was capped at 24 for Kotlin modules](./commentjava24kotlincap.md) * [Force indentation to either tabs or spaces](./usetabsorspaces.md) * [MBean and MXBean interfaces must be public](./mxbeanrule.md) * [Migrate GraalVM resource-config.json to glob patterns](./migrategraalvmresourceconfig.md) @@ -120,7 +123,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Upgrade build to Java 11](./upgradebuildtojava11.md) * [Upgrade build to Java 17](./upgradebuildtojava17.md) * [Upgrade build to Java 21](./upgradebuildtojava21.md) -* [Upgrade build to Java 24 for Kotlin pre-2.3](./upgradebuildtojava24.md) +* [Upgrade build to Java 24 for Kotlin 1.x](./upgradebuildtojava24forkotlin1x.md) * [Upgrade build to Java 25 (non-Kotlin)](./upgradebuildtojava25.md) * [Upgrade build to Java 25 for Kotlin 2.3+](./upgradebuildtojava25forkotlin.md) * [Use `SunJSSE` instead of `com.sun.net.ssl.internal.ssl.Provider`](./removedlegacysunjsseprovidername.md) diff --git a/docs/recipes/java/migrate/addsurefirefailsafeargline.md b/docs/recipes/java/migrate/addsurefirefailsafeargline.md index 8fbc816ec3..722fb0f0cb 100644 --- a/docs/recipes/java/migrate/addsurefirefailsafeargline.md +++ b/docs/recipes/java/migrate/addsurefirefailsafeargline.md @@ -11,7 +11,7 @@ import RunRecipe from '@site/src/components/RunRecipe'; **org.openrewrite.java.migrate.AddSurefireFailsafeArgLine** -_Adds the specified arguments to the `argLine` configuration of the Maven Surefire and Failsafe plugins, merging with any existing argLine value without duplicating arguments._ +_Adds the specified arguments to the `argLine` configuration of the Maven Surefire and Failsafe plugins, merging with any existing argLine value without duplicating arguments. The `@{argLine}` [late property reference](https://maven.apache.org/surefire/maven-surefire-plugin/faq.html) is prepended so that an agent injected by another plugin during the build, such as the JaCoCo coverage agent from `jacoco-maven-plugin:prepare-agent`, is preserved rather than overwritten. It is not added when the existing `argLine` already references the `argLine` property._ ## Recipe source @@ -75,7 +75,7 @@ project maven-surefire-plugin 3.5.2 - --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED + @{argLine} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED @@ -93,7 +93,7 @@ project maven-surefire-plugin 3.5.2 + -+ --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED ++ @{argLine} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED + ``` diff --git a/docs/recipes/java/migrate/commentjava24kotlincap.md b/docs/recipes/java/migrate/commentjava24kotlincap.md new file mode 100644 index 0000000000..868b9ec848 --- /dev/null +++ b/docs/recipes/java/migrate/commentjava24kotlincap.md @@ -0,0 +1,124 @@ +--- +title: "Explain why the Java version was capped at 24 for Kotlin modules" +sidebar_label: "Explain why the Java version was capped at 24 for Kotlin modules" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Explain why the Java version was capped at 24 for Kotlin modules + +**org.openrewrite.java.migrate.CommentJava24KotlinCap** + +_Adds an explanatory comment to Maven `pom.xml` files in modules that were held at Java 24 because they compile Kotlin and depend on `kotlin-stdlib` older than 2.3, which cannot target Java 25 bytecode. The comment names the `kotlin-stdlib` version found and the next step needed to reach Java 25. Self-healing: the comment is added while the module is at Java 24 and removed again once the module reaches a higher Java version (for instance after its Kotlin was upgraded to 2.3), so it only ever remains on modules that truly stay at Java 24 — whether a Kotlin 1.x cap or a 2.0-2.2 module whose Kotlin upgrade could not be applied. Intended to run last, scoped to modules that compile Kotlin._ + +## Recipe source + +[GitHub: CommentJava24KotlinCap.java](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/java/org/openrewrite/java/migrate/CommentJava24KotlinCap.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Comment Kotlin modules capped at Java 24](/recipes/java/migrate/commentkotlinmodulescappedatjava24.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/commentkotlinmodulescappedatjava24.md b/docs/recipes/java/migrate/commentkotlinmodulescappedatjava24.md new file mode 100644 index 0000000000..b815c6be9e --- /dev/null +++ b/docs/recipes/java/migrate/commentkotlinmodulescappedatjava24.md @@ -0,0 +1,164 @@ +--- +title: "Comment Kotlin modules capped at Java 24" +sidebar_label: "Comment Kotlin modules capped at Java 24" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Comment Kotlin modules capped at Java 24 + +**org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24** + +_Adds an explanatory comment to Kotlin modules that remain at Java 24 after the Java 25 migration, because Kotlin before 2.3 cannot target Java 25 bytecode. This covers both a Kotlin 1.x cap (which cannot be upgraded automatically) and a Kotlin 2.0-2.2 module whose upgrade to 2.3 could not be applied. Scoped to modules that actually compile Kotlin (i.e. contain `.kt` source files); the comment is self-healing, so a module that does reach Java 25 has it removed._ + +### Tags + +* [kotlin](/reference/recipes-by-tag#kotlin) +* [java25](/reference/recipes-by-tag#java25) + +## Recipe source + +[GitHub: java-version-25.yml](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/java-version-25.yml), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +**Preconditions** + +* [Module has Kotlin source files](../../java/migrate/search/modulehaskotlinsource) + +**Recipes** + +* [Explain why the Java version was capped at 24 for Kotlin modules](../../java/migrate/commentjava24kotlincap) + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24 +displayName: Comment Kotlin modules capped at Java 24 +description: | + Adds an explanatory comment to Kotlin modules that remain at Java 24 after the Java 25 migration, because Kotlin before 2.3 cannot target Java 25 bytecode. This covers both a Kotlin 1.x cap (which cannot be upgraded automatically) and a Kotlin 2.0-2.2 module whose upgrade to 2.3 could not be applied. Scoped to modules that actually compile Kotlin (i.e. contain `.kt` source files); the comment is self-healing, so a module that does reach Java 25 has it removed. +tags: + - kotlin + - java25 +preconditions: + - org.openrewrite.java.migrate.search.ModuleHasKotlinSource +recipeList: + - org.openrewrite.java.migrate.CommentJava24KotlinCap + +``` + + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate to Java 25](/recipes/java/migrate/upgradetojava25.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/jakarta/README.md b/docs/recipes/java/migrate/jakarta/README.md index a22955b93f..4ef3d4990d 100644 --- a/docs/recipes/java/migrate/jakarta/README.md +++ b/docs/recipes/java/migrate/jakarta/README.md @@ -74,6 +74,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Replace `CURRENT_COMPONENT` and `CURRENT_COMPOSITE_COMPONENT` with `getCurrentComponent()` and `getCurrentCompositeComponent()`](./removeduicomponentconstant.md) * [Replace `ResourceResolver` with `ResourceHandler`](./removedjakartafacesresourceresolver.md) * [Replace `doUpgrade(..)` with `ServerContainer.upgradeHttpToWebSocket(..)`](./wswsocservercontainerdeprecation.md) +* [Replace `jakarta.jws-api` with `jakarta.xml.ws-api`](./replacejakartajwswithjakartaxmlws.md) * [Substitute removed Faces Managed Beans](./facesmanagedbeansremoved.md) * [Update Apache Commons Email to Email2 for Jakarta](./updateapachecommonsemaildependencies.md) * [Update Apache Commons FileUpload2 package for EE10](./updatefileupload2dependencies.md) @@ -106,12 +107,15 @@ _Recipes that include further recipes, often including the individual recipes be * [Rename CDI Extension to Jakarta](./javaxtojakartacdiextensions.md) * [Replace `BeforeBeanDiscovery.addAnnotatedType(AnnotatedType)` with `addAnnotatedType(AnnotatedType, String)`](./updateaddannotatedtypes.md) * [Retain `javax.xml.bind:jaxb-api` when `jackson-module-jaxb-annotations` is present](./retainjaxbapiforjackson.md) +* [Set `maven-ejb-plugin` ejbVersion to 4.0](./upgrademavenejbpluginconfiguration.md) * [Update Eclipse Yasson Dependencies to 3.0.x](./updateyassondependencies.md) * [Update EclipseLink Dependencies to 4.x](./updateeclipselinkdependencies.md) * [Update Faces `@ManagedBean` to use CDI `@Named`](./updatemanagedbeantonamed.md) * [Update Jakarta EE Java Faces Dependencies to 4.1.x](./updatejakartafacesapi41.md) * [Update Jakarta EE Platform Dependencies to 10.0.0](./updatejakartaplatform10.md) * [Update Jakarta EE annotation Dependencies to 2.1.x](./updatejakartaannotations2.md) +* [Update Plugins for Jakarta EE 11](./migratepluginsforjakarta11.md) +* [Update Plugins for Jakarta EE 9](./migratepluginsforjakarta9.md) * [Update annotation attributes using `javax` to `jakarta`](./updateannotationattributejavaxtojakarta.md) * [Update `fireEvent()` and `createInjectionTarget()` calls](./updatebeanmanagermethods.md) * [Updates `getRealPath()` to call `getContext()` followed by `getRealPath()`](./updategetrealpath.md) diff --git a/docs/recipes/java/migrate/jakarta/jakartaee11.md b/docs/recipes/java/migrate/jakarta/jakartaee11.md index ff867afa4a..071f29ac3b 100644 --- a/docs/recipes/java/migrate/jakarta/jakartaee11.md +++ b/docs/recipes/java/migrate/jakarta/jakartaee11.md @@ -43,6 +43,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Migrate to Jakarta EE 10](../../../java/migrate/jakarta/jakartaee10) * [Jakarta Faces 4.0 to 4.1](../../../java/migrate/jakarta/faces4xmigrationtofaces41x) * [Update Jakarta EE Platform Dependencies to 11.0.x](../../../java/migrate/jakarta/updatejakartaplatform11) +* [Update Plugins for Jakarta EE 11](../../../java/migrate/jakarta/migratepluginsforjakarta11) @@ -63,6 +64,7 @@ recipeList: - org.openrewrite.java.migrate.jakarta.JakartaEE10 - org.openrewrite.java.migrate.jakarta.Faces4xMigrationToFaces41x - org.openrewrite.java.migrate.jakarta.UpdateJakartaPlatform11 + - org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta11 ``` diff --git a/docs/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md b/docs/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md index b5a7ea39e7..8b8fc29b2a 100644 --- a/docs/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md +++ b/docs/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md @@ -58,6 +58,11 @@ This recipe is available under the [Moderne Source Available License](https://do * version: `4.0.x` * onlyIfUsing: `javax.ejb..*` * acceptTransitive: `true` +* [Upgrade Maven plugin version](../../../maven/upgradepluginversion) + * groupId: `org.apache.maven.plugins` + * artifactId: `maven-ejb-plugin` + * newVersion: `3.2.x` +* [Set `maven-ejb-plugin` ejbVersion to 4.0](../../../java/migrate/jakarta/upgrademavenejbpluginconfiguration) * [Rename package name](../../../java/changepackage) * oldPackageName: `javax.ejb` * newPackageName: `jakarta.ejb` @@ -99,6 +104,11 @@ recipeList: version: 4.0.x onlyIfUsing: javax.ejb..* acceptTransitive: true + - org.openrewrite.maven.UpgradePluginVersion: + groupId: org.apache.maven.plugins + artifactId: maven-ejb-plugin + newVersion: 3.2.x + - org.openrewrite.java.migrate.jakarta.UpgradeMavenEjbPluginConfiguration - org.openrewrite.java.ChangePackage: oldPackageName: javax.ejb newPackageName: jakarta.ejb @@ -138,6 +148,25 @@ Please [contact Moderne](https://moderne.io/product) for more information about ## Data Tables + + +### Maven metadata failures +**org.openrewrite.maven.table.MavenMetadataFailures** + +_Attempts to resolve maven metadata that failed._ + +| Column Name | Description | +| ----------- | ----------- | +| Group id | The groupId of the artifact for which the metadata download failed. | +| Artifact id | The artifactId of the artifact for which the metadata download failed. | +| Version | The version of the artifact for which the metadata download failed. | +| Maven repository | The URL of the Maven repository that the metadata download failed on. | +| Snapshots | Does the repository support snapshots. | +| Releases | Does the repository support releases. | +| Failure | The reason the metadata download failed. | + + + ### Source files that had results diff --git a/docs/recipes/java/migrate/jakarta/javaxenterprisetojakartaenterprise.md b/docs/recipes/java/migrate/jakarta/javaxenterprisetojakartaenterprise.md index f2f3f834cf..ef57e3b6a3 100644 --- a/docs/recipes/java/migrate/jakarta/javaxenterprisetojakartaenterprise.md +++ b/docs/recipes/java/migrate/jakarta/javaxenterprisetojakartaenterprise.md @@ -41,10 +41,11 @@ This recipe is available under the [Moderne Source Available License](https://do * oldArtifactId: `javax.enterprise.concurrent-api` * newGroupId: `jakarta.enterprise.concurrent` * newArtifactId: `jakarta.enterprise.concurrent-api` + * newVersion: `2.0.x` * [Upgrade Gradle or Maven dependency versions](../../../java/dependencies/upgradedependencyversion) * groupId: `jakarta.enterprise.concurrent` * artifactId: `jakarta.enterprise.concurrent-api` - * newVersion: `3.0.x` + * newVersion: `2.0.x` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `javax.enterprise` * oldArtifactId: `cdi-api` @@ -85,10 +86,11 @@ recipeList: oldArtifactId: javax.enterprise.concurrent-api newGroupId: jakarta.enterprise.concurrent newArtifactId: jakarta.enterprise.concurrent-api + newVersion: 2.0.x - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: jakarta.enterprise.concurrent artifactId: jakarta.enterprise.concurrent-api - newVersion: 3.0.x + newVersion: 2.0.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: javax.enterprise oldArtifactId: cdi-api diff --git a/docs/recipes/java/migrate/jakarta/javaxmigrationtojakarta.md b/docs/recipes/java/migrate/jakarta/javaxmigrationtojakarta.md index 32e91b871f..aab5db63ac 100644 --- a/docs/recipes/java/migrate/jakarta/javaxmigrationtojakarta.md +++ b/docs/recipes/java/migrate/jakarta/javaxmigrationtojakarta.md @@ -84,6 +84,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Migrate deprecated `javaee-api` dependencies to `jakarta.platform`](../../../java/migrate/jakarta/javaxeeapitojakarta) * [Remove `jakarta.annotation-api` dependency when managed by Spring Boot](../../../java/migrate/jakarta/removejakartaannotationdependencywhenmanagedbyspringboot) * [Update RestLet to 2.6.0](../../../java/migrate/jakarta/updaterestlet2_6) +* [Update Plugins for Jakarta EE 9](../../../java/migrate/jakarta/migratepluginsforjakarta9) @@ -145,6 +146,7 @@ recipeList: - org.openrewrite.java.migrate.jakarta.JavaxEEApiToJakarta - org.openrewrite.java.migrate.jakarta.RemoveJakartaAnnotationDependencyWhenManagedBySpringBoot - org.openrewrite.java.migrate.jakarta.UpdateRestLet2_6 + - org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta9 ``` diff --git a/docs/recipes/java/migrate/jakarta/migratepluginsforjakarta11.md b/docs/recipes/java/migrate/jakarta/migratepluginsforjakarta11.md new file mode 100644 index 0000000000..ddfff735ac --- /dev/null +++ b/docs/recipes/java/migrate/jakarta/migratepluginsforjakarta11.md @@ -0,0 +1,181 @@ +--- +title: "Update Plugins for Jakarta EE 11" +sidebar_label: "Update Plugins for Jakarta EE 11" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Update Plugins for Jakarta EE 11 + +**org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta11** + +_Update plugins to be compatible with Jakarta EE 11._ + +## Recipe source + +[GitHub: jakarta-ee-11.yml](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/jakarta-ee-11.yml), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +**Preconditions** + +* [Singleton](../../../core/singleton) + +**Recipes** + +* [Upgrade Maven plugin version](../../../maven/upgradepluginversion) + * groupId: `org.apache.maven.plugins` + * artifactId: `maven-ear-plugin` + * newVersion: `3.4.x` + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta11 +displayName: Update Plugins for Jakarta EE 11 +description: | + Update plugins to be compatible with Jakarta EE 11. +preconditions: + - org.openrewrite.Singleton +recipeList: + - org.openrewrite.maven.UpgradePluginVersion: + groupId: org.apache.maven.plugins + artifactId: maven-ear-plugin + newVersion: 3.4.x + +``` + + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate to Jakarta EE 11](/recipes/java/migrate/jakarta/jakartaee11.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Maven metadata failures +**org.openrewrite.maven.table.MavenMetadataFailures** + +_Attempts to resolve maven metadata that failed._ + +| Column Name | Description | +| ----------- | ----------- | +| Group id | The groupId of the artifact for which the metadata download failed. | +| Artifact id | The artifactId of the artifact for which the metadata download failed. | +| Version | The version of the artifact for which the metadata download failed. | +| Maven repository | The URL of the Maven repository that the metadata download failed on. | +| Snapshots | Does the repository support snapshots. | +| Releases | Does the repository support releases. | +| Failure | The reason the metadata download failed. | + + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/jakarta/migratepluginsforjakarta9.md b/docs/recipes/java/migrate/jakarta/migratepluginsforjakarta9.md new file mode 100644 index 0000000000..7bc9bc3ce8 --- /dev/null +++ b/docs/recipes/java/migrate/jakarta/migratepluginsforjakarta9.md @@ -0,0 +1,181 @@ +--- +title: "Update Plugins for Jakarta EE 9" +sidebar_label: "Update Plugins for Jakarta EE 9" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Update Plugins for Jakarta EE 9 + +**org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta9** + +_Update plugins to be compatible with Jakarta EE 9._ + +## Recipe source + +[GitHub: jakarta-ee-9.yml](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +**Preconditions** + +* [Singleton](../../../core/singleton) + +**Recipes** + +* [Upgrade Maven plugin version](../../../maven/upgradepluginversion) + * groupId: `org.apache.maven.plugins` + * artifactId: `maven-ear-plugin` + * newVersion: `3.3.x` + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta9 +displayName: Update Plugins for Jakarta EE 9 +description: | + Update plugins to be compatible with Jakarta EE 9. +preconditions: + - org.openrewrite.Singleton +recipeList: + - org.openrewrite.maven.UpgradePluginVersion: + groupId: org.apache.maven.plugins + artifactId: maven-ear-plugin + newVersion: 3.3.x + +``` + + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate to Jakarta EE 9](/recipes/java/migrate/jakarta/javaxmigrationtojakarta.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Maven metadata failures +**org.openrewrite.maven.table.MavenMetadataFailures** + +_Attempts to resolve maven metadata that failed._ + +| Column Name | Description | +| ----------- | ----------- | +| Group id | The groupId of the artifact for which the metadata download failed. | +| Artifact id | The artifactId of the artifact for which the metadata download failed. | +| Version | The version of the artifact for which the metadata download failed. | +| Maven repository | The URL of the Maven repository that the metadata download failed on. | +| Snapshots | Does the repository support snapshots. | +| Releases | Does the repository support releases. | +| Failure | The reason the metadata download failed. | + + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/jakarta/migrationtojakarta10apis.md b/docs/recipes/java/migrate/jakarta/migrationtojakarta10apis.md index 8f15142617..be27538eb7 100644 --- a/docs/recipes/java/migrate/jakarta/migrationtojakarta10apis.md +++ b/docs/recipes/java/migrate/jakarta/migrationtojakarta10apis.md @@ -73,6 +73,10 @@ This recipe is available under the [Moderne Source Available License](https://do * groupId: `jakarta.enterprise` * artifactId: `jakarta.enterprise.cdi-api` * newVersion: `4.0.x` +* [Upgrade Gradle or Maven dependency versions](../../../java/dependencies/upgradedependencyversion) + * groupId: `jakarta.enterprise.concurrent` + * artifactId: `jakarta.enterprise.concurrent-api` + * newVersion: `3.0.x` * [Upgrade Gradle or Maven dependency versions](../../../java/dependencies/upgradedependencyversion) * groupId: `jakarta.el` * artifactId: `jakarta.el-api` @@ -179,6 +183,10 @@ recipeList: groupId: jakarta.enterprise artifactId: jakarta.enterprise.cdi-api newVersion: 4.0.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: jakarta.enterprise.concurrent + artifactId: jakarta.enterprise.concurrent-api + newVersion: 3.0.x - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: jakarta.el artifactId: jakarta.el-api diff --git a/docs/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws.md b/docs/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws.md new file mode 100644 index 0000000000..978efadc58 --- /dev/null +++ b/docs/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws.md @@ -0,0 +1,182 @@ +--- +title: "Replace `jakarta.jws-api` with `jakarta.xml.ws-api`" +sidebar_label: "Replace `jakarta.jws-api` with `jakarta.xml.ws-api`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Replace `jakarta.jws-api` with `jakarta.xml.ws-api` + +**org.openrewrite.java.migrate.jakarta.ReplaceJakartaJwsWithJakartaXmlWs** + +_Starting with Jakarta EE 10, the standalone `jakarta.jws-api` artifact was retired and its content was merged into `jakarta.xml.ws-api`. This recipe replaces a declared `jakarta.jws:jakarta.jws-api` dependency in place with `jakarta.xml.ws:jakarta.xml.ws-api`, and adds `jakarta.xml.ws:jakarta.xml.ws-api` directly when `jakarta.jws` was only available transitively._ + +## Recipe source + +[GitHub: jakarta-ee-10.yml](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/jakarta-ee-10.yml), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +:::info +This recipe is composed of more than one recipe. If you want to customize the set of recipes this is composed of, you can find and copy the GitHub source for the recipe from the link above. +::: + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +**Preconditions** + +* [Singleton](../../../core/singleton) + +**Recipes** + +* [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) + * oldGroupId: `jakarta.jws` + * oldArtifactId: `jakarta.jws-api` + * newGroupId: `jakarta.xml.ws` + * newArtifactId: `jakarta.xml.ws-api` + * newVersion: `4.0.x` +* [Add Gradle or Maven dependency](../../../java/dependencies/adddependency) + * groupId: `jakarta.xml.ws` + * artifactId: `jakarta.xml.ws-api` + * version: `4.0.x` + * onlyIfUsing: `jakarta.jws..*` + * acceptTransitive: `true` + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.jakarta.ReplaceJakartaJwsWithJakartaXmlWs +displayName: Replace `jakarta.jws-api` with `jakarta.xml.ws-api` +description: | + Starting with Jakarta EE 10, the standalone `jakarta.jws-api` artifact was retired and its content was merged into `jakarta.xml.ws-api`. This recipe replaces a declared `jakarta.jws:jakarta.jws-api` dependency in place with `jakarta.xml.ws:jakarta.xml.ws-api`, and adds `jakarta.xml.ws:jakarta.xml.ws-api` directly when `jakarta.jws` was only available transitively. +preconditions: + - org.openrewrite.Singleton +recipeList: + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: jakarta.jws + oldArtifactId: jakarta.jws-api + newGroupId: jakarta.xml.ws + newArtifactId: jakarta.xml.ws-api + newVersion: 4.0.x + - org.openrewrite.java.dependencies.AddDependency: + groupId: jakarta.xml.ws + artifactId: jakarta.xml.ws-api + version: 4.0.x + onlyIfUsing: jakarta.jws..* + acceptTransitive: true + +``` + + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Update Jakarta EE XML Web Services Dependencies for EE 10](/recipes/java/migrate/jakarta/updatejakartaxmlwsee10.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/jakarta/updatejakartaxmlwsee10.md b/docs/recipes/java/migrate/jakarta/updatejakartaxmlwsee10.md index 46b7d8e8e2..5b2b149299 100644 --- a/docs/recipes/java/migrate/jakarta/updatejakartaxmlwsee10.md +++ b/docs/recipes/java/migrate/jakarta/updatejakartaxmlwsee10.md @@ -36,6 +36,7 @@ This recipe is available under the [Moderne Source Available License](https://do **Recipes** +* [Replace `jakarta.jws-api` with `jakarta.xml.ws-api`](../../../java/migrate/jakarta/replacejakartajwswithjakartaxmlws) * [Upgrade Gradle or Maven dependency versions](../../../java/dependencies/upgradedependencyversion) * groupId: `jakarta.xml.bind` * artifactId: `jakarta.xml.bind-api` @@ -67,6 +68,7 @@ description: | preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.migrate.jakarta.ReplaceJakartaJwsWithJakartaXmlWs - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: jakarta.xml.bind artifactId: jakarta.xml.bind-api diff --git a/docs/recipes/java/migrate/jakarta/upgrademavenejbpluginconfiguration.md b/docs/recipes/java/migrate/jakarta/upgrademavenejbpluginconfiguration.md new file mode 100644 index 0000000000..b86da1c17b --- /dev/null +++ b/docs/recipes/java/migrate/jakarta/upgrademavenejbpluginconfiguration.md @@ -0,0 +1,124 @@ +--- +title: "Set `maven-ejb-plugin` ejbVersion to 4.0" +sidebar_label: "Set `maven-ejb-plugin` ejbVersion to 4.0" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Set `maven-ejb-plugin` ejbVersion to 4.0 + +**org.openrewrite.java.migrate.jakarta.UpgradeMavenEjbPluginConfiguration** + +_Updates the `` configuration of `maven-ejb-plugin` to `4.0` when the current value (or its resolved Maven property) indicates EJB 3.x. Handles the common pattern where `` is coupled to the `javax.ejb-api` dependency version via a shared property, decoupling them after migration._ + +## Recipe source + +[GitHub: UpgradeMavenEjbPluginConfiguration.java](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/java/org/openrewrite/java/migrate/jakarta/UpgradeMavenEjbPluginConfiguration.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate deprecated `javax.ejb` packages to `jakarta.ejb`](/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/javabestpractices.md b/docs/recipes/java/migrate/javabestpractices.md index 7cca21f682..5de01b03b1 100644 --- a/docs/recipes/java/migrate/javabestpractices.md +++ b/docs/recipes/java/migrate/javabestpractices.md @@ -43,6 +43,8 @@ This recipe is available under the [Moderne Source Available License](https://do * [Migrate to Java 25](../../java/migrate/upgradetojava25) * [Migrate `public static void main(String[] args)` to instance `void main()`](../../java/migrate/lang/migratemainmethodtoinstancemain) +* [Extract complex `super(..)` and `this(..)` arguments into local variables](../../java/migrate/lang/extractexplicitconstructorinvocationarguments) +* [Replace unused variables with underscore](../../java/migrate/lang/replaceunusedvariableswithunderscore) * [Use text blocks](../../java/migrate/lang/usetextblocks) * convertStringsWithoutNewlines: `true` * avoidLineContinuations: `false` @@ -104,6 +106,8 @@ preconditions: recipeList: - org.openrewrite.java.migrate.UpgradeToJava25 - org.openrewrite.java.migrate.lang.MigrateMainMethodToInstanceMain + - org.openrewrite.java.migrate.lang.ExtractExplicitConstructorInvocationArguments + - org.openrewrite.java.migrate.lang.ReplaceUnusedVariablesWithUnderscore - org.openrewrite.java.migrate.lang.UseTextBlocks: convertStringsWithoutNewlines: true avoidLineContinuations: false diff --git a/docs/recipes/java/migrate/lang/README.md b/docs/recipes/java/migrate/lang/README.md index 3be2735134..1f9c2d091a 100644 --- a/docs/recipes/java/migrate/lang/README.md +++ b/docs/recipes/java/migrate/lang/README.md @@ -26,6 +26,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Convert assigning Switch statements to Switch expressions](./switchcaseassignmentstoswitchexpression.md) * [Convert switch cases where every case returns into a returned switch expression](./switchcasereturnstoswitchexpression.md) * [Convert switch expression yield to arrow](./switchexpressionyieldtoarrow.md) +* [Extract complex `super(..)` and `this(..)` arguments into local variables](./extractexplicitconstructorinvocationarguments.md) * [If-else-if-else to switch](./ifelseifconstructtoswitch.md) * [Migrate `public static void main(String[] args)` to instance `void main()`](./migratemainmethodtoinstancemain.md) * [Prefer `String.formatted(Object...)`](./stringformatted.md) diff --git a/docs/recipes/java/migrate/lang/extractexplicitconstructorinvocationarguments.md b/docs/recipes/java/migrate/lang/extractexplicitconstructorinvocationarguments.md new file mode 100644 index 0000000000..ca67e1ea4f --- /dev/null +++ b/docs/recipes/java/migrate/lang/extractexplicitconstructorinvocationarguments.md @@ -0,0 +1,124 @@ +--- +title: "Extract complex `super(..)` and `this(..)` arguments into local variables" +sidebar_label: "Extract complex `super(..)` and `this(..)` arguments into local variables" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Extract complex `super(..)` and `this(..)` arguments into local variables + +**org.openrewrite.java.migrate.lang.ExtractExplicitConstructorInvocationArguments** + +_[JEP 513](https://openjdk.org/jeps/513) allows statements before an explicit `super(..)` or `this(..)` constructor invocation. When such a call computes one of its arguments through a method invocation or object creation, this recipe extracts the non-trivial arguments into local variables declared right before the call, surfacing the work done before construction. This is a strictly behavior-preserving transformation: argument expressions are already evaluated before the delegate constructor body runs, and such an argument can never reference the instance under construction, so hoisting them into preceding statements changes neither the order of side effects nor the set of legal references. Arguments are extracted in their original left-to-right order, and trivial arguments (literals and local variable references, which have no side effects) are left in place. Statements that follow the constructor invocation are deliberately *not* moved, as reordering them relative to the delegate constructor's side effects could change behavior._ + +## Recipe source + +[GitHub: ExtractExplicitConstructorInvocationArguments.java](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/java/org/openrewrite/java/migrate/lang/ExtractExplicitConstructorInvocationArguments.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Java best practices](/recipes/java/migrate/javabestpractices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/lang/replaceunusedvariableswithunderscore.md b/docs/recipes/java/migrate/lang/replaceunusedvariableswithunderscore.md index 6c8247b16b..efe3be9226 100644 --- a/docs/recipes/java/migrate/lang/replaceunusedvariableswithunderscore.md +++ b/docs/recipes/java/migrate/lang/replaceunusedvariableswithunderscore.md @@ -26,7 +26,7 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: -* [Migrate to Java 25](/recipes/java/migrate/upgradetojava25.md) +* [Java best practices](/recipes/java/migrate/javabestpractices.md) ## Example diff --git a/docs/recipes/java/migrate/upgradebuildtojava24.md b/docs/recipes/java/migrate/upgradebuildtojava24forkotlin1x.md similarity index 77% rename from docs/recipes/java/migrate/upgradebuildtojava24.md rename to docs/recipes/java/migrate/upgradebuildtojava24forkotlin1x.md index 7c2a22ebd3..6988430e48 100644 --- a/docs/recipes/java/migrate/upgradebuildtojava24.md +++ b/docs/recipes/java/migrate/upgradebuildtojava24forkotlin1x.md @@ -1,17 +1,17 @@ --- -title: "Upgrade build to Java 24 for Kotlin pre-2.3" -sidebar_label: "Upgrade build to Java 24 for Kotlin pre-2.3" +title: "Upgrade build to Java 24 for Kotlin 1.x" +sidebar_label: "Upgrade build to Java 24 for Kotlin 1.x" --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; import RunRecipe from '@site/src/components/RunRecipe'; -# Upgrade build to Java 24 for Kotlin pre-2.3 +# Upgrade build to Java 24 for Kotlin 1.x -**org.openrewrite.java.migrate.UpgradeBuildToJava24** +**org.openrewrite.java.migrate.UpgradeBuildToJava24ForKotlin1x** -_Kotlin versions before 2.3 only support up to Java 24. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap._ +_Kotlin versions before 2.3 only support up to Java 24, and Kotlin 1.x cannot be safely upgraded automatically because crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change. Such modules are therefore capped at Java 24 and annotated with an explanation. Modules already on Kotlin 2.0-2.2 are instead bumped to Kotlin 2.3 by `UpgradeKotlinForJava25` so they can reach Java 25. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap._ ## Recipe source @@ -32,7 +32,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Module has dependency](../../java/dependencies/search/modulehasdependency) * groupIdPattern: `org.jetbrains.kotlin` * artifactIdPattern: `kotlin-stdlib*` - * version: `[0,2.3)` + * version: `[0,2.0)` **Recipes** @@ -46,16 +46,16 @@ This recipe is available under the [Moderne Source Available License](https://do ```yaml --- type: specs.openrewrite.org/v1beta/recipe -name: org.openrewrite.java.migrate.UpgradeBuildToJava24 -displayName: Upgrade build to Java 24 for Kotlin pre-2.3 +name: org.openrewrite.java.migrate.UpgradeBuildToJava24ForKotlin1x +displayName: Upgrade build to Java 24 for Kotlin 1.x description: | - Kotlin versions before 2.3 only support up to Java 24. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap. + Kotlin versions before 2.3 only support up to Java 24, and Kotlin 1.x cannot be safely upgraded automatically because crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change. Such modules are therefore capped at Java 24 and annotated with an explanation. Modules already on Kotlin 2.0-2.2 are instead bumped to Kotlin 2.3 by `UpgradeKotlinForJava25` so they can reach Java 25. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap. preconditions: - org.openrewrite.java.migrate.search.ModuleHasKotlinSource - org.openrewrite.java.dependencies.search.ModuleHasDependency: groupIdPattern: org.jetbrains.kotlin artifactIdPattern: kotlin-stdlib* - version: [0,2.3) + version: [0,2.0) recipeList: - org.openrewrite.java.migrate.UpgradeJavaVersion: version: 24 @@ -74,8 +74,8 @@ This recipe is used as part of the following composite recipes: ## Usage + The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. diff --git a/docs/recipes/java/migrate/upgradejavaversion.md b/docs/recipes/java/migrate/upgradejavaversion.md index f3c369d341..2a80cb7b32 100644 --- a/docs/recipes/java/migrate/upgradejavaversion.md +++ b/docs/recipes/java/migrate/upgradejavaversion.md @@ -82,10 +82,11 @@ This recipe is used as part of the following composite recipes: * [Migrate to Java 8](/recipes/java/migrate/upgradetojava8.md) * [Upgrade Java to 11+ for Kafka clients](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/kafka/upgradejavaforkafkaclients) * [Upgrade Java to 17+ for Kafka broker/tools](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/kafka/upgradejavaforkafkabroker) +* [Upgrade Kotlin to 2.3 for Java 25 compatibility](/recipes/java/migrate/upgradekotlinforjava25.md) * [Upgrade build to Java 11](/recipes/java/migrate/upgradebuildtojava11.md) * [Upgrade build to Java 17](/recipes/java/migrate/upgradebuildtojava17.md) * [Upgrade build to Java 21](/recipes/java/migrate/upgradebuildtojava21.md) -* [Upgrade build to Java 24 for Kotlin pre-2.3](/recipes/java/migrate/upgradebuildtojava24.md) +* [Upgrade build to Java 24 for Kotlin 1.x](/recipes/java/migrate/upgradebuildtojava24forkotlin1x.md) * [Upgrade build to Java 25 (non-Kotlin)](/recipes/java/migrate/upgradebuildtojava25.md) * [Upgrade build to Java 25 for Kotlin 2.3+](/recipes/java/migrate/upgradebuildtojava25forkotlin.md) diff --git a/docs/recipes/java/migrate/upgradekotlinforjava25.md b/docs/recipes/java/migrate/upgradekotlinforjava25.md new file mode 100644 index 0000000000..4eedc13c7d --- /dev/null +++ b/docs/recipes/java/migrate/upgradekotlinforjava25.md @@ -0,0 +1,219 @@ +--- +title: "Upgrade Kotlin to 2.3 for Java 25 compatibility" +sidebar_label: "Upgrade Kotlin to 2.3 for Java 25 compatibility" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Upgrade Kotlin to 2.3 for Java 25 compatibility + +**org.openrewrite.java.migrate.UpgradeKotlinForJava25** + +_Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3._ + +### Tags + +* [kotlin](/reference/recipes-by-tag#kotlin) +* [java25](/reference/recipes-by-tag#java25) + +## Recipe source + +[GitHub: java-version-25.yml](https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/java-version-25.yml), +[Issue Tracker](https://github.com/openrewrite/rewrite-migrate-java/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/) + +:::info +This recipe is composed of more than one recipe. If you want to customize the set of recipes this is composed of, you can find and copy the GitHub source for the recipe from the link above. +::: + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +**Preconditions** + +* [Module has Kotlin source files](../../java/migrate/search/modulehaskotlinsource) +* [Module has dependency](../../java/dependencies/search/modulehasdependency) + * groupIdPattern: `org.jetbrains.kotlin` + * artifactIdPattern: `kotlin-stdlib*` + * version: `[2.0,2.3)` + +**Recipes** + +* [Upgrade Gradle or Maven dependency versions](../../java/dependencies/upgradedependencyversion) + * groupId: `org.jetbrains.kotlin` + * artifactId: `*` + * newVersion: `2.3.x` +* [Upgrade Maven plugin version](../../maven/upgradepluginversion) + * groupId: `org.jetbrains.kotlin` + * artifactId: `kotlin-maven-plugin` + * newVersion: `2.3.x` +* [Update a Gradle plugin by id](../../gradle/plugins/upgradepluginversion) + * pluginIdPattern: `org.jetbrains.kotlin.*` + * newVersion: `2.3.x` +* [Upgrade Java version](../../java/migrate/upgradejavaversion) + * version: `24` + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.java.migrate.UpgradeKotlinForJava25 +displayName: Upgrade Kotlin to 2.3 for Java 25 compatibility +description: | + Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3. +tags: + - kotlin + - java25 +preconditions: + - org.openrewrite.java.migrate.search.ModuleHasKotlinSource + - org.openrewrite.java.dependencies.search.ModuleHasDependency: + groupIdPattern: org.jetbrains.kotlin + artifactIdPattern: kotlin-stdlib* + version: [2.0,2.3) +recipeList: + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: org.jetbrains.kotlin + artifactId: "*" + newVersion: 2.3.x + - org.openrewrite.maven.UpgradePluginVersion: + groupId: org.jetbrains.kotlin + artifactId: kotlin-maven-plugin + newVersion: 2.3.x + - org.openrewrite.gradle.plugins.UpgradePluginVersion: + pluginIdPattern: org.jetbrains.kotlin.* + newVersion: 2.3.x + - org.openrewrite.java.migrate.UpgradeJavaVersion: + version: 24 + +``` + + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Migrate to Java 25](/recipes/java/migrate/upgradetojava25.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Maven metadata failures +**org.openrewrite.maven.table.MavenMetadataFailures** + +_Attempts to resolve maven metadata that failed._ + +| Column Name | Description | +| ----------- | ----------- | +| Group id | The groupId of the artifact for which the metadata download failed. | +| Artifact id | The artifactId of the artifact for which the metadata download failed. | +| Version | The version of the artifact for which the metadata download failed. | +| Maven repository | The URL of the Maven repository that the metadata download failed on. | +| Snapshots | Does the repository support snapshots. | +| Releases | Does the repository support releases. | +| Failure | The reason the metadata download failed. | + + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/migrate/upgradepluginsforjava25.md b/docs/recipes/java/migrate/upgradepluginsforjava25.md index d61e04a5ef..1b38021060 100644 --- a/docs/recipes/java/migrate/upgradepluginsforjava25.md +++ b/docs/recipes/java/migrate/upgradepluginsforjava25.md @@ -58,6 +58,10 @@ This recipe is available under the [Moderne Source Available License](https://do * groupId: `org.apache.maven.plugins` * artifactId: `maven-failsafe-plugin` * newVersion: `3.5.x` +* [Upgrade Maven plugin version](../../maven/upgradepluginversion) + * groupId: `org.apache.maven.plugins` + * artifactId: `maven-pmd-plugin` + * newVersion: `3.28.x` * [Upgrade Gradle or Maven dependency versions](../../java/dependencies/upgradedependencyversion) * groupId: `net.bytebuddy` * artifactId: `byte-buddy*` @@ -102,6 +106,10 @@ recipeList: groupId: org.apache.maven.plugins artifactId: maven-failsafe-plugin newVersion: 3.5.x + - org.openrewrite.maven.UpgradePluginVersion: + groupId: org.apache.maven.plugins + artifactId: maven-pmd-plugin + newVersion: 3.28.x - org.openrewrite.java.dependencies.UpgradeDependencyVersion: groupId: net.bytebuddy artifactId: byte-buddy* diff --git a/docs/recipes/java/migrate/upgradetojava21.md b/docs/recipes/java/migrate/upgradetojava21.md index 04516c6af8..6d2bac2226 100644 --- a/docs/recipes/java/migrate/upgradetojava21.md +++ b/docs/recipes/java/migrate/upgradetojava21.md @@ -106,6 +106,7 @@ This recipe is used as part of the following composite recipes: * [Migrate tests to Java 21](/recipes/java/recipes/upgradeteststojava21.md) * [Migrate to Java 25](/recipes/java/migrate/upgradetojava25.md) +* [Upgrade to Java 21 when using jOOQ](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradetojava21whenusingjooq) ## Examples ##### Example 1 diff --git a/docs/recipes/java/migrate/upgradetojava25.md b/docs/recipes/java/migrate/upgradetojava25.md index 4d12cb186e..2314e2d808 100644 --- a/docs/recipes/java/migrate/upgradetojava25.md +++ b/docs/recipes/java/migrate/upgradetojava25.md @@ -41,13 +41,13 @@ This recipe is available under the [Moderne Source Available License](https://do **Recipes** * [Migrate to Java 21](../../java/migrate/upgradetojava21) -* [Upgrade build to Java 24 for Kotlin pre-2.3](../../java/migrate/upgradebuildtojava24) +* [Upgrade Kotlin to 2.3 for Java 25 compatibility](../../java/migrate/upgradekotlinforjava25) +* [Upgrade build to Java 24 for Kotlin 1.x](../../java/migrate/upgradebuildtojava24forkotlin1x) * [Upgrade build to Java 25 (non-Kotlin)](../../java/migrate/upgradebuildtojava25) * [Upgrade build to Java 25 for Kotlin 2.3+](../../java/migrate/upgradebuildtojava25forkotlin) * [Upgrade plugins to Java 25 compatible versions](../../java/migrate/upgradepluginsforjava25) * [Migrate `System.out.print` to Java 25 IO utility class](../../java/migrate/io/replacesystemoutwithioprint) * [Use `Process#waitFor(Duration)`](../../java/migrate/lang/migrateprocesswaitforduration) -* [Replace unused variables with underscore](../../java/migrate/lang/replaceunusedvariableswithunderscore) * [Replace `Inflater` and `Deflater` `end()` calls with `close()`](../../java/migrate/util/migrateinflaterdeflatertoclose) * [Use `Reader.of(CharSequence)` for non-synchronized readers](../../java/migrate/util/migratestringreadertoreaderof) * [Remove Security AccessController](../../java/migrate/accesscontroller) @@ -56,6 +56,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Replace `System.getSecurityManager()` with `null`](../../java/migrate/systemgetsecuritymanagertonull) * [Use `ZipException` instead of `ZipError`](../../java/migrate/migrateziperrortozipexception) * [Migrate GraalVM resource-config.json to glob patterns](../../java/migrate/migrategraalvmresourceconfig) +* [Comment Kotlin modules capped at Java 24](../../java/migrate/commentkotlinmodulescappedatjava24) @@ -74,13 +75,13 @@ preconditions: - org.openrewrite.Singleton recipeList: - org.openrewrite.java.migrate.UpgradeToJava21 - - org.openrewrite.java.migrate.UpgradeBuildToJava24 + - org.openrewrite.java.migrate.UpgradeKotlinForJava25 + - org.openrewrite.java.migrate.UpgradeBuildToJava24ForKotlin1x - org.openrewrite.java.migrate.UpgradeBuildToJava25 - org.openrewrite.java.migrate.UpgradeBuildToJava25ForKotlin - org.openrewrite.java.migrate.UpgradePluginsForJava25 - org.openrewrite.java.migrate.io.ReplaceSystemOutWithIOPrint - org.openrewrite.java.migrate.lang.MigrateProcessWaitForDuration - - org.openrewrite.java.migrate.lang.ReplaceUnusedVariablesWithUnderscore - org.openrewrite.java.migrate.util.MigrateInflaterDeflaterToClose - org.openrewrite.java.migrate.util.MigrateStringReaderToReaderOf - org.openrewrite.java.migrate.AccessController @@ -89,6 +90,7 @@ recipeList: - org.openrewrite.java.migrate.SystemGetSecurityManagerToNull - org.openrewrite.java.migrate.MigrateZipErrorToZipException - org.openrewrite.java.migrate.MigrateGraalVMResourceConfig + - org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24 ``` diff --git a/docs/recipes/java/migrate/util/uselistof.md b/docs/recipes/java/migrate/util/uselistof.md index 3f1b048a35..cdeeb4ae26 100644 --- a/docs/recipes/java/migrate/util/uselistof.md +++ b/docs/recipes/java/migrate/util/uselistof.md @@ -11,7 +11,10 @@ import RunRecipe from '@site/src/components/RunRecipe'; **org.openrewrite.java.migrate.util.UseListOf** -_Prefer `List.of(..)` instead of using `java.util.List#add(..)` in anonymous ArrayList initializers in Java 10 or higher. This recipe will not modify code where the List is later mutated since `List.of` returns an immutable list._ +Prefer `List.of(..)` in Java 10 or higher. Two input shapes are recognised: + +- Anonymous-class initialization (`new ArrayList<>() {{ add("a"); add("b"); }}`), which is replaced wholesale with `List.of("a", "b")` (immutable result, matching the anonymous-class idiom's typical intent). +- A `new ArrayList<>()` declaration followed by a chain of `target.add(..)` statements, which is collapsed to `new ArrayList<>(List.of(..))` (preserving the mutable `ArrayList`). ## Recipe source diff --git a/docs/recipes/java/migrate/util/usemapof.md b/docs/recipes/java/migrate/util/usemapof.md index 11b2a36c86..db3bdbf30c 100644 --- a/docs/recipes/java/migrate/util/usemapof.md +++ b/docs/recipes/java/migrate/util/usemapof.md @@ -11,7 +11,10 @@ import RunRecipe from '@site/src/components/RunRecipe'; **org.openrewrite.java.migrate.util.UseMapOf** -_Prefer `Map.of(..)` instead of using `java.util.Map#put(..)` in Java 10 or higher._ +Prefer `Map.of(..)` instead of using `java.util.Map#put(..)` in Java 10 or higher. Two input shapes are recognised: + +- Anonymous-class initialization (`new HashMap<>() {{ put(k, v); ... }}`), which is replaced wholesale with `Map.of(k, v, ...)` (or `Map.ofEntries(...)` past ten entries) — immutable result. +- A `new HashMap<>()` declaration followed by a chain of `target.put(k, v)` statements, which is collapsed to `new HashMap<>(Map.of(..))` (or `new HashMap<>(Map.ofEntries(..))`) — preserving the mutable `HashMap`. ## Recipe source diff --git a/docs/recipes/java/migrate/util/usesetof.md b/docs/recipes/java/migrate/util/usesetof.md index 1d70d8548a..fa7f6ac4cf 100644 --- a/docs/recipes/java/migrate/util/usesetof.md +++ b/docs/recipes/java/migrate/util/usesetof.md @@ -11,7 +11,10 @@ import RunRecipe from '@site/src/components/RunRecipe'; **org.openrewrite.java.migrate.util.UseSetOf** -_Prefer `Set.of(..)` instead of using `java.util.Set#add(..)` in anonymous HashSet initializers in Java 10 or higher. This recipe will not modify code where the Set is later mutated since `Set.of` returns an immutable set._ +Prefer `Set.of(..)` in Java 10 or higher. Two input shapes are recognised: + +- Anonymous-class initialization (`new HashSet<>() {{ add("a"); add("b"); }}`), which is replaced wholesale with `Set.of("a", "b")` (immutable result, matching the anonymous-class idiom's typical intent). +- A `new HashSet<>()` declaration followed by a chain of `target.add(..)` statements, which is collapsed to `new HashSet<>(Set.of(..))` (preserving the mutable `HashSet`). ## Recipe source diff --git a/docs/recipes/java/reordermethodarguments.md b/docs/recipes/java/reordermethodarguments.md index e2bf14bb40..a2b52f0e9d 100644 --- a/docs/recipes/java/reordermethodarguments.md +++ b/docs/recipes/java/reordermethodarguments.md @@ -38,6 +38,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Hamcrest assertions to JUnit Jupiter](/recipes/java/testing/hamcrest/migratehamcresttojunit5.md) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate to ApacheHttpClient 5.x Classes Namespace from 4.x](/recipes/apache/httpclient5/upgradeapachehttpclient_5_classmapping.md) * [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) * [Mockito 3.x migration from 1.x](/recipes/java/testing/mockito/mockito1to3migration.md) diff --git a/docs/recipes/java/replaceconstantwithanotherconstant.md b/docs/recipes/java/replaceconstantwithanotherconstant.md index 3bc3425801..448e8ed373 100644 --- a/docs/recipes/java/replaceconstantwithanotherconstant.md +++ b/docs/recipes/java/replaceconstantwithanotherconstant.md @@ -49,6 +49,7 @@ This recipe is used as part of the following composite recipes: * [Migrate to Kafka 2.7](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/kafka/migratetokafka27) * [Migrate to Spring Framework 6.2](/recipes/java/spring/framework/upgradespringframework_6_2.md) * [Migrate to Spring Kafka 3.0](/recipes/java/spring/kafka/upgradespringkafka_3_0.md) +* [Migrate to Spring Kafka 4.1](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradespringkafka_4_1) * [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) * [Migrates to Apache POI 3.17](/recipes/apache/poi/upgradeapachepoi_3_17.md) * [Modernize legacy `jackson-core` feature constants](/recipes/java/jackson/upgradejackson_2_3_modernizejacksoncorefeatures.md) diff --git a/docs/recipes/java/shortenfullyqualifiedtypereferences.md b/docs/recipes/java/shortenfullyqualifiedtypereferences.md index 487f0b5597..3975b58d26 100644 --- a/docs/recipes/java/shortenfullyqualifiedtypereferences.md +++ b/docs/recipes/java/shortenfullyqualifiedtypereferences.md @@ -28,7 +28,6 @@ This recipe is used as part of the following composite recipes: * [Code cleanup](/recipes/staticanalysis/codecleanup.md) * [Migrate SLF4J to Log4j 2.x API](/recipes/java/logging/log4j/slf4jtolog4j.md) -* [Migrate classes from Jackson Codehaus (legacy) to Jackson FasterXML](/recipes/java/jackson/codehausclassestofasterxml.md) ## Example diff --git a/docs/recipes/java/spring/boot3/migratethymeleafdependencies.md b/docs/recipes/java/spring/boot3/migratethymeleafdependencies.md index 13fe530be8..8963792c3e 100644 --- a/docs/recipes/java/spring/boot3/migratethymeleafdependencies.md +++ b/docs/recipes/java/spring/boot3/migratethymeleafdependencies.md @@ -50,10 +50,12 @@ This recipe is available under the [Moderne Source Available License](https://do * oldGroupId: `org.thymeleaf` * oldArtifactId: `thymeleaf-spring5` * newArtifactId: `thymeleaf-spring6` + * newVersion: `3.1.x` * [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) * oldGroupId: `org.thymeleaf.extras` * oldArtifactId: `thymeleaf-extras-springsecurity5` * newArtifactId: `thymeleaf-extras-springsecurity6` + * newVersion: `3.1.x` @@ -81,10 +83,12 @@ recipeList: oldGroupId: org.thymeleaf oldArtifactId: thymeleaf-spring5 newArtifactId: thymeleaf-spring6 + newVersion: 3.1.x - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: org.thymeleaf.extras oldArtifactId: thymeleaf-extras-springsecurity5 newArtifactId: thymeleaf-extras-springsecurity6 + newVersion: 3.1.x ``` diff --git a/docs/recipes/java/spring/boot4/migrateautoconfigurepackages.md b/docs/recipes/java/spring/boot4/migrateautoconfigurepackages.md index f105fef001..fd1d41f451 100644 --- a/docs/recipes/java/spring/boot4/migrateautoconfigurepackages.md +++ b/docs/recipes/java/spring/boot4/migrateautoconfigurepackages.md @@ -109,6 +109,15 @@ This recipe is available under the [Moderne Source Available License](https://do * oldPackageName: `org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa` * newPackageName: `org.springframework.boot.hibernate.autoconfigure.metrics` * recursive: `true` +* [Change type](../../../java/changetype) + * oldFullyQualifiedTypeName: `org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureTestEntityManager` + * newFullyQualifiedTypeName: `org.springframework.boot.jpa.test.autoconfigure.AutoConfigureTestEntityManager` +* [Change type](../../../java/changetype) + * oldFullyQualifiedTypeName: `org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager` + * newFullyQualifiedTypeName: `org.springframework.boot.jpa.test.autoconfigure.TestEntityManager` +* [Change type](../../../java/changetype) + * oldFullyQualifiedTypeName: `org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration` + * newFullyQualifiedTypeName: `org.springframework.boot.jpa.test.autoconfigure.TestEntityManagerAutoConfiguration` * [Rename package name](../../../java/changepackage) * oldPackageName: `org.springframework.boot.test.autoconfigure.orm.jpa` * newPackageName: `org.springframework.boot.data.jpa.test.autoconfigure` @@ -409,6 +418,15 @@ recipeList: oldPackageName: org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa newPackageName: org.springframework.boot.hibernate.autoconfigure.metrics recursive: true + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.boot.test.autoconfigure.orm.jpa.AutoConfigureTestEntityManager + newFullyQualifiedTypeName: org.springframework.boot.jpa.test.autoconfigure.AutoConfigureTestEntityManager + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager + newFullyQualifiedTypeName: org.springframework.boot.jpa.test.autoconfigure.TestEntityManager + - org.openrewrite.java.ChangeType: + oldFullyQualifiedTypeName: org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration + newFullyQualifiedTypeName: org.springframework.boot.jpa.test.autoconfigure.TestEntityManagerAutoConfiguration - org.openrewrite.java.ChangePackage: oldPackageName: org.springframework.boot.test.autoconfigure.orm.jpa newPackageName: org.springframework.boot.data.jpa.test.autoconfigure diff --git a/docs/recipes/java/spring/boot4/upgradespringboot_4_0-community-edition.md b/docs/recipes/java/spring/boot4/upgradespringboot_4_0-community-edition.md index abb38b8881..6210191fb8 100644 --- a/docs/recipes/java/spring/boot4/upgradespringboot_4_0-community-edition.md +++ b/docs/recipes/java/spring/boot4/upgradespringboot_4_0-community-edition.md @@ -133,6 +133,16 @@ This recipe is available under the [Moderne Source Available License](https://do * artifactId: `error-handling-spring-boot-starter` * newVersion: `5.0.x` * overrideManagedVersion: `true` +* [Change Gradle or Maven dependency](../../../java/dependencies/changedependency) + * oldGroupId: `org.jobrunr` + * oldArtifactId: `jobrunr-spring-boot-3-starter` + * newArtifactId: `jobrunr-spring-boot-4-starter` + * newVersion: `8.x` +* [Upgrade Gradle or Maven dependency versions](../../../java/dependencies/upgradedependencyversion) + * groupId: `org.jobrunr` + * artifactId: `*` + * newVersion: `8.x` + * overrideManagedVersion: `true` * [Add `@AutoConfigureTestRestTemplate` if necessary](../../../java/spring/boot4/addautoconfiguretestresttemplate) * [Add `@AutoConfigureWebTestClient` if necessary](../../../java/spring/boot4/addautoconfigurewebtestclient) @@ -245,6 +255,16 @@ recipeList: artifactId: error-handling-spring-boot-starter newVersion: 5.0.x overrideManagedVersion: true + - org.openrewrite.java.dependencies.ChangeDependency: + oldGroupId: org.jobrunr + oldArtifactId: jobrunr-spring-boot-3-starter + newArtifactId: jobrunr-spring-boot-4-starter + newVersion: 8.x + - org.openrewrite.java.dependencies.UpgradeDependencyVersion: + groupId: org.jobrunr + artifactId: "*" + newVersion: 8.x + overrideManagedVersion: true - org.openrewrite.java.spring.boot4.AddAutoConfigureTestRestTemplate - org.openrewrite.java.spring.boot4.AddAutoConfigureWebTestClient diff --git a/docs/recipes/java/spring/changespringpropertykey.md b/docs/recipes/java/spring/changespringpropertykey.md index 78a7a366ae..05584f3bc8 100644 --- a/docs/recipes/java/spring/changespringpropertykey.md +++ b/docs/recipes/java/spring/changespringpropertykey.md @@ -62,6 +62,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Spring Cloud properties to 2025.1](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/cloud20251/springcloudproperties_2025_1) * [Migrate Spring Cloud properties to 2025](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/cloud2025/springcloudproperties_2025) * [Migrate from Spring Cloud Sleuth to OpenTelemetry](/recipes/java/spring/opentelemetry/migratesleuthtoopentelemetry.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Rename `server.max-http-header-size` to `server.max-http-request-header-size`](/recipes/java/spring/boot3/migratemaxhttpheadersize.md) * [Update OpenTelemetry resource attributes](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot3/updateopentelemetryresourceattributes) diff --git a/docs/recipes/java/spring/cloud2025/springcloudgatewayproperties.md b/docs/recipes/java/spring/cloud2025/springcloudgatewayproperties.md index e390191e72..8cb7f72c65 100644 --- a/docs/recipes/java/spring/cloud2025/springcloudgatewayproperties.md +++ b/docs/recipes/java/spring/cloud2025/springcloudgatewayproperties.md @@ -44,7 +44,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Change the key of a Spring application property](../../../java/spring/changespringpropertykey) * oldPropertyKey: `spring.cloud.gateway` * newPropertyKey: `spring.cloud.gateway.server.webflux` - * except: `[proxy]` + * except: `[proxy, mvc, server]` * [Change the key of a Spring application property](../../../java/spring/changespringpropertykey) * oldPropertyKey: `spring.cloud.gateway.mvc` * newPropertyKey: `spring.cloud.gateway.server.webmvc` @@ -69,7 +69,7 @@ recipeList: - org.openrewrite.java.spring.ChangeSpringPropertyKey: oldPropertyKey: spring.cloud.gateway newPropertyKey: spring.cloud.gateway.server.webflux - except: [proxy] + except: [proxy, mvc, server] - org.openrewrite.java.spring.ChangeSpringPropertyKey: oldPropertyKey: spring.cloud.gateway.mvc newPropertyKey: spring.cloud.gateway.server.webmvc diff --git a/docs/recipes/java/testing/assertj/README.md b/docs/recipes/java/testing/assertj/README.md index 17735f0e70..6da9789a9b 100644 --- a/docs/recipes/java/testing/assertj/README.md +++ b/docs/recipes/java/testing/assertj/README.md @@ -29,6 +29,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Collapse `assertThat` followed by `return` into single statement](./returnactual.md) * [Collapse consecutive `assertThat` statements](./collapseconsecutiveassertthatstatements.md) * [Convert try-catch-fail blocks to AssertJ's assertThatThrownBy](./junittryfailtoassertthatthrownby.md) +* [Decompose `assertThat` on conjunctions into separate assertions](./decomposeconjunctionassertion.md) * [JUnit AssertThrows to AssertJ exceptionType](./junitassertthrowstoassertexceptiontype.md) * [JUnit `assertArrayEquals` to assertJ](./junitassertarrayequalstoassertthat.md) * [JUnit `assertEquals` to AssertJ](./junitassertequalstoassertthat.md) @@ -79,10 +80,14 @@ _Recipes that include further recipes, often including the individual recipes be * [Replace `isNotEqualTo(0)` with `isNotZero()`](./assertjbyterulesrecipes$abstractbyteassertisnotzerorecipe.md) * [Replace `isNotEqualTo(0)` with `isNotZero()`](./assertjlongrulesrecipes$abstractlongassertisnotzerorecipe.md) * [Simplify AssertJ assertions on SequencedCollection](./simplifysequencedcollectionassertions.md) +* [Simplify AssertJ assertions on an array's `length`](./simplifyarraylengthassertion.md) +* [Simplify AssertJ assertions on `instanceof` expressions](./simplifyassertjinstanceofassertion.md) +* [Simplify AssertJ assertions on `null` reference comparisons](./simplifyassertjnullrelatedassertion.md) * [Simplify AssertJ assertions with `hasSize` argument](./simplifyhassizeassertion.md) * [Simplify AssertJ assertions with literal arguments](./simplifyassertjassertion.md) * [Simplify AssertJ chained assertions](./simplifychainedassertjassertion.md) * [Simplify `assertThat(collection.stream().map(...))` to `assertThat(collection).extracting(...)`](./simplifystreammaptoextracting.md) +* [Simplify literal-first AssertJ size assertions to `hasSize`](./simplifyhassizefromisequaltoassertion.md) * [Simplify redundant AssertJ assertion chains](./simplifyredundantassertjchains.md) * [Use `Assertions.assertThatObject` for ambiguous `AssertionsForClassTypes.assertThat` calls](./migrateassertionsforclasstypes.md) diff --git a/docs/recipes/java/testing/assertj/assertj-best-practices.md b/docs/recipes/java/testing/assertj/assertj-best-practices.md index 741594b64a..c269acb503 100644 --- a/docs/recipes/java/testing/assertj/assertj-best-practices.md +++ b/docs/recipes/java/testing/assertj/assertj-best-practices.md @@ -57,9 +57,14 @@ This recipe is available under the [Moderne Source Available License](https://do * [Migrate TestNG assertions to AssertJ](../../../java/testing/testng/testngtoassertj) * [Adopt AssertJ Duration assertions](../../../java/testing/assertj/adoptassertjdurationassertions) * [Replace `AbstractDateAssert#isEqualToIgnoringMillis(java.util.Date)` by `by isCloseTo(Date, long)`](../../../java/testing/assertj/isequaltoignoringmillistoisclosetorecipe) +* [Decompose `assertThat` on conjunctions into separate assertions](../../../java/testing/assertj/decomposeconjunctionassertion) * [Simplify AssertJ chained assertions](../../../java/testing/assertj/simplifychainedassertjassertions) * [Shorten AssertJ assertions](../../../java/testing/assertj/simplifyassertjassertions) +* [Simplify AssertJ assertions on `instanceof` expressions](../../../java/testing/assertj/simplifyassertjinstanceofassertion) +* [Simplify AssertJ assertions on `null` reference comparisons](../../../java/testing/assertj/simplifyassertjnullrelatedassertion) * [Simplify AssertJ assertions with `hasSize` argument](../../../java/testing/assertj/simplifyhassizeassertion) +* [Simplify literal-first AssertJ size assertions to `hasSize`](../../../java/testing/assertj/simplifyhassizefromisequaltoassertion) +* [Simplify AssertJ assertions on an array's `length`](../../../java/testing/assertj/simplifyarraylengthassertion) * [Simplify AssertJ assertions on SequencedCollection](../../../java/testing/assertj/simplifysequencedcollectionassertions) * [Simplify `assertThat(collection.stream().map(...))` to `assertThat(collection).extracting(...)`](../../../java/testing/assertj/simplifystreammaptoextracting) * [Refaster rules related to AssertJ assertions over `BigDecimal`s](../../../picnic/errorprone/refasterrules/assertjbigdecimalrulesrecipes) @@ -82,9 +87,9 @@ This recipe is available under the [Moderne Source Available License](https://do * [`AssertJObjectRules` Refaster recipes](../../../picnic/errorprone/refasterrules/assertjobjectrulesrecipes) * [`AssertJOptionalRules` Refaster recipes](../../../picnic/errorprone/refasterrules/assertjoptionalrulesrecipes) * [Refaster rules related to AssertJ assertions over `Path`s](../../../picnic/errorprone/refasterrules/assertjpathrulesrecipes) +* [Adopt AssertJ Short Assertions](../../../java/testing/assertj/assertjshortrulesrecipes) * [`AssertJPrimitiveRules` Refaster recipes](../../../picnic/errorprone/refasterrules/assertjprimitiverulesrecipes) * [`AssertJRules` Refaster recipes](../../../picnic/errorprone/refasterrules/assertjrulesrecipes) -* [Adopt AssertJ Short Assertions](../../../java/testing/assertj/assertjshortrulesrecipes) * [`AssertJStringRules` Refaster recipes](../../../picnic/errorprone/refasterrules/assertjstringrulesrecipes) * [Refaster rules related to AssertJ assertions over expressions that may throw a `Throwable` subtype](../../../picnic/errorprone/refasterrules/assertjthrowingcallablerulesrecipes) * [Collapse consecutive `assertThat` statements](../../../java/testing/assertj/collapseconsecutiveassertthatstatements) @@ -126,9 +131,14 @@ recipeList: - org.openrewrite.java.testing.testng.TestNgToAssertj - org.openrewrite.java.testing.assertj.AdoptAssertJDurationAssertions - org.openrewrite.java.testing.assertj.IsEqualToIgnoringMillisToIsCloseToRecipe + - org.openrewrite.java.testing.assertj.DecomposeConjunctionAssertion - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertions - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertions + - org.openrewrite.java.testing.assertj.SimplifyAssertJInstanceOfAssertion + - org.openrewrite.java.testing.assertj.SimplifyAssertJNullRelatedAssertion - org.openrewrite.java.testing.assertj.SimplifyHasSizeAssertion + - org.openrewrite.java.testing.assertj.SimplifyHasSizeFromIsEqualToAssertion + - org.openrewrite.java.testing.assertj.SimplifyArrayLengthAssertion - org.openrewrite.java.testing.assertj.SimplifySequencedCollectionAssertions - org.openrewrite.java.testing.assertj.SimplifyStreamMapToExtracting - tech.picnic.errorprone.refasterrules.AssertJBigDecimalRulesRecipes @@ -151,9 +161,9 @@ recipeList: - tech.picnic.errorprone.refasterrules.AssertJObjectRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJOptionalRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJPathRulesRecipes + - org.openrewrite.java.testing.assertj.AssertJShortRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJPrimitiveRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJRulesRecipes - - org.openrewrite.java.testing.assertj.AssertJShortRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJStringRulesRecipes - tech.picnic.errorprone.refasterrules.AssertJThrowingCallableRulesRecipes - org.openrewrite.java.testing.assertj.CollapseConsecutiveAssertThatStatements diff --git a/docs/recipes/java/testing/assertj/decomposeconjunctionassertion.md b/docs/recipes/java/testing/assertj/decomposeconjunctionassertion.md new file mode 100644 index 0000000000..a894a3f3ab --- /dev/null +++ b/docs/recipes/java/testing/assertj/decomposeconjunctionassertion.md @@ -0,0 +1,128 @@ +--- +title: "Decompose `assertThat` on conjunctions into separate assertions" +sidebar_label: "Decompose `assertThat` on conjunctions into separate assertions" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Decompose `assertThat` on conjunctions into separate assertions + +**org.openrewrite.java.testing.assertj.DecomposeConjunctionAssertion** + +_Split `assertThat(a && b).isTrue()` into separate `assertThat(a).isTrue()` and `assertThat(b).isTrue()` statements, so each condition is asserted (and reported) on its own. This lets the dedicated assertion recipes simplify each conjunct, and `CollapseConsecutiveAssertThatStatements` fuse them back into a single chain when the actual is a plain expression. Only the direct `assertThat(...).isTrue()` form is decomposed; `isFalse()` is left alone, as negating a conjunction is not equivalent to negating each conjunct._ + +### Tags + +* [RSPEC-S5838](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S5838&open=java%3AS5838) + +## Recipe source + +[GitHub: DecomposeConjunctionAssertion.java](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/src/main/java/org/openrewrite/java/testing/assertj/DecomposeConjunctionAssertion.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-testing-frameworks/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-testing-frameworks/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [AssertJ best practices](/recipes/java/testing/assertj/assertj-best-practices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/testing/assertj/simplifyarraylengthassertion.md b/docs/recipes/java/testing/assertj/simplifyarraylengthassertion.md new file mode 100644 index 0000000000..7d6d785167 --- /dev/null +++ b/docs/recipes/java/testing/assertj/simplifyarraylengthassertion.md @@ -0,0 +1,124 @@ +--- +title: "Simplify AssertJ assertions on an array's `length`" +sidebar_label: "Simplify AssertJ assertions on an array's `length`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Simplify AssertJ assertions on an array's `length` + +**org.openrewrite.java.testing.assertj.SimplifyArrayLengthAssertion** + +_Replace `assertThat(array.length)` size assertions with the dedicated array assertions, such as `assertThat(array).hasSize(n)`, `assertThat(array).isEmpty()` and `assertThat(array).hasSameSizeAs(other)`. Works for both object and primitive arrays._ + +## Recipe source + +[GitHub: SimplifyArrayLengthAssertion.java](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/src/main/java/org/openrewrite/java/testing/assertj/SimplifyArrayLengthAssertion.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-testing-frameworks/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-testing-frameworks/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [AssertJ best practices](/recipes/java/testing/assertj/assertj-best-practices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/testing/assertj/simplifyassertjassertions.md b/docs/recipes/java/testing/assertj/simplifyassertjassertions.md index b84ceaf635..e5faac19c9 100644 --- a/docs/recipes/java/testing/assertj/simplifyassertjassertions.md +++ b/docs/recipes/java/testing/assertj/simplifyassertjassertions.md @@ -75,7 +75,7 @@ This recipe is available under the [Moderne Source Available License](https://do * assertToReplace: `hasSize` * literalArgument: `0` * dedicatedAssertion: `isEmpty` - * requiredType: `java.util.Collection` + * requiredType: `java.lang.Iterable` * [Simplify AssertJ assertions with literal arguments](../../../java/testing/assertj/simplifyassertjassertion) * assertToReplace: `hasSize` * literalArgument: `0` @@ -133,7 +133,7 @@ recipeList: assertToReplace: hasSize literalArgument: 0 dedicatedAssertion: isEmpty - requiredType: java.util.Collection + requiredType: java.lang.Iterable - org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion: assertToReplace: hasSize literalArgument: 0 diff --git a/docs/recipes/java/testing/assertj/simplifyassertjinstanceofassertion.md b/docs/recipes/java/testing/assertj/simplifyassertjinstanceofassertion.md new file mode 100644 index 0000000000..4f5eaacb37 --- /dev/null +++ b/docs/recipes/java/testing/assertj/simplifyassertjinstanceofassertion.md @@ -0,0 +1,128 @@ +--- +title: "Simplify AssertJ assertions on `instanceof` expressions" +sidebar_label: "Simplify AssertJ assertions on `instanceof` expressions" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Simplify AssertJ assertions on `instanceof` expressions + +**org.openrewrite.java.testing.assertj.SimplifyAssertJInstanceOfAssertion** + +_Replace `assertThat(x instanceof Type).isTrue()` with the dedicated `assertThat(x).isInstanceOf(Type.class)`, and the negated and `isFalse()` variants with `isNotInstanceOf`, so failures describe the actual type rather than just `expected true but was false`._ + +### Tags + +* [RSPEC-S5838](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S5838&open=java%3AS5838) + +## Recipe source + +[GitHub: SimplifyAssertJInstanceOfAssertion.java](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJInstanceOfAssertion.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-testing-frameworks/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-testing-frameworks/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [AssertJ best practices](/recipes/java/testing/assertj/assertj-best-practices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/testing/assertj/simplifyassertjnullrelatedassertion.md b/docs/recipes/java/testing/assertj/simplifyassertjnullrelatedassertion.md new file mode 100644 index 0000000000..687906a374 --- /dev/null +++ b/docs/recipes/java/testing/assertj/simplifyassertjnullrelatedassertion.md @@ -0,0 +1,128 @@ +--- +title: "Simplify AssertJ assertions on `null` reference comparisons" +sidebar_label: "Simplify AssertJ assertions on `null` reference comparisons" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Simplify AssertJ assertions on `null` reference comparisons + +**org.openrewrite.java.testing.assertj.SimplifyAssertJNullRelatedAssertion** + +_Replace `assertThat(x == null).isTrue()` and its variants with the dedicated `assertThat(x).isNull()` / `assertThat(x).isNotNull()`. Beyond being more expressive, this avoids the compilation error that results when the `null` literal ends up as the `assertThat` argument (e.g. `assertThat(null == x).isTrue()` becoming `assertThat(null).isSameAs(x)`)._ + +### Tags + +* [RSPEC-S5838](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S5838&open=java%3AS5838) + +## Recipe source + +[GitHub: SimplifyAssertJNullRelatedAssertion.java](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/src/main/java/org/openrewrite/java/testing/assertj/SimplifyAssertJNullRelatedAssertion.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-testing-frameworks/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-testing-frameworks/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [AssertJ best practices](/recipes/java/testing/assertj/assertj-best-practices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/testing/assertj/simplifychainedassertjassertions.md b/docs/recipes/java/testing/assertj/simplifychainedassertjassertions.md index 2d78de7a4c..1d9bcb7cfe 100644 --- a/docs/recipes/java/testing/assertj/simplifychainedassertjassertions.md +++ b/docs/recipes/java/testing/assertj/simplifychainedassertjassertions.md @@ -41,6 +41,11 @@ This recipe is available under the [Moderne Source Available License](https://do **Recipes** +* [Simplify AssertJ chained assertions](../../../java/testing/assertj/simplifychainedassertjassertion) + * chainedAssertion: `compareTo` + * assertToReplace: `isZero` + * dedicatedAssertion: `isEqualByComparingTo` + * requiredType: `java.math.BigDecimal` * [Simplify AssertJ chained assertions](../../../java/testing/assertj/simplifychainedassertjassertion) * chainedAssertion: `isEmpty` * assertToReplace: `isTrue` @@ -369,6 +374,11 @@ tags: preconditions: - org.openrewrite.Singleton recipeList: + - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: + chainedAssertion: compareTo + assertToReplace: isZero + dedicatedAssertion: isEqualByComparingTo + requiredType: java.math.BigDecimal - org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion: chainedAssertion: isEmpty assertToReplace: isTrue diff --git a/docs/recipes/java/testing/assertj/simplifyhassizefromisequaltoassertion.md b/docs/recipes/java/testing/assertj/simplifyhassizefromisequaltoassertion.md new file mode 100644 index 0000000000..527df2ee3b --- /dev/null +++ b/docs/recipes/java/testing/assertj/simplifyhassizefromisequaltoassertion.md @@ -0,0 +1,124 @@ +--- +title: "Simplify literal-first AssertJ size assertions to `hasSize`" +sidebar_label: "Simplify literal-first AssertJ size assertions to `hasSize`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Simplify literal-first AssertJ size assertions to `hasSize` + +**org.openrewrite.java.testing.assertj.SimplifyHasSizeFromIsEqualToAssertion** + +_Replace `assertThat().isEqualTo(collection.size())` style assertions with the dedicated `assertThat(collection).hasSize()`. Only the structural size form is rewritten, where the comparison is on a primitive `int` and reversing the assertion is behavior-preserving (unlike arbitrary `isEqualTo` object comparisons, which rely on `equals`)._ + +## Recipe source + +[GitHub: SimplifyHasSizeFromIsEqualToAssertion.java](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/src/main/java/org/openrewrite/java/testing/assertj/SimplifyHasSizeFromIsEqualToAssertion.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-testing-frameworks/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-testing-frameworks/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [AssertJ best practices](/recipes/java/testing/assertj/assertj-best-practices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/testing/junit/jupiterbestpractices.md b/docs/recipes/java/testing/junit/jupiterbestpractices.md index 2a299e335e..9be7866cb8 100644 --- a/docs/recipes/java/testing/junit/jupiterbestpractices.md +++ b/docs/recipes/java/testing/junit/jupiterbestpractices.md @@ -60,6 +60,7 @@ This recipe is available under the [Moderne Source Available License](https://do * [Make lifecycle methods non private](../../../java/testing/junit5/lifecyclenonprivate) * [Applies JUnit 5 `assertThrows` on last statement in lambda block only](../../../java/testing/junit5/assertthrowsonlaststatement) * [`assertTrue(x instanceof y)` to `assertInstanceOf(y.class, x)`](../../../java/testing/junit5/asserttrueinstanceoftoassertinstanceof) +* [Make implausibly long `@Timeout` values explicit in minutes](../../../java/testing/junit5/implausibletimeouttominutes) * [Use JUnit5's `assertSame` or `assertNotSame` instead of `assertTrue(... == ...)`](../../../java/testing/junit5/useassertsame) * [Remove JUnit Jupiter migrationsupport](../../../java/testing/junit/removejupitermigrationsupport) @@ -99,6 +100,7 @@ recipeList: - org.openrewrite.java.testing.junit5.LifecycleNonPrivate - org.openrewrite.java.testing.junit5.AssertThrowsOnLastStatement - org.openrewrite.java.testing.junit5.AssertTrueInstanceofToAssertInstanceOf + - org.openrewrite.java.testing.junit5.ImplausibleTimeoutToMinutes - org.openrewrite.java.testing.junit5.UseAssertSame - org.openrewrite.java.testing.junit.RemoveJupiterMigrationSupport diff --git a/docs/recipes/java/testing/junit5/README.md b/docs/recipes/java/testing/junit5/README.md index 5537e5c79c..144387d944 100644 --- a/docs/recipes/java/testing/junit5/README.md +++ b/docs/recipes/java/testing/junit5/README.md @@ -47,6 +47,7 @@ _Recipes that include further recipes, often including the individual recipes be * [JUnit 5 inner test classes should be annotated with `@Nested`](./addmissingnested.md) * [JUnit TestName @Rule to JUnit Jupiter TestInfo](./testruletotestinfo.md) * [Make `@TempDir` fields non final](./tempdirnonfinal.md) +* [Make implausibly long `@Timeout` values explicit in minutes](./implausibletimeouttominutes.md) * [Make lifecycle methods non private](./lifecyclenonprivate.md) * [Migrate JUnit 4 `@Test` annotations to JUnit 5](./updatetestannotation.md) * [Migrate JUnit 4 `TestCase` to JUnit Jupiter](./migratejunittestcase.md) diff --git a/docs/recipes/java/testing/junit5/implausibletimeouttominutes.md b/docs/recipes/java/testing/junit5/implausibletimeouttominutes.md new file mode 100644 index 0000000000..c9cdb3fb99 --- /dev/null +++ b/docs/recipes/java/testing/junit5/implausibletimeouttominutes.md @@ -0,0 +1,130 @@ +--- +title: "Make implausibly long `@Timeout` values explicit in minutes" +sidebar_label: "Make implausibly long `@Timeout` values explicit in minutes" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Make implausibly long `@Timeout` values explicit in minutes + +**org.openrewrite.java.testing.junit5.ImplausibleTimeoutToMinutes** + +_JUnit Jupiter's `@Timeout` defaults to `TimeUnit.SECONDS`, so a value such as `@Timeout(10000)` is interpreted as almost three hours, which is most likely a mistake where milliseconds were intended. This recipe rewrites such implausibly large second-based timeouts to the equivalent number of minutes, for instance `@Timeout(value = 167, unit = TimeUnit.MINUTES)`, preserving the original (likely erroneous) semantics while making the mistake far more visible for review._ + +## Recipe source + +[GitHub: ImplausibleTimeoutToMinutes.java](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/src/main/java/org/openrewrite/java/testing/junit5/ImplausibleTimeoutToMinutes.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-testing-frameworks/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-testing-frameworks/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + +## Options + +| Type | Name | Description | Example | +| --- | --- | --- | --- | +| `Integer` | thresholdSeconds | *Optional*. Timeouts of at least this many seconds (when the time unit is the default `SECONDS`) are considered implausibly long and are rewritten to the equivalent number of minutes. Defaults to `1000` seconds, about 17 minutes. | `1000` | + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [JUnit Jupiter best practices](/recipes/java/testing/junit/jupiterbestpractices.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/java/testing/testng/testngtoassertj.md b/docs/recipes/java/testing/testng/testngtoassertj.md index 6d34df07b6..3c28b03dcd 100644 --- a/docs/recipes/java/testing/testng/testngtoassertj.md +++ b/docs/recipes/java/testing/testng/testngtoassertj.md @@ -57,6 +57,8 @@ This recipe is available under the [Moderne Source Available License](https://do * [TestNG `assertNotSame` to AssertJ](../../../java/testing/testng/testngassertnotsametoassertthat) * [TestNG `assertThrows`/`expectThrows` to AssertJ](../../../java/testing/testng/testngassertthrowstoassertthat) * [TestNG `assertList*` to AssertJ](../../../java/testing/testng/testngassertlisttoassertthat) +* [Use static import](../../../java/usestaticimport) + * methodPattern: `org.assertj.core.api.Assertions *(..)` @@ -91,6 +93,8 @@ recipeList: - org.openrewrite.java.testing.testng.TestNgAssertNotSameToAssertThat - org.openrewrite.java.testing.testng.TestNgAssertThrowsToAssertThat - org.openrewrite.java.testing.testng.TestNgAssertListToAssertThat + - org.openrewrite.java.UseStaticImport: + methodPattern: org.assertj.core.api.Assertions *(..) ``` diff --git a/docs/recipes/java/usestaticimport.md b/docs/recipes/java/usestaticimport.md index 99f24ce3f6..5f9a3f664b 100644 --- a/docs/recipes/java/usestaticimport.md +++ b/docs/recipes/java/usestaticimport.md @@ -32,6 +32,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac This recipe is used as part of the following composite recipes: +* [Migrate TestNG assertions to AssertJ](/recipes/java/testing/testng/testngtoassertj.md) * [OpenRewrite recipe best practices](/recipes/recipes/rewrite/openrewriterecipebestpractices.md) * [Recipe testing best practices](/recipes/java/recipes/recipetestingbestpractices.md) * [Statically import AssertJ's `assertThat`](/recipes/java/testing/assertj/staticimports.md) diff --git a/docs/recipes/javascript/changemethodname.md b/docs/recipes/javascript/changemethodname.md index 4619caaae2..0188a318df 100644 --- a/docs/recipes/javascript/changemethodname.md +++ b/docs/recipes/javascript/changemethodname.md @@ -85,6 +85,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) diff --git a/docs/recipes/javascript/changetype.md b/docs/recipes/javascript/changetype.md index c8b9011f72..69d86fa303 100644 --- a/docs/recipes/javascript/changetype.md +++ b/docs/recipes/javascript/changetype.md @@ -122,11 +122,13 @@ This recipe is used as part of the following composite recipes: * [Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`](/recipes/java/migrate/jakarta/javaxxmlbindmigrationtojakartaxmlbind.md) * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) * [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate from JMockit to Mockito](/recipes/java/testing/jmockit/jmockittomockito.md) * [Migrate from Jakarta annotation API to JSpecify](/recipes/java/jspecify/migratefromjakartaannotationapi.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) * [Migrate from JetBrains annotations to JSpecify](/recipes/java/jspecify/migratefromjetbrainsannotations.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micrometer annotations to JSpecify](/recipes/java/jspecify/migratefrommicrometerannotations.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from Micronaut 4.x to 5.x](/recipes/java/micronaut/micronaut4to5migration.md) @@ -145,6 +147,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from `oracle-xe` to `oracle-free`](/recipes/java/testing/testcontainers/migratetooraclefree.md) * [Migrate from javax annotation API to JSpecify](/recipes/java/jspecify/migratefromjavaxannotationapi.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Migrate moved types between Camel 3.x and Camel 4.x](/recipes/apache/camel/upgrade/camel40/changetypes.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) * [Migrate to Apache HttpCore Nio Classes to Apache HttpCore 5.x](/recipes/apache/httpclient5/upgradeapachehttpcore_5_nioclassmapping.md) @@ -216,7 +219,6 @@ This recipe is used as part of the following composite recipes: * [Replace elements of SpringFox's security with Swagger's security models](/recipes/java/spring/doc/securitycontexttosecurityscheme.md) * [Spring Boot 4.0 Module Starter Relocations](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/modulestarterrelocations) * [Spring Security 7 modularization](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security7/modularizespringsecurity7) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) * [Substitute deprecated Faces Managed Beans](/recipes/oracle/weblogic/rewrite/jakarta/facesmanagedbeansremoved3.md) * [Substitute removed Faces Managed Beans](/recipes/java/migrate/jakarta/facesmanagedbeansremoved.md) * [Tag Enum has been deprecated](/recipes/apache/camel/upgrade/camel41/tracingtag.md) diff --git a/docs/recipes/javascript/reordermethodarguments.md b/docs/recipes/javascript/reordermethodarguments.md index 758db1e123..fb8280fe41 100644 --- a/docs/recipes/javascript/reordermethodarguments.md +++ b/docs/recipes/javascript/reordermethodarguments.md @@ -42,6 +42,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Hamcrest assertions to JUnit Jupiter](/recipes/java/testing/hamcrest/migratehamcresttojunit5.md) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate to ApacheHttpClient 5.x Classes Namespace from 4.x](/recipes/apache/httpclient5/upgradeapachehttpclient_5_classmapping.md) * [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) * [Mockito 3.x migration from 1.x](/recipes/java/testing/mockito/mockito1to3migration.md) diff --git a/docs/recipes/javascript/search/dependencyinsight.md b/docs/recipes/javascript/search/dependencyinsight.md index ecaf03be65..494d87408e 100644 --- a/docs/recipes/javascript/search/dependencyinsight.md +++ b/docs/recipes/javascript/search/dependencyinsight.md @@ -34,8 +34,18 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: +* [Javascript UI library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/uiinsights) +* [Javascript database interaction library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/databaseinteractioninsights) +* [Javascript form handling library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/formhandlinginsights) +* [Javascript linting & formatting library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/lintingformattinginsights) +* [Javascript real-time communication library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/realtimecommunicationinsights) +* [Javascript security library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/securityinsights) +* [Javascript server-side frameworks insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/serversideframeworksinsights) +* [Javascript state management library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/statemanagementinsights) +* [Javascript task runners & build tools insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/taskrunnersbuildtoolsinsights) +* [Javascript testing library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/testinginsights) +* [Javascript utility library insights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/utilityinsights) * [Update Prethink context (no AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextnoaistarter) -* [Update Prethink context (with AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextstarter) ## Example diff --git a/docs/recipes/maven/addmanageddependency.md b/docs/recipes/maven/addmanageddependency.md index 1708b282eb..fe01938f5a 100644 --- a/docs/recipes/maven/addmanageddependency.md +++ b/docs/recipes/maven/addmanageddependency.md @@ -45,6 +45,7 @@ This recipe is used as part of the following composite recipes: * [Add Spring Cloud dependencies BOM](/recipes/java/spring/cloud2025/addspringclouddependenciesbom.md) * [Migrate JavaEE Maven Dependencies to Quarkus 2](/recipes/quarkus/migrate/javaee/addquarkus2mavenplugins.md) * [Migrate Spring Boot to Quarkus](/recipes/quarkus/spring/springboottoquarkus.md) +* [Migrate to Spring Boot 4.0 (Moderne Edition)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradespringboot_4_0-moderne-edition) ## Example diff --git a/docs/recipes/maven/removemanageddependency.md b/docs/recipes/maven/removemanageddependency.md index a164cca457..70c4a0262f 100644 --- a/docs/recipes/maven/removemanageddependency.md +++ b/docs/recipes/maven/removemanageddependency.md @@ -43,7 +43,9 @@ This recipe is used as part of the following composite recipes: * [JUnit Jupiter migration from JUnit 4.x](/recipes/java/testing/junit5/junit4to5migration.md) * [Migrate Hibernate dependencies to 6.0.x](/recipes/hibernate/migratetohibernatedependencies60.md) * [Migrate Spring Cloud Sleuth 3.1 to Micrometer Tracing 1.0](/recipes/java/spring/cloud2022/migratecloudsleuthtomicrometertracing.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Remove JUnit Jupiter migrationsupport](/recipes/java/testing/junit/removejupitermigrationsupport.md) +* [Remove the orphaned Spring Retry version pin](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/removespringretryversionpin) * [Replace PowerMock with raw Mockito](/recipes/java/testing/mockito/replacepowermockito.md) ## Example diff --git a/docs/recipes/maven/removeproperty.md b/docs/recipes/maven/removeproperty.md index 82282224e2..3d5e8dcde4 100644 --- a/docs/recipes/maven/removeproperty.md +++ b/docs/recipes/maven/removeproperty.md @@ -35,6 +35,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from Spring Boot 1.x to 2.0](/recipes/java/spring/boot2/upgradespringboot_2_0.md) * [Migrate to Spring Boot 3.2](/recipes/java/spring/boot3/upgradespringboot_3_2.md) * [Modernize a Jenkins plugin to the latest versions supported by Java 8](/recipes/jenkins/modernizepluginforjava8.md) +* [Remove the orphaned Spring Retry version pin](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/removespringretryversionpin) ## Example diff --git a/docs/recipes/maven/upgradepluginversion.md b/docs/recipes/maven/upgradepluginversion.md index 9cbf367816..a7a16efc13 100644 --- a/docs/recipes/maven/upgradepluginversion.md +++ b/docs/recipes/maven/upgradepluginversion.md @@ -42,6 +42,7 @@ This recipe is used as part of the following composite recipes: * [Customize Quarkus BOM Version](/recipes/quarkus/spring/customizequarkusversion.md) * [JUnit 6 migration from JUnit 5.x](/recipes/java/testing/junit6/junit5to6migration.md) * [JUnit Jupiter migration from JUnit 4.x](/recipes/java/testing/junit5/junit4to5migration.md) +* [Migrate deprecated `javax.ejb` packages to `jakarta.ejb`](/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md) * [Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`](/recipes/java/migrate/jakarta/javaxxmlbindmigrationtojakartaxmlbind.md) * [Migrate from Spring Boot 1.x to 2.0](/recipes/java/spring/boot2/upgradespringboot_2_0.md) * [Migrate to 4.10.6](/recipes/apache/camel/upgrade/camel410ltsmigrationrecipe.md) @@ -69,10 +70,13 @@ This recipe is used as part of the following composite recipes: * [Migrate to WebLogic 14.1.1](/recipes/oracle/weblogic/rewrite/upgradeto1411.md) * [Quarkus 2.x migration from Quarkus 1.x](/recipes/quarkus/quarkus2/quarkus1to2migration.md) * [Update Plugins for Jakarta EE 10](/recipes/java/migrate/jakarta/migratepluginsforjakarta10.md) +* [Update Plugins for Jakarta EE 11](/recipes/java/migrate/jakarta/migratepluginsforjakarta11.md) +* [Update Plugins for Jakarta EE 9](/recipes/java/migrate/jakarta/migratepluginsforjakarta9.md) * [Update the WebLogic version to 14.1.2](/recipes/oracle/weblogic/rewrite/updatebuildtoweblogic1412.md) * [Update the WebLogic version to 15.1.1](/recipes/oracle/weblogic/rewrite/updatebuildtoweblogic1511.md) * [Upgrade JaCoCo](/recipes/java/migrate/jacoco/upgradejacoco.md) * [Upgrade Java to 17+ for Kafka broker/tools](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/kafka/upgradejavaforkafkabroker) +* [Upgrade Kotlin to 2.3 for Java 25 compatibility](/recipes/java/migrate/upgradekotlinforjava25.md) * [Upgrade plugins to Java 11 compatible versions](/recipes/java/migrate/upgradepluginsforjava11.md) * [Upgrade plugins to Java 17 compatible versions](/recipes/java/migrate/upgradepluginsforjava17.md) * [Upgrade plugins to Java 21 compatible versions](/recipes/java/migrate/upgradepluginsforjava21.md) diff --git a/docs/recipes/prethink/exportcontext.md b/docs/recipes/prethink/exportcontext.md index 449e3fee7f..5857dd4d27 100644 --- a/docs/recipes/prethink/exportcontext.md +++ b/docs/recipes/prethink/exportcontext.md @@ -36,7 +36,6 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: * [Update Prethink context (no AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextnoaistarter) -* [Update Prethink context (with AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextstarter) * [Update Prethink context](/recipes/prethink/updateprethinkcontext.md) diff --git a/docs/recipes/prethink/updateprethinkcontext.md b/docs/recipes/prethink/updateprethinkcontext.md index e7bbdaf224..62ffcc72e3 100644 --- a/docs/recipes/prethink/updateprethinkcontext.md +++ b/docs/recipes/prethink/updateprethinkcontext.md @@ -76,7 +76,6 @@ recipeList: This recipe is used as part of the following composite recipes: * [Update Prethink context (no AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextnoaistarter) -* [Update Prethink context (with AI)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextstarter) ## Usage diff --git a/docs/recipes/properties/changepropertykey.md b/docs/recipes/properties/changepropertykey.md index 82b808e5b1..0e4fe051f8 100644 --- a/docs/recipes/properties/changepropertykey.md +++ b/docs/recipes/properties/changepropertykey.md @@ -42,6 +42,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Spring Boot Actuator to Quarkus Health and Metrics](/recipes/quarkus/spring/migratespringactuator.md) * [Migrate Spring Cloud Config Client to Quarkus Config](/recipes/quarkus/spring/migratespringcloudconfig.md) * [Migrate from OptaPlanner to Timefold Solver](/recipes/timefold/solver/migration/fromoptaplannertotimefoldsolver.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Quarkus 1.13 migration from Quarkus 1.11](/recipes/quarkus/quarkus1to1_13migration.md) * [Quarkus 2.x migration from Quarkus 1.x](/recipes/quarkus/quarkus2/quarkus1to2migration.md) * [Replace 'camel.main.backlogTracing' with `camel.trace.enabled'](/recipes/apache/camel/upgrade/camel45/traceproperties.md) diff --git a/docs/recipes/python/changemethodname.md b/docs/recipes/python/changemethodname.md index 4d711f6296..8fbbab7788 100644 --- a/docs/recipes/python/changemethodname.md +++ b/docs/recipes/python/changemethodname.md @@ -85,6 +85,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) diff --git a/docs/recipes/python/changetype.md b/docs/recipes/python/changetype.md index 400682cf5b..5b0827d270 100644 --- a/docs/recipes/python/changetype.md +++ b/docs/recipes/python/changetype.md @@ -122,11 +122,13 @@ This recipe is used as part of the following composite recipes: * [Migrate deprecated `javax.xml.bind` packages to `jakarta.xml.bind`](/recipes/java/migrate/jakarta/javaxxmlbindmigrationtojakartaxmlbind.md) * [Migrate from Acegi Security 1.0.x to Spring Security 5.0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security/migrateacegitospringsecurity_5_0) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) * [Migrate from Elasticsearch 8 to 9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * [Migrate from JMockit to Mockito](/recipes/java/testing/jmockit/jmockittomockito.md) * [Migrate from Jakarta annotation API to JSpecify](/recipes/java/jspecify/migratefromjakartaannotationapi.md) * [Migrate from Java Faker to Datafaker](/recipes/java/testing/datafaker/javafakertodatafaker.md) * [Migrate from JetBrains annotations to JSpecify](/recipes/java/jspecify/migratefromjetbrainsannotations.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate from Micrometer annotations to JSpecify](/recipes/java/jspecify/migratefrommicrometerannotations.md) * [Migrate from Micronaut 2.x to 3.x](/recipes/java/micronaut/micronaut2to3migration.md) * [Migrate from Micronaut 4.x to 5.x](/recipes/java/micronaut/micronaut4to5migration.md) @@ -145,6 +147,7 @@ This recipe is used as part of the following composite recipes: * [Migrate from `oracle-xe` to `oracle-free`](/recipes/java/testing/testcontainers/migratetooraclefree.md) * [Migrate from javax annotation API to JSpecify](/recipes/java/jspecify/migratefromjavaxannotationapi.md) * [Migrate from springdoc-openapi-common to springdoc-openapi-starter-common](/recipes/java/springdoc/migratespringdoccommon.md) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Migrate moved types between Camel 3.x and Camel 4.x](/recipes/apache/camel/upgrade/camel40/changetypes.md) * [Migrate packages to modular starters](/recipes/java/spring/boot4/migrateautoconfigurepackages.md) * [Migrate to Apache HttpCore Nio Classes to Apache HttpCore 5.x](/recipes/apache/httpclient5/upgradeapachehttpcore_5_nioclassmapping.md) @@ -216,7 +219,6 @@ This recipe is used as part of the following composite recipes: * [Replace elements of SpringFox's security with Swagger's security models](/recipes/java/spring/doc/securitycontexttosecurityscheme.md) * [Spring Boot 4.0 Module Starter Relocations](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/modulestarterrelocations) * [Spring Security 7 modularization](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/security7/modularizespringsecurity7) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) * [Substitute deprecated Faces Managed Beans](/recipes/oracle/weblogic/rewrite/jakarta/facesmanagedbeansremoved3.md) * [Substitute removed Faces Managed Beans](/recipes/java/migrate/jakarta/facesmanagedbeansremoved.md) * [Tag Enum has been deprecated](/recipes/apache/camel/upgrade/camel41/tracingtag.md) diff --git a/docs/recipes/python/reordermethodarguments.md b/docs/recipes/python/reordermethodarguments.md index 8a4c9fa1c6..a06d207e58 100644 --- a/docs/recipes/python/reordermethodarguments.md +++ b/docs/recipes/python/reordermethodarguments.md @@ -42,6 +42,7 @@ This recipe is used as part of the following composite recipes: * [Migrate Hamcrest assertions to JUnit Jupiter](/recipes/java/testing/hamcrest/migratehamcresttojunit5.md) * [Migrate from EasyMock to Mockito](/recipes/java/testing/easymock/easymocktomockito.md) +* [Migrate from LaunchDarkly to OpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) * [Migrate to ApacheHttpClient 5.x Classes Namespace from 4.x](/recipes/apache/httpclient5/upgradeapachehttpclient_5_classmapping.md) * [Migrates from Jackson 2.x to Jackson 3.x](/recipes/java/jackson/upgradejackson_2_3.md) * [Mockito 3.x migration from 1.x](/recipes/java/testing/mockito/mockito1to3migration.md) diff --git a/docs/recipes/staticanalysis/README.md b/docs/recipes/staticanalysis/README.md index 4d8f655ae1..18b8a9da67 100644 --- a/docs/recipes/staticanalysis/README.md +++ b/docs/recipes/staticanalysis/README.md @@ -22,6 +22,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Replace `org.apache.commons.lang3.Validate#notNull` with `Objects#requireNonNull`](./replacevalidatenotnullhavingsingleargwithobjectsrequirenonnull.md) * [Simplify ternary expressions](./simplifyternaryrecipes.md) * [URL Equals and Hash Code](./urlequalshashcoderecipes.md) +* [Use `String.CASE_INSENSITIVE_ORDER`](./usestringcaseinsensitiveorderrecipes.md) ## Recipes @@ -30,6 +31,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Add missing `@Override` to overriding and implementing methods](./missingoverrideannotation.md) * [Add `serialVersionUID` to a `Serializable` class when missing](./addserialversionuidtoserializable.md) * [Add space after // in single-line comments](./singlelinecommentspacing.md) +* [All branches in a conditional should not have the same implementation](./allbranchesidentical.md) * [Annotate methods which may return `null` with `@Nullable`](./annotatenullablemethods.md) * [Annotate null-checked method parameters with `@Nullable`](./annotatenullableparameters.md) * [Annotate required method parameters with `@NonNull`](./annotaterequiredparameters.md) @@ -37,6 +39,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Avoid boxed boolean expressions](./avoidboxedbooleanexpressions.md) * [`BigDecimal` rounding constants to `RoundingMode` enums](./bigdecimalroundingconstantstoenums.md) * [Boolean checks should not be inverted](./booleanchecksnotinverted.md) +* [Branches with identical implementations should be merged](./mergeidenticalbranches.md) * [CaseInsensitive comparisons do not alter case](./caseinsensitivecomparisonsdonotchangecase.md) * [Catch clause should do more than just rethrow](./catchclauseonlyrethrows.md) * [Chain `StringBuilder.append()` calls](./chainstringbuilderappendcalls.md) @@ -67,11 +70,14 @@ _Recipes that include further recipes, often including the individual recipes be * [Fix missing braces](./needbraces.md) * [Hidden field](./hiddenfield.md) * [Hide utility class constructor](./hideutilityclassconstructor.md) +* [Identical expressions used with logical operators should be simplified](./simplifyredundantlogicalexpression.md) * [Inline variable](./inlinevariable.md) * [Java API best practices](./javaapibestpractices.md) * [Jump statements should not be redundant](./noredundantjumpstatements.md) +* [Map values should not be replaced unconditionally](./removeunconditionalvalueoverwrite.md) * [Mask credit card numbers](./maskcreditcardnumbers.md) * [Members should not have names differing only by capitalization](./membernamecaseinsensitiveduplicates.md) +* [Mergeable "if" statements should be combined](./collapsibleifstatements.md) * [Modifier order](./modifierorder.md) * [Move `@Nullable` method annotations to the return type](./nullableonmethodreturntype.md) * [Nested enums are not static](./nestedenumsarenotstatic.md) @@ -89,6 +95,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Redundant file creation](./redundantfilecreation.md) * [Reformat local variable names to camelCase](./renamelocalvariablestocamelcase.md) * [Reformat private field names to camelCase](./renameprivatefieldstocamelcase.md) +* [Related "if/else if" conditions should not be the same](./removeduplicateconditions.md) * [Remove `@Nullable` and `@CheckForNull` annotations from primitives](./unnecessaryprimitiveannotations.md) * [Remove JavaDoc `@param`, `@return`, and `@throws` with no description](./removeemptyjavadocparameters.md) * [Remove `Object.finalize()` invocations](./removecallstoobjectfinalize.md) @@ -107,6 +114,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Remove unnecessary parentheses](./unnecessaryparentheses.md) * [Remove unneeded assertions](./removeunneededassertion.md) * [Remove unneeded block](./removeunneededblock.md) +* [Remove unreachable `catch` alternatives shadowed by earlier `catch` clauses](./removeunreachablemulticatchalternative.md) * [Remove unused labels](./removeunusedlabels.md) * [Remove unused local variables](./removeunusedlocalvariables.md) * [Remove unused private fields](./removeunusedprivatefields.md) @@ -173,6 +181,8 @@ _Recipes that include further recipes, often including the individual recipes be * [Use Empty Array for `Collection.toArray()`](./replacecollectiontoarrayargwithemptyarray.md) * [Use `Map#containsKey`](./usemapcontainskey.md) * [Use `StandardCharset` constants](./usestandardcharset.md) +* [Use `String.CASE_INSENSITIVE_ORDER` instead of `String::compareToIgnoreCase`](./usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe.md) +* [Use `String.CASE_INSENSITIVE_ORDER` instead of a lambda](./usestringcaseinsensitiveorderrecipes$fromlambdarecipe.md) * [Use `String.contentEquals(CharSequence)` instead of `String.equals(CharSequence.toString())`](./equalstocontentequals.md) * [Use `String.equals()` on `String` literals](./stringliteralequality.md) * [Use `String::replace()` when first parameter is not a real regular expression](./usestringreplace.md) @@ -186,6 +196,7 @@ _Recipes that include further recipes, often including the individual recipes be * [Use primitive wrapper `valueOf` method](./primitivewrapperclassconstructortovalueof.md) * [Use the diamond operator](./usediamondoperator.md) * [Use try-with-resources](./usetrywithresources.md) +* [Variables should not be self-assigned](./removeselfassignment.md) * [Week Year (YYYY) should not be used for date formatting](./replaceweekyearwithyear.md) * [Write octal values as decimal](./writeoctalvaluesasdecimal.md) * [`finalize()` calls super](./objectfinalizecallssuper.md) diff --git a/docs/recipes/staticanalysis/allbranchesidentical.md b/docs/recipes/staticanalysis/allbranchesidentical.md new file mode 100644 index 0000000000..449ac3d5c9 --- /dev/null +++ b/docs/recipes/staticanalysis/allbranchesidentical.md @@ -0,0 +1,121 @@ +--- +title: "All branches in a conditional should not have the same implementation" +sidebar_label: "All branches in a conditional should not have the same implementation" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# All branches in a conditional should not have the same implementation + +**org.openrewrite.staticanalysis.AllBranchesIdentical** + +_When every branch of an `if`/`else` chain executes the same code, the condition serves no purpose and the code block can be used directly._ + +### Tags + +* [RSPEC-S3923](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S3923&open=java%3AS3923) + +## Recipe source + +[GitHub: AllBranchesIdentical.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/AllBranchesIdentical.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/annotatenullablemethods.md b/docs/recipes/staticanalysis/annotatenullablemethods.md index 7c04c258b8..d5f81122ba 100644 --- a/docs/recipes/staticanalysis/annotatenullablemethods.md +++ b/docs/recipes/staticanalysis/annotatenullablemethods.md @@ -32,7 +32,7 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: -* [Compose JSpecify best practices (intra-body nullability inference)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/composejspecifybestpractices) +* [Compose JSpecify best practices (intra-body nullability inference)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/composejspecifybestpractices) * [JSpecify best practices](/recipes/java/jspecify/jspecifybestpractices.md) * [Recipe nullability best practices](/recipes/java/recipes/recipenullabilitybestpractices.md) diff --git a/docs/recipes/staticanalysis/annotatenullableparameters.md b/docs/recipes/staticanalysis/annotatenullableparameters.md index 21b5598406..797ecb8cc1 100644 --- a/docs/recipes/staticanalysis/annotatenullableparameters.md +++ b/docs/recipes/staticanalysis/annotatenullableparameters.md @@ -33,7 +33,7 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: -* [Compose JSpecify best practices (intra-body nullability inference)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/composejspecifybestpractices) +* [Compose JSpecify best practices (intra-body nullability inference)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/composejspecifybestpractices) * [JSpecify best practices](/recipes/java/jspecify/jspecifybestpractices.md) ## Example diff --git a/docs/recipes/staticanalysis/collapsibleifstatements.md b/docs/recipes/staticanalysis/collapsibleifstatements.md new file mode 100644 index 0000000000..87e21d76aa --- /dev/null +++ b/docs/recipes/staticanalysis/collapsibleifstatements.md @@ -0,0 +1,121 @@ +--- +title: "Mergeable "if" statements should be combined" +sidebar_label: "Mergeable "if" statements should be combined" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Mergeable "if" statements should be combined + +**org.openrewrite.staticanalysis.CollapsibleIfStatements** + +_When an `if` statement body contains only another `if` with no `else`, the two conditions can be combined with `&&`. Merging the conditions reduces nesting and makes the code easier to read._ + +### Tags + +* [RSPEC-S1066](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S1066&open=java%3AS1066) + +## Recipe source + +[GitHub: CollapsibleIfStatements.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/CollapsibleIfStatements.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/mergeidenticalbranches.md b/docs/recipes/staticanalysis/mergeidenticalbranches.md new file mode 100644 index 0000000000..a9066731bf --- /dev/null +++ b/docs/recipes/staticanalysis/mergeidenticalbranches.md @@ -0,0 +1,121 @@ +--- +title: "Branches with identical implementations should be merged" +sidebar_label: "Branches with identical implementations should be merged" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Branches with identical implementations should be merged + +**org.openrewrite.staticanalysis.MergeIdenticalBranches** + +_When two consecutive branches of an `if`/`else if` chain execute the same code, they can be merged by combining their conditions with `||`. This removes duplication and makes the intent clearer._ + +### Tags + +* [RSPEC-S1871](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S1871&open=java%3AS1871) + +## Recipe source + +[GitHub: MergeIdenticalBranches.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/MergeIdenticalBranches.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/nullableonmethodreturntype.md b/docs/recipes/staticanalysis/nullableonmethodreturntype.md index 5635513dfb..1d38dc1db9 100644 --- a/docs/recipes/staticanalysis/nullableonmethodreturntype.md +++ b/docs/recipes/staticanalysis/nullableonmethodreturntype.md @@ -28,7 +28,6 @@ This recipe is used as part of the following composite recipes: * [JSpecify best practices](/recipes/java/jspecify/jspecifybestpractices.md) * [Recipe nullability best practices](/recipes/java/recipes/recipenullabilitybestpractices.md) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) ## Example diff --git a/docs/recipes/staticanalysis/removeduplicateconditions.md b/docs/recipes/staticanalysis/removeduplicateconditions.md new file mode 100644 index 0000000000..75ef779a56 --- /dev/null +++ b/docs/recipes/staticanalysis/removeduplicateconditions.md @@ -0,0 +1,121 @@ +--- +title: "Related "if/else if" conditions should not be the same" +sidebar_label: "Related "if/else if" conditions should not be the same" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Related "if/else if" conditions should not be the same + +**org.openrewrite.staticanalysis.RemoveDuplicateConditions** + +_When an `if`/`else if` chain contains the same condition more than once, the second branch can never execute because the first matching branch always wins. The duplicate branch is dead code and should be removed._ + +### Tags + +* [RSPEC-S1862](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S1862&open=java%3AS1862) + +## Recipe source + +[GitHub: RemoveDuplicateConditions.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/RemoveDuplicateConditions.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/removeselfassignment.md b/docs/recipes/staticanalysis/removeselfassignment.md new file mode 100644 index 0000000000..1d023f8ab1 --- /dev/null +++ b/docs/recipes/staticanalysis/removeselfassignment.md @@ -0,0 +1,121 @@ +--- +title: "Variables should not be self-assigned" +sidebar_label: "Variables should not be self-assigned" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Variables should not be self-assigned + +**org.openrewrite.staticanalysis.RemoveSelfAssignment** + +_Self-assignments such as `x = x` have no effect and indicate a copy-paste error or typo where the left-hand or right-hand side should reference a different variable._ + +### Tags + +* [RSPEC-S1656](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S1656&open=java%3AS1656) + +## Recipe source + +[GitHub: RemoveSelfAssignment.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/RemoveSelfAssignment.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/removeunconditionalvalueoverwrite.md b/docs/recipes/staticanalysis/removeunconditionalvalueoverwrite.md new file mode 100644 index 0000000000..2dde13f9dd --- /dev/null +++ b/docs/recipes/staticanalysis/removeunconditionalvalueoverwrite.md @@ -0,0 +1,121 @@ +--- +title: "Map values should not be replaced unconditionally" +sidebar_label: "Map values should not be replaced unconditionally" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Map values should not be replaced unconditionally + +**org.openrewrite.staticanalysis.RemoveUnconditionalValueOverwrite** + +_When `map.put(key, value)` is called twice in a row with the same key, the first call is dead code because its value is immediately overwritten. Remove the first call to make the intent clear._ + +### Tags + +* [RSPEC-S4143](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S4143&open=java%3AS4143) + +## Recipe source + +[GitHub: RemoveUnconditionalValueOverwrite.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/RemoveUnconditionalValueOverwrite.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/removeunreachablemulticatchalternative.md b/docs/recipes/staticanalysis/removeunreachablemulticatchalternative.md new file mode 100644 index 0000000000..9b315bb7bc --- /dev/null +++ b/docs/recipes/staticanalysis/removeunreachablemulticatchalternative.md @@ -0,0 +1,117 @@ +--- +title: "Remove unreachable `catch` alternatives shadowed by earlier `catch` clauses" +sidebar_label: "Remove unreachable `catch` alternatives shadowed by earlier `catch` clauses" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Remove unreachable `catch` alternatives shadowed by earlier `catch` clauses + +**org.openrewrite.staticanalysis.RemoveUnreachableMultiCatchAlternative** + +_When an earlier `catch` clause already covers a type, any later `catch` (including a multi-catch alternative) for the same type or a subtype is unreachable and is a Java compile error. This commonly appears after type-substitution migrations (for example, renaming an exception so that two `catch` clauses end up overlapping). This recipe drops the unreachable alternatives from later multi-catches, collapses a multi-catch to a regular `catch` when only one alternative remains, and removes the entire `catch` clause when all of its declared types are already covered._ + +## Recipe source + +[GitHub: RemoveUnreachableMultiCatchAlternative.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/RemoveUnreachableMultiCatchAlternative.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/simplifyredundantlogicalexpression.md b/docs/recipes/staticanalysis/simplifyredundantlogicalexpression.md new file mode 100644 index 0000000000..d0d932b984 --- /dev/null +++ b/docs/recipes/staticanalysis/simplifyredundantlogicalexpression.md @@ -0,0 +1,121 @@ +--- +title: "Identical expressions used with logical operators should be simplified" +sidebar_label: "Identical expressions used with logical operators should be simplified" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Identical expressions used with logical operators should be simplified + +**org.openrewrite.staticanalysis.SimplifyRedundantLogicalExpression** + +_When the same expression appears on both sides of `&&`, `||`, `&`, or `|`, the result is always equal to that expression. For example, `x && x` is always just `x`. This is typically a copy-paste error where one side should have been different._ + +### Tags + +* [RSPEC-S1764](https://next.sonarqube.com/sonarqube/coding_rules?languages=java&q=S1764&open=java%3AS1764) + +## Recipe source + +[GitHub: SimplifyRedundantLogicalExpression.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/SimplifyRedundantLogicalExpression.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/unnecessaryprimitiveannotations.md b/docs/recipes/staticanalysis/unnecessaryprimitiveannotations.md index 6c567ec717..bc102e0c1f 100644 --- a/docs/recipes/staticanalysis/unnecessaryprimitiveannotations.md +++ b/docs/recipes/staticanalysis/unnecessaryprimitiveannotations.md @@ -31,7 +31,6 @@ This recipe is available under the [Moderne Source Available License](https://do This recipe is used as part of the following composite recipes: * [Common static analysis issues](/recipes/staticanalysis/commonstaticanalysis.md) -* [Standardize nullability annotations to JSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) ## Example diff --git a/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$fromlambdarecipe.md b/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$fromlambdarecipe.md new file mode 100644 index 0000000000..29ef4bf665 --- /dev/null +++ b/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$fromlambdarecipe.md @@ -0,0 +1,124 @@ +--- +title: "Use `String.CASE_INSENSITIVE_ORDER` instead of a lambda" +sidebar_label: "Use `String.CASE_INSENSITIVE_ORDER` instead of a lambda" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Use `String.CASE_INSENSITIVE_ORDER` instead of a lambda + +**org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromLambdaRecipe** + +_Replace `(a, b) -> a.compareToIgnoreCase(b)` with `String.CASE_INSENSITIVE_ORDER` when used as a `Comparator`._ + +## Recipe source + +[GitHub: UseStringCaseInsensitiveOrder.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/UseStringCaseInsensitiveOrder.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Use `String.CASE_INSENSITIVE_ORDER`](/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe.md b/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe.md new file mode 100644 index 0000000000..a90765f420 --- /dev/null +++ b/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe.md @@ -0,0 +1,124 @@ +--- +title: "Use `String.CASE_INSENSITIVE_ORDER` instead of `String::compareToIgnoreCase`" +sidebar_label: "Use `String.CASE_INSENSITIVE_ORDER` instead of `String::compareToIgnoreCase`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Use `String.CASE_INSENSITIVE_ORDER` instead of `String::compareToIgnoreCase` + +**org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromMethodReferenceRecipe** + +_Replace the method reference `String::compareToIgnoreCase` with `String.CASE_INSENSITIVE_ORDER` when used as a `Comparator`._ + +## Recipe source + +[GitHub: UseStringCaseInsensitiveOrder.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/UseStringCaseInsensitiveOrder.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Used by + +This recipe is used as part of the following composite recipes: + +* [Use `String.CASE_INSENSITIVE_ORDER`](/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md) + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md b/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md new file mode 100644 index 0000000000..c7bf7691af --- /dev/null +++ b/docs/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md @@ -0,0 +1,147 @@ +--- +title: "Use `String.CASE_INSENSITIVE_ORDER`" +sidebar_label: "Use `String.CASE_INSENSITIVE_ORDER`" +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import RunRecipe from '@site/src/components/RunRecipe'; + +# Use `String.CASE_INSENSITIVE_ORDER` + +**org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes** + +_Replaces case-insensitive string comparator lambdas and method references with the JDK constant `String.CASE_INSENSITIVE_ORDER`. Improves readability and removes one closure allocation per call site._ + +## Recipe source + +[GitHub: UseStringCaseInsensitiveOrder.java](https://github.com/openrewrite/rewrite-static-analysis/blob/main/src/main/java/org/openrewrite/staticanalysis/UseStringCaseInsensitiveOrder.java), +[Issue Tracker](https://github.com/openrewrite/rewrite-static-analysis/issues), +[Maven Central](https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-static-analysis/) + +:::info +This recipe is composed of more than one recipe. If you want to customize the set of recipes this is composed of, you can find and copy the GitHub source for the recipe from the link above. +::: + +This recipe is available under the [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license). + + +## Definition + + + +* [Use `String.CASE_INSENSITIVE_ORDER` instead of a lambda](../staticanalysis/usestringcaseinsensitiveorderrecipes$fromlambdarecipe) +* [Use `String.CASE_INSENSITIVE_ORDER` instead of `String::compareToIgnoreCase`](../staticanalysis/usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe) + + + + + +```yaml +--- +type: specs.openrewrite.org/v1beta/recipe +name: org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes +displayName: Use `String.CASE_INSENSITIVE_ORDER` +description: | + Replaces case-insensitive string comparator lambdas and method references with the JDK constant `String.CASE_INSENSITIVE_ORDER`. Improves readability and removes one closure allocation per call site. +recipeList: + - org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromLambdaRecipe + - org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromMethodReferenceRecipe + +``` + + + +## Usage + + + +## See how this recipe works across multiple open-source repositories + +import RecipeCallout from '@site/src/components/ModerneLink'; + + + +The community edition of the Moderne platform enables you to easily run recipes across thousands of open-source repositories. + +Please [contact Moderne](https://moderne.io/product) for more information about safely running the recipes on your own codebase in a private SaaS. +## Data Tables + + + + +### Source files that had results +**org.openrewrite.table.SourcesFileResults** + +_Source files that were modified by the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path before the run | The source path of the file before the run. `null` when a source file was created during the run. | +| Source path after the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. | +| Recipe that made changes | The specific recipe that made a change. | +| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. | +| Cycle | The recipe cycle in which the change was made. | + + + + + +### Source files that had search results +**org.openrewrite.table.SearchResults** + +_Search results that were found during the recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path of search result before the run | The source path of the file with the search result markers present. | +| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run. | +| Result | The trimmed printed tree of the LST element that the marker is attached to. | +| Description | The content of the description of the marker. | +| Recipe that added the search marker | The specific recipe that added the Search marker. | + + + + + +### Source files that errored on a recipe +**org.openrewrite.table.SourcesFileErrors** + +_The details of all errors produced by a recipe run._ + +| Column Name | Description | +| ----------- | ----------- | +| Source path | The file that failed to parse. | +| Recipe that made changes | The specific recipe that made a change. | +| Stack trace | The stack trace of the failure. | + + + + + +### Recipe performance +**org.openrewrite.table.RecipeRunStats** + +_Statistics used in analyzing the performance of recipes._ + +| Column Name | Description | +| ----------- | ----------- | +| The recipe | The recipe whose stats are being measured both individually and cumulatively. | +| Source file count | The number of source files the recipe ran over. | +| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. | +| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. | +| Max scanning time (ns) | The max time scanning any one source file. | +| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. | +| Max edit time (ns) | The max time editing any one source file. | + + + + diff --git a/docs/recipes/text/findandreplace.md b/docs/recipes/text/findandreplace.md index b44822fa48..f9149d91b6 100644 --- a/docs/recipes/text/findandreplace.md +++ b/docs/recipes/text/findandreplace.md @@ -42,6 +42,7 @@ This recipe is used as part of the following composite recipes: * [Faces XHTML migration for Jakarta EE 10](/recipes/java/migrate/jakarta/jakartafacesxhtmlee10.md) * [Faces XHTML migration for Jakarta EE 9](/recipes/java/migrate/jakarta/jakartafacesxhtmlee9.md) * [Faces XHTML migration for Jakarta EE 9](/recipes/oracle/weblogic/rewrite/jakarta/jakartafaces3xhtml.md) +* [Migrate .NET install URLs from retiring Azure CDN domains](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/dotnet/migratedotnetinstallurls) * [Migrate JSF values inside EcmaScript files](/recipes/java/migrate/jakarta/jakartafacesecmascript.md) * [Migrate JSF variable-resolver to el-resolver](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/framework/jsf23/migratefacesconfig) * [Migrate RichFaces tags in `xhtml` files](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/jsf/richfaces/update45/updatexhtmltags) diff --git a/docs/recipes/yaml/changepropertykey.md b/docs/recipes/yaml/changepropertykey.md index 0bd089bb7f..f65daae424 100644 --- a/docs/recipes/yaml/changepropertykey.md +++ b/docs/recipes/yaml/changepropertykey.md @@ -37,6 +37,7 @@ This recipe is available under the [Apache License Version 2.0](https://www.apac This recipe is used as part of the following composite recipes: * [Migrate Dropwizard to Spring Boot 3](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/dropwizard/boot/migratedropwizardtospringboot3) +* [Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) * [Migrate to Kubernetes API v1.29](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/kubernetes/migrate/migratetoapiv1_29) * [Renamed streamCaching to streamCache on the route](/recipes/apache/camel/upgrade/camel46/yamstreamcaching.md) * [Update Apache Camel configurations keys](/recipes/apache/camel/upgrade/customrecipes/propertiesandyamlkeyupdate.md) diff --git a/docs/reference/all-recipes-org-openrewrite-recipe.md b/docs/reference/all-recipes-org-openrewrite-recipe.md index 29b86802d1..f5e4289238 100644 --- a/docs/reference/all-recipes-org-openrewrite-recipe.md +++ b/docs/reference/all-recipes-org-openrewrite-recipe.md @@ -1792,7 +1792,7 @@ _10 recipes_ _License: Moderne Source Available License_ -_27 recipes_ +_33 recipes_ * [org.openrewrite.featureflags.RemoveBooleanFlag](/recipes/featureflags/removebooleanflag.md) * **Remove a boolean feature flag for feature key** @@ -1815,6 +1815,24 @@ _27 recipes_ * [org.openrewrite.featureflags.launchdarkly.ChangeVariationDefault](/recipes/featureflags/launchdarkly/changevariationdefault.md) * **Change the default value for feature key** * Change the default value for `Variation` invocations for feature key. +* [org.openrewrite.featureflags.launchdarkly.MarkIncompatibleEvaluationDetailAccessors](/recipes/featureflags/launchdarkly/markincompatibleevaluationdetailaccessors.md) + * **Mark incompatible LaunchDarkly `EvaluationDetail` accessors** + * OpenFeature's `FlagEvaluationDetails` does not offer a direct replacement for every `EvaluationDetail` accessor. Add a `TODO` comment on `getVariationIndex()`, `isDefaultValue()` and `getReason()` calls so they are migrated by hand, since `getVariationIndex()` and `isDefaultValue()` have no equivalent and `getReason()` returns a `String` rather than an `EvaluationReason`. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDClientLifecycle](/recipes/featureflags/launchdarkly/migrateldclientlifecycle.md) + * **Migrate LaunchDarkly `LDClient` lifecycle calls to OpenFeature** + * Migrate `LDClient` lifecycle calls: `close()` becomes `OpenFeatureAPI.getInstance().shutdown()` and `isInitialized()` becomes `OpenFeatureAPI.getInstance().getClient().getProviderState() == ProviderState.READY`. OpenFeature manages provider state globally rather than per client instance, so the original receiver is dropped. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDClientToOpenFeature](/recipes/featureflags/launchdarkly/migrateldclienttoopenfeature.md) + * **Migrate LaunchDarkly `LDClient` construction to OpenFeature** + * Replace `new LDClient(...)` with `OpenFeatureAPI.getInstance().getClient()`. When the client is assigned to a local variable, the one-time provider bootstrap `OpenFeatureAPI.getInstance().setProviderAndWait(new Provider(...))` is generated from the original SDK key and configuration. In other positions (such as fields) the original configuration is preserved in a `TODO` comment instead, as a statement cannot be inserted there. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDContextToEvaluationContext](/recipes/featureflags/launchdarkly/migrateldcontexttoevaluationcontext.md) + * **Migrate LaunchDarkly `LDContext` to OpenFeature `MutableContext`** + * Convert `LDContext.create(...)` and `LDContext.builder(...)` construction to OpenFeature's `MutableContext`, mapping `name(...)` and `set(...)` attributes to `add(...)` and dropping the terminal `build()` call. Targeting `kind`, multi-context and private attributes are left untouched for manual review. +* [org.openrewrite.featureflags.launchdarkly.MigrateLDValueToValue](/recipes/featureflags/launchdarkly/migrateldvaluetovalue.md) + * **Migrate LaunchDarkly `LDValue` and `jsonValueVariation` to OpenFeature** + * Migrate `jsonValueVariation`/`jsonValueVariationDetail` to OpenFeature's `getObjectValue`/`getObjectDetails` (reordering the context argument to last) and convert scalar `LDValue.of(...)` and `LDValue.ofNull()` defaults to `dev.openfeature.sdk.Value`. To keep the result compilable, this recipe is skipped for files that use the structured builders `LDValue.buildObject()`, `LDValue.buildArray()`, `LDValue.parse(...)` or `LDValue.of(long)`, which require manual migration to `Structure`/`List<Value>`. +* [org.openrewrite.featureflags.launchdarkly.MigrateLaunchDarklyToOpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + * **Migrate from LaunchDarkly to OpenFeature** + * Migrate call sites from the LaunchDarkly server SDK to the vendor-neutral [OpenFeature](https://openfeature.dev/) API, backed by the LaunchDarkly OpenFeature provider. Flag evaluations are renamed and their arguments reordered (LaunchDarkly takes the context as the second argument; OpenFeature takes it last), `LDContext` construction becomes `MutableContext`, and `LDClient` becomes `dev.openfeature.sdk.Client`. The one-time provider bootstrap (`OpenFeatureAPI.setProviderAndWait(...)`) is intentionally left for manual configuration. * [org.openrewrite.featureflags.launchdarkly.MigrateUserToContext](/recipes/featureflags/launchdarkly/migrateusertocontext.md) * **Migrate `LDUser` to `LDContext`** * Migrate from `LDUser` and `LDUser.Builder` to `LDContext` and `ContextBuilder`. @@ -1880,7 +1898,7 @@ _27 recipes_ _License: Moderne Source Available License_ -_54 recipes_ +_55 recipes_ * [org.openrewrite.github.AddCronTrigger](/recipes/github/addcrontrigger.md) * **Add cron workflow trigger** @@ -1917,7 +1935,7 @@ _54 recipes_ * Find GitHub Actions jobs missing a timeout. * [org.openrewrite.github.GitHubActionsBestPractices](/recipes/github/githubactionsbestpractices.md) * **GitHub Actions best practices** - * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, and preferring block-style job dependencies. + * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, preferring block-style job dependencies, and upgrading official actions to their latest versions. * [org.openrewrite.github.IsGitHubActionsWorkflow](/recipes/github/isgithubactionsworkflow.md) * **Is GitHub Actions Workflow** * Checks if the file is a GitHub Actions workflow file. @@ -1972,6 +1990,9 @@ _54 recipes_ * [org.openrewrite.github.SetupPythonToUv](/recipes/github/setuppythontouv.md) * **Replace `actions/setup-python` with `astral-sh/setup-uv`** * Replace `actions/setup-python` action with `astral-sh/setup-uv` action for faster Python environment setup and dependency management. **Benefits of UV:** - Significantly faster package installation and environment setup - Built-in dependency resolution and locking - Integrated caching for improved CI performance - Drop-in replacement for pip workflows **Transformations applied:** - `actions/setup-python@v5` → `astral-sh/setup-uv@v6` - `cache: 'pip'` → `enable-cache: 'true'` - `pip install -r requirements.txt` → `uv sync` (configurable strategy) - `python -m <module>` → `uv run <module>` - Removes unnecessary `pip install --upgrade pip` steps **Sync strategies:** - `basic`: Basic synchronization (`uv sync`) - `locked`: Use locked dependencies (`uv sync --locked`) - `full`: Install all extras and dev dependencies (`uv sync --all-extras --dev`) See the [UV GitHub integration guide](https://docs.astral.sh/uv/guides/integration/github/) for more details. +* [org.openrewrite.github.UpgradeOfficialGitHubActions](/recipes/github/upgradeofficialgithubactions.md) + * **Upgrade official GitHub Actions to their latest versions** + * Upgrades actions from the official `actions` and `github` organizations to the newest known version, working entirely offline. Each reference is upgraded while preserving its existing precision: a major version (`v4`) moves to the newest major, a full version (`v4.1.2`) to the newest full version, and a commit SHA to the latest known commit. Actions that are not official, not known, or already up to date are left untouched. * [org.openrewrite.github.UpgradeSlackNotificationVersion2](/recipes/github/upgradeslacknotificationversion2.md) * **Upgrade `slackapi/slack-github-action`** * Update the Slack GitHub Action to use version 2.0. @@ -2207,7 +2228,7 @@ _26 recipes_ _License: Apache License Version 2.0_ -_42 recipes_ +_44 recipes_ * [org.openrewrite.java.jackson.AddJsonCreatorToPrivateConstructors](/recipes/java/jackson/addjsoncreatortoprivateconstructors.md) * **Add `@JsonCreator` to non-public constructors** @@ -2233,6 +2254,9 @@ _42 recipes_ * [org.openrewrite.java.jackson.JacksonBestPractices](/recipes/java/jackson/jacksonbestpractices.md) * **Jackson best practices** * Apply best practices for using Jackson library, including upgrade to Jackson 2.x and removing redundant annotations. +* [org.openrewrite.java.jackson.JsonSerializeIncludeToJsonInclude](/recipes/java/jackson/jsonserializeincludetojsoninclude.md) + * **Migrate deprecated `@JsonSerialize(include = ...)` to `@JsonInclude`** + * Move the deprecated `include` attribute of FasterXML's `@JsonSerialize` to a separate `@JsonInclude` annotation. The `include` attribute was deprecated in Jackson 2.x and removed in Jackson 3.x; running this recipe before the Jackson 2 → 3 package rename produces a correct `tools.jackson.annotation.JsonInclude` on the Jackson 3 side. * [org.openrewrite.java.jackson.LombokJacksonizedConfig](/recipes/java/jackson/lombokjacksonizedconfig.md) * **Update `lombok.config` for Jackson 3 compatibility** * When `@Jacksonized` is used, Lombok generates Jackson annotations. By default it generates Jackson 2.x annotations. This recipe adds `lombok.jacksonized.jacksonVersion += 3` to `lombok.config` so Lombok generates Jackson 3 compatible annotations. @@ -2242,6 +2266,9 @@ _42 recipes_ * [org.openrewrite.java.jackson.MigrateMapperSettersToBuilder](/recipes/java/jackson/migratemappersetterstobuilder.md) * **Migrate mapper setter calls to builder pattern** * In Jackson 3, `JsonMapper` and other format-aligned mappers are immutable. Configuration methods like `setFilterProvider`, `addMixIn`, `disable`, `enable`, etc. must be called on the builder instead. This recipe migrates setter calls to the builder pattern when safe, or adds TODO comments when automatic migration is not possible. +* [org.openrewrite.java.jackson.ReadValueUrlToOpenStream](/recipes/java/jackson/readvalueurltoopenstream.md) + * **Migrate `ObjectMapper.readValue(URL, ...)` to use `openStream()`** + * Jackson 3.x removed every `URL`-accepting `readValue` overload from `ObjectMapper`. Rewrite call sites to feed `URL.openStream()` into the surviving `readValue(InputStream, ...)` overload, which is what `readValue(URL, ...)` did internally in Jackson 2.x. The caller's checked-exception story is unchanged: `URL.openStream()` declares `IOException`, the same checked exception the removed `readValue(URL, ...)` declared. * [org.openrewrite.java.jackson.RemoveBuiltInModuleRegistrations](/recipes/java/jackson/removebuiltinmoduleregistrations.md) * **Remove registrations of modules built-in to Jackson 3** * In Jackson 3, `ParameterNamesModule`, `Jdk8Module`, and `JavaTimeModule` are built into `jackson-databind` and no longer need to be registered manually. This recipe removes `ObjectMapper.registerModule()` and `MapperBuilder.addModule()` calls for these modules. @@ -3091,7 +3118,7 @@ _39 recipes_ _License: Moderne Source Available License_ -_459 recipes_ +_467 recipes_ * [com.google.guava.InlineGuavaMethods](/recipes/google/guava/inlineguavamethods.md) * **Inline `guava` methods annotated with `@InlineMe`** @@ -3146,7 +3173,7 @@ _459 recipes_ * Adds a maven jar plugin that's configured to suppress Illegal Reflection Warnings. * [org.openrewrite.java.migrate.AddSurefireFailsafeArgLine](/recipes/java/migrate/addsurefirefailsafeargline.md) * **Add `argLine` to surefire and failsafe plugins** - * Adds the specified arguments to the `argLine` configuration of the Maven Surefire and Failsafe plugins, merging with any existing argLine value without duplicating arguments. + * Adds the specified arguments to the `argLine` configuration of the Maven Surefire and Failsafe plugins, merging with any existing argLine value without duplicating arguments. The `@\{argLine\}` [late property reference](https://maven.apache.org/surefire/maven-surefire-plugin/faq.html) is prepended so that an agent injected by another plugin during the build, such as the JaCoCo coverage agent from `jacoco-maven-plugin:prepare-agent`, is preserved rather than overwritten. It is not added when the existing `argLine` already references the `argLine` property. * [org.openrewrite.java.migrate.ArrayStoreExceptionToTypeNotPresentException](/recipes/java/migrate/arraystoreexceptiontotypenotpresentexception.md) * **Catch `TypeNotPresentException` thrown by `Class.getAnnotation()`** * Replace catch blocks for `ArrayStoreException` around `Class.getAnnotation()` with `TypeNotPresentException` to ensure compatibility with Java 11+. @@ -3174,6 +3201,12 @@ _459 recipes_ * [org.openrewrite.java.migrate.ComIntelliJAnnotationsToOrgJetbrainsAnnotations](/recipes/java/migrate/comintellijannotationstoorgjetbrainsannotations.md) * **Migrate com.intellij:annotations to org.jetbrains:annotations** * This recipe will upgrade old dependency of com.intellij:annotations to the newer org.jetbrains:annotations. +* [org.openrewrite.java.migrate.CommentJava24KotlinCap](/recipes/java/migrate/commentjava24kotlincap.md) + * **Explain why the Java version was capped at 24 for Kotlin modules** + * Adds an explanatory comment to Maven `pom.xml` files in modules that were held at Java 24 because they compile Kotlin and depend on `kotlin-stdlib` older than 2.3, which cannot target Java 25 bytecode. The comment names the `kotlin-stdlib` version found and the next step needed to reach Java 25. Self-healing: the comment is added while the module is at Java 24 and removed again once the module reaches a higher Java version (for instance after its Kotlin was upgraded to 2.3), so it only ever remains on modules that truly stay at Java 24 — whether a Kotlin 1.x cap or a 2.0-2.2 module whose Kotlin upgrade could not be applied. Intended to run last, scoped to modules that compile Kotlin. +* [org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24](/recipes/java/migrate/commentkotlinmodulescappedatjava24.md) + * **Comment Kotlin modules capped at Java 24** + * Adds an explanatory comment to Kotlin modules that remain at Java 24 after the Java 25 migration, because Kotlin before 2.3 cannot target Java 25 bytecode. This covers both a Kotlin 1.x cap (which cannot be upgraded automatically) and a Kotlin 2.0-2.2 module whose upgrade to 2.3 could not be applied. Scoped to modules that actually compile Kotlin (i.e. contain `.kt` source files); the comment is self-healing, so a module that does reach Java 25 has it removed. * [org.openrewrite.java.migrate.DeleteDeprecatedFinalize](/recipes/java/migrate/deletedeprecatedfinalize.md) * **Avoid using the deprecated empty `finalize()` method in `java.desktop`** * The java.desktop module had a few implementations of finalize() that did nothing and have been removed. This recipe will remove these methods. @@ -3336,9 +3369,9 @@ _459 recipes_ * [org.openrewrite.java.migrate.UpgradeBuildToJava21](/recipes/java/migrate/upgradebuildtojava21.md) * **Upgrade build to Java 21** * Updates build files to use Java 21 as the target/source. -* [org.openrewrite.java.migrate.UpgradeBuildToJava24](/recipes/java/migrate/upgradebuildtojava24.md) - * **Upgrade build to Java 24 for Kotlin pre-2.3** - * Kotlin versions before 2.3 only support up to Java 24. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap. +* [org.openrewrite.java.migrate.UpgradeBuildToJava24ForKotlin1x](/recipes/java/migrate/upgradebuildtojava24forkotlin1x.md) + * **Upgrade build to Java 24 for Kotlin 1.x** + * Kotlin versions before 2.3 only support up to Java 24, and Kotlin 1.x cannot be safely upgraded automatically because crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change. Such modules are therefore capped at Java 24 and annotated with an explanation. Modules already on Kotlin 2.0-2.2 are instead bumped to Kotlin 2.3 by `UpgradeKotlinForJava25` so they can reach Java 25. Applies only to modules that actually compile Kotlin (i.e. contain `.kt` source files), so transitive `kotlin-stdlib` dependencies do not trigger the cap. * [org.openrewrite.java.migrate.UpgradeBuildToJava25](/recipes/java/migrate/upgradebuildtojava25.md) * **Upgrade build to Java 25 (non-Kotlin)** * Upgrades build files to Java 25 for modules without Kotlin source files. This covers pure Java projects, including those that only pick up `kotlin-stdlib` transitively through another dependency. @@ -3351,6 +3384,9 @@ _459 recipes_ * [org.openrewrite.java.migrate.UpgradeJavaVersion](/recipes/java/migrate/upgradejavaversion.md) * **Upgrade Java version** * Upgrade build plugin configuration to use the specified Java version. This recipe changes `java.toolchain.languageVersion` in `build.gradle(.kts)` of gradle projects, or maven-compiler-plugin target version and related settings. Will not downgrade if the version is newer than the specified version. +* [org.openrewrite.java.migrate.UpgradeKotlinForJava25](/recipes/java/migrate/upgradekotlinforjava25.md) + * **Upgrade Kotlin to 2.3 for Java 25 compatibility** + * Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3. * [org.openrewrite.java.migrate.UpgradeKotlinJvmTargetVersion](/recipes/java/migrate/upgradekotlinjvmtargetversion.md) * **Upgrade Kotlin `jvmTarget` to match the Java version** * Align the Kotlin `jvmTarget` with the project's Java version so the Kotlin compiler emits bytecode at the same level as `javac`. Covers `kotlin-maven-plugin` `<jvmTarget>` configuration and the Gradle `kotlinOptions \{ jvmTarget = ... \}` / `compilerOptions \{ jvmTarget = ... \}` blocks (Groovy and Kotlin DSL). Will not downgrade if the existing Kotlin target is higher than the requested version. @@ -3873,6 +3909,12 @@ _459 recipes_ * [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta10](/recipes/java/migrate/jakarta/migratepluginsforjakarta10.md) * **Update Plugins for Jakarta EE 10** * Update plugin to be compatible with Jakarta EE 10. +* [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta11](/recipes/java/migrate/jakarta/migratepluginsforjakarta11.md) + * **Update Plugins for Jakarta EE 11** + * Update plugins to be compatible with Jakarta EE 11. +* [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta9](/recipes/java/migrate/jakarta/migratepluginsforjakarta9.md) + * **Update Plugins for Jakarta EE 9** + * Update plugins to be compatible with Jakarta EE 9. * [org.openrewrite.java.migrate.jakarta.MigrationToJakarta10Apis](/recipes/java/migrate/jakarta/migrationtojakarta10apis.md) * **Migrate Jakarta EE 9 api dependencies to Jakarta EE 10 versions** * Jakarta EE 10 updates some apis compared to Jakarta EE 9. @@ -3906,6 +3948,9 @@ _459 recipes_ * [org.openrewrite.java.migrate.jakarta.RemovedUIComponentConstant](/recipes/java/migrate/jakarta/removeduicomponentconstant.md) * **Replace `CURRENT_COMPONENT` and `CURRENT_COMPOSITE_COMPONENT` with `getCurrentComponent()` and `getCurrentCompositeComponent()`** * Replace `jakarta.faces.component.UIComponent.CURRENT_COMPONENT` and `CURRENT_COMPOSITE_COMPONENT` constants with `jakarta.faces.component.UIComponent.getCurrentComponent()` and `getCurrentCompositeComponent()`. that were added in JSF 2.0. +* [org.openrewrite.java.migrate.jakarta.ReplaceJakartaJwsWithJakartaXmlWs](/recipes/java/migrate/jakarta/replacejakartajwswithjakartaxmlws.md) + * **Replace `jakarta.jws-api` with `jakarta.xml.ws-api`** + * Starting with Jakarta EE 10, the standalone `jakarta.jws-api` artifact was retired and its content was merged into `jakarta.xml.ws-api`. This recipe replaces a declared `jakarta.jws:jakarta.jws-api` dependency in place with `jakarta.xml.ws:jakarta.xml.ws-api`, and adds `jakarta.xml.ws:jakarta.xml.ws-api` directly when `jakarta.jws` was only available transitively. * [org.openrewrite.java.migrate.jakarta.RestAssuredJavaxToJakarta](/recipes/java/migrate/jakarta/restassuredjavaxtojakarta.md) * **Migrate RestAssured from javax to jakarta namespace by upgrading to a version compatible with J2EE9** * Java EE has been rebranded to Jakarta EE. This recipe replaces existing RestAssured dependencies with their counterparts that are compatible with Jakarta EE 9. @@ -3984,6 +4029,9 @@ _459 recipes_ * [org.openrewrite.java.migrate.jakarta.UpgradeFaces4OpenSourceLibraries](/recipes/java/migrate/jakarta/upgradefaces4opensourcelibraries.md) * **Upgrade Faces open source libraries** * Upgrade PrimeFaces, OmniFaces, and MyFaces libraries to Jakarta EE10 versions. +* [org.openrewrite.java.migrate.jakarta.UpgradeMavenEjbPluginConfiguration](/recipes/java/migrate/jakarta/upgrademavenejbpluginconfiguration.md) + * **Set `maven-ejb-plugin` ejbVersion to 4.0** + * Updates the `<ejbVersion>` configuration of `maven-ejb-plugin` to `4.0` when the current value (or its resolved Maven property) indicates EJB 3.x. Handles the common pattern where `<ejbVersion>` is coupled to the `javax.ejb-api` dependency version via a shared property, decoupling them after migration. * [org.openrewrite.java.migrate.jakarta.WsWsocServerContainerDeprecation](/recipes/java/migrate/jakarta/wswsocservercontainerdeprecation.md) * **Replace `doUpgrade(..)` with `ServerContainer.upgradeHttpToWebSocket(..)`** * Deprecated `WsWsocServerContainer.doUpgrade(..)` is replaced by the Jakarta WebSocket 2.1 specification `ServerContainer.upgradeHttpToWebSocket(..)`. @@ -4128,6 +4176,9 @@ _459 recipes_ * [org.openrewrite.java.migrate.lang.ExplicitRecordImport](/recipes/java/migrate/lang/explicitrecordimport.md) * **Add explicit import for `Record` classes** * Add explicit import for `Record` classes when upgrading past Java 14+, to avoid conflicts with `java.lang.Record`. +* [org.openrewrite.java.migrate.lang.ExtractExplicitConstructorInvocationArguments](/recipes/java/migrate/lang/extractexplicitconstructorinvocationarguments.md) + * **Extract complex `super(..)` and `this(..)` arguments into local variables** + * [JEP 513](https://openjdk.org/jeps/513) allows statements before an explicit `super(..)` or `this(..)` constructor invocation. When such a call computes one of its arguments through a method invocation or object creation, this recipe extracts the non-trivial arguments into local variables declared right before the call, surfacing the work done before construction. This is a strictly behavior-preserving transformation: argument expressions are already evaluated before the delegate constructor body runs, and such an argument can never reference the instance under construction, so hoisting them into preceding statements changes neither the order of side effects nor the set of legal references. Arguments are extracted in their original left-to-right order, and trivial arguments (literals and local variable references, which have no side effects) are left in place. Statements that follow the constructor invocation are deliberately *not* moved, as reordering them relative to the delegate constructor's side effects could change behavior. * [org.openrewrite.java.migrate.lang.FindNonVirtualExecutors](/recipes/java/migrate/lang/findnonvirtualexecutors.md) * **Find non-virtual `ExecutorService` creation** * Find all places where static `java.util.concurrent.Executors` method creates a non-virtual `java.util.concurrent.ExecutorService`. This recipe can be used to search fro `ExecutorService` that can be replaced by Virtual Thread executor. @@ -4454,19 +4505,19 @@ _459 recipes_ * Prefer `EnumSet of(..)` instead of using `Set of(..)` when the arguments are enums in Java 9 or higher. * [org.openrewrite.java.migrate.util.UseListOf](/recipes/java/migrate/util/uselistof.md) * **Prefer `List.of(..)`** - * Prefer `List.of(..)` instead of using `java.util.List#add(..)` in anonymous ArrayList initializers in Java 10 or higher. This recipe will not modify code where the List is later mutated since `List.of` returns an immutable list. + * Prefer `List.of(..)` in Java 10 or higher. Two input shapes are recognised: - Anonymous-class initialization (`new ArrayList<>() \{\{ add("a"); add("b"); \}\}`), which is replaced wholesale with `List.of("a", "b")` (immutable result, matching the anonymous-class idiom's typical intent). - A `new ArrayList<>()` declaration followed by a chain of `target.add(..)` statements, which is collapsed to `new ArrayList<>(List.of(..))` (preserving the mutable `ArrayList`). * [org.openrewrite.java.migrate.util.UseLocaleOf](/recipes/java/migrate/util/uselocaleof.md) * **Prefer `Locale.of(..)` over `new Locale(..)`** * Prefer `Locale.of(..)` over `new Locale(..)` in Java 19 or higher. * [org.openrewrite.java.migrate.util.UseMapOf](/recipes/java/migrate/util/usemapof.md) * **Prefer `Map.of(..)`** - * Prefer `Map.of(..)` instead of using `java.util.Map#put(..)` in Java 10 or higher. + * Prefer `Map.of(..)` instead of using `java.util.Map#put(..)` in Java 10 or higher. Two input shapes are recognised: - Anonymous-class initialization (`new HashMap<>() \{\{ put(k, v); ... \}\}`), which is replaced wholesale with `Map.of(k, v, ...)` (or `Map.ofEntries(...)` past ten entries) — immutable result. - A `new HashMap<>()` declaration followed by a chain of `target.put(k, v)` statements, which is collapsed to `new HashMap<>(Map.of(..))` (or `new HashMap<>(Map.ofEntries(..))`) — preserving the mutable `HashMap`. * [org.openrewrite.java.migrate.util.UsePredicateNot](/recipes/java/migrate/util/usepredicatenot.md) * **Prefer `Predicate.not(..)` over casting to `Predicate` and calling `negate()`** * Replace `((Predicate<T>) lambdaOrMethodRef).negate()` with `Predicate.not(lambdaOrMethodRef)` as of Java 11. * [org.openrewrite.java.migrate.util.UseSetOf](/recipes/java/migrate/util/usesetof.md) * **Prefer `Set.of(..)`** - * Prefer `Set.of(..)` instead of using `java.util.Set#add(..)` in anonymous HashSet initializers in Java 10 or higher. This recipe will not modify code where the Set is later mutated since `Set.of` returns an immutable set. + * Prefer `Set.of(..)` in Java 10 or higher. Two input shapes are recognised: - Anonymous-class initialization (`new HashSet<>() \{\{ add("a"); add("b"); \}\}`), which is replaced wholesale with `Set.of("a", "b")` (immutable result, matching the anonymous-class idiom's typical intent). - A `new HashSet<>()` declaration followed by a chain of `target.add(..)` statements, which is collapsed to `new HashSet<>(Set.of(..))` (preserving the mutable `HashSet`). * [org.openrewrite.scala.migrate.UpgradeScala_2_12](/recipes/scala/migrate/upgradescala_2_12.md) * **Migrate to Scala 2.12.+** * Upgrade the Scala version for compatibility with newer Java versions. @@ -6010,7 +6061,7 @@ _67 recipes_ _License: Moderne Source Available License_ -_181 recipes_ +_192 recipes_ * [org.openrewrite.recipe.rewrite-static-analysis.InlineDeprecatedMethods](/recipes/recipe/rewrite-static-analysis/inlinedeprecatedmethods.md) * **Inline deprecated delegating methods** @@ -6024,6 +6075,9 @@ _181 recipes_ * [org.openrewrite.staticanalysis.AddSerialVersionUidToSerializable](/recipes/staticanalysis/addserialversionuidtoserializable.md) * **Add `serialVersionUID` to a `Serializable` class when missing** * A `serialVersionUID` field is strongly recommended in all `Serializable` classes. If this is not defined on a `Serializable` class, the compiler will generate this value. If a change is later made to the class, the generated value will change and attempts to deserialize the class will fail. Explicitly declaring this field gives you control over binary compatibility across versions. +* [org.openrewrite.staticanalysis.AllBranchesIdentical](/recipes/staticanalysis/allbranchesidentical.md) + * **All branches in a conditional should not have the same implementation** + * When every branch of an `if`/`else` chain executes the same code, the condition serves no purpose and the code block can be used directly. * [org.openrewrite.staticanalysis.AnnotateNullableMethods](/recipes/staticanalysis/annotatenullablemethods.md) * **Annotate methods which may return `null` with `@Nullable`** * Add `@Nullable` to non-private methods that may return `null`. By default `org.jspecify.annotations.Nullable` is used, but through the `nullableAnnotationClass` option a custom annotation can be provided. Both `@Target(TYPE_USE)` and declaration annotations (e.g. `javax.annotation.CheckForNull`) are supported. Methods that already carry a known nullable annotation (matched by simple name) are skipped to avoid duplication. This recipe scans for methods that do not already have a `@Nullable` annotation and checks their return statements for potential null values. It also identifies known methods from standard libraries that may return null, such as methods from `Map`, `Queue`, `Deque`, `NavigableSet`, and `Spliterator`. The return of streams, or lambdas are not taken into account. @@ -6075,6 +6129,9 @@ _181 recipes_ * [org.openrewrite.staticanalysis.CodeCleanup](/recipes/staticanalysis/codecleanup.md) * **Code cleanup** * Automatically cleanup code, e.g. remove unnecessary parentheses, simplify expressions. +* [org.openrewrite.staticanalysis.CollapsibleIfStatements](/recipes/staticanalysis/collapsibleifstatements.md) + * **Mergeable "if" statements should be combined** + * When an `if` statement body contains only another `if` with no `else`, the two conditions can be combined with `&&`. Merging the conditions reduces nesting and makes the code easier to read. * [org.openrewrite.staticanalysis.CollectionToArrayShouldHaveProperType](/recipes/staticanalysis/collectiontoarrayshouldhavepropertype.md) * **'Collection.toArray()' should be passed an array of the proper type** * Using `Collection.toArray()` without parameters returns an `Object[]`, which requires casting. It is more efficient and clearer to use `Collection.toArray(new T[0])` instead. The parameterless form can cause a `ClassCastException` at runtime when the returned `Object[]` is cast to a more specific array type. @@ -6192,6 +6249,9 @@ _181 recipes_ * [org.openrewrite.staticanalysis.MemberNameCaseInsensitiveDuplicates](/recipes/staticanalysis/membernamecaseinsensitiveduplicates.md) * **Members should not have names differing only by capitalization** * Looking at the set of methods and fields in a class and all of its parents, no two members should have names that differ only in capitalization. This rule will not report if a method overrides a parent method. Members with near-identical names are easily confused, leading to bugs where the wrong field or method is referenced. +* [org.openrewrite.staticanalysis.MergeIdenticalBranches](/recipes/staticanalysis/mergeidenticalbranches.md) + * **Branches with identical implementations should be merged** + * When two consecutive branches of an `if`/`else if` chain execute the same code, they can be merged by combining their conditions with `||`. This removes duplication and makes the intent clearer. * [org.openrewrite.staticanalysis.MethodNameCasing](/recipes/staticanalysis/methodnamecasing.md) * **Standardize method name casing** * Fixes method names that do not follow standard naming conventions. For example, `String getFoo_bar()` would be adjusted to `String getFooBar()` and `int DoSomething()` would be adjusted to `int doSomething()`. Following a consistent casing convention for method names improves code readability and helps developers quickly distinguish methods from classes or constants. @@ -6282,6 +6342,9 @@ _181 recipes_ * [org.openrewrite.staticanalysis.RemoveCallsToSystemGc](/recipes/staticanalysis/removecallstosystemgc.md) * **Remove garbage collection invocations** * Removes calls to `System.gc()` and `Runtime.gc()`. When to invoke garbage collection is best left to the JVM. Manual GC calls produce unpredictable results across different JVM implementations and can cause unnecessary application pauses. +* [org.openrewrite.staticanalysis.RemoveDuplicateConditions](/recipes/staticanalysis/removeduplicateconditions.md) + * **Related "if/else if" conditions should not be the same** + * When an `if`/`else if` chain contains the same condition more than once, the second branch can never execute because the first matching branch always wins. The duplicate branch is dead code and should be removed. * [org.openrewrite.staticanalysis.RemoveEmptyJavaDocParameters](/recipes/staticanalysis/removeemptyjavadocparameters.md) * **Remove JavaDoc `@param`, `@return`, and `@throws` with no description** * Removes `@param`, `@return`, and `@throws` with no description from JavaDocs. @@ -6309,18 +6372,27 @@ _181 recipes_ * [org.openrewrite.staticanalysis.RemoveRedundantTypeCast](/recipes/staticanalysis/removeredundanttypecast.md) * **Remove redundant casts** * Removes unnecessary type casts. Does not currently check casts in lambdas and class constructors. Redundant casts add visual noise and can obscure the actual type relationships in the code, making it harder to follow the data flow. +* [org.openrewrite.staticanalysis.RemoveSelfAssignment](/recipes/staticanalysis/removeselfassignment.md) + * **Variables should not be self-assigned** + * Self-assignments such as `x = x` have no effect and indicate a copy-paste error or typo where the left-hand or right-hand side should reference a different variable. * [org.openrewrite.staticanalysis.RemoveSystemOutPrintln](/recipes/staticanalysis/removesystemoutprintln.md) * **Remove `System.out#println` statements** * Print statements are often left accidentally after debugging an issue. This recipe removes all `System.out#println` and `System.err#println` statements from the code. Production code should use a proper logging framework which provides consistent formatting, configurable log levels, and centralized output control. * [org.openrewrite.staticanalysis.RemoveToStringCallsFromArrayInstances](/recipes/staticanalysis/removetostringcallsfromarrayinstances.md) * **Remove `toString()` calls on arrays** * The result from `toString()` calls on arrays is largely useless. The output does not actually reflect the contents of the array. `Arrays.toString(array)` should be used instead as it gives the contents of the array. Since arrays do not override `toString()` from `Object`, calling it produces only the type name and memory address, which is rarely what was intended. +* [org.openrewrite.staticanalysis.RemoveUnconditionalValueOverwrite](/recipes/staticanalysis/removeunconditionalvalueoverwrite.md) + * **Map values should not be replaced unconditionally** + * When `map.put(key, value)` is called twice in a row with the same key, the first call is dead code because its value is immediately overwritten. Remove the first call to make the intent clear. * [org.openrewrite.staticanalysis.RemoveUnneededAssertion](/recipes/staticanalysis/removeunneededassertion.md) * **Remove unneeded assertions** * Remove unneeded assertions like `assert true`, `assertTrue(true)`, or `assertFalse(false)`. * [org.openrewrite.staticanalysis.RemoveUnneededBlock](/recipes/staticanalysis/removeunneededblock.md) * **Remove unneeded block** * Flatten blocks into inline statements when possible. Unnecessary nested blocks add indentation and scope boundaries that obscure the control flow, often indicating code that should be extracted into its own method. +* [org.openrewrite.staticanalysis.RemoveUnreachableMultiCatchAlternative](/recipes/staticanalysis/removeunreachablemulticatchalternative.md) + * **Remove unreachable `catch` alternatives shadowed by earlier `catch` clauses** + * When an earlier `catch` clause already covers a type, any later `catch` (including a multi-catch alternative) for the same type or a subtype is unreachable and is a Java compile error. This commonly appears after type-substitution migrations (for example, renaming an exception so that two `catch` clauses end up overlapping). This recipe drops the unreachable alternatives from later multi-catches, collapses a multi-catch to a regular `catch` when only one alternative remains, and removes the entire `catch` clause when all of its declared types are already covered. * [org.openrewrite.staticanalysis.RemoveUnusedLabels](/recipes/staticanalysis/removeunusedlabels.md) * **Remove unused labels** * Remove labels that are not referenced by any `break` or `continue` statement. @@ -6432,6 +6504,9 @@ _181 recipes_ * [org.openrewrite.staticanalysis.SimplifyForLoopBoundaryComparison](/recipes/staticanalysis/simplifyforloopboundarycomparison.md) * **Simplify for loop boundary comparisons** * Replace `<=` with `<` in for loop conditions by adjusting the comparison operands. For example, `i <= n - 1` simplifies to `i < n`, and `i <= n` becomes `i < n + 1`. +* [org.openrewrite.staticanalysis.SimplifyRedundantLogicalExpression](/recipes/staticanalysis/simplifyredundantlogicalexpression.md) + * **Identical expressions used with logical operators should be simplified** + * When the same expression appears on both sides of `&&`, `||`, `&`, or `|`, the result is always equal to that expression. For example, `x && x` is always just `x`. This is typically a copy-paste error where one side should have been different. * [org.openrewrite.staticanalysis.SimplifyTernaryRecipes](/recipes/staticanalysis/simplifyternaryrecipes.md) * **Simplify ternary expressions** * Simplifies various types of ternary expressions to improve code readability. Ternaries that simply select between `true` and `false` are redundant wrappers around the condition itself and add unnecessary complexity. @@ -6534,6 +6609,15 @@ _181 recipes_ * [org.openrewrite.staticanalysis.UseStandardCharset](/recipes/staticanalysis/usestandardcharset.md) * **Use `StandardCharset` constants** * Replaces `Charset.forName(java.lang.String)` with the equivalent `StandardCharset` constant. Using the predefined constants is both compile-time safe and avoids the need to handle `UnsupportedEncodingException` for charsets that are guaranteed to exist on every JVM. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes](/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md) + * **Use `String.CASE_INSENSITIVE_ORDER`** + * Replaces case-insensitive string comparator lambdas and method references with the JDK constant `String.CASE_INSENSITIVE_ORDER`. Improves readability and removes one closure allocation per call site. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromLambdaRecipe](/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$fromlambdarecipe.md) + * **Use `String.CASE_INSENSITIVE_ORDER` instead of a lambda** + * Replace `(a, b) -> a.compareToIgnoreCase(b)` with `String.CASE_INSENSITIVE_ORDER` when used as a `Comparator<String>`. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes$FromMethodReferenceRecipe](/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes$frommethodreferencerecipe.md) + * **Use `String.CASE_INSENSITIVE_ORDER` instead of `String::compareToIgnoreCase`** + * Replace the method reference `String::compareToIgnoreCase` with `String.CASE_INSENSITIVE_ORDER` when used as a `Comparator<String>`. * [org.openrewrite.staticanalysis.UseStringReplace](/recipes/staticanalysis/usestringreplace.md) * **Use `String::replace()` when first parameter is not a real regular expression** * When `String::replaceAll` is used, the first argument should be a real regular expression. If it’s not the case, `String::replace` does exactly the same thing as `String::replaceAll` without the performance drawback of the regex. @@ -6560,7 +6644,7 @@ _181 recipes_ _License: Moderne Source Available License_ -_267 recipes_ +_273 recipes_ * [org.openrewrite.java.testing.archunit.ArchUnit0to1Migration](/recipes/java/testing/archunit/archunit0to1migration.md) * **ArchUnit 0.x upgrade** @@ -6712,6 +6796,9 @@ _267 recipes_ * [org.openrewrite.java.testing.assertj.CollapseConsecutiveAssertThatStatements](/recipes/java/testing/assertj/collapseconsecutiveassertthatstatements.md) * **Collapse consecutive `assertThat` statements** * Collapse consecutive `assertThat` statements into single `assertThat` chained statement. This recipe ignores `assertThat` statements that have method invocation as parameter. +* [org.openrewrite.java.testing.assertj.DecomposeConjunctionAssertion](/recipes/java/testing/assertj/decomposeconjunctionassertion.md) + * **Decompose `assertThat` on conjunctions into separate assertions** + * Split `assertThat(a && b).isTrue()` into separate `assertThat(a).isTrue()` and `assertThat(b).isTrue()` statements, so each condition is asserted (and reported) on its own. This lets the dedicated assertion recipes simplify each conjunct, and `CollapseConsecutiveAssertThatStatements` fuse them back into a single chain when the actual is a plain expression. Only the direct `assertThat(...).isTrue()` form is decomposed; `isFalse()` is left alone, as negating a conjunction is not equivalent to negating each conjunct. * [org.openrewrite.java.testing.assertj.FestToAssertj](/recipes/java/testing/assertj/festtoassertj.md) * **Migrate Fest 2.x to AssertJ** * AssertJ provides a rich set of assertions, truly helpful error messages, improves test code readability. Converts Fest 2.x imports to AssertJ imports. @@ -6766,12 +6853,21 @@ _267 recipes_ * [org.openrewrite.java.testing.assertj.ReturnActual](/recipes/java/testing/assertj/returnactual.md) * **Collapse `assertThat` followed by `return` into single statement** * Collapse an `assertThat` statement followed by a `return` of the same object into a single `return assertThat(...).assertions().actual()` statement. +* [org.openrewrite.java.testing.assertj.SimplifyArrayLengthAssertion](/recipes/java/testing/assertj/simplifyarraylengthassertion.md) + * **Simplify AssertJ assertions on an array's `length`** + * Replace `assertThat(array.length)` size assertions with the dedicated array assertions, such as `assertThat(array).hasSize(n)`, `assertThat(array).isEmpty()` and `assertThat(array).hasSameSizeAs(other)`. Works for both object and primitive arrays. * [org.openrewrite.java.testing.assertj.SimplifyAssertJAssertion](/recipes/java/testing/assertj/simplifyassertjassertion.md) * **Simplify AssertJ assertions with literal arguments** * Simplify AssertJ assertions by replacing them with more expressive dedicated assertions. * [org.openrewrite.java.testing.assertj.SimplifyAssertJAssertions](/recipes/java/testing/assertj/simplifyassertjassertions.md) * **Shorten AssertJ assertions** * Replace AssertJ assertions where a dedicated assertion is available for the same actual value. +* [org.openrewrite.java.testing.assertj.SimplifyAssertJInstanceOfAssertion](/recipes/java/testing/assertj/simplifyassertjinstanceofassertion.md) + * **Simplify AssertJ assertions on `instanceof` expressions** + * Replace `assertThat(x instanceof Type).isTrue()` with the dedicated `assertThat(x).isInstanceOf(Type.class)`, and the negated and `isFalse()` variants with `isNotInstanceOf`, so failures describe the actual type rather than just `expected true but was false`. +* [org.openrewrite.java.testing.assertj.SimplifyAssertJNullRelatedAssertion](/recipes/java/testing/assertj/simplifyassertjnullrelatedassertion.md) + * **Simplify AssertJ assertions on `null` reference comparisons** + * Replace `assertThat(x == null).isTrue()` and its variants with the dedicated `assertThat(x).isNull()` / `assertThat(x).isNotNull()`. Beyond being more expressive, this avoids the compilation error that results when the `null` literal ends up as the `assertThat` argument (e.g. `assertThat(null == x).isTrue()` becoming `assertThat(null).isSameAs(x)`). * [org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion](/recipes/java/testing/assertj/simplifychainedassertjassertion.md) * **Simplify AssertJ chained assertions** * Many AssertJ chained assertions have dedicated assertions that function the same. It is best to use the dedicated assertions. @@ -6781,6 +6877,9 @@ _267 recipes_ * [org.openrewrite.java.testing.assertj.SimplifyHasSizeAssertion](/recipes/java/testing/assertj/simplifyhassizeassertion.md) * **Simplify AssertJ assertions with `hasSize` argument** * Simplify AssertJ assertions by replacing `hasSize` with `hasSameSizeAs` dedicated assertions. +* [org.openrewrite.java.testing.assertj.SimplifyHasSizeFromIsEqualToAssertion](/recipes/java/testing/assertj/simplifyhassizefromisequaltoassertion.md) + * **Simplify literal-first AssertJ size assertions to `hasSize`** + * Replace `assertThat(<int literal>).isEqualTo(collection.size())` style assertions with the dedicated `assertThat(collection).hasSize(<int literal>)`. Only the structural size form is rewritten, where the comparison is on a primitive `int` and reversing the assertion is behavior-preserving (unlike arbitrary `isEqualTo` object comparisons, which rely on `equals`). * [org.openrewrite.java.testing.assertj.SimplifyRedundantAssertJChains](/recipes/java/testing/assertj/simplifyredundantassertjchains.md) * **Simplify redundant AssertJ assertion chains** * Removes redundant AssertJ assertions when chained methods already provide the same or stronger guarantees. @@ -7021,6 +7120,9 @@ _267 recipes_ * [org.openrewrite.java.testing.junit5.IgnoreToDisabled](/recipes/java/testing/junit5/ignoretodisabled.md) * **Use JUnit Jupiter `@Disabled`** * Migrates JUnit 4.x `@Ignore` to JUnit Jupiter `@Disabled`. +* [org.openrewrite.java.testing.junit5.ImplausibleTimeoutToMinutes](/recipes/java/testing/junit5/implausibletimeouttominutes.md) + * **Make implausibly long `@Timeout` values explicit in minutes** + * JUnit Jupiter's `@Timeout` defaults to `TimeUnit.SECONDS`, so a value such as `@Timeout(10000)` is interpreted as almost three hours, which is most likely a mistake where milliseconds were intended. This recipe rewrites such implausibly large second-based timeouts to the equivalent number of minutes, for instance `@Timeout(value = 167, unit = TimeUnit.MINUTES)`, preserving the original (likely erroneous) semantics while making the mistake far more visible for review. * [org.openrewrite.java.testing.junit5.JUnit4to5Migration](/recipes/java/testing/junit5/junit4to5migration.md) * **JUnit Jupiter migration from JUnit 4.x** * Migrates JUnit 4.x tests to JUnit Jupiter. diff --git a/docs/reference/all-recipes.md b/docs/reference/all-recipes.md index 61fb6d6728..e3facbafe8 100644 --- a/docs/reference/all-recipes.md +++ b/docs/reference/all-recipes.md @@ -6,7 +6,7 @@ description: A comprehensive list of all recipes organized by module. _This doc indexes per-module recipe lists. Click a groupId to see its recipes._ -Total recipes: 4421 +Total recipes: 4455 ## org.openrewrite diff --git a/docs/reference/latest-versions-of-every-openrewrite-module.md b/docs/reference/latest-versions-of-every-openrewrite-module.md index acc73d9191..761a9044ff 100644 --- a/docs/reference/latest-versions-of-every-openrewrite-module.md +++ b/docs/reference/latest-versions-of-every-openrewrite-module.md @@ -17,98 +17,96 @@ The use of the "bill of materials" means that a developer will only need to spec | Module | Version | License | |-----------------------------------------------------------------------------------------------------------------------| ---------- | ------- | -| [**org.openrewrite:rewrite-bom**](https://github.com/openrewrite/rewrite) | **[8.85.7](https://github.com/openrewrite/rewrite/releases/tag/v8.85.7)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [**org.openrewrite:rewrite-maven-plugin**](https://github.com/openrewrite/rewrite-maven-plugin) | **[6.42.0](https://github.com/openrewrite/rewrite-maven-plugin/releases/tag/v6.42.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [**org.openrewrite:rewrite-gradle-plugin**](https://github.com/openrewrite/rewrite-gradle-plugin) | **[7.35.0](https://github.com/openrewrite/rewrite-gradle-plugin/releases/tag/v7.35.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [**org.openrewrite.recipe:rewrite-recipe-bom**](https://github.com/openrewrite/rewrite-recipe-bom) | **[3.33.0](https://github.com/openrewrite/rewrite-recipe-bom/releases/tag/v3.33.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [**io.moderne.recipe:moderne-recipe-bom**](https://github.com/moderneinc/moderne-recipe-bom) | **[0.38.0](https://github.com/moderneinc/rewrite-recipe-bom/releases/tag/v0.38.0)** | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:recipes-kotlin](https://github.com/moderneinc/recipes-kotlin/blob/main/) | [0.1.2](https://github.com/moderneinc/recipes-kotlin/releases/tag/0.1.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:recipes-scala](https://github.com/moderneinc/recipes-scala/blob/main/) | [0.2.1](https://github.com/moderneinc/recipes-scala/releases/tag/0.2.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-ai](https://github.com/moderneinc/rewrite-ai/blob/main/) | [0.4.1](https://github.com/moderneinc/rewrite-ai/releases/tag/0.4.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-angular](https://github.com/moderneinc/rewrite-angular/blob/main/) | [1.4.0](https://github.com/moderneinc/rewrite-angular/releases/tag/1.4.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-cryptography](https://github.com/moderneinc/rewrite-cryptography/blob/main/) | [0.14.3](https://github.com/moderneinc/rewrite-cryptography/releases/tag/0.14.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [**org.openrewrite:rewrite-bom**](https://github.com/openrewrite/rewrite) | **[8.86.0](https://github.com/openrewrite/rewrite/releases/tag/v8.86.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [**org.openrewrite:rewrite-maven-plugin**](https://github.com/openrewrite/rewrite-maven-plugin) | **[6.43.0](https://github.com/openrewrite/rewrite-maven-plugin/releases/tag/v6.43.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [**org.openrewrite:rewrite-gradle-plugin**](https://github.com/openrewrite/rewrite-gradle-plugin) | **[7.36.0](https://github.com/openrewrite/rewrite-gradle-plugin/releases/tag/v7.36.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [**org.openrewrite.recipe:rewrite-recipe-bom**](https://github.com/openrewrite/rewrite-recipe-bom) | **[3.34.0](https://github.com/openrewrite/rewrite-recipe-bom/releases/tag/v3.34.0)** | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [**io.moderne.recipe:moderne-recipe-bom**](https://github.com/moderneinc/moderne-recipe-bom) | **[0.39.0](https://github.com/moderneinc/rewrite-recipe-bom/releases/tag/v0.39.0)** | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:recipes-kotlin](https://github.com/moderneinc/recipes-kotlin/blob/main/) | [0.1.3](https://github.com/moderneinc/recipes-kotlin/releases/tag/0.1.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:recipes-scala](https://github.com/moderneinc/recipes-scala/blob/main/) | [0.2.2](https://github.com/moderneinc/recipes-scala/releases/tag/0.2.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-ai](https://github.com/moderneinc/rewrite-ai/blob/main/) | [0.4.2](https://github.com/moderneinc/rewrite-ai/releases/tag/0.4.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-angular](https://github.com/moderneinc/rewrite-angular/blob/main/) | [1.5.0](https://github.com/moderneinc/rewrite-angular/releases/tag/1.5.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-cryptography](https://github.com/moderneinc/rewrite-cryptography/blob/main/) | [0.14.8](https://github.com/moderneinc/rewrite-cryptography/releases/tag/0.14.8) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | | [io.moderne.recipe:rewrite-cve-2026-22732](https://github.com/moderneinc/cve-2026-22732/blob/main/) | [0.3.0](https://github.com/moderneinc/cve-2026-22732/releases/tag/0.3.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-devcenter](https://github.com/moderneinc/rewrite-devcenter/blob/main/) | [1.26.0](https://github.com/moderneinc/rewrite-devcenter/releases/tag/1.26.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [io.moderne.recipe:rewrite-dropwizard](https://github.com/moderneinc/rewrite-dropwizard/blob/main/) | [0.5.1](https://github.com/moderneinc/rewrite-dropwizard/releases/tag/0.5.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-elastic](https://github.com/moderneinc/rewrite-elastic/blob/main/) | [0.7.1](https://github.com/moderneinc/rewrite-elastic/releases/tag/0.7.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-hibernate](https://github.com/moderneinc/rewrite-hibernate/blob/main/) | [0.25.0](https://github.com/moderneinc/rewrite-hibernate/releases/tag/0.25.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-jasperreports](https://github.com/moderneinc/rewrite-jasperreports/blob/main/) | [0.6.1](https://github.com/moderneinc/rewrite-jasperreports/releases/tag/0.6.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-java-application-server](https://github.com/moderneinc/rewrite-java-application-server/blob/main/) | [0.7.3](https://github.com/moderneinc/rewrite-java-application-server/releases/tag/0.7.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-kafka](https://github.com/moderneinc/rewrite-kafka/blob/main/) | [0.7.1](https://github.com/moderneinc/rewrite-kafka/releases/tag/0.7.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-nullability](https://github.com/moderneinc/rewrite-nullability/blob/main/) | [0.1.0](https://github.com/moderneinc/rewrite-nullability/releases/tag/0.1.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-prethink](https://github.com/moderneinc/rewrite-prethink/blob/main/) | [0.7.3](https://github.com/moderneinc/rewrite-prethink/releases/tag/0.7.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-program-analysis](https://github.com/moderneinc/rewrite-program-analysis/blob/main/) | [0.13.2](https://github.com/moderneinc/rewrite-program-analysis/releases/tag/0.13.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-react](https://github.com/moderneinc/rewrite-react/blob/main/) | [0.3.2](https://github.com/moderneinc/rewrite-react/releases/tag/0.3.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-release-metromap](https://github.com/moderneinc/rewrite-release-metromap/blob/main/) | [0.4.0](https://github.com/moderneinc/rewrite-release-metromap/releases/tag/0.4.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-spring](https://github.com/moderneinc/rewrite-spring/blob/main/) | [0.35.0](https://github.com/moderneinc/rewrite-spring/releases/tag/0.35.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-tapestry](https://github.com/moderneinc/rewrite-tapestry/blob/main/) | [0.4.1](https://github.com/moderneinc/rewrite-tapestry/releases/tag/0.4.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [io.moderne.recipe:rewrite-vulncheck](https://github.com/moderneinc/rewrite-vulncheck/blob/main/) | [0.7.2](https://github.com/moderneinc/rewrite-vulncheck/releases/tag/0.7.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite:rewrite-cobol](https://github.com/moderneinc/rewrite-cobol/blob/main/) | [2.19.0](https://github.com/moderneinc/rewrite-cobol/releases/tag/2.19.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite:rewrite-core](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-csharp](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite:rewrite-docker](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-go](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite:rewrite-gradle](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-groovy](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-hcl](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-java](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-javascript](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite:rewrite-json](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-kotlin](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-maven](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-polyglot](https://github.com/openrewrite/rewrite-polyglot/blob/main/) | [2.10.9](https://github.com/openrewrite/rewrite-polyglot/releases/tag/2.10.9) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-properties](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-protobuf](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-python](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite:rewrite-templating](https://github.com/openrewrite/rewrite-templating/blob/main/) | [1.41.9](https://github.com/openrewrite/rewrite-templating/releases/tag/1.41.9) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-toml](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-xml](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite:rewrite-yaml](https://github.com/openrewrite/rewrite/blob/main/) | [8.85.7](https://github.com/openrewrite/rewrite/releases/tag/8.85.7) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.meta:rewrite-analysis](https://github.com/openrewrite/rewrite-analysis/blob/main/) | [2.35.0](https://github.com/openrewrite/rewrite-analysis/releases/tag/2.35.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [io.moderne.recipe:rewrite-devcenter](https://github.com/moderneinc/rewrite-devcenter/blob/main/) | [1.27.2](https://github.com/moderneinc/rewrite-devcenter/releases/tag/1.27.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [io.moderne.recipe:rewrite-dropwizard](https://github.com/moderneinc/rewrite-dropwizard/blob/main/) | [0.5.3](https://github.com/moderneinc/rewrite-dropwizard/releases/tag/0.5.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-elastic](https://github.com/moderneinc/rewrite-elastic/blob/main/) | [0.8.0](https://github.com/moderneinc/rewrite-elastic/releases/tag/0.8.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-hibernate](https://github.com/moderneinc/rewrite-hibernate/blob/main/) | [0.26.1](https://github.com/moderneinc/rewrite-hibernate/releases/tag/0.26.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-jasperreports](https://github.com/moderneinc/rewrite-jasperreports/blob/main/) | [0.6.2](https://github.com/moderneinc/rewrite-jasperreports/releases/tag/0.6.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-java-application-server](https://github.com/moderneinc/rewrite-java-application-server/blob/main/) | [0.7.7](https://github.com/moderneinc/rewrite-java-application-server/releases/tag/0.7.7) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-kafka](https://github.com/moderneinc/rewrite-kafka/blob/main/) | [0.7.2](https://github.com/moderneinc/rewrite-kafka/releases/tag/0.7.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-nullability](https://github.com/moderneinc/rewrite-nullability/blob/main/) | [0.2.1](https://github.com/moderneinc/rewrite-nullability/releases/tag/0.2.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-prethink](https://github.com/moderneinc/rewrite-prethink/blob/main/) | [0.8.1](https://github.com/moderneinc/rewrite-prethink/releases/tag/0.8.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-program-analysis](https://github.com/moderneinc/rewrite-program-analysis/blob/main/) | [0.13.4](https://github.com/moderneinc/rewrite-program-analysis/releases/tag/0.13.4) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-react](https://github.com/moderneinc/rewrite-react/blob/main/) | [0.3.3](https://github.com/moderneinc/rewrite-react/releases/tag/0.3.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-release-metromap](https://github.com/moderneinc/rewrite-release-metromap/blob/main/) | [0.4.1](https://github.com/moderneinc/rewrite-release-metromap/releases/tag/0.4.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-spring](https://github.com/moderneinc/rewrite-spring/blob/main/) | [0.37.0](https://github.com/moderneinc/rewrite-spring/releases/tag/0.37.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-tapestry](https://github.com/moderneinc/rewrite-tapestry/blob/main/) | [0.4.2](https://github.com/moderneinc/rewrite-tapestry/releases/tag/0.4.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [io.moderne.recipe:rewrite-vulncheck](https://github.com/moderneinc/rewrite-vulncheck/blob/main/) | [0.7.4](https://github.com/moderneinc/rewrite-vulncheck/releases/tag/0.7.4) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite:rewrite-cobol](https://github.com/moderneinc/rewrite-cobol/blob/main/) | [2.20.0](https://github.com/moderneinc/rewrite-cobol/releases/tag/2.20.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite:rewrite-core](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-csharp](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite:rewrite-docker](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-go](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite:rewrite-gradle](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-groovy](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-hcl](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-java](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-javascript](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite:rewrite-json](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-kotlin](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-maven](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-properties](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-protobuf](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-python](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite:rewrite-toml](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-xml](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite:rewrite-yaml](https://github.com/openrewrite/rewrite/blob/main/) | [8.86.0](https://github.com/openrewrite/rewrite/releases/tag/8.86.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.meta:rewrite-analysis](https://github.com/openrewrite/rewrite-analysis/blob/main/) | [2.36.0](https://github.com/openrewrite/rewrite-analysis/releases/tag/2.36.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | | [org.openrewrite.recipe:recipes-go](https://github.com/moderneinc/recipes-go/blob/main/) | [0.4.1](https://github.com/moderneinc/recipes-go/releases/tag/0.4.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-all](https://github.com/openrewrite/rewrite-all/blob/main/) | [1.26.2](https://github.com/openrewrite/rewrite-all/releases/tag/1.26.2) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-android](https://github.com/moderneinc/rewrite-android/blob/main/) | [0.18.1](https://github.com/moderneinc/rewrite-android/releases/tag/0.18.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-apache](https://github.com/openrewrite/rewrite-apache/blob/main/) | [2.27.1](https://github.com/openrewrite/rewrite-apache/releases/tag/2.27.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-circleci](https://github.com/moderneinc/rewrite-circleci/blob/main/) | [3.12.1](https://github.com/moderneinc/rewrite-circleci/releases/tag/3.12.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-codemods](https://github.com/moderneinc/rewrite-codemods/blob/main/) | [0.26.1](https://github.com/moderneinc/rewrite-codemods/releases/tag/0.26.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-codemods-ng](https://github.com/moderneinc/rewrite-codemods-ng/blob/main/) | [0.21.1](https://github.com/moderneinc/rewrite-codemods-ng/releases/tag/0.21.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-compiled-analysis](https://github.com/moderneinc/rewrite-compiled-analysis/blob/main/) | [0.14.1](https://github.com/moderneinc/rewrite-compiled-analysis/releases/tag/0.14.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-concourse](https://github.com/moderneinc/rewrite-concourse/blob/main/) | [3.11.1](https://github.com/moderneinc/rewrite-concourse/releases/tag/3.11.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-cucumber-jvm](https://github.com/openrewrite/rewrite-cucumber-jvm/blob/main/) | [2.12.1](https://github.com/openrewrite/rewrite-cucumber-jvm/releases/tag/2.12.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-dotnet](https://github.com/moderneinc/rewrite-dotnet/blob/main/) | [0.16.1](https://github.com/moderneinc/rewrite-dotnet/releases/tag/0.16.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-feature-flags](https://github.com/openrewrite/rewrite-feature-flags/blob/main/) | [1.21.1](https://github.com/openrewrite/rewrite-feature-flags/releases/tag/1.21.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-github-actions](https://github.com/openrewrite/rewrite-github-actions/blob/main/) | [3.25.0](https://github.com/openrewrite/rewrite-github-actions/releases/tag/3.25.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-gitlab](https://github.com/openrewrite/rewrite-gitlab/blob/main/) | [0.23.1](https://github.com/openrewrite/rewrite-gitlab/releases/tag/0.23.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-hibernate](https://github.com/openrewrite/rewrite-hibernate/blob/main/) | [2.22.0](https://github.com/openrewrite/rewrite-hibernate/releases/tag/2.22.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-jackson](https://github.com/openrewrite/rewrite-jackson/blob/main/) | [1.25.0](https://github.com/openrewrite/rewrite-jackson/releases/tag/1.25.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-java-dependencies](https://github.com/openrewrite/rewrite-java-dependencies/blob/main/) | [1.56.0](https://github.com/openrewrite/rewrite-java-dependencies/releases/tag/1.56.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-java-security](https://github.com/moderneinc/rewrite-java-security/blob/main/) | [3.33.1](https://github.com/moderneinc/rewrite-java-security/releases/tag/3.33.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-jenkins](https://github.com/openrewrite/rewrite-jenkins/blob/main/) | [0.36.1](https://github.com/openrewrite/rewrite-jenkins/releases/tag/0.36.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-joda](https://github.com/openrewrite/rewrite-joda/blob/main/) | [0.9.1](https://github.com/openrewrite/rewrite-joda/releases/tag/0.9.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-kubernetes](https://github.com/moderneinc/rewrite-kubernetes/blob/main/) | [3.17.1](https://github.com/moderneinc/rewrite-kubernetes/releases/tag/3.17.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-liberty](https://github.com/openrewrite/rewrite-liberty/blob/main/) | [1.24.1](https://github.com/openrewrite/rewrite-liberty/releases/tag/1.24.1) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-logging-frameworks](https://github.com/openrewrite/rewrite-logging-frameworks/blob/main/) | [3.29.1](https://github.com/openrewrite/rewrite-logging-frameworks/releases/tag/3.29.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-micrometer](https://github.com/openrewrite/rewrite-micrometer/blob/main/) | [0.29.1](https://github.com/openrewrite/rewrite-micrometer/releases/tag/0.29.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-micronaut](https://github.com/openrewrite/rewrite-micronaut/blob/main/) | [2.34.2](https://github.com/openrewrite/rewrite-micronaut/releases/tag/2.34.2) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-migrate-java](https://github.com/openrewrite/rewrite-migrate-java/blob/main/) | [3.38.0](https://github.com/openrewrite/rewrite-migrate-java/releases/tag/3.38.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-migrate-kotlin](https://github.com/moderneinc/rewrite-migrate-kotlin/blob/main/) | [0.6.0](https://github.com/moderneinc/rewrite-migrate-kotlin/releases/tag/0.6.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-migrate-python](https://github.com/moderneinc/rewrite-migrate-python/blob/main/) | [0.9.1](https://github.com/moderneinc/rewrite-migrate-python/releases/tag/0.9.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-netty](https://github.com/openrewrite/rewrite-netty/blob/main/) | [0.10.1](https://github.com/openrewrite/rewrite-netty/releases/tag/0.10.1) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-nodejs](https://github.com/moderneinc/rewrite-nodejs/blob/main/) | [0.46.2](https://github.com/moderneinc/rewrite-nodejs/releases/tag/0.46.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-okhttp](https://github.com/openrewrite/rewrite-okhttp/blob/main/) | [0.23.1](https://github.com/openrewrite/rewrite-okhttp/releases/tag/0.23.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-openapi](https://github.com/openrewrite/rewrite-openapi/blob/main/) | [0.32.1](https://github.com/openrewrite/rewrite-openapi/releases/tag/0.32.1) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-prethink](https://github.com/openrewrite/rewrite-prethink/blob/main/) | [1.0.1](https://github.com/openrewrite/rewrite-prethink/releases/tag/1.0.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-quarkus](https://github.com/openrewrite/rewrite-quarkus/blob/main/) | [2.33.1](https://github.com/openrewrite/rewrite-quarkus/releases/tag/2.33.1) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| [org.openrewrite.recipe:rewrite-reactive-streams](https://github.com/moderneinc/rewrite-reactive-streams/blob/main/) | [0.20.1](https://github.com/moderneinc/rewrite-reactive-streams/releases/tag/0.20.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-rewrite](https://github.com/openrewrite/rewrite-rewrite/blob/main/) | [0.26.1](https://github.com/openrewrite/rewrite-rewrite/releases/tag/0.26.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-spring](https://github.com/openrewrite/rewrite-spring/blob/main/) | [6.33.0](https://github.com/openrewrite/rewrite-spring/releases/tag/6.33.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-spring-to-quarkus](https://github.com/openrewrite/rewrite-spring-to-quarkus/blob/main/) | [0.10.1](https://github.com/openrewrite/rewrite-spring-to-quarkus/releases/tag/0.10.1) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-sql](https://github.com/moderneinc/rewrite-sql/blob/main/) | [2.12.1](https://github.com/moderneinc/rewrite-sql/releases/tag/2.12.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-static-analysis](https://github.com/openrewrite/rewrite-static-analysis/blob/main/) | [2.37.0](https://github.com/openrewrite/rewrite-static-analysis/releases/tag/2.37.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-struts](https://github.com/moderneinc/rewrite-struts/blob/main/) | [0.26.1](https://github.com/moderneinc/rewrite-struts/releases/tag/0.26.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-terraform](https://github.com/moderneinc/rewrite-terraform/blob/main/) | [3.14.3](https://github.com/moderneinc/rewrite-terraform/releases/tag/3.14.3) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | -| [org.openrewrite.recipe:rewrite-testing-frameworks](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/) | [3.40.0](https://github.com/openrewrite/rewrite-testing-frameworks/releases/tag/3.40.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | -| [org.openrewrite.recipe:rewrite-third-party](https://github.com/openrewrite/rewrite-third-party/blob/main/) | [0.41.4](https://github.com/openrewrite/rewrite-third-party/releases/tag/0.41.4) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-all](https://github.com/openrewrite/rewrite-all/blob/main/) | [1.27.0](https://github.com/openrewrite/rewrite-all/releases/tag/1.27.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-android](https://github.com/moderneinc/rewrite-android/blob/main/) | [0.18.2](https://github.com/moderneinc/rewrite-android/releases/tag/0.18.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-apache](https://github.com/openrewrite/rewrite-apache/blob/main/) | [2.27.2](https://github.com/openrewrite/rewrite-apache/releases/tag/2.27.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-circleci](https://github.com/moderneinc/rewrite-circleci/blob/main/) | [3.12.2](https://github.com/moderneinc/rewrite-circleci/releases/tag/3.12.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-codemods](https://github.com/moderneinc/rewrite-codemods/blob/main/) | [0.27.0](https://github.com/moderneinc/rewrite-codemods/releases/tag/0.27.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-codemods-ng](https://github.com/moderneinc/rewrite-codemods-ng/blob/main/) | [0.21.2](https://github.com/moderneinc/rewrite-codemods-ng/releases/tag/0.21.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-compiled-analysis](https://github.com/moderneinc/rewrite-compiled-analysis/blob/main/) | [0.14.2](https://github.com/moderneinc/rewrite-compiled-analysis/releases/tag/0.14.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-concourse](https://github.com/moderneinc/rewrite-concourse/blob/main/) | [3.11.2](https://github.com/moderneinc/rewrite-concourse/releases/tag/3.11.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-cucumber-jvm](https://github.com/openrewrite/rewrite-cucumber-jvm/blob/main/) | [2.12.3](https://github.com/openrewrite/rewrite-cucumber-jvm/releases/tag/2.12.3) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-dotnet](https://github.com/moderneinc/rewrite-dotnet/blob/main/) | [0.17.0](https://github.com/moderneinc/rewrite-dotnet/releases/tag/0.17.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-feature-flags](https://github.com/openrewrite/rewrite-feature-flags/blob/main/) | [1.22.0](https://github.com/openrewrite/rewrite-feature-flags/releases/tag/1.22.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-github-actions](https://github.com/openrewrite/rewrite-github-actions/blob/main/) | [3.26.0](https://github.com/openrewrite/rewrite-github-actions/releases/tag/3.26.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-gitlab](https://github.com/openrewrite/rewrite-gitlab/blob/main/) | [0.23.2](https://github.com/openrewrite/rewrite-gitlab/releases/tag/0.23.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-hibernate](https://github.com/openrewrite/rewrite-hibernate/blob/main/) | [2.23.0](https://github.com/openrewrite/rewrite-hibernate/releases/tag/2.23.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-jackson](https://github.com/openrewrite/rewrite-jackson/blob/main/) | [1.26.0](https://github.com/openrewrite/rewrite-jackson/releases/tag/1.26.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-java-dependencies](https://github.com/openrewrite/rewrite-java-dependencies/blob/main/) | [1.57.0](https://github.com/openrewrite/rewrite-java-dependencies/releases/tag/1.57.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-java-security](https://github.com/moderneinc/rewrite-java-security/blob/main/) | [3.34.2](https://github.com/moderneinc/rewrite-java-security/releases/tag/3.34.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-jenkins](https://github.com/openrewrite/rewrite-jenkins/blob/main/) | [0.36.2](https://github.com/openrewrite/rewrite-jenkins/releases/tag/0.36.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-joda](https://github.com/openrewrite/rewrite-joda/blob/main/) | [0.9.2](https://github.com/openrewrite/rewrite-joda/releases/tag/0.9.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-kubernetes](https://github.com/moderneinc/rewrite-kubernetes/blob/main/) | [3.17.2](https://github.com/moderneinc/rewrite-kubernetes/releases/tag/3.17.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-liberty](https://github.com/openrewrite/rewrite-liberty/blob/main/) | [1.24.2](https://github.com/openrewrite/rewrite-liberty/releases/tag/1.24.2) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-logging-frameworks](https://github.com/openrewrite/rewrite-logging-frameworks/blob/main/) | [3.29.2](https://github.com/openrewrite/rewrite-logging-frameworks/releases/tag/3.29.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-micrometer](https://github.com/openrewrite/rewrite-micrometer/blob/main/) | [0.29.2](https://github.com/openrewrite/rewrite-micrometer/releases/tag/0.29.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-micronaut](https://github.com/openrewrite/rewrite-micronaut/blob/main/) | [2.34.3](https://github.com/openrewrite/rewrite-micronaut/releases/tag/2.34.3) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-migrate-java](https://github.com/openrewrite/rewrite-migrate-java/blob/main/) | [3.39.0](https://github.com/openrewrite/rewrite-migrate-java/releases/tag/3.39.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-migrate-kotlin](https://github.com/moderneinc/rewrite-migrate-kotlin/blob/main/) | [0.6.1](https://github.com/moderneinc/rewrite-migrate-kotlin/releases/tag/0.6.1) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-migrate-python](https://github.com/moderneinc/rewrite-migrate-python/blob/main/) | [0.9.2](https://github.com/moderneinc/rewrite-migrate-python/releases/tag/0.9.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-netty](https://github.com/openrewrite/rewrite-netty/blob/main/) | [0.10.2](https://github.com/openrewrite/rewrite-netty/releases/tag/0.10.2) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-nodejs](https://github.com/moderneinc/rewrite-nodejs/blob/main/) | [0.47.0](https://github.com/moderneinc/rewrite-nodejs/releases/tag/0.47.0) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-okhttp](https://github.com/openrewrite/rewrite-okhttp/blob/main/) | [0.23.2](https://github.com/openrewrite/rewrite-okhttp/releases/tag/0.23.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-openapi](https://github.com/openrewrite/rewrite-openapi/blob/main/) | [0.32.2](https://github.com/openrewrite/rewrite-openapi/releases/tag/0.32.2) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-prethink](https://github.com/openrewrite/rewrite-prethink/blob/main/) | [1.0.2](https://github.com/openrewrite/rewrite-prethink/releases/tag/1.0.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-quarkus](https://github.com/openrewrite/rewrite-quarkus/blob/main/) | [2.33.2](https://github.com/openrewrite/rewrite-quarkus/releases/tag/2.33.2) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | +| [org.openrewrite.recipe:rewrite-reactive-streams](https://github.com/moderneinc/rewrite-reactive-streams/blob/main/) | [0.20.2](https://github.com/moderneinc/rewrite-reactive-streams/releases/tag/0.20.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-rewrite](https://github.com/openrewrite/rewrite-rewrite/blob/main/) | [0.27.0](https://github.com/openrewrite/rewrite-rewrite/releases/tag/0.27.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-spring](https://github.com/openrewrite/rewrite-spring/blob/main/) | [6.34.0](https://github.com/openrewrite/rewrite-spring/releases/tag/6.34.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-spring-to-quarkus](https://github.com/openrewrite/rewrite-spring-to-quarkus/blob/main/) | [0.10.2](https://github.com/openrewrite/rewrite-spring-to-quarkus/releases/tag/0.10.2) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-sql](https://github.com/moderneinc/rewrite-sql/blob/main/) | [2.12.2](https://github.com/moderneinc/rewrite-sql/releases/tag/2.12.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-static-analysis](https://github.com/openrewrite/rewrite-static-analysis/blob/main/) | [2.38.0](https://github.com/openrewrite/rewrite-static-analysis/releases/tag/2.38.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-struts](https://github.com/moderneinc/rewrite-struts/blob/main/) | [0.26.2](https://github.com/moderneinc/rewrite-struts/releases/tag/0.26.2) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-terraform](https://github.com/moderneinc/rewrite-terraform/blob/main/) | [3.14.4](https://github.com/moderneinc/rewrite-terraform/releases/tag/3.14.4) | [Moderne Proprietary License](https://docs.moderne.io/licensing/overview) | +| [org.openrewrite.recipe:rewrite-testing-frameworks](https://github.com/openrewrite/rewrite-testing-frameworks/blob/main/) | [3.41.0](https://github.com/openrewrite/rewrite-testing-frameworks/releases/tag/3.41.0) | [Moderne Source Available License](https://docs.moderne.io/licensing/moderne-source-available-license) | +| [org.openrewrite.recipe:rewrite-third-party](https://github.com/openrewrite/rewrite-third-party/blob/main/) | [0.42.0](https://github.com/openrewrite/rewrite-third-party/releases/tag/0.42.0) | [Apache License Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) | ## CLI Installation @@ -118,7 +116,7 @@ Install the latest versions of all the OpenRewrite recipe modules into the Moder ```bash -mod config recipes jar install io.moderne.recipe:recipes-kotlin:{{VERSION_IO_MODERNE_RECIPE_RECIPES_KOTLIN}} io.moderne.recipe:recipes-scala:{{VERSION_IO_MODERNE_RECIPE_RECIPES_SCALA}} io.moderne.recipe:rewrite-ai:{{VERSION_IO_MODERNE_RECIPE_REWRITE_AI}} io.moderne.recipe:rewrite-cryptography:{{VERSION_IO_MODERNE_RECIPE_REWRITE_CRYPTOGRAPHY}} io.moderne.recipe:rewrite-cve-2026-22732:{{VERSION_IO_MODERNE_RECIPE_REWRITE_CVE_2026_22732}} io.moderne.recipe:rewrite-devcenter:{{VERSION_IO_MODERNE_RECIPE_REWRITE_DEVCENTER}} io.moderne.recipe:rewrite-dropwizard:{{VERSION_IO_MODERNE_RECIPE_REWRITE_DROPWIZARD}} io.moderne.recipe:rewrite-elastic:{{VERSION_IO_MODERNE_RECIPE_REWRITE_ELASTIC}} io.moderne.recipe:rewrite-hibernate:{{VERSION_IO_MODERNE_RECIPE_REWRITE_HIBERNATE}} io.moderne.recipe:rewrite-jasperreports:{{VERSION_IO_MODERNE_RECIPE_REWRITE_JASPERREPORTS}} io.moderne.recipe:rewrite-java-application-server:{{VERSION_IO_MODERNE_RECIPE_REWRITE_JAVA_APPLICATION_SERVER}} io.moderne.recipe:rewrite-kafka:{{VERSION_IO_MODERNE_RECIPE_REWRITE_KAFKA}} io.moderne.recipe:rewrite-nullability:{{VERSION_IO_MODERNE_RECIPE_REWRITE_NULLABILITY}} io.moderne.recipe:rewrite-prethink:{{VERSION_IO_MODERNE_RECIPE_REWRITE_PRETHINK}} io.moderne.recipe:rewrite-program-analysis:{{VERSION_IO_MODERNE_RECIPE_REWRITE_PROGRAM_ANALYSIS}} io.moderne.recipe:rewrite-release-metromap:{{VERSION_IO_MODERNE_RECIPE_REWRITE_RELEASE_METROMAP}} io.moderne.recipe:rewrite-spring:{{VERSION_IO_MODERNE_RECIPE_REWRITE_SPRING}} io.moderne.recipe:rewrite-tapestry:{{VERSION_IO_MODERNE_RECIPE_REWRITE_TAPESTRY}} io.moderne.recipe:rewrite-vulncheck:{{VERSION_IO_MODERNE_RECIPE_REWRITE_VULNCHECK}} org.openrewrite:rewrite-cobol:{{VERSION_ORG_OPENREWRITE_REWRITE_COBOL}} org.openrewrite:rewrite-core:{{VERSION_ORG_OPENREWRITE_REWRITE_CORE}} org.openrewrite:rewrite-csharp:{{VERSION_ORG_OPENREWRITE_REWRITE_CSHARP}} org.openrewrite:rewrite-docker:{{VERSION_ORG_OPENREWRITE_REWRITE_DOCKER}} org.openrewrite:rewrite-go:{{VERSION_ORG_OPENREWRITE_REWRITE_GO}} org.openrewrite:rewrite-gradle:{{VERSION_ORG_OPENREWRITE_REWRITE_GRADLE}} org.openrewrite:rewrite-groovy:{{VERSION_ORG_OPENREWRITE_REWRITE_GROOVY}} org.openrewrite:rewrite-hcl:{{VERSION_ORG_OPENREWRITE_REWRITE_HCL}} org.openrewrite:rewrite-java:{{VERSION_ORG_OPENREWRITE_REWRITE_JAVA}} org.openrewrite:rewrite-json:{{VERSION_ORG_OPENREWRITE_REWRITE_JSON}} org.openrewrite:rewrite-kotlin:{{VERSION_ORG_OPENREWRITE_REWRITE_KOTLIN}} org.openrewrite:rewrite-maven:{{VERSION_ORG_OPENREWRITE_REWRITE_MAVEN}} org.openrewrite:rewrite-polyglot:{{VERSION_ORG_OPENREWRITE_REWRITE_POLYGLOT}} org.openrewrite:rewrite-properties:{{VERSION_ORG_OPENREWRITE_REWRITE_PROPERTIES}} org.openrewrite:rewrite-protobuf:{{VERSION_ORG_OPENREWRITE_REWRITE_PROTOBUF}} org.openrewrite:rewrite-templating:{{VERSION_ORG_OPENREWRITE_REWRITE_TEMPLATING}} org.openrewrite:rewrite-toml:{{VERSION_ORG_OPENREWRITE_REWRITE_TOML}} org.openrewrite:rewrite-xml:{{VERSION_ORG_OPENREWRITE_REWRITE_XML}} org.openrewrite:rewrite-yaml:{{VERSION_ORG_OPENREWRITE_REWRITE_YAML}} org.openrewrite.meta:rewrite-analysis:{{VERSION_ORG_OPENREWRITE_META_REWRITE_ANALYSIS}} org.openrewrite.recipe:rewrite-all:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ALL}} org.openrewrite.recipe:rewrite-android:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ANDROID}} org.openrewrite.recipe:rewrite-apache:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_APACHE}} org.openrewrite.recipe:rewrite-circleci:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CIRCLECI}} org.openrewrite.recipe:rewrite-codemods:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS}} org.openrewrite.recipe:rewrite-codemods-ng:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS_NG}} org.openrewrite.recipe:rewrite-compiled-analysis:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_COMPILED_ANALYSIS}} org.openrewrite.recipe:rewrite-concourse:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CONCOURSE}} org.openrewrite.recipe:rewrite-cucumber-jvm:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CUCUMBER_JVM}} org.openrewrite.recipe:rewrite-dotnet:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_DOTNET}} org.openrewrite.recipe:rewrite-feature-flags:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_FEATURE_FLAGS}} org.openrewrite.recipe:rewrite-github-actions:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITHUB_ACTIONS}} org.openrewrite.recipe:rewrite-gitlab:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITLAB}} org.openrewrite.recipe:rewrite-hibernate:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_HIBERNATE}} org.openrewrite.recipe:rewrite-jackson:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JACKSON}} org.openrewrite.recipe:rewrite-java-dependencies:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_DEPENDENCIES}} org.openrewrite.recipe:rewrite-java-security:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_SECURITY}} org.openrewrite.recipe:rewrite-jenkins:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JENKINS}} org.openrewrite.recipe:rewrite-joda:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JODA}} org.openrewrite.recipe:rewrite-kubernetes:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_KUBERNETES}} org.openrewrite.recipe:rewrite-liberty:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LIBERTY}} org.openrewrite.recipe:rewrite-logging-frameworks:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LOGGING_FRAMEWORKS}} org.openrewrite.recipe:rewrite-micrometer:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICROMETER}} org.openrewrite.recipe:rewrite-micronaut:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICRONAUT}} org.openrewrite.recipe:rewrite-migrate-java:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_JAVA}} org.openrewrite.recipe:rewrite-migrate-kotlin:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_KOTLIN}} org.openrewrite.recipe:rewrite-netty:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NETTY}} org.openrewrite.recipe:rewrite-okhttp:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OKHTTP}} org.openrewrite.recipe:rewrite-openapi:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OPENAPI}} org.openrewrite.recipe:rewrite-prethink:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_PRETHINK}} org.openrewrite.recipe:rewrite-quarkus:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_QUARKUS}} org.openrewrite.recipe:rewrite-reactive-streams:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REACTIVE_STREAMS}} org.openrewrite.recipe:rewrite-rewrite:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REWRITE}} org.openrewrite.recipe:rewrite-spring:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING}} org.openrewrite.recipe:rewrite-spring-to-quarkus:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING_TO_QUARKUS}} org.openrewrite.recipe:rewrite-sql:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SQL}} org.openrewrite.recipe:rewrite-static-analysis:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STATIC_ANALYSIS}} org.openrewrite.recipe:rewrite-struts:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STRUTS}} org.openrewrite.recipe:rewrite-terraform:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TERRAFORM}} org.openrewrite.recipe:rewrite-testing-frameworks:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TESTING_FRAMEWORKS}} org.openrewrite.recipe:rewrite-third-party:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_THIRD_PARTY}} +mod config recipes jar install io.moderne.recipe:recipes-kotlin:{{VERSION_IO_MODERNE_RECIPE_RECIPES_KOTLIN}} io.moderne.recipe:recipes-scala:{{VERSION_IO_MODERNE_RECIPE_RECIPES_SCALA}} io.moderne.recipe:rewrite-ai:{{VERSION_IO_MODERNE_RECIPE_REWRITE_AI}} io.moderne.recipe:rewrite-cryptography:{{VERSION_IO_MODERNE_RECIPE_REWRITE_CRYPTOGRAPHY}} io.moderne.recipe:rewrite-cve-2026-22732:{{VERSION_IO_MODERNE_RECIPE_REWRITE_CVE_2026_22732}} io.moderne.recipe:rewrite-devcenter:{{VERSION_IO_MODERNE_RECIPE_REWRITE_DEVCENTER}} io.moderne.recipe:rewrite-dropwizard:{{VERSION_IO_MODERNE_RECIPE_REWRITE_DROPWIZARD}} io.moderne.recipe:rewrite-elastic:{{VERSION_IO_MODERNE_RECIPE_REWRITE_ELASTIC}} io.moderne.recipe:rewrite-hibernate:{{VERSION_IO_MODERNE_RECIPE_REWRITE_HIBERNATE}} io.moderne.recipe:rewrite-jasperreports:{{VERSION_IO_MODERNE_RECIPE_REWRITE_JASPERREPORTS}} io.moderne.recipe:rewrite-java-application-server:{{VERSION_IO_MODERNE_RECIPE_REWRITE_JAVA_APPLICATION_SERVER}} io.moderne.recipe:rewrite-kafka:{{VERSION_IO_MODERNE_RECIPE_REWRITE_KAFKA}} io.moderne.recipe:rewrite-nullability:{{VERSION_IO_MODERNE_RECIPE_REWRITE_NULLABILITY}} io.moderne.recipe:rewrite-prethink:{{VERSION_IO_MODERNE_RECIPE_REWRITE_PRETHINK}} io.moderne.recipe:rewrite-program-analysis:{{VERSION_IO_MODERNE_RECIPE_REWRITE_PROGRAM_ANALYSIS}} io.moderne.recipe:rewrite-release-metromap:{{VERSION_IO_MODERNE_RECIPE_REWRITE_RELEASE_METROMAP}} io.moderne.recipe:rewrite-spring:{{VERSION_IO_MODERNE_RECIPE_REWRITE_SPRING}} io.moderne.recipe:rewrite-tapestry:{{VERSION_IO_MODERNE_RECIPE_REWRITE_TAPESTRY}} io.moderne.recipe:rewrite-vulncheck:{{VERSION_IO_MODERNE_RECIPE_REWRITE_VULNCHECK}} org.openrewrite:rewrite-cobol:{{VERSION_ORG_OPENREWRITE_REWRITE_COBOL}} org.openrewrite:rewrite-core:{{VERSION_ORG_OPENREWRITE_REWRITE_CORE}} org.openrewrite:rewrite-csharp:{{VERSION_ORG_OPENREWRITE_REWRITE_CSHARP}} org.openrewrite:rewrite-docker:{{VERSION_ORG_OPENREWRITE_REWRITE_DOCKER}} org.openrewrite:rewrite-go:{{VERSION_ORG_OPENREWRITE_REWRITE_GO}} org.openrewrite:rewrite-gradle:{{VERSION_ORG_OPENREWRITE_REWRITE_GRADLE}} org.openrewrite:rewrite-groovy:{{VERSION_ORG_OPENREWRITE_REWRITE_GROOVY}} org.openrewrite:rewrite-hcl:{{VERSION_ORG_OPENREWRITE_REWRITE_HCL}} org.openrewrite:rewrite-java:{{VERSION_ORG_OPENREWRITE_REWRITE_JAVA}} org.openrewrite:rewrite-json:{{VERSION_ORG_OPENREWRITE_REWRITE_JSON}} org.openrewrite:rewrite-kotlin:{{VERSION_ORG_OPENREWRITE_REWRITE_KOTLIN}} org.openrewrite:rewrite-maven:{{VERSION_ORG_OPENREWRITE_REWRITE_MAVEN}} org.openrewrite:rewrite-properties:{{VERSION_ORG_OPENREWRITE_REWRITE_PROPERTIES}} org.openrewrite:rewrite-protobuf:{{VERSION_ORG_OPENREWRITE_REWRITE_PROTOBUF}} org.openrewrite:rewrite-toml:{{VERSION_ORG_OPENREWRITE_REWRITE_TOML}} org.openrewrite:rewrite-xml:{{VERSION_ORG_OPENREWRITE_REWRITE_XML}} org.openrewrite:rewrite-yaml:{{VERSION_ORG_OPENREWRITE_REWRITE_YAML}} org.openrewrite.meta:rewrite-analysis:{{VERSION_ORG_OPENREWRITE_META_REWRITE_ANALYSIS}} org.openrewrite.recipe:rewrite-all:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ALL}} org.openrewrite.recipe:rewrite-android:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ANDROID}} org.openrewrite.recipe:rewrite-apache:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_APACHE}} org.openrewrite.recipe:rewrite-circleci:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CIRCLECI}} org.openrewrite.recipe:rewrite-codemods:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS}} org.openrewrite.recipe:rewrite-codemods-ng:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS_NG}} org.openrewrite.recipe:rewrite-compiled-analysis:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_COMPILED_ANALYSIS}} org.openrewrite.recipe:rewrite-concourse:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CONCOURSE}} org.openrewrite.recipe:rewrite-cucumber-jvm:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CUCUMBER_JVM}} org.openrewrite.recipe:rewrite-dotnet:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_DOTNET}} org.openrewrite.recipe:rewrite-feature-flags:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_FEATURE_FLAGS}} org.openrewrite.recipe:rewrite-github-actions:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITHUB_ACTIONS}} org.openrewrite.recipe:rewrite-gitlab:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITLAB}} org.openrewrite.recipe:rewrite-hibernate:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_HIBERNATE}} org.openrewrite.recipe:rewrite-jackson:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JACKSON}} org.openrewrite.recipe:rewrite-java-dependencies:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_DEPENDENCIES}} org.openrewrite.recipe:rewrite-java-security:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_SECURITY}} org.openrewrite.recipe:rewrite-jenkins:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JENKINS}} org.openrewrite.recipe:rewrite-joda:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JODA}} org.openrewrite.recipe:rewrite-kubernetes:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_KUBERNETES}} org.openrewrite.recipe:rewrite-liberty:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LIBERTY}} org.openrewrite.recipe:rewrite-logging-frameworks:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LOGGING_FRAMEWORKS}} org.openrewrite.recipe:rewrite-micrometer:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICROMETER}} org.openrewrite.recipe:rewrite-micronaut:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICRONAUT}} org.openrewrite.recipe:rewrite-migrate-java:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_JAVA}} org.openrewrite.recipe:rewrite-migrate-kotlin:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_KOTLIN}} org.openrewrite.recipe:rewrite-netty:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NETTY}} org.openrewrite.recipe:rewrite-okhttp:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OKHTTP}} org.openrewrite.recipe:rewrite-openapi:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OPENAPI}} org.openrewrite.recipe:rewrite-prethink:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_PRETHINK}} org.openrewrite.recipe:rewrite-quarkus:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_QUARKUS}} org.openrewrite.recipe:rewrite-reactive-streams:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REACTIVE_STREAMS}} org.openrewrite.recipe:rewrite-rewrite:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REWRITE}} org.openrewrite.recipe:rewrite-spring:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING}} org.openrewrite.recipe:rewrite-spring-to-quarkus:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING_TO_QUARKUS}} org.openrewrite.recipe:rewrite-sql:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SQL}} org.openrewrite.recipe:rewrite-static-analysis:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STATIC_ANALYSIS}} org.openrewrite.recipe:rewrite-struts:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STRUTS}} org.openrewrite.recipe:rewrite-terraform:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TERRAFORM}} org.openrewrite.recipe:rewrite-testing-frameworks:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TESTING_FRAMEWORKS}} org.openrewrite.recipe:rewrite-third-party:{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_THIRD_PARTY}} mod config recipes pip install openrewrite=={{VERSION_ORG_OPENREWRITE_REWRITE_PYTHON}} openrewrite-migrate-python=={{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_PYTHON}} mod config recipes npm install @openrewrite/recipes-angular@{{VERSION_IO_MODERNE_RECIPE_REWRITE_ANGULAR}} @openrewrite/recipes-react@{{VERSION_IO_MODERNE_RECIPE_REWRITE_REACT}} @openrewrite/rewrite@{{VERSION_ORG_OPENREWRITE_REWRITE_JAVASCRIPT}} @openrewrite/recipes-nodejs@{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NODEJS}} mod config recipes go install github.com/moderneinc/recipes-go@v{{VERSION_ORG_OPENREWRITE_RECIPE_RECIPES_GO}} @@ -130,7 +128,7 @@ mod config recipes go install github.com/moderneinc/recipes-go@v{{VERSION_ORG_OP Install without a pinned version so you can later run `mod config recipes upgrade` to pull the newest versions without editing this command. ```bash -mod config recipes jar install io.moderne.recipe:recipes-kotlin:LATEST io.moderne.recipe:recipes-scala:LATEST io.moderne.recipe:rewrite-ai:LATEST io.moderne.recipe:rewrite-cryptography:LATEST io.moderne.recipe:rewrite-cve-2026-22732:LATEST io.moderne.recipe:rewrite-devcenter:LATEST io.moderne.recipe:rewrite-dropwizard:LATEST io.moderne.recipe:rewrite-elastic:LATEST io.moderne.recipe:rewrite-hibernate:LATEST io.moderne.recipe:rewrite-jasperreports:LATEST io.moderne.recipe:rewrite-java-application-server:LATEST io.moderne.recipe:rewrite-kafka:LATEST io.moderne.recipe:rewrite-nullability:LATEST io.moderne.recipe:rewrite-prethink:LATEST io.moderne.recipe:rewrite-program-analysis:LATEST io.moderne.recipe:rewrite-release-metromap:LATEST io.moderne.recipe:rewrite-spring:LATEST io.moderne.recipe:rewrite-tapestry:LATEST io.moderne.recipe:rewrite-vulncheck:LATEST org.openrewrite:rewrite-cobol:LATEST org.openrewrite:rewrite-core:LATEST org.openrewrite:rewrite-csharp:LATEST org.openrewrite:rewrite-docker:LATEST org.openrewrite:rewrite-go:LATEST org.openrewrite:rewrite-gradle:LATEST org.openrewrite:rewrite-groovy:LATEST org.openrewrite:rewrite-hcl:LATEST org.openrewrite:rewrite-java:LATEST org.openrewrite:rewrite-json:LATEST org.openrewrite:rewrite-kotlin:LATEST org.openrewrite:rewrite-maven:LATEST org.openrewrite:rewrite-polyglot:LATEST org.openrewrite:rewrite-properties:LATEST org.openrewrite:rewrite-protobuf:LATEST org.openrewrite:rewrite-templating:LATEST org.openrewrite:rewrite-toml:LATEST org.openrewrite:rewrite-xml:LATEST org.openrewrite:rewrite-yaml:LATEST org.openrewrite.meta:rewrite-analysis:LATEST org.openrewrite.recipe:rewrite-all:LATEST org.openrewrite.recipe:rewrite-android:LATEST org.openrewrite.recipe:rewrite-apache:LATEST org.openrewrite.recipe:rewrite-circleci:LATEST org.openrewrite.recipe:rewrite-codemods:LATEST org.openrewrite.recipe:rewrite-codemods-ng:LATEST org.openrewrite.recipe:rewrite-compiled-analysis:LATEST org.openrewrite.recipe:rewrite-concourse:LATEST org.openrewrite.recipe:rewrite-cucumber-jvm:LATEST org.openrewrite.recipe:rewrite-dotnet:LATEST org.openrewrite.recipe:rewrite-feature-flags:LATEST org.openrewrite.recipe:rewrite-github-actions:LATEST org.openrewrite.recipe:rewrite-gitlab:LATEST org.openrewrite.recipe:rewrite-hibernate:LATEST org.openrewrite.recipe:rewrite-jackson:LATEST org.openrewrite.recipe:rewrite-java-dependencies:LATEST org.openrewrite.recipe:rewrite-java-security:LATEST org.openrewrite.recipe:rewrite-jenkins:LATEST org.openrewrite.recipe:rewrite-joda:LATEST org.openrewrite.recipe:rewrite-kubernetes:LATEST org.openrewrite.recipe:rewrite-liberty:LATEST org.openrewrite.recipe:rewrite-logging-frameworks:LATEST org.openrewrite.recipe:rewrite-micrometer:LATEST org.openrewrite.recipe:rewrite-micronaut:LATEST org.openrewrite.recipe:rewrite-migrate-java:LATEST org.openrewrite.recipe:rewrite-migrate-kotlin:LATEST org.openrewrite.recipe:rewrite-netty:LATEST org.openrewrite.recipe:rewrite-okhttp:LATEST org.openrewrite.recipe:rewrite-openapi:LATEST org.openrewrite.recipe:rewrite-prethink:LATEST org.openrewrite.recipe:rewrite-quarkus:LATEST org.openrewrite.recipe:rewrite-reactive-streams:LATEST org.openrewrite.recipe:rewrite-rewrite:LATEST org.openrewrite.recipe:rewrite-spring:LATEST org.openrewrite.recipe:rewrite-spring-to-quarkus:LATEST org.openrewrite.recipe:rewrite-sql:LATEST org.openrewrite.recipe:rewrite-static-analysis:LATEST org.openrewrite.recipe:rewrite-struts:LATEST org.openrewrite.recipe:rewrite-terraform:LATEST org.openrewrite.recipe:rewrite-testing-frameworks:LATEST org.openrewrite.recipe:rewrite-third-party:LATEST +mod config recipes jar install io.moderne.recipe:recipes-kotlin:LATEST io.moderne.recipe:recipes-scala:LATEST io.moderne.recipe:rewrite-ai:LATEST io.moderne.recipe:rewrite-cryptography:LATEST io.moderne.recipe:rewrite-cve-2026-22732:LATEST io.moderne.recipe:rewrite-devcenter:LATEST io.moderne.recipe:rewrite-dropwizard:LATEST io.moderne.recipe:rewrite-elastic:LATEST io.moderne.recipe:rewrite-hibernate:LATEST io.moderne.recipe:rewrite-jasperreports:LATEST io.moderne.recipe:rewrite-java-application-server:LATEST io.moderne.recipe:rewrite-kafka:LATEST io.moderne.recipe:rewrite-nullability:LATEST io.moderne.recipe:rewrite-prethink:LATEST io.moderne.recipe:rewrite-program-analysis:LATEST io.moderne.recipe:rewrite-release-metromap:LATEST io.moderne.recipe:rewrite-spring:LATEST io.moderne.recipe:rewrite-tapestry:LATEST io.moderne.recipe:rewrite-vulncheck:LATEST org.openrewrite:rewrite-cobol:LATEST org.openrewrite:rewrite-core:LATEST org.openrewrite:rewrite-csharp:LATEST org.openrewrite:rewrite-docker:LATEST org.openrewrite:rewrite-go:LATEST org.openrewrite:rewrite-gradle:LATEST org.openrewrite:rewrite-groovy:LATEST org.openrewrite:rewrite-hcl:LATEST org.openrewrite:rewrite-java:LATEST org.openrewrite:rewrite-json:LATEST org.openrewrite:rewrite-kotlin:LATEST org.openrewrite:rewrite-maven:LATEST org.openrewrite:rewrite-properties:LATEST org.openrewrite:rewrite-protobuf:LATEST org.openrewrite:rewrite-toml:LATEST org.openrewrite:rewrite-xml:LATEST org.openrewrite:rewrite-yaml:LATEST org.openrewrite.meta:rewrite-analysis:LATEST org.openrewrite.recipe:rewrite-all:LATEST org.openrewrite.recipe:rewrite-android:LATEST org.openrewrite.recipe:rewrite-apache:LATEST org.openrewrite.recipe:rewrite-circleci:LATEST org.openrewrite.recipe:rewrite-codemods:LATEST org.openrewrite.recipe:rewrite-codemods-ng:LATEST org.openrewrite.recipe:rewrite-compiled-analysis:LATEST org.openrewrite.recipe:rewrite-concourse:LATEST org.openrewrite.recipe:rewrite-cucumber-jvm:LATEST org.openrewrite.recipe:rewrite-dotnet:LATEST org.openrewrite.recipe:rewrite-feature-flags:LATEST org.openrewrite.recipe:rewrite-github-actions:LATEST org.openrewrite.recipe:rewrite-gitlab:LATEST org.openrewrite.recipe:rewrite-hibernate:LATEST org.openrewrite.recipe:rewrite-jackson:LATEST org.openrewrite.recipe:rewrite-java-dependencies:LATEST org.openrewrite.recipe:rewrite-java-security:LATEST org.openrewrite.recipe:rewrite-jenkins:LATEST org.openrewrite.recipe:rewrite-joda:LATEST org.openrewrite.recipe:rewrite-kubernetes:LATEST org.openrewrite.recipe:rewrite-liberty:LATEST org.openrewrite.recipe:rewrite-logging-frameworks:LATEST org.openrewrite.recipe:rewrite-micrometer:LATEST org.openrewrite.recipe:rewrite-micronaut:LATEST org.openrewrite.recipe:rewrite-migrate-java:LATEST org.openrewrite.recipe:rewrite-migrate-kotlin:LATEST org.openrewrite.recipe:rewrite-netty:LATEST org.openrewrite.recipe:rewrite-okhttp:LATEST org.openrewrite.recipe:rewrite-openapi:LATEST org.openrewrite.recipe:rewrite-prethink:LATEST org.openrewrite.recipe:rewrite-quarkus:LATEST org.openrewrite.recipe:rewrite-reactive-streams:LATEST org.openrewrite.recipe:rewrite-rewrite:LATEST org.openrewrite.recipe:rewrite-spring:LATEST org.openrewrite.recipe:rewrite-spring-to-quarkus:LATEST org.openrewrite.recipe:rewrite-sql:LATEST org.openrewrite.recipe:rewrite-static-analysis:LATEST org.openrewrite.recipe:rewrite-struts:LATEST org.openrewrite.recipe:rewrite-terraform:LATEST org.openrewrite.recipe:rewrite-testing-frameworks:LATEST org.openrewrite.recipe:rewrite-third-party:LATEST mod config recipes pip install openrewrite openrewrite-migrate-python mod config recipes npm install @openrewrite/recipes-angular @openrewrite/recipes-react @openrewrite/rewrite @openrewrite/recipes-nodejs mod config recipes go install github.com/moderneinc/recipes-go @@ -323,11 +321,6 @@ mutation seedOpenRewriteArtifacts { ) { id } - load_org_openrewrite_rewrite_polyglot: installRecipesUniversal( - bundle: { maven: { groupId: "org.openrewrite", artifactId: "rewrite-polyglot", version: "LATEST" } } - ) { - id - } load_org_openrewrite_rewrite_properties: installRecipesUniversal( bundle: { maven: { groupId: "org.openrewrite", artifactId: "rewrite-properties", version: "LATEST" } } ) { @@ -343,11 +336,6 @@ mutation seedOpenRewriteArtifacts { ) { id } - load_org_openrewrite_rewrite_templating: installRecipesUniversal( - bundle: { maven: { groupId: "org.openrewrite", artifactId: "rewrite-templating", version: "LATEST" } } - ) { - id - } load_org_openrewrite_rewrite_toml: installRecipesUniversal( bundle: { maven: { groupId: "org.openrewrite", artifactId: "rewrite-toml", version: "LATEST" } } ) { diff --git a/docs/reference/moderne-recipes.md b/docs/reference/moderne-recipes.md index 53b6b3baa4..d293a9874b 100644 --- a/docs/reference/moderne-recipes.md +++ b/docs/reference/moderne-recipes.md @@ -5228,7 +5228,13 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * In Elasticsearch 9, `SpanTermQuery.value()` returns a `FieldValue` instead of `String`. This recipe updates calls to handle the new return type by checking if it's a string and extracting the string value. * [io.moderne.elastic.elastic9.MigrateToElasticsearch9](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9) * **Migrate from Elasticsearch 8 to 9** - * This recipe performs a comprehensive migration from Elasticsearch 8 to Elasticsearch 9, addressing breaking changes, API removals, deprecations, and required code modifications. + * This recipe performs a comprehensive migration from Elasticsearch 8 to Elasticsearch 9, addressing breaking changes, API removals, deprecations, and required code modifications. Migrates to the `co.elastic.clients:elasticsearch-rest5-client` transport (Apache HttpClient 5.x), which is Elastic's recommended path for the 9.x line. To retain the legacy Apache HttpClient 4.x transport, run `io.moderne.elastic.elastic9.MigrateToElasticsearch9LegacyTransport` instead. +* [io.moderne.elastic.elastic9.MigrateToElasticsearch9Core](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9core) + * **Migrate from Elasticsearch 8 to 9 (API renames, transport-agnostic)** + * The transport-agnostic portion of the Elasticsearch 8 to 9 migration — API renames, field renames, numeric type changes, and removed-class comments. Used as a building block by `io.moderne.elastic.elastic9.MigrateToElasticsearch9` and `io.moderne.elastic.elastic9.MigrateToElasticsearch9LegacyTransport`. +* [io.moderne.elastic.elastic9.MigrateToElasticsearch9LegacyTransport](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/migratetoelasticsearch9legacytransport) + * **Migrate from Elasticsearch 8 to 9 (legacy Apache HttpClient 4.x transport)** + * Same API/type migrations as `io.moderne.elastic.elastic9.MigrateToElasticsearch9`, but keeps the legacy `org.elasticsearch.client:elasticsearch-rest-client` transport (Apache HttpClient 4.x). Use this only when you intentionally cannot adopt Apache HttpClient 5.x. Not safe to chain inside the Spring Boot 4 migration. * [io.moderne.elastic.elastic9.RenameApiField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/elastic/elastic9/renameapifield) * **Rename `Elasticsearch valueBody()` methods** * In Elasticsearch Java Client 9.0, the generic `valueBody()` method and `valueBody(...)` builder methods have been replaced with specific getter and setter methods that better reflect the type of data being returned. Similarly, for `GetRepositoryResponse`, the `result` field also got altered to `repositories`. @@ -5532,108 +5538,132 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full ### rewrite-nullability -* [io.moderne.nullability.ApplyNullAwayFindingsFromReport](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/applynullawayfindingsfromreport) - * **Apply NullAway findings from a WARN report** - * Applies sound, behavior-preserving fixes for the NullAway findings in a WARN-level compile report at /tmp/nullaway-report.txt (requireNonNull at dereferences, @MonotonicNonNull on uninitialized fields, @Nullable on nullable returns/field-assignments). Run iteratively: compile, regenerate the report, re-run, until no findings remain. -* [io.moderne.nullability.PrepareForNullAway](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/preparefornullaway) - * **Prepare a codebase for NullAway** - * The end-to-end, code-level preparation for enabling [NullAway](https://github.com/uber/NullAway): standardize nullability annotations to JSpecify, infer and add `@Nullable` everywhere a value is provably nullable, and apply the null-safety code refactors (lazily-initialized fields get `@MonotonicNonNull`; nullable field reads are hoisted into locals so the checker can refine them). This covers the safe, automatic transformations. The deliberately-gated rollout steps — marking `@NullMarked` scopes (`io.moderne.nullability.scope.*`) and wiring NullAway into the build (`io.moderne.nullability.build.*`) — are intentionally NOT included here; run them per module once `io.moderne.nullability.search.NullAwayReadinessReport` shows that module is clean. -* [io.moderne.nullability.PrepareForNullAwayWithBaseline](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/preparefornullawaywithbaseline) - * **Prepare a codebase for NullAway, baselining the remaining findings** - * Runs the full code-level `io.moderne.nullability.PrepareForNullAway` inference, then carries the pre-existing NullAway findings of the classes listed in the baseline file as a `@SuppressWarnings("NullAway")` baseline. This lets a codebase enable NullAway at ERROR immediately — every clean class and every new file is checked, while the listed classes' existing debt is snapshotted to be burned down over time. The baseline file is produced from a NullAway WARN-level build report of the inference output (one fully-qualified top-level class name per line). -* [io.moderne.nullability.cleanup.HoistNullableFieldReadIntoLocal](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/cleanup/hoistnullablefieldreadintolocal) - * **Hoist a guarded `@Nullable` field read into a local variable** - * NullAway cannot refine a `@Nullable` field across a dereference, because the field could be mutated between the null check and the use, so `if (this.f != null) \{ this.f.foo(); \}` is rejected. This recipe reads the field into a local once — `String f = this.f; if (f != null) \{ f.foo(); \}` — which NullAway can refine. It matches an `if` whose condition is `<field> != null` (or `null != <field>`) for an instance field declared with a nullability annotation, and whose then-block dereferences the field, then introduces a local of the field's type before the `if` and replaces the field reads in the condition and then-block with that local. The else-block is left untouched (the field is still nullable there). Conservative by design: it skips locals (which NullAway already refines), non-`@Nullable` fields, fields reassigned inside the then-block, and cases where the chosen local name would collide with an in-scope name. Only Java sources are modified. -* [io.moderne.nullability.cleanup.MoveNullableToTypeUsePosition](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/cleanup/movenullabletotypeuseposition) - * **Move a leading `@Nullable` to the type-use position** - * Relocates a leading (declaration-position) JSpecify `@Nullable` to immediately before the type when modifiers separate them, turning `@Nullable private final String f` into `private final @Nullable String f` (and the same for method returns). JSpecify `@Nullable` is a `TYPE_USE` annotation, so the type-use position is the precise, conventional placement; the leading form compiles and means the same but reads less clearly. Only the `Nullable` simple name is moved (declaration-only flavors like `@CheckForNull` are left alone), the existing annotation is reused, and it only acts when a modifier precedes the type. -* [io.moderne.nullability.cleanup.RelocateNullableToArrayReference](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/cleanup/relocatenullabletoarrayreference) - * **Relocate a misplaced leading `@Nullable` on a primitive array to the array reference** - * Turns `@Nullable long[] x` into `long @Nullable [] x`. On a primitive-element array a leading type-use `@Nullable` binds to the (impossible-to-be-null) element type, so NullAway still treats the array reference as `@NonNull` and flags `null` assignments; moving the annotation to the array-reference position (which NullAway reads) fixes that without changing intent. Only primitive-element arrays with a leading nullable annotation are changed; object-element arrays (where a leading `@Nullable` legitimately means nullable elements) are left untouched. -* [io.moderne.nullability.cleanup.RemoveRedundantNullableOnMethodReturn](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/cleanup/removeredundantnullableonmethodreturn) - * **Remove a redundant declaration-position `@Nullable` on a method return** - * When a method return type already carries a TYPE_USE `@Nullable` (for example `<T> @Nullable T` or `pkg.@Nullable Type`), a second `@Nullable` in the leading (declaration) position or before the type parameters (`@Nullable <T> @Nullable T`) is redundant — and on generic, qualified, or nested return types it is rejected by `javac` ("Nullable is not a repeatable annotation interface" / "scoping construct cannot be annotated with type-use annotation"). This removes that duplicate so the JSpecify annotation survives in the single, valid TYPE_USE position. It only ever removes an annotation that is provably duplicated by one on the return type itself, so it never changes a method's nullability. -* [io.moderne.nullability.cleanup.UseMonotonicNonNullForLazyInitializedField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/cleanup/usemonotonicnonnullforlazyinitializedfield) - * **Use `@MonotonicNonNull` for lazily-initialized fields** - * Annotates a lazily-initialized field with the Checker Framework `@org.checkerframework.checker.nullness.qual.MonotonicNonNull` annotation, which NullAway recognises as the idiomatic contract for a field that is set the first time it is needed and never reset to null afterward. NullAway flags a non-null instance field that is not assigned in the constructor; for such a lazily-initialized field `@MonotonicNonNull` is the correct fix rather than `@Nullable`, because the field is non-null after first use, so readers should not be forced to handle null. A field qualifies when at least one assignment to it is guarded by a `f == null` (or `this.f == null`) check, it is never assigned null anywhere except an explicit `= null` declaration initializer, and it is not assigned a non-null value at its declaration or unconditionally in a constructor. Conservative by design: it skips primitive, `final`, `static`, and already-annotated fields, fields assigned null outside their initializer (genuinely `@Nullable` — left for `AddNullableToField`), and fields assigned non-null unconditionally. Kotlin and Groovy express field nullability in the type system, which their compilers already enforce, so those sources are generally left unchanged. -* [io.moderne.nullability.fix.ApplyNullAwayFindings](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/fix/applynullawayfindings) - * **Apply sound fixes for NullAway findings** - * Applies behavior-preserving fixes for the findings in a NullAway WARN-level compile report, driven by the exact `file:line` locations NullAway reported. Dereferences of a `@Nullable` value, `@Nullable` values that are unboxed, `@Nullable` arguments passed where a `@NonNull` parameter is required, and `@Nullable` `switch` selectors are all wrapped in `requireNonNull(...)` (statically imported from `java.util.Objects`, which throws exactly when the original code already would). Uninitialized `@NonNull` fields (instance or `static`) are annotated `@MonotonicNonNull`, methods that return a `@Nullable` value get a JSpecify `@Nullable` return type, fields assigned a `@Nullable` value get a JSpecify `@Nullable` (which takes precedence over `@MonotonicNonNull`), and a parameter that an override declares `@NonNull` while its supertype declares it `@Nullable` gets a JSpecify `@Nullable`. No warnings are suppressed and runtime behavior is unchanged. The recipe is idempotent and conservative: for an `@Override` it resolves the overridden supertype method's return nullability from the type model and acts covariantly (widen to `@Nullable` only when the overridden return is `@Nullable`; otherwise assert `@NonNull` with `requireNonNull`, or leave it alone when the contract is unknown), and it never emits invalid Java — on qualified/nested types it places the annotation in the type-use position (`Outer.@MonotonicNonNull Inner`). Only Java sources are modified. -* [io.moderne.nullability.infer.AddNullableBoundToPassthroughTypeParameter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullableboundtopassthroughtypeparameter) +* [io.moderne.nullability.AddMonotonicNonNullToLazilyInitializedField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addmonotonicnonnulltolazilyinitializedfield) + * **Add `@MonotonicNonNull` to a lazily-initialized field** + * Annotates a lazily-initialized field with the Checker Framework `@org.checkerframework.checker.nullness.qual.MonotonicNonNull` annotation, the correct contract for a field that NullAway flags as not assigned in the constructor but that is set lazily and never reset to null (so `@Nullable` would needlessly force readers to handle null). A field qualifies when at least one assignment to it is guarded by a `f == null` check, it is never assigned null except in its declaration initializer, and it is not assigned non-null at its declaration or unconditionally in a constructor. Primitive, `final`, `static`, and already-annotated fields are skipped, and only Java fields are modified. +* [io.moderne.nullability.AddMonotonicNonNullToUninitializedField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addmonotonicnonnulltouninitializedfield) + * **Add `@MonotonicNonNull` to an uninitialized field** + * Adds the Checker Framework `@MonotonicNonNull` to a non-primitive, non-`final` reference field inside a `@NullMarked` scope that has no nullability annotation, no initializer, no dependency-injection annotation, and is not definitely assigned by the end of construction (or is read before assignment) — the condition for NullAway's "@NonNull field not initialized" error. A field that is also assigned a literal `null` is genuinely nullable and gets JSpecify `@Nullable` instead. Java sources only; idempotent; only annotations are added. +* [io.moderne.nullability.AddNullMarkedToAllPackages](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullmarkedtoallpackages) + * **Add `@NullMarked` to every package** + * Brings a whole repository into JSpecify checked scope: generates a bare `package-info.java` for any package that has Java sources but lacks one, then adds the `@NullMarked` annotation to every `package-info.java` (existing or generated). Unconditional — intended to run first in the `NullSafety` recipe so the inference and repair recipes that follow treat the entire project as checked scope and fix whatever marking exposes. The default package, packages explicitly `@NullUnmarked`, and generated sources (a `/generated/` path or a `@Generated` class) are skipped. Idempotent and Java only. +* [io.moderne.nullability.AddNullMarkedToPackageInfo](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullmarkedtopackageinfo) + * **Add `@NullMarked` to `package-info.java` for an allowlist of packages** + * Adds the JSpecify `@NullMarked` annotation to the `package-info.java` of an explicit allowlist of packages. The allowlist supports exact package names and a trailing `.*` prefix wildcard; an empty allowlist is a no-op. When `generateMissing` is enabled, an allowlisted package that has Java sources but no `package-info.java` gets one generated. Idempotent and Java only. +* [io.moderne.nullability.AddNullableBoundToPassthroughTypeParameter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullableboundtopassthroughtypeparameter) * **Add a `@Nullable` upper bound to a pass-through type parameter fed a null-returning lambda** - * When a `null`-returning lambda is passed to a generic method whose single, unbounded type parameter is also its return type (a value pass-through such as `<T> T record(String, Supplier<T>)`), widen the declaration to `<T extends @Nullable Object>` so returning `null` through it is legal under JSpecify/NullAway. Relaxing the upper bound is sound (it never rejects previously-valid code) and is the standard JSpecify idiom for a type variable that passes a value through; the method's return correctly becomes `@Nullable` at the null-returning call sites. Only methods declared in the working set, with exactly one unbounded type parameter that is the return type, are changed. -* [io.moderne.nullability.infer.AddNullableToArrayElementType](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullabletoarrayelementtype) + * When a `null`-returning lambda is passed to a generic method whose single, unbounded type parameter is also its return type (a value pass-through such as `<T> T record(String, Supplier<T>)`), widen the declaration to `<T extends @Nullable Object>` so returning `null` through it is legal under JSpecify/NullAway. Relaxing the upper bound is sound; it never rejects previously-valid code. Only methods declared in the working set, with exactly one unbounded type parameter that is the return type, are changed. +* [io.moderne.nullability.AddNullableFromKotlinCallSites](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullablefromkotlincallsites) + * **Add `@Nullable` to Java returns from Kotlin call sites** + * Adds the JSpecify `@Nullable` annotation to the return type of **Java** methods based on how those methods are used in **Kotlin** code. A Java method returning a reference type appears to Kotlin as a platform type (`String!`) of unknown nullability; Kotlin call sites that treat the result as possibly null reveal the intended contract. This recipe scans Kotlin sources for such usage — a safe call (`call()?.x`), an elvis operand (`call() ?: fallback`), a not-null assertion (`call()!!`), or a comparison to `null` — and writes `@Nullable` onto the matching Java method declaration. Only Java sources are modified; Kotlin sources are read for evidence and left unchanged. Conservative by design: it skips primitive and `void` returns, methods that already carry a nullability annotation, and `@Override` methods. +* [io.moderne.nullability.AddNullableToArrayElementType](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletoarrayelementtype) * **Add `@Nullable` to array element types that can hold null** - * Adds the JSpecify `@Nullable` annotation to the element type of a Java array whose elements are provably nullable, placing it on the component type to produce `@Nullable String[]` (the array's *elements* may be null) rather than `String @Nullable []` (the array *reference* may be null). NullAway in JSpecify mode checks this position. An array declaration (field, local, parameter, or return type) is annotated when its initializer is an array literal containing a `null` element (`String[] a = \{null\}`, `new String[]\{x, null\}`) or when an element is assigned a provably-null value in the same method body (`arr[i] = null`). Conservative by design: it skips primitive-element arrays (whose elements can never be null), arrays whose element type already carries a nullability annotation, and non-Java sources (Kotlin and Groovy express element nullability in the type system, which their compilers already enforce). -* [io.moderne.nullability.infer.AddNullableToField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullabletofield) + * Adds the JSpecify `@Nullable` annotation to the element type of a Java array whose elements are provably nullable, producing `@Nullable String[]` (the array's *elements* may be null) rather than `String @Nullable []` (the array *reference* may be null), which NullAway checks in JSpecify mode. An array declaration (field, local, parameter, or return type) is annotated when its initializer is an array literal containing a `null` element (`String[] a = \{null\}`) or when an element is assigned a provably-null value (`arr[i] = null`) — within the same method body for a local or parameter, or anywhere in the enclosing class for a field (so a field array nulled in a separate method is still detected). Conservative by design: it skips primitive-element arrays, arrays whose element type already carries a nullability annotation, and non-Java sources. +* [io.moderne.nullability.AddNullableToField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletofield) * **Add `@Nullable` to fields that can hold null** - * Adds the JSpecify `@Nullable` annotation to a Java field when that field is provably assigned a nullable value somewhere in the project: a declaration initializer or an assignment (`f = expr`, `this.f = expr`, or `obj.f = expr`) whose value is the `null` literal (directly, through a cast or parentheses, or via either branch of a ternary), or a call to a method whose return is itself nullable. Nullability therefore propagates from every assignment site to the field's declaration across the whole project. This prepares the code for NullAway. Conservative by design: it skips primitive fields, `final` fields with a non-null initializer, record components, fields that already carry a nullability annotation, and fields with a dependency-injection annotation (`@Inject`, `@Autowired`, `@Resource`, `@Mock`, `@Value`, `@Bean`) that are initialized externally. Kotlin and Groovy express field nullability in the type system (`T?`), which the compiler already enforces, so those sources are generally left unchanged. -* [io.moderne.nullability.infer.AddNullableToFunctionalReturnArgument](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullabletofunctionalreturnargument) + * Adds the JSpecify `@Nullable` annotation to a Java field when that field is provably assigned a nullable value anywhere in the project: a declaration initializer or an assignment (`f = expr`, `this.f = expr`, or `obj.f = expr`) whose value is the `null` literal (directly, through a cast or parentheses, or via either branch of a ternary) or a call to a nullable-returning method. Nullability propagates from every assignment site to the field's declaration across the project, preparing the code for NullAway. Conservative by design: it skips primitive fields, `final` fields with a non-null initializer, record components, fields already annotated, and fields with a dependency-injection annotation (`@Inject`, `@Autowired`, `@Resource`, `@Mock`, `@Value`, `@Bean`). Only Java fields are modified. +* [io.moderne.nullability.AddNullableToFunctionalReturnArgument](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletofunctionalreturnargument) * **Add `@Nullable` to a functional-interface return type argument fed a null-returning lambda** - * When a `null`-returning lambda is passed for a functional-interface parameter (such as `Function<R, T>`) of a method that consumes the produced value in a null-tolerant way, annotate that interface's return type argument `@Nullable` (`Function<R, @Nullable T>`) so returning `null` through the callback is legal under JSpecify/NullAway. This is the correct JSpecify expression of "the callback may return null"; it is distinct from widening a pass-through type-parameter bound (handled separately) and a de-overlap guard keeps the two from both firing. Only parameters of recognized functional interfaces, on methods declared in the working set, are changed; already-`@Nullable` and wildcard/raw arguments are left untouched. -* [io.moderne.nullability.infer.AddNullableToParameterCrossFile](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullabletoparametercrossfile) + * When a `null`-returning lambda is passed for a functional-interface parameter (such as `Function<R, T>`) of a method that consumes the produced value in a null-tolerant way, annotates that interface's return type argument `@Nullable` (`Function<R, @Nullable T>`) so returning `null` through the callback is legal under JSpecify/NullAway. This is distinct from widening a pass-through type-parameter bound (handled separately); a de-overlap guard keeps the two from both firing. Only parameters of recognized functional interfaces, on methods declared in the working set, are changed; already-`@Nullable` and wildcard/raw arguments are left untouched. +* [io.moderne.nullability.AddNullableToMismatchedTypeArgument](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletomismatchedtypeargument) + * **Add `@Nullable` to a mismatched generic type argument** + * Adds `@Nullable` to a nested generic type argument when a variable initializer or `return` has a wider nested element nullness than its target (such as a `List<@Nullable String>` assigned into a `List<String>`) by adding `@Nullable` to the target's nested type argument. A generic container is invariant in its element nullness, so the mismatch is a NullAway error. Gated on JSpecify `@NullMarked` scope and applied only where the fix is local to a declaration this recipe owns (a variable initializer or a method return type); raw types, unresolved bases, arity mismatches, and the diamond `new B<>()` target are left unchanged. Idempotent. +* [io.moderne.nullability.AddNullableToNullAssignedField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletonullassignedfield) + * **Add `@Nullable` to a field assigned a nullable value** + * Adds a JSpecify `@Nullable` to a `@NonNull` reference field that is assigned a provably-nullable value, which would otherwise trigger NullAway's "assigning @Nullable expression to @NonNull field" error inside a `@NullMarked` scope. A value is provably nullable when it is the `null` literal, a call to a nullable-returning method, or a reference to a `@Nullable` variable or field. Only fires where NullAway is active; idempotent, and leaves a field unchanged when it cannot be resolved. Java sources only. +* [io.moderne.nullability.AddNullableToNullReturningMethod](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletonullreturningmethod) + * **Add `@Nullable` to a method that can return null** + * Adds JSpecify `@Nullable` to a method or lambda whose effective return type is non-null but that returns a provably-nullable value, a NullAway error inside a `@NullMarked` scope. A regular method has its return type widened to JSpecify `@Nullable` in the type-use position; when the non-null return contract cannot be widened (an override of a non-null supertype return, or a lambda whose functional-interface return is non-null) the returned expression is wrapped in `java.util.Objects.requireNonNull(...)` instead, leaving runtime behavior unchanged. Nullability is determined from type attribution, and an unconditional `return null` is left for a human. The recipe is idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.AddNullableToParameterCrossFile](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletoparametercrossfile) * **Add `@Nullable` to method parameters that can receive null** - * Adds the JSpecify `@Nullable` annotation to a Java method parameter when some call site anywhere in the project provably passes a nullable argument in that position: the `null` literal (directly, through a cast or parentheses, or via either branch of a ternary), or a call to a method whose return is itself nullable. Nullability therefore propagates from the call site to the callee's declaration across the whole project. This prepares the code for NullAway. Conservative by design: it skips primitive parameters, parameters that already carry a nullability annotation, varargs parameters, and `@Override` methods (where widening a parameter would break override consistency). Kotlin and Groovy express parameter nullability in the type system (`T?`), which the compiler already enforces, so those sources are generally left unchanged. -* [io.moderne.nullability.infer.AddNullableToReturnType](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullabletoreturntype) + * Adds the JSpecify `@Nullable` annotation to a Java method parameter when some call site anywhere in the project provably passes a nullable argument in that position: the `null` literal (directly, through a cast or parentheses, or via either branch of a ternary), or a call to a method whose return is itself nullable. Conservative by design: it skips primitive parameters, parameters that already carry a nullability annotation, varargs parameters, and `@Override` methods (where widening a parameter would break override consistency). Only Java parameters are modified. +* [io.moderne.nullability.AddNullableToReturnType](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletoreturntype) * **Add `@Nullable` to methods that can return null** - * Adds the JSpecify `@Nullable` annotation to the return type of Java methods whose body returns a provably-nullable value: an explicit `return null` (directly, through a cast or parentheses, or via either branch of a ternary), or a call to a method whose return is itself nullable. Nullability propagates from callee to caller across the whole project. This prepares the code for NullAway. Conservative by design: it skips primitive and `void` returns, methods that already carry a nullability annotation, and `@Override` methods (where annotating the return could violate the supertype contract). Kotlin and Groovy express return nullability in the type system (`T?`), which the compiler already enforces, so those sources are generally left unchanged. -* [io.moderne.nullability.infer.AddNullableToTypeArgument](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/addnullabletotypeargument) + * Adds the JSpecify `@Nullable` annotation to the return type of Java methods whose body returns a provably-nullable value: an explicit `return null` (directly, through a cast or parentheses, or via either branch of a ternary), or a call to a method whose return is itself nullable. Conservative by design: it skips primitive and `void` returns, methods that already carry a nullability annotation, and `@Override` methods (where annotating the return could violate the supertype contract). Only Java return types are modified. +* [io.moderne.nullability.AddNullableToTypeArgument](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullabletotypeargument) * **Add `@Nullable` to collection and map type arguments that hold null elements** - * Places the JSpecify `@Nullable` annotation on a collection or map type argument when its elements or values are provably nullable, producing `List<@Nullable String>` or `Map<String, @Nullable String>`. JSpecify distinguishes `List<@Nullable String>` (the list may hold `null` elements) from `@Nullable List<String>` (the list reference may be `null`); this recipe annotates the type argument, which NullAway enforces in JSpecify mode. A type argument is annotated when `Collection.add(...)` is called with a provably-null element, `Map.put(...)` is called with a provably-null value, or the declaration's initializer is a `List.of(...)`/`Set.of(...)`/`Arrays.asList(...)` containing a `null`. The receiver is resolved to its declaration within the same compilation unit (cross-file declarations are not handled). Conservative by design: it skips wildcard (`?`) and raw type arguments, and arguments that are already `@Nullable`, so it is idempotent. -* [io.moderne.nullability.infer.ComposeJSpecifyBestPractices](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/composejspecifybestpractices) + * Places the JSpecify `@Nullable` annotation on a collection or map type argument when its elements or values are provably nullable, producing `List<@Nullable String>` or `Map<String, @Nullable String>` (the list may hold `null` elements) rather than `@Nullable List<String>` (the list reference may be `null`), which NullAway enforces in JSpecify mode. A type argument is annotated when `Collection.add(...)` is called with a provably-null element, `Map.put(...)` with a provably-null value, or the declaration's initializer is a `List.of(...)`/`Set.of(...)`/`Arrays.asList(...)` containing a `null`. The receiver is resolved to its declaration within the same compilation unit (cross-file declarations are not handled). Conservative by design: it skips wildcard and raw type arguments and ones already `@Nullable`. +* [io.moderne.nullability.AddNullnessContractToValidationHelper](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/addnullnesscontracttovalidationhelper) + * **Add a `@Contract` nullness contract to a validation helper** + * Adds an `org.jetbrains.annotations.@Contract` annotation to a single-`@Nullable`-parameter helper method whose body provably encodes a nullness contract, so the checker can narrow at every call site without any runtime assertion. Three canonical body shapes are recognized: a `boolean`-returning method whose body is `return arg != null && ...;` (the argument's non-nullity is a required conjunct) becomes `@Contract("null -> false")`; a method that unconditionally throws — or delegates to `requireNonNull` / `checkNotNull` — when the argument is `null` becomes `@Contract("null -> fail")`; and an identity pass-through that returns the argument unchanged becomes `@Contract("null -> null")`. Only methods with exactly one parameter, a simple recognizable body, and no existing `@Contract` are annotated. The edit is annotation-only and behavior-preserving — runtime semantics are unchanged. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.AlignOverrideNullabilityWithSupertype](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/alignoverridenullabilitywithsupertype) + * **Align override nullability with the supertype** + * Aligns a method or lambda parameter whose declared nullability is inconsistent with the supertype member it overrides, a contract violation under [NullAway](https://github.com/uber/NullAway). An override that restricts a `@Nullable` supertype parameter to non-null has JSpecify `@Nullable` added to that parameter (parameters are contravariant); an override that widens a non-null supertype return to `@Nullable` has the erroneous `@Nullable` removed from its return type and its `@Nullable` returns wrapped in `java.util.Objects.requireNonNull(...)` (return types are covariant), which leaves runtime behavior unchanged. Conservative: a supertype's annotations are trusted only when the supertype is itself in an annotated scope, a `return null` and a null-guarded return are never wrapped, and nothing is changed when a participating type cannot be resolved. Idempotent; Java sources only. +* [io.moderne.nullability.AnnotateThriftGetterNullability](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/annotatethriftgetternullability) + * **Add `@Nullable` to generated Thrift getters of `optional` fields** + * Annotates the generated-Java getter of a Thrift `optional` field with the JSpecify `@Nullable` annotation, reading the field's requiredness from the `.thrift` IDL (which appears as a plain-text source). In an Apache-Thrift-generated struct only an `optional` field may be left unset, so only its getter (`getFoo()`, or `isFoo()` for a `bool`) can return `null`; a `required` field, the Airbnb `non_null` extension, and an unqualified default field are populated and left untouched. A scanning pass parses each `.thrift` for `struct`/`union`/`exception` blocks and their `optional` fields; the edit pass annotates the matching getter on the generated Java class whose simple name equals the struct name and which implements `org.apache.thrift.TBase`. Adding `@Nullable` only states the contract the IDL already declares, so behavior is unchanged. Conservative by design: a getter is annotated only when its owning class is a recognized Thrift struct, its name matches an `optional` field, and it is not already nullable. Gated off the `NullSafety` apex (generated source); only Java sources are modified, and re-running after regeneration converges. +* [io.moderne.nullability.CollapseOptionalPresentGuardToGet](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/collapseoptionalpresentguardtoget) + * **Route a guarded raw accessor through its present `Optional`** + * Inside the then-branch of an `if (xOpt().isPresent()) \{ ... \}` guard, rewrites a sibling raw nullable accessor `getX()` to `xOpt().get()`, so the checker flows non-null through the `Optional` instead of needing a `requireNonNull`. NullAway flags the bare `getX()` dereference because the accessor is `@Nullable`, but the enclosing `isPresent()` guard already proves the corresponding `Optional` is present; reading through `xOpt().get()` re-expresses the same value via the guarded, provably-present `Optional`. The rewrite is gated for correctness over coverage: the guard must be exactly `<recv>.isPresent()` on a no-argument, side-effect-free `Optional` accessor; the rewritten `getX()` must be the matching no-argument raw accessor (same enclosing receiver, and `<recv>` named `getX` plus an `Optional` suffix) that is provably `@Nullable` here; and the use must be lexically inside the then-block so the guard dominates it. Because the `Optional` is proven present in the guarded branch, `.get()` cannot throw where the raw accessor did not, so runtime behavior is unchanged. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.ComposeJSpecifyBestPractices](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/composejspecifybestpractices) * **Compose JSpecify best practices (intra-body nullability inference)** - * The intra-body nullability inference pass. After [StandardizeNullabilityAnnotationsToJSpecify](https://docs.openrewrite.org) has normalized every annotation flavor onto a single [JSpecify](https://jspecify.dev) form, this recipe runs the OpenRewrite static-analysis inference recipes that derive nullability from signals *inside* each method body: methods whose bodies can return `null` (including standard library awareness such as `Map.get`/`Queue.poll`) and parameters that are null-checked in the body. These complement the cross-file inference recipes (`AddNullableToReturnType`, `AddNullableToParameterCrossFile`, `AddNullableToField`, `PropagateNullableAcrossOverrides`) which reason across files; this pass should run AFTER `StandardizeNullabilityAnnotationsToJSpecify` and alongside those cross-file inference recipes. All annotations are emitted as JSpecify (`org.jspecify.annotations.@Nullable` / `@NonNull`). -* [io.moderne.nullability.infer.InferJavaNullabilityFromKotlinCallSites](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/inferjavanullabilityfromkotlincallsites) - * **Infer Java `@Nullable` return types from Kotlin call sites** - * Adds the JSpecify `@Nullable` annotation to the return type of **Java** methods based on how those methods are used in **Kotlin** code. A Java method returning a reference type appears to Kotlin as a platform type (`String!`) of unknown nullability; Kotlin call sites that treat the result as possibly null reveal the intended contract. This recipe scans Kotlin sources for such usage — a safe call (`call()?.x`), an elvis operand (`call() ?: fallback`), a not-null assertion (`call()!!`), or a comparison to `null` — and writes `@Nullable` onto the matching Java method declaration, resolving the platform-type ambiguity. Only Java sources are modified; Kotlin sources are read for evidence and left unchanged. Conservative by design: it skips primitive and `void` returns, methods that already carry a nullability annotation, and `@Override` methods (where annotating the return could violate the supertype contract). -* [io.moderne.nullability.infer.InferNullability](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/infernullability) - * **Infer and add `@Nullable` annotations** - * Infer where reference values can be null and add JSpecify `@Nullable` accordingly — across method return types, parameters, fields, override hierarchies, Kotlin call sites, and generic/array element types — together with OpenRewrite's static-analysis intra-body inference. Run after `io.moderne.nullability.migrate.MigrateNullabilityToJSpecify` so existing annotations are already in JSpecify form. Nullability propagates across files and converges over successive recipe cycles. -* [io.moderne.nullability.infer.PropagateNullableAcrossOverrides](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/propagatenullableacrossoverrides) - * **Propagate `@Nullable` across override relationships** - * Enforces NullAway override consistency by propagating existing JSpecify `@Nullable` annotations through `@Override` relationships. Because return types are covariant, a `@Nullable` return on an overriding method is propagated up to the supertype method it overrides. Because parameters are contravariant, a `@Nullable` parameter on a supertype method is propagated down to the corresponding parameter of every overriding method. Methods are matched across files by their erased signature `name(paramTypes)` plus a declaring-type subtype relationship. Conservative by design: it never widens a legal covariant return narrowing (a `@Nullable` supertype return overridden by a non-null return is left alone), skips primitive and `void` returns and already-annotated positions, and does nothing when a participating type cannot be resolved. Multi-hop hierarchies converge over successive recipe cycles. Only Java sources are modified; Kotlin and Groovy express nullability in the type system, which their compilers already enforce. -* [io.moderne.nullability.infer.UpgradeLazilyInitializedFieldToMonotonicNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/infer/upgradelazilyinitializedfieldtomonotonicnonnull) - * **Upgrade a lazily-initialized `@Nullable` field to `@MonotonicNonNull`** - * Upgrades a `private`, non-`final` JSpecify `@Nullable` reference field to the Checker Framework `@org.checkerframework.checker.nullness.qual.MonotonicNonNull` annotation when it is genuinely a lazily-initialized-non-null field, so NullAway treats reads of it as non-null and the `requireNonNull` noise a plain `@Nullable` would force at every read disappears. A field qualifies only if it is `private` and non-`final`, its declaration declares exactly one reference-typed variable, there is at least one assignment to it, EVERY assignment has a provably-non-null right-hand side (`new`, an array creation, a non-null literal, `this`, or a call to a method whose return is resolved and not `@Nullable`), at least one assignment is outside a constructor (the lazy signal), and EVERY null-observation of the field (`f == null`/`f != null`/`f instanceof X`) is a lazy-init guard — the condition of an `if` whose then-branch assigns the field. Conservative and sound by design: `private` bounds the analysis to the declaring class so it is complete, and the absence of any null-handling use means the upgrade is runtime-NPE-preserving — it only removes the `@Nullable` signal where `null` would already crash. Any field whose `null` is handled gracefully anywhere, or any condition that cannot be proven, leaves the field unchanged. Only Java sources are modified. -* [io.moderne.nullability.migrate.MigrateNonNullApiToNullMarked](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/migratenonnullapitonullmarked) + * Run the OpenRewrite static-analysis inference recipes that derive nullability from signals inside each method body: methods whose bodies can return `null` (standard-library aware, e.g. `Map.get`/`Queue.poll`) and parameters that are null-checked in the body, emitting JSpecify `@Nullable`. Complements the cross-file inference recipes. +* [io.moderne.nullability.ExtractRepeatedNullableInvocationToLocal](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/extractrepeatednullableinvocationtolocal) + * **Extract a repeated `@Nullable` invocation into a local variable** + * When the same side-effect-free `@Nullable` method invocation (textually identical receiver, name, and no arguments — e.g. `source.get()`) appears two or more times in one block, hoists it into a single local `@Nullable Type x = source.get();` declared just before the first use and replaces every occurrence with `x`. NullAway cannot refine a `@Nullable` return across two separate calls — the second could return a different value — so `if (source.get() != null) \{ source.get().foo(); \}` is rejected; one local gives the checker a single narrowing point. The rewrite is strictly gated: the call must be provably `@Nullable` (resolved from the nullability model), side-effect free (only a no-argument getter-style call whose receiver is a simple identifier or `this`, never an argument-bearing or unresolved-type call), all occurrences must be in the same block, and the receiver must not be reassigned anywhere in that block (which could change the value between calls). A pure call evaluated once rather than N times yields the same value, so runtime behavior is unchanged. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.HoistNullableFieldReadIntoLocal](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/hoistnullablefieldreadintolocal) + * **Hoist a guarded `@Nullable` field read into a local variable** + * NullAway cannot refine a `@Nullable` field across a dereference, because the field could be mutated between the null check and the use, so `if (this.f != null) \{ this.f.foo(); \}` is rejected. This recipe reads the field into a local once before the `if` — `String f = this.f; if (f != null) \{ f.foo(); \}` — which NullAway can refine. Only `@Nullable` instance fields guarded by a `!= null` check are rewritten, and the field must not be reassigned inside the then-block. +* [io.moderne.nullability.MigrateNonNullApiToNullMarked](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migratenonnullapitonullmarked) * **Migrate `@NonNullApi`/`ParametersAreNonnullByDefault` to JSpecify `@NullMarked`** - * Migrates an existing package-level "non-null by default" convention to the JSpecify `@org.jspecify.annotations.NullMarked` annotation so that NullAway and other JSpecify-aware checkers recognize the null-marked scope. Replaces `@org.springframework.lang.NonNullApi`, `@org.springframework.lang.NonNullFields`, `@javax.annotation.ParametersAreNonnullByDefault`, and `@jakarta.annotation.ParametersAreNonnullByDefault` (on `package-info.java` package declarations and on type declarations) with a single `@NullMarked`, removing the old annotations and their imports and adding the `@NullMarked` import. When both Spring `@NonNullApi` and `@NonNullFields` are present they collapse to one `@NullMarked` rather than two. Idempotent and conservative: a scope already marked `@NullMarked` and unrelated packages or types are left unchanged. Java only. -* [io.moderne.nullability.migrate.MigrateNullabilityToJSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/migratenullabilitytojspecify) - * **Migrate existing nullability annotations to JSpecify** - * Convert a codebase's existing nullability annotations and conventions onto [JSpecify](https://jspecify.dev) so that NullAway and the inference recipes have a single, consistent vocabulary to reason about. Runs every migration sub-recipe: standardize the per-element `@Nullable`/`@NonNull` flavors (JSR-305, JetBrains, Checker, Android, Eclipse, SpotBugs, ...), and convert package-level "non-null by default" conventions (Spring `@NonNullApi`/`@NonNullFields`, JSR-305/Jakarta `@ParametersAreNonnullByDefault`) to `@NullMarked`. -* [io.moderne.nullability.migrate.StandardizeNullabilityAnnotationsToJSpecify](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/migrate/standardizenullabilityannotationstojspecify) - * **Standardize nullability annotations to JSpecify** - * Normalize the many nullability annotation flavors found across a codebase onto [JSpecify](https://jspecify.dev) (`org.jspecify.annotations.@Nullable` / `@NonNull`), placing `@Nullable` in the `TYPE_USE` position on method return types and removing redundant annotations on primitives. This is the annotation standardization pre-pass that nullability inference recipes depend on, giving downstream analyses a single, consistent annotation flavor to reason about. -* [io.moderne.nullability.scope.AddNullMarkedToCleanPackages](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/scope/addnullmarkedtocleanpackages) - * **Add `@NullMarked` to packages that are ready for NullAway** - * Automatically adds the JSpecify `@NullMarked` annotation to a package — by annotating its existing `package-info.java` or generating one — but only when every Java class in the package is "ready", i.e. would not produce a fresh NullAway error once the scope is marked. A package fails the readiness gate (and is left unmarked) if any class in it has: (1) an uninitialized non-null instance field (the `FindUninitializedNonNullField` condition: non-`@Nullable`, non-`final`, non-`static`, reference-typed, no initializer, not assigned in every constructor, not dependency-injection-annotated); (2) a method whose body can return a provably-null value but whose return type is not `@Nullable`; or (3) a field initialized to a provably-null value that is not `@Nullable`. An `@Override` method that returns null without `@Nullable` is also treated as a blocker. Packages whose sources live under a generated marker path (`/generated/`, `/build/generated`, `/generated-sources/`) or whose classes carry a `@Generated` annotation are skipped. The recipe is idempotent and operates per leaf package; it never marks parent packages transitively. Java sources only. -* [io.moderne.nullability.scope.AddNullMarkedToPackageInfo](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/scope/addnullmarkedtopackageinfo) - * **Add `@NullMarked` to `package-info.java` for an allowlist of packages** - * Adds the JSpecify `@NullMarked` annotation to the `package-info.java` of an explicit allowlist of packages, for a controlled, package-at-a-time rollout toward NullAway. The allowlist supports exact package names and a trailing `.*` prefix wildcard; an empty allowlist is a no-op for safety. When `generateMissing` is enabled, an allowlisted package that has Java sources but no `package-info.java` gets one generated with `@NullMarked`. Idempotent and never double-marks. Only Java sources are considered. Pair with `AddNullMarkedToCleanPackages` for automatic gating. -* [io.moderne.nullability.scope.SuppressNullAwayInBaselineClasses](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/scope/suppressnullawayinbaselineclasses) - * **Suppress NullAway in baseline classes** - * Adds `@SuppressWarnings("NullAway")` to each top-level class whose fully-qualified name is listed in the baseline file, carrying those classes' pre-existing NullAway findings as a baseline so the check can be enabled at ERROR immediately while every other class and every new file stays checked. -* [io.moderne.nullability.search.FindInconsistentOverrideNullability](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/search/findinconsistentoverridenullability) - * **Find inconsistent `@Nullable` override declarations** - * Reports methods whose declared nullability is inconsistent with the method they override, a contract violation under [NullAway](https://github.com/uber/NullAway). Because return types are covariant, an overriding method that declares a `@Nullable` return while the overridden supertype method returns a non-null value is flagged on its return. Because parameters are contravariant, an overriding method whose parameter is non-null while the overridden supertype method declares the corresponding parameter `@Nullable` is flagged on that parameter. Methods are matched across files by their erased signature `name(paramTypes)` plus a declaring-type subtype relationship. Conservative by design: legal covariant return narrowing and contravariant parameter widening are never flagged, and nothing is reported when a participating type cannot be resolved. Only Java sources are inspected; Kotlin and Groovy express nullability in the type system, which their compilers already enforce. -* [io.moderne.nullability.search.FindNullableToNonNullArgument](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/search/findnullabletononnullargument) - * **Find nullable values passed to non-null parameters** - * Marks call arguments where a provably-nullable value is passed to a callee parameter that is not declared `@Nullable`. Inside a null-marked scope NullAway treats every unannotated parameter as non-null, so such a call is a NullAway error. A value is considered provably nullable when it is the `null` literal (directly, through a cast or parentheses, or via either branch of a ternary), a call to a method whose return is itself nullable, or a reference to a variable or field declared `@Nullable`. This is a search recipe: it only marks the offending arguments and does not modify the code. It is conservative — when the invoked method type cannot be resolved, the argument is left unmarked (a false negative rather than a false positive). -* [io.moderne.nullability.search.FindUninitializedNonNullField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/search/finduninitializednonnullfield) - * **Find uninitialized `@NonNull` fields (NullAway field-init)** - * Marks instance fields that would trigger NullAway's "@NonNull field not initialized" error: a non-static, non-primitive field that does not carry a nullability annotation, has no initializer, is not `final`, is not a dependency-injection / framework field (`@Inject`, `@Autowired`, `@Resource`, `@Mock`, `@Value`, `@Bean`, `@EJB`, `@PersistenceContext`, `@Spy`, `@InjectMocks`, `@Captor`), and is not unconditionally assigned in every declared constructor. A class with no constructors leaves such a field definitely unassigned. "Unconditionally assigned" is approximated as a `this.f = ...` or `f = ...` statement at the top level of a constructor body (not nested in an `if`, loop, `try`, `switch`, or lambda). Java sources only; Kotlin and Groovy express field initialization in the type system. -* [io.moderne.nullability.search.NullAwayReadinessReport](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/search/nullawayreadinessreport) - * **NullAway readiness scorecard** - * Produces a per-class readiness scorecard for a NullAway rollout as a data table, without modifying any source. For every Java class (top-level and nested) it counts the methods, fields, and parameters that already carry a `@Nullable` annotation, the instance fields that are non-null but uninitialized (the residual field-initialization risk NullAway flags once a scope is marked), and whether the class or its enclosing `package-info` is already `@NullMarked`. A consumer can use these numbers to compute annotation coverage and weigh it against field-init risk, then prioritize which packages or modules to mark `@NullMarked` first. This is a triage report, not a transformation: the recipe emits no source changes. + * Replaces an existing package-level "non-null by default" convention with the JSpecify `@org.jspecify.annotations.NullMarked` annotation so that NullAway recognizes the null-marked scope. Converts `@org.springframework.lang.NonNullApi`, `@org.springframework.lang.NonNullFields`, `@javax.annotation.ParametersAreNonnullByDefault`, and `@jakarta.annotation.ParametersAreNonnullByDefault` (on `package-info.java` package declarations and on type declarations), collapsing the Spring `@NonNullApi`/`@NonNullFields` pair to a single `@NullMarked`. Idempotent and Java only. +* [io.moderne.nullability.MoveNullableToTypeUsePosition](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/movenullabletotypeuseposition) + * **Move a leading `@Nullable` to the type-use position** + * Relocates a leading (declaration-position) JSpecify `@Nullable` to immediately before the type when modifiers separate them, turning `@Nullable private final String f` into `private final @Nullable String f` (and the same for method returns). JSpecify `@Nullable` is a `TYPE_USE` annotation, so the type-use position is the precise, conventional placement; the leading form compiles and means the same but reads less clearly. Only the `Nullable` simple name is moved (declaration-only flavors like `@CheckForNull` are left alone), the existing annotation is reused, and it only acts when a modifier precedes the type. +* [io.moderne.nullability.NullSafety](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/nullsafety) + * **Make a codebase null-safe** + * Make Java code null-safe end to end. Infers and adds JSpecify `@Nullable`/`@MonotonicNonNull` from the code's own signals (returns, parameters, fields, override hierarchies, Kotlin call sites, and the JSpecify generic frontier), then detects and repairs the residual nullability violations — dereferences, unboxing, `switch`, enhanced-`for`, passing a nullable argument, nullable returns, uninitialized non-null fields, and override consistency — directly from the LST. Behavior-preserving and idempotent; run to a fixpoint over recipe cycles. If the code still uses non-JSpecify annotation flavors, run `org.openrewrite.java.jspecify.MigrateToJSpecify` first. +* [io.moderne.nullability.PropagateNullableAcrossOverrides](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/propagatenullableacrossoverrides) + * **Propagate `@Nullable` across override relationships** + * Propagates existing JSpecify `@Nullable` annotations across `@Override` relationships so overrides honor their supertype's nullability contract. A `@Nullable` return propagates up to the overridden supertype method (returns are covariant); a `@Nullable` parameter propagates down to every overriding method (parameters are contravariant). Methods are matched across files by erased signature `name(paramTypes)` plus a declaring-type subtype relationship. Conservative by design: it never widens a legal covariant return narrowing, skips primitive/`void` returns and already-annotated positions, and does nothing when a participating type cannot be resolved. Only Java sources are modified. +* [io.moderne.nullability.RelaxOptionalOfToOfNullable](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/relaxoptionaloftoofnullable) + * **Relax `Optional.of` to `Optional.ofNullable` on nullable values** + * Rewrites `Optional.of(x)` to `Optional.ofNullable(x)` where the argument `x` is provably `@Nullable` at the call site. `Optional.of(null)` throws `NullPointerException`, while `Optional.ofNullable(null)` yields `Optional.empty()`, so the two factories diverge on the `null` path: this rewrite **changes observable runtime behavior** (an NPE becomes an empty optional) and therefore marks every call it changes for human review. The call is matched on `java.util.Optional of(..)`; the argument's nullness is resolved from the nullness oracle and the path-sensitive flow engine (no name-based heuristics), so a value already null-checked on the path is not flagged. A non-null literal argument, or one already protected by a non-null assertion (`requireNonNull` / `castToNonNull` / …), is left untouched, keeping the recipe idempotent. Gated on the call site being in an annotated scope; only Java sources are modified. +* [io.moderne.nullability.RelocateNullableToArrayReference](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/relocatenullabletoarrayreference) + * **Relocate a misplaced leading `@Nullable` on a primitive array to the array reference** + * Turns `@Nullable long[] x` into `long @Nullable [] x`. On a primitive-element array a leading `@Nullable` binds to the (impossible-to-be-null) element type, so NullAway still treats the array reference as `@NonNull`; moving the annotation to the array-reference position that NullAway reads fixes that without changing intent. Only primitive-element arrays are changed; object-element arrays, where a leading `@Nullable` legitimately means nullable elements, are left untouched. +* [io.moderne.nullability.RemoveProvablyDeadNullGuard](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/removeprovablydeadnullguard) + * **Remove a provably-dead `if (x == null)` guard** + * Removes an `if (x == null) \{ ... \}` guard whose then-branch the flow engine proves unreachable because `x` is already non-null at that point (e.g. after an earlier assertion, guard, or assignment). Such a guard is dead code: the `x == null` test can never be true, so its then-branch never executes and deleting it — while keeping any `else` body, the only live path — preserves behavior. To match the aggressiveness Airbnb endorses and no further, the removal fires only when the path-sensitive flow analysis decisively proves `x` non-null at the guard, and never on a parameter of a `public` method (the service-edge / untrusted-input validation point NullAway guidance explicitly excludes). The condition must be a bare `x == null` / `null == x` on a simple local or parameter; a compound condition, a field, or anything not flow-proven is left untouched. Behavior-preserving (it removes only unreachable code), idempotent, and conservative; only Java sources are modified. +* [io.moderne.nullability.RemoveRedundantNonNullAnnotation](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/removeredundantnonnullannotation) + * **Remove a redundant `@NonNull` annotation under `@NullMarked`** + * Removes an explicit `@NonNull` / `@Nonnull` annotation that is redundant inside a `@NullMarked` scope, where non-null is already the default. In JSpecify-normalized code an unannotated declaration in an annotated scope is already non-null, so the annotation merely restates the default; removing it leaves the declared nullability — and therefore runtime behavior — unchanged. Conservative: it acts only on a declaration whose enclosing type is in the fix scope (`@NullMarked` / `AnnotatedPackages`), removing the annotation from either the leading (declaration) position or the TYPE_USE position; it never touches `@Nullable`, `@CheckForNull`, or `@MonotonicNonNull`. The annotation import is dropped when this was its last use. Annotation-only and idempotent; only Java sources are modified. +* [io.moderne.nullability.RemoveRedundantNullableOnMethodReturn](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/removeredundantnullableonmethodreturn) + * **Remove a redundant declaration-position `@Nullable` on a method return** + * When a method return type already carries a TYPE_USE `@Nullable` (for example `<T> @Nullable T` or `pkg.@Nullable Type`), a second `@Nullable` in the leading (declaration) position or before the type parameters is redundant, and on generic, qualified, or nested return types it is rejected by `javac`. This removes that duplicate so the JSpecify annotation survives in the single, valid TYPE_USE position. It only ever removes an annotation that is provably duplicated by one on the return type itself, so it never changes a method's nullability. +* [io.moderne.nullability.ReplaceNullableToStringWithStringValueOf](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/replacenullabletostringwithstringvalueof) + * **Replace nullable `x.toString()` with `String.valueOf(x)`** + * Rewrites `x.toString()` to `String.valueOf(x)` when the receiver `x` is provably nullable at that site. `x.toString()` dereferences `x` and throws `NullPointerException` when `x` is `null`, which NullAway flags inside an annotated scope; `String.valueOf(x)` returns the string `"null"` instead. This is a behavior change on the null path (`NullPointerException` becomes the string `"null"`), so every rewritten call is marked for review — it is not behavior-preserving. Only the no-arg `toString()` whose receiver is a reference value is rewritten; a primitive receiver, a type or package qualifier, a `.class` literal, and `this`/`super` are never touched, and a receiver already asserted non-null is skipped. The receiver's nullness is resolved by attribution from the nullability model and a path-sensitive flow analysis (a value already null-checked on the path is not flagged). The fix never rewrites a call whose receiver is genuinely non-null at the site. Conservative; only Java sources are modified. +* [io.moderne.nullability.ReplaceNullableWithMonotonicNonNullOnLazyField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/replacenullablewithmonotonicnonnullonlazyfield) + * **Replace `@Nullable` with `@MonotonicNonNull` on a lazily-initialized field** + * Replaces the JSpecify `@Nullable` on a `private`, non-`final` reference field with the Checker Framework `@org.checkerframework.checker.nullness.qual.MonotonicNonNull` annotation when it is a lazily-initialized-non-null field, so NullAway treats reads of it as non-null and drops the `requireNonNull` noise a plain `@Nullable` forces at every read. A field qualifies only if it is `private` and non-`final`, declares exactly one reference-typed variable, every assignment has a provably-non-null right-hand side, at least one assignment is outside a constructor, and every null-observation of the field is a lazy-init guard (the condition of an `if` whose then-branch assigns the field). Because `private` bounds the analysis to the declaring class and no use handles `null` gracefully, the upgrade is behavior-preserving. Only Java sources are modified. +* [io.moderne.nullability.ReturnEmptyCollectionInsteadOfNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/returnemptycollectioninsteadofnull) + * **Return an empty collection instead of `null`** + * Rewrites a bare `return null;` to return an empty immutable collection when the enclosing method's declared return type is `java.util.List`, `java.util.Set`, `java.util.Collection`, or `java.util.Map` (raw or generic): `List` and `Collection` become `Collections.emptyList()`, `Set` becomes `Collections.emptySet()`, and `Map` becomes `Collections.emptyMap()` (each statically imported). Returning an empty collection rather than `null` spares every caller a null check, but a caller that distinguishes `null` from empty observes a different result, so this is a behavior change and every rewritten `return` is flagged for review. Only the literal `return null;` statement is rewritten — a `return someNullableExpr;` is left untouched — and a method whose return is annotated `@Nullable` is skipped, since there the `null` is intended. The recipe is gated on `@NullMarked` scope, idempotent, and conservative; only Java sources are modified. +* [io.moderne.nullability.SafeNullableBooleanCondition](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/safenullablebooleancondition) + * **Make a nullable `Boolean` condition null-safe with `Boolean.TRUE.equals(...)`** + * Rewrites a provably-nullable boxed `Boolean` used as a condition that auto-unboxes to `boolean` — the control expression of an `if`, `while`, or `do`/`while`, the condition of a `for`, or the condition of a ternary `?:` — to `Boolean.TRUE.equals(cond)`. Inside an annotated scope NullAway flags such an unboxing because it throws `NullPointerException` when the `Boolean` is `null`; the `Boolean.TRUE.equals(...)` form yields `false` on `null` instead. This is a behavior change on the null path (a thrown `NullPointerException` becomes `false`), so each rewritten condition is stamped with a behavior-change marker recording exactly that. The fix fires only when the condition's static type is the boxed `java.lang.Boolean` (a primitive `boolean` is never touched) and it is provably nullable at the site; nullability comes from type attribution and a path-sensitive flow analysis (a value already null-checked on the path is not rewritten). A condition already wrapped in `Boolean.TRUE.equals(...)` or `requireNonNull(...)` is left unchanged (idempotent). The recipe is conservative — a value not proven nullable is never rewritten; only Java sources are modified. +* [io.moderne.nullability.WrapNullableArgumentInRequireNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/wrapnullableargumentinrequirenonnull) + * **Wrap nullable arguments passed to non-null parameters in `requireNonNull`** + * Wraps in `java.util.Objects.requireNonNull(...)` (statically imported) each argument that passes a provably-nullable value to a callee parameter that is not declared `@Nullable`. Inside a `@NullMarked` scope NullAway treats every unannotated parameter as non-null, so such a call is an error; `requireNonNull` throws only where the `@NonNull` callee would already misbehave on `null`, so runtime behavior is unchanged. Argument and parameter nullness are resolved from the nullness oracle and the flow engine (no name-based heuristics). The fix only fires where the call site is `@NullMarked` and the callee is itself in an annotated scope, and never asserts non-null on a value that is genuinely nullable at the site (a value read inside its own null-check is left for a human). A value that is explicitly `null` on some path (a bare `null` literal or a ternary with a `null` arm) is not wrapped but flagged for review with an advisory marker, since the parameter likely should be `@Nullable`. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.WrapNullableDereferenceInRequireNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/wrapnullabledereferenceinrequirenonnull) + * **Wrap nullable dereferenced values in `requireNonNull`** + * Wraps in `java.util.Objects.requireNonNull(...)` (statically imported) a provably-nullable value that is being dereferenced — the receiver of a method call (`x.foo()`), the target of a field access (`x.field`, including `x.length`), the base of an array index (`x[i]`), the qualifier of a method reference (`x::foo`), the outer instance of a qualified `new`, or the lock of a `synchronized (x)`. Inside an annotated scope NullAway treats such a dereference as an error because it throws `NullPointerException` when the value is `null`; `requireNonNull` throws exactly when the dereference already would, so runtime behavior is unchanged. The value's nullness is resolved by attribution from the nullability model and a path-sensitive flow analysis (a value already null-checked on the path is not flagged). A `.class` literal, a type or package qualifier, a primitive, and a `throw` expression are never touched. The fix never asserts non-null on a value that is genuinely nullable at the site. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.WrapNullableForEachIterableInRequireNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/wrapnullableforeachiterableinrequirenonnull) + * **Wrap a nullable for-each iterable in `requireNonNull`** + * Wraps the iterable of an enhanced-for (for-each) loop in `java.util.Objects.requireNonNull(...)` (statically imported) when it is a provably-nullable value. Inside an annotated scope NullAway treats the for-each iterable as non-null, so iterating a nullable expression is an error; iterating a `null` already throws `NullPointerException` when the loop obtains its iterator, so `requireNonNull` throws exactly where the loop already would and runtime behavior is unchanged. The iterable's nullness is resolved by attribution from the nullability model and a path-sensitive flow analysis. The fix never asserts non-null on a value that is genuinely nullable at the site. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.WrapNullableSwitchSelectorInRequireNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/wrapnullableswitchselectorinrequirenonnull) + * **Wrap nullable `switch` selectors in `requireNonNull`** + * Wraps a provably-nullable `switch` selector in `java.util.Objects.requireNonNull(...)` (statically imported). Switching on a `null` selector already throws `NullPointerException` (the selector is dereferenced before any case matches), so inside an annotated scope NullAway flags a nullable selector as an error; `requireNonNull` throws only where the `switch` would already fail, so runtime behavior is unchanged. The selector's nullness is resolved by attribution from the nullability model and a path-sensitive flow analysis. A `switch` that already has a `case null` label is never touched. The fix never asserts non-null on a value that is genuinely nullable at the site. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.WrapNullableThrownExpressionInRequireNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/wrapnullablethrownexpressioninrequirenonnull) + * **Wrap nullable thrown expressions in `requireNonNull`** + * Wraps a provably-nullable `throw` operand in `java.util.Objects.requireNonNull(...)` (statically imported), turning `throw ex;` into `throw requireNonNull(ex);`. A `throw` of a `null` `Throwable` itself throws `NullPointerException` (the JVM dereferences the operand to raise it), so inside an annotated scope NullAway flags a nullable thrown value as an error; `requireNonNull` throws exactly where the bare `throw` already would, so runtime behavior is unchanged. The operand's nullness is resolved by attribution from the nullability model and a path-sensitive flow analysis (a value already null-checked on the path is not flagged). The fix never asserts non-null on a value that is genuinely nullable at the site. Idempotent and conservative; only Java sources are modified. +* [io.moderne.nullability.WrapNullableUnboxingInRequireNonNull](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nullability/wrapnullableunboxinginrequirenonnull) + * **Wrap nullable values that are auto-unboxed in `requireNonNull`** + * Wraps a provably-nullable boxed value (`Integer`, `Long`, `Boolean`, ...) that is used in a primitive context in `java.util.Objects.requireNonNull(...)` (statically imported). Unboxing such a value is a NullAway error inside an annotated scope, and auto-unboxing a `null` already throws `NullPointerException`, so `requireNonNull` throws exactly where the unboxing already would and runtime behavior is unchanged. The primitive contexts handled are an operand of an arithmetic, relational, or bitwise expression whose other side is a primitive (including `==`/`!=` against a primitive, but not a reference comparison or string concatenation), an argument bound to a primitive callee parameter, an array index, an `if`/`while`/`do`/`for`/ternary condition, and the `return` of a primitive-returning method. Nullability is determined from type attribution. The fix only fires where NullAway is active and never asserts non-null on a value that is genuinely nullable at the site. The recipe is idempotent and conservative; only Java sources are modified. ### rewrite-prethink -* [io.moderne.prethink.ComprehendCode](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/comprehendcode) - * **Comprehend code with AI** - * Use an LLM to generate descriptions for classes and methods in the codebase. Descriptions are cached based on source code checksums to avoid regenerating descriptions for unchanged code. -* [io.moderne.prethink.ComprehendCodeTokenCounter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/comprehendcodetokencounter) - * **Estimate comprehension token usage** - * Estimate the input token counts that would be sent to an LLM for method comprehension, without actually calling a model. Uses OpenAI's tokenizer locally. Outputs to the MethodDescriptions table with blank descriptions. * [io.moderne.prethink.ExtractCodingConventions](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/extractcodingconventions) * **Extract coding conventions** * Analyze the codebase to extract coding conventions including naming patterns, import organization, and documentation patterns. @@ -5654,10 +5684,7 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * Detect Go error-handling idioms: error returns, fmt.Errorf %w wrapping, errors.Is/As, panic/recover, and sentinel error variables. * [io.moderne.prethink.UpdatePrethinkContextNoAiStarter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextnoaistarter) * **Update Prethink context (no AI)** - * Generate Moderne Prethink context files with architectural discovery, test coverage mapping, dependency inventory, and FINOS CALM architecture diagrams. This recipe does not require an LLM provider - use UpdatePrethinkContextStarter if you want AI-generated code comprehension and test summaries. -* [io.moderne.prethink.UpdatePrethinkContextStarter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/updateprethinkcontextstarter) - * **Update Prethink context (with AI)** - * Generate Moderne Prethink context files with AI-generated code comprehension, test coverage mapping, dependency inventory, and FINOS CALM architecture diagrams. Maps tests to implementation methods and optionally generates AI summaries of what each test verifies when LLM provider is configured. + * Generate Moderne Prethink context files with architectural discovery, test coverage mapping, dependency inventory, and FINOS CALM architecture diagrams. This recipe does not require an LLM provider. * [io.moderne.prethink.calm.FindAspNetCoreEndpoints](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/calm/findaspnetcoreendpoints) * **Find ASP.NET Core endpoints** * Identify HTTP endpoints declared via ASP.NET Core controllers ([ApiController], [Route], [HttpGet/Post/...]) and Minimal APIs (app.MapGet/MapPost/MapPut/MapDelete/MapPatch). @@ -5873,7 +5900,7 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * Compute per-package architectural quality metrics including afferent/efferent coupling, instability, abstractness, distance from the main sequence, and dependency cycle detection using Tarjan's strongly connected components algorithm. * [io.moderne.prethink.testing.coverage.FindTestCoverage](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/testing/coverage/findtestcoverage) * **Find test coverage mapping** - * Map test methods to their corresponding implementation methods. Uses JavaType.Method matching to determine coverage relationships. Optionally generates AI summaries of what each test is verifying when LLM provider is configured. + * Map test methods to their corresponding implementation methods. Uses JavaType.Method matching to determine coverage relationships. * [io.moderne.prethink.testing.coverage.FindTestGaps](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/prethink/testing/coverage/findtestgaps) * **Find test coverage gaps** * Identify public non-trivial methods that lack test coverage. Reports gaps with cyclomatic complexity and risk scores to help prioritize where to add tests. @@ -5982,6 +6009,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [org.openrewrite.analysis.java.dataflow.FindUnclosedResources](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/analysis/java/dataflow/findunclosedresources) * **Find unclosed resources (S2095)** * Identifies resources implementing AutoCloseable/Closeable that are opened but not properly closed on all execution paths. Unclosed resources can lead to resource leaks that degrade application performance and stability. +* [org.openrewrite.analysis.java.dataflow.ParameterizeRawCollection](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/analysis/java/dataflow/parameterizerawcollection) + * **Parameterize raw `Collection`-typed local variables** + * Infers a single element type for raw single-arg-generic `java.util.Collection` local variables (`List`, `Set`, `Collection`, `Queue`, `Deque`, `Iterable`) from the arguments passed to their `add(..)` calls and rewrites the declaration to use that type. Initializers are rewritten to use the diamond operator. The original LHS interface and RHS implementation class are preserved. Prototype scope: single-variable declarations, no alias or escape tracking. * [org.openrewrite.analysis.java.datalineage.TrackDataLineage](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/analysis/java/datalineage/trackdatalineage) * **Track data lineage** * Tracks the flow of data from database sources to API sinks to understand data dependencies and support compliance requirements. ## Prerequisites for detecting a data flow All of the following conditions must be met for the recipe to report a flow: 1. The source code must contain at least one method call matching a recognized **source** (see below). 2. The source code must contain at least one method call matching a recognized **sink** (see below). 3. The tainted data must propagate from the source to the sink through variable assignments within the same method or via fields across methods in the same compilation unit. 4. No **flow breaker** (see below) may appear on the path between source and sink. 5. The relevant library types (e.g., `java.sql.ResultSet`, `javax.ws.rs.core.Response`) must be on the classpath so that OpenRewrite can resolve types. If types are unresolved, method matchers will not trigger and no flows will be detected. ## Recognized sources (database reads) | Category | Classes | | --- | --- | | JDBC | `java.sql.ResultSet` | | JPA (javax) | `javax.persistence.EntityManager`, `Query`, `TypedQuery` | | JPA (jakarta) | `jakarta.persistence.EntityManager`, `Query`, `TypedQuery` | | Hibernate | `org.hibernate.Session`, `org.hibernate.query.Query` | | Spring Data | `org.springframework.data.repository.CrudRepository` | | Spring JDBC | `org.springframework.jdbc.core.JdbcTemplate` | | MyBatis | `org.apache.ibatis.session.SqlSession`, `org.mybatis.spring.SqlSessionTemplate` | | MongoDB | `com.mongodb.client.MongoCollection`, `org.springframework.data.mongodb.core.MongoTemplate` | | Redis | `redis.clients.jedis.Jedis`, `org.springframework.data.redis.core.RedisTemplate`, `ValueOperations`, `HashOperations` | | Cassandra | `com.datastax.driver.core.Session`, `org.springframework.data.cassandra.core.CassandraTemplate` | | Elasticsearch | `org.elasticsearch.client.RestHighLevelClient`, `org.springframework.data.elasticsearch.core.ElasticsearchTemplate` | | Heuristic | Any class with `Repository`, `Dao`, or `Mapper` in its name calling methods starting with find, get, query, search, load, fetch, or select | ## Recognized sinks (API responses) | Category | Classes | | --- | --- | | JAX-RS (javax) | `javax.ws.rs.core.Response`, `Response.ResponseBuilder` | | JAX-RS (jakarta) | `jakarta.ws.rs.core.Response`, `Response.ResponseBuilder` | | Spring MVC | `org.springframework.http.ResponseEntity`, `ResponseEntity.BodyBuilder` | | Servlet (javax) | `javax.servlet.http.HttpServletResponse`, `javax.servlet.ServletOutputStream` | | Servlet (jakarta) | `jakarta.servlet.http.HttpServletResponse`, `jakarta.servlet.ServletOutputStream` | | Java I/O | `java.io.PrintWriter`, `java.io.Writer`, `java.io.OutputStream` | | Jackson | `com.fasterxml.jackson.databind.ObjectMapper`, `com.fasterxml.jackson.core.JsonGenerator` | | Gson | `com.google.gson.Gson`, `com.google.gson.JsonWriter` | | GraphQL | `graphql.schema.DataFetcher`, `graphql.schema.PropertyDataFetcher` | | Spring WebFlux | `ServerResponse`, `reactor.core.publisher.Mono`, `reactor.core.publisher.Flux` | | gRPC | `io.grpc.stub.StreamObserver` | | WebSocket | `javax.websocket.Session`, `RemoteEndpoint.Basic`, `jakarta.websocket.*`, `org.springframework.web.socket.WebSocketSession` | ## Flow breakers Flows are broken by methods matching common sanitization patterns (anonymize, redact, mask, encrypt, hash, sanitize, etc.) or authorization checks (isAuthorized, hasPermission, hasRole, etc.). @@ -6228,9 +6258,15 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.jsf.richfaces.update45.UpdateXHTMLTags](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/jsf/richfaces/update45/updatexhtmltags) * **Migrate RichFaces tags in `xhtml` files** * Migrate RichFaces tags in `xhtml` files to RichFaces 4. +* [io.moderne.java.spring.batch.AddEnableJdbcJobRepository](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/batch/addenablejdbcjobrepository) + * **Add `@EnableJdbcJobRepository` alongside `@EnableBatchProcessing`** + * In Spring Batch 6, `@EnableBatchProcessing` no longer configures a JDBC-based `JobRepository` on its own: the JDBC store configuration moved to a new `@EnableJdbcJobRepository` annotation, and a bare `@EnableBatchProcessing` now registers an in-memory `ResourcelessJobRepository`. This recipe adds `@EnableJdbcJobRepository` next to every `@EnableBatchProcessing` so JDBC-backed persistence is preserved, moving the JDBC-specific attributes (`dataSourceRef`, `tablePrefix`, etc.) to the new annotation, copying `transactionManagerRef` to it (kept on `@EnableBatchProcessing` as well), converting `isolationLevelForCreate` from its Spring Batch 5 `String` form to the `Isolation` enum, and dropping the removed `lobHandlerRef` attribute. Classes that already declare `@EnableJdbcJobRepository` or `@EnableMongoJobRepository`, and programmatic `DefaultBatchConfiguration` subclasses, are left unchanged. A non-literal `isolationLevelForCreate` value is left in place for manual migration. * [io.moderne.java.spring.batch.AddJobRegistryToTaskExecutorJobOperator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/batch/addjobregistrytotaskexecutorjoboperator) * **Add `setJobRegistry(..)` to manually configured `TaskExecutorJobOperator`** * Spring Batch 6 replaced `TaskExecutorJobLauncher` with `TaskExecutorJobOperator`, which requires both `setJobRepository(..)` and `setJobRegistry(..)` to be called before `afterPropertiesSet()`. When a `TaskExecutorJobOperator` is constructed and initialized manually (typically in a `@Bean` factory method) without a `setJobRegistry(..)` call, add a `JobRegistry` parameter to the enclosing method and call `setJobRegistry(..)` so the operator is fully configured. +* [io.moderne.java.spring.batch.FlagChunkListenerForManualMigration](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/batch/flagchunklistenerformanualmigration) + * **Flag deprecated `ChunkListener` callbacks for manual migration to `ChunkListener<I, O>`** + * Spring Batch 6 made `ChunkListener` generic (`ChunkListener<I, O>`) and deprecated the three `ChunkContext`-based callbacks for removal in Spring Batch 7. Their replacements accept the chunk of items (`beforeChunk(Chunk<I>)`, `afterChunk(Chunk<O>)`, `onChunkError(Exception, Chunk<O>)`), which is a disjoint API from `ChunkContext` and fires at a different point in the chunk lifecycle, so the change cannot be performed mechanically. This recipe adds a comment to each deprecated callback naming its exact replacement so the remaining body changes can be done by hand. It does not add type parameters or rewrite method bodies. * [io.moderne.java.spring.boot.AddSpringBootApplication](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot/addspringbootapplication) * **Add `@SpringBootApplication` class** * Adds a `@SpringBootApplication` class containing a main method to bootify your Spring Framework application. @@ -6402,6 +6438,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.boot4.FlagDeprecatedReactorNettyHttpClientMapper](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/flagdeprecatedreactornettyhttpclientmapper) * **Flag deprecated ReactorNettyHttpClientMapper for migration** * Adds a TODO comment to classes implementing the deprecated `ReactorNettyHttpClientMapper` interface. Migration to `ClientHttpConnectorBuilderCustomizer<ReactorClientHttpConnectorBuilder>` requires wrapping the HttpClient configuration in `builder.withHttpClientCustomizer(...)`. +* [io.moderne.java.spring.boot4.FlagGrpcClientStubsForImportGrpcClients](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/flaggrpcclientstubsforimportgrpcclients) + * **Flag gRPC client stub injections that need `@ImportGrpcClients`** + * Spring gRPC 1.0 auto-scanned generated proto stubs and registered them as client beans; Spring gRPC 1.1 no longer does, so each stub must be imported explicitly with `@ImportGrpcClients`. The correct stub list and annotation location are application-specific, so rather than editing code this recipe adds a TODO comment to classes that inject a gRPC client stub (a field or constructor/method parameter whose type extends `io.grpc.stub.AbstractStub`) so the annotation can be added by hand. * [io.moderne.java.spring.boot4.InsertPropertyMapperAlwaysMethodInvocation](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/insertpropertymapperalwaysmethodinvocation) * **Preserve `PropertyMapper` null-passing behavior** * Spring Boot 4.0 changes the `PropertyMapper` behavior so that `from()` no longer calls `to()` when the source value is `null`. This recipe inserts `.always()` before terminal mapping methods to preserve the previous behavior. Chains that already contain `.whenNonNull()` or `.alwaysApplyingWhenNonNull()` are skipped, as they explicitly opted into null-skipping behavior which is now the default. @@ -6429,9 +6468,18 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.boot4.MigrateRestAssured](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migraterestassured) * **Add explicit version for REST Assured** * REST Assured is no longer managed by Spring Boot 4.0. This recipe adds an explicit version to REST Assured dependencies. +* [io.moderne.java.spring.boot4.MigrateSpringGrpcClientChannelProperties](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpcclientchannelproperties) + * **Migrate Spring gRPC client channel properties to 1.1** + * Migrate the per-channel client properties renamed in Spring gRPC 1.1, in `application.properties` and `application.yml`. The `spring.grpc.client.channels` map became `spring.grpc.client.channel`, and several leaf keys were restructured (for example `address` to `target`, `default-deadline` to `default.deadline`, `keep-alive-time` to `keepalive.time`, and `max-inbound-message-size` to `inbound.message.max-size`). Keys that only changed parent keep their suffix. In `.properties` files only kebab-case keys are matched. +* [io.moderne.java.spring.boot4.MigrateSpringGrpc_1_1](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringgrpc_1_1) + * **Migrate from standalone Spring gRPC 1.0 to Spring Boot 4.1 (Spring gRPC 1.1)** + * Migrate applications from the standalone Spring gRPC project (`org.springframework.grpc:*`, Spring gRPC 1.0) to the version bundled with Spring Boot 4.1 (Spring gRPC 1.1). Spring gRPC graduated into Spring Boot in 4.1, so its starters, BOM, configuration properties, and test annotations move under `org.springframework.boot`. Following the [Spring gRPC 1.1 Migration Guide](https://github.com/spring-projects/spring-grpc/wiki/Spring-gRPC-1.1-Migration-Guide), this recipe swaps the `org.springframework.grpc` starters for the Spring Boot `spring-boot-starter-grpc-*` starters (splitting the combined runtime and test starters) and removes the standalone `spring-grpc-dependencies` BOM; renames the `spring.grpc.server.*` and per-channel `spring.grpc.client.channels.<name>.*` properties that changed in 1.1 and splits `spring.grpc.server.address: host:port` into separate `address` and `port`; renames the `@AutoConfigureInProcessTransport` and `@LocalGrpcPort` test annotations; and, because 1.1 no longer auto-scans generated proto stubs, flags classes that inject gRPC client stubs with a TODO so an explicit `@ImportGrpcClients` annotation can be added by hand. Not automated: pinning the `reactor-grpc-stub` version. Spring gRPC 1.1 no longer manages it, so a version-less declaration must be given an explicit version once the standalone BOM is removed (Spring gRPC 1.0 managed `1.2.4`). * [io.moderne.java.spring.boot4.MigrateSpringRetry](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringretry) * **Migrate Spring Retry to Spring Resilience** * Handle spring-retry no longer managed by Spring Boot and the possible migration to Spring Core Resilience. +* [io.moderne.java.spring.boot4.MigrateSpringRetryRecoverToRetryTemplate](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringretryrecovertoretrytemplate) + * **Migrate `@Retryable(recover=...)` + `@Recover` to programmatic `RetryTemplate`** + * Convert spring-retry `@Retryable` methods that name a `@Recover` method into Spring Framework 7's programmatic `org.springframework.core.retry.RetryTemplate` wrapped in a try/catch that dispatches to the (now plain) recover method. Spring Framework 7's resilience `@Retryable` annotation has no equivalent to `@Recover`, so this conversion is required for recover-method semantics to survive the migration. * [io.moderne.java.spring.boot4.MigrateSpringRetryToSpringFramework7](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/migratespringretrytospringframework7) * **Migrate `spring-retry` to Spring Framework resilience** * Migrate `spring-retry`s `@Retryable` and `@Backoff` annotation to Spring Framework 7 Resilience annotations. @@ -6480,6 +6528,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.boot4.RemoveSpringPulsarReactive](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/removespringpulsarreactive) * **Remove Spring Pulsar Reactive support** * Spring Boot 4.0 removed support for Spring Pulsar Reactive as it is no longer maintained. This recipe removes the Spring Pulsar Reactive dependencies. +* [io.moderne.java.spring.boot4.RemoveSpringRetryVersionPin](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/removespringretryversionpin) + * **Remove the orphaned Spring Retry version pin** + * The Spring Boot 4.0 upgrade pins an explicit `spring-retry` version up front (a `spring-retry.version` property backing `<version>$\{spring-retry.version\}</version>`, plus a `<dependencyManagement>` entry added by `AddManagedDependency`) so the project stays resolvable once Spring Boot 4.0 stops managing spring-retry. When usage is fully migrated to Spring resilience and the dependency is removed, that pin is left orphaned (customer-requests#2615). Remove it, but only where spring-retry is no longer a direct dependency, so a partially-migrated module that still declares spring-retry (e.g. a remaining `@Recover`) keeps its pin. * [io.moderne.java.spring.boot4.RemoveZipkinAutoConfigurationExclude](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/removezipkinautoconfigurationexclude) * **Remove `ZipkinAutoConfiguration`** * Zipkin is no longer auto-configured by default in Spring Boot 4.0; remove references to it from exclusions on annotations. @@ -6498,6 +6549,15 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.boot4.SimplifyOptionalConfigurationPropertiesNullChecks](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/simplifyoptionalconfigurationpropertiesnullchecks) * **Simplify null checks on `Optional` `@ConfigurationProperties` parameters** * Spring Boot 4.1 changes constructor-bound `@ConfigurationProperties` so that `Optional<T>` parameters bind to `Optional.empty()` rather than `null`. This recipe replaces `== null` / `!= null` checks against such parameters (or same-named fields in the binding constructor's class) with the constant they will always evaluate to, then runs `SimplifyConstantIfBranchExecution` to remove the dead branches. +* [io.moderne.java.spring.boot4.SplitSpringGrpcCombinedStarter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpccombinedstarter) + * **Split the combined Spring gRPC starter into server and client starters** + * The combined `org.springframework.grpc:spring-grpc-spring-boot-starter` was removed in Spring gRPC 1.1. Replace it with the Spring Boot 4.1 `spring-boot-starter-grpc-server` starter and add the matching `spring-boot-starter-grpc-client` starter so both the server and client remain available. +* [io.moderne.java.spring.boot4.SplitSpringGrpcCombinedTestStarter](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpccombinedteststarter) + * **Split the Spring gRPC test starter into server-test and client-test starters** + * The standalone `org.springframework.grpc:spring-grpc-test` artifact split into the Spring Boot 4.1 `spring-boot-starter-grpc-server-test` and `spring-boot-starter-grpc-client-test` starters. Replace it with the server-test starter and add the matching client-test starter, both at test scope. +* [io.moderne.java.spring.boot4.SplitSpringGrpcServerAddress](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/splitspringgrpcserveraddress) + * **Split `spring.grpc.server.address` into `address` and `port`** + * In Spring gRPC 1.0 `spring.grpc.server.address` accepted a combined `host:port` value. Spring gRPC 1.1 binds `address` to an `InetAddress` and reads the port from a separate `spring.grpc.server.port`, so this recipe splits a plain `host:port` value across the two properties in `application.properties` and `application.yml`. Pseudo-URLs (e.g. `static://...`), IPv6 literals, property placeholders, and values that already declare a `port` are left unchanged. * [io.moderne.java.spring.boot4.SpringBoot4BestPractices](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/springboot4bestpractices) * **Spring Boot 4.0 best practices** * Applies best practices to Spring Boot 4.+ applications. @@ -6519,6 +6579,12 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.boot4.UpgradeSpringKafka_4_0](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradespringkafka_4_0) * **Migrate to Spring Kafka 4.0** * Migrate applications to Spring Kafka 4.0. This includes removing deprecated configuration options that are no longer supported. +* [io.moderne.java.spring.boot4.UpgradeSpringKafka_4_1](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradespringkafka_4_1) + * **Migrate to Spring Kafka 4.1** + * Migrate applications to Spring Kafka 4.1. This builds on the Spring Kafka 4.0 migration and rewrites APIs deprecated in 4.1 to their replacements. +* [io.moderne.java.spring.boot4.UpgradeToJava21WhenUsingJooq](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/boot4/upgradetojava21whenusingjooq) + * **Upgrade to Java 21 when using jOOQ** + * Spring Boot 4 keeps a Java 17 baseline, but the jOOQ version it manages (3.20+) requires Java 21 or later. This recipe upgrades modules that depend on jOOQ to Java 21 so they remain compatible after the Spring Boot 4.0 upgrade. Modules that do not use jOOQ are left on their current Java baseline. See https://github.com/spring-projects/spring-boot/issues/48619. * [io.moderne.java.spring.cloud2020.SpringCloudProperties_2020](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/cloud2020/springcloudproperties_2020) * **Migrate Spring Cloud properties to 2020** * Migrate properties found in `application.properties` and `application.yml`. @@ -6543,6 +6609,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.cloud20251.UpgradeSpringCloud_2025_1](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/cloud20251/upgradespringcloud_2025_1) * **Upgrade to Spring Cloud 2025.1** * Upgrade to Spring Cloud 2025.1 (Oakwood). This release is based on Spring Framework 7 and Spring Boot 4. Each Spring Cloud project has been updated to version 5.0.0. +* [io.moderne.java.spring.data.AddProjectedPayloadAnnotation](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/data/addprojectedpayloadannotation) + * **Add `@ProjectedPayload` to web projection interfaces** + * As of Spring Data 2026.0 (Spring Boot 4.1), interface-based projections used as Spring MVC controller handler-method parameters must be annotated with `@ProjectedPayload`. Unannotated projection types still work but log a deprecation warning, and the lenient behavior is slated for removal in Spring Data 2026.1. This recipe annotates project interfaces that are bound as web projection parameters. * [io.moderne.java.spring.framework.AddSetUseSuffixPatternMatch](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/framework/addsetusesuffixpatternmatch) * **Add `setUseSuffixPatternMatch(true)` in Spring MVC configuration** * In Spring Framework 5.2.4 and earlier, suffix pattern matching was enabled by default. This meant a controller method mapped to `/users` would also match `/users.json`, `/users.xml`, etc. Spring Framework 5.3 deprecated this behavior and changed the default to false. This recipe adds `setUseSuffixPatternMatch(true)` to `WebMvcConfigurer` implementations to preserve the legacy behavior during migration. Note: This only applies to Spring MVC; Spring WebFlux does not support suffix pattern matching. @@ -6583,8 +6652,8 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * **Migrate `HttpHeaders` methods removed when `MultiValueMap` contract was dropped** * Spring Framework 7.0 changed `HttpHeaders` to no longer implement `MultiValueMap`. This recipe replaces removed inherited method calls: `containsKey()` with `containsHeader()`, `keySet()` with `headerNames()`, and `entrySet()` with `headerSet()`. * [io.moderne.java.spring.framework.MigrateTrailingSlashMatch](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/framework/migratetrailingslashmatch) - * **Migrate trailing slash matching to explicit routes** - * Migrates deprecated `setUseTrailingSlashMatch()` configuration removed in Spring Framework 7.0. Only adds explicit trailing slash routes when the project previously enabled trailing slash matching via `setUseTrailingSlashMatch(true)`. The deprecated configuration calls are always removed. + * **Register a `UrlHandlerFilter` to preserve trailing slash matching** + * Spring Framework 7.0 removes `PathMatchConfigurer.setUseTrailingSlashMatch(true)`. When trailing slash matching was enabled, this recipe registers a `UrlHandlerFilter` bean (Spring Framework 6.2+/Boot 4) that transparently handles trailing slashes, preserving behavior regardless of how routes are declared. The filter is ordered ahead of the security filter chain (per its javadoc): the servlet variant via a `FilterRegistrationBean`, the reactive variant as an `@Order`ed `WebFilter` bean. A literal `false` argument enables nothing, so no filter is registered. * [io.moderne.java.spring.framework.ModularSpringFrameworkDependencies](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/framework/modularspringframeworkdependencies) * **Add Spring Framework modular dependencies** * Adds Spring Framework modular dependencies based on package usage, replacing legacy monolithic `org.springframework:spring`. @@ -6708,6 +6777,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [io.moderne.java.spring.integration.MigrateSpringFramework6DeprecatedIntegrationXmlAttributes](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/integration/migratespringframework6deprecatedintegrationxmlattributes) * **Migrate Spring Integration XML attributes deprecated by Spring Integration 6.x** * Renames or removes Spring Integration XML attributes that were deprecated or removed between Spring Integration 5.x and 6.x. Scoped to XML files using the Spring Integration namespace. +* [io.moderne.java.spring.kafka.MigrateShareAcknowledgmentMode](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/kafka/migrateshareacknowledgmentmode) + * **Migrate `setExplicitShareAcknowledgment` to `setShareAckMode`** + * `ContainerProperties.setExplicitShareAcknowledgment(boolean)` was deprecated in Spring Kafka 4.1 in favor of `setShareAckMode(ShareAckMode)`. Mirroring the deprecated method's own implementation, this recipe rewrites `setExplicitShareAcknowledgment(true)` to `setShareAckMode(ShareAckMode.MANUAL)` and `setExplicitShareAcknowledgment(false)` to `setShareAckMode(ShareAckMode.EXPLICIT)`; a non-literal argument is migrated using a ternary expression. * [io.moderne.java.spring.kafka.consumer.FindKafkaListenerWithoutErrorHandling](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/spring/kafka/consumer/findkafkalistenerwithouterrorhandling) * **Find `@KafkaListener` methods without error handling** * Flags `@KafkaListener` methods that lack proper error handling. Methods should have `@RetryableTopic`, specify an `errorHandler` in the annotation, or implement try-catch blocks for error handling. @@ -6852,6 +6924,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [org.openrewrite.python.search.DependencyInsight](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/search/dependencyinsight) * **Python dependency insight** * Find direct and transitive Python dependencies matching a package name pattern. Results include dependencies that either directly match or transitively include a matching dependency. +* [org.openrewrite.python.search.UsesImport](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/search/usesimport) + * **Find Python files that import a module** + * Marks Python source files that import the given module, matching the as-written import path rather than type attribution. Robust to type-checker canonicalization and to removed or unresolvable symbols, which makes it usable as a precondition for import-migration recipes where `HasType` would miss the file. ## org.openrewrite.recipe @@ -7014,6 +7089,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full ### rewrite-dotnet +* [org.openrewrite.dotnet.MigrateDotNetInstallUrls](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/dotnet/migratedotnetinstallurls) + * **Migrate .NET install URLs from retiring Azure CDN domains** + * Replace references to retiring Azure CDN domains used for .NET SDK and runtime downloads with the new `builds.dotnet.microsoft.com` domain. See https://devblogs.microsoft.com/dotnet/critical-dotnet-install-links-are-changing/ for details. This recipe changes any LST files into PlainText, so it's not safe to be combined with other recipes. Instead, run this as an isolated effort as the URLs should be drop in replacements without further changes. * [org.openrewrite.dotnet.MigrateToNet6](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/dotnet/migratetonet6) * **Upgrade to .NET 6.0 using upgrade-assistant** * Run [upgrade-assistant upgrade](https://learn.microsoft.com/en-us/dotnet/core/porting/upgrade-assistant-overview) across a repository to upgrade projects to .NET 6.0. @@ -7040,7 +7118,7 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * Finds dependencies in `*.csproj` and `packages.config`. * [org.openrewrite.csharp.dependencies.DependencyVulnerabilityCheck](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/csharp/dependencies/dependencyvulnerabilitycheck) * **Find and fix vulnerable Nuget dependencies** - * This software composition analysis (SCA) tool detects and upgrades dependencies with publicly disclosed vulnerabilities. This recipe both generates a report of vulnerable dependencies and upgrades to newer versions with fixes. This recipe by default only upgrades to the latest **patch** version. If a minor or major upgrade is required to reach the fixed version, this can be controlled using the `maximumUpgradeDelta` option. Vulnerability information comes from the [GitHub Security Advisory Database](https://docs.github.com/en/code-security/security-advisories/global-security-advisories/about-the-github-advisory-database), which aggregates vulnerability data from several public databases, including the [National Vulnerability Database](https://nvd.nist.gov/) maintained by the United States government. Dependencies following [Semantic Versioning](https://semver.org/) will see their _patch_ version updated where applicable. Last updated: 2026-06-15T1301. + * This software composition analysis (SCA) tool detects and upgrades dependencies with publicly disclosed vulnerabilities. This recipe both generates a report of vulnerable dependencies and upgrades to newer versions with fixes. This recipe by default only upgrades to the latest **patch** version. If a minor or major upgrade is required to reach the fixed version, this can be controlled using the `maximumUpgradeDelta` option. Vulnerability information comes from the [GitHub Security Advisory Database](https://docs.github.com/en/code-security/security-advisories/global-security-advisories/about-the-github-advisory-database), which aggregates vulnerability data from several public databases, including the [National Vulnerability Database](https://nvd.nist.gov/) maintained by the United States government. Dependencies following [Semantic Versioning](https://semver.org/) will see their _patch_ version updated where applicable. Last updated: 2026-06-29T1230. * [org.openrewrite.csharp.dependencies.UpgradeDependencyVersion](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/csharp/dependencies/upgradedependencyversion) * **Upgrade C# dependency versions** * Upgrades dependencies in `*.csproj`, `Directory.Packages.props`, and `packages.config`. @@ -7052,7 +7130,7 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * Locates and reports on all licenses in use. * [org.openrewrite.java.dependencies.DependencyVulnerabilityCheck](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/dependencies/dependencyvulnerabilitycheck) * **Find and fix vulnerable Maven/Gradle dependencies** - * This software composition analysis (SCA) tool detects and upgrades dependencies with publicly disclosed vulnerabilities. This recipe both generates a report of vulnerable dependencies and upgrades to newer versions with fixes. This recipe by default only upgrades to the latest **patch** version. If a minor or major upgrade is required to reach the fixed version, this can be controlled using the `maximumUpgradeDelta` option. Vulnerability information comes from the [GitHub Security Advisory Database](https://docs.github.com/en/code-security/security-advisories/global-security-advisories/about-the-github-advisory-database), which aggregates vulnerability data from several public databases, including the [National Vulnerability Database](https://nvd.nist.gov/) maintained by the United States government. Upgrades dependencies versioned according to [Semantic Versioning](https://semver.org/). ## Customizing Vulnerability Data This recipe can be customized by extending `DependencyVulnerabilityCheckBase` and overriding the vulnerability data sources: - **`baselineVulnerabilities(ExecutionContext ctx)`**: Provides the default set of known vulnerabilities. The base implementation loads vulnerability data from the GitHub Security Advisory Database CSV file using `ResourceUtils.parseResourceAsCsv()`. Override this method to replace the entire vulnerability dataset with your own curated list. - **`supplementalVulnerabilities(ExecutionContext ctx)`**: Allows adding custom vulnerability data beyond the baseline. The base implementation returns an empty list. Override this method to add organization-specific vulnerabilities, internal security advisories, or vulnerabilities from additional sources while retaining the baseline GitHub Advisory Database. Both methods return `List<Vulnerability>` objects. Vulnerability data can be loaded from CSV files using `ResourceUtils.parseResourceAsCsv(path, Vulnerability.class, consumer)` or constructed programmatically. To customize, extend `DependencyVulnerabilityCheckBase` and override one or both methods depending on your needs. For example, override `supplementalVulnerabilities()` to add custom CVEs while keeping the standard vulnerability database, or override `baselineVulnerabilities()` to use an entirely different vulnerability data source. Last updated: 2026-06-15T1301. + * This software composition analysis (SCA) tool detects and upgrades dependencies with publicly disclosed vulnerabilities. This recipe both generates a report of vulnerable dependencies and upgrades to newer versions with fixes. This recipe by default only upgrades to the latest **patch** version. If a minor or major upgrade is required to reach the fixed version, this can be controlled using the `maximumUpgradeDelta` option. Vulnerability information comes from the [GitHub Security Advisory Database](https://docs.github.com/en/code-security/security-advisories/global-security-advisories/about-the-github-advisory-database), which aggregates vulnerability data from several public databases, including the [National Vulnerability Database](https://nvd.nist.gov/) maintained by the United States government. Upgrades dependencies versioned according to [Semantic Versioning](https://semver.org/). ## Customizing Vulnerability Data This recipe can be customized by extending `DependencyVulnerabilityCheckBase` and overriding the vulnerability data sources: - **`baselineVulnerabilities(ExecutionContext ctx)`**: Provides the default set of known vulnerabilities. The base implementation loads vulnerability data from the GitHub Security Advisory Database CSV file using `ResourceUtils.parseResourceAsCsv()`. Override this method to replace the entire vulnerability dataset with your own curated list. - **`supplementalVulnerabilities(ExecutionContext ctx)`**: Allows adding custom vulnerability data beyond the baseline. The base implementation returns an empty list. Override this method to add organization-specific vulnerabilities, internal security advisories, or vulnerabilities from additional sources while retaining the baseline GitHub Advisory Database. Both methods return `List<Vulnerability>` objects. Vulnerability data can be loaded from CSV files using `ResourceUtils.parseResourceAsCsv(path, Vulnerability.class, consumer)` or constructed programmatically. To customize, extend `DependencyVulnerabilityCheckBase` and override one or both methods depending on your needs. For example, override `supplementalVulnerabilities()` to add custom CVEs while keeping the standard vulnerability database, or override `baselineVulnerabilities()` to use an entirely different vulnerability data source. Last updated: 2026-06-29T1230. * [org.openrewrite.java.dependencies.RemoveUnusedDependencies](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/dependencies/removeunuseddependencies) * **Remove unused dependencies** * Scans through source code collecting references to types and methods, removing any dependencies that are not used from Maven or Gradle build files. This is best effort and not guaranteed to work well in all cases; false positives are still possible. This recipe takes reflective access into account: - When reflective access to a class is made unambiguously via a string literal, such as: `Class.forName("java.util.List")` that is counted correctly. - When reflective access to a class is made ambiguously via anything other than a string literal no dependencies will be removed. This recipe takes transitive dependencies into account: - When a direct dependency is not used but a transitive dependency it brings in _is_ in use the direct dependency is not removed. @@ -7125,6 +7203,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [org.openrewrite.java.security.OwaspTopTen](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/owasptopten) * **Remediate vulnerabilities from the OWASP Top Ten** * [OWASP](https://owasp.org) publishes a list of the most impactful common security vulnerabilities. These recipes identify and remediate vulnerabilities from the OWASP Top Ten. +* [org.openrewrite.java.security.OwaspTopTen2025](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/owasptopten2025) + * **Remediate vulnerabilities from the OWASP Top Ten 2025** + * [OWASP](https://owasp.org) publishes a list of the most impactful common security vulnerabilities. These recipes identify and remediate vulnerabilities from the [OWASP Top Ten 2025](https://owasp.org/Top10/2025/). * [org.openrewrite.java.security.PartialPathTraversalVulnerability](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/partialpathtraversalvulnerability) * **Partial path traversal vulnerability** * Replaces `dir.getCanonicalPath().startsWith(parent.getCanonicalPath()`, which is vulnerable to partial path traversal attacks, with the more secure `dir.getCanonicalFile().toPath().startsWith(parent.getCanonicalFile().toPath())`. To demonstrate this vulnerability, consider `"/usr/outnot".startsWith("/usr/out")`. The check is bypassed although `/outnot` is not under the `/out` directory. It's important to understand that the terminating slash may be removed when using various `String` representations of the `File` object. For example, on Linux, `println(new File("/var"))` will print `/var`, but `println(new File("/var", "/")` will print `/var/`; however, `println(new File("/var", "/").getCanonicalPath())` will print `/var`. @@ -7185,6 +7266,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [org.openrewrite.java.security.search.FindInadequateKeySize](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findinadequatekeysize) * **Find inadequate cryptographic key sizes** * Finds cryptographic key generation with inadequate key sizes. RSA and DSA keys should be at least 2048 bits, EC keys at least 224 bits, and symmetric keys (AES) at least 128 bits. Weak named EC curves (e.g. `secp112r1`, `prime192v1`) are also flagged. NIST SP 800-131A Rev 2 requires RSA/DSA 2048+, EC 224+, AES 128+. +* [org.openrewrite.java.security.search.FindInsecureCipherMode](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findinsecureciphermode) + * **Find insecure cipher modes and padding schemes** + * Finds uses of `Cipher.getInstance(...)` whose transformation string selects an insecure mode or padding. Flags two patterns: ECB mode for any non-RSA algorithm (repeated plaintext blocks produce identical ciphertext blocks), and CBC mode with a padding scheme other than `NoPadding` (vulnerable to padding oracle attacks). For AES, prefer an authenticated mode such as GCM; for RSA, see `FindRsaWithoutOaep`. * [org.openrewrite.java.security.search.FindInsecureRememberMeConfig](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findinsecureremembermeconfig) * **Find insecure Spring Security RememberMe configuration** * Finds Spring Security RememberMe configurations with insecure settings: `useSecureCookie(false)` (allows cookie transmission over HTTP), `alwaysRemember(true)` (bypasses user opt-in), or `tokenValiditySeconds(...)` set longer than 30 days (extends the window in which a stolen remember-me cookie can be replayed). @@ -7241,7 +7325,7 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * Identify where attackers can deserialize gadgets into a target field. * [org.openrewrite.java.security.search.FindWeakCryptoAlgorithm](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findweakcryptoalgorithm) * **Find weak cryptographic algorithms** - * Finds uses of broken or risky cryptographic algorithms such as MD5, SHA-1, DES, DESede (3DES), RC2, RC4, and Blowfish in calls to `Cipher.getInstance()`, `MessageDigest.getInstance()`, `Mac.getInstance()`, `KeyGenerator.getInstance()`, and `SecretKeyFactory.getInstance()`. + * Finds uses of broken or risky cryptographic algorithms such as MD5, SHA-1, DES, DESede (3DES), RC2, RC4, and Blowfish in calls to `Cipher.getInstance()`, `MessageDigest.getInstance()`, `Mac.getInstance()`, `KeyGenerator.getInstance()`, and `SecretKeyFactory.getInstance()`. Also flags instantiation of `javax.crypto.NullCipher`, which performs no encryption. * [org.openrewrite.java.security.search.FindWeakDigestInPasswordEncoder](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findweakdigestinpasswordencoder) * **Find weak message digests used inside custom `PasswordEncoder` implementations** * Finds calls to `MessageDigest.getInstance("...")` whose algorithm is unsuitable for password storage, scoped to classes implementing `org.springframework.security.crypto.password.PasswordEncoder`. Unsalted and non-iterated digests (MD2, MD4, MD5, SHA-1, SHA-224/256/384/512) are unsuitable for password hashing regardless of how they are wrapped. Delegate to `BCryptPasswordEncoder`, `Argon2PasswordEncoder`, `Pbkdf2PasswordEncoder`, or `SCryptPasswordEncoder` instead of implementing `PasswordEncoder` yourself. @@ -7253,7 +7337,7 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * Finds uses of `MessageDigest.getInstance()` with algorithms unsuitable for password hashing (MD5, SHA-1, SHA-256, SHA-384, SHA-512). Passwords should be hashed with a purpose-built password hashing function such as bcrypt, scrypt, Argon2, or PBKDF2 that includes a salt and a tunable work factor. * [org.openrewrite.java.security.search.FindWeakSpringPasswordEncoder](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findweakspringpasswordencoder) * **Find weak Spring Security password encoders** - * Finds uses of Spring Security password encoders that are unsuitable for production password storage: `NoOpPasswordEncoder` (plaintext), `StandardPasswordEncoder` (deprecated SHA-256), `MessageDigestPasswordEncoder` (raw message digest), `Md4PasswordEncoder` (MD4, broken), and `LdapShaPasswordEncoder` (deprecated). Use an adaptive function such as `BCryptPasswordEncoder`, `Argon2PasswordEncoder`, `Pbkdf2PasswordEncoder`, or `SCryptPasswordEncoder` instead. + * Finds uses of Spring Security password encoders that are unsuitable for production password storage: `NoOpPasswordEncoder` (plaintext), `StandardPasswordEncoder` (deprecated SHA-256), `MessageDigestPasswordEncoder` (raw message digest), `Md4PasswordEncoder` (MD4, broken), `LdapShaPasswordEncoder` (deprecated), `Md5PasswordEncoder` and `ShaPasswordEncoder` (from the deprecated `authentication.encoding` package), and `SCryptPasswordEncoder` (deprecated in current Spring Security). Use an adaptive function such as `BCryptPasswordEncoder`, `Argon2PasswordEncoder`, or `Pbkdf2PasswordEncoder` instead. * [org.openrewrite.java.security.search.FindXPathInjection](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/security/search/findxpathinjection) * **Find XPath injection vectors** * Finds calls to `XPath.evaluate()` and `XPath.compile()` which, when the expression is built from user input, can allow XPath injection attacks. Use parameterized XPath expressions or input validation instead. @@ -7635,387 +7719,21 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full ### rewrite-migrate-python -* [org.openrewrite.python.codequality.AllBranchesIdentical](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/allbranchesidentical) - * **Remove conditional with identical branches** - * Replace `if`/`elif`/`else` chains where every branch has the same body with just the body, since the condition has no effect on what code executes. -* [org.openrewrite.python.codequality.BooleanChecksNotInverted](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/booleanchecksnotinverted) - * **Boolean checks should not be inverted** - * Replace inverted boolean comparisons like `not (a == b)` with the equivalent direct operator (`a != b`), and remove double negations like `not (not x)`. -* [org.openrewrite.python.codequality.CollapsibleIfStatements](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/collapsibleifstatements) - * **Merge collapsible if statements** - * Combine nested `if` statements that have no `else` branch into a single `if` joined with `and`. -* [org.openrewrite.python.codequality.MergeIdenticalBranches](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/mergeidenticalbranches) - * **Merge consecutive branches with identical bodies** - * Combine consecutive `if`/`elif` branches that have the same body into a single branch with conditions joined by `or`. -* [org.openrewrite.python.codequality.RemoveDuplicateConditions](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/removeduplicateconditions) - * **Remove duplicate conditions in if/elif chains** - * Remove `elif` branches whose condition is identical to an earlier branch in the same `if`/`elif` chain, since the duplicate branch is dead code that can never execute. -* [org.openrewrite.python.codequality.RemoveSelfAssignment](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/removeselfassignment) - * **Remove self-assignments** - * Remove statements that assign a variable to itself (`x = x`, `self.x = self.x`), since they have no effect. -* [org.openrewrite.python.codequality.RemoveUnconditionalValueOverwrite](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/removeunconditionalvalueoverwrite) - * **Remove unconditional value overwrites** - * Remove consecutive assignments that write to the same dict key or object attribute, since the first value is immediately overwritten and never used. -* [org.openrewrite.python.codequality.SimplifyBooleanLiteral](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/simplifybooleanliteral) - * **Simplify boolean literal comparisons** - * Replace comparisons against boolean literals (`== True`, `!= False`, `is True`, etc.) with the simpler equivalent boolean expression. -* [org.openrewrite.python.codequality.SimplifyRedundantLogicalExpression](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/codequality/simplifyredundantlogicalexpression) - * **Simplify redundant logical expressions** - * Replace `x and x` with `x` and `x or x` with `x`. Identical operands in a logical expression are redundant and often indicate a copy-paste mistake. * [org.openrewrite.python.migrate.DependencyInsight](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/dependencyinsight) * **Python dependency insight** * Find Python dependencies, including transitive dependencies, matching a package name pattern. Results include the resolved version, scope, and whether the dependency is direct or transitive. -* [org.openrewrite.python.migrate.FindAifcModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findaifcmodule) - * **Find deprecated `aifc` module usage** - * The `aifc` module was deprecated in Python 3.11 and removed in Python 3.13. Use third-party audio libraries instead. -* [org.openrewrite.python.migrate.FindAsyncioCoroutineDecorator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findasynciocoroutinedecorator) - * **Find deprecated `@asyncio.coroutine` decorator** - * Find usage of the deprecated `@asyncio.coroutine` decorator which was removed in Python 3.11. Convert to `async def` syntax with `await` instead of `yield from`. -* [org.openrewrite.python.migrate.FindAudioopModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findaudioopmodule) - * **Find deprecated `audioop` module usage** - * The `audioop` module was deprecated in Python 3.11 and removed in Python 3.13. Use pydub, numpy, or scipy for audio operations. -* [org.openrewrite.python.migrate.FindCgiModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findcgimodule) - * **Find deprecated `cgi` module usage** - * The `cgi` module was deprecated in Python 3.11 and removed in Python 3.13. Use `urllib.parse` for query string parsing, `html.escape()` for escaping, and web frameworks or `email.message` for form handling. -* [org.openrewrite.python.migrate.FindCgitbModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findcgitbmodule) - * **Find deprecated `cgitb` module usage** - * The `cgitb` module was deprecated in Python 3.11 and removed in Python 3.13. Use the standard `logging` and `traceback` modules for error handling. -* [org.openrewrite.python.migrate.FindChunkModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findchunkmodule) - * **Find deprecated `chunk` module usage** - * The `chunk` module was deprecated in Python 3.11 and removed in Python 3.13. Implement IFF chunk reading manually or use specialized libraries. -* [org.openrewrite.python.migrate.FindCryptModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findcryptmodule) - * **Find deprecated `crypt` module usage** - * The `crypt` module was deprecated in Python 3.11 and removed in Python 3.13. Use `bcrypt`, `argon2-cffi`, or `passlib` instead. -* [org.openrewrite.python.migrate.FindDistutilsUsage](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/finddistutilsusage) - * **Find deprecated distutils module usage** - * Find imports of the deprecated `distutils` module which was removed in Python 3.12. Migrate to `setuptools` or other modern build tools. -* [org.openrewrite.python.migrate.FindFunctoolsCmpToKey](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findfunctoolscmptokey) - * **Find `functools.cmp_to_key()` usage** - * Find usage of `functools.cmp_to_key()` which is a Python 2 compatibility function. Consider using a key function directly. * [org.openrewrite.python.migrate.FindFutureImports](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findfutureimports) * **Find `__future__` imports** * Find `__future__` imports and add a search marker. -* [org.openrewrite.python.migrate.FindImghdrModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findimghdrmodule) - * **Find deprecated `imghdr` module usage** - * The `imghdr` module was deprecated in Python 3.11 and removed in Python 3.13. Use `filetype`, `python-magic`, or `Pillow` instead. -* [org.openrewrite.python.migrate.FindImpUsage](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findimpusage) - * **Find deprecated imp module usage** - * Find imports of the deprecated `imp` module which was removed in Python 3.12. Migrate to `importlib`. -* [org.openrewrite.python.migrate.FindLocaleGetdefaultlocale](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findlocalegetdefaultlocale) - * **Find deprecated `locale.getdefaultlocale()` usage** - * `locale.getdefaultlocale()` was deprecated in Python 3.11. Use `locale.setlocale()`, `locale.getlocale()`, or `locale.getpreferredencoding(False)` instead. -* [org.openrewrite.python.migrate.FindMacpathModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findmacpathmodule) - * **Find removed `macpath` module usage** - * The `macpath` module was removed in Python 3.8. Use `os.path` instead. -* [org.openrewrite.python.migrate.FindMailcapModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findmailcapmodule) - * **Find deprecated `mailcap` module usage** - * The `mailcap` module was deprecated in Python 3.11 and removed in Python 3.13. Use `mimetypes` module for MIME type handling. * [org.openrewrite.python.migrate.FindMethods](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findmethods) * **Find Python function and method usages** * Find function and method calls by pattern. Covers standalone functions, class methods, static methods, and constructor calls. -* [org.openrewrite.python.migrate.FindMsilibModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findmsilibmodule) - * **Find deprecated `msilib` module usage** - * The `msilib` module was deprecated in Python 3.11 and removed in Python 3.13. Use platform-specific tools for MSI creation. -* [org.openrewrite.python.migrate.FindNisModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findnismodule) - * **Find deprecated `nis` module usage** - * The `nis` module was deprecated in Python 3.11 and removed in Python 3.13. There is no direct replacement. -* [org.openrewrite.python.migrate.FindNntplibModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findnntplibmodule) - * **Find deprecated `nntplib` module usage** - * The `nntplib` module was deprecated in Python 3.11 and removed in Python 3.13. NNTP is largely obsolete; consider alternatives if needed. -* [org.openrewrite.python.migrate.FindOsPopen](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findospopen) - * **Find deprecated `os.popen()` usage** - * `os.popen()` has been deprecated since Python 3.6. Use `subprocess.run()` or `subprocess.Popen()` instead for better control over process creation and output handling. -* [org.openrewrite.python.migrate.FindOsSpawn](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findosspawn) - * **Find deprecated `os.spawn*()` usage** - * The `os.spawn*()` family of functions are deprecated. Use `subprocess.run()` or `subprocess.Popen()` instead. -* [org.openrewrite.python.migrate.FindOssaudiodevModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findossaudiodevmodule) - * **Find deprecated `ossaudiodev` module usage** - * The `ossaudiodev` module was deprecated in Python 3.11 and removed in Python 3.13. There is no direct replacement. -* [org.openrewrite.python.migrate.FindPathlibLinkTo](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findpathliblinkto) - * **Find deprecated `Path.link_to()` usage** - * Find usage of `Path.link_to()` which was deprecated in Python 3.10 and removed in 3.12. Use `hardlink_to()` instead (note: argument order is reversed). -* [org.openrewrite.python.migrate.FindPipesModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findpipesmodule) - * **Find deprecated `pipes` module usage** - * The `pipes` module was deprecated in Python 3.11 and removed in Python 3.13. Use subprocess with shlex.quote() for shell escaping. -* [org.openrewrite.python.migrate.FindRemovedModules312](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findremovedmodules312) - * **Find modules removed in Python 3.12** - * Find imports of modules that were removed in Python 3.12, including asynchat, asyncore, and smtpd. -* [org.openrewrite.python.migrate.FindShutilRmtreeOnerror](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findshutilrmtreeonerror) - * **Find deprecated `shutil.rmtree(onerror=...)` parameter** - * The `onerror` parameter of `shutil.rmtree()` was deprecated in Python 3.12 in favor of `onexc`. The `onexc` callback receives the exception object directly rather than an exc_info tuple. -* [org.openrewrite.python.migrate.FindSndhdrModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findsndhdrmodule) - * **Find deprecated `sndhdr` module usage** - * The `sndhdr` module was deprecated in Python 3.11 and removed in Python 3.13. Use `filetype` or audio libraries like `pydub` instead. -* [org.openrewrite.python.migrate.FindSocketGetFQDN](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findsocketgetfqdn) - * **Find `socket.getfqdn()` usage** - * Find usage of `socket.getfqdn()` which can be slow and unreliable. Consider using `socket.gethostname()` instead. -* [org.openrewrite.python.migrate.FindSpwdModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findspwdmodule) - * **Find deprecated `spwd` module usage** - * The `spwd` module was deprecated in Python 3.11 and removed in Python 3.13. There is no direct replacement. -* [org.openrewrite.python.migrate.FindSslMatchHostname](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findsslmatchhostname) - * **Find deprecated `ssl.match_hostname()`** - * Find usage of the deprecated `ssl.match_hostname()` function which was removed in Python 3.12. Use `ssl.SSLContext.check_hostname` instead. -* [org.openrewrite.python.migrate.FindSunauModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findsunaumodule) - * **Find deprecated `sunau` module usage** - * The `sunau` module was deprecated in Python 3.11 and removed in Python 3.13. Use `soundfile` or `pydub` instead. -* [org.openrewrite.python.migrate.FindSysCoroutineWrapper](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findsyscoroutinewrapper) - * **Find removed `sys.set_coroutine_wrapper()` / `sys.get_coroutine_wrapper()`** - * `sys.set_coroutine_wrapper()` and `sys.get_coroutine_wrapper()` were deprecated in Python 3.7 and removed in Python 3.8. -* [org.openrewrite.python.migrate.FindTelnetlibModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findtelnetlibmodule) - * **Find deprecated `telnetlib` module usage** - * The `telnetlib` module was deprecated in Python 3.11 and removed in Python 3.13. Consider using `telnetlib3` from PyPI, direct socket usage, or SSH-based alternatives like paramiko. -* [org.openrewrite.python.migrate.FindTempfileMktemp](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findtempfilemktemp) - * **Find deprecated `tempfile.mktemp()` usage** - * Find usage of `tempfile.mktemp()` which is deprecated due to security concerns (race condition). Use `mkstemp()` or `NamedTemporaryFile()` instead. * [org.openrewrite.python.migrate.FindTypes](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findtypes) * **Find Python types** * Find type references by name. Identifies classes matching a type pattern. In Python, all type definitions use the `class` keyword, covering regular classes, abstract base classes, protocols, enums, dataclasses, named tuples, typed dicts, and more. -* [org.openrewrite.python.migrate.FindUrllibParseSplitFunctions](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findurllibparsesplitfunctions) - * **Find deprecated urllib.parse split functions** - * Find usage of deprecated urllib.parse split functions (splithost, splitport, etc.) removed in Python 3.14. Use urlparse() instead. -* [org.openrewrite.python.migrate.FindUrllibParseToBytes](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findurllibparsetobytes) - * **Find deprecated `urllib.parse.to_bytes()` usage** - * Find usage of `urllib.parse.to_bytes()` which was deprecated in Python 3.8 and removed in 3.14. Use str.encode() directly. -* [org.openrewrite.python.migrate.FindUuModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/finduumodule) - * **Find deprecated `uu` module usage** - * The `uu` module was deprecated in Python 3.11 and removed in Python 3.13. Use `base64` module instead for encoding binary data. -* [org.openrewrite.python.migrate.FindXdrlibModule](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/findxdrlibmodule) - * **Find deprecated `xdrlib` module usage** - * The `xdrlib` module was deprecated in Python 3.11 and removed in Python 3.13. Use `struct` module for binary packing/unpacking. -* [org.openrewrite.python.migrate.MigrateAsyncioCoroutine](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/migrateasynciocoroutine) - * **Migrate `@asyncio.coroutine` to `async def`** - * Migrate functions using the deprecated `@asyncio.coroutine` decorator to use `async def` syntax. Also transforms `yield from` to `await`. The decorator was removed in Python 3.11. * [org.openrewrite.python.migrate.MigrateToPyprojectToml](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/migratetopyprojecttoml) * **Migrate to `pyproject.toml`** * Migrate Python projects from `requirements.txt` and/or `setup.cfg` to `pyproject.toml` with `hatchling` build backend. -* [org.openrewrite.python.migrate.RemoveFutureImports](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/removefutureimports) - * **Remove obsolete `__future__` imports** - * Remove `from __future__ import ...` statements for features that are enabled by default in Python 3. -* [org.openrewrite.python.migrate.ReplaceArrayFromstring](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacearrayfromstring) - * **Replace `array.fromstring()` with `array.frombytes()`** - * Replace `fromstring()` with `frombytes()` on array objects. The fromstring() method was deprecated in Python 3.2 and removed in 3.14. -* [org.openrewrite.python.migrate.ReplaceArrayTostring](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacearraytostring) - * **Replace `array.tostring()` with `array.tobytes()`** - * Replace `tostring()` with `tobytes()` on array objects. The tostring() method was deprecated in Python 3.2 and removed in 3.14. -* [org.openrewrite.python.migrate.ReplaceAstBytes](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceastbytes) - * **Replace `ast.Bytes` with `ast.Constant`** - * The `ast.Bytes` node type was deprecated in Python 3.8 and removed in Python 3.14. Replace with `ast.Constant` and check `isinstance(node.value, bytes)`. -* [org.openrewrite.python.migrate.ReplaceAstEllipsis](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceastellipsis) - * **Replace `ast.Ellipsis` with `ast.Constant`** - * The `ast.Ellipsis` node type was deprecated in Python 3.8 and removed in Python 3.14. Replace with `ast.Constant` and check `node.value is ...`. -* [org.openrewrite.python.migrate.ReplaceAstNameConstant](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceastnameconstant) - * **Replace `ast.NameConstant` with `ast.Constant`** - * The `ast.NameConstant` node type was deprecated in Python 3.8 and removed in Python 3.14. Replace with `ast.Constant` and check `node.value in (True, False, None)`. -* [org.openrewrite.python.migrate.ReplaceAstNum](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceastnum) - * **Replace `ast.Num` with `ast.Constant`** - * The `ast.Num` node type was deprecated in Python 3.8 and removed in Python 3.14. Replace with `ast.Constant` and check `isinstance(node.value, (int, float, complex))`. -* [org.openrewrite.python.migrate.ReplaceAstStr](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceaststr) - * **Replace `ast.Str` with `ast.Constant`** - * The `ast.Str` node type was deprecated in Python 3.8 and removed in Python 3.14. Replace with `ast.Constant` and check `isinstance(node.value, str)`. -* [org.openrewrite.python.migrate.ReplaceCalendarConstants](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacecalendarconstants) - * **Replace deprecated calendar constants with uppercase** - * Replace deprecated mixed-case calendar constants like `calendar.January` with their uppercase equivalents like `calendar.JANUARY`. The mixed-case constants were deprecated in Python 3.12. -* [org.openrewrite.python.migrate.ReplaceCgiParseQs](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacecgiparseqs) - * **Replace `cgi.parse_qs()` with `urllib.parse.parse_qs()`** - * `cgi.parse_qs()` was removed in Python 3.8. Use `urllib.parse.parse_qs()` instead. Note: this rewrites call sites but does not manage imports. Use with `ChangeImport` in a composite recipe to update `from` imports. -* [org.openrewrite.python.migrate.ReplaceCgiParseQsl](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacecgiparseqsl) - * **Replace `cgi.parse_qsl()` with `urllib.parse.parse_qsl()`** - * `cgi.parse_qsl()` was removed in Python 3.8. Use `urllib.parse.parse_qsl()` instead. Note: this rewrites call sites but does not manage imports. Use with `ChangeImport` in a composite recipe to update `from` imports. -* [org.openrewrite.python.migrate.ReplaceCollectionsAbcImports](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacecollectionsabcimports) - * **Replace `collections` ABC imports with `collections.abc`** - * Migrate deprecated abstract base class imports from `collections` to `collections.abc`. These imports were deprecated in Python 3.3 and removed in Python 3.10. -* [org.openrewrite.python.migrate.ReplaceConditionNotifyAll](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceconditionnotifyall) - * **Replace `Condition.notifyAll()` with `Condition.notify_all()`** - * Replace `notifyAll()` method calls with `notify_all()`. The camelCase version was deprecated in Python 3.10 and removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceConfigparserReadfp](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceconfigparserreadfp) - * **Replace `ConfigParser.readfp()` with `read_file()`** - * The `ConfigParser.readfp()` method was deprecated in Python 3.2 and removed in Python 3.13. Replace with `read_file()`. -* [org.openrewrite.python.migrate.ReplaceConfigparserSafeConfigParser](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceconfigparsersafeconfigparser) - * **Replace `configparser.SafeConfigParser` with `ConfigParser`** - * The `configparser.SafeConfigParser` class was deprecated in Python 3.2 and removed in Python 3.12. Replace with `configparser.ConfigParser`. -* [org.openrewrite.python.migrate.ReplaceDatetimeUtcFromTimestamp](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacedatetimeutcfromtimestamp) - * **Replace `datetime.utcfromtimestamp()` with `datetime.fromtimestamp(ts, UTC)`** - * The `datetime.utcfromtimestamp()` method is deprecated in Python 3.12. Replace it with `datetime.fromtimestamp(ts, datetime.UTC)` for timezone-aware datetime objects. -* [org.openrewrite.python.migrate.ReplaceDatetimeUtcNow](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacedatetimeutcnow) - * **Replace `datetime.utcnow()` with `datetime.now(UTC)`** - * The `datetime.utcnow()` method is deprecated in Python 3.12. Replace it with `datetime.now(datetime.UTC)` for timezone-aware datetime objects. -* [org.openrewrite.python.migrate.ReplaceDistutilsVersion](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacedistutilsversion) - * **Replace deprecated distutils.version usage** - * Detect usage of deprecated `distutils.version.LooseVersion` and `distutils.version.StrictVersion`. These should be migrated to `packaging.version.Version`. Note: Manual migration is required as `packaging.version.Version` is not a drop-in replacement. -* [org.openrewrite.python.migrate.ReplaceElementGetchildren](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceelementgetchildren) - * **Replace `Element.getchildren()` with `list(element)`** - * Replace `getchildren()` with `list(element)` on XML Element objects. Deprecated in Python 3.9. -* [org.openrewrite.python.migrate.ReplaceElementGetiterator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceelementgetiterator) - * **Replace `Element.getiterator()` with `Element.iter()`** - * Replace `getiterator()` with `iter()` on XML Element objects. The getiterator() method was deprecated in Python 3.9. -* [org.openrewrite.python.migrate.ReplaceEventIsSet](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceeventisset) - * **Replace `Event.isSet()` with `Event.is_set()`** - * Replace `isSet()` method calls with `is_set()`. The camelCase version was deprecated in Python 3.10 and removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceGettextDeprecations](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacegettextdeprecations) - * **Replace deprecated gettext l*gettext() functions** - * Replace deprecated gettext functions like `lgettext()` with their modern equivalents like `gettext()`. The l*gettext() functions were removed in Python 3.11. -* [org.openrewrite.python.migrate.ReplaceHtmlParserUnescape](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacehtmlparserunescape) - * **Replace `HTMLParser.unescape()` with `html.unescape()`** - * `HTMLParser.unescape()` was removed in Python 3.9. Use `html.unescape()` instead. -* [org.openrewrite.python.migrate.ReplaceLocaleResetlocale](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacelocaleresetlocale) - * **Replace `locale.resetlocale()` with `locale.setlocale(LC_ALL, '')`** - * The `locale.resetlocale()` function was deprecated in Python 3.11 and removed in Python 3.13. Replace with `locale.setlocale(locale.LC_ALL, '')`. -* [org.openrewrite.python.migrate.ReplacePercentFormatWithFString](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacepercentformatwithfstring) - * **Replace `%` formatting with f-string** - * Replace `"..." % (...)` expressions with f-strings (Python 3.6+). Only converts `%s` and `%r` specifiers where the format string is a literal and the conversion is safe. -* [org.openrewrite.python.migrate.ReplacePkgutilFindLoader](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacepkgutilfindloader) - * **Replace `pkgutil.find_loader()` with `importlib.util.find_spec()`** - * The `pkgutil.find_loader()` function was deprecated in Python 3.12. Replace with `importlib.util.find_spec()`. Note: returns ModuleSpec, use .loader for loader. -* [org.openrewrite.python.migrate.ReplacePkgutilGetLoader](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacepkgutilgetloader) - * **Replace `pkgutil.get_loader()` with `importlib.util.find_spec()`** - * The `pkgutil.get_loader()` function was deprecated in Python 3.12. Replace with `importlib.util.find_spec()`. Note: returns ModuleSpec, use .loader for loader. -* [org.openrewrite.python.migrate.ReplacePlatformPopen](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceplatformpopen) - * **Replace `platform.popen()` with `subprocess.check_output()`** - * `platform.popen()` was removed in Python 3.8. Use `subprocess.check_output(cmd, shell=True)` instead. Note: this rewrites call sites but does not manage imports. -* [org.openrewrite.python.migrate.ReplaceReTemplate](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceretemplate) - * **Replace `re.template()` with `re.compile()` and flag `re.TEMPLATE`/`re.T`** - * `re.template()` was deprecated in Python 3.11 and removed in 3.13. Calls are auto-replaced with `re.compile()`. `re.TEMPLATE`/`re.T` flags have no direct replacement and are flagged for manual review. -* [org.openrewrite.python.migrate.ReplaceStrFormatWithFString](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacestrformatwithfstring) - * **Replace `str.format()` with f-string** - * Replace `"...".format(...)` calls with f-strings (Python 3.6+). Only converts cases where the format string is a literal and the conversion is safe. -* [org.openrewrite.python.migrate.ReplaceSysLastExcInfo](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacesyslastexcinfo) - * **Replace `sys.last_type` / `sys.last_value` / `sys.last_traceback` with `sys.last_exc`** - * `sys.last_type`, `sys.last_value`, and `sys.last_traceback` were deprecated in Python 3.12. Replace them with their `sys.last_exc`-based equivalents: `type(sys.last_exc)`, `sys.last_exc`, and `sys.last_exc.__traceback__` respectively. -* [org.openrewrite.python.migrate.ReplaceTarfileFilemode](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetarfilefilemode) - * **Replace `tarfile.filemode` with `stat.filemode`** - * `tarfile.filemode` was removed in Python 3.8. Use `stat.filemode()` instead. -* [org.openrewrite.python.migrate.ReplaceThreadGetName](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadgetname) - * **Replace `Thread.getName()` with `Thread.name`** - * Replace `getName()` method calls with the `name` property. Deprecated in Python 3.10, removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceThreadIsAlive](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadisalive) - * **Replace `Thread.isAlive()` with `Thread.is_alive()`** - * Replace `isAlive()` method calls with `is_alive()`. Deprecated in Python 3.1 and removed in 3.9. -* [org.openrewrite.python.migrate.ReplaceThreadIsDaemon](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadisdaemon) - * **Replace `Thread.isDaemon()` with `Thread.daemon`** - * Replace `isDaemon()` method calls with the `daemon` property. Deprecated in Python 3.10, removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceThreadSetDaemon](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadsetdaemon) - * **Replace `Thread.setDaemon()` with `Thread.daemon = ...`** - * Replace `setDaemon()` method calls with `daemon` property assignment. Deprecated in Python 3.10, removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceThreadSetName](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadsetname) - * **Replace `Thread.setName()` with `Thread.name = ...`** - * Replace `setName()` method calls with `name` property assignment. Deprecated in Python 3.10, removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceThreadingActiveCount](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadingactivecount) - * **Replace `threading.activeCount()` with `threading.active_count()`** - * Replace `threading.activeCount()` with `threading.active_count()`. The camelCase version was deprecated in Python 3.10 and removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceThreadingCurrentThread](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacethreadingcurrentthread) - * **Replace `threading.currentThread()` with `threading.current_thread()`** - * Replace `threading.currentThread()` with `threading.current_thread()`. The camelCase version was deprecated in Python 3.10 and removed in 3.12. -* [org.openrewrite.python.migrate.ReplaceTypingCallableWithCollectionsAbcCallable](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingcallablewithcollectionsabccallable) - * **Replace `typing.Callable` with `collections.abc.Callable`** - * PEP 585 deprecated `typing.Callable` in Python 3.9. Replace with `collections.abc.Callable` for type annotations. -* [org.openrewrite.python.migrate.ReplaceTypingDictWithDict](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingdictwithdict) - * **Replace `typing.Dict` with `dict`** - * PEP 585 deprecated `typing.Dict` in Python 3.9. Replace with the built-in `dict` type for generic annotations. -* [org.openrewrite.python.migrate.ReplaceTypingListWithList](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypinglistwithlist) - * **Replace `typing.List` with `list`** - * PEP 585 deprecated `typing.List` in Python 3.9. Replace with the built-in `list` type for generic annotations. -* [org.openrewrite.python.migrate.ReplaceTypingOptionalWithUnion](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingoptionalwithunion) - * **Replace `typing.Optional[X]` with `X | None`** - * PEP 604 introduced the `|` operator for union types in Python 3.10. Replace `Optional[X]` with the more concise `X | None` syntax. -* [org.openrewrite.python.migrate.ReplaceTypingSetWithSet](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingsetwithset) - * **Replace `typing.Set` with `set`** - * PEP 585 deprecated `typing.Set` in Python 3.9. Replace with the built-in `set` type for generic annotations. -* [org.openrewrite.python.migrate.ReplaceTypingText](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingtext) - * **Replace `typing.Text` with `str`** - * `typing.Text` is deprecated as of Python 3.11. It was an alias for `str` for Python 2/3 compatibility. Replace with `str`. -* [org.openrewrite.python.migrate.ReplaceTypingTupleWithTuple](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingtuplewithtuple) - * **Replace `typing.Tuple` with `tuple`** - * PEP 585 deprecated `typing.Tuple` in Python 3.9. Replace with the built-in `tuple` type for generic annotations. -* [org.openrewrite.python.migrate.ReplaceTypingUnionWithPipe](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replacetypingunionwithpipe) - * **Replace `typing.Union[X, Y]` with `X | Y`** - * PEP 604 introduced the `|` operator for union types in Python 3.10. Replace `Union[X, Y, ...]` with the more concise `X | Y | ...` syntax. -* [org.openrewrite.python.migrate.ReplaceUnittestDeprecatedAliases](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/replaceunittestdeprecatedaliases) - * **Replace deprecated unittest method aliases** - * Replace deprecated unittest.TestCase method aliases like `assertEquals` with their modern equivalents like `assertEqual`. These aliases were removed in Python 3.11/3.12. -* [org.openrewrite.python.migrate.UpgradeToPython310](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython310) - * **Upgrade to Python 3.10** - * Migrate deprecated APIs and adopt new syntax for Python 3.10 compatibility. This includes adopting PEP 604 union type syntax (`X | Y`) and other modernizations between Python 3.9 and 3.10. -* [org.openrewrite.python.migrate.UpgradeToPython311](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython311) - * **Upgrade to Python 3.11** - * Migrate deprecated and removed APIs for Python 3.11 compatibility. This includes handling removed modules, deprecated functions, and API changes between Python 3.10 and 3.11. -* [org.openrewrite.python.migrate.UpgradeToPython312](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython312) - * **Upgrade to Python 3.12** - * Migrate deprecated and removed APIs for Python 3.12 compatibility. This includes detecting usage of the removed `imp` module and other legacy modules that were removed in Python 3.12. -* [org.openrewrite.python.migrate.UpgradeToPython313](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython313) - * **Upgrade to Python 3.13** - * Migrate deprecated and removed APIs for Python 3.13 compatibility. This includes detecting usage of modules removed in PEP 594 ('dead batteries') and other API changes between Python 3.12 and 3.13. -* [org.openrewrite.python.migrate.UpgradeToPython314](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython314) - * **Upgrade to Python 3.14** - * Migrate deprecated and removed APIs for Python 3.14 compatibility. This includes replacing deprecated AST node types with `ast.Constant` and other API changes between Python 3.13 and 3.14. -* [org.openrewrite.python.migrate.UpgradeToPython38](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython38) - * **Upgrade to Python 3.8** - * Migrate deprecated APIs and detect legacy patterns for Python 3.8 compatibility. -* [org.openrewrite.python.migrate.UpgradeToPython39](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/upgradetopython39) - * **Upgrade to Python 3.9** - * Migrate deprecated APIs for Python 3.9 compatibility. This includes PEP 585 built-in generics, removed base64 functions, and deprecated XML Element methods. -* [org.openrewrite.python.migrate.langchain.FindDeprecatedLangchainAgents](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/finddeprecatedlangchainagents) - * **Find deprecated LangChain agent patterns** - * Find usage of deprecated LangChain agent patterns including `initialize_agent`, `AgentExecutor`, and `LLMChain`. These were deprecated in LangChain v0.2 and removed in v1.0. -* [org.openrewrite.python.migrate.langchain.FindLangchainCreateReactAgent](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/findlangchaincreatereactagent) - * **Find `create_react_agent` usage (replace with `create_agent`)** - * Find `from langgraph.prebuilt import create_react_agent` which should be replaced with `from langchain.agents import create_agent` in LangChain v1.0. -* [org.openrewrite.python.migrate.langchain.ReplaceLangchainClassicImports](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/replacelangchainclassicimports) - * **Replace `langchain` legacy imports with `langchain_classic`** - * Migrate legacy chain, retriever, and indexing imports from `langchain` to `langchain_classic`. These were moved in LangChain v1.0. -* [org.openrewrite.python.migrate.langchain.ReplaceLangchainCommunityImports](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/replacelangchaincommunityimports) - * **Replace `langchain` imports with `langchain_community`** - * Migrate third-party integration imports from `langchain` to `langchain_community`. These integrations were moved in LangChain v0.2. -* [org.openrewrite.python.migrate.langchain.ReplaceLangchainProviderImports](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/replacelangchainproviderimports) - * **Replace `langchain_community` imports with provider packages** - * Migrate provider-specific imports from `langchain_community` to dedicated provider packages like `langchain_openai`, `langchain_anthropic`, etc. -* [org.openrewrite.python.migrate.langchain.UpgradeToLangChain02](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/upgradetolangchain02) - * **Upgrade to LangChain 0.2** - * Migrate to LangChain 0.2 by updating imports from `langchain` to `langchain_community` and provider-specific packages. -* [org.openrewrite.python.migrate.langchain.UpgradeToLangChain1](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/langchain/upgradetolangchain1) - * **Upgrade to LangChain 1.0** - * Migrate to LangChain 1.0 by applying all v0.2 migrations and then moving legacy functionality to `langchain_classic`. -* [org.openrewrite.python.migrate.pydantic.FindDeprecatedJsonEncoders](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/finddeprecatedjsonencoders) - * **Find deprecated `json_encoders` config option** - * Pydantic deprecated the `json_encoders` option in `ConfigDict`. Its replacements (`@field_serializer` / `@model_serializer` or `Annotated[..., PlainSerializer(...)]`) require restructuring, so this recipe flags its use for review. -* [org.openrewrite.python.migrate.pydantic.FindDeprecatedSchemaGenerator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/finddeprecatedschemagenerator) - * **Find deprecated `schema_generator` config option** - * Pydantic 2.10 deprecated the `schema_generator` option in `ConfigDict`. It has no public replacement yet, so this recipe flags its use for review. -* [org.openrewrite.python.migrate.pydantic.FindEvalTypeBackportUsage](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/findevaltypebackportusage) - * **Find `eval_type_backport` usage removed in Pydantic 2.14** - * Pydantic 2.14 removed its support for the `eval_type_backport` package. With the Python 3.10 minimum it is no longer needed. This recipe flags `import eval_type_backport` and `from eval_type_backport import ...` for review. -* [org.openrewrite.python.migrate.pydantic.FindModelValidatorAfterClassmethod](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/findmodelvalidatorafterclassmethod) - * **Find `@model_validator(mode='after')` on a classmethod** - * Pydantic 2.12 deprecated `@model_validator` with `mode='after'` on a classmethod; the implicit classmethod conversion for `after` model validators is removed in V3. Such validators should be instance methods (`self`, no `@classmethod`). This recipe flags the decorator for review, since the rewrite is not safe to mechanize. `field_validator` is unaffected. -* [org.openrewrite.python.migrate.pydantic.FindSerializeAsAnyUsage](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/findserializeasanyusage) - * **Find `serialize_as_any` usage affected by the Pydantic 2.12 unification** - * Pydantic 2.12 unified the `serialize_as_any` flag with the `SerializeAsAny` annotation, which can change serialization output versus 2.11. This recipe flags `serialize_as_any=` on `model_dump` / `model_dump_json` (and `TypeAdapter.dump_python` / `dump_json`) for review, since there is no safe mechanical rewrite. -* [org.openrewrite.python.migrate.pydantic.RemoveEllipsisFromField](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/removeellipsisfromfield) - * **Remove `...` (Ellipsis) from `Field()`** - * Pydantic 2.10 recommends against using `Ellipsis` (`...`) with `Field` to mark a field as required, as it does not play well with static type checkers. Rewrite `Field(...)` to `Field()` (and `Field(..., x=y)` to `Field(x=y)`), keeping the remaining arguments. Only calls resolving to `pydantic.fields.Field` are rewritten. -* [org.openrewrite.python.migrate.pydantic.ReplaceFinalFieldWithClassVar](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/replacefinalfieldwithclassvar) - * **Replace `Final` model fields with a default with `ClassVar`** - * Pydantic 2.11 deprecates annotating a model field as `Final` with a default value (such fields were treated as class variables). Replace `Final[X] = default` with `ClassVar[X] = default`, which preserves the existing class-variable behavior and is the replacement Pydantic recommends. -* [org.openrewrite.python.migrate.pydantic.ReplaceModelFieldsInstanceAccess](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/replacemodelfieldsinstanceaccess) - * **Replace instance access of `model_fields` / `model_computed_fields`** - * Pydantic 2.11 deprecated accessing `model_fields` and `model_computed_fields` on a model instance; these are removed in Pydantic 3.0. Replace `<instance>.model_fields` with `type(<instance>).model_fields` (and likewise for `model_computed_fields`) when the receiver resolves to a Pydantic model, so the attribute is accessed on the class. Class access and `cls` access are left untouched. -* [org.openrewrite.python.migrate.pydantic.ReplacePopulateByNameWithValidateByName](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/replacepopulatebynamewithvalidatebyname) - * **Replace `populate_by_name` with `validate_by_name`** - * Pydantic 2.11 introduced `validate_by_name` as the equivalent of `populate_by_name`, which is pending deprecation in Pydantic V3. Rename `ConfigDict(populate_by_name=...)` to `ConfigDict(validate_by_name=...)`. This is behavior-preserving (`validate_by_alias` defaults to `True`) and future-proofs the configuration. -* [org.openrewrite.python.migrate.pydantic.UpgradeToPydantic210](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/upgradetopydantic210) - * **Upgrade to Pydantic 2.10** - * Flag and migrate code affected by deprecations introduced in Pydantic 2.10, such as the deprecated `schema_generator` config option and the discouraged `Field(...)` Ellipsis form. Also flags the deprecated `json_encoders` config option. -* [org.openrewrite.python.migrate.pydantic.UpgradeToPydantic211](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/upgradetopydantic211) - * **Upgrade to Pydantic 2.11** - * Migrate code affected by deprecations introduced in Pydantic 2.11 (and 2.10). Rewrites instance access of `model_fields` / `model_computed_fields` to class access, rewrites `Final` model fields with default values to `ClassVar`, and renames `populate_by_name` to `validate_by_name`. -* [org.openrewrite.python.migrate.pydantic.UpgradeToPydantic212](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/upgradetopydantic212) - * **Upgrade to Pydantic 2.12** - * Migrate code affected by changes introduced in Pydantic 2.12 (and 2.10/2.11). Flags `serialize_as_any` usage affected by the 2.12 unification with the `SerializeAsAny` annotation. -* [org.openrewrite.python.migrate.pydantic.UpgradeToPydantic213](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/upgradetopydantic213) - * **Upgrade to Pydantic 2.13** - * Migrate code for Pydantic 2.13. Pydantic 2.13 introduced no new deprecations (an additive release), so this applies all Pydantic 2.12 migrations (which chain back to 2.10). -* [org.openrewrite.python.migrate.pydantic.UpgradeToPydantic214](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/migrate/pydantic/upgradetopydantic214) - * **Upgrade to Pydantic 2.14** - * Migrate code affected by changes introduced in Pydantic 2.14 (and 2.10-2.13). Flags `eval_type_backport` usage, whose support 2.14 removed. Note: 2.14 is in prerelease; verify against the 2.14.0 GA release. ### rewrite-nodejs @@ -8106,15 +7824,9 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * [org.openrewrite.node.migrate.zlib.replace-bytes-read](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/node/migrate/zlib/replace-bytes-read) * **Replace deprecated `zlib.bytesRead` with `zlib.bytesWritten`** * Replace deprecated `bytesRead` property on zlib streams with `bytesWritten`. -* [org.openrewrite.nodejs.UpgradeDependencyVersion](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/upgradedependencyversion) - * **Upgrade Node.js dependencies** - * Upgrade matching Node.js direct dependencies. * [org.openrewrite.nodejs.search.DatabaseInteractionInsights](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/databaseinteractioninsights) * **Javascript database interaction library insights** * Discover which popular javascript database interaction libraries (Sequelize, TypeORM, Mongoose, etc.) are being used in your projects. -* [org.openrewrite.nodejs.search.DependencyInsight](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/dependencyinsight) - * **Node.js dependency insight** - * Identify the direct and transitive Node.js dependencies used in a project. * [org.openrewrite.nodejs.search.FindNodeProjects](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/nodejs/search/findnodeprojects) * **Find Node.js projects** * Find Node.js projects and summarize data about them. @@ -8269,270 +7981,6 @@ This doc includes every recipe that is exclusive to users of Moderne. For a full * **Find SQL function** * Find SQL functions by name. -### rewrite-static-analysis-python - -* [org.openrewrite.python.cleanup.AssignIfExp](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/assignifexp) - * **Use inline conditional for simple ``if``/``else`` assignment** - * When an ``if``/``else`` pair each assign a single value to the same variable, rewrite as a ternary expression. -* [org.openrewrite.python.cleanup.AugAssign](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/augassign) - * **Shorten assignment to compound operator form** - * Convert ``target = target op value`` into ``target op= value`` for arithmetic operators (+, -, *, /, %). -* [org.openrewrite.python.cleanup.BinOpIdentity](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/binopidentity) - * **Collapse self-cancelling `^` / `-` with duplicate operands to `0`** - * When both operands of `^` or `-` are the same expression, reduce to `0` (the self-cancelling identity). -* [org.openrewrite.python.cleanup.BooleanIfExpIdentity](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/booleanifexpidentity) - * **Collapse boolean ternary to bare condition** - * Replace ``True if expr else False`` with ``expr`` and ``False if expr else True`` with ``not expr``, removing the redundant ternary wrapper. -* [org.openrewrite.python.cleanup.BreakOrContinueOutsideLoop](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/breakorcontinueoutsideloop) - * **Remove `break`/`continue` outside loop** - * Remove `break` and `continue` statements that are not inside any for or while loop. -* [org.openrewrite.python.cleanup.ChainCompares](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/chaincompares) - * **Use chained comparison syntax** - * Merge two relational tests that share a middle operand into a single chained comparison, e.g. ``0 < idx and idx < size`` becomes ``0 < idx < size``. -* [org.openrewrite.python.cleanup.ClassMethodFirstArgName](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/classmethodfirstargname) - * **Standardize `@classmethod` first parameter to `cls`** - * Ensure that `@classmethod` methods use `cls` as their first parameter, as required by PEP 8, and update all body references. -* [org.openrewrite.python.cleanup.CollectionBuiltinToComprehension](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/collectionbuiltintocomprehension) - * **Use comprehension syntax instead of `list()`/`set()` around generators** - * Wrapping a generator in `list()` or `set()` is less idiomatic than the equivalent bracket/brace comprehension syntax. -* [org.openrewrite.python.cleanup.CollectionIntoSet](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/collectionintoset) - * **Prefer set literals in `in` membership tests** - * When a list or tuple of literals appears on the right side of an `in` test, convert it to a set literal for constant-time lookup. -* [org.openrewrite.python.cleanup.CollectionToBool](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/collectiontobool) - * **Substitute constant collection condition with boolean** - * When a list, tuple, dict, or set literal is used as an ``if`` or ``while`` condition, replace it with ``True`` (non-empty) or ``False`` (empty) to state the intent directly. -* [org.openrewrite.python.cleanup.ComprehensionToGenerator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/comprehensiontogenerator) - * **Use generator expression instead of list comprehension in iterable-accepting calls** - * Functions that consume iterables lazily (e.g. `any`, `sum`, `sorted`) do not need a list comprehension -- a generator expression suffices. -* [org.openrewrite.python.cleanup.ConvertAnyToIn](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/convertanytoin) - * **Rewrite `any(v == literal ...)` as `literal in collection`** - * An `any()` generator that tests equality against a literal value is equivalent to the `in` membership operator, which is clearer. -* [org.openrewrite.python.cleanup.DataframeAppendToConcat](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/dataframeappendtoconcat) - * **Migrate deprecated `.append()` to `pd.concat()`** - * `DataFrame.append()` no longer exists in pandas 2.0+. This recipe rewrites `.append(x)` calls to `pd.concat([df, x])`. -* [org.openrewrite.python.cleanup.DeMorgan](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/demorgan) - * **Flatten negated logic via De Morgan's identities** - * Use De Morgan's identities to remove double negation and to distribute ``not`` into compound conditions, e.g. ``not not finished`` becomes ``finished`` and ``not (m and n)`` becomes ``not m or not n``. -* [org.openrewrite.python.cleanup.DefaultMutableArg](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/defaultmutablearg) - * **Guard mutable default arguments with `None` sentinel** - * Change mutable default values (`[]`, `\{\}`, `set()`) to `None` and prepend an `if arg is None: arg = <original>` guard so each call gets its own fresh instance. -* [org.openrewrite.python.cleanup.DictLiteral](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/dictliteral) - * **Use `\{\}` literal instead of `dict()` constructor** - * Convert no-argument `dict()` calls to the `\{\}` literal, which is more concise and avoids a function call. -* [org.openrewrite.python.cleanup.DoNotUseBareExcept](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/donotusebareexcept) - * **Narrow bare `except:` to `except Exception:`** - * An unqualified `except:` intercepts every exception, including `SystemExit` and `KeyboardInterrupt`. Specifying `Exception` restricts the handler to ordinary runtime errors. -* [org.openrewrite.python.cleanup.EqualityIdentity](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/equalityidentity) - * **Fold same-literal `==`/`!=` comparisons to boolean constants** - * When both sides of `==` or `!=` are the same literal, replace the expression with `True` or `False` respectively. -* [org.openrewrite.python.cleanup.FlipComparison](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/flipcomparison) - * **Reorder comparisons to put literals on the right** - * Swap operands when a constant appears on the left of a comparison, e.g. ``42 == count`` becomes ``count == 42``, mirroring the relational operator as needed. -* [org.openrewrite.python.cleanup.IdentityComprehension](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/identitycomprehension) - * **Simplify identity comprehension to `list()`/`set()` call** - * A comprehension that simply passes through each element unchanged is equivalent to calling `list()` or `set()` on the iterable. -* [org.openrewrite.python.cleanup.InstanceMethodFirstArgName](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/instancemethodfirstargname) - * **Standardize instance method first parameter to `self`** - * Ensure instance methods use `self` as their first parameter per PEP 8 and rename all body references. Methods decorated with `@staticmethod` or `@classmethod` are not affected. -* [org.openrewrite.python.cleanup.InvertAnyAll](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/invertanyall) - * **Swap `not all()`/`not any()` by negating the comparison** - * Apply De Morgan's law to replace `not all(cond ...)` with `any(negated_cond ...)` or `not any(cond ...)` with `all(negated_cond ...)`. -* [org.openrewrite.python.cleanup.InvertAnyAllBody](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/invertanyallbody) - * **Apply De Morgan's law to `any(not ...)`/`all(not ...)`** - * When the generator body just negates the loop variable, De Morgan's law lets us eliminate the generator entirely: `any(not v for v in seq)` becomes `not all(seq)`, and the reverse. -* [org.openrewrite.python.cleanup.ListLiteral](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/listliteral) - * **Use `[]` literal instead of `list()` constructor** - * Convert no-argument `list()` calls to the `[]` literal, which is more concise and avoids a function call. -* [org.openrewrite.python.cleanup.MergeComparisons](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/mergecomparisons) - * **Consolidate repeated `==` with `or` into `in`** - * Fold ``var == a or var == b`` into ``var in [a, b]``, reducing duplication and improving readability. -* [org.openrewrite.python.cleanup.MergeElseIfIntoElif](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/mergeelseifintoelif) - * **Convert ``else: if`` to ``elif``** - * When an ``else`` clause contains nothing but an ``if``, rewrite it as ``elif`` to eliminate extra nesting. -* [org.openrewrite.python.cleanup.MergeIsinstance](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/mergeisinstance) - * **Merge `isinstance()` calls** - * Merge `isinstance(x, A) or isinstance(x, B)` into `isinstance(x, (A, B))` for cleaner type checking. -* [org.openrewrite.python.cleanup.MergeNestedIfs](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/mergenestedifs) - * **Collapse nested ``if`` into a single ``and`` condition** - * When two ``if`` statements are nested with no ``else`` on either, join their conditions with ``and`` and flatten the body. -* [org.openrewrite.python.cleanup.NoneCompare](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/nonecompare) - * **Compare to `None` with identity operators (`is` / `is not`)** - * Switch `== None` to `is None` and `!= None` to `is not None`, following PEP 8 singleton comparison guidance. -* [org.openrewrite.python.cleanup.OrIfExpIdentity](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/orifexpidentity) - * **Replace self-referencing ternary with `or`** - * When a ternary's condition and true-branch name the same variable, rewrite ``val if val else fallback`` as ``val or fallback`` to avoid repeating the name. -* [org.openrewrite.python.cleanup.PandasAvoidInplace](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/pandasavoidinplace) - * **Eliminate `inplace=True` in favor of reassignment** - * Convert pandas operations that use `inplace=True` into reassignment form, e.g. `df.drop_duplicates(inplace=True)` becomes `df = df.drop_duplicates()`. -* [org.openrewrite.python.cleanup.PythonBestPractices](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/pythonbestpractices) - * **Python cleanup suite** - * Run every Python cleanup recipe in one pass -- literal simplification, boolean and comparison tidying, dead code removal, naming fixes, pandas modernization, and more. -* [org.openrewrite.python.cleanup.RaiseFromPreviousError](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/raisefrompreviouserror) - * **Chain exceptions with `raise ... from` in except blocks** - * Raise statements inside except blocks should use `from` to chain the new exception to the caught one, preserving the full traceback. -* [org.openrewrite.python.cleanup.RemoveAssertTrue](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeasserttrue) - * **Delete no-op `assert True` statements** - * Delete bare `assert True` statements, which are always satisfied and have no effect. Assertions that carry a message string are preserved. -* [org.openrewrite.python.cleanup.RemoveDictKeys](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removedictkeys) - * **Drop redundant `.keys()` on dict iteration** - * Dictionaries iterate over their keys by default, making explicit `.keys()` calls unnecessary in for-loops and `in` expressions. -* [org.openrewrite.python.cleanup.RemoveDuplicateDictKey](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeduplicatedictkey) - * **Deduplicate repeated keys in dict literals** - * When a dict literal contains the same key more than once, only the final value survives at runtime. This removes the shadowed entries. -* [org.openrewrite.python.cleanup.RemoveDuplicateSetKey](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeduplicatesetkey) - * **Deduplicate repeated elements in set literals** - * Set literals with repeated values have redundant entries that are discarded at runtime. This removes the duplicates, keeping the last one. -* [org.openrewrite.python.cleanup.RemoveEmptyNestedBlock](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeemptynestedblock) - * **Delete `if` blocks whose body is only `pass`** - * Delete `if` statements that contain nothing but `pass` and have no `else` branch. `for`/`while` loops are left alone because iterating may have side effects. -* [org.openrewrite.python.cleanup.RemoveNoneFromDefaultGet](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removenonefromdefaultget) - * **Remove redundant `None` default from `dict.get()`** - * Remove redundant `None` default argument from `dict.get()` calls since `None` is already the default return value. -* [org.openrewrite.python.cleanup.RemovePassBody](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removepassbody) - * **Drop ``pass``-only ``if`` body by inverting the guard** - * When an ``if`` body contains only ``pass`` and is followed by an ``else``, flip the condition and use the else body directly. -* [org.openrewrite.python.cleanup.RemovePassElif](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removepasselif) - * **Drop ``pass``-only ``elif`` by negating its condition** - * When an ``elif`` body is only ``pass`` and an ``else`` follows, invert the ``elif`` condition and absorb the else body. -* [org.openrewrite.python.cleanup.RemoveRedundantBoolean](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantboolean) - * **Eliminate boolean literal from `and`/`or`** - * Strip ``True`` or ``False`` from ``and``/``or`` expressions where the literal has no effect on the result, e.g. ``True and val`` reduces to ``val`` and ``False and val`` reduces to ``False``. -* [org.openrewrite.python.cleanup.RemoveRedundantCondition](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantcondition) - * **Remove redundant ternary condition** - * When both branches of a ternary expression are identical, simplify `y if z else y` to `y`. -* [org.openrewrite.python.cleanup.RemoveRedundantConstructorInDictUnion](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantconstructorindictunion) - * **Unwrap unnecessary `dict()` from union operands** - * The `|` operator already produces a fresh dict, so wrapping an operand in `dict()` is redundant and can be removed. -* [org.openrewrite.python.cleanup.RemoveRedundantContinue](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantcontinue) - * **Strip trailing ``continue`` from loop body** - * Strip ``continue`` when it is the final statement in a loop body, since the loop naturally advances to the next iteration. -* [org.openrewrite.python.cleanup.RemoveRedundantFstring](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantfstring) - * **Drop ``f`` prefix from strings without placeholders** - * When an f-string has no ``\{...\}`` expressions, strip the ``f`` prefix and convert it to an ordinary string literal. -* [org.openrewrite.python.cleanup.RemoveRedundantIf](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantif) - * **Simplify negated ``elif`` to ``else``** - * When an ``elif`` condition is the exact negation of the preceding ``if``, replace it with ``else`` since the test is redundant. -* [org.openrewrite.python.cleanup.RemoveRedundantPass](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantpass) - * **Delete unnecessary ``pass`` in non-empty blocks** - * Delete ``pass`` when the enclosing block already contains other statements; ``pass`` is only useful as a placeholder in empty blocks. -* [org.openrewrite.python.cleanup.RemoveRedundantPathExists](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantpathexists) - * **Drop ``exists()`` check before ``is_dir()``/``is_file()``** - * Drop ``path.exists()`` when it is ``and``-ed with ``is_dir()`` or ``is_file()``, which inherently return ``False`` for missing paths. -* [org.openrewrite.python.cleanup.RemoveRedundantSliceIndex](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeredundantsliceindex) - * **Drop default-value slice boundaries** - * Omit slice start/stop when they equal ``0`` and ``len(seq)`` respectively, e.g. ``data[0:len(data)]`` becomes ``data[:]``. -* [org.openrewrite.python.cleanup.RemoveStrFromFstring](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removestrfromfstring) - * **Strip ``str()`` from f-string placeholders** - * F-string placeholders convert values to strings automatically, so wrapping expressions in ``str()`` inside ``\{...\}`` is redundant. -* [org.openrewrite.python.cleanup.RemoveStrFromPrint](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removestrfromprint) - * **Unwrap ``str()`` from ``print()`` arguments** - * ``print()`` automatically converts its arguments to strings, so an explicit ``str()`` wrapper is unnecessary and can be removed. -* [org.openrewrite.python.cleanup.RemoveUnitStepFromRange](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeunitstepfromrange) - * **Drop unnecessary step `1` argument from `range()`** - * Shorten `range(a, b, 1)` to `range(a, b)` because `range` already defaults to a step of one. -* [org.openrewrite.python.cleanup.RemoveUnnecessaryElse](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeunnecessaryelse) - * **Drop ``else`` after early-exit ``if`` branch** - * When the ``if`` body always exits via return, raise, continue, or break, remove the ``else`` and dedent its contents. -* [org.openrewrite.python.cleanup.RemoveUnreachableCode](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removeunreachablecode) - * **Strip dead code after terminal statements** - * Delete statements that follow a `return`, `raise`, `continue`, or `break` in the same block, since they can never execute. -* [org.openrewrite.python.cleanup.RemoveZeroFromRange](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/removezerofromrange) - * **Drop unnecessary `0` start argument from `range()`** - * Shorten `range(0, n)` to `range(n)` because `range` already defaults to starting at zero. -* [org.openrewrite.python.cleanup.ReplaceApplyWithMethodCall](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/replaceapplywithmethodcall) - * **Convert `apply('name')` to a direct method invocation** - * When `apply()` receives a string literal like `'sum'` or `'mean'`, rewrite the call as a direct method invocation on the object. -* [org.openrewrite.python.cleanup.ReturnOrYieldOutsideFunction](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/returnoryieldoutsidefunction) - * **Remove `return`/`yield` outside function** - * Remove `return` and `yield` statements that are not inside any function or method definition. -* [org.openrewrite.python.cleanup.SimplifyBooleanComparison](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifybooleancomparison) - * **Remove explicit True/False comparisons** - * Drop unnecessary ``== True``, ``!= False``, and similar tests against boolean literals, leaving just the expression or ``not expr``. -* [org.openrewrite.python.cleanup.SimplifyConstantSum](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifyconstantsum) - * **Simplify `sum(1 for x in items if cond)` to `sum(bool(cond) for x in items)`** - * Replace `sum(1 for x in items if cond)` with `sum(bool(cond) for x in items)` by moving the filter condition into a `bool()` wrapper. -* [org.openrewrite.python.cleanup.SimplifyDictionaryUpdate](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifydictionaryupdate) - * **Convert one-item `dict.update()` to bracket assignment** - * When `.update()` receives a dictionary literal containing exactly one key, rewrite it as a direct key assignment for clarity and efficiency. -* [org.openrewrite.python.cleanup.SimplifyDivision](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifydivision) - * **Convert `int(a / b)` to floor division** - * Replace ``int(a / b)`` with Python's floor-division operator ``a // b`` for a more concise expression. -* [org.openrewrite.python.cleanup.SimplifyEmptyCollectionComparison](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifyemptycollectioncomparison) - * **Use truthiness instead of empty-container equality** - * Convert ``== ""``/``== []``/``== \{\}``/``== ()`` into ``not var`` and the corresponding ``!=`` forms into ``var``, relying on Python's truthiness semantics for empty collections. -* [org.openrewrite.python.cleanup.SimplifyFstringFormatting](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifyfstringformatting) - * **Fold constants and flatten nested f-strings** - * Inline constant values directly into f-string text and unwrap nested f-strings into their enclosing string. -* [org.openrewrite.python.cleanup.SimplifyGenerator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifygenerator) - * **Pass iterable directly to `any()`/`all()` instead of identity generator** - * An identity generator that yields every element unchanged is redundant inside `any()` or `all()` -- pass the collection directly. -* [org.openrewrite.python.cleanup.SimplifyLenComparison](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifylencomparison) - * **Replace `len()` emptiness check with truthiness** - * Rewrite ``len(seq) > 0`` / ``len(seq) != 0`` to ``seq`` and ``len(seq) == 0`` to ``not seq``, leveraging Python's built-in truthiness for collections. -* [org.openrewrite.python.cleanup.SimplifyNegativeIndex](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifynegativeindex) - * **Use negative index instead of `len()` offset** - * Rewrite ``seq[len(seq) - k]`` as ``seq[-k]``, using Python's native negative-indexing support. -* [org.openrewrite.python.cleanup.SimplifySingleExceptionTuple](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifysingleexceptiontuple) - * **Unwrap one-element exception tuple in `except`** - * A tuple containing only one exception type is needlessly verbose. This unwraps it to the plain `except ExcType:` form. -* [org.openrewrite.python.cleanup.SimplifyStrLenComparison](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifystrlencomparison) - * **Compare string to `""` instead of checking `len()`** - * Replace ``len(text) == 0`` with ``text == ""`` and ``len(text) > 0`` / ``len(text) != 0`` with ``text != ""``, comparing the string directly rather than measuring its length. -* [org.openrewrite.python.cleanup.SimplifySubstringSearch](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/simplifysubstringsearch) - * **Replace `.find()` check with `in` / `not in`** - * Rewrite ``.find()`` return-value checks as membership tests: ``text.find(sub) == -1`` becomes ``sub not in text`` and ``text.find(sub) != -1`` becomes ``sub in text``. -* [org.openrewrite.python.cleanup.SquareIdentity](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/squareidentity) - * **Rewrite self-multiplication as `** 2`** - * When an expression is multiplied by itself, rewrite it using the exponentiation operator (`** 2`) for clarity. -* [org.openrewrite.python.cleanup.StrPrefixSuffix](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/strprefixsuffix) - * **Prefer ``startswith``/``endswith`` over slice comparison** - * Rewrite ``s[:N] == "lit"`` as ``s.startswith("lit")`` and ``s[-N:] == "lit"`` as ``s.endswith("lit")`` when the slice length equals the literal length. -* [org.openrewrite.python.cleanup.SwapIfElseBranches](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/swapifelsebranches) - * **Flip empty ``if``-body by negating the condition** - * When the ``if`` branch is just ``pass`` and an ``else`` exists, invert the test and promote the else body to the if body. -* [org.openrewrite.python.cleanup.SwapIfExpression](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/swapifexpression) - * **Swap ternary branches to drop negated condition** - * Flip the branches of a conditional expression whose test uses ``not``, eliminating the negation for clearer intent. -* [org.openrewrite.python.cleanup.SwapVariable](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/swapvariable) - * **Simplify temp-variable swap to tuple unpacking** - * Detect the three-line swap idiom (`tmp = x; x = y; y = tmp`) and condense it into `x, y = y, x` using tuple unpacking. -* [org.openrewrite.python.cleanup.TernaryToIfExpression](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/ternarytoifexpression) - * **Convert `and`/`or` ternary trick to conditional expression** - * Rewrite the legacy `cond and val or fallback` idiom as `val if cond else fallback` to avoid silent bugs when `val` is falsy. -* [org.openrewrite.python.cleanup.TupleLiteral](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/tupleliteral) - * **Use `()` literal instead of `tuple()` constructor** - * Convert no-argument `tuple()` calls to the `()` literal, which is more concise and avoids a function call. -* [org.openrewrite.python.cleanup.UnwrapIterableConstruction](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/unwrapiterableconstruction) - * **Flatten redundant collection constructor wrapping a literal** - * When `tuple()`, `list()`, or `set()` wraps a single list or tuple literal, remove the constructor and use the target literal form directly. -* [org.openrewrite.python.cleanup.UseContextlibSuppress](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/usecontextlibsuppress) - * **Replace `try/except: pass` with `contextlib.suppress()`** - * When an except handler only contains `pass`, the intent is to suppress the error. `contextlib.suppress()` states this explicitly and eliminates the try/except boilerplate. -* [org.openrewrite.python.cleanup.UseDatetimeNowNotToday](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/usedatetimenownottoday) - * **Use `datetime.now()` instead of `datetime.today()`** - * Replace `datetime.today()` with `datetime.now()`. Both are equivalent, but `now()` is more explicit and supports timezone arguments. -* [org.openrewrite.python.cleanup.UseDictionaryUnion](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/usedictionaryunion) - * **Use dict union operator instead of double-star unpacking** - * Dict literals made up entirely of `**` unpacking can be rewritten with the `|` union operator available since Python 3.9. -* [org.openrewrite.python.cleanup.UseFileIterator](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/usefileiterator) - * **Iterate over file objects directly, not via `readlines()`** - * File objects are iterable and yield lines on demand, so calling `.readlines()` to build an intermediate list is unnecessary. -* [org.openrewrite.python.cleanup.UseGetitemForReMatchGroups](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/usegetitemforrematchgroups) - * **Use bracket access for ``re.Match`` groups** - * Replace ``match.group(n)`` with ``match[n]`` to use the shorter subscript syntax available since Python 3.6. -* [org.openrewrite.python.cleanup.UseIsna](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/useisna) - * **Use `.isna()` instead of `== np.nan` comparisons** - * Rewrite `== np.nan` and `== numpy.nan` equality tests as `.isna()` calls, since direct NaN comparison always evaluates to False. -* [org.openrewrite.python.cleanup.UseStringRemoveAffix](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/usestringremoveaffix) - * **Replace string slicing with `removeprefix`/`removesuffix`** - * Replace `if text.startswith(s): text = text[N:]` with `text = text.removeprefix(s)` and the equivalent `endswith` pattern with `removesuffix` (Python 3.9+). -* [org.openrewrite.python.cleanup.UselessElseOnLoop](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/uselesselseonloop) - * **Flatten `for/else` when the loop has no `break`** - * A `for/else` where the loop body never breaks is misleading -- the `else` runs every time. This moves the else body after the loop. -* [org.openrewrite.python.cleanup.YieldFrom](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/python/cleanup/yieldfrom) - * **Collapse for-yield loop into `yield from`** - * A for-loop that does nothing but yield the loop variable can be expressed as `yield from`, which is shorter and delegates directly. - ### rewrite-struts * [org.openrewrite.java.struts.MigrateStrutsDtd](https://docs.moderne.io/user-documentation/recipes/recipe-catalog/java/struts/migratestrutsdtd) diff --git a/docs/reference/recipes-by-tag.md b/docs/reference/recipes-by-tag.md index 20d237d075..8a7f90d9f5 100644 --- a/docs/reference/recipes-by-tag.md +++ b/docs/reference/recipes-by-tag.md @@ -6,7 +6,7 @@ description: An autogenerated list of all recipe tags and the recipes within eac _This doc contains all recipe tags and the recipes that are tagged with them._ -Total tags: 260 +Total tags: 261 ## 5to6 @@ -37,17 +37,20 @@ _7 recipes_ ## actions -_4 recipes_ +_5 recipes_ * [org.openrewrite.github.GitHubActionsBestPractices](/recipes/github/githubactionsbestpractices.md) * **GitHub Actions best practices** - * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, and preferring block-style job dependencies. + * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, preferring block-style job dependencies, and upgrading official actions to their latest versions. * [org.openrewrite.github.MigrateSetupUvV6ToV7](/recipes/github/migratesetupuvv6tov7.md) * **Migrate `astral-sh/setup-uv` from v6 to v7** * Migrates `astral-sh/setup-uv` from v6 to v7. Updates the action version and removes the deprecated `server-url` input. See the [v7.0.0 release notes](https://github.com/astral-sh/setup-uv/releases/tag/v7.0.0) for breaking changes. * [org.openrewrite.github.MigrateTibdexGitHubAppTokenToActions](/recipes/github/migratetibdexgithubapptokentoactions.md) * **Migrate from tibdex/github-app-token to actions/create-github-app-token** * Migrates from the deprecated `tibdex/github-app-token@v2` to `actions/create-github-app-token@v3`, which runs on Node.js 24 instead of the deprecated Node.js 20. Renames the `app_id`, `private_key`, and `github_api_url` inputs to their kebab-case equivalents `app-id`, `private-key`, and `github-api-url`. +* [org.openrewrite.github.UpgradeOfficialGitHubActions](/recipes/github/upgradeofficialgithubactions.md) + * **Upgrade official GitHub Actions to their latest versions** + * Upgrades actions from the official `actions` and `github` organizations to the newest known version, working entirely offline. Each reference is upgraded while preserving its existing precision: a major version (`v4`) moves to the newest major, a full version (`v4.1.2`) to the newest full version, and a commit SHA to the latest known commit. Actions that are not official, not known, or already up to date are left untouched. * [org.openrewrite.github.security.PinGitHubActionsToSha](/recipes/github/security/pingithubactionstosha.md) * **Pin GitHub Actions to commit SHAs** * Replaces mutable tag or branch references in GitHub Actions `uses:` declarations with immutable commit SHAs. A static mapping of well-known actions is checked first; if the action is not found, the GitHub API is used to resolve the reference at recipe run time. By default only third-party actions are pinned; set `pinOfficialActions` to include actions from the `actions` and `github` organizations. To pin only a specific allow-list of actions, set `includedActions`. @@ -2419,7 +2422,7 @@ _1 recipe_ ## github -_14 recipes_ +_15 recipes_ * [org.openrewrite.github.AddDependabotCooldown](/recipes/github/adddependabotcooldown.md) * **Add cooldown periods to Dependabot configuration** @@ -2438,7 +2441,7 @@ _14 recipes_ * Set dependabot to check for github-actions updates weekly. * [org.openrewrite.github.GitHubActionsBestPractices](/recipes/github/githubactionsbestpractices.md) * **GitHub Actions best practices** - * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, and preferring block-style job dependencies. + * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, preferring block-style job dependencies, and upgrading official actions to their latest versions. * [org.openrewrite.github.MigrateSetupUvV6ToV7](/recipes/github/migratesetupuvv6tov7.md) * **Migrate `astral-sh/setup-uv` from v6 to v7** * Migrates `astral-sh/setup-uv` from v6 to v7. Updates the action version and removes the deprecated `server-url` input. See the [v7.0.0 release notes](https://github.com/astral-sh/setup-uv/releases/tag/v7.0.0) for breaking changes. @@ -2451,6 +2454,9 @@ _14 recipes_ * [org.openrewrite.github.SetupNodeUpgradeNodeVersion](/recipes/github/setupnodeupgradenodeversion.md) * **Upgrade `actions/setup-node` `node-version`** * Update the Node.js version used by `actions/setup-node` if it is below the expected version number. +* [org.openrewrite.github.UpgradeOfficialGitHubActions](/recipes/github/upgradeofficialgithubactions.md) + * **Upgrade official GitHub Actions to their latest versions** + * Upgrades actions from the official `actions` and `github` organizations to the newest known version, working entirely offline. Each reference is upgraded while preserving its existing precision: a major version (`v4`) moves to the newest major, a full version (`v4.1.2`) to the newest full version, and a commit SHA to the latest known commit. Actions that are not official, not known, or already up to date are left untouched. * [org.openrewrite.github.gradle.RenameGradleBuildActionToSetupGradle](/recipes/github/gradle/renamegradlebuildactiontosetupgradle.md) * **Rename `gradle/gradle-build-action` to `gradle/actions/setup-gradle`** * Rename the deprecated `gradle/gradle-build-action` to `gradle/actions/setup-gradle@v6`. @@ -3540,11 +3546,14 @@ _11 recipes_ ## java25 -_7 recipes_ +_9 recipes_ * [org.openrewrite.java.migrate.AccessController](/recipes/java/migrate/accesscontroller.md) * **Remove Security AccessController** * The Security Manager API is unsupported in Java 24. This recipe will remove the usage of `java.security.AccessController`. +* [org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24](/recipes/java/migrate/commentkotlinmodulescappedatjava24.md) + * **Comment Kotlin modules capped at Java 24** + * Adds an explanatory comment to Kotlin modules that remain at Java 24 after the Java 25 migration, because Kotlin before 2.3 cannot target Java 25 bytecode. This covers both a Kotlin 1.x cap (which cannot be upgraded automatically) and a Kotlin 2.0-2.2 module whose upgrade to 2.3 could not be applied. Scoped to modules that actually compile Kotlin (i.e. contain `.kt` source files); the comment is self-healing, so a module that does reach Java 25 has it removed. * [org.openrewrite.java.migrate.JavaBestPractices](/recipes/java/migrate/javabestpractices.md) * **Java best practices** * Applies opinionated best practices for Java projects targeting Java 25. This recipe includes the full Java 25 upgrade chain plus additional improvements to code style, API usage, and third-party dependency reduction that go beyond what the version migration recipes apply. @@ -3557,6 +3566,9 @@ _7 recipes_ * [org.openrewrite.java.migrate.SystemGetSecurityManagerToNull](/recipes/java/migrate/systemgetsecuritymanagertonull.md) * **Replace `System.getSecurityManager()` with `null`** * The Security Manager API is unsupported in Java 24. This recipe will replace `System.getSecurityManager()` with `null` to make its behavior more obvious and try to simplify execution paths afterwards. +* [org.openrewrite.java.migrate.UpgradeKotlinForJava25](/recipes/java/migrate/upgradekotlinforjava25.md) + * **Upgrade Kotlin to 2.3 for Java 25 compatibility** + * Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3. * [org.openrewrite.java.migrate.UpgradePluginsForJava25](/recipes/java/migrate/upgradepluginsforjava25.md) * **Upgrade plugins to Java 25 compatible versions** * Updates plugins and dependencies to versions compatible with Java 25. @@ -4252,6 +4264,17 @@ _5 recipes_ * **Replace Spring Kafka with Quarkus Messaging Kafka** * Migrates `spring-kafka` to `quarkus-messaging-kafka` when reactor dependencies are present. +## kotlin + +_2 recipes_ + +* [org.openrewrite.java.migrate.CommentKotlinModulesCappedAtJava24](/recipes/java/migrate/commentkotlinmodulescappedatjava24.md) + * **Comment Kotlin modules capped at Java 24** + * Adds an explanatory comment to Kotlin modules that remain at Java 24 after the Java 25 migration, because Kotlin before 2.3 cannot target Java 25 bytecode. This covers both a Kotlin 1.x cap (which cannot be upgraded automatically) and a Kotlin 2.0-2.2 module whose upgrade to 2.3 could not be applied. Scoped to modules that actually compile Kotlin (i.e. contain `.kt` source files); the comment is self-healing, so a module that does reach Java 25 has it removed. +* [org.openrewrite.java.migrate.UpgradeKotlinForJava25](/recipes/java/migrate/upgradekotlinforjava25.md) + * **Upgrade Kotlin to 2.3 for Java 25 compatibility** + * Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3. + ## lang _1 recipe_ @@ -5898,7 +5921,7 @@ _1 recipe_ ## RSPEC -_215 recipes_ +_225 recipes_ * [org.openrewrite.cobol.cleanup.RemoveWithDebuggingMode](/recipes/cobol/cleanup/removewithdebuggingmode.md) * **Remove with debugging mode** @@ -5984,6 +6007,18 @@ _215 recipes_ * **Remove `@RequestMapping` annotations** * Replace method declaration `@RequestMapping` annotations with `@GetMapping`, `@PostMapping`, etc. when possible. * Tags: RSPEC-S4488 +* [org.openrewrite.java.testing.assertj.DecomposeConjunctionAssertion](/recipes/java/testing/assertj/decomposeconjunctionassertion.md) + * **Decompose `assertThat` on conjunctions into separate assertions** + * Split `assertThat(a && b).isTrue()` into separate `assertThat(a).isTrue()` and `assertThat(b).isTrue()` statements, so each condition is asserted (and reported) on its own. This lets the dedicated assertion recipes simplify each conjunct, and `CollapseConsecutiveAssertThatStatements` fuse them back into a single chain when the actual is a plain expression. Only the direct `assertThat(...).isTrue()` form is decomposed; `isFalse()` is left alone, as negating a conjunction is not equivalent to negating each conjunct. + * Tags: RSPEC-S5838 +* [org.openrewrite.java.testing.assertj.SimplifyAssertJInstanceOfAssertion](/recipes/java/testing/assertj/simplifyassertjinstanceofassertion.md) + * **Simplify AssertJ assertions on `instanceof` expressions** + * Replace `assertThat(x instanceof Type).isTrue()` with the dedicated `assertThat(x).isInstanceOf(Type.class)`, and the negated and `isFalse()` variants with `isNotInstanceOf`, so failures describe the actual type rather than just `expected true but was false`. + * Tags: RSPEC-S5838 +* [org.openrewrite.java.testing.assertj.SimplifyAssertJNullRelatedAssertion](/recipes/java/testing/assertj/simplifyassertjnullrelatedassertion.md) + * **Simplify AssertJ assertions on `null` reference comparisons** + * Replace `assertThat(x == null).isTrue()` and its variants with the dedicated `assertThat(x).isNull()` / `assertThat(x).isNotNull()`. Beyond being more expressive, this avoids the compilation error that results when the `null` literal ends up as the `assertThat` argument (e.g. `assertThat(null == x).isTrue()` becoming `assertThat(null).isSameAs(x)`). + * Tags: RSPEC-S5838 * [org.openrewrite.java.testing.assertj.SimplifyChainedAssertJAssertion](/recipes/java/testing/assertj/simplifychainedassertjassertion.md) * **Simplify AssertJ chained assertions** * Many AssertJ chained assertions have dedicated assertions that function the same. It is best to use the dedicated assertions. @@ -6036,6 +6071,10 @@ _215 recipes_ * **Add `serialVersionUID` to a `Serializable` class when missing** * A `serialVersionUID` field is strongly recommended in all `Serializable` classes. If this is not defined on a `Serializable` class, the compiler will generate this value. If a change is later made to the class, the generated value will change and attempts to deserialize the class will fail. Explicitly declaring this field gives you control over binary compatibility across versions. * Tags: RSPEC-S2057 +* [org.openrewrite.staticanalysis.AllBranchesIdentical](/recipes/staticanalysis/allbranchesidentical.md) + * **All branches in a conditional should not have the same implementation** + * When every branch of an `if`/`else` chain executes the same code, the condition serves no purpose and the code block can be used directly. + * Tags: RSPEC-S3923 * [org.openrewrite.staticanalysis.AtomicPrimitiveEqualsUsesGet](/recipes/staticanalysis/atomicprimitiveequalsusesget.md) * **Atomic Boolean, Integer, and Long equality checks compare their values** * `AtomicBoolean#equals(Object)`, `AtomicInteger#equals(Object)` and `AtomicLong#equals(Object)` are only equal to their instance. This recipe converts `a.equals(b)` to `a.get() == b.get()`. These atomic classes do not override `equals` from `Object`, so calling it compares object identity rather than the wrapped value, which is almost never the intended behavior. @@ -6068,6 +6107,10 @@ _215 recipes_ * **Chain `StringBuilder.append()` calls** * String concatenation within calls to `StringBuilder.append()` causes unnecessary memory allocation. Except for concatenations of String literals, which are joined together at compile time. Replaces inefficient concatenations with chained calls to `StringBuilder.append()`. Using `+` inside `append()` defeats the purpose of the `StringBuilder`, since the concatenation creates a temporary `String` before appending. * Tags: RSPEC-S3024 +* [org.openrewrite.staticanalysis.CollapsibleIfStatements](/recipes/staticanalysis/collapsibleifstatements.md) + * **Mergeable "if" statements should be combined** + * When an `if` statement body contains only another `if` with no `else`, the two conditions can be combined with `&&`. Merging the conditions reduces nesting and makes the code easier to read. + * Tags: RSPEC-S1066 * [org.openrewrite.staticanalysis.CollectionToArrayShouldHaveProperType](/recipes/staticanalysis/collectiontoarrayshouldhavepropertype.md) * **'Collection.toArray()' should be passed an array of the proper type** * Using `Collection.toArray()` without parameters returns an `Object[]`, which requires casting. It is more efficient and clearer to use `Collection.toArray(new T[0])` instead. The parameterless form can cause a `ClassCastException` at runtime when the returned `Object[]` is cast to a more specific array type. @@ -6184,6 +6227,10 @@ _215 recipes_ * **Members should not have names differing only by capitalization** * Looking at the set of methods and fields in a class and all of its parents, no two members should have names that differ only in capitalization. This rule will not report if a method overrides a parent method. Members with near-identical names are easily confused, leading to bugs where the wrong field or method is referenced. * Tags: RSPEC-S1845 +* [org.openrewrite.staticanalysis.MergeIdenticalBranches](/recipes/staticanalysis/mergeidenticalbranches.md) + * **Branches with identical implementations should be merged** + * When two consecutive branches of an `if`/`else if` chain execute the same code, they can be merged by combining their conditions with `||`. This removes duplication and makes the intent clearer. + * Tags: RSPEC-S1871 * [org.openrewrite.staticanalysis.MethodNameCasing](/recipes/staticanalysis/methodnamecasing.md) * **Standardize method name casing** * Fixes method names that do not follow standard naming conventions. For example, `String getFoo_bar()` would be adjusted to `String getFooBar()` and `int DoSomething()` would be adjusted to `int doSomething()`. Following a consistent casing convention for method names improves code readability and helps developers quickly distinguish methods from classes or constants. @@ -6272,6 +6319,10 @@ _215 recipes_ * **Remove garbage collection invocations** * Removes calls to `System.gc()` and `Runtime.gc()`. When to invoke garbage collection is best left to the JVM. Manual GC calls produce unpredictable results across different JVM implementations and can cause unnecessary application pauses. * Tags: RSPEC-S1215 +* [org.openrewrite.staticanalysis.RemoveDuplicateConditions](/recipes/staticanalysis/removeduplicateconditions.md) + * **Related "if/else if" conditions should not be the same** + * When an `if`/`else if` chain contains the same condition more than once, the second branch can never execute because the first matching branch always wins. The duplicate branch is dead code and should be removed. + * Tags: RSPEC-S1862 * [org.openrewrite.staticanalysis.RemoveExtraSemicolons](/recipes/staticanalysis/removeextrasemicolons.md) * **Remove extra semicolons** * Removes not needed semicolons. Semicolons are considered not needed: * Optional semicolons at the end of try-with-resources, * after the last enum value if no field or method is defined, * no statement between two semicolon. Stray semicolons are typically typos or remnants of refactoring and can mislead readers into thinking a statement is present. @@ -6292,6 +6343,10 @@ _215 recipes_ * **Remove redundant casts** * Removes unnecessary type casts. Does not currently check casts in lambdas and class constructors. Redundant casts add visual noise and can obscure the actual type relationships in the code, making it harder to follow the data flow. * Tags: RSPEC-S1905 +* [org.openrewrite.staticanalysis.RemoveSelfAssignment](/recipes/staticanalysis/removeselfassignment.md) + * **Variables should not be self-assigned** + * Self-assignments such as `x = x` have no effect and indicate a copy-paste error or typo where the left-hand or right-hand side should reference a different variable. + * Tags: RSPEC-S1656 * [org.openrewrite.staticanalysis.RemoveSystemOutPrintln](/recipes/staticanalysis/removesystemoutprintln.md) * **Remove `System.out#println` statements** * Print statements are often left accidentally after debugging an issue. This recipe removes all `System.out#println` and `System.err#println` statements from the code. Production code should use a proper logging framework which provides consistent formatting, configurable log levels, and centralized output control. @@ -6300,6 +6355,10 @@ _215 recipes_ * **Remove `toString()` calls on arrays** * The result from `toString()` calls on arrays is largely useless. The output does not actually reflect the contents of the array. `Arrays.toString(array)` should be used instead as it gives the contents of the array. Since arrays do not override `toString()` from `Object`, calling it produces only the type name and memory address, which is rarely what was intended. * Tags: RSPEC-S2116 +* [org.openrewrite.staticanalysis.RemoveUnconditionalValueOverwrite](/recipes/staticanalysis/removeunconditionalvalueoverwrite.md) + * **Map values should not be replaced unconditionally** + * When `map.put(key, value)` is called twice in a row with the same key, the first call is dead code because its value is immediately overwritten. Remove the first call to make the intent clear. + * Tags: RSPEC-S4143 * [org.openrewrite.staticanalysis.RemoveUnneededBlock](/recipes/staticanalysis/removeunneededblock.md) * **Remove unneeded block** * Flatten blocks into inline statements when possible. Unnecessary nested blocks add indentation and scope boundaries that obscure the control flow, often indicating code that should be extracted into its own method. @@ -6388,6 +6447,10 @@ _215 recipes_ * **Simplify constant if branch execution** * Checks for if expressions that are always `true` or `false` and simplifies them. Branches that can never execute are dead code that misleads readers and may mask logic errors introduced during refactoring. * Tags: RSPEC-S6646 +* [org.openrewrite.staticanalysis.SimplifyRedundantLogicalExpression](/recipes/staticanalysis/simplifyredundantlogicalexpression.md) + * **Identical expressions used with logical operators should be simplified** + * When the same expression appears on both sides of `&&`, `||`, `&`, or `|`, the result is always equal to that expression. For example, `x && x` is always just `x`. This is typically a copy-paste error where one side should have been different. + * Tags: RSPEC-S1764 * [org.openrewrite.staticanalysis.SimplifyTernaryRecipes](/recipes/staticanalysis/simplifyternaryrecipes.md) * **Simplify ternary expressions** * Simplifies various types of ternary expressions to improve code readability. Ternaries that simply select between `true` and `false` are redundant wrappers around the condition itself and add unnecessary complexity. diff --git a/docs/reference/recipes-with-data-tables.md b/docs/reference/recipes-with-data-tables.md index 6ab0699a25..c83ee8ad3d 100644 --- a/docs/reference/recipes-with-data-tables.md +++ b/docs/reference/recipes-with-data-tables.md @@ -4218,6 +4218,15 @@ _This doc contains all of the recipes with **unique** data tables that have been * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* +#### [org.openrewrite.java.migrate.UpgradeKotlinForJava25](/recipes/java/migrate/upgradekotlinforjava25.md) + * **Upgrade Kotlin to 2.3 for Java 25 compatibility** + * Only Kotlin 2.3 and later can target Java 25 bytecode, so modules on an older Kotlin are otherwise capped at Java 24. This recipe upgrades modules that compile Kotlin (i.e. contain `.kt` source files) and are already on Kotlin 2.0, 2.1, or 2.2 up to the latest Kotlin 2.3, so they can subsequently be migrated to Java 25. Modules on Kotlin 1.x are left untouched, as crossing the K2 compiler default introduced in Kotlin 2.0 is a source-breaking change that should not be applied automatically. As a safety net the module is also floored at Java 24: if the Kotlin upgrade cannot be applied (for instance because the version is managed externally by a parent or BOM), the module still lands on Java 24 rather than being left behind, and is raised the rest of the way to Java 25 only once it actually reaches Kotlin 2.3. + +##### Data tables: + + * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* + + #### [org.openrewrite.java.migrate.UpgradePluginsForJava11](/recipes/java/migrate/upgradepluginsforjava11.md) * **Upgrade plugins to Java 11 compatible versions** * Updates plugins to version compatible with Java 11. @@ -4353,6 +4362,15 @@ _This doc contains all of the recipes with **unique** data tables that have been * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* +#### [org.openrewrite.java.migrate.jakarta.JavaxEjbToJakartaEjb](/recipes/java/migrate/jakarta/javaxejbtojakartaejb.md) + * **Migrate deprecated `javax.ejb` packages to `jakarta.ejb`** + * Java EE has been rebranded to Jakarta EE, necessitating a package relocation. + +##### Data tables: + + * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* + + #### [org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta](/recipes/java/migrate/jakarta/javaxmigrationtojakarta.md) * **Migrate to Jakarta EE 9** * Jakarta EE 9 is the first version of Jakarta EE that uses the new `jakarta` namespace. @@ -4380,6 +4398,24 @@ _This doc contains all of the recipes with **unique** data tables that have been * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* +#### [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta11](/recipes/java/migrate/jakarta/migratepluginsforjakarta11.md) + * **Update Plugins for Jakarta EE 11** + * Update plugins to be compatible with Jakarta EE 11. + +##### Data tables: + + * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* + + +#### [org.openrewrite.java.migrate.jakarta.MigratePluginsForJakarta9](/recipes/java/migrate/jakarta/migratepluginsforjakarta9.md) + * **Update Plugins for Jakarta EE 9** + * Update plugins to be compatible with Jakarta EE 9. + +##### Data tables: + + * **org.openrewrite.maven.table.MavenMetadataFailures**: *Attempts to resolve maven metadata that failed.* + + #### [org.openrewrite.java.migrate.javax.AddJaxbAPIDependencies](/recipes/java/migrate/javax/addjaxbapidependencies.md) * **Add explicit JAXB API dependencies** * This recipe will add explicit API dependencies for Jakarta EE 8 when a Java 8 application is using JAXB. Any existing dependencies will be upgraded to the latest version of Jakarta EE 8. The artifacts are moved to Jakarta EE 8 version 2.x which allows for the continued use of the `javax.xml.bind` namespace. Running a full javax to Jakarta migration using `org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta` will update to versions greater than 3.x which necessitates the package change as well. diff --git a/docs/reference/scanning-recipes.md b/docs/reference/scanning-recipes.md index 85a4432d6e..729bc0ed14 100644 --- a/docs/reference/scanning-recipes.md +++ b/docs/reference/scanning-recipes.md @@ -267,6 +267,9 @@ _This doc contains all [scanning recipes](/concepts-and-explanations/recipes#sca ### rewrite-github-actions +* [org.openrewrite.github.UpgradeOfficialGitHubActions](/recipes/github/upgradeofficialgithubactions.md) + * **Upgrade official GitHub Actions to their latest versions** + * Upgrades actions from the official `actions` and `github` organizations to the newest known version, working entirely offline. Each reference is upgraded while preserving its existing precision: a major version (`v4`) moves to the newest major, a full version (`v4.1.2`) to the newest full version, and a commit SHA to the latest known commit. Actions that are not official, not known, or already up to date are left untouched. * [org.openrewrite.github.security.PinGitHubActionsToSha](/recipes/github/security/pingithubactionstosha.md) * **Pin GitHub Actions to commit SHAs** * Replaces mutable tag or branch references in GitHub Actions `uses:` declarations with immutable commit SHAs. A static mapping of well-known actions is checked first; if the action is not found, the GitHub API is used to resolve the reference at recipe run time. By default only third-party actions are pinned; set `pinOfficialActions` to include actions from the `actions` and `github` organizations. To pin only a specific allow-list of actions, set `includedActions`. diff --git a/docs/reference/standalone-recipes.md b/docs/reference/standalone-recipes.md index d509081a49..9ad63e4dac 100644 --- a/docs/reference/standalone-recipes.md +++ b/docs/reference/standalone-recipes.md @@ -6,7 +6,7 @@ description: An autogenerated list of recipes that are not included in any compo _This doc contains recipes that are not included as part of any larger composite recipe. These recipes can be run independently and are not bundled with other recipes._ -Total standalone recipes: 964 +Total standalone recipes: 973 ## org.openrewrite @@ -2153,6 +2153,9 @@ Total standalone recipes: 964 * [org.openrewrite.featureflags.launchdarkly.ChangeVariationDefault](/recipes/featureflags/launchdarkly/changevariationdefault.md) * **Change the default value for feature key** * Change the default value for `Variation` invocations for feature key. +* [org.openrewrite.featureflags.launchdarkly.MigrateLaunchDarklyToOpenFeature](/recipes/featureflags/launchdarkly/migratelaunchdarklytoopenfeature.md) + * **Migrate from LaunchDarkly to OpenFeature** + * Migrate call sites from the LaunchDarkly server SDK to the vendor-neutral [OpenFeature](https://openfeature.dev/) API, backed by the LaunchDarkly OpenFeature provider. Flag evaluations are renamed and their arguments reordered (LaunchDarkly takes the context as the second argument; OpenFeature takes it last), `LDContext` construction becomes `MutableContext`, and `LDClient` becomes `dev.openfeature.sdk.Client`. The one-time provider bootstrap (`OpenFeatureAPI.setProviderAndWait(...)`) is intentionally left for manual configuration. * [org.openrewrite.featureflags.launchdarkly.RemoveBoolVariation](/recipes/featureflags/launchdarkly/removeboolvariation.md) * **Remove LaunchDarkly's `boolVariation` for feature key** * Replace `boolVariation` invocations for feature key with value, and simplify constant if branch execution. @@ -2230,7 +2233,7 @@ Total standalone recipes: 964 * Help identify and inventory your GitHub secrets that are being used in GitHub actions. * [org.openrewrite.github.GitHubActionsBestPractices](/recipes/github/githubactionsbestpractices.md) * **GitHub Actions best practices** - * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, and preferring block-style job dependencies. + * Applies best practices to GitHub Actions workflows, including enabling dependency caching, using cached distributions, finding missing timeouts, removing unused inputs, preferring block-style job dependencies, and upgrading official actions to their latest versions. * [org.openrewrite.github.IsGitHubActionsWorkflow](/recipes/github/isgithubactionsworkflow.md) * **Is GitHub Actions Workflow** * Checks if the file is a GitHub Actions workflow file. @@ -2336,9 +2339,6 @@ Total standalone recipes: 964 ### rewrite-jackson -* [org.openrewrite.java.jackson.CodehausToFasterXML](/recipes/java/jackson/codehaustofasterxml.md) - * **Migrate from Jackson Codehaus (legacy) to Jackson FasterXML** - * In Jackson 2, the package and dependency coordinates moved from Codehaus to FasterXML. * [org.openrewrite.java.jackson.JacksonBestPractices](/recipes/java/jackson/jacksonbestpractices.md) * **Jackson best practices** * Apply best practices for using Jackson library, including upgrade to Jackson 2.x and removing redundant annotations. @@ -2509,7 +2509,7 @@ Total standalone recipes: 964 * Adds a maven jar plugin that's configured to suppress Illegal Reflection Warnings. * [org.openrewrite.java.migrate.AddSurefireFailsafeArgLine](/recipes/java/migrate/addsurefirefailsafeargline.md) * **Add `argLine` to surefire and failsafe plugins** - * Adds the specified arguments to the `argLine` configuration of the Maven Surefire and Failsafe plugins, merging with any existing argLine value without duplicating arguments. + * Adds the specified arguments to the `argLine` configuration of the Maven Surefire and Failsafe plugins, merging with any existing argLine value without duplicating arguments. The `@\{argLine\}` [late property reference](https://maven.apache.org/surefire/maven-surefire-plugin/faq.html) is prepended so that an agent injected by another plugin during the build, such as the JaCoCo coverage agent from `jacoco-maven-plugin:prepare-agent`, is preserved rather than overwritten. It is not added when the existing `argLine` already references the `argLine` property. * [org.openrewrite.java.migrate.ComIntelliJAnnotationsToOrgJetbrainsAnnotations](/recipes/java/migrate/comintellijannotationstoorgjetbrainsannotations.md) * **Migrate com.intellij:annotations to org.jetbrains:annotations** * This recipe will upgrade old dependency of com.intellij:annotations to the newer org.jetbrains:annotations. @@ -2762,12 +2762,18 @@ Total standalone recipes: 964 * [org.openrewrite.staticanalysis.AddSerialVersionUidToSerializable](/recipes/staticanalysis/addserialversionuidtoserializable.md) * **Add `serialVersionUID` to a `Serializable` class when missing** * A `serialVersionUID` field is strongly recommended in all `Serializable` classes. If this is not defined on a `Serializable` class, the compiler will generate this value. If a change is later made to the class, the generated value will change and attempts to deserialize the class will fail. Explicitly declaring this field gives you control over binary compatibility across versions. +* [org.openrewrite.staticanalysis.AllBranchesIdentical](/recipes/staticanalysis/allbranchesidentical.md) + * **All branches in a conditional should not have the same implementation** + * When every branch of an `if`/`else` chain executes the same code, the condition serves no purpose and the code block can be used directly. * [org.openrewrite.staticanalysis.AvoidBoxedBooleanExpressions](/recipes/staticanalysis/avoidboxedbooleanexpressions.md) * **Avoid boxed boolean expressions** * Under certain conditions the `java.lang.Boolean` type is used as an expression, and it may throw a `NullPointerException` if the value is null. Using `Boolean.TRUE.equals(...)` guards against unboxing a `null` reference in control flow positions like `if` conditions and ternary operators. * [org.openrewrite.staticanalysis.CodeCleanup](/recipes/staticanalysis/codecleanup.md) * **Code cleanup** * Automatically cleanup code, e.g. remove unnecessary parentheses, simplify expressions. +* [org.openrewrite.staticanalysis.CollapsibleIfStatements](/recipes/staticanalysis/collapsibleifstatements.md) + * **Mergeable "if" statements should be combined** + * When an `if` statement body contains only another `if` with no `else`, the two conditions can be combined with `&&`. Merging the conditions reduces nesting and makes the code easier to read. * [org.openrewrite.staticanalysis.CommonDeclarationSiteTypeVariances](/recipes/staticanalysis/commondeclarationsitetypevariances.md) * **Properly use declaration-site type variance for well-known types** * When using a method parameter like `Function<IN, OUT>`, it should rather be `Function<? super IN, ? extends OUT>`. This recipe checks for method parameters of well-known types. @@ -2810,6 +2816,9 @@ Total standalone recipes: 964 * [org.openrewrite.staticanalysis.MemberNameCaseInsensitiveDuplicates](/recipes/staticanalysis/membernamecaseinsensitiveduplicates.md) * **Members should not have names differing only by capitalization** * Looking at the set of methods and fields in a class and all of its parents, no two members should have names that differ only in capitalization. This rule will not report if a method overrides a parent method. Members with near-identical names are easily confused, leading to bugs where the wrong field or method is referenced. +* [org.openrewrite.staticanalysis.MergeIdenticalBranches](/recipes/staticanalysis/mergeidenticalbranches.md) + * **Branches with identical implementations should be merged** + * When two consecutive branches of an `if`/`else if` chain execute the same code, they can be merged by combining their conditions with `||`. This removes duplication and makes the intent clearer. * [org.openrewrite.staticanalysis.MoveConditionsToWhile](/recipes/staticanalysis/moveconditionstowhile.md) * **Convert `while (true)` with initial `if` break to loop condition** * Simplifies `while (true)` loops where the first statement is an `if` statement that only contains a `break`. The condition is inverted and moved to the loop condition for better readability. @@ -2828,6 +2837,9 @@ Total standalone recipes: 964 * [org.openrewrite.staticanalysis.ReferentialEqualityToObjectEquals](/recipes/staticanalysis/referentialequalitytoobjectequals.md) * **Replace referential equality operators with Object equals method invocations when the operands both override `Object.equals(Object obj)`** * Using `==` or `!=` compares object references, not the equality of two objects. This modifies code where both sides of a binary operation (`==` or `!=`) override `Object.equals(Object obj)` except when the comparison is within an overridden `Object.equals(Object obj)` method declaration itself. The resulting transformation must be carefully reviewed since any modifications change the program's semantics. When a class defines its own notion of equality through `equals`, using reference comparison is almost always a bug that causes logically identical objects to be treated as different. +* [org.openrewrite.staticanalysis.RemoveDuplicateConditions](/recipes/staticanalysis/removeduplicateconditions.md) + * **Related "if/else if" conditions should not be the same** + * When an `if`/`else if` chain contains the same condition more than once, the second branch can never execute because the first matching branch always wins. The duplicate branch is dead code and should be removed. * [org.openrewrite.staticanalysis.RemoveEmptyJavaDocParameters](/recipes/staticanalysis/removeemptyjavadocparameters.md) * **Remove JavaDoc `@param`, `@return`, and `@throws` with no description** * Removes `@param`, `@return`, and `@throws` with no description from JavaDocs. @@ -2837,12 +2849,21 @@ Total standalone recipes: 964 * [org.openrewrite.staticanalysis.RemoveJavaDocAuthorTag](/recipes/staticanalysis/removejavadocauthortag.md) * **Remove author tags from JavaDocs** * Removes author tags from JavaDocs to reduce code maintenance. +* [org.openrewrite.staticanalysis.RemoveSelfAssignment](/recipes/staticanalysis/removeselfassignment.md) + * **Variables should not be self-assigned** + * Self-assignments such as `x = x` have no effect and indicate a copy-paste error or typo where the left-hand or right-hand side should reference a different variable. +* [org.openrewrite.staticanalysis.RemoveUnconditionalValueOverwrite](/recipes/staticanalysis/removeunconditionalvalueoverwrite.md) + * **Map values should not be replaced unconditionally** + * When `map.put(key, value)` is called twice in a row with the same key, the first call is dead code because its value is immediately overwritten. Remove the first call to make the intent clear. * [org.openrewrite.staticanalysis.RemoveUnneededAssertion](/recipes/staticanalysis/removeunneededassertion.md) * **Remove unneeded assertions** * Remove unneeded assertions like `assert true`, `assertTrue(true)`, or `assertFalse(false)`. * [org.openrewrite.staticanalysis.RemoveUnneededBlock](/recipes/staticanalysis/removeunneededblock.md) * **Remove unneeded block** * Flatten blocks into inline statements when possible. Unnecessary nested blocks add indentation and scope boundaries that obscure the control flow, often indicating code that should be extracted into its own method. +* [org.openrewrite.staticanalysis.RemoveUnreachableMultiCatchAlternative](/recipes/staticanalysis/removeunreachablemulticatchalternative.md) + * **Remove unreachable `catch` alternatives shadowed by earlier `catch` clauses** + * When an earlier `catch` clause already covers a type, any later `catch` (including a multi-catch alternative) for the same type or a subtype is unreachable and is a Java compile error. This commonly appears after type-substitution migrations (for example, renaming an exception so that two `catch` clauses end up overlapping). This recipe drops the unreachable alternatives from later multi-catches, collapses a multi-catch to a regular `catch` when only one alternative remains, and removes the entire `catch` clause when all of its declared types are already covered. * [org.openrewrite.staticanalysis.RenameExceptionInEmptyCatch](/recipes/staticanalysis/renameexceptioninemptycatch.md) * **Rename caught exceptions in empty catch blocks to `ignored`** * Renames caught exceptions in empty catch blocks to `ignored`. `ignored` will be incremented by 1 if a namespace conflict exists. @@ -2894,6 +2915,9 @@ Total standalone recipes: 964 * [org.openrewrite.staticanalysis.SimplifyForLoopBoundaryComparison](/recipes/staticanalysis/simplifyforloopboundarycomparison.md) * **Simplify for loop boundary comparisons** * Replace `<=` with `<` in for loop conditions by adjusting the comparison operands. For example, `i <= n - 1` simplifies to `i < n`, and `i <= n` becomes `i < n + 1`. +* [org.openrewrite.staticanalysis.SimplifyRedundantLogicalExpression](/recipes/staticanalysis/simplifyredundantlogicalexpression.md) + * **Identical expressions used with logical operators should be simplified** + * When the same expression appears on both sides of `&&`, `||`, `&`, or `|`, the result is always equal to that expression. For example, `x && x` is always just `x`. This is typically a copy-paste error where one side should have been different. * [org.openrewrite.staticanalysis.SimplifyTernaryRecipes](/recipes/staticanalysis/simplifyternaryrecipes.md) * **Simplify ternary expressions** * Simplifies various types of ternary expressions to improve code readability. Ternaries that simply select between `true` and `false` are redundant wrappers around the condition itself and add unnecessary complexity. @@ -2921,6 +2945,9 @@ Total standalone recipes: 964 * [org.openrewrite.staticanalysis.UseLambdaForFunctionalInterface](/recipes/staticanalysis/uselambdaforfunctionalinterface.md) * **Use lambda expressions instead of anonymous classes** * Instead of anonymous class declarations, use a lambda where possible. Using lambdas to replace anonymous classes can lead to more expressive and maintainable code, improve code readability, reduce code duplication, and achieve better performance in some cases. +* [org.openrewrite.staticanalysis.UseStringCaseInsensitiveOrderRecipes](/recipes/staticanalysis/usestringcaseinsensitiveorderrecipes.md) + * **Use `String.CASE_INSENSITIVE_ORDER`** + * Replaces case-insensitive string comparator lambdas and method references with the JDK constant `String.CASE_INSENSITIVE_ORDER`. Improves readability and removes one closure allocation per call site. * [org.openrewrite.staticanalysis.maven.MavenJavadocNonAsciiRecipe](/recipes/staticanalysis/maven/mavenjavadocnonasciirecipe.md) * **Remove non-ASCII characters from Javadoc** * Maven's javadoc-plugin configuration does not support non-ASCII characters. What makes it tricky is the error is very ambiguous and doesn't help in any way. This recipe removes those non-ASCII characters. diff --git a/sidebars.ts b/sidebars.ts index 5010af90b6..1581743132 100644 --- a/sidebars.ts +++ b/sidebars.ts @@ -193,6 +193,7 @@ const sidebars: SidebarsConfig = { keywords: ['changelog'], }, items: [ + 'changelog/8-86-0-Release', 'changelog/8-85-0-Release', 'changelog/8-83-0-Release', 'changelog/8-81-0-Release', diff --git a/src/plugins/latest-versions.js b/src/plugins/latest-versions.js index 1a878ba274..b1607f229c 100644 --- a/src/plugins/latest-versions.js +++ b/src/plugins/latest-versions.js @@ -1,93 +1,91 @@ const latestVersions = { - "{{VERSION_REWRITE_RECIPE_BOM}}": "3.33.0", - "{{VERSION_REWRITE_GRADLE_PLUGIN}}": "7.35.0", - "{{VERSION_REWRITE_MAVEN_PLUGIN}}": "6.42.0", - "{{VERSION_IO_MODERNE_RECIPE_RECIPES_KOTLIN}}": "0.1.2", - "{{VERSION_IO_MODERNE_RECIPE_RECIPES_SCALA}}": "0.2.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_AI}}": "0.4.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_ANGULAR}}": "1.4.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_CRYPTOGRAPHY}}": "0.14.3", + "{{VERSION_REWRITE_RECIPE_BOM}}": "3.34.0", + "{{VERSION_REWRITE_GRADLE_PLUGIN}}": "7.36.0", + "{{VERSION_REWRITE_MAVEN_PLUGIN}}": "6.43.0", + "{{VERSION_IO_MODERNE_RECIPE_RECIPES_KOTLIN}}": "0.1.3", + "{{VERSION_IO_MODERNE_RECIPE_RECIPES_SCALA}}": "0.2.2", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_AI}}": "0.4.2", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_ANGULAR}}": "1.5.0", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_CRYPTOGRAPHY}}": "0.14.8", "{{VERSION_IO_MODERNE_RECIPE_REWRITE_CVE_2026_22732}}": "0.3.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_DEVCENTER}}": "1.26.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_DROPWIZARD}}": "0.5.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_ELASTIC}}": "0.7.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_HIBERNATE}}": "0.25.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_JASPERREPORTS}}": "0.6.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_JAVA_APPLICATION_SERVER}}": "0.7.3", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_KAFKA}}": "0.7.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_NULLABILITY}}": "0.1.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_PRETHINK}}": "0.7.3", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_PROGRAM_ANALYSIS}}": "0.13.2", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_REACT}}": "0.3.2", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_RELEASE_METROMAP}}": "0.4.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_SPRING}}": "0.35.0", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_TAPESTRY}}": "0.4.1", - "{{VERSION_IO_MODERNE_RECIPE_REWRITE_VULNCHECK}}": "0.7.2", - "{{VERSION_ORG_OPENREWRITE_REWRITE_COBOL}}": "2.19.0", - "{{VERSION_ORG_OPENREWRITE_REWRITE_CORE}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_CSHARP}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_DOCKER}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_GO}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_GRADLE}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_GROOVY}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_HCL}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_JAVA}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_JAVASCRIPT}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_JSON}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_KOTLIN}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_MAVEN}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_POLYGLOT}}": "2.10.9", - "{{VERSION_ORG_OPENREWRITE_REWRITE_PROPERTIES}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_PROTOBUF}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_PYTHON}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_TEMPLATING}}": "1.41.9", - "{{VERSION_ORG_OPENREWRITE_REWRITE_TOML}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_XML}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_REWRITE_YAML}}": "8.85.7", - "{{VERSION_ORG_OPENREWRITE_META_REWRITE_ANALYSIS}}": "2.35.0", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_DEVCENTER}}": "1.27.2", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_DROPWIZARD}}": "0.5.3", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_ELASTIC}}": "0.8.0", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_HIBERNATE}}": "0.26.1", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_JASPERREPORTS}}": "0.6.2", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_JAVA_APPLICATION_SERVER}}": "0.7.7", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_KAFKA}}": "0.7.2", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_NULLABILITY}}": "0.2.1", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_PRETHINK}}": "0.8.1", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_PROGRAM_ANALYSIS}}": "0.13.4", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_REACT}}": "0.3.3", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_RELEASE_METROMAP}}": "0.4.1", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_SPRING}}": "0.37.0", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_TAPESTRY}}": "0.4.2", + "{{VERSION_IO_MODERNE_RECIPE_REWRITE_VULNCHECK}}": "0.7.4", + "{{VERSION_ORG_OPENREWRITE_REWRITE_COBOL}}": "2.20.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_CORE}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_CSHARP}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_DOCKER}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_GO}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_GRADLE}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_GROOVY}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_HCL}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_JAVA}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_JAVASCRIPT}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_JSON}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_KOTLIN}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_MAVEN}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_PROPERTIES}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_PROTOBUF}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_PYTHON}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_TOML}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_XML}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_REWRITE_YAML}}": "8.86.0", + "{{VERSION_ORG_OPENREWRITE_META_REWRITE_ANALYSIS}}": "2.36.0", "{{VERSION_ORG_OPENREWRITE_RECIPE_RECIPES_GO}}": "0.4.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ALL}}": "1.26.2", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ANDROID}}": "0.18.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_APACHE}}": "2.27.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CIRCLECI}}": "3.12.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS}}": "0.26.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS_NG}}": "0.21.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_COMPILED_ANALYSIS}}": "0.14.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CONCOURSE}}": "3.11.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CUCUMBER_JVM}}": "2.12.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_DOTNET}}": "0.16.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_FEATURE_FLAGS}}": "1.21.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITHUB_ACTIONS}}": "3.25.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITLAB}}": "0.23.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_HIBERNATE}}": "2.22.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JACKSON}}": "1.25.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_DEPENDENCIES}}": "1.56.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_SECURITY}}": "3.33.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JENKINS}}": "0.36.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JODA}}": "0.9.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_KUBERNETES}}": "3.17.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LIBERTY}}": "1.24.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LOGGING_FRAMEWORKS}}": "3.29.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICROMETER}}": "0.29.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICRONAUT}}": "2.34.2", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_JAVA}}": "3.38.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_KOTLIN}}": "0.6.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_PYTHON}}": "0.9.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NETTY}}": "0.10.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NODEJS}}": "0.46.2", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OKHTTP}}": "0.23.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OPENAPI}}": "0.32.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_PRETHINK}}": "1.0.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_QUARKUS}}": "2.33.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REACTIVE_STREAMS}}": "0.20.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REWRITE}}": "0.26.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING}}": "6.33.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING_TO_QUARKUS}}": "0.10.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SQL}}": "2.12.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STATIC_ANALYSIS}}": "2.37.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STRUTS}}": "0.26.1", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TERRAFORM}}": "3.14.3", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TESTING_FRAMEWORKS}}": "3.40.0", - "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_THIRD_PARTY}}": "0.41.4", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ALL}}": "1.27.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_ANDROID}}": "0.18.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_APACHE}}": "2.27.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CIRCLECI}}": "3.12.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS}}": "0.27.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CODEMODS_NG}}": "0.21.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_COMPILED_ANALYSIS}}": "0.14.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CONCOURSE}}": "3.11.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_CUCUMBER_JVM}}": "2.12.3", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_DOTNET}}": "0.17.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_FEATURE_FLAGS}}": "1.22.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITHUB_ACTIONS}}": "3.26.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_GITLAB}}": "0.23.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_HIBERNATE}}": "2.23.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JACKSON}}": "1.26.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_DEPENDENCIES}}": "1.57.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JAVA_SECURITY}}": "3.34.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JENKINS}}": "0.36.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_JODA}}": "0.9.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_KUBERNETES}}": "3.17.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LIBERTY}}": "1.24.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_LOGGING_FRAMEWORKS}}": "3.29.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICROMETER}}": "0.29.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MICRONAUT}}": "2.34.3", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_JAVA}}": "3.39.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_KOTLIN}}": "0.6.1", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_MIGRATE_PYTHON}}": "0.9.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NETTY}}": "0.10.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_NODEJS}}": "0.47.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OKHTTP}}": "0.23.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_OPENAPI}}": "0.32.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_PRETHINK}}": "1.0.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_QUARKUS}}": "2.33.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REACTIVE_STREAMS}}": "0.20.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_REWRITE}}": "0.27.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING}}": "6.34.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SPRING_TO_QUARKUS}}": "0.10.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_SQL}}": "2.12.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STATIC_ANALYSIS}}": "2.38.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_STRUTS}}": "0.26.2", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TERRAFORM}}": "3.14.4", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_TESTING_FRAMEWORKS}}": "3.41.0", + "{{VERSION_ORG_OPENREWRITE_RECIPE_REWRITE_THIRD_PARTY}}": "0.42.0", }; export default latestVersions;