LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7Ci8qKgogKiBKb2IgdG8gcHVibGlzaCB0byBhIHBhcnRpY3VsYXIgc2VydmVyLgogKi8KcHVibGljIGNsYXNzIFB1Ymxpc2hTZXJ2ZXJKb2IgZXh0ZW5kcyBEZXBlbmRhbnRKb2IgewoJcHJvdGVjdGVkIGludCBraW5kOwoJcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2s7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCgkgKiAKCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byBwdWJsaXNoIHRvCgkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCgkgKiBAcGFyYW0gY2hlY2sKCSAqLwoJcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBib29sZWFuIGNoZWNrKSB7CgkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgc2VydmVyLmdldE5hbWUoKSksIHNlcnZlcik7CgkJdGhpcy5raW5kID0ga2luZDsKCQl0aGlzLmNoZWNrID0gY2hlY2s7CgkJCgkJSVJlc291cmNlUnVsZUZhY3RvcnkgcnVsZUZhY3RvcnkgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKTsKCQkKCQkvLyAxMDIyMjcgLSBsb2NrIGVudGlyZSB3b3Jrc3BhY2UgZHVyaW5nIHB1Ymxpc2gKCQkvLyBUT0RPIHdpbGwgaGF2ZSB0byByZXZpc2l0IHBvc3QgMC43IHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8KCQkvLyBkbyB0aGlzLCBzaW5jZSBpdCB3b3VsZCBiZSBwcmVmZXJyYWJsZSBub3QgdG8gbG9jayB0aGUgZW50aXJlIHdvcmtzcGFjZSwgYW5kCgkJLy8gdGhlcmVmb3JlIGFsbG93IG11bHRpcGxlIHNlcnZlcnMgdG8gcHVibGlzaCBhdCBvbmNlCgkJCgkJLy8gZmluZCBhbGwgcHJvamVjdHMgdGhhdCBtb2R1bGVzIGFyZSBpbgoJCS8qTGlzdCBwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCQlJdGVyYXRvciBpdGVyYXRvciA9ICgoU2VydmVyKXNlcnZlcikuZ2V0QWxsTW9kdWxlcygpLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIGl0ZXJhdG9yLm5leHQoKTsKCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZXNbbW9kdWxlcy5sZW5ndGggLSAxXS5nZXRQcm9qZWN0KCk7CgkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3RMaXN0LmNvbnRhaW5zKHByb2plY3QpKQoJCQkJcHJvamVjdExpc3QuYWRkKHByb2plY3QpOwoJCX0KCQkKCQkvLyBhZGQgZGVwZW5kYW50IHByb2plY3RzCgkJaXRlcmF0b3IgPSBwcm9qZWN0TGlzdC5pdGVyYXRvcigpOwoJCUxpc3QgZGVwUHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIHVzZSB0byBhdm9pZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwoJCQl0cnkgewoJCQkJSVByb2plY3RbXSByZWZzID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwoJCQkJaWYgKHJlZnMgIT0gbnVsbCkgewoJCQkJCWludCBzaXplID0gcmVmcy5sZW5ndGg7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCgkJCQkJCWlmIChyZWZzW2ldICE9IG51bGwgJiYgIXByb2plY3RMaXN0LmNvbnRhaW5zKHJlZnNbaV0pICYmICFkZXBQcm9qZWN0TGlzdC5jb250YWlucyhyZWZzW2ldKSkKCQkJCQkJCWRlcFByb2plY3RMaXN0LmFkZChyZWZzW2ldKTsKCQkJCX0KCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBjb21wdXRlIHJlZmVyZW5jZWQgcHJvamVjdHMiLCBjZSk7CgkJCX0KCQl9CgkJCgkJaXRlcmF0b3IgPSBkZXBQcm9qZWN0TGlzdC5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJcHJvamVjdExpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7CgkJfQoJCQoJCS8vIGNvbWJpbmUgYW5kIGJ1aWxkIGFsbCB0aGUgcnVsZXMKCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CgkJaXRlcmF0b3IgPSBwcm9qZWN0TGlzdC5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwoJCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUocHJvamVjdCk7CgkJCWlmIChydWxlICE9IG51bGwgJiYgIWxpc3QuY29udGFpbnMocnVsZSkpCgkJCQlsaXN0LmFkZChydWxlKTsKCQkJCgkJCXJ1bGUgPSBydWxlRmFjdG9yeS5tb2RpZnlSdWxlKHByb2plY3QpOwoJCQlpZiAocnVsZSAhPSBudWxsICYmICFsaXN0LmNvbnRhaW5zKHJ1bGUpKQoJCQkJbGlzdC5hZGQocnVsZSk7CgkJCQoJCQlydWxlID0gcnVsZUZhY3RvcnkudmFsaWRhdGVFZGl0UnVsZShuZXcgSVJlc291cmNlW10geyBwcm9qZWN0IH0pOwoJCQlpZiAocnVsZSAhPSBudWxsICYmICFsaXN0LmNvbnRhaW5zKHJ1bGUpKQoJCQkJbGlzdC5hZGQocnVsZSk7CgkJCQoJCQlydWxlID0gcnVsZUZhY3RvcnkubWFya2VyUnVsZShwcm9qZWN0KTsKCQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhydWxlKSkKCQkJCWxpc3QuYWRkKHJ1bGUpOwoJCQkKCQkJcnVsZSA9IHJ1bGVGYWN0b3J5LnJlZnJlc2hSdWxlKHByb2plY3QpOwoJCQlpZiAocnVsZSAhPSBudWxsICYmICFsaXN0LmNvbnRhaW5zKHJ1bGUpKQoJCQkJbGlzdC5hZGQocnVsZSk7CgkJfQoJCQoJCWludCBzaXplID0gbGlzdC5zaXplKCk7CgkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlW3NpemUgKyAxXTsKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKCQkJcnVsZXNbaV0gPSAoSVNjaGVkdWxpbmdSdWxlKSBsaXN0LmdldChpKTsKCQkKCQlydWxlc1tzaXplXSA9IG5ldyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShzZXJ2ZXIpOyovCgkJCgkJSVNjaGVkdWxpbmdSdWxlW10gcnVsZXMgPSBuZXcgSVNjaGVkdWxpbmdSdWxlWzJdOwoJCXJ1bGVzWzBdID0gcnVsZUZhY3RvcnkuY3JlYXRlUnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKCQlydWxlc1sxXSA9IG5ldyBTZXJ2ZXJTY2hlZHVsaW5nUnVsZShzZXJ2ZXIpOwoJCQoJCXNldFJ1bGUoTXVsdGlSdWxlLmNvbWJpbmUocnVsZXMpKTsKCQkKCQlpZiAoa2luZCAhPSBJU2VydmVyLlBVQkxJU0hfQVVUTykKCQkJc2V0VXNlcih0cnVlKTsKCX0KCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBwdWJsaXNoaW5nIGpvYi4KCSAqIAoJICogQHBhcmFtIHNlcnZlciB0aGUgc2VydmVyIHRvIHB1Ymxpc2ggdG8KCSAqLwoJcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIpIHsKCQl0aGlzKHNlcnZlciwgSVNlcnZlci5QVUJMSVNIX0lOQ1JFTUVOVEFMLCB0cnVlKTsKCX0KCgkvKioKCSAqIEBzZWUgSm9iI3Nob3VsZFJ1bigpCgkgKi8KCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKCQlpZiAoIXN1cGVyLnNob3VsZFJ1bigpKQoJCQlyZXR1cm4gZmFsc2U7CgkJCgkJaWYgKCFjaGVjaykKCQkJcmV0dXJuIHRydWU7CgkJcmV0dXJuIFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuaXNBdXRvUHVibGlzaGluZygpICYmICgoU2VydmVyKXNlcnZlcikuc2hvdWxkUHVibGlzaCgpOwoJfQoKCS8qKgoJICogQHNlZSBKb2IjcnVuKElQcm9ncmVzc01vbml0b3IpCgkgKi8KCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlyZXR1cm4gc2VydmVyLnB1Ymxpc2goa2luZCwgbW9uaXRvcik7Cgl9Cn0=