LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VSdWxlRmFjdG9yeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKLyoqCiAqIEpvYiB0byBwdWJsaXNoIHRvIGEgcGFydGljdWxhciBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgUHVibGlzaFNlcnZlckpvYiBleHRlbmRzIEpvYiB7Cglwcm90ZWN0ZWQgSVNlcnZlciBzZXJ2ZXI7Cglwcm90ZWN0ZWQgaW50IGtpbmQ7Cglwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjazsgCgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgcHVibGlzaGluZyBqb2IuCgkgKiAKCSAqIEBwYXJhbSBzZXJ2ZXIgdGhlIHNlcnZlciB0byBwdWJsaXNoIHRvCgkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBwdWJsaXNoCgkgKiBAcGFyYW0gY2hlY2sKCSAqLwoJcHVibGljIFB1Ymxpc2hTZXJ2ZXJKb2IoSVNlcnZlciBzZXJ2ZXIsIGludCBraW5kLCBib29sZWFuIGNoZWNrKSB7CgkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMucHVibGlzaGluZywgc2VydmVyLmdldE5hbWUoKSkpOwoJCXRoaXMuc2VydmVyID0gc2VydmVyOwoJCXRoaXMua2luZCA9IGtpbmQ7CgkJdGhpcy5jaGVjayA9IGNoZWNrOwoJCQoJCUlSZXNvdXJjZVJ1bGVGYWN0b3J5IHJ1bGVGYWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCk7CgkJCgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKCQlpbnQgc2l6ZSA9IG1vZHVsZXMubGVuZ3RoOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGVzW2ldLmdldFByb2plY3QoKTsKCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewoJCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGUgPSBydWxlRmFjdG9yeS5jcmVhdGVSdWxlKHByb2plY3QpOwoJCQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhydWxlKSkKCQkJCQlsaXN0LmFkZChydWxlKTsKCQkJCQoJCQkJcnVsZSA9IHJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUocHJvamVjdCk7CgkJCQlpZiAocnVsZSAhPSBudWxsICYmICFsaXN0LmNvbnRhaW5zKHJ1bGUpKQoJCQkJCWxpc3QuYWRkKHJ1bGUpOwoJCQkJCgkJCQlydWxlID0gcnVsZUZhY3RvcnkudmFsaWRhdGVFZGl0UnVsZShuZXcgSVJlc291cmNlW10geyBwcm9qZWN0IH0pOwoJCQkJaWYgKHJ1bGUgIT0gbnVsbCAmJiAhbGlzdC5jb250YWlucyhydWxlKSkKCQkJCQlsaXN0LmFkZChydWxlKTsKCQkJCQoJCQkJcnVsZSA9IHJ1bGVGYWN0b3J5Lm1hcmtlclJ1bGUocHJvamVjdCk7CgkJCQlpZiAocnVsZSAhPSBudWxsICYmICFsaXN0LmNvbnRhaW5zKHJ1bGUpKQoJCQkJCWxpc3QuYWRkKHJ1bGUpOwoJCQkJCgkJCQlydWxlID0gcnVsZUZhY3RvcnkucmVmcmVzaFJ1bGUocHJvamVjdCk7CgkJCQlpZiAocnVsZSAhPSBudWxsICYmICFsaXN0LmNvbnRhaW5zKHJ1bGUpKQoJCQkJCWxpc3QuYWRkKHJ1bGUpOwoJCQl9CgkJfQoJCQoJCXNpemUgPSBsaXN0LnNpemUoKTsKCQlJU2NoZWR1bGluZ1J1bGVbXSBydWxlcyA9IG5ldyBJU2NoZWR1bGluZ1J1bGVbc2l6ZSArIDFdOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQoJCQlydWxlc1tpXSA9IChJU2NoZWR1bGluZ1J1bGUpIGxpc3QuZ2V0KGkpOwoJCQoJCXJ1bGVzW3NpemVdID0gbmV3IFNlcnZlclNjaGVkdWxpbmdSdWxlKHNlcnZlcik7CgkJc2V0UnVsZShNdWx0aVJ1bGUuY29tYmluZShydWxlcykpOwoJCQoJCWlmIChraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9BVVRPKQoJCQlzZXRVc2VyKHRydWUpOwoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IHB1Ymxpc2hpbmcgam9iLgoJICogCgkgKiBAcGFyYW0gc2VydmVyIHRoZSBzZXJ2ZXIgdG8gcHVibGlzaCB0bwoJICovCglwdWJsaWMgUHVibGlzaFNlcnZlckpvYihJU2VydmVyIHNlcnZlcikgewoJCXRoaXMoc2VydmVyLCBJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIHRydWUpOwoJfQoKCS8qKgoJICogQHNlZSBKb2Ijc2hvdWxkUnVuKCkKCSAqLwoJcHVibGljIGJvb2xlYW4gc2hvdWxkUnVuKCkgewoJCWlmICghY2hlY2spCgkJCXJldHVybiB0cnVlOwoJCXJldHVybiBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSAmJiAoKFNlcnZlcilzZXJ2ZXIpLnNob3VsZFB1Ymxpc2goKTsKCX0KCgkvKioKCSAqIEBzZWUgSm9iI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQoJICovCglwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CgkJcmV0dXJuIHNlcnZlci5wdWJsaXNoKGtpbmQsIG1vbml0b3IpOwoJfQp9