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
This commit is contained in:
Andy Wilkinson 2016-10-26 11:10:38 +01:00
parent d20ac56afd
commit 6a68c8f7e0
2 changed files with 41 additions and 11 deletions

View File

@ -198,23 +198,23 @@ public class Handler extends URLStreamHandler {
@Override
protected boolean sameFile(URL u1, URL u2) {
if (!u1.getProtocol().equals("jar") || u2.getProtocol().equals("jar")) {
return super.sameFile(u1, u2);
if (!u1.getProtocol().equals("jar") || !u2.getProtocol().equals("jar")) {
return false;
}
int separator1 = u1.getFile().indexOf(SEPARATOR);
int separator2 = u1.getFile().indexOf(SEPARATOR);
if (separator1 < 0 || separator2 < 0) {
int separator2 = u2.getFile().indexOf(SEPARATOR);
if (separator1 == -1 || separator2 == -1) {
return super.sameFile(u1, u2);
}
String root1 = u1.getFile().substring(separator1 + SEPARATOR.length());
String root2 = u2.getFile().substring(separator2 + SEPARATOR.length());
if (!root1.equals(root2)) {
return super.sameFile(u1, u2);
String nested1 = u1.getFile().substring(separator1 + SEPARATOR.length());
String nested2 = u2.getFile().substring(separator2 + SEPARATOR.length());
if (!nested1.equals(nested2)) {
return false;
}
String nested1 = u1.getFile().substring(0, separator1);
String nested2 = u1.getFile().substring(0, separator2);
String root1 = u1.getFile().substring(0, separator1);
String root2 = u2.getFile().substring(0, separator2);
try {
return super.sameFile(new URL(nested1), new URL(nested2));
return super.sameFile(new URL(root1), new URL(root2));
}
catch (MalformedURLException ex) {
// Continue

View File

@ -89,6 +89,36 @@ public class HandlerTests {
.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 {
return new URL("jar", null, -1, file, this.handler);
}