LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBHb3JrZW0gRXJjYW4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIE5hY2kgTS4gRGFpCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnVpLmludGVybmFsOwoKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsLkdlbmVyaWNTZXJ2ZXJSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlRhc2tNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkud2l6YXJkLklXaXphcmRIYW5kbGU7Ci8qKgogKiAKICoKICogQGF1dGhvciBHb3JrZW0gRXJjYW4KICovCnB1YmxpYyBjbGFzcyBHZW5lcmljU2VydmVyV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBTZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQgCnsKCXByaXZhdGUgR2VuZXJpY1NlcnZlckNvbXBvc2l0ZURlY29yYXRvcltdIGZEZWNvcmF0b3JzOwoKCS8qKgoJICogCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CgkJZm9yIChpbnQgaSA9IDA7IGZEZWNvcmF0b3JzIT1udWxsICYmIGkgPCBmRGVjb3JhdG9ycy5sZW5ndGg7IGkrKykgewoJCQlpZihmRGVjb3JhdG9yc1tpXS52YWxpZGF0ZSgpKQoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlTZXJ2ZXJSdW50aW1lIHNlcnZlclJ1bnRpbWUgPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihnZXRTZXJ2ZXIoKSk7CgkJaWYoc2VydmVyUnVudGltZT09bnVsbCkKCQkgICAgcmV0dXJuIGZhbHNlOwoJCXJldHVybiB0cnVlOwoJfQoKCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSBoYW5kbGUpewoJCUlTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXIgPSBnZXRTZXJ2ZXIoKTsKCQlHZW5lcmljU2VydmVyIGRsPSAoR2VuZXJpY1NlcnZlcilzZXJ2ZXIuZ2V0QWRhcHRlcihHZW5lcmljU2VydmVyLmNsYXNzKTsKCQlTZXJ2ZXJSdW50aW1lIGRlZmluaXRpb24gPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihzZXJ2ZXIpOwoJCWZEZWNvcmF0b3JzID0gbmV3IEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGVEZWNvcmF0b3JbMV07CgkJZkRlY29yYXRvcnNbMF09bmV3IFNlcnZlclR5cGVEZWZpbml0aW9uU2VydmVyRGVjb3JhdG9yKGRlZmluaXRpb24sbnVsbCxnZXRXaXphcmQoKSxkbCk7CgkJbmV3IEdlbmVyaWNTZXJ2ZXJDb21wb3NpdGUocGFyZW50LGZEZWNvcmF0b3JzKTsKCQkKCX0KCS8qKgogICAgICogQHBhcmFtIHNlcnZlcgogICAgICogQHJldHVybgogICAgICovCiAgICBwcml2YXRlIFNlcnZlclJ1bnRpbWUgZ2V0U2VydmVyVHlwZURlZmluaXRpb25Gb3IoSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcikgeyAgICAgICAgCiAgICAgICAgR2VuZXJpY1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IChHZW5lcmljU2VydmVyUnVudGltZSlzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldEFkYXB0ZXIoR2VuZXJpY1NlcnZlclJ1bnRpbWUuY2xhc3MpOwogICAgICAgIGlmKHJ1bnRpbWU9PW51bGwpewogICAgICAgICAgICBJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gKElSdW50aW1lV29ya2luZ0NvcHkpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwogICAgICAgICAgICBydW50aW1lPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpd2MuZ2V0QWRhcHRlcihHZW5lcmljU2VydmVyUnVudGltZS5jbGFzcyk7CiAgICAgICAgfSAgICAgICAgCiAgICAgICAgU3RyaW5nIGlkID0gcnVudGltZS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwogICAgICAgIGlmKGlkPT1udWxsKXsgICAKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIE1hcCBydW50aW1lUHJvcGVydGllcyA9IHJ1bnRpbWUuZ2V0U2VydmVySW5zdGFuY2VQcm9wZXJ0aWVzKCk7CgkJU2VydmVyUnVudGltZSBkZWZpbml0aW9uID0gZ2V0U2VydmVyVHlwZURlZmluaXRpb24oaWQscnVudGltZVByb3BlcnRpZXMpOwogICAgICAgIHJldHVybiBkZWZpbml0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybgogICAgICovCiAgICBwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRTZXJ2ZXIoKSB7CiAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1NFUlZFUik7CiAgICAgICAgcmV0dXJuIHNlcnZlcjsKICAgIH0KCiAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKICAgIAlnZXRTZXJ2ZXIoKS5zZXROYW1lKEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLmJpbmQoR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuc2VydmVyTmFtZSxnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbkZvcihnZXRTZXJ2ZXIoKSkuZ2V0TmFtZSgpKSk7CiAgICAJCQkKICAgIH0KICAgIAoJcHVibGljIHZvaWQgZXhpdCgpewoKCX0KCQoJCiAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC51aS5TZXJ2ZXJEZWZpbml0aW9uVHlwZUF3YXJlV2l6YXJkRnJhZ21lbnQjZGVzY3JpcHRpb24oKQogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewogICAgICAgIFN0cmluZyBzTmFtZSA9IGdldFNlcnZlck5hbWUoKTsKICAgICAgICBpZihzTmFtZT09bnVsbCB8fCBzTmFtZS5sZW5ndGgoKTwxKQogICAgICAgICAgICBzTmFtZT0iR2VuZXJpYyI7CiAgICAgICAgcmV0dXJuICBHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5iaW5kKEdlbmVyaWNTZXJ2ZXJVSU1lc3NhZ2VzLnNlcnZlcldpemFyZERlc2NyaXB0aW9uLHNOYW1lKTsKICAgIH0KCiAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkKICAgIHsKICAgICAgICBpZihnZXRTZXJ2ZXIoKSE9bnVsbCAmJiBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkhPW51bGwpCiAgICAgICAgICAgcmV0dXJuIGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldE5hbWUoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qIChub24tSmF2YWRvYykKICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLnVpLlNlcnZlckRlZmluaXRpb25UeXBlQXdhcmVXaXphcmRGcmFnbWVudCN0aXRsZSgpCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgdGl0bGUoKSB7CiAgICAgICAgU3RyaW5nIHNOYW1lPSBnZXRTZXJ2ZXJOYW1lKCk7CiAgICAgICAgaWYoc05hbWU9PW51bGwgfHwgc05hbWUubGVuZ3RoKCk8MSkKICAgICAgICAgICAgc05hbWU9IkdlbmVyaWMiOwogICAgICAgIHJldHVybiAgR2VuZXJpY1NlcnZlclVJTWVzc2FnZXMuYmluZChHZW5lcmljU2VydmVyVUlNZXNzYWdlcy5zZXJ2ZXJXaXphcmRUaXRsZSxzTmFtZSk7CiAgICB9Cn0K