LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVMaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk1vZHVsZUV2ZW50OwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgTW9kdWxlIGltcGxlbWVudHMgSU1vZHVsZSB7Cglwcm90ZWN0ZWQgU3RyaW5nIGlkOwoJcHJvdGVjdGVkIFN0cmluZyBuYW1lOwoJcHJvdGVjdGVkIE1vZHVsZUZhY3RvcnkgZmFjdG9yeTsKCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbjsKCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwoJcHJvdGVjdGVkIE1vZHVsZURlbGVnYXRlIGRlbGVnYXRlOwoKCS8vIGNoYW5nZSBsaXN0ZW5lcnMKCXByaXZhdGUgdHJhbnNpZW50IExpc3QgbGlzdGVuZXJzOwoKCS8qKgoJICogTW9kdWxlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBNb2R1bGUoTW9kdWxlRmFjdG9yeSBmYWN0b3J5LCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIElQcm9qZWN0IHByb2plY3QpIHsKCQlzdXBlcigpOwoJCXRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CgkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKCQl0aGlzLnR5cGUgPSB0eXBlOwoJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CgkJdGhpcy5pZCA9IGlkOwoJCXRoaXMubmFtZSA9IG5hbWU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIG1vZHVsZS4KCSAqCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKCQlyZXR1cm4gZmFjdG9yeS5nZXRJZCgpICsgIjoiICsgaWQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCAocGFydGlhbCkgaWQgb2YgdGhpcyBtb2R1bGUuCgkgKgoJICogQHJldHVybiB0aGUgaWQKCSAqLwoJcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbElkKCkgewoJCXJldHVybiBpZDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBtb2R1bGUuCgkgKiAKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIElNb2R1bGVUeXBlIGdldE1vZHVsZVR5cGUoKSB7CgkJcmV0dXJuIG5ldyBNb2R1bGVUeXBlKHR5cGUsIHZlcnNpb24pOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgd29ya2JlbmNoIHByb2plY3QgdGhhdCB0aGlzIG1vZHVsZSBpcyBjb250YWluZWQgaW4sCgkgKiBvciBudWxsIGlmIHRoZSBtb2R1bGUgaXMgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlLgoJICogCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0CgkgKi8KCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewoJCXJldHVybiBwcm9qZWN0OwoJfQoKCS8qCgkgKiBAc2VlIElNb2R1bGUjZ2V0TmFtZSgpCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKCQlyZXR1cm4gbmFtZTsKCX0KCglwcm90ZWN0ZWQgTW9kdWxlRGVsZWdhdGUgZ2V0RGVsZWdhdGUoKSB7CgkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKCQkJdHJ5IHsKCQkJCWRlbGVnYXRlID0gZmFjdG9yeS5nZXREZWxlZ2F0ZSgpLmdldE1vZHVsZURlbGVnYXRlKHRoaXMpOwoJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGNyZWF0ZSBkZWxlZ2F0ZSIgKyB0b1N0cmluZygpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQkJfQoJCX0KCQlyZXR1cm4gZGVsZWdhdGU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGVzIG9mIHRoaXMgbW9kdWxlLgoJICoKCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVbXQoJICovCglwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQl0cnkgewoJCQlyZXR1cm4gZ2V0RGVsZWdhdGUoKS5nZXRDaGlsZE1vZHVsZXMoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIGdldENoaWxkTW9kdWxlcygpICIgKyB0b1N0cmluZygpLCBlKTsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSB2YWxpZGF0aW9uIHN0YXR1cyBvZiB0aGUgbW9kdWxlLgoJICogCgkgKiBAcmV0dXJuCgkgKi8KCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCXRyeSB7CgkJCXJldHVybiBnZXREZWxlZ2F0ZSgpLnZhbGlkYXRlKCk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FsbGluZyBkZWxlZ2F0ZSB2YWxpZGF0ZSgpICIgKyB0b1N0cmluZygpLCBlKTsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoJCgkvKioKCSAqIEFkZCBhIGxpc3RlbmVyIGZvciB0aGUgbW9kdWxlLgoJICoKCSAqIEBwYXJhbSBsaXN0ZW5lciBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIGFkZE1vZHVsZUxpc3RlbmVyKElNb2R1bGVMaXN0ZW5lciBsaXN0ZW5lcikgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkFkZGluZyBtb2R1bGUgbGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiB0byAiICsgdGhpcyk7CgkKCQlpZiAobGlzdGVuZXJzID09IG51bGwpCgkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKCQllbHNlIGlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQoJCQlyZXR1cm47CgkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Cgl9CgkKCS8qKgoJICogQWRkIGEgbGlzdGVuZXIgZm9yIHRoZSBtb2R1bGUuCgkgKgoJICogQHBhcmFtIGxpc3RlbmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlTGlzdGVuZXIKCSAqLwoJcHVibGljIHZvaWQgcmVtb3ZlTW9kdWxlTGlzdGVuZXIoSU1vZHVsZUxpc3RlbmVyIGxpc3RlbmVyKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiUmVtb3ZpbmcgbW9kdWxlIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgZnJvbSAiICsgdGhpcyk7CgkKCQlpZiAobGlzdGVuZXJzICE9IG51bGwpCgkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwoJfQoJCgkvKioKCSAqIEZpcmUgYSBtb2R1bGUgY2hhbmdlIGV2ZW50LgoJICovCglwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kdWxlQ2hhbmdlRXZlbnQoYm9vbGVhbiBpc0NoYW5nZSwgSU1vZHVsZVtdIGFkZGVkLCBJTW9kdWxlW10gY2hhbmdlZCwgSU1vZHVsZVtdIHJlbW92ZWQpIHsKCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gRmlyaW5nIG1vZHVsZSBjaGFuZ2UgZXZlbnQ6ICIgKyBnZXROYW1lKCkgKyAiICgiICsgaXNDaGFuZ2UgKyAiKSAtPi0iKTsKCQoJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCB8fCBsaXN0ZW5lcnMuaXNFbXB0eSgpKQoJCQlyZXR1cm47CgkKCQlpbnQgc2l6ZSA9IGxpc3RlbmVycy5zaXplKCk7CgkJSU1vZHVsZUxpc3RlbmVyW10gZGNsID0gbmV3IElNb2R1bGVMaXN0ZW5lcltzaXplXTsKCQlsaXN0ZW5lcnMudG9BcnJheShkY2wpOwoJCQoJCU1vZHVsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZHVsZUV2ZW50KHRoaXMsIGlzQ2hhbmdlLCBhZGRlZCwgY2hhbmdlZCwgcmVtb3ZlZCk7CgkKCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQl0cnkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiICBGaXJpbmcgbW9kdWxlIGNoYW5nZSBldmVudCB0bzogIiArIGRjbFtpXSk7CgkJCQlkY2xbaV0ubW9kdWxlQ2hhbmdlZChldmVudCk7CgkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICIgIEVycm9yIGZpcmluZyBtb2R1bGUgY2hhbmdlIGV2ZW50IiwgZSk7CgkJCX0KCQl9CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLTwtIERvbmUgZmlyaW5nIG1vZHVsZSBjaGFuZ2UgZXZlbnQgLTwtIik7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CgkJTW9kdWxlRGVsZWdhdGUgZGVsZWdhdGUyID0gZ2V0RGVsZWdhdGUoKTsKCQlpZiAoYWRhcHRlci5pc0luc3RhbmNlKGRlbGVnYXRlMikpCgkJCXJldHVybiBkZWxlZ2F0ZTsKCQlyZXR1cm4gbnVsbDsKCX0KCQoJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKCQlpZiAoIShvYmogaW5zdGFuY2VvZiBNb2R1bGUpKQoJCQlyZXR1cm4gZmFsc2U7CgkJCgkJTW9kdWxlIG0gPSAoTW9kdWxlKSBvYmo7CgkJaWYgKCFmYWN0b3J5LmVxdWFscyhtLmZhY3RvcnkpKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKCFpZC5lcXVhbHMobS5pZCkpCgkJCXJldHVybiBmYWxzZTsKCQlpZiAoIXByb2plY3QuZXF1YWxzKG0ucHJvamVjdCkpCgkJCXJldHVybiBmYWxzZTsKCQlpZiAoIXR5cGUuZXF1YWxzKG0udHlwZSkpCgkJCXJldHVybiBmYWxzZTsKCQlpZiAoIXZlcnNpb24uZXF1YWxzKG0udmVyc2lvbikpCgkJCXJldHVybiBmYWxzZTsKCQkKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJcmV0dXJuICJNb2R1bGVbIiArIGdldElkKCkgKyAiXSI7Cgl9Cn0=