LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZVR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGYWN0b3J5TGlzdGVuZXI7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBNb2R1bGVGYWN0b3J5IGltcGxlbWVudHMgSU9yZGVyZWQgewoJcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKCXByaXZhdGUgTW9kdWxlRmFjdG9yeURlbGVnYXRlIGRlbGVnYXRlOwoJcHJpdmF0ZSBMaXN0IG1vZHVsZVR5cGVzOwoJCglwcml2YXRlIExpc3QgbW9kdWxlczsKCgkvKioKCSAqIE1vZHVsZUZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIE1vZHVsZUZhY3RvcnkoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKCQlzdXBlcigpOwoJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGZhY3RvcnkuCgkgKgoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CgkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIGluZGV4IChvcmRlcmluZykgb2YgdGhpcyB0YXNrLgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CgkJdHJ5IHsKCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIikpOwoJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgkKCS8qKgoJICogCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBJTW9kdWxlVHlwZVtdIGdldE1vZHVsZVR5cGVzKCkgewoJCWlmIChtb2R1bGVUeXBlcyA9PSBudWxsKQoJCQltb2R1bGVUeXBlcyA9IFNlcnZlclBsdWdpbi5nZXRNb2R1bGVUeXBlcyhlbGVtZW50LmdldENoaWxkcmVuKCJtb2R1bGVUeXBlIikpOwoKCQlJTW9kdWxlVHlwZVtdIG10ID0gbmV3IElNb2R1bGVUeXBlW21vZHVsZVR5cGVzLnNpemUoKV07CgkJbW9kdWxlVHlwZXMudG9BcnJheShtdCk7CgkJcmV0dXJuIG10OwoJfQoJCgkvKioKCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZXMgZmFjdG9yeSBwcm9kdWNlcyBwcm9qZWN0IG1vZHVsZXMuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzUHJvamVjdE1vZHVsZUZhY3RvcnkoKSB7CgkJcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJwcm9qZWN0cyIpKTsKCX0KCgkvKgoJICogQHNlZSBJTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldERlbGVnYXRlKCkKCSAqLwoJcHVibGljIE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewoJCQl0cnkgewoJCQkJZGVsZWdhdGUgPSAoTW9kdWxlRmFjdG9yeURlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJCQlkZWxlZ2F0ZS5pbml0aWFsaXplKHRoaXMpOwoJCQkJUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkTW9kdWxlRmFjdG9yeUxpc3RlbmVyKGRlbGVnYXRlKTsKCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBjcmVhdGUgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwoJCQl9CgkJfQoJCXJldHVybiBkZWxlZ2F0ZTsKCX0KCgkvKgoJICogQHNlZQoJICovCglwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoU3RyaW5nIGlkKSB7CgkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZ2V0TW9kdWxlcygpOwoJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMyW2ldOwoJCQkJaWYgKGlkLmVxdWFscyhtb2R1bGUuZ2V0SW50ZXJuYWxJZCgpKSkKCQkJCQlyZXR1cm4gbW9kdWxlOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCgkvKgoJICogQHNlZQoJICovCglwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7CgkJbW9kdWxlcyA9IG51bGw7CgkJaWYgKG1vZHVsZXMgPT0gbnVsbCkgewoJCQl0cnkgewoJCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKCQkJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGdldERlbGVnYXRlKCkuZ2V0TW9kdWxlcygpOwoJCQkJaWYgKG1vZHVsZXMyICE9IG51bGwpIHsKCQkJCQlpbnQgc2l6ZSA9IG1vZHVsZXMyLmxlbmd0aDsKCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlczJbaV0pOwoJCQkJfQoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSAiICsgdG9TdHJpbmcoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoJCX0KCQkKCQlJTW9kdWxlW10gbSA9IG5ldyBJTW9kdWxlW21vZHVsZXMuc2l6ZSgpXTsKCQltb2R1bGVzLnRvQXJyYXkobSk7CgkJcmV0dXJuIG07Cgl9CgkKCS8qKgoJICogQWRkIGEgbGlzdGVuZXIgZm9yIG1vZHVsZXMgdGhhdCBhcmUgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoaXMKCSAqIGZhY3RvcnkuCgkgKiAKCSAqIEBwYXJhbSBsaXN0ZW5lciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZhY3RvcnlMaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCBhZGRNb2R1bGVGYWN0b3J5TGlzdGVuZXIoSU1vZHVsZUZhY3RvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewoJCXRyeSB7CgkJCWdldERlbGVnYXRlKCkuYWRkTW9kdWxlRmFjdG9yeUxpc3RlbmVyKGxpc3RlbmVyKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQl9Cgl9CgkKCS8qKgoJICogQWRkIGEgbGlzdGVuZXIgZm9yIG1vZHVsZXMgdGhhdCBhcmUgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoaXMKCSAqIGZhY3RvcnkuCgkgKiAKCSAqIEBwYXJhbSBsaXN0ZW5lciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZhY3RvcnlMaXN0ZW5lcgoJICovCglwdWJsaWMgdm9pZCByZW1vdmVNb2R1bGVGYWN0b3J5TGlzdGVuZXIoSU1vZHVsZUZhY3RvcnlMaXN0ZW5lciBsaXN0ZW5lcikgewoJCXRyeSB7CgkJCWdldERlbGVnYXRlKCkucmVtb3ZlTW9kdWxlRmFjdG9yeUxpc3RlbmVyKGxpc3RlbmVyKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQl9Cgl9CgkKCS8qKgoJICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIk1vZHVsZUZhY3RvcnlbIiArIGdldElkKCkgKyAiXSI7Cgl9Cn0=