LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuYWN0aW9uczsKCmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuRWNsaXBzZVV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5UcmFjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKLyoqCiAqIEFjdGlvbiBkZWxlZ2F0ZSBmb3IgcmVzdGFydGluZyBhIHByb2plY3Qgd2l0aGluIGEgcnVubmluZwogKiBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgUmVzdGFydFByb2plY3RBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElBY3Rpb25EZWxlZ2F0ZSB7Cglwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKCgkvKioKCSAqIFJlc3RhcnRQcm9qZWN0QWN0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBSZXN0YXJ0UHJvamVjdEFjdGlvbkRlbGVnYXRlKCkgewoJCXN1cGVyKCk7Cgl9CgkKCS8qKgoJICogUGVyZm9ybXMgdGhpcyBhY3Rpb24uCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBkZWxlZ2F0aW5nIGFjdGlvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuCgkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgdGhlIHByZXNlbnRhdGlvbiBwb3J0aW9uIG9mIHRoZQoJICogICBhY3Rpb24KCSAqLwoJcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CgkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKCQkJcHVibGljIHZvaWQgcnVuKCkgewoJCQkJU2hlbGwgc2hlbGwgPSBFY2xpcHNlVXRpbC5nZXRTaGVsbCgpOwoJCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhzaGVsbCwgU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVkZWZhdWx0RGlhbG9nVGl0bGUiKSwgbnVsbCwgU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVkaWFsb2dSZXN0YXJ0aW5nUHJvamVjdCIsIHByb2plY3QuZ2V0TmFtZSgpKSwgTWVzc2FnZURpYWxvZy5JTkZPUk1BVElPTiwgbmV3IFN0cmluZ1swXSwgMCk7CgkJCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwoJCQkJZGlhbG9nLm9wZW4oKTsKCQoJCQkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMocHJvamVjdCk7CgkJCQlpZiAobW9kdWxlcyAhPSBudWxsICYmIG1vZHVsZXMubGVuZ3RoID4gMCkgewoJCQkJCUlNb2R1bGUgbW9kdWxlID0gbW9kdWxlc1swXTsKCQkJCQlJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKG1vZHVsZSwgbnVsbCk7CgkJCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewoJCQkJCQlpbnQgc2l6ZTIgPSBzZXJ2ZXJzLmxlbmd0aDsKCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplMjsgaisrKSB7CgkJCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXJzW2pdLmdldFNlcnZlclN0YXRlKCk7CgkJCQkJCQlpZiAoc3RhdGUgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7CgkJCQkJCQkJaWYgKHNlcnZlcnNbal0uY2FuUmVzdGFydE1vZHVsZShtb2R1bGUpKSB7CgkJCQkJCQkJCXRyeSB7CgkJCQkJCQkJCQlzZXJ2ZXJzW2pdLnJlc3RhcnRNb2R1bGUobW9kdWxlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCQkJCVRyYWNlLnRyYWNlKCJFcnJvciByZXN0YXJ0aW5nIHByb2plY3QiLCBlKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCWRpYWxvZy5jbG9zZSgpOwoJCQl9CgkJfSk7Cgl9CgkKCS8qKgoJICogTm90aWZpZXMgdGhpcyBhY3Rpb24gZGVsZWdhdGUgdGhhdCB0aGUgc2VsZWN0aW9uIGluIHRoZSB3b3JrYmVuY2ggaGFzIGNoYW5nZWQuCgkgKiA8cD4KCSAqIEltcGxlbWVudGVycyBjYW4gdXNlIHRoaXMgb3Bwb3J0dW5pdHkgdG8gY2hhbmdlIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlCgkgKiBhY3Rpb24gb3IgdG8gbW9kaWZ5IG90aGVyIHByZXNlbnRhdGlvbiBwcm9wZXJ0aWVzLgoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiBwcm94eSB0aGF0IGhhbmRsZXMgcHJlc2VudGF0aW9uIHBvcnRpb24gb2YgdGhlIGFjdGlvbgoJICogQHBhcmFtIHNlbGVjdGlvbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaW4gdGhlIHdvcmtiZW5jaAoJICovCglwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbCkgewoJCWlmIChzZWwuaXNFbXB0eSgpIHx8ICEoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7CgkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKCQkJcmV0dXJuOwoJCX0KCQoJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOwoJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsZWN0Lml0ZXJhdG9yKCk7CgkJT2JqZWN0IHNlbGVjdGlvbiA9IGl0ZXJhdG9yLm5leHQoKTsKCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpIHx8IHNlbGVjdGlvbiA9PSBudWxsKSB7CgkJCS8vIG1vcmUgdGhhbiBvbmUgc2VsZWN0aW9uIChzaG91bGQgbmV2ZXIgaGFwcGVuKQoJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CgkJCXJldHVybjsKCQl9CgkKCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJUHJvamVjdCkpIHsKCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwoJCQlyZXR1cm47CgkJfQoJCgkJcHJvamVjdCA9IChJUHJvamVjdCkgc2VsZWN0aW9uOwoJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewoJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CgkJCXJldHVybjsKCQl9CgkKCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhwcm9qZWN0KTsKCQlpZiAobW9kdWxlcyAhPSBudWxsICYmIG1vZHVsZXMubGVuZ3RoID4gMCkgewoJCQlJTW9kdWxlIG1vZHVsZSA9IG1vZHVsZXNbMF07CgkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUobW9kdWxlLCBudWxsKTsKCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewoJCQkJaW50IHNpemUyID0gc2VydmVycy5sZW5ndGg7CgkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKCQkJCQlpbnQgc3RhdGUgPSBzZXJ2ZXJzW2pdLmdldFNlcnZlclN0YXRlKCk7CgkJCQkJaWYgKHN0YXRlID09IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewoJCQkJCQlpZiAoc2VydmVyc1tqXS5jYW5SZXN0YXJ0TW9kdWxlKG1vZHVsZSkpIHsKCQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Cgl9Cn0=