LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwoKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJQb3J0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlck1vbml0b3JEZWxlZ2F0ZTsKLyoqCiAqIAogKi8KcHVibGljIGNsYXNzIFNlcnZlck1vbml0b3IgaW1wbGVtZW50cyBJU2VydmVyTW9uaXRvciB7Cglwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwoJcHJpdmF0ZSBTZXJ2ZXJNb25pdG9yRGVsZWdhdGUgZGVsZWdhdGU7CgoJLyoqCgkgKiBNb25pdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJNb25pdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CgkJc3VwZXIoKTsKCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBkZWZhdWx0IHNlcnZlci4KCSAqCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Cgl9CgoJLyoKCSAqIEBzZWUgSU1vbml0b3IjZ2V0RGVzY3JpcHRpb24oKQoJICovCglwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsKCX0KCgkvKgoJICogQHNlZSBJTW9uaXRvciNnZXRMYWJlbCgpCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKCQlTdHJpbmcgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwoJCWlmIChsYWJlbCA9PSBudWxsKQoJCQlyZXR1cm4gIm4vYSI7CgkJcmV0dXJuIGxhYmVsOwoJfQoKCS8qCgkgKiBAc2VlIElNb25pdG9yI2dldERlbGVnYXRlKCkKCSAqLwoJcHVibGljIFNlcnZlck1vbml0b3JEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewoJCQl0cnkgewoJCQkJZGVsZWdhdGUgPSAoU2VydmVyTW9uaXRvckRlbGVnYXRlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwoJCQl9CgkJfQoJCXJldHVybiBkZWxlZ2F0ZTsKCX0KCgkvKioKCSAqIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGdpdmVuIHBvcnQsIGFuZCByZXR1cm4gdGhlIHBvcnQgbnVtYmVyIHRvCgkgKiB0dW5uZWwgcmVxdWVzdHMgdGhyb3VnaC4KCSAqIEBwYXJhbSBwb3J0CgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBpbnQgc3RhcnRNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBJU2VydmVyUG9ydCBwb3J0LCBpbnQgbW9uaXRvclBvcnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQl0cnkgewoJCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5zdGFydE1vbml0b3Jpbmcoc2VydmVyLCBwb3J0LCBtb25pdG9yUG9ydCk7CgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewoJCQl0aHJvdyBjZTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlICIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCgkvKioKCSAqIFN0b3AgbW9uaXRvcmluZyB0aGUgZ2l2ZW4gcG9ydC4KCSAqIEBwYXJhbSBwb3J0CgkgKi8KCXB1YmxpYyB2b2lkIHN0b3BNb25pdG9yaW5nKElTZXJ2ZXIgc2VydmVyLCBJU2VydmVyUG9ydCBwb3J0KSB7CgkJdHJ5IHsKCQkJZ2V0RGVsZWdhdGUoKS5zdG9wTW9uaXRvcmluZyhzZXJ2ZXIsIHBvcnQpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIGNhbGxpbmcgZGVsZWdhdGUgIiArIHRvU3RyaW5nKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJcmV0dXJuICJNb25pdG9yWyIgKyBnZXRJZCgpICsgIl0iOwoJfQp9