LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJVSUNvcmU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwovKioKICogUHJvcGVydHlQYWdlIGZvciBJUHJvamVjdHMuIEl0IHNob3dzIHRoZSBzZXJ2ZXIgYW5kIHJ1bnRpbWUgcHJlZmVyZW5jZSBmb3IgdGhlIHByb2plY3QuCiAqLwpwdWJsaWMgY2xhc3MgUHJvamVjdFByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Cglwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKCXByb3RlY3RlZCBJTW9kdWxlIG1vZHVsZTsKCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKCQoJcHJvdGVjdGVkIFJ1bnRpbWVUYXJnZXRDb21wb3NpdGUgcnRDb21wOwoKCS8qKgoJICogUHJvamVjdFByb3BlcnR5UGFnZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgUHJvamVjdFByb3BlcnR5UGFnZSgpIHsKCQlzdXBlcigpOwoJfQoKCS8qKgoJICogQ3JlYXRlIHRoZSBib2R5IG9mIHRoZSBwYWdlLgoJICoKCSAqIEBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wKCSAqLwoJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewoJCXRyeSB7CgkJCUlBZGFwdGFibGUgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkKCQkJCXByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7CgoJCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwoJCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTA7CgkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKCQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwoJCQkKCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7CgkJCWxhYmVsLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVwcmVmUHJvamVjdERlc2NyaXB0aW9uIikpOwoJCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwoJCQlkYXRhLndpZHRoSGludCA9IDIwMDsKCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCgkJCW1vZHVsZSA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KVswXTsKCgkJCWlmIChtb2R1bGUgPT0gbnVsbCkgewoJCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CgkJCQlsYWJlbC5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlcHJlZlByb2plY3ROb3RNb2R1bGUiKSk7CgkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKCQkJCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CgkJCX0gZWxzZSB7CgkJCQlJTW9kdWxlVHlwZSBtdCA9IG1vZHVsZS5nZXRNb2R1bGVUeXBlKCk7CgkJCQlpZiAobXQgIT0gbnVsbCkgewoJCQkJCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwoJCQkJCWxhYmVsLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVwcmVmUHJvamVjdCIpKTsKCQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQkJCQoJCQkJCUxhYmVsIG1vZHVsZUtpbmQgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CgkJCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwoJCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwoJCQkJCW1vZHVsZUtpbmQuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQkJCQltb2R1bGVLaW5kLnNldFRleHQobW9kdWxlLmdldE5hbWUoKSArICIgKCIgKyBtdC5nZXROYW1lKCkgKyAiKSIpOwoJCQkJfQoJCQkJCgkJCQlydENvbXAgPSBuZXcgUnVudGltZVRhcmdldENvbXBvc2l0ZShjb21wb3NpdGUsIHByb2plY3QpOwoJCQkJCgkJCQlJUHJvamVjdFByb3BlcnRpZXMgcHJlZnMgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpOwoJCQkJSVNlcnZlciBwcmVmU2VydmVyID0gcHJlZnMuZ2V0RGVmYXVsdFNlcnZlcigpOwoJCgkJCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKCQkJCWxhYmVsLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVwcmVmUHJvamVjdERlZmF1bHRTZXJ2ZXIiKSk7CgkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CgkJCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCQkJCgkJCQlmaW5hbCBJU2VydmVyW10gc2VydmVycyA9IGdldFNlcnZlcnNCeVN1cHBvcnRlZE1vZHVsZShtb2R1bGUpOwoJCQkJaWYgKHNlcnZlcnMgPT0gbnVsbCB8fCBzZXJ2ZXJzLmxlbmd0aCA9PSAwKSB7CgkJCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7CgkJCQkJbGFiZWwuc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXByZWZQcm9qZWN0Tm90Q29uZmlndXJlZCIpKTsKCQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7CgkJCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CgkJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQkJCX0gZWxzZSB7CgkJCQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCk7CgkJCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwoJCQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwoJCQkJCWRhdGEuaGVpZ2h0SGludCA9IDcwOwoJCQkJCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CgkJCQkJCgkJCQkJLy8gYWRkIG5vbmUgb3B0aW9uCgkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7CgkJCQkJaXRlbS5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlcHJlZlByb2plY3ROb1NlcnZlciIpKTsKCQkJCQkvL2l0ZW0uc2V0SW1hZ2UoKTsKCQkJCQkKCQkJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJCQlpbnQgY291bnQgPSAwOwoJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewoJCQkJCQlpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwoJCQkJCQlpdGVtLnNldFRleHQoU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KHNlcnZlcnNbal0pKTsKCQkJCQkJaXRlbS5zZXRJbWFnZShTZXJ2ZXJVSUNvcmUuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKHNlcnZlcnNbal0pKTsKCQkJCQkJaXRlbS5zZXREYXRhKHNlcnZlcnNbal0pOwoJCQkJCQlpZiAoc2VydmVyc1tqXS5lcXVhbHMocHJlZlNlcnZlcikpCgkJCQkJCQljb3VudCA9IGogKyAxOwoJCQkJCX0KCgkJCQkJdGFibGUuc2V0U2VsZWN0aW9uKGNvdW50KTsKCgkJCQkJdGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CgkJCQkJCQlpbnQgaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwoJCQkJCQkJaWYgKGluZGV4ID09IDApIHsKCQkJCQkJCQlzZXJ2ZXIgPSBudWxsOwoJCQkJCQkJfSBlbHNlIGlmIChpbmRleCA+IDApIHsKCQkJCQkJCQlzZXJ2ZXIgPSBzZXJ2ZXJzW2luZGV4LTFdOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSk7CgkJCQl9CgkJCX0KCQkJCgkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKCgkJCXJldHVybiBjb21wb3NpdGU7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoIkVycm9yIGNyZWF0aW5nIHByb2plY3QgcHJvcGVydHkgcGFnZSIsIGUpOwoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgc2VydmVycyB0aGF0IHRoaXMgbW9kdWxlIGlzIGNvbmZpZ3VyZWQgb24uCgkgKgoJICogQHBhcmFtIG1vZHVsZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZQoJICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAoJICovCglwcm90ZWN0ZWQgc3RhdGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzQnlTdXBwb3J0ZWRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKCQlpZiAobW9kdWxlID09IG51bGwpCgkJCXJldHVybiBuZXcgSVNlcnZlclswXTsKCgkJLy8gZG8gaXQgdGhlIHNsb3cgd2F5IC0gZ28gdGhyb3VnaCBhbGwgc2VydmVycyBhbmQKCQkvLyBzZWUgaWYgdGhpcyBtb2R1bGUgaXMgY29uZmlndXJlZCBpbiBpdAoJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlckNvcmUuZ2V0U2VydmVycygpOwoJCWlmIChzZXJ2ZXJzICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCWlmIChTZXJ2ZXJVdGlsLmlzU3VwcG9ydGVkTW9kdWxlKHNlcnZlcnNbaV0uZ2V0U2VydmVyVHlwZSgpLmdldFJ1bnRpbWVUeXBlKCkuZ2V0TW9kdWxlVHlwZXMoKSwgbW9kdWxlLmdldE1vZHVsZVR5cGUoKSkpCgkJCQkJbGlzdC5hZGQoc2VydmVyc1tpXSk7CgkJCX0KCQl9CgkJCgkJSVNlcnZlcltdIGFsbFNlcnZlcnMgPSBuZXcgSVNlcnZlcltsaXN0LnNpemUoKV07CgkJbGlzdC50b0FycmF5KGFsbFNlcnZlcnMpOwoJCXJldHVybiBhbGxTZXJ2ZXJzOwoJfQoKCS8qKiAKCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVBhZ2UuCgkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQoJICovCglwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CgkJaWYgKG1vZHVsZSAhPSBudWxsKSB7CgkJCXRyeSB7CgkJCQlpZiAocnRDb21wLmhhc0NoYW5nZWQoKSkKCQkJCQlydENvbXAuYXBwbHkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CgkJCQkKCQkJCUlQcm9qZWN0UHJvcGVydGllcyBwcm9wcyA9IFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCk7CgkJCQlwcm9wcy5zZXREZWZhdWx0U2VydmVyKHNlcnZlciwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CgkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2V0dGluZyBwcmVmZXJyZWQgc2VydmVyIiwgZSk7CgkJCQlFY2xpcHNlVXRpbC5vcGVuRXJyb3IoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvckNvdWxkTm90U2F2ZVByZWZlcmVuY2UiKSwgZS5nZXRTdGF0dXMoKSk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9CgkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwoJfQp9