LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKLyoqCiAqIAogKi8KcHVibGljIGNsYXNzIFNlcnZlckNvbmZpZ3VyYXRpb25UeXBlIGltcGxlbWVudHMgSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlIHsKCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKCgkvKioKCSAqIFNlcnZlckNvbmZpZ3VyYXRpb25UeXBlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewoJCXN1cGVyKCk7CgkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKCX0KCQoJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewoJCXJldHVybiBlbGVtZW50OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmYWN0b3J5LgoJICoKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKCX0KCQoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIG9yZGVyLgoJICoKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBpbnQgZ2V0T3JkZXIoKSB7CgkJdHJ5IHsKCQkJU3RyaW5nIG8gPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgib3JkZXIiKTsKCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQobyk7CgkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCQoJcHVibGljIGJvb2xlYW4gaXNGb2xkZXIoKSB7CgkJcmV0dXJuICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpc0ZvbGRlciIpKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGxhYmVsIG9mIHRoaXMgZmFjdG9yeS4KCSAqCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZ1tdIGdldEltcG9ydEZpbHRlckV4dGVuc2lvbnMoKSB7CgkJcmV0dXJuIFNlcnZlclBsdWdpbi50b2tlbml6ZShlbGVtZW50LmdldEF0dHJpYnV0ZSgiaW1wb3J0RXh0ZW5zaW9ucyIpLCAiLCIpOwoJfQoJCglwdWJsaWMgSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXJDb25maWd1cmF0aW9uKFN0cmluZyBpZCwgSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CgkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKCQkJaWQgPSBTZXJ2ZXJQbHVnaW4uZ2VuZXJhdGVJZCgpOwoJCVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBzY3djID0gbmV3IFNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weShpZCwgZmlsZSwgdGhpcyk7CgkJc2N3Yy5zZXREZWZhdWx0cygpOwoJCXJldHVybiBzY3djOwoJfQoJCglwdWJsaWMgSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBpbXBvcnRGcm9tUnVudGltZShTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElSdW50aW1lIHJ1bnRpbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCgkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKCQlTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgc2N3YyA9IG5ldyBTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoaWQsIGZpbGUsIHRoaXMpOwoJCXNjd2Muc2V0RGVmYXVsdHMoKTsKCQlzY3djLmltcG9ydEZyb21SdW50aW1lKHJ1bnRpbWUsIG1vbml0b3IpOwoJCXJldHVybiBzY3djOwoJfQoJCglwdWJsaWMgSVNlcnZlckNvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBpbXBvcnRGcm9tUGF0aChTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQYXRoIHBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCgkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKCQlTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgc2N3YyA9IG5ldyBTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkoaWQsIGZpbGUsIHRoaXMpOwoJCXNjd2Muc2V0RGVmYXVsdHMoKTsKCQlzY3djLmltcG9ydEZyb21QYXRoKHBhdGgsIG1vbml0b3IpOwoJCXJldHVybiBzY3djOwoJfQoKCS8qKgoJICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gIlNlcnZlckNvbmZpZ3VyYXRpb25UeXBlWyIgKyBnZXRJZCgpICsgIl0iOwoJfQp9