/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
ArrayList<String> urls = new ArrayList<String>();
urls.add(null);
urls.add("");
urls.add("file:///home/user/test.html");
urls.add("file:///home/user/test.html?id=902");
urls.add("file:///home/user/test.html#footer");
urls.add("http://e...content-available-to-author-only...e.com");
urls.add("http://w...content-available-to-author-only...e.com");
urls.add("http://w...content-available-to-author-only...e.txt");
urls.add("http://e...content-available-to-author-only...e.com/");
urls.add("http://e...content-available-to-author-only...e.com/a/b/c/test.html");
urls.add("http://e...content-available-to-author-only...e.com/a/b/c/test.html?param=value");
urls.add("http://e...content-available-to-author-only...e.com/a/b/c/test.html#anchor");
urls.add("http://e...content-available-to-author-only...e.com/a/b/c/test.html#anchor?param=value");
for (String url : urls) {
System.out.println("Input: \"" + url + "\" Output: \"" + getFileNameFromURL(url) + "\"");
}
}
public static String getFileNameFromURL(String url) {
if (url == null) {
return "";
}
try {
URL resource = new URL(url);
String host = resource.getHost();
if (host.length() > 0 && url.endsWith(host)) {
// handle ...example.com
return "";
}
}
catch(MalformedURLException e) {
return "";
}
int startIndex = url.lastIndexOf('/') + 1;
int length = url.length();
// find end index for ?
int lastQMPos = url.lastIndexOf('?');
if (lastQMPos == -1) {
lastQMPos = length;
}
// find end index for #
int lastHashPos = url.lastIndexOf('#');
if (lastHashPos == -1) {
lastHashPos = length;
}
// calculate the end index
int endIndex = Math.min(lastQMPos, lastHashPos);
return url.substring(startIndex, endIndex);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLm5ldC4qOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KCXsKCQlBcnJheUxpc3Q8U3RyaW5nPiB1cmxzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CgkJdXJscy5hZGQobnVsbCk7CgkJdXJscy5hZGQoIiIpOwoJCXVybHMuYWRkKCJmaWxlOi8vL2hvbWUvdXNlci90ZXN0Lmh0bWwiKTsKCQl1cmxzLmFkZCgiZmlsZTovLy9ob21lL3VzZXIvdGVzdC5odG1sP2lkPTkwMiIpOwoJCXVybHMuYWRkKCJmaWxlOi8vL2hvbWUvdXNlci90ZXN0Lmh0bWwjZm9vdGVyIik7CgkJdXJscy5hZGQoImh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbSIpOwoJCXVybHMuYWRkKCJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20iKTsKCQl1cmxzLmFkZCgiaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUudHh0Iik7CgkJdXJscy5hZGQoImh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS8iKTsKCQl1cmxzLmFkZCgiaHR0cDovL2UuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2EvYi9jL3Rlc3QuaHRtbCIpOwoJCXVybHMuYWRkKCJodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vYS9iL2MvdGVzdC5odG1sP3BhcmFtPXZhbHVlIik7CgkJdXJscy5hZGQoImh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9hL2IvYy90ZXN0Lmh0bWwjYW5jaG9yIik7CgkJdXJscy5hZGQoImh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9hL2IvYy90ZXN0Lmh0bWwjYW5jaG9yP3BhcmFtPXZhbHVlIik7CgkJCgkJZm9yIChTdHJpbmcgdXJsIDogdXJscykgewoJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklucHV0OiBcIiIgKyB1cmwgKyAiXCIgT3V0cHV0OiBcIiIgKyBnZXRGaWxlTmFtZUZyb21VUkwodXJsKSArICJcIiIpOwoJCX0KCgl9CgkKCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lRnJvbVVSTChTdHJpbmcgdXJsKSB7CgkJaWYgKHVybCA9PSBudWxsKSB7CgkJCXJldHVybiAiIjsKCQl9CgkJdHJ5IHsKCQkJVVJMIHJlc291cmNlID0gbmV3IFVSTCh1cmwpOwoJCQlTdHJpbmcgaG9zdCA9IHJlc291cmNlLmdldEhvc3QoKTsKCQkJaWYgKGhvc3QubGVuZ3RoKCkgPiAwICYmIHVybC5lbmRzV2l0aChob3N0KSkgewoJCQkJLy8gaGFuZGxlIC4uLmV4YW1wbGUuY29tCgkJCQlyZXR1cm4gIiI7CgkJCX0KCQl9CgkJY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuICIiOwkKCQl9CgkJCgkJaW50IHN0YXJ0SW5kZXggPSB1cmwubGFzdEluZGV4T2YoJy8nKSArIDE7CgkJaW50IGxlbmd0aCA9IHVybC5sZW5ndGgoKTsKCQkKCQkvLyBmaW5kIGVuZCBpbmRleCBmb3IgPwoJCWludCBsYXN0UU1Qb3MgPSB1cmwubGFzdEluZGV4T2YoJz8nKTsKCQlpZiAobGFzdFFNUG9zID09IC0xKSB7CgkJCWxhc3RRTVBvcyA9IGxlbmd0aDsJCgkJfQoJCQoJCS8vIGZpbmQgZW5kIGluZGV4IGZvciAjCgkJaW50IGxhc3RIYXNoUG9zID0gdXJsLmxhc3RJbmRleE9mKCcjJyk7CgkJaWYgKGxhc3RIYXNoUG9zID09IC0xKSB7CgkJCWxhc3RIYXNoUG9zID0gbGVuZ3RoOwkKCQl9CgkJCgkJLy8gY2FsY3VsYXRlIHRoZSBlbmQgaW5kZXgKCQlpbnQgZW5kSW5kZXggPSBNYXRoLm1pbihsYXN0UU1Qb3MsIGxhc3RIYXNoUG9zKTsKCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7Cgl9Cn0=