LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuUHVibGlzaFNlcnZlckpvYjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuUmVzdGFydFNlcnZlckpvYjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuU2VydmVyVUlQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlVJRGVjb3JhdG9yTWFuYWdlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwovKioKICogUmVzdGFydCBhIHNlcnZlci4KICovCnB1YmxpYyBjbGFzcyBSZXN0YXJ0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBY3Rpb24gewoJcHJvdGVjdGVkIFN0cmluZyBtb2RlOwoKCXB1YmxpYyBSZXN0YXJ0QWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyBuYW1lKSB7CgkJdGhpcyhzaGVsbCwgc2VsZWN0aW9uUHJvdmlkZXIsIG5hbWUsIG51bGwpOwoJfQoKCXB1YmxpYyBSZXN0YXJ0QWN0aW9uKFNoZWxsIHNoZWxsLCBJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZSkgewoJCXN1cGVyKHNoZWxsLCBzZWxlY3Rpb25Qcm92aWRlciwgbmFtZSk7CgkJdHJ5IHsKCQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJdGhpcy5tb2RlID0gbW9kZTsKCX0KCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgc2VydmVyIGNhbiBjdXJyZW50bHkgYmUgYWN0ZWQgb24uCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCgkgKi8KCXB1YmxpYyBib29sZWFuIGFjY2VwdChJU2VydmVyIHNlcnZlcikgewoJCVN0cmluZyBtb2RlMiA9IG1vZGU7CgkJaWYgKG1vZGUyID09IG51bGwpCgkJCW1vZGUyID0gc2VydmVyLmdldE1vZGUoKTsKCQlyZXR1cm4gc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsICYmIFVJRGVjb3JhdG9yTWFuYWdlci5nZXRVSURlY29yYXRvcihzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpKS5jYW5SZXN0YXJ0KCkgJiYgc2VydmVyLmNhblJlc3RhcnQobW9kZTIpLmlzT0soKTsKCX0KCgkvKioKCSAqIFBlcmZvcm0gYWN0aW9uIG9uIHRoaXMgc2VydmVyLgoJICogQHBhcmFtIHNlcnZlciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcgoJICovCglwdWJsaWMgdm9pZCBwZXJmb3JtKElTZXJ2ZXIgc2VydmVyKSB7CgkJaWYgKCFTZXJ2ZXJVSVBsdWdpbi5wcm9tcHRJZkRpcnR5KHNoZWxsLCBzZXJ2ZXIpKQoJCQlyZXR1cm47CgkJCgkJSVByb2dyZXNzTW9uaXRvciBwbSA9IFBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5jcmVhdGVQcm9ncmVzc0dyb3VwKCk7CgkJdHJ5IHsKCQkJcG0uYmVnaW5UYXNrKCJSZXN0YXJ0aW5nIiwgMTAwKTsKCQkJUHVibGlzaFNlcnZlckpvYiBwdWJsaXNoSm9iID0gbmV3IFB1Ymxpc2hTZXJ2ZXJKb2Ioc2VydmVyKTsgCgkJCXB1Ymxpc2hKb2Iuc2V0UHJvZ3Jlc3NHcm91cChwbSwgNTApOwoJCQlwdWJsaXNoSm9iLnNjaGVkdWxlKCk7CgkJCVN0cmluZyBsYXVuY2hNb2RlID0gbW9kZTsKCQkJaWYgKGxhdW5jaE1vZGUgPT0gbnVsbCkKCQkJCWxhdW5jaE1vZGUgPSBzZXJ2ZXIuZ2V0TW9kZSgpOwoJCQlSZXN0YXJ0U2VydmVySm9iIHJlc3RhcnRKb2IgPSBuZXcgUmVzdGFydFNlcnZlckpvYihzZXJ2ZXIsIGxhdW5jaE1vZGUpOwoJCQlyZXN0YXJ0Sm9iLnNldFByb2dyZXNzR3JvdXAocG0sIDUwKTsKCQkJcmVzdGFydEpvYi5zY2hlZHVsZSgpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0gZmluYWxseSB7CgkJCXBtLmRvbmUoKTsKCQl9CQoJfQp9