LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCiAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC51aS5pbnRlcm5hbC53aXphcmRzOwoKaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwppbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29yZS5KcGFQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLkNvbm5lY3Rpb25Qcm9maWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRiLlNjaGVtYTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYi5UYWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5nZW4uaW50ZXJuYWwuRW50aXR5R2VuZXJhdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0Lmdlbi5pbnRlcm5hbC5QYWNrYWdlR2VuZXJhdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuanB0LnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7CmltcG9ydCBvcmcuZWNsaXBzZS5qcHQudXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7CgpwdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc1dpemFyZCBleHRlbmRzIFdpemFyZCB7CQoKCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwoKCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwoKCS8qKiB0aGlzIHBhZ2UgaXMgb25seSBidWlsdCB3aGVuIHRoZSBwcm9qZWN0IGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGRiICovCglwcml2YXRlIERhdGFiYXNlUmVjb25uZWN0V2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKCglwcml2YXRlIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlIGdlbmVyYXRlRW50aXRpZXNQYWdlOwoKCXByaXZhdGUgUGFja2FnZUdlbmVyYXRvci5Db25maWcgcGFja2FnZUdlbmVyYXRvckNvbmZpZzsKCglwcml2YXRlIEVudGl0eUdlbmVyYXRvci5Db25maWcgZW50aXR5R2VuZXJhdG9yQ29uZmlnOwoKCXByaXZhdGUgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sOwoJCglwcml2YXRlIENvbGxlY3Rpb248VGFibGU+IHNlbGVjdGVkVGFibGVzOwoKCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkKCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewoJCXN1cGVyKCk7CgkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKCQl0aGlzLnBhY2thZ2VHZW5lcmF0b3JDb25maWcgPSBuZXcgUGFja2FnZUdlbmVyYXRvci5Db25maWcoKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZyA9IG5ldyBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnKCk7CgkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlNZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwoJfQoJCglAT3ZlcnJpZGUKCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewoJCXN1cGVyLmFkZFBhZ2VzKCk7CgkJdGhpcy5kYlNldHRpbmdzUGFnZSA9IG5ldyBEYXRhYmFzZVJlY29ubmVjdFdpemFyZFBhZ2UoIHRoaXMuanBhUHJvamVjdCk7CgkJdGhpcy5hZGRQYWdlKHRoaXMuZGJTZXR0aW5nc1BhZ2UpOwoJCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UgPSBuZXcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2UoKTsKCQl0aGlzLmFkZFBhZ2UoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UpOwoJCXRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuaW5pdCggdGhpcy5zZWxlY3Rpb24pOwoJfQoJCglAT3ZlcnJpZGUKCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CgkJdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnLnNldFBhY2thZ2VGcmFnbWVudCggdGhpcy5idWlsZFBhY2thZ2VGcmFnbWVudCgpKTsKCgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0Q29udmVydFRvQ2FtZWxDYXNlKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmNvbnZlcnRUb0NhbWVsQ2FzZSgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRGaWVsZEFjY2Vzc1R5cGUoIHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZmllbGRBY2Nlc3NUeXBlKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldENvbGxlY3Rpb25UeXBlTmFtZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0RmllbGRWaXNpYmlsaXR5KCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldEZpZWxkVmlzaWJpbGl0eSgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRNZXRob2RWaXNpYmlsaXR5KCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdldE1ldGhvZFZpc2liaWxpdHkoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVHZXR0ZXJzQW5kU2V0dGVycyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZW5lcmF0ZUdldHRlcnNBbmRTZXR0ZXJzKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldEdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yKCkpOwoJCXRoaXMuZW50aXR5R2VuZXJhdG9yQ29uZmlnLnNldFNlcmlhbGl6YWJsZSggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5zZXJpYWxpemFibGUoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0R2VuZXJhdGVTZXJpYWxWZXJzaW9uVUlEKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlU2VyaWFsVmVyc2lvblVJRCgpKTsKCQl0aGlzLmVudGl0eUdlbmVyYXRvckNvbmZpZy5zZXRHZW5lcmF0ZUVtYmVkZGVkSWRGb3JDb21wb3VuZFBLKCB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmdlbmVyYXRlRW1iZWRkZWRJZEZvckNvbXBvdW5kUEsoKSk7CgkJdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWcuc2V0T3ZlcnJpZGVFbnRpdHlOYW1lcyggdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRPdmVycmlkZUVudGl0eU5hbWVzKCkpOwoKCQl0aGlzLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwgPSB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnN5bmNocm9uaXplUGVyc2lzdGVuY2VYbWwoKTsKCQkKCQl0aGlzLnNlbGVjdGVkVGFibGVzID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRTZWxlY3RlZFRhYmxlcygpOwoJCXJldHVybiB0cnVlOwoJfQoJCglwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgYnVpbGRQYWNrYWdlRnJhZ21lbnQoKSB7CgkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHRoaXMuZ2VuZXJhdGVFbnRpdGllc1BhZ2UuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpOwoJCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gdGhpcy5nZW5lcmF0ZUVudGl0aWVzUGFnZS5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKCQkKCQlpZiAoIHBhY2thZ2VGcmFnbWVudCA9PSBudWxsKSB7CgkJCXBhY2thZ2VGcmFnbWVudD0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoICIiKTsgLy8kTk9OLU5MUy0xJAoJCX0KCQkKCQlpZiAoIHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSkgewoJCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50OwoJCX0KCgkJdHJ5IHsKCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KCBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7CgkJfSAKCQljYXRjaCAoIEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewoJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZXgpOwoJCX0KCX0KCQoJQ29sbGVjdGlvbjxUYWJsZT4gZ2V0UG9zc2libGVUYWJsZXMoKSB7CgkJaWYgKCB0aGlzLmRiU2V0dGluZ3NQYWdlICE9IG51bGwpIHsKCQkJcmV0dXJuIHRoaXMuZGJTZXR0aW5nc1BhZ2UuZ2V0VGFibGVzKCk7CgkJfQoJCXJldHVybiAoIHRoaXMucHJvamVjdERlZmF1bHRTY2hlbWFFeGlzdHMoKSkgPyBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbiggdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkudGFibGVzKCkpIDogQ29sbGVjdGlvbnMuPFRhYmxlPmVtcHR5TGlzdCgpOwoJfQoJCglDb25uZWN0aW9uUHJvZmlsZSBnZXRQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSB7CgkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwoJfQoJCglKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OwoJfQoKCVNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCkgewoJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwoJfQoJCglwdWJsaWMgUGFja2FnZUdlbmVyYXRvci5Db25maWcgZ2V0UGFja2FnZUdlbmVyYXRvckNvbmZpZygpIHsKCQlyZXR1cm4gdGhpcy5wYWNrYWdlR2VuZXJhdG9yQ29uZmlnOwoJfQoKCXB1YmxpYyBFbnRpdHlHZW5lcmF0b3IuQ29uZmlnIGdldEVudGl0eUdlbmVyYXRvckNvbmZpZygpIHsKCQlyZXR1cm4gdGhpcy5lbnRpdHlHZW5lcmF0b3JDb25maWc7Cgl9CgoJcHVibGljIENvbGxlY3Rpb248VGFibGU+IGdldFNlbGVjdGVkVGFibGVzKCkgewoJCXJldHVybiB0aGlzLnNlbGVjdGVkVGFibGVzOwoJfQoJCglwdWJsaWMgYm9vbGVhbiBzeW5jaHJvbml6ZVBlcnNpc3RlbmNlWG1sKCl7CgkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVQZXJzaXN0ZW5jZVhtbDsKCX0KCQogICAgQE92ZXJyaWRlCglwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7CiAgICAgICAgYm9vbGVhbiBjYW5GaW5pc2ggPSB0cnVlOwogICAgICAgIGlmICggISB0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLmlzUGFnZUNvbXBsZXRlKCkpIHsKICAgICAgICAJY2FuRmluaXNoID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjYW5GaW5pc2g7CiAgICB9CgoJcHJpdmF0ZSBib29sZWFuIHByb2plY3REZWZhdWx0U2NoZW1hRXhpc3RzKCkgewoJCXJldHVybiAoIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpICE9IG51bGwpOwoJfQoJCgkvKioKCSAqIHVwZGF0ZVBvc3NpYmxlVGFibGVzIGlzIGNhbGxlZCB3aGVuIHNjaGVtYZJzIFBvc3NpYmxlVGFibGVzIGNoYW5nZWQuCgkgKiBUaGUgZGJTZXR0aW5nc1BhZ2UgaXMgbWFpbmx5IHRoZSBzb3VyY2Ugb2YgY2hhbmdlcywgCgkgKiBhbmQgdGhlIGdlbmVyYXRlRW50aXRpZXNQYWdlIG5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYy4KCSAqLwoJdm9pZCB1cGRhdGVQb3NzaWJsZVRhYmxlcyggQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKCQl0aGlzLmdlbmVyYXRlRW50aXRpZXNQYWdlLnVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIoIHBvc3NpYmxlVGFibGVzKTsKCX0KCn0K