Re: RFR: 8258117: jar tool sets the time stamp of module-info.class entries to the current time [v5]

2021-11-22 Thread Jaikiran Pai
On Mon, 22 Nov 2021 09:09:37 GMT, Jaikiran Pai  wrote:

>> test/jdk/tools/jar/modularJar/JarToolModuleDescriptorReproducibilityTest.java
>>  line 60:
>> 
>>> 58: private static final String UPDATED_MODULE_VERSION = "1.2.4";
>>> 59: private static final String MAIN_CLASS = "jdk.test.foo.Foo";
>>> 60: private static final Path MODULE_CLASSES_DIR = 
>>> Paths.get("8258117-module-classes", MODULE_NAME).toAbsolutePath();
>> 
>> You can use Path.of here.
>
> Done. Replaced this and one other place in this test to use `Path.of`.

Test continues to pass with all these new changes.

-

PR: https://git.openjdk.java.net/jdk/pull/5486


Re: RFR: 8258117: jar tool sets the time stamp of module-info.class entries to the current time [v5]

2021-11-22 Thread Jaikiran Pai
On Mon, 22 Nov 2021 08:25:38 GMT, Alan Bateman  wrote:

>> Jaikiran Pai has updated the pull request with a new target base due to a 
>> merge or a rebase. The incremental webrev excludes the unrelated changes 
>> brought in by the merge/rebase. The pull request contains seven additional 
>> commits since the last revision:
>> 
>>  - Merge latest from master branch
>>  - use testng asserts
>>  - Remove "final" usage from test
>>  - convert test to testng
>>  - Merge latest from master branch
>>  - Merge latest from master branch
>>  - 8258117: jar tool sets the time stamp of module-info.class entries to the 
>> current time
>
> src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 806:
> 
>> 804: Long lastModified = f.lastModified() == 0 ? null : 
>> f.lastModified();
>> 805: moduleInfos.putIfAbsent(name,
>> 806: new StreamedModuleInfoEntry(name, 
>> Files.readAllBytes(f.toPath()), lastModified));
> 
> I'd prefer to see this split into two two statements as there is just too 
> much going on one the one line.

Done. I have updated the PR to split this line into more than 1 statement.

> src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 1785:
> 
>> 1783: private final String name;
>> 1784: private final byte[] bytes;
>> 1785: private final Long lastModifiedTime;
> 
> It might be better to use a FileTime here, otherwise we risk a NPE when 
> unboxing.

Sounds good. I've updated the PR to replace this to use `FileTime`.

> src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 2108:
> 
>> 2106: byte[] extended = extendedInfoBytes(md, bytes, packages);
>> 2107: // replace the entry value with the extended bytes
>> 2108: e.setValue(new 
>> StreamedModuleInfoEntry(e.getValue().name(), extended, 
>> e.getValue().getLastModifiedTime()));
> 
> There are 3 calls to getValue and each one I need to remember that e.getValue 
> is a ModuleInfoEntry. If you add ModuleInfo entry = e.getValue() then it 
> might help the readability.

That makes sense. The updated PR now has this change.

> test/jdk/tools/jar/modularJar/JarToolModuleDescriptorReproducibilityTest.java 
> line 60:
> 
>> 58: private static final String UPDATED_MODULE_VERSION = "1.2.4";
>> 59: private static final String MAIN_CLASS = "jdk.test.foo.Foo";
>> 60: private static final Path MODULE_CLASSES_DIR = 
>> Paths.get("8258117-module-classes", MODULE_NAME).toAbsolutePath();
> 
> You can use Path.of here.

Done. Replaced this and one other place in this test to use `Path.of`.

-

PR: https://git.openjdk.java.net/jdk/pull/5486


Re: RFR: 8258117: jar tool sets the time stamp of module-info.class entries to the current time [v5]

2021-11-22 Thread Alan Bateman
On Sat, 20 Nov 2021 01:58:54 GMT, Jaikiran Pai  wrote:

>> The commit here is a potential fix for the issue noted in 
>> https://bugs.openjdk.java.net/browse/JDK-8258117.
>> 
>> The change here repurposes an existing internal interface `ModuleInfoEntry` 
>> to keep track of the last modified timestamp of a `module-info.class` 
>> descriptor.
>> 
>> This commit uses the timestamp of the `module-info.class` on the filesystem 
>> to set the time on the `JarEntry`. There are a couple of cases to consider 
>> here:
>> 
>> 1. When creating a jar  (using `--create`), we use the source 
>> `module-info.class` from the filesystem and then add extended info to it 
>> (attributes like packages, module version etc...). In such cases, this patch 
>> will use the lastmodified timestamp from the filesystem of 
>> `module-info.class` even though we might end up updating/extending/modifying 
>> (for example by adding a module version) its content while storing it as a 
>> `JarEntry`. 
>> 
>> 2. When updating a jar (using `--update`), this patch will use the 
>> lastmodified timestamp of `module-info.class` either from the filesystem or 
>> from the source jar's entry (depending on whether a new `module-info.class` 
>> is being passed to the command). Here too, it's possible that we might end 
>> up changing/modifying/extending the `module-info.class` (for example, 
>> changing the module version to a new version) that gets written into the 
>> updated jar file, but this patch _won't_ use `System.currentTimeMillis()` 
>> even in such cases.
>> 
>> If we do have to track actual changes that might happen to 
>> `module-info.class` while extending its info (in `extendedInfoBytes()`) and 
>> then decide whether to use current system time as last modified time, then 
>> this will require a bigger change and also a discussion on what kind of 
>> extending of module-info.class content will require a change to the 
>> lastmodifiedtime of that entry.
>
> Jaikiran Pai has updated the pull request with a new target base due to a 
> merge or a rebase. The incremental webrev excludes the unrelated changes 
> brought in by the merge/rebase. The pull request contains seven additional 
> commits since the last revision:
> 
>  - Merge latest from master branch
>  - use testng asserts
>  - Remove "final" usage from test
>  - convert test to testng
>  - Merge latest from master branch
>  - Merge latest from master branch
>  - 8258117: jar tool sets the time stamp of module-info.class entries to the 
> current time

src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 806:

> 804: Long lastModified = f.lastModified() == 0 ? null : 
> f.lastModified();
> 805: moduleInfos.putIfAbsent(name,
> 806: new StreamedModuleInfoEntry(name, 
> Files.readAllBytes(f.toPath()), lastModified));

I'd prefer to see this split into two two statements as there is just too much 
going on one the one line.

src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 1785:

> 1783: private final String name;
> 1784: private final byte[] bytes;
> 1785: private final Long lastModifiedTime;

It might be better to use a FileTime here, otherwise we risk a NPE when 
unboxing.

src/jdk.jartool/share/classes/sun/tools/jar/Main.java line 2108:

> 2106: byte[] extended = extendedInfoBytes(md, bytes, packages);
> 2107: // replace the entry value with the extended bytes
> 2108: e.setValue(new StreamedModuleInfoEntry(e.getValue().name(), 
> extended, e.getValue().getLastModifiedTime()));

There are 3 calls to getValue and each one I need to remember that e.getValue 
is a ModuleInfoEntry. If you add ModuleInfo entry = e.getValue() then it might 
help the readability.

test/jdk/tools/jar/modularJar/JarToolModuleDescriptorReproducibilityTest.java 
line 60:

> 58: private static final String UPDATED_MODULE_VERSION = "1.2.4";
> 59: private static final String MAIN_CLASS = "jdk.test.foo.Foo";
> 60: private static final Path MODULE_CLASSES_DIR = 
> Paths.get("8258117-module-classes", MODULE_NAME).toAbsolutePath();

You can use Path.of here.

-

PR: https://git.openjdk.java.net/jdk/pull/5486


Re: RFR: 8258117: jar tool sets the time stamp of module-info.class entries to the current time [v5]

2021-11-19 Thread Jaikiran Pai
> The commit here is a potential fix for the issue noted in 
> https://bugs.openjdk.java.net/browse/JDK-8258117.
> 
> The change here repurposes an existing internal interface `ModuleInfoEntry` 
> to keep track of the last modified timestamp of a `module-info.class` 
> descriptor.
> 
> This commit uses the timestamp of the `module-info.class` on the filesystem 
> to set the time on the `JarEntry`. There are a couple of cases to consider 
> here:
> 
> 1. When creating a jar  (using `--create`), we use the source 
> `module-info.class` from the filesystem and then add extended info to it 
> (attributes like packages, module version etc...). In such cases, this patch 
> will use the lastmodified timestamp from the filesystem of 
> `module-info.class` even though we might end up updating/extending/modifying 
> (for example by adding a module version) its content while storing it as a 
> `JarEntry`. 
> 
> 2. When updating a jar (using `--update`), this patch will use the 
> lastmodified timestamp of `module-info.class` either from the filesystem or 
> from the source jar's entry (depending on whether a new `module-info.class` 
> is being passed to the command). Here too, it's possible that we might end up 
> changing/modifying/extending the `module-info.class` (for example, changing 
> the module version to a new version) that gets written into the updated jar 
> file, but this patch _won't_ use `System.currentTimeMillis()` even in such 
> cases.
> 
> If we do have to track actual changes that might happen to 
> `module-info.class` while extending its info (in `extendedInfoBytes()`) and 
> then decide whether to use current system time as last modified time, then 
> this will require a bigger change and also a discussion on what kind of 
> extending of module-info.class content will require a change to the 
> lastmodifiedtime of that entry.

Jaikiran Pai has updated the pull request with a new target base due to a merge 
or a rebase. The incremental webrev excludes the unrelated changes brought in 
by the merge/rebase. The pull request contains seven additional commits since 
the last revision:

 - Merge latest from master branch
 - use testng asserts
 - Remove "final" usage from test
 - convert test to testng
 - Merge latest from master branch
 - Merge latest from master branch
 - 8258117: jar tool sets the time stamp of module-info.class entries to the 
current time

-

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/5486/files
  - new: https://git.openjdk.java.net/jdk/pull/5486/files/2c0246f9..945fde6f

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk=5486=04
 - incr: https://webrevs.openjdk.java.net/?repo=jdk=5486=03-04

  Stats: 48509 lines in 1041 files changed: 34004 ins; 7147 del; 7358 mod
  Patch: https://git.openjdk.java.net/jdk/pull/5486.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/5486/head:pull/5486

PR: https://git.openjdk.java.net/jdk/pull/5486