rewrite-migrate-java icon indicating copy to clipboard operation
rewrite-migrate-java copied to clipboard

`@PostConstruct` import being removed from beans

Open melloware opened this issue 1 year ago β€’ 9 comments

What version of OpenRewrite are you using?

Latest

How are you running OpenRewrite?

CLI using mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.jakarta.JakartaEE10

CDI Spec: https://jakarta.ee/specifications/cdi/2.0/cdi-spec-2.0.pdf

Before conversion:

package org.primefaces.showcase.view.overlay;

import org.primefaces.showcase.domain.Movie;

import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.primefaces.event.SelectEvent;

@Named
@RequestScoped
public class MovieView {

    private Movie movie;

    private List<Movie> movieList;

    public List<Movie> getMovieList() {
        return movieList;
    }

    @PostConstruct
    public void init() {
        movieList = new ArrayList<Movie>();

        movieList.add(new Movie("The Lord of the Rings: The Two Towers", "Peter Jackson", "Fantasy, Epic", 179));
        movieList.add(new Movie("The Amazing Spider-Man 2", "Marc Webb", "Action", 142));
        movieList.add(new Movie("Iron Man 3", "Shane Black", "Action", 109));
        movieList.add(new Movie("Thor: The Dark World", "Alan Taylor", "Action, Fantasy", 112));
        movieList.add(new Movie("Avatar", "James Cameron", "Science Fiction", 160));
        movieList.add(new Movie("The Lord of the Rings: The Fellowship of the Ring", "Peter Jackson", "Fantasy, Epic", 165));
        movieList.add(new Movie("Divergent", "Neil Burger", "Action", 140));
        movieList.add(new Movie("The Hobbit: The Desolation of Smaug", "Peter Jackson", "Fantasy", 161));
        movieList.add(new Movie("Rio 2", "Carlos Saldanha", "Comedy", 101));
        movieList.add(new Movie("Captain America: The Winter Soldier", "Joe Russo", "Action", 136));
        movieList.add(new Movie("Fast Five", "Justin Lin", "Action", 132));
        movieList.add(new Movie("The Lord of the Rings: The Return of the King", "Peter Jackson", "Fantasy, Epic", 200));

    }

    public Movie getMovie() {
        return movie;
    }

    public void setMovie(Movie movie) {
        this.movie = movie;
    }

    public void onRowSelect(SelectEvent<Movie> event) {
        FacesMessage msg = new FacesMessage("Movie Selected", event.getObject().getMovie());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

After Conversion:

package org.primefaces.showcase.view.overlay;

import org.primefaces.showcase.domain.Movie;

import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
import java.util.ArrayList;
import java.util.List;

import jakarta.faces.application.FacesMessage;
import jakarta.faces.context.FacesContext;

import org.primefaces.event.SelectEvent;

@Named
@RequestScoped
public class MovieView {

    private Movie movie;

    private List<Movie> movieList;

    public List<Movie> getMovieList() {
        return movieList;
    }

    @PostConstruct
    public void init() {
        movieList = new ArrayList<Movie>();

        movieList.add(new Movie("The Lord of the Rings: The Two Towers", "Peter Jackson", "Fantasy, Epic", 179));
        movieList.add(new Movie("The Amazing Spider-Man 2", "Marc Webb", "Action", 142));
        movieList.add(new Movie("Iron Man 3", "Shane Black", "Action", 109));
        movieList.add(new Movie("Thor: The Dark World", "Alan Taylor", "Action, Fantasy", 112));
        movieList.add(new Movie("Avatar", "James Cameron", "Science Fiction", 160));
        movieList.add(new Movie("The Lord of the Rings: The Fellowship of the Ring", "Peter Jackson", "Fantasy, Epic", 165));
        movieList.add(new Movie("Divergent", "Neil Burger", "Action", 140));
        movieList.add(new Movie("The Hobbit: The Desolation of Smaug", "Peter Jackson", "Fantasy", 161));
        movieList.add(new Movie("Rio 2", "Carlos Saldanha", "Comedy", 101));
        movieList.add(new Movie("Captain America: The Winter Soldier", "Joe Russo", "Action", 136));
        movieList.add(new Movie("Fast Five", "Justin Lin", "Action", 132));
        movieList.add(new Movie("The Lord of the Rings: The Return of the King", "Peter Jackson", "Fantasy, Epic", 200));

    }

    public Movie getMovie() {
        return movie;
    }

    public void setMovie(Movie movie) {
        this.movie = movie;
    }

    public void onRowSelect(SelectEvent<Movie> event) {
        FacesMessage msg = new FacesMessage("Movie Selected", event.getObject().getMovie());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

ERROR

Instead of converting import javax.annotation.PostConstruct; it just removed the import entirely.

melloware avatar Apr 17 '24 15:04 melloware

Thanks for the report @melloware & welcome back! @cjobinabo Does this ring familiar to you or your team? Did we miss a test case to handle this properly?

timtebeek avatar Apr 17 '24 16:04 timtebeek

Nice to be back! I am lurking always checking on your progress :)

melloware avatar Apr 17 '24 16:04 melloware

I am looking through PR's and I can't see anything in particular that would have changed this? This was definitely not broken a couple of months ago when I did all my JakartaEE10 testing so it must have changed more recently?

melloware avatar Apr 18 '24 11:04 melloware

Interesting in my log i see that it ran the correct recipes:

RNING] Changes have been made to primefaces-showcase\src\main\java\org\primefaces\showcase\view\overlay\MovieView.java by:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxAnnotationMigrationToJakartaAnnotation
[WARNING]                 org.openrewrite.java.ChangeType: {oldFullyQualifiedTypeName=javax.annotation.PostConstruct, newFullyQualifiedTypeName=jakarta.annotation.PostConstruct}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.enterprise, newPackageName=jakarta.enterprise, recursive=true}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxFacesToJakartaFaces
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.faces, newPackageName=jakarta.faces, recursive=true}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.inject, newPackageName=jakarta.inject, recursive=true}

But it definitely dopped the import.

The code I am running against is here: https://github.com/primefaces/primefaces/tree/master/primefaces-showcase

melloware avatar Apr 20 '24 12:04 melloware

although interesting its a ChangeType instead of a ChangePackage?

melloware avatar Apr 20 '24 12:04 melloware

@melloware I have tried replicating your issue, for me PostConstruct import is not deleted

diff --git a/devworkspace/oss/openrewrite-app/src/main/java/com/learnopenrewrite/app/Demo.java b/devworkspace/oss/openrewrite-app/src/main/java/com/learnopenrewrite/app/Demo.java
index 9c2ec3c..ef57d3e 100644
--- a/devworkspace/oss/openrewrite-app/src/main/java/com/learnopenrewrite/app/Demo.java
+++ b/devworkspace/oss/openrewrite-app/src/main/java/com/learnopenrewrite/app/Demo.java
@@ -1,6 +1,6 @@ org.openrewrite.config.CompositeRecipe
 package com.learnopenrewrite.app;
 
-import javax.annotation.PostConstruct;
+import jakarta.annotation.PostConstruct;
 
 public class Demo {

However, when I ran your code, am able to replicate that PostConstruct import statement got deleted.

Keep you posted.

Thanks, Mahi

bsmahi avatar Apr 22 '24 15:04 bsmahi

Thanks @bsmahi i agree when I write a small test case it works but on that large project it is happening. Thanks for replicating!

melloware avatar Apr 22 '24 15:04 melloware

We did a new release Wednesday which also includes these recent changes

  • https://github.com/openrewrite/rewrite-migrate-java/pull/444
  • https://github.com/openrewrite/rewrite-migrate-java/pull/456

Would you mind checking if this still affects you using these versions?

  • https://github.com/openrewrite/rewrite-migrate-java/releases/tag/v2.12.0
  • https://github.com/openrewrite/rewrite-recipe-bom/releases/tag/v2.10.0

It's odd that this has started happening. We hadn't added an explicit unit test for this one as it's just a few lines of yaml https://github.com/openrewrite/rewrite-migrate-java/blob/6920ea6943c672aea6a7ffa0d7e1316c2208b05b/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml#L116-L118

timtebeek avatar Apr 26 '24 10:04 timtebeek

Confirmed this is still happening with latest release. It works in a small isolated test case but not in a large project like PrimeFaces Showcase its still stripping the import

melloware avatar Apr 26 '24 12:04 melloware

Any news with regards to this one? It affects our EE10 migration as well...

The weird thing about it is that indeed the "ChangeType" recipe is so simple that it should "just work", and the big frightening question is: Why does it still do so only in a simple test case, but not in real world scenarios?

I fear that the underlying issue is not just about javax.annotation.PostConstruct, but could also apply "arbitrary" other cases where org.openrewrite.java.ChangeType has been used (and they silently fail to replace or even remove lines)!? 😒

@timtebeek , many thanks for an update on the current status...

AndreasALoew avatar Aug 07 '24 09:08 AndreasALoew

No news unfortunately, although we'd definitely like to see this fixed, especially if there's a suspected underlying issue with a core recipe. Would you be able to provide us with an ideally minimal reproducer? As unit tests for now appear not to cover this just yet.

timtebeek avatar Aug 07 '24 09:08 timtebeek

I am not positive but I have a feeling that two different rules are somehow applying here in the EE10 migration causing this. I will try and study it further but it is very strange.

melloware avatar Aug 07 '24 11:08 melloware

I submitted a PR and all tests are passing but I can't figure out with Gradle how do I do the equivalent of mvn clean install to test the SNAPSHOT locally.. Man. I hate gradle.

melloware avatar Aug 07 '24 12:08 melloware

Would you be able to provide us with an ideally minimal reproducer?

Which was exactly the main culprit here. With any sufficiently stripped-down test case, it works fine, and in the full complex scenario, it fails...

But thanks a million to @melloware πŸ‘ - I think you chose a very valid approach, and as I was testing myself to move from ChangeType to ChangePackage with good results, I am more than confident that this type of resolution will work - 🀞

Are you already able to tell us which official release version will contain this fix?

many thx for the super-fast response time! Highly appreciated! πŸ˜„ πŸ‘

AndreasALoew avatar Aug 07 '24 14:08 AndreasALoew

@AndreasALoew i know once @timtebeek approves the team is good about doing releases every week or two weeks

I think this fix works as well!

melloware avatar Aug 07 '24 14:08 melloware

@melloware , after looking into your PR, great catch to notice that you have to revert the renaming for "javax.annotation.processing"... πŸ‘ πŸ‘ πŸ‘ πŸ˜‰

Just out of curiosity: How did you notice - I myself would have overlooked this from what I can see in our code base...

AndreasALoew avatar Aug 07 '24 14:08 AndreasALoew

@timtebeek noticed in commit history of why it was done like this in the first place. I would not have noticed!

melloware avatar Aug 07 '24 14:08 melloware

Thanks all! Our latest snapshot versions should contain this fix; would appreciate a quick check if the problem is indeed resolved, but for now we'll assume this is fixed.

timtebeek avatar Aug 07 '24 15:08 timtebeek

Yes, I can confirm that the latest snapshot fixes the issue for "my"/our fully complex scenarioπŸ‘

Thanks again! πŸ˜„

AndreasALoew avatar Aug 08 '24 09:08 AndreasALoew

I am glad we got to the bottom of this!

melloware avatar Aug 08 '24 10:08 melloware