LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMudGVzdHM7CgppbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMubW9kdWxlcy5KMmVlU3BlY01vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwoKCnB1YmxpYyBjbGFzcyBNb2R1bGVGYWN0b3J5VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CgoJVGVzdFByb2plY3QgIGFQcm9qZWN0OwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgd2ViWE1MID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIisKCSI8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgXCItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU5cIiBcImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZFwiPlxuIisKCSI8d2ViLWFwcCBpZD1cIldlYkFwcFwiPlxuIisKCSIJPGRpc3BsYXktbmFtZT5XZWIgUHJvamVjdDwvZGlzcGxheS1uYW1lPlxuIisKCSIJPHdlbGNvbWUtZmlsZS1saXN0PlxuIisKCSIJCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPlxuIisKCSIJCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtPC93ZWxjb21lLWZpbGU+XG4iKwoJIgkJPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT5cbiIrCgkiCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuaHRtbDwvd2VsY29tZS1maWxlPlxuIisKCSIJCTx3ZWxjb21lLWZpbGU+ZGVmYXVsdC5odG08L3dlbGNvbWUtZmlsZT5cbiIrCgkiCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuanNwPC93ZWxjb21lLWZpbGU+XG4iKwoJIgk8L3dlbGNvbWUtZmlsZS1saXN0PlxuIisKCSI8L3dlYi1hcHA+XG4iOwogCgkvKgoJICogQHNlZSBUZXN0Q2FzZSNzZXRVcCgpCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJc3VwZXIuc2V0VXAoKTsKCQlhUHJvamVjdCA9IG5ldyBUZXN0UHJvamVjdCgpOwoJCWFQcm9qZWN0LmNyZWF0ZVdlYk1vZHVsZSgibXlXZWJBcHAiLHdlYlhNTCk7Cgl9CgoJLyoKCSAqIEBzZWUgVGVzdENhc2UjdGVhckRvd24oKQoJICovCglwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewoJCXN1cGVyLnRlYXJEb3duKCk7CgkJYVByb2plY3QuZGlzcG9zZSgpOwoJfQoKCS8qKgoJICogQ29uc3RydWN0b3IgZm9yIFBsdWdpbkludGVncml0eVRlc3QuCgkgKiBAcGFyYW0gbmFtZQoJICovCglwdWJsaWMgTW9kdWxlRmFjdG9yeVRlc3RzKFN0cmluZyBuYW1lKSB7CgkJc3VwZXIobmFtZSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0RXhpc3RzKCl7CgkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CgkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdCgiUHJvamVjdC0xIik7CgkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0KTsKCX0KCQoJcHVibGljIHZvaWQgdGVzdE1vZHVsZXMoKXsKCQlJTW9kdWxlW10gbW9kdWxlTGlzdCA9IEoyZWVTcGVjTW9kdWxlRmFjdG9yeURlbGVnYXRlLmdldEluc3RhbmNlKCkuZ2V0TW9kdWxlcygpOwkKCQlhc3NlcnROb3ROdWxsKG1vZHVsZUxpc3QpOwoJCWFzc2VydEVxdWFscygxLG1vZHVsZUxpc3QubGVuZ3RoKTsKCQlJTW9kdWxlIGFXZWJNb2R1bGUgPSAoSU1vZHVsZSltb2R1bGVMaXN0WzBdOwoJCWFzc2VydE5vdE51bGwoYVdlYk1vZHVsZSk7CgkJYXNzZXJ0RXF1YWxzKCJteVdlYkFwcCIsYVdlYk1vZHVsZS5nZXROYW1lKCkpOwoJCUlNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBhV2ViTW9kdWxlLmdldE1vZHVsZVR5cGUoKTsKCQlhc3NlcnROb3ROdWxsKCJXZWIgbW9kdWxlIGRvZXMgbm90IGhhdmUgYSB0eXBlIixtb2R1bGVUeXBlKTsKCQlhc3NlcnRFcXVhbHMoImoyZWUud2ViIixtb2R1bGVUeXBlLmdldElkKCkpOwoJfQoJCgp9Cg==