LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE5hY2kgTS4gRGFpCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLkNsYXNzcGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CgovKioKICogVXRpbGl0aWVzIGZvciBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gZmlsZXMuCiAqCiAqIEBhdXRob3IgR29ya2VtIEVyY2FuCiAqLwpwdWJsaWMgY2xhc3MgU2VydmVyVHlwZURlZmluaXRpb25VdGlsIAp7CgkvKioKCSAqIAoJICogQHBhcmFtIHJ1bnRpbWUKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIHN0YXRpYyBTZXJ2ZXJSdW50aW1lIGdldFNlcnZlclR5cGVEZWZpbml0aW9uKElSdW50aW1lIHJ1bnRpbWUpCgl7CgkJaWYocnVudGltZT09bnVsbCkKCQkJcmV0dXJuIG51bGw7CgkgICAgR2VuZXJpY1NlcnZlclJ1bnRpbWUgZGVsZWdhdGUgPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpcnVudGltZS5sb2FkQWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyxudWxsKTsKCSAgICBpZihkZWxlZ2F0ZT09bnVsbCkKCSAgICAJcmV0dXJuIG51bGw7CgkJU3RyaW5nIHNlcnZlclR5cGUgPSBkZWxlZ2F0ZS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwoJCU1hcCBwcm9wZXJ0aWVzID0gZGVsZWdhdGUuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7CgkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gCgkJCUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNlcnZlclR5cGVEZWZpbml0aW9uTWFuYWdlcigpLmdldFNlcnZlclJ1bnRpbWVEZWZpbml0aW9uKHNlcnZlclR5cGUscHJvcGVydGllcyk7CgkJcmV0dXJuIGRlZmluaXRpb247Cgl9CgkvKioKCSAqIAoJICogQHBhcmFtIHJ1bnRpbWUKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRTZXJ2ZXJDbGFzc1BhdGhFbnRyeShJUnVudGltZSBydW50aW1lKQoJewoJCVNlcnZlclJ1bnRpbWUgZGVmaW5pdGlvbiA9IGdldFNlcnZlclR5cGVEZWZpbml0aW9uKHJ1bnRpbWUpOwoJCWlmKGRlZmluaXRpb249PW51bGwpCgkJCXJldHVybiBudWxsOwoJCVN0cmluZyByZWYgPSBkZWZpbml0aW9uLmdldFByb2plY3QoKS5nZXRDbGFzc3BhdGhSZWZlcmVuY2UoKTsKCQlDbGFzc3BhdGggY3AgPSBkZWZpbml0aW9uLmdldENsYXNzcGF0aChyZWYpOwoJCUl0ZXJhdG9yIGFyY2hpdmVzID0gY3AuZ2V0QXJjaGl2ZSgpLml0ZXJhdG9yKCk7CgkJQXJyYXlMaXN0IGVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCQl3aGlsZSAoYXJjaGl2ZXMuaGFzTmV4dCgpKSB7CgkJCUFyY2hpdmVUeXBlIGFyY2hpdmUgPSAoQXJjaGl2ZVR5cGUpIGFyY2hpdmVzLm5leHQoKTsKCQkJU3RyaW5nIGl0ZW0gPSBkZWZpbml0aW9uLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoYXJjaGl2ZS5nZXRQYXRoKCkpOwoJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoaXRlbSksbnVsbCxudWxsICk7CgkJCWVudHJ5TGlzdC5hZGQoZW50cnkpOwoJCX0KCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKWVudHJ5TGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cnlMaXN0LnNpemUoKV0pOwoJfQoJLyoqCgkgKiBHaXZlbiB0aGUgc2VydmVyRGVmaW5pdGlvbiBhbmQgbW9kdWxlIHJldHVybnMgdGhlIHB1Ymxpc2hlciBpZCAKCSAqIHRoYXQgaGFuZGxlcyB0aGUgcHVibGlzaGluZyBvZiBtb2R1bGUgdHlwZSBmb3IgdGhpcyBzZXJ2ZXJEZWZpbml0aW9uLgoJICogQHBhcmFtIG1vZHVsZQoJICogQHBhcmFtIHNlcnZlckRlZmluaXRpb24KCSAqIEByZXR1cm4gcHVibGlzaGVyIGlkCgkgKi8KCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hlcklEKElNb2R1bGUgbW9kdWxlLCBTZXJ2ZXJSdW50aW1lIHNlcnZlckRlZmluaXRpb24pCgl7CgkJaWYobW9kdWxlPT1udWxsIHx8IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQlNb2R1bGUgbSA9IHNlcnZlckRlZmluaXRpb24uZ2V0TW9kdWxlKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSk7CgkJcmV0dXJuIG0uZ2V0UHVibGlzaGVyUmVmZXJlbmNlKCk7Cgl9CgkKfQo=