LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaE1hbmFnZXI7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci8qKgogKiAKICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJUeXBlIGltcGxlbWVudHMgSVNlcnZlclR5cGUgewoJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwoKCS8qKgoJICogU2VydmVyVHlwZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgU2VydmVyVHlwZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewoJCXN1cGVyKCk7CgkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKCX0KCQoJcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBnZXRFbGVtZW50KCkgewoJCXJldHVybiBlbGVtZW50OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaWQgb2YgdGhpcyBmYWN0b3J5LgoJICoKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsKCX0KCQoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZSgibmFtZSIpOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkZXNjcmlwdGlvbiIpOwoJfQoJCglwdWJsaWMgSVJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgewoJCXJldHVybiBTZXJ2ZXJDb3JlLmdldFJ1bnRpbWVUeXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJydW50aW1lVHlwZUlkIikpOwoJfQoJCglwdWJsaWMgYm9vbGVhbiBoYXNSdW50aW1lKCkgewoJCVN0cmluZyBzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInJ1bnRpbWUiKTsKCQlyZXR1cm4gInRydWUiLmVxdWFscyhzKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBvcmRlci4KCSAqCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgaW50IGdldE9yZGVyKCkgewoJCXRyeSB7CgkJCVN0cmluZyBvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm9yZGVyIik7CgkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG8pOwoJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgkKCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoKSB7CgkJU3RyaW5nIGxhdW5jaENvbmZpZ0lkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImxhdW5jaENvbmZpZ0lkIik7CgkJaWYgKGxhdW5jaENvbmZpZ0lkID09IG51bGwpCgkJCXJldHVybiBudWxsOwoJCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwoJCXJldHVybiBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKGxhdW5jaENvbmZpZ0lkKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXJ2ZXIgY2FuIHN0YXJ0IG9yIG1heSBhbHJlYWR5IGJlIHN0YXJ0ZWQKCSAqIGluIHRoZSBnaXZlbiBtb2RlLCBhbmQgZmFsc2UgaWYgbm90LiBVc2VzIHRoZSBsYXVuY2hNb2RlIGF0dHJpYnV0ZSwKCSAqIHdoaWNoIG1heSBjb250YWluIHRoZSBzdHJpbmdzICJydW4iLCAiZGVidWciLCBhbmQvb3IgInByb2ZpbGUiLgoJICogCgkgKiBAcGFyYW0gbGF1bmNoTW9kZSBTdHJpbmcKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xhdW5jaE1vZGUoU3RyaW5nIGxhdW5jaE1vZGUpIHsKCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IGdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKCk7CgkJaWYgKGNvbmZpZ1R5cGUgPT0gbnVsbCkgewoJCQlTdHJpbmcgbW9kZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYXVuY2hNb2RlcyIpOwoJCQlpZiAobW9kZSA9PSBudWxsKQoJCQkJcmV0dXJuIGZhbHNlOwoJCQllbHNlCgkJCQlyZXR1cm4gbW9kZS5pbmRleE9mKGxhdW5jaE1vZGUpID49IDA7CgkJfSBlbHNlCgkJCXJldHVybiBjb25maWdUeXBlLnN1cHBvcnRzTW9kZShsYXVuY2hNb2RlKTsKCX0KCglwdWJsaWMgSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlIGdldFNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKCkgewoJCVN0cmluZyBjb25maWd1cmF0aW9uVHlwZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbmZpZ3VyYXRpb25UeXBlSWQiKTsKCQlyZXR1cm4gU2VydmVyQ29yZS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZShjb25maWd1cmF0aW9uVHlwZUlkKTsKCX0KCQoJcHVibGljIGJvb2xlYW4gc3VwcG9ydHNMb2NhbGhvc3QoKSB7CgkJU3RyaW5nIGhvc3RzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhvc3RzIik7CgkJcmV0dXJuIChob3N0cyA9PSBudWxsIHx8IGhvc3RzLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigibG9jYWxob3N0IikgPj0gMCAKCQkJCXx8IGhvc3RzLmluZGV4T2YoIjEyNy4wLjAuMSIpID49IDApOwoJfQoJCglwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1JlbW90ZUhvc3RzKCkgewoJCVN0cmluZyBob3N0cyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJob3N0cyIpOwoJCXJldHVybiAoaG9zdHMgPT0gbnVsbCB8fCBob3N0cy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInJlbW90ZSIpID49IDApOwoJfQoJCglwdWJsaWMgYnl0ZSBnZXRJbml0aWFsU3RhdGUoKSB7CgkJYnl0ZSBzdGF0ZSA9IElTZXJ2ZXIuU0VSVkVSX1VOS05PV047CgkJU3RyaW5nIHN0YXRlU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImluaXRpYWxTdGF0ZSIpOwoJCWlmICgic3RvcHBlZCIuZXF1YWxzKHN0YXRlU3RyaW5nKSkKCQkJc3RhdGUgPSBJU2VydmVyLlNFUlZFUl9TVE9QUEVEOwoJCWVsc2UgaWYgKCJzdGFydGVkIi5lcXVhbHMoc3RhdGVTdHJpbmcpKQoJCQlzdGF0ZSA9IElTZXJ2ZXIuU0VSVkVSX1NUQVJURUQ7CgkJcmV0dXJuIHN0YXRlOwoJfQoKCS8qKgoJICogUmV0dXJucyBhbiBJU3RhdHVzIG1lc3NhZ2UgdG8gdmVyaWZ5IGlmIGEgc2VydmVyIG9mIHRoaXMgdHlwZSB3aWxsIGJlIGFibGUKCSAqIHRvIHJ1biB0aGUgbW9kdWxlIGltbWVkaWF0ZWx5IGFmdGVyIGJlaW5nIGNyZWF0ZWQsIHdpdGhvdXQgYW55IHVzZXIKCSAqIGludGVyYWN0aW9uLiBJZiBPSywgdGhpcyBzZXJ2ZXIgbWF5IGJlIHVzZWQgYXMgYSBkZWZhdWx0IHNlcnZlci4gVGhpcwoJICogbWV0aG9kIHNob3VsZCByZXR1cm4gRVJST1IgaWYgdGhlIHVzZXIgbXVzdCBzdXBwbHkgYW55IGluZm9ybWF0aW9uIHRvCgkgKiBjb25maWd1cmUgdGhlIHNlcnZlciBjb3JyZWN0bHksIG9yIGlmIHRoZSBtb2R1bGUgaXMgbm90IHN1cHBvcnRlZC4KCSAqCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdGF0dXMKCSAqLwoJLypwdWJsaWMgSVN0YXR1cyBpc0RlZmF1bHRBdmFpbGFibGUoSU1vZHVsZSBtb2R1bGUpIHsKCQlyZXR1cm4gbnVsbDsKCX0qLwoJCglwdWJsaWMgYnl0ZSBnZXRTZXJ2ZXJTdGF0ZVNldCgpIHsKCQlTdHJpbmcgc3RhdGVTZXQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgic3RhdGVTZXQiKTsKCQlpZiAoc3RhdGVTZXQgPT0gbnVsbCkKCQkJcmV0dXJuIFNFUlZFUl9TVEFURV9TRVRfTUFOQUdFRDsKCQllbHNlIGlmIChzdGF0ZVNldC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImF0dGFjaCIpID49IDApCgkJCXJldHVybiBTRVJWRVJfU1RBVEVfU0VUX0FUVEFDSEVEOwoJCWVsc2UgaWYgKHN0YXRlU2V0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigicHVibGlzaCIpID49IDApCgkJCXJldHVybiBTRVJWRVJfU1RBVEVfU0VUX1BVQkxJU0hFRDsKCQllbHNlCgkJCXJldHVybiBTRVJWRVJfU1RBVEVfU0VUX01BTkFHRUQ7Cgl9CgoJcHVibGljIGJvb2xlYW4gaGFzU2VydmVyQ29uZmlndXJhdGlvbigpIHsKCQlTdHJpbmcgY29uZmlndXJhdGlvblR5cGVJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjb25maWd1cmF0aW9uVHlwZUlkIik7CgkJcmV0dXJuIGNvbmZpZ3VyYXRpb25UeXBlSWQgIT0gbnVsbCAmJiBjb25maWd1cmF0aW9uVHlwZUlkLmxlbmd0aCgpID4gMDsKCX0KCQoJcHVibGljIGJvb2xlYW4gaXNNb25pdG9yYWJsZSgpIHsKCQlyZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1vbml0b3JhYmxlIikpOwoJfQoJCglwdWJsaWMgYm9vbGVhbiBpc1Rlc3RFbnZpcm9ubWVudCgpIHsKCQlyZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRlc3RFbnZpcm9ubWVudCIpKTsKCX0KCQoJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBjcmVhdGVTZXJ2ZXIoU3RyaW5nIGlkLCBJRmlsZSBmaWxlLCBJUnVudGltZSBydW50aW1lKSB7CgkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkKCQkJaWQgPSBTZXJ2ZXJQbHVnaW4uZ2VuZXJhdGVJZCgpOwoJCVNlcnZlcldvcmtpbmdDb3B5IHN3YyA9IG5ldyBTZXJ2ZXJXb3JraW5nQ29weShpZCwgZmlsZSwgcnVudGltZSwgdGhpcyk7CgkJc3djLnNldERlZmF1bHRzKCk7CgkJcmV0dXJuIHN3YzsKCX0KCglwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGNyZWF0ZVNlcnZlcihTdHJpbmcgaWQsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApCgkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKCQkKCQlJUnVudGltZSBydW50aW1lID0gbnVsbDsKCQlpZiAoaGFzUnVudGltZSgpKSB7CgkJCS8vIGxvb2sgZm9yIGV4aXN0aW5nIHJ1bnRpbWUKCQkJSVJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gZ2V0UnVudGltZVR5cGUoKTsKCQkJTGlzdCBsaXN0ID0gU2VydmVyQ29yZS5nZXRSZXNvdXJjZU1hbmFnZXIoKS5nZXRSdW50aW1lcyhydW50aW1lVHlwZSk7CgkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKCQkJCXJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGxpc3QuZ2V0KDApOwoJCQl9IGVsc2UgewoJCQkJLy8gY3JlYXRlIHJ1bnRpbWUKCQkJCXRyeSB7CgkJCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lV0MgPSBydW50aW1lVHlwZS5jcmVhdGVSdW50aW1lKGlkICsgIi1ydW50aW1lIik7CgkJCQkJU2VydmVyVXRpbC5zZXRSdW50aW1lRGVmYXVsdE5hbWUocnVudGltZVdDKTsKCQkJCQlydW50aW1lID0gcnVudGltZVdDOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZG4ndCBjcmVhdGUgcnVudGltZSIsIGUpOwoJCQkJfQoJCQl9CgkJfQoKCQlTZXJ2ZXJXb3JraW5nQ29weSBzd2MgPSBuZXcgU2VydmVyV29ya2luZ0NvcHkoaWQsIGZpbGUsIHJ1bnRpbWUsIHRoaXMpOwoJCVNlcnZlclV0aWwuc2V0U2VydmVyRGVmYXVsdE5hbWUoc3djKTsKCQlpZiAocnVudGltZSAhPSBudWxsKQoJCQlzd2Muc2V0UnVudGltZShydW50aW1lKTsKCQkKCQlJU2VydmVyQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IG51bGw7CgkJaWYgKGhhc1NlcnZlckNvbmZpZ3VyYXRpb24oKSkgewoJCQlpZiAocnVudGltZSAhPSBudWxsKQoJCQkJY29uZmlnID0gZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKS5pbXBvcnRGcm9tUnVudGltZShpZCArICItY29uZmlnIiwgZmlsZSwgcnVudGltZSwgbW9uaXRvcik7CgkJCWlmIChjb25maWcgPT0gbnVsbCkKCQkJCWNvbmZpZyA9IGdldFNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKCkuY3JlYXRlU2VydmVyQ29uZmlndXJhdGlvbihpZCArICItY29uZmlnIiwgZmlsZSwgbW9uaXRvcik7CgkJCVNlcnZlclV0aWwuc2V0U2VydmVyQ29uZmlndXJhdGlvbkRlZmF1bHROYW1lKGNvbmZpZyk7CgkJCWlmIChjb25maWcgIT0gbnVsbCkKCQkJCXN3Yy5zZXRTZXJ2ZXJDb25maWd1cmF0aW9uKGNvbmZpZyk7CgkJfQoJCQoJCXN3Yy5zZXREZWZhdWx0cygpOwoJCQoJCXJldHVybiBzd2M7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiU2VydmVyVHlwZVsiICsgZ2V0SWQoKSArICJdIjsKCX0KfQ==