LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudGVzdHM7CgppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmNvcmUuaW50ZXJuYWwuR2VuZXJpY1NlcnZlclJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5SdW50aW1lVHlwZTsKCnB1YmxpYyBjbGFzcyBTZXJ2ZXJDcmVhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CgoJUnVudGltZVR5cGUgajJlZVJ1bnRpbWVUeXBlID0gbnVsbDsKCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXM0IjsKCgkvKgoJICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJc3VwZXIuc2V0VXAoKTsKCQlJUnVudGltZVR5cGVbXSBsaXN0QWxsID0gU2VydmVyQ29yZS5nZXRSdW50aW1lVHlwZXMoKTsKCQlpZiAobGlzdEFsbCAhPSBudWxsKSB7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdEFsbC5sZW5ndGg7IGkrKykgewoJCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gbGlzdEFsbFtpXTsKCgkJCQlpZiAoIkoyRUUgUnVudGltZSBMaWJyYXJ5Ii5lcXVhbHMocnVudGltZVR5cGUuZ2V0TmFtZSgpKSkKCQkJCQlqMmVlUnVudGltZVR5cGUgPSAoUnVudGltZVR5cGUpIHJ1bnRpbWVUeXBlOwoJCQl9CgkJfQoJfQoKCS8qCgkgKiBAc2VlIFRlc3RDYXNlI3RlYXJEb3duKCkKCSAqLwoJcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlzdXBlci50ZWFyRG93bigpOwoJfQoKCS8qKgoJICogQ29uc3RydWN0b3IgZm9yIFBsdWdpbkludGVncml0eVRlc3QuCgkgKiAKCSAqIEBwYXJhbSBuYW1lCgkgKi8KCXB1YmxpYyBTZXJ2ZXJDcmVhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZXMoKSB7CgkJYXNzZXJ0Tm90TnVsbChqMmVlUnVudGltZVR5cGUpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQkKCQkvLyBGaW5kcyB0aGUgZ2VuZXJpYyBzZXJ2ZXIgdHlwZQoJCUlTZXJ2ZXJUeXBlW10gc1R5cGVzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJUeXBlcygpOwoJCUlTZXJ2ZXJUeXBlIHNlcnZlclR5cGUgPSBudWxsOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc1R5cGVzLmxlbmd0aDsgaSsrKSB7CgkJCUlTZXJ2ZXJUeXBlIHNUeXBlID0gc1R5cGVzW2ldOwoJCQlpZiAoSUQuZXF1YWxzKHNUeXBlLmdldElkKCkpKQoJCQkJc2VydmVyVHlwZSA9IHNUeXBlOwoJCX0KCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgZmluZCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuam9uYXM0IHNlcnZlciB0eXBlIixzZXJ2ZXJUeXBlKTsKCgkJLy9GaW5kcyB0aGUgZ2VuZXJpYyBzZXJ2ZXIgcnVudGltZSB0eXBlCgkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gc2VydmVyVHlwZS5nZXRSdW50aW1lVHlwZSgpOwoJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBmaW5kIHJ1bnRpbWUgdHlwZSBmb3IgdGhlIGdlbmVyaWMgc2VydmVyIHR5cGUiLHJ1bnRpbWVUeXBlKTsKCQkvL0NyZWF0ZSBhIG5ldyBydW50aW1lIGluc3RhbmNlIGZyb20gdGhlIHR5cGUKCQlJUnVudGltZSBydW50aW1lICA9IHJ1bnRpbWVUeXBlLmNyZWF0ZVJ1bnRpbWUoSUQrIi5Kb25hcy5SdW50aW1lIixudWxsKTsKCgkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGNyZWF0ZSBydW50aW1lIixydW50aW1lKTsKCgkJCgoJCQoJCS8vQ3JlYXRlIGEgbmV3IHNlcnZlciBpbnN0YW5jZSBmcm9tIHRoZSB0eXBlCgkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IHNlcnZlclR5cGUuY3JlYXRlU2VydmVyKElEKyIuSm9uYXMuU2VydmVyIiwgbnVsbCwgcnVudGltZSwgbnVsbCk7CgkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIiLHNlcnZlcik7CgkKCQkvL1NhdmUgdGhlIHNlcnZlcgoJCXNlcnZlci5zYXZlKGZhbHNlLG51bGwpOwoJCQoJCS8vIFNldCBwcm9wZXJ0aWVzIGZvciB0aGUgcnVudGltZQoJCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdvcmtpbmdDb3B5ID0gcnVudGltZS5jcmVhdGVXb3JraW5nQ29weSgpOwoJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBjcmVhdGUgcnVudGltZSB3b3JraW5nIGNvcHkiLHJ1bnRpbWVXb3JraW5nQ29weSk7CgkJCgkJLy8gU2V0IHRoZSBKT05BUyBydW50aW1lIGFzIHRoZSBkZWZhdWx0IHJ1bnRpbWUKCQlTZXJ2ZXJVdGlsLnNldFJ1bnRpbWVEZWZhdWx0TmFtZShydW50aW1lV29ya2luZ0NvcHkpOwoJCWFzc2VydE5vdE51bGwoIlJ1bnRpbWUgd29ya2luZyBjb3B5IGhhcyBubyBuYW1lIixydW50aW1lV29ya2luZ0NvcHkuZ2V0TmFtZSgpKTsKCQkKCQkvLyBTZXQgcHJvcGVydGllcyBmb3IgdGhlIEpPTkFTIHJ1bnRpbWUKCQlHZW5lcmljU2VydmVyUnVudGltZSBydW50aW1lRGVsZWdhdGUgPSAoR2VuZXJpY1NlcnZlclJ1bnRpbWUpcnVudGltZVdvcmtpbmdDb3B5LmxvYWRBZGFwdGVyKEdlbmVyaWNTZXJ2ZXJSdW50aW1lLmNsYXNzLG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwoJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBvYnRhaW4gcnVudGltZSBkZWxlZ2F0ZSIscnVudGltZURlbGVnYXRlKTsKCQkKCQlIYXNoTWFwIHByb3BzID0gbmV3IEhhc2hNYXAoKTsKCQlwcm9wcy5wdXQoIm1hcHBlcm5hbWVzIiwgIiIpOwoJCXByb3BzLnB1dCgiY2xhc3NQYXRoVmFyaWFibGVOYW1lIiwgIkpPTkFTIik7CgkJcHJvcHMucHV0KCJzZXJ2ZXJBZGRyZXNzIiwgIjEyNy4wLjAuMSIpOwoJCXByb3BzLnB1dCgiam9uYXNCYXNlIiwgIkM6XFxubWRcXGRldlxcamF2YVxcYXBwc2VydmVyc1xcSk9uQVMtNC4xLjQiKTsKCQlwcm9wcy5wdXQoImpvbmFzUm9vdCIsICJDOlxcbm1kXFxkZXZcXGphdmFcXGFwcHNlcnZlcnNcXEpPbkFTLTQuMS40Iik7CgkJcHJvcHMucHV0KCJjbGFzc1BhdGgiLCAiQzpcXG5tZFxcZGV2XFxqYXZhXFxhcHBzZXJ2ZXJzXFxKT25BUy00LjEuNCIpOwoJCXByb3BzLnB1dCgicHJvdG9jb2xzIiwgIkM6XFxubWRcXGRldlxcamF2YVxcYXBwc2VydmVyc1xcSk9uQVMtNC4xLjQiKTsKCQlwcm9wcy5wdXQoInBvcnQiLCAiOTAwMCIpOwkJCgkgICAgcnVudGltZURlbGVnYXRlLnNldFNlcnZlckluc3RhbmNlUHJvcGVydGllcyhwcm9wcyk7CgkgICAgCgkgICAgLy9TYXZlIHRoZSBydW50aW1lIHdvcmtpbmcgY29weSAKCQlydW50aW1lV29ya2luZ0NvcHkuc2F2ZShmYWxzZSxudWxsKTsKCQkKCX0KCgkKCgoJcHVibGljIHZvaWQgdGVzdEdldFdlYlR5cGVzKCkgewoKCQlJUnVudGltZVR5cGUgbGlzdFdlYltdID0gU2VydmVyVXRpbC5nZXRSdW50aW1lVHlwZXMoImpzdC53ZWIiLCBudWxsKTsKCQlhc3NlcnROb3ROdWxsKGxpc3RXZWIpOwoKCQlib29sZWFuIGZvdW5kID0gbGlzdFdlYi5sZW5ndGg+MDsKCQlhc3NlcnRUcnVlKGZvdW5kKTsKCX0KCn0K