ocpsoft / prettytime

Social Style Date and Time Formatting for Java
http://ocpsoft.org/prettytime/
Apache License 2.0
1.3k stars 253 forks source link

Jakarta JSF integration #261

Open dstutz opened 1 year ago

dstutz commented 1 year ago

Is there any chance of publishing a version of the JSF integration built against the jakarta version the JSF API?

lincolnthree commented 1 year ago

Hey @dstutz thanks for the issue. Short answer, yes, but I don't have a ton of time at the moment. I would welcome a PR for this, which would make it much easier to put out a new version quickly. In the mean time it's fairly simple to create a converter:

You can use this as a guide, then register it using @FacesConverter or via faces-config.xml: https://github.com/ocpsoft/prettytime/blob/master/jsf/src/main/java/org/ocpsoft/prettytime/jsf/PrettyTimeConverter.java https://github.com/ocpsoft/prettytime/blob/master/jsf/src/main/resources/META-INF/faces-config.xml

Let me know if this helps?

dstutz commented 1 year ago

Yup, that is almost effortless to do on my own.

As far as a PR, again, doesn't seem like much work so I cloned the repo and I get test failures on core module (internationalization tests) attempting to build master (and 5.0.7.Final). I tried on 2 different machines:

Windows 10 - openjdk version "17.0.7" 2023-04-18 OpenJDK Runtime Environment Temurin-17.0.7+7 (build 17.0.7+7) OpenJDK 64-Bit Server VM Temurin-17.0.7+7 (build 17.0.7+7, mixed mode, sharing) Tests run: 1116, Failures: 121, Errors: 0, Skipped: 6

Gentoo Linux - openjdk version "17.0.6" 2023-01-17 OpenJDK Runtime Environment Temurin-17.0.6+10 (build 17.0.6+10) OpenJDK 64-Bit Server VM Temurin-17.0.6+10 (build 17.0.6+10, mixed mode, sharing) Tests run: 1116, Failures: 154, Errors: 0, Skipped: 6

I'm assuming I'm missing something here...

lincolnthree commented 1 year ago

Sorry for the delay. Summer stuff... That's weird. Send the PR and I'll check it out. I think JDK 8 compilation works. But something changed in 11+ that makes some of the micro-time stamps higher precision and we haven't accounted for that (the outputs of the lib are still accurate). But tests freak out.

csyperski commented 10 months ago

Has a Jakarta version been released? Everything I'm seeing still references Javax.faces.context.*

lincolnthree commented 10 months ago

Haven't gotten the PR on this yet, but would love to get this done! If someone wants to get it started and switch over all the imports. I'll try to take it over the finish line.

dstutz commented 4 months ago

@lincolnthree I'm taking another look at this and while I'm still having some strange build errors, I'm just working past it at the moment.

So far it looks like need to add

<dependency>
  <groupId>jakarta.faces</groupId>
  <artifactId>jakarta.faces-api</artifactId>
  <version>3.0.0</version>
  <scope>provided</scope>
</dependency>

to the prettytime-parent pom managed dep

then change the imports from

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

to

import jakarta.faces.component.UIComponent;
import jakarta.faces.context.FacesContext;
import jakarta.faces.convert.Converter;
import jakarta.faces.convert.ConverterException;

for the PrettyTimeConverter.

As far as packaging...I'm not sure how to go about this. Do you want another module and name this one something different like prettytime-integration-jsf-jakarta? Can use the same package/class name so the block should work exactly the same. Do you want a different package/class name? Personally I'd love to be able to just add a classifier to the dep and have it pull in the other jar but I'm not sure how to structure that (haven't really looked into it yet).

Thoughts?

dstutz commented 4 months ago

Might have found a much easier way of going about this ripping off some ideas from other projects in this arena. Can make a jakarta classifier version of the jar where it transforms the javax.faces -> jakarta.faces. Just need to test it out.

dstutz commented 4 months ago

Ok...appears to work? I had to add the block to faces-config and use the <f:converter converterId="org.ocpsoft.PrettyTimeConverter"/> style...but it works in a Jakarta EE 10 app.

So essentially all you need to do is add the following to the prettytime-integration-jsf module:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.6.0</version>
                <executions>
                    <execution>
                        <id>jakarta</id>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <minimizeJar>false</minimizeJar>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <shadedClassifierName>jakarta</shadedClassifierName>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <artifactSet>
                                <includes>
                                    <include>${project.groupId}:${project.artifactId}</include>
                                </includes>
                            </artifactSet>
                            <relocations>
                                <relocation>
                                    <pattern>javax.faces</pattern>
                                    <shadedPattern>jakarta.faces</shadedPattern>
                                </relocation>
                            </relocations>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Now we just need to support more than Date in this guy....