LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWw7CgppbXBvcnQgamF2YS5pby5GaWxlOwppbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSSTsKaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEubmV0LlVSTDsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLkNvcmVQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlNlcnZlclR5cGVQYWNrYWdlOwoKLyoqCiAqIEBhdXRob3IgTmFjaSBEYWkKICovCnB1YmxpYyBjbGFzcyBYTUxVdGlscyB7CgoJQXJyYXlMaXN0IGRlZmluaXRpb25zOwoKCUZpbGUgc291cmNlRGlyOwoKCXB1YmxpYyBYTUxVdGlscyhVUkwgaW5zdGFsbFVybCkgewoJCVN0cmluZyBzZXJ2ZXJzUGF0aCA9IGluc3RhbGxVcmwuZ2V0UGF0aCgpICsgIi9zZXJ2ZXJzIjsKCQlVUkkgdXJpOwoJCXRyeSB7CgkJCXVyaSA9IG5ldyBVUkkoaW5zdGFsbFVybC5nZXRQcm90b2NvbCgpLCBpbnN0YWxsVXJsLmdldEhvc3QoKSwKCQkJCQlzZXJ2ZXJzUGF0aCwgaW5zdGFsbFVybC5nZXRRdWVyeSgpKTsKCQkJc291cmNlRGlyID0gbmV3IEZpbGUodXJpKTsKCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewoJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCgkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJfQoKCQlyZWZyZXNoKCk7Cgl9CgoJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKCQlkZWZpbml0aW9ucyA9IHNjYW5GaWxlcyhzb3VyY2VEaXIpOwoJfQoKCXB1YmxpYyB2b2lkIHVwZGF0ZShTZXJ2ZXJSdW50aW1lIGVsZW1lbnQpIHsKCQl0b0ZpbGUoZWxlbWVudCk7Cgl9CgoJcHVibGljIHZvaWQgdXBkYXRlKCkgewoJCUl0ZXJhdG9yIGRlZnMgPSBkZWZpbml0aW9ucy5pdGVyYXRvcigpOwoJCXdoaWxlIChkZWZzLmhhc05leHQoKSkgewoJCQlTZXJ2ZXJSdW50aW1lIGVsZW1lbnQgPSAoU2VydmVyUnVudGltZSkgZGVmcy5uZXh0KCk7CgkJCXVwZGF0ZShlbGVtZW50KTsKCQl9Cgl9CgoJcHJpdmF0ZSB2b2lkIHRvRmlsZShTZXJ2ZXJSdW50aW1lIGRlZikgewoJCXRyeSB7CgoJCQlGaWxlIGYgPSBuZXcgRmlsZShkZWYuZ2V0RmlsZW5hbWUoKSk7CgkJCWYucmVuYW1lVG8obmV3IEZpbGUoZi5nZXRDYW5vbmljYWxGaWxlKCkgKyAiLmJhayIpKTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CgkJfQoKCQl0cnkgewoJCQlGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlZi5nZXRGaWxlbmFtZSgpKTsKCQkJb3V0LndyaXRlKGRlZi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwoJCQlvdXQuY2xvc2UoKTsKCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewoJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKCQl9Cgl9CgoJcHJpdmF0ZSBBcnJheUxpc3Qgc2NhbkZpbGVzKEZpbGUgZGlyKSB7CgkJQXJyYXlMaXN0IGFsbCA9IG5ldyBBcnJheUxpc3QoKTsKCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKCQkJRmlsZVtdIGFsbFNlcnZlcnMgPSBkaXIubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKCQkJCS8qCgkJCQkgKiAobm9uLUphdmFkb2MpCgkJCQkgKiAKCQkJCSAqIEBzZWUgamF2YS5pby5GaWxlbmFtZUZpbHRlciNhY2NlcHQoamF2YS5pby5GaWxlLAoJCQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQoJCQkJICovCgkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CgkJCQkJaWYgKG5hbWUuZW5kc1dpdGgoIi5zZXJ2ZXIiKSkKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoKCQkJfSk7CgoJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFNlcnZlcnMubGVuZ3RoOyBpKyspIHsKCQkJCUZpbGUgZmlsZSA9IGFsbFNlcnZlcnNbaV07CgoJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0LgoJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CgoJCQkJLy8gUmVnaXN0ZXIgdGhlIGRlZmF1bHQgcmVzb3VyY2UgZmFjdG9yeSAtLSBvbmx5IG5lZWRlZCBmb3IKCQkJCS8vIHN0YW5kLWFsb25lIQoJCQkJcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKQoJCQkJCQkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KAoJCQkJCQkJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sCgkJCQkJCQkJbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7CgoJCQkJU2VydmVyVHlwZVBhY2thZ2UgZ3N0UGFjayA9IFNlcnZlclR5cGVQYWNrYWdlLmVJTlNUQU5DRTsKCgkJCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KCQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgZmlsZVVSSSA9IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkKCQkJCQkJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgoJCQkJLy8gRGVtYW5kIGxvYWQgdGhlIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCgkJCQlSZXNvdXJjZSByZXNvdXJjZT1udWxsOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGZpbGVVUkksIHRydWUpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBlKSB7Ci8vICAgICAgICAgICAgICAgICAgc3RoIHdyb25nIHdpdGggdGhpcyAuc2VydmVyIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUixDb3JlUGx1Z2luLlBMVUdJTl9JRCwxLCJFcnJvciBsb2FkaW5nIHRoZSBzZXJ2ZXIgdHlwZSBkZWZpbml0aW9uIixlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihyZXNvdXJjZSE9bnVsbCkgewogICAgICAgICAgICAgICAgICAgIFNlcnZlclJ1bnRpbWUgZGVmID0gKFNlcnZlclJ1bnRpbWUpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwoJCQkJCWlmIChkZWYgIT0gbnVsbCkgewoJCQkJCQlkZWYuc2V0RmlsZW5hbWUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CgkJCQkJCWFsbC5hZGQoZGVmKTsKCQkJCQl9CgkgICAgICAgICAgICB9CgkJCX0KCQl9CgoJCXJldHVybiBhbGw7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIEFycmF5TGlzdAoJICovCglwdWJsaWMgQXJyYXlMaXN0IGdldFNlcnZlclR5cGVEZWZpbml0aW9ucygpIHsKCQlyZXR1cm4gZGVmaW5pdGlvbnM7Cgl9CgoJLyoqCgkgKiBAcmV0dXJuIEFycmF5TGlzdAoJICovCglwdWJsaWMgU2VydmVyUnVudGltZSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbk5hbWVkKFN0cmluZyBuYW1lKSB7CgkJcmVmcmVzaCgpOwoJCUl0ZXJhdG9yIGRlZnMgPSBnZXRTZXJ2ZXJUeXBlRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOwoJCXdoaWxlIChkZWZzLmhhc05leHQoKSkgewoJCQlTZXJ2ZXJSdW50aW1lIGVsZW0gPSAoU2VydmVyUnVudGltZSkgZGVmcy5uZXh0KCk7CgkJCWlmIChuYW1lLmVxdWFscyhlbGVtLmdldE5hbWUoKSkpCgkJCQlyZXR1cm4gZWxlbTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBkZWZpbml0aW9ucy4KCSAqIAoJICogQHBhcmFtIGRlZmluaXRpb25zCgkgKiAgICAgICAgICAgIFRoZSBkZWZpbml0aW9ucyB0byBzZXQKCSAqLwoJcHVibGljIHZvaWQgc2V0RGVmaW5pdGlvbnMoQXJyYXlMaXN0IGRlZmluaXRpb25zKSB7CgkJdGhpcy5kZWZpbml0aW9ucyA9IGRlZmluaXRpb25zOwoJfQoKCQoJCn0K