LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklFbGVtZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklUYXNrOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuSUNvbW1hbmRNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLyoqCiAqIEEgY29tbWFuZCBtYW5hZ2VyIGZvciBhIHNpbmdsZSBzZXJ2ZXIgcmVzb3VyY2UuCiAqLwpwdWJsaWMgY2xhc3MgU2VydmVyUmVzb3VyY2VDb21tYW5kTWFuYWdlciBpbXBsZW1lbnRzIElDb21tYW5kTWFuYWdlciB7Cglwcm90ZWN0ZWQgU2VydmVyRWRpdG9yIGVkaXRvcjsKCXByb3RlY3RlZCBHbG9iYWxDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcjsKCXByb3RlY3RlZCBTdHJpbmcgaWQ7CgoJcHVibGljIFNlcnZlclJlc291cmNlQ29tbWFuZE1hbmFnZXIoU2VydmVyRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBHbG9iYWxDb21tYW5kTWFuYWdlciBjb21tYW5kTWFuYWdlcikgewoJCXRoaXMuZWRpdG9yID0gZWRpdG9yOwoJCXRoaXMuY29tbWFuZE1hbmFnZXIgPSBjb21tYW5kTWFuYWdlcjsKCQl0aGlzLmlkID0gaWQ7Cgl9CgkKCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CgkJcmV0dXJuIGNvbW1hbmRNYW5hZ2VyLmlzUmVhZE9ubHkoaWQpOwoJfQoKCS8qKgoJICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCBhbmQgcGxhY2UgaXQgaW4gdGhlIHVuZG8gc3RhY2suCgkgKiBJZiB0aGUgY29tbWFuZCBjYW5ub3QgYmUgdW5kb25lLCB0aGUgdXNlciB3aWxsIGJlIG5vdGlmZWQKCSAqIGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KCSAqCgkgKiBAcGFyYW0gY29tbWFuZCBJQ29tbWFuZAoJICovCglwdWJsaWMgdm9pZCBleGVjdXRlQ29tbWFuZChJVGFzayBjb21tYW5kKSB7CgkJaWYgKCF2YWxpZGF0ZUVkaXQoKSkKCQkJcmV0dXJuOwoKCQlpZiAoY29tbWFuZE1hbmFnZXIuaXNSZWFkT25seShpZCkpIHsKCQkJd2FyblJlYWRPbmx5KCk7CgkJCXJldHVybjsKCQl9CgkJY29tbWFuZE1hbmFnZXIuZXhlY3V0ZUNvbW1hbmQoaWQsIGNvbW1hbmQpOwoJfQoKCXByb3RlY3RlZCB2b2lkIHdhcm5SZWFkT25seSgpIHsKCQlTdHJpbmcgdGl0bGUgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVkaXRvclJlc291cmNlV2FyblRpdGxlIik7CgkJU3RyaW5nIG1lc3NhZ2UgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVkaXRvclJlc291cmNlV2Fybk1lc3NhZ2UiKTsKCQkKCQlNZXNzYWdlRGlhbG9nLm9wZW5XYXJuaW5nKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwoJfQoKCS8qKgoJICogCgkgKi8KCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlRWRpdCgpIHsKCQlpZiAoY29tbWFuZE1hbmFnZXIuaXNEaXJ0eShpZCkpCgkJCXJldHVybiB0cnVlOwoKCQlJRmlsZVtdIGZpbGVzID0gY29tbWFuZE1hbmFnZXIuZ2V0UmVhZE9ubHlGaWxlcyhpZCk7CgkJaWYgKGZpbGVzLmxlbmd0aCA9PSAwKQoJCQlyZXR1cm4gdHJ1ZTsKCQkKCQlJU3RhdHVzIHN0YXR1cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoZmlsZXMsIGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSk7CgkJCgkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKCQkJLy8gaW5mb3JtIHVzZXIKCQkJU3RyaW5nIG1lc3NhZ2UgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVkaXRvclZhbGlkYXRlRWRpdEZhaWx1cmVNZXNzYWdlIik7CgkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihlZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCksIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlZXJyb3JEaWFsb2dUaXRsZSIpLCBtZXNzYWdlLCBzdGF0dXMpOwoJCQkKCQkJLy8gY2hhbmdlIHRvIHJlYWQtb25seQoJCQljb21tYW5kTWFuYWdlci5zZXRSZWFkT25seShpZCwgdHJ1ZSk7CgkJCQoJCQkvLyBkbyBub3QgZXhlY3V0ZSBjb21tYW5kCgkJCXJldHVybiBmYWxzZTsKCQl9CgkJLy8gY2hlY2sgZmlsZSB0aW1lc3RhbXAKCQlJRWxlbWVudCBzZXJ2ZXJmaWxlID0gY29tbWFuZE1hbmFnZXIuZ2V0U2VydmVyUmVzb3VyY2UoaWQpOwoJCWlmIChjb21tYW5kTWFuYWdlci5oYXNDaGFuZ2VkKGlkKSkgewoJCQlpZiAoc2VydmVyZmlsZSBpbnN0YW5jZW9mIElTZXJ2ZXIpCgkJCQllZGl0b3IucHJvbXB0UmVsb2FkU2VydmVyRmlsZShpZCwgKElTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyZmlsZSk7CgkJfQoJCQoJCS8vIGFsbG93IGVkaXQKCQlyZXR1cm4gdHJ1ZTsKCX0KfQ==