28
28
import java .io .IOException ;
29
29
import java .net .URL ;
30
30
import java .net .URLClassLoader ;
31
- import java .text .DateFormat ;
32
- import java .text .ParseException ;
33
- import java .text .SimpleDateFormat ;
31
+ import java .time .LocalDateTime ;
32
+ import java .time .OffsetDateTime ;
33
+ import java .time .ZoneOffset ;
34
+ import java .time .format .DateTimeParseException ;
35
+ import java .time .temporal .ChronoUnit ;
34
36
import java .util .ArrayList ;
35
37
import java .util .List ;
36
38
import java .util .jar .JarEntry ;
@@ -49,7 +51,6 @@ public class ServiceDescriptorGenerator
49
51
extends AbstractMojo
50
52
{
51
53
private static final String LS = System .lineSeparator ();
52
- private static final DateFormat OUTPUT_DATE_FORMAT = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ssXXX" );
53
54
54
55
@ Parameter (defaultValue = "io.trino.spi.Plugin" )
55
56
private String pluginClassName ;
@@ -100,18 +101,12 @@ public void execute()
100
101
101
102
Class <?> pluginClass = pluginClasses .get (0 );
102
103
byte [] servicesFileData = (pluginClass .getName () + "\n " ).getBytes (UTF_8 );
103
-
104
104
try (FileOutputStream out = new FileOutputStream (servicesJar );
105
105
JarOutputStream jar = new JarOutputStream (out )) {
106
106
107
107
JarEntry jarEntry = new JarEntry ("META-INF/services/" + pluginClassName );
108
108
if (outputTimestamp != null && !outputTimestamp .isBlank ()) {
109
- try {
110
- jarEntry .setTime (OUTPUT_DATE_FORMAT .parse (outputTimestamp ).getTime ());
111
- }
112
- catch (ParseException e ) {
113
- throw new RuntimeException ("Could not parse outputTimestamp: " + outputTimestamp , e );
114
- }
109
+ jarEntry .setTimeLocal (parseOutputTimestamp (outputTimestamp ));
115
110
}
116
111
117
112
jar .putNextEntry (jarEntry );
@@ -168,6 +163,19 @@ private static void mkdirs(File file)
168
163
}
169
164
}
170
165
166
+ private static LocalDateTime parseOutputTimestamp (String outputTimestamp )
167
+ {
168
+ try {
169
+ return OffsetDateTime .parse (outputTimestamp )
170
+ .withOffsetSameInstant (ZoneOffset .UTC )
171
+ .truncatedTo (ChronoUnit .SECONDS )
172
+ .toLocalDateTime ();
173
+ }
174
+ catch (DateTimeParseException e ) {
175
+ throw new IllegalArgumentException ("Invalid project.build.outputTimestamp value '" + outputTimestamp + "'" , e );
176
+ }
177
+ }
178
+
171
179
private static boolean isImplementation (Class <?> clazz , Class <?> pluginClass )
172
180
{
173
181
return pluginClass .isAssignableFrom (clazz ) && !isAbstract (clazz .getModifiers ()) && !isInterface (clazz .getModifiers ());
0 commit comments