LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCiAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwud2l6YXJkczsKCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwuSUpwYVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuQ29ubmVjdGlvblByb2ZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGIuaW50ZXJuYWwuU2NoZW1hOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLmludGVybmFsLlRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5FbnRpdHlHZW5lcmF0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKCnB1YmxpYyBjbGFzcyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsJCgoJcHJpdmF0ZSBJSnBhUHJvamVjdCBqcGFQcm9qZWN0OwoKCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwoKCS8qKiB0aGlzIHBhZ2UgaXMgb25seSBidWlsdCB3aGVuIHRoZSBwcm9qZWN0IGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGRiICovCglwcml2YXRlIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKCglwcml2YXRlIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlIGdlbmVyYXRlRW50aXRpZXNQYWdlOwoKCXByaXZhdGUgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUdlbmVyYXRvckNvbmZpZzsKCglwcml2YXRlIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5R2VuZXJhdG9yQ29uZmlnOwoKCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwoJCglwcml2YXRlIENvbGxlY3Rpb248VGFibGU+IHNlbGVjdGVkVGFibGVzOwoKCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKCBJSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKCQlzdXBlcigpOwoJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7CgkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CgkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnID0gbmV3IFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnKCk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcgPSBuZXcgRW50aXR5R2VuZXJhdG9yLkNvbmZpZygpOwoJCXRoaXMuc2V0V2luZG93VGl0bGUoIEpwdFVpTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzKTsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKCQlzdXBlci5hZGRQYWdlcygpOwoJCXRoaXMuZGJTZXR0aW5nc1BhZ2UgPSBuZXcgRGF0YWJhc2VSZWNvbm5lY3RXaXphcmRQYWdlKCB0aGlzLmpwYVByb2plY3QpOwoJCXRoaXMuYWRkUGFnZSh0aGlzLmRiU2V0dGluZ3NQYWdlKTsKCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlID0gbmV3IEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlKCk7CgkJdGhpcy5hZGRQYWdlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlKTsKCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmluaXQoIHRoaXMuc2VsZWN0aW9uKTsKCX0KCQoJQE92ZXJyaWRlCglwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewoJCXRoaXMucGFja2FnZUdlbmVyYXRvckNvbmZpZy5zZXRQYWNrYWdlRnJhZ21lbnQoIHRoaXMuYnVpbGRQYWNrYWdlRnJhZ21lbnQoKSk7CgoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbnZlcnRUb0NhbWVsQ2FzZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5jb252ZXJ0VG9DYW1lbENhc2UoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0RmllbGRBY2Nlc3NUeXBlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmZpZWxkQWNjZXNzVHlwZSgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRDb2xsZWN0aW9uVHlwZU5hbWUoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEZpZWxkVmlzaWJpbGl0eSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRGaWVsZFZpc2liaWxpdHkoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0TWV0aG9kVmlzaWJpbGl0eSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRNZXRob2RWaXNpYmlsaXR5KCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlR2V0dGVyc0FuZFNldHRlcnMoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycygpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvcigpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRTZXJpYWxpemFibGUoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2Uuc2VyaWFsaXphYmxlKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZVNlcmlhbFZlcnNpb25VSUQoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVFbWJlZGRlZElkRm9yQ29tcG91bmRQSyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldE92ZXJyaWRlRW50aXR5TmFtZXMoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0T3ZlcnJpZGVFbnRpdHlOYW1lcygpKTsKCgkJdGhpcy5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5zeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCk7CgkJCgkJdGhpcy5zZWxlY3RlZFRhYmxlcyA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0U2VsZWN0ZWRUYWJsZXMoKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGJ1aWxkUGFja2FnZUZyYWdtZW50KCkgewoJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UGFja2FnZUZyYWdtZW50KCk7CgkJCgkJaWYgKCBwYWNrYWdlRnJhZ21lbnQgPT0gbnVsbCkgewoJCQlwYWNrYWdlRnJhZ21lbnQ9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KCAiIik7IC8vJE5PTi1OTFMtMSQKCQl9CgkJCgkJaWYgKCBwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpIHsKCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKCQl9CgoJCXRyeSB7CgkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290LmNyZWF0ZVBhY2thZ2VGcmFnbWVudCggcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCksIHRydWUsIG51bGwpOwoJCX0gCgkJY2F0Y2ggKCBKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGV4KTsKCQl9Cgl9CgkKCUNvbGxlY3Rpb248VGFibGU+IGdldFBvc3NpYmxlVGFibGVzKCkgewoJCWlmICggdGhpcy5kYlNldHRpbmdzUGFnZSAhPSBudWxsKSB7CgkJCXJldHVybiB0aGlzLmRiU2V0dGluZ3NQYWdlLmdldFRhYmxlcygpOwoJCX0KCQlyZXR1cm4gKCB0aGlzLnByb2plY3REZWZhdWx0U2NoZW1hRXhpc3RzKCkpID8gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLnRhYmxlcygpKSA6IENvbGxlY3Rpb25zLjxUYWJsZT5lbXB0eUxpc3QoKTsKCX0KCQoJQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewoJCXJldHVybiB0aGlzLmpwYVByb2plY3QuY29ubmVjdGlvblByb2ZpbGUoKTsKCX0KCQoJSUpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpewoJCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Cgl9CgoJU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7CgkJcmV0dXJuIGdldFByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmRlZmF1bHRTY2hlbWEoKTsKCX0KCQoJcHVibGljIFBhY2thZ2VHZW5lcmF0b3IuQ29uZmlnIGdldFBhY2thZ2VHZW5lcmF0b3JDb25maWcoKSB7CgkJcmV0dXJuIHRoaXMucGFja2FnZUdlbmVyYXRvckNvbmZpZzsKCX0KCglwdWJsaWMgRW50aXR5R2VuZXJhdG9yLkNvbmZpZyBnZXRFbnRpdHlHZW5lcmF0b3JDb25maWcoKSB7CgkJcmV0dXJuIHRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnOwoJfQoKCXB1YmxpYyBDb2xsZWN0aW9uPFRhYmxlPiBnZXRTZWxlY3RlZFRhYmxlcygpIHsKCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFRhYmxlczsKCX0KCQoJcHVibGljIGJvb2xlYW4gc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbCgpewoJCXJldHVybiB0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWw7Cgl9CgkKICAgIEBPdmVycmlkZQoJcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewogICAgICAgIGJvb2xlYW4gY2FuRmluaXNoID0gdHJ1ZTsKICAgICAgICBpZiAoICEgdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7CiAgICAgICAgCWNhbkZpbmlzaCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2FuRmluaXNoOwogICAgfQoKCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpIHsKCQlyZXR1cm4gKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSAhPSBudWxsKTsKCX0KCQoJLyoqCgkgKiB1cGRhdGVQb3NzaWJsZVRhYmxlcyBpcyBjYWxsZWQgd2hlbiBzY2hlbWGScyBQb3NzaWJsZVRhYmxlcyBjaGFuZ2VkLgoJICogVGhlIGRiU2V0dGluZ3NQYWdlIGlzIG1haW5seSB0aGUgc291cmNlIG9mIGNoYW5nZXMsIAoJICogYW5kIHRoZSBnZW5lcmF0ZUVudGl0aWVzUGFnZSBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMuCgkgKi8KCXZvaWQgdXBkYXRlUG9zc2libGVUYWJsZXMoIENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7CgkJdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS51cGRhdGVUYWJsZXNMaXN0Vmlld2VyKCBwb3NzaWJsZVRhYmxlcyk7Cgl9Cgp9Cg==