import java.util.HashMap;
import java.util.Map;
public class Main {
public static final class ApplicationContext {
public ApplicationContext
(final String app,
final String ctx
) { this.app = app;
this.ctx = ctx;
}
@Override
return "ApplicationContext[" + app + "/" + ctx + "]";
}
}
private static ApplicationContext ac
(final String app,
final String ctx
) { return new ApplicationContext(app, ctx);
}
private static ApplicationContext getApplicationContext
(final String url,
final Map
<String, ApplicationContext
> urlMap
) { ApplicationContext result = null;
while (specificUrl != null && result == null) {
result = urlMap.get(specificUrl);
specificUrl = shortenUrl(specificUrl);
}
return result;
}
final Map
<String, ApplicationContext
> urlMap
= new HashMap
<String, ApplicationContext
>(); urlMap.put("/application1", ac("Application1", "Root"));
urlMap.put("/application1/subcontext1", ac("Application1", "SubContext1"));
urlMap.put("/application1/subcontext2", ac("Application1", "SubContext2"));
urlMap.put("/application1/subcontext2/subcontext3", ac("Application1", "SubContext3"));
urlMap.put("/application2", ac("Application2", null));
System.
out.
println(getApplicationContext
("/application1/", urlMap
)); System.
out.
println(getApplicationContext
("/application1/abc", urlMap
)); System.
out.
println(getApplicationContext
("/application1/subcontext2/abc", urlMap
)); }
final int index = url.lastIndexOf('/');
if (index > 0) {
return url.substring(0, index);
}
else {
return null;
}
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLk1hcDsKCnB1YmxpYyBjbGFzcyBNYWluIHsKICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXBwbGljYXRpb25Db250ZXh0IHsKICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcHA7CiAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY3R4OwoKICAgICAgICBwdWJsaWMgQXBwbGljYXRpb25Db250ZXh0KGZpbmFsIFN0cmluZyBhcHAsIGZpbmFsIFN0cmluZyBjdHgpIHsKICAgICAgICAgICAgdGhpcy5hcHAgPSBhcHA7CiAgICAgICAgICAgIHRoaXMuY3R4ID0gY3R4OwogICAgICAgIH0KCiAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICJBcHBsaWNhdGlvbkNvbnRleHRbIiArIGFwcCArICIvIiArIGN0eCArICJdIjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGFjKGZpbmFsIFN0cmluZyBhcHAsIGZpbmFsIFN0cmluZyBjdHgpIHsKICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uQ29udGV4dChhcHAsIGN0eCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGdldEFwcGxpY2F0aW9uQ29udGV4dChmaW5hbCBTdHJpbmcgdXJsLAogICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBBcHBsaWNhdGlvbkNvbnRleHQ+IHVybE1hcCkgewogICAgICAgIFN0cmluZyBzcGVjaWZpY1VybCA9IHVybDsKICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHQgcmVzdWx0ID0gbnVsbDsKICAgICAgICB3aGlsZSAoc3BlY2lmaWNVcmwgIT0gbnVsbCAmJiByZXN1bHQgPT0gbnVsbCkgewogICAgICAgICAgICByZXN1bHQgPSB1cmxNYXAuZ2V0KHNwZWNpZmljVXJsKTsKICAgICAgICAgICAgc3BlY2lmaWNVcmwgPSBzaG9ydGVuVXJsKHNwZWNpZmljVXJsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQXBwbGljYXRpb25Db250ZXh0PiB1cmxNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFwcGxpY2F0aW9uQ29udGV4dD4oKTsKICAgICAgICB1cmxNYXAucHV0KCIvYXBwbGljYXRpb24xIiwgYWMoIkFwcGxpY2F0aW9uMSIsICJSb290IikpOwogICAgICAgIHVybE1hcC5wdXQoIi9hcHBsaWNhdGlvbjEvc3ViY29udGV4dDEiLCBhYygiQXBwbGljYXRpb24xIiwgIlN1YkNvbnRleHQxIikpOwogICAgICAgIHVybE1hcC5wdXQoIi9hcHBsaWNhdGlvbjEvc3ViY29udGV4dDIiLCBhYygiQXBwbGljYXRpb24xIiwgIlN1YkNvbnRleHQyIikpOwogICAgICAgIHVybE1hcC5wdXQoIi9hcHBsaWNhdGlvbjEvc3ViY29udGV4dDIvc3ViY29udGV4dDMiLCBhYygiQXBwbGljYXRpb24xIiwgIlN1YkNvbnRleHQzIikpOwogICAgICAgIHVybE1hcC5wdXQoIi9hcHBsaWNhdGlvbjIiLCBhYygiQXBwbGljYXRpb24yIiwgbnVsbCkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZ2V0QXBwbGljYXRpb25Db250ZXh0KCIvYXBwbGljYXRpb24xLyIsIHVybE1hcCkpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihnZXRBcHBsaWNhdGlvbkNvbnRleHQoIi9hcHBsaWNhdGlvbjEvYWJjIiwgdXJsTWFwKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGdldEFwcGxpY2F0aW9uQ29udGV4dCgiL2FwcGxpY2F0aW9uMS9zdWJjb250ZXh0Mi9hYmMiLCB1cmxNYXApKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2hvcnRlblVybChmaW5hbCBTdHJpbmcgdXJsKSB7CiAgICAgICAgZmluYWwgaW50IGluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9Cn0K