LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkMi5zZXJ2bGV0OwoKaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CmltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VHJ1ZTsKCmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKCmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZDIuQ29uc3RhbnRzOwppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQyLkZpbGVJdGVtOwppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQyLkZpbGVVcGxvYWRUZXN0OwppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQyLk1vY2tIdHRwU2VydmxldFJlcXVlc3Q7CmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZDIuZGlzay5EaXNrRmlsZUl0ZW1GYWN0b3J5OwppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQyLnNlcnZsZXQuU2VydmxldEZpbGVVcGxvYWQ7CmltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsKCi8qKgogKiBUZXN0IGZvciB7QGxpbmsgU2VydmxldEZpbGVVcGxvYWR9LgogKgogKiBAc2VlIEZpbGVVcGxvYWRUZXN0CiAqIEBzaW5jZSAxLjQKICovCnB1YmxpYyBjbGFzcyBTZXJ2bGV0RmlsZVVwbG9hZFRlc3QgewoKICAgIC8qKgogICAgICogVGVzdCBjYXNlIGZvciA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0ZJTEVVUExPQUQtMjEwIj4KICAgICAqLwogICAgQFRlc3QKICAgIHB1YmxpYyB2b2lkIHBhcnNlUGFyYW1ldGVyTWFwKCkKICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgU3RyaW5nIHRleHQgPSAiLS0tLS0xMjM0XHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpbGVcIjsgZmlsZW5hbWU9XCJmb28udGFiXCJcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3doYXRldmVyXHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgIlxyXG4iICsKICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlXG4iICsKICAgICAgICAgICAgICAgICAgICAgICJcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0xMjM0XHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImZpZWxkXCJcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgImZpZWxkVmFsdWVcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAiLS0tLS0xMjM0XHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIm11bHRpXCJcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgInZhbHVlMVxyXG4iICsKICAgICAgICAgICAgICAgICAgICAgICItLS0tLTEyMzRcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwibXVsdGlcIlxyXG4iICsKICAgICAgICAgICAgICAgICAgICAgICJcclxuIiArCiAgICAgICAgICAgICAgICAgICAgICAidmFsdWUyXHJcbiIgKwogICAgICAgICAgICAgICAgICAgICAgIi0tLS0tMTIzNC0tXHJcbiI7CiAgICAgICAgYnl0ZVtdIGJ5dGVzID0gdGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKTsKICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KGJ5dGVzLCBDb25zdGFudHMuQ09OVEVOVF9UWVBFKTsKCiAgICAgICAgU2VydmxldEZpbGVVcGxvYWQgdXBsb2FkID0gbmV3IFNlcnZsZXRGaWxlVXBsb2FkKG5ldyBEaXNrRmlsZUl0ZW1GYWN0b3J5KCkpOwogICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8RmlsZUl0ZW0+PiBtYXBwZWRQYXJhbWV0ZXJzID0gdXBsb2FkLnBhcnNlUGFyYW1ldGVyTWFwKHJlcXVlc3QpOwogICAgICAgIGFzc2VydFRydWUobWFwcGVkUGFyYW1ldGVycy5jb250YWluc0tleSgiZmlsZSIpKTsKICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwcGVkUGFyYW1ldGVycy5nZXQoImZpbGUiKS5zaXplKCkpOwoKICAgICAgICBhc3NlcnRUcnVlKG1hcHBlZFBhcmFtZXRlcnMuY29udGFpbnNLZXkoImZpZWxkIikpOwogICAgICAgIGFzc2VydEVxdWFscygxLCBtYXBwZWRQYXJhbWV0ZXJzLmdldCgiZmllbGQiKS5zaXplKCkpOwoKICAgICAgICBhc3NlcnRUcnVlKG1hcHBlZFBhcmFtZXRlcnMuY29udGFpbnNLZXkoIm11bHRpIikpOwogICAgICAgIGFzc2VydEVxdWFscygyLCBtYXBwZWRQYXJhbWV0ZXJzLmdldCgibXVsdGkiKS5zaXplKCkpOwogICAgfQoKCiAgICBAVGVzdAogICAgcHVibGljIHZvaWQgcGFyc2VJbXBsaWVkVXRmOCgpCgkgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgLy8gdXRmOCBlbmNvZGVkIGZvcm0tZGF0YSB3aXRob3V0IGV4cGxpY2l0IGNvbnRlbnQtdHlwZSBlbmNvZGluZwogICAgICAgIFN0cmluZyB0ZXh0ID0gIi0tLS0tMTIzNFxyXG4iICsKICAgICAgICAgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJ1dGY4SHRtbFwiXHJcbiIgKwogICAgICAgICAgICAgICAgIlxyXG4iICsKICAgICAgICAgICAgICAgICJUaO1zIO1zIHRoZSBjb/F0ZfF0IG9mIHRoZSBm7WxlXG4iICsKICAgICAgICAgICAgICAgICJcclxuIiArCiAgICAgICAgICAgICAgICAiLS0tLS0xMjM0LS1cclxuIjsKCiAgICAgICAgYnl0ZVtdIGJ5dGVzID0gdGV4dC5nZXRCeXRlcygiVVRGLTgiKTsKICAgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBNb2NrSHR0cFNlcnZsZXRSZXF1ZXN0KGJ5dGVzLCBDb25zdGFudHMuQ09OVEVOVF9UWVBFKTsKCiAgICAgICAgRGlza0ZpbGVJdGVtRmFjdG9yeSBmaWxlSXRlbUZhY3RvcnkgPSBuZXcgRGlza0ZpbGVJdGVtRmFjdG9yeSgpOwogICAgICAgIGZpbGVJdGVtRmFjdG9yeS5zZXREZWZhdWx0Q2hhcnNldCgiVVRGLTgiKTsKICAgICAgICBTZXJ2bGV0RmlsZVVwbG9hZCB1cGxvYWQgPSBuZXcgU2VydmxldEZpbGVVcGxvYWQoZmlsZUl0ZW1GYWN0b3J5KTsKICAgICAgICBMaXN0PEZpbGVJdGVtPiBmaWxlSXRlbXMgPSB1cGxvYWQucGFyc2VSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgIEZpbGVJdGVtIGZpbGVJdGVtID0gZmlsZUl0ZW1zLmdldCgwKTsKICAgICAgICBhc3NlcnRUcnVlKGZpbGVJdGVtLmdldFN0cmluZygpLmNvbnRhaW5zKCJjb/F0ZfF0IiksIGZpbGVJdGVtLmdldFN0cmluZygpKTsKICAgIH0KfQo=