LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE5hY2kgTS4gRGFpCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpOwoKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS5HZW5lcmljU2VydmVyUnVudGltZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uU2VydmVyUnVudGltZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy51aS5HZW5lcmljU2VydmVyVUlNZXNzYWdlczsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JVGFza01vZGVsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci8qKgogKiAKICoKICogQGF1dGhvciBHb3JrZW0gRXJjYW4KICovCnB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgCnsKCiAgICBwcml2YXRlIFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAgZkNvbXBvc2l0ZTsKICAgIHByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzOyAKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgY29tLmlibS53dHAuc2VydmVyLnVpLndpemFyZC5JV2l6YXJkRnJhZ21lbnQjaXNDb21wbGV0ZSgpCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CgkgICAgCgkJU2VydmVyUnVudGltZSBzZXJ2ZXJSdW50aW1lID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3IoZ2V0U2VydmVyKCkpOwoJCWlmKHNlcnZlclJ1bnRpbWU9PW51bGwpCgkJICAgIHJldHVybiBmYWxzZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKXsKCQljcmVhdGVCb2R5KHBhcmVudCxoYW5kbGUpOwoJfQoJLyoqCgkgKiAKCSAqLwoJcHJpdmF0ZSB2b2lkIGNyZWF0ZUJvZHkoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIAoJewoJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihzZXJ2ZXIpOwoJCWZDb21wb3NpdGUgPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25Hcm91cCh0aGlzLCBkZWZpbml0aW9uLFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAuQ09OVEVYVF9TRVJWRVIsIG51bGwscGFyZW50KTsKCgl9CgoJLyoqCiAgICAgKiBAcGFyYW0gc2VydmVyCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHByaXZhdGUgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKSB7CiAgICAgICAgCiAgICAgICAgUnVudGltZURlbGVnYXRlIHJ1bnRpbWUgPSAoUnVudGltZURlbGVnYXRlKXNlcnZlci5nZXRSdW50aW1lKCkuZ2V0QWRhcHRlcihSdW50aW1lRGVsZWdhdGUuY2xhc3MpOwogICAgICAgIGlmKHJ1bnRpbWU9PW51bGwpewogICAgICAgICAgICBJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gKElSdW50aW1lV29ya2luZ0NvcHkpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHJ1bnRpbWU9IChSdW50aW1lRGVsZWdhdGUpd2MuZ2V0QWRhcHRlcihSdW50aW1lRGVsZWdhdGUuY2xhc3MpOwogICAgICAgIH0gICAgICAgIAogICAgICAgIFN0cmluZyBpZCA9IHJ1bnRpbWUuZ2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9ERUZJTklUSU9OX0lELChTdHJpbmcpbnVsbCk7CiAgICAgICAgaWYoaWQ9PW51bGwpeyAgIAogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgTWFwIHJ1bnRpbWVQcm9wZXJ0aWVzID0gcnVudGltZS5nZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsKE1hcCludWxsKTsKCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihpZCxydW50aW1lUHJvcGVydGllcyk7CiAgICAgICAgcmV0dXJuIGRlZmluaXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHByaXZhdGUgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSlnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoSVRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CiAgICAgICAgcmV0dXJuIHNlcnZlcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gZ2V0U2VydmVyKCk7CiAgICAgICAgU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3Ioc2VydmVyKTsKICAgICAgICBpZihkZWZpbml0aW9uICE9IG51bGwgJiYgZkNvbXBvc2l0ZSE9bnVsbCkKICAgICAgICAgICAgZkNvbXBvc2l0ZS5yZXNldChkZWZpbml0aW9uLFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAuQ09OVEVYVF9TRVJWRVIsbnVsbCk7Cgl9CglwdWJsaWMgdm9pZCBleGl0KCl7CgkgICAgICAgIGZQcm9wZXJ0aWVzID0gZkNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCk7CgkgICAgICAgIHNlcnZlckRlZmluaXRpb25UeXBlUHJvcGVydGllc0NoYW5nZWQoKTsKCX0KCQoJcHJvdGVjdGVkIE1hcCBnZXRTZXJ2ZXJQcm9wZXJ0aWVzKCl7CgkgICAgcmV0dXJuIGZQcm9wZXJ0aWVzOwoJfQoJCiAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC51aS5TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQjZGVzY3JpcHRpb24oKQogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewogICAgICAgIHJldHVybiAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuZ2V0U3RyaW5nKCJzZXJ2ZXJXaXphcmREZXNjcmlwdGlvbiIpOwogICAgfQoKICAgIC8qIChub24tSmF2YWRvYykKICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCN0aXRsZSgpCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgdGl0bGUoKSB7CiAgICAgICAgcmV0dXJuICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5nZXRTdHJpbmcoInNlcnZlcldpemFyZFRpdGxlIik7CiAgICB9CgogICAgLyogKG5vbi1KYXZhZG9jKQogICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3NlcnZlckRlZmluaXRpb25UeXBlUHJvcGVydGllc0NoYW5nZWQoKQogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXJ2ZXJEZWZpbml0aW9uVHlwZVByb3BlcnRpZXNDaGFuZ2VkKCkgewogICAgICAgIGZQcm9wZXJ0aWVzID0gZkNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldvcmtpbmdDb3B5ID0gZ2V0U2VydmVyKCk7CiAgICAgICAgU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3Ioc2VydmVyV29ya2luZ0NvcHkpOwogICAgICAgIAogICAgICAgIHNlcnZlcldvcmtpbmdDb3B5LnNldE5hbWUoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJzZXJ2ZXJOYW1lIixuZXcgU3RyaW5nW10ge2RlZmluaXRpb24uZ2V0TmFtZSgpfSkpOwogICAgICAgIFNlcnZlckRlbGVnYXRlIGRsPSAoU2VydmVyRGVsZWdhdGUpc2VydmVyV29ya2luZ0NvcHkuZ2V0QWRhcHRlcihTZXJ2ZXJEZWxlZ2F0ZS5jbGFzcyk7CiAgICAgICAgZGwuc2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLGdldFNlcnZlclByb3BlcnRpZXMoKSk7CiAgICB9Cn0K