LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE5hY2kgTS4gRGFpCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwoKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuVGFza01vZGVsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5TZXJ2ZXJEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci8qKgogKiAKICoKICogQGF1dGhvciBHb3JrZW0gRXJjYW4KICovCnB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgCnsKCiAgICBwcml2YXRlIFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAgZkNvbXBvc2l0ZTsKICAgIHByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzOyAKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgY29tLmlibS53dHAuc2VydmVyLnVpLndpemFyZC5JV2l6YXJkRnJhZ21lbnQjaXNDb21wbGV0ZSgpCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CgkgICAgCgkJU2VydmVyUnVudGltZSBzZXJ2ZXJSdW50aW1lID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3IoZ2V0U2VydmVyKCkpOwoJCWlmKHNlcnZlclJ1bnRpbWU9PW51bGwpCgkJICAgIHJldHVybiBmYWxzZTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgaGFuZGxlKXsKCQljcmVhdGVCb2R5KHBhcmVudCxoYW5kbGUpOwoJfQoJLyoqCgkgKiAKCSAqLwoJcHJpdmF0ZSB2b2lkIGNyZWF0ZUJvZHkoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpIAoJewoJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihzZXJ2ZXIpOwoJCWZDb21wb3NpdGUgPSBuZXcgU2VydmVyVHlwZURlZmluaXRpb25Hcm91cCh0aGlzLCBkZWZpbml0aW9uLFNlcnZlclR5cGVEZWZpbml0aW9uR3JvdXAuQ09OVEVYVF9TRVJWRVIsIG51bGwscGFyZW50KTsKCgl9CgoJLyoqCiAgICAgKiBAcGFyYW0gc2VydmVyCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHByaXZhdGUgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyKSB7CiAgICAgICAgCiAgICAgICAgUnVudGltZURlbGVnYXRlIHJ1bnRpbWUgPSAoUnVudGltZURlbGVnYXRlKXNlcnZlci5nZXRSdW50aW1lKCkuZ2V0QWRhcHRlcihSdW50aW1lRGVsZWdhdGUuY2xhc3MpOwogICAgICAgIGlmKHJ1bnRpbWU9PW51bGwpewogICAgICAgICAgICBJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gKElSdW50aW1lV29ya2luZ0NvcHkpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwogICAgICAgICAgICBydW50aW1lPSAoUnVudGltZURlbGVnYXRlKXdjLmdldEFkYXB0ZXIoUnVudGltZURlbGVnYXRlLmNsYXNzKTsKICAgICAgICB9ICAgICAgICAKICAgICAgICBTdHJpbmcgaWQgPSBydW50aW1lLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCk7CiAgICAgICAgaWYoaWQ9PW51bGwpeyAgIAogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgTWFwIHJ1bnRpbWVQcm9wZXJ0aWVzID0gcnVudGltZS5nZXRBdHRyaWJ1dGUoR2VuZXJpY1NlcnZlclJ1bnRpbWUuU0VSVkVSX0lOU1RBTkNFX1BST1BFUlRJRVMsKE1hcCludWxsKTsKCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbihpZCxydW50aW1lUHJvcGVydGllcyk7CiAgICAgICAgcmV0dXJuIGRlZmluaXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHByaXZhdGUgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcigpIHsKICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSlnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfU0VSVkVSKTsKICAgICAgICByZXR1cm4gc2VydmVyOwogICAgfQoKICAgIHB1YmxpYyB2b2lkIGVudGVyKCkgewogICAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKICAgICAgICBTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihzZXJ2ZXIpOwogICAgICAgIGlmKGRlZmluaXRpb24gIT0gbnVsbCAmJiBmQ29tcG9zaXRlIT1udWxsKQogICAgICAgICAgICBmQ29tcG9zaXRlLnJlc2V0KGRlZmluaXRpb24sU2VydmVyVHlwZURlZmluaXRpb25Hcm91cC5DT05URVhUX1NFUlZFUixudWxsKTsKCX0KCXB1YmxpYyB2b2lkIGV4aXQoKXsKCSAgICAgICAgZlByb3BlcnRpZXMgPSBmQ29tcG9zaXRlLmdldFByb3BlcnRpZXMoKTsKCSAgICAgICAgc2VydmVyRGVmaW5pdGlvblR5cGVQcm9wZXJ0aWVzQ2hhbmdlZCgpOwoJfQoJCglwcm90ZWN0ZWQgTWFwIGdldFNlcnZlclByb3BlcnRpZXMoKXsKCSAgICByZXR1cm4gZlByb3BlcnRpZXM7Cgl9CgkKICAgIC8qIChub24tSmF2YWRvYykKICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCNkZXNjcmlwdGlvbigpCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7CiAgICAgICAgU3RyaW5nIHNOYW1lID0gZ2V0U2VydmVyTmFtZSgpOwogICAgICAgIGlmKHNOYW1lPT1udWxsIHx8IHNOYW1lLmxlbmd0aCgpPDEpCiAgICAgICAgICAgIHNOYW1lPSJHZW5lcmljIjsKICAgICAgICByZXR1cm4gIEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmdldEZvcm1hdHRlZFN0cmluZygic2VydmVyV2l6YXJkRGVzY3JpcHRpb24iLG5ldyBTdHJpbmdbXSB7c05hbWV9KTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkKICAgIHsKICAgICAgICBpZihnZXRTZXJ2ZXIoKSE9bnVsbCAmJiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkhPW51bGwpCiAgICAgICAgICAgcmV0dXJuIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qIChub24tSmF2YWRvYykKICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCN0aXRsZSgpCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgdGl0bGUoKSB7CiAgICAgICAgU3RyaW5nIHNOYW1lPSBnZXRTZXJ2ZXJOYW1lKCk7CiAgICAgICAgaWYoc05hbWU9PW51bGwgfHwgc05hbWUubGVuZ3RoKCk8MSkKICAgICAgICAgICAgc05hbWU9IkdlbmVyaWMiOwogICAgICAgIHJldHVybiAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJzZXJ2ZXJXaXphcmRUaXRsZSIsbmV3IFN0cmluZ1tde3NOYW1lfSk7CiAgICB9CgogICAgLyogKG5vbi1KYXZhZG9jKQogICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwudWkuU2VydmVyRGVmaW5pdGlvblR5cGVBd2FyZVdpemFyZEZyYWdtZW50I3NlcnZlckRlZmluaXRpb25UeXBlUHJvcGVydGllc0NoYW5nZWQoKQogICAgICovCiAgICBwdWJsaWMgdm9pZCBzZXJ2ZXJEZWZpbml0aW9uVHlwZVByb3BlcnRpZXNDaGFuZ2VkKCkgewogICAgICAgIGZQcm9wZXJ0aWVzID0gZkNvbXBvc2l0ZS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldvcmtpbmdDb3B5ID0gZ2V0U2VydmVyKCk7CiAgICAgICAgU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3Ioc2VydmVyV29ya2luZ0NvcHkpOwogICAgICAgIAogICAgICAgIHNlcnZlcldvcmtpbmdDb3B5LnNldE5hbWUoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuZ2V0Rm9ybWF0dGVkU3RyaW5nKCJzZXJ2ZXJOYW1lIixuZXcgU3RyaW5nW10ge2RlZmluaXRpb24uZ2V0TmFtZSgpfSkpOwogICAgICAgIFNlcnZlckRlbGVnYXRlIGRsPSAoU2VydmVyRGVsZWdhdGUpc2VydmVyV29ya2luZ0NvcHkuZ2V0QWRhcHRlcihTZXJ2ZXJEZWxlZ2F0ZS5jbGFzcyk7CiAgICAgICAgZGwuc2V0QXR0cmlidXRlKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLlNFUlZFUl9JTlNUQU5DRV9QUk9QRVJUSUVTLGdldFNlcnZlclByb3BlcnRpZXMoKSk7CiAgICB9Cn0K