LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5TZXJ2ZXJQcmVmZXJlbmNlczsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlNlcnZlckFkYXB0ZXI7Ci8qKgogKiBBIGNsYXNzIHRoYXQgbGlzdGVucyB0byB0aGUgc3RhcnR1cCBvZiBhIHNlcnZlci4gVG8gdXNlCiAqIGl0LCBqdXN0IGNyZWF0ZSBhbiBpbnN0YW5jZSB1c2luZyBvbmUgb2YgdGhlIHR3byBjb25zdHJ1Y3RvcnMuCiAqCiAqIFRoaXMgY2xhc3Mgd2lsbCBsaXN0ZW4gaW1tZWRpYXRlbHkgZm9yIGVycm9ycyBpbiB0aGUgc2VydmVyCiAqIHN0YXJ0dXAuIEhvd2V2ZXIsIGl0IHdpbGwgbm90IGRpc3BsYXkgYW4gZXJyb3IgdW50aWwgaXQgaGFzCiAqIGJlZW4gZW5hYmxlZC4gKHNldEVuYWJsZWQodHJ1ZSkpIElmIHlvdSBkZWNpZGUgeW91IHdhbnQgdG8KICogY2FuY2VsIHRoZSBzdGFydHVwIGxpc3RlbmVyLCBqdXN0IGNhbGwgc2V0RW5hYmxlZChmYWxzZSksCiAqIGFuZCB0aGUgbGlzdGVuZXIgd2lsbCBiZSBkaXNwb3NlZCBvZi4KICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJTdGFydHVwTGlzdGVuZXIgewoJcHJvdGVjdGVkIElTZXJ2ZXIgc2VydmVyOwoJcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwoJcHJvdGVjdGVkIElTZXJ2ZXJMaXN0ZW5lciBsaXN0ZW5lcjsKCglwcm90ZWN0ZWQgSUNsaWVudCBjbGllbnQ7Cglwcm90ZWN0ZWQgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyOwoJcHJvdGVjdGVkIElNb2R1bGVBcnRpZmFjdCBtb2R1bGVPYmplY3Q7Cglwcm90ZWN0ZWQgU3RyaW5nIGxhdW5jaE1vZGU7Cglwcm90ZWN0ZWQgSU1vZHVsZSBtb2R1bGU7CgoJLy8gaWYgdHJ1ZSwgaWdub3JlcyB0aGUgZmlyc3Qgc2h1dGRvd24KCXByb3RlY3RlZCBib29sZWFuIGlnbm9yZVNodXRkb3duID0gZmFsc2U7CgoJLy8gaWYgdHJ1ZSwgd2lsbCBvdXRwdXQgZXJyb3IgbWVzc2FnZXMKCXByb3RlY3RlZCBib29sZWFuIGlzRW5hYmxlZCA9IGZhbHNlOwoKCS8vIGlmIHRydWUsIGFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSB0aGlzIGNsYXNzIHdhcwoJLy8gZGlzYWJsZWQKCXByb3RlY3RlZCBib29sZWFuIGlzRXJyb3IgPSBmYWxzZTsKCgkvKioKCSAqIFNlcnZlclN0YXJ0dXBMaXN0ZW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgU2VydmVyU3RhcnR1cExpc3RlbmVyKFNoZWxsIHNoZWxsLCBJU2VydmVyIHNlcnZlcikgewoJCXN1cGVyKCk7CgkJdGhpcy5zaGVsbCA9IHNoZWxsOwoJCXRoaXMuc2VydmVyID0gc2VydmVyOwoJCgkJbGlzdGVuZXIgPSBuZXcgU2VydmVyQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgc2VydmVyU3RhdGVDaGFuZ2UoSVNlcnZlciBzZXJ2ZXIyKSB7CgkJCQloYW5kbGVTdGF0ZUNoYW5nZShzZXJ2ZXIyLmdldFNlcnZlclN0YXRlKCkpOwoJCQl9CgkJfTsKCQlzZXJ2ZXIuYWRkU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoKCS8qKgoJICogU2VydmVyU3RhcnR1cExpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJTdGFydHVwTGlzdGVuZXIoU2hlbGwgc2hlbGwsIElTZXJ2ZXIgc2VydmVyLCBJQ2xpZW50IGNsaWVudCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSwgSU1vZHVsZSBtb2R1bGUpIHsKCQl0aGlzKHNoZWxsLCBzZXJ2ZXIpOwoJCXRoaXMuY2xpZW50ID0gY2xpZW50OwoJCXRoaXMubGF1bmNoYWJsZUFkYXB0ZXIgPSBsYXVuY2hhYmxlQWRhcHRlcjsKCQl0aGlzLmxhdW5jaE1vZGUgPSBsYXVuY2hNb2RlOwoJCXRoaXMubW9kdWxlID0gbW9kdWxlOwoJCXRoaXMubW9kdWxlT2JqZWN0ID0gbW9kdWxlT2JqZWN0OwoJfQoKCS8qKgoJICogU2VydmVyU3RhcnR1cExpc3RlbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXJ2ZXJTdGFydHVwTGlzdGVuZXIoU2hlbGwgc2hlbGwsIElTZXJ2ZXIgc2VydmVyLCBJQ2xpZW50IGNsaWVudCwgSUxhdW5jaGFibGVBZGFwdGVyIGxhdW5jaGFibGVBZGFwdGVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0LCBTdHJpbmcgbGF1bmNoTW9kZSwgSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gaWdub3JlU2h1dGRvd24pIHsKCQl0aGlzKHNoZWxsLCBzZXJ2ZXIsIGNsaWVudCwgbGF1bmNoYWJsZUFkYXB0ZXIsIG1vZHVsZU9iamVjdCwgbGF1bmNoTW9kZSwgbW9kdWxlKTsKCQl0aGlzLmlnbm9yZVNodXRkb3duID0gaWdub3JlU2h1dGRvd247Cgl9CgoJLyoqCgkgKiBTZXJ2ZXJTdGFydHVwTGlzdGVuZXIgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIFNlcnZlclN0YXJ0dXBMaXN0ZW5lcihTaGVsbCBzaGVsbCwgSVNlcnZlciBzZXJ2ZXIsIGJvb2xlYW4gaWdub3JlU2h1dGRvd24pIHsKCQl0aGlzKHNoZWxsLCBzZXJ2ZXIpOwoJCXRoaXMuaWdub3JlU2h1dGRvd24gPSBpZ25vcmVTaHV0ZG93bjsKCX0KCQoJLyoqCgkgKiBEaXNwbGF5IHRoZSBzdGFydHVwIGVycm9yIG5vdGljZS4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yKCkgewoJCS8vIGRpc3BsYXkgZXJyb3Igbm90aWNlCgkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJU3RyaW5nIG1lc3NhZ2UgPSBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVycm9yU2VydmVyU3RhcnRGYWlsZWQiLCBzZXJ2ZXIuZ2V0TmFtZSgpKTsKCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWVycm9yRGlhbG9nVGl0bGUiKSwgbWVzc2FnZSk7CgkJCX0KCQl9KTsKCX0KCgkvKioKCSAqIERpc3Bvc2Ugb2YgdGhlIGxpc3RlbmVyIGFuZCBxdWl0LgoJICovCglwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewoJCWlmIChsaXN0ZW5lciAhPSBudWxsKQoJCQlzZXJ2ZXIucmVtb3ZlU2VydmVyTGlzdGVuZXIobGlzdGVuZXIpOwoJCWxpc3RlbmVyID0gbnVsbDsKCX0KCgkvKioKCSAqIEhhbmRsZSBhIHN0YXRlIGNoYW5nZSBpbiB0aGUgc3RhcnRpbmcgc2VydmVyLgoJICoKCSAqIEBwYXJhbSBzdGF0ZSBieXRlCgkgKi8KCXByb3RlY3RlZCB2b2lkIGhhbmRsZVN0YXRlQ2hhbmdlKGludCBzdGF0ZSkgewoJCXN3aXRjaCAoc3RhdGUpIHsKCQkJY2FzZSBJU2VydmVyLlNUQVRFX1NUQVJURUQ6IHsKCQkJCWRpc3Bvc2UoKTsKCQkJCW9wZW5DbGllbnQoKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWNhc2UgSVNlcnZlci5TVEFURV9TVE9QUEVEOgoJCQljYXNlIElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkc6IHsKCQkJCWlmICghaWdub3JlU2h1dGRvd24pIHsKCQkJCQlkaXNwb3NlKCk7CgkJCQkJaWYgKGlzRW5hYmxlZCkKCQkJCQkJZGlzcGxheUVycm9yKCk7CgkJCQkJZWxzZQoJCQkJCQlpc0Vycm9yID0gdHJ1ZTsKCQkJCX0gZWxzZSBpZiAoaWdub3JlU2h1dGRvd24gJiYgc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7CgkJCQkJaWdub3JlU2h1dGRvd24gPSBmYWxzZTsKCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogT3BlbiB0aGUgY2xpZW50LCBpZiBvbmUgZXhpc3RzLgoJICovCglwcm90ZWN0ZWQgdm9pZCBvcGVuQ2xpZW50KCkgewoJCWlmIChjbGllbnQgPT0gbnVsbCkKCQkJcmV0dXJuOwoJCQoJCWxhdW5jaENsaWVudFV0aWwoc2VydmVyLCBtb2R1bGUsIGxhdW5jaGFibGVBZGFwdGVyLCBtb2R1bGVPYmplY3QsIGxhdW5jaE1vZGUsIGNsaWVudCk7Cgl9CgoJLyoqCgkgKiBBbGxvd3MgdGhlIHN0YXJ0dXAgbGlzdGVuZXIgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4KCSAqCgkgKiBAcGFyYW0gZW5hYmxlZCBib29sZWFuCgkgKi8KCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7CgkJaWYgKGVuYWJsZWQpIHsKCQkJaWYgKGlzRXJyb3IpCgkJCQlkaXNwbGF5RXJyb3IoKTsKCQkJZWxzZQoJCQkJaXNFbmFibGVkID0gdHJ1ZTsKCQl9IGVsc2UKCQkJZGlzcG9zZSgpOwoJfQoKCXB1YmxpYyBzdGF0aWMgdm9pZCBsYXVuY2hDbGllbnRVdGlsKGZpbmFsIElTZXJ2ZXIgc2VydmVyLCBmaW5hbCBJTW9kdWxlIG1vZHVsZSwgZmluYWwgSUxhdW5jaGFibGVBZGFwdGVyIGxhLCBmaW5hbCBJTW9kdWxlQXJ0aWZhY3QgbW8sIGZpbmFsIFN0cmluZyBsYXVuY2hNb2RlLCBmaW5hbCBJQ2xpZW50IGNsaWVudCkgewoJCWlmIChjbGllbnQgPT0gbnVsbCB8fCBzZXJ2ZXIgPT0gbnVsbCkKCQkJcmV0dXJuOwoJCgkJLy8gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAtIHNob3VsZCBqdXN0IHdhaXQgZm9yIGEgbW9kdWxlIHN0YXRlIGNoYW5nZSBldmVudAoJCWlmIChzZXJ2ZXIuZ2V0TW9kdWxlU3RhdGUobW9kdWxlKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJUSU5HKSB7CgkJCWNsYXNzIERpc3BsYXlDbGllbnRKb2IgZXh0ZW5kcyBKb2IgewoJCQkJcHVibGljIERpc3BsYXlDbGllbnRKb2IoKSB7CgkJCQkJc3VwZXIoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2aWV3U3RhdHVzU3RhcnRpbmczIikpOwoJCQkJfQoKCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgU2VydmVyVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7CgoJCQkJCS8vIHdhaXQgZm9yIHVwIHRvIDUgbWludXRlcwoJCQkJCWludCBzdGF0ZSA9IHNlcnZlci5nZXRNb2R1bGVTdGF0ZShtb2R1bGUpOwoJCQkJCWludCBjb3VudCA9ICgoU2VydmVyUHJlZmVyZW5jZXMpU2VydmVyQ29yZS5nZXRTZXJ2ZXJQcmVmZXJlbmNlcygpKS5nZXRNb2R1bGVTdGFydFRpbWVvdXQoKTsKCQkJCQl3aGlsZSAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVElORyAmJiBjb3VudCA+IDApIHsKCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQoJCQkJCQkJcmV0dXJuIHN0YXR1czsKCQkJCQkJdHJ5IHsKCQkJCQkJCVRocmVhZC5zbGVlcCgyMDAwKTsKCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCS8vIGlnbm9yZQoJCQkJCQl9CgkJCQkJCWNvdW50IC09IDIwMDA7CgkJCQkJCXN0YXRlID0gc2VydmVyLmdldE1vZHVsZVN0YXRlKG1vZHVsZSk7CgkJCQkJfQoJCQkJCQoJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKCQkJCQkJcmV0dXJuIHN0YXR1czsKCQkJCQkKCQkJCQlpZiAoc3RhdGUgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKQoJCQkJCQlyZXR1cm4gc3RhdHVzOwoJCQkJCQoJCQkJCS8vIGRpc3BsYXkgY2xpZW50IG9uIFVJIHRocmVhZAoJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CgkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKCQkJCQkJCVRyYWNlLnRyYWNlKCJBdHRlbXB0aW5nIHRvIGxvYWQgY2xpZW50OiAiICsgY2xpZW50KTsKCQkJCQkJCXRyeSB7CgkJCQkJCQkJSUxhdW5jaGFibGUgbGF1bmNoYWJsZSA9IGxhLmdldExhdW5jaGFibGUoc2VydmVyLCBtbyk7CgkJCQkJCQkJY2xpZW50LmxhdW5jaChzZXJ2ZXIsIGxhdW5jaGFibGUsIGxhdW5jaE1vZGUsIHNlcnZlci5nZXRFeGlzdGluZ0xhdW5jaCgpKTsKCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJCQkJVHJhY2UudHJhY2UoIlNlcnZlciBjbGllbnQgZmFpbGVkIiwgZSk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9KTsKCQkJCQlyZXR1cm4gc3RhdHVzOwoJCQkJfQoJCQl9CgkJCURpc3BsYXlDbGllbnRKb2Igam9iID0gbmV3IERpc3BsYXlDbGllbnRKb2IoKTsKCQkJam9iLnNjaGVkdWxlKCk7CgkJCXJldHVybjsKCQl9CgkKCQkvLyBkaXNwbGF5IGNsaWVudCBvbiBVSSB0aHJlYWQKCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewoJCQlwdWJsaWMgdm9pZCBydW4oKSB7CgkJCQlUcmFjZS50cmFjZSgiQXR0ZW1wdGluZyB0byBsb2FkIGNsaWVudDogIiArIGNsaWVudCk7CgkJCQl0cnkgewoJCQkJCUlMYXVuY2hhYmxlIGxhdW5jaGFibGUgPSBsYS5nZXRMYXVuY2hhYmxlKHNlcnZlciwgbW8pOwoJCQkJCWNsaWVudC5sYXVuY2goc2VydmVyLCBsYXVuY2hhYmxlLCBsYXVuY2hNb2RlLCBzZXJ2ZXIuZ2V0RXhpc3RpbmdMYXVuY2goKSk7CgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCVRyYWNlLnRyYWNlKCJTZXJ2ZXIgY2xpZW50IGZhaWxlZCIsIGUpOwoJCQkJfQoJCQl9CgkJfSk7Cgl9Cn0=