Commit 6a68c8f7 authored by Andy Wilkinson's avatar Andy Wilkinson

Restore Handler logic that was changed during its merge

This commit restores the logic in Handler that was changed when
d20ac56a was merged, while leaving the structural improvements intact.

In addition to a couple of changes where a typo meant the wrong
variable was being referenced, some logic branches now return false
rather than called super. This realigns our Handler's behaviour with
that of the JDK's.

Some more tests have also been added to try to catch the problems that
were introduced during the merge.

Closes gh-7021
parent d20ac56a
...@@ -198,23 +198,23 @@ public class Handler extends URLStreamHandler { ...@@ -198,23 +198,23 @@ public class Handler extends URLStreamHandler {
@Override @Override
protected boolean sameFile(URL u1, URL u2) { protected boolean sameFile(URL u1, URL u2) {
if (!u1.getProtocol().equals("jar") || u2.getProtocol().equals("jar")) { if (!u1.getProtocol().equals("jar") || !u2.getProtocol().equals("jar")) {
return super.sameFile(u1, u2); return false;
} }
int separator1 = u1.getFile().indexOf(SEPARATOR); int separator1 = u1.getFile().indexOf(SEPARATOR);
int separator2 = u1.getFile().indexOf(SEPARATOR); int separator2 = u2.getFile().indexOf(SEPARATOR);
if (separator1 < 0 || separator2 < 0) { if (separator1 == -1 || separator2 == -1) {
return super.sameFile(u1, u2); return super.sameFile(u1, u2);
} }
String root1 = u1.getFile().substring(separator1 + SEPARATOR.length()); String nested1 = u1.getFile().substring(separator1 + SEPARATOR.length());
String root2 = u2.getFile().substring(separator2 + SEPARATOR.length()); String nested2 = u2.getFile().substring(separator2 + SEPARATOR.length());
if (!root1.equals(root2)) { if (!nested1.equals(nested2)) {
return super.sameFile(u1, u2); return false;
} }
String nested1 = u1.getFile().substring(0, separator1); String root1 = u1.getFile().substring(0, separator1);
String nested2 = u1.getFile().substring(0, separator2); String root2 = u2.getFile().substring(0, separator2);
try { try {
return super.sameFile(new URL(nested1), new URL(nested2)); return super.sameFile(new URL(root1), new URL(root2));
} }
catch (MalformedURLException ex) { catch (MalformedURLException ex) {
// Continue // Continue
......
...@@ -89,6 +89,36 @@ public class HandlerTests { ...@@ -89,6 +89,36 @@ public class HandlerTests {
.isEqualTo("jar:jar:file:/other.jar!/nested!/entry.txt"); .isEqualTo("jar:jar:file:/other.jar!/nested!/entry.txt");
} }
@Test
public void sameFileReturnsFalseForUrlsWithDifferentProtocols()
throws MalformedURLException {
assertThat(this.handler.sameFile(new URL("jar:file:foo.jar!/content.txt"),
new URL("file:/foo.jar"))).isFalse();
}
@Test
public void sameFileReturnsFalseForDifferentFileInSameJar()
throws MalformedURLException {
assertThat(this.handler.sameFile(
new URL("jar:file:foo.jar!/the/path/to/the/first/content.txt"),
new URL("jar:file:/foo.jar!/content.txt"))).isFalse();
}
@Test
public void sameFileReturnsFalseForSameFileInDifferentJars()
throws MalformedURLException {
assertThat(this.handler.sameFile(
new URL("jar:file:/the/path/to/the/first.jar!/content.txt"),
new URL("jar:file:/second.jar!/content.txt"))).isFalse();
}
@Test
public void sameFileReturnsTrueForSameFileInSameJar() throws MalformedURLException {
assertThat(this.handler.sameFile(
new URL("jar:file:/the/path/to/the/first.jar!/content.txt"),
new URL("jar:file:/the/path/to/the/first.jar!/content.txt"))).isTrue();
}
private URL createUrl(String file) throws MalformedURLException { private URL createUrl(String file) throws MalformedURLException {
return new URL("jar", null, -1, file, this.handler); return new URL("jar", null, -1, file, this.handler);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment