LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwppbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk1hcDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JRWxlbWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JRWxlbWVudFdvcmtpbmdDb3B5OwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlIZWxwZXIgewoJcHJvdGVjdGVkIEJhc2UgYmFzZTsKCXByb3RlY3RlZCBib29sZWFuIGlzRGlydHk7CgkKCS8vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMKCXByaXZhdGUgdHJhbnNpZW50IExpc3QgcHJvcGVydHlMaXN0ZW5lcnM7CgoJcHVibGljIFdvcmtpbmdDb3B5SGVscGVyKEJhc2UgYmFzZSkgewoJCXRoaXMuYmFzZSA9IGJhc2U7Cgl9CgoJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgdmFsdWUpIHsKCQlpbnQgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIDApOwoJCWlmIChjdXJyZW50ICE9IDAgJiYgY3VycmVudCA9PSB2YWx1ZSkKCQkJcmV0dXJuOwoKCQlpc0RpcnR5ID0gdHJ1ZTsKCQliYXNlLm1hcC5wdXQoYXR0cmlidXRlTmFtZSwgSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwoJCWZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KGF0dHJpYnV0ZU5hbWUsIG5ldyBJbnRlZ2VyKGN1cnJlbnQpLCBuZXcgSW50ZWdlcih2YWx1ZSkpOwoJfQoKCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgYm9vbGVhbiB2YWx1ZSkgewoJCWJvb2xlYW4gY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIGZhbHNlKTsKCgkJaXNEaXJ0eSA9IHRydWU7CgkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsKCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBuZXcgQm9vbGVhbihjdXJyZW50KSwgbmV3IEJvb2xlYW4odmFsdWUpKTsKCX0KCQoJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgdmFsdWUpIHsKCQlTdHJpbmcgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIChTdHJpbmcpbnVsbCk7CgkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmVxdWFscyh2YWx1ZSkpCgkJCXJldHVybjsKCgkJaXNEaXJ0eSA9IHRydWU7CgkJaWYgKHZhbHVlID09IG51bGwpCgkJCWJhc2UubWFwLnJlbW92ZShhdHRyaWJ1dGVOYW1lKTsKCQllbHNlCgkJCWJhc2UubWFwLnB1dChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7CgkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgY3VycmVudCwgdmFsdWUpOwoJfQoJCglwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIExpc3QgdmFsdWUpIHsKCQlMaXN0IGN1cnJlbnQgPSBiYXNlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAoTGlzdCludWxsKTsKCQlpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZXF1YWxzKHZhbHVlKSkKCQkJcmV0dXJuOwoKCQlpc0RpcnR5ID0gdHJ1ZTsKCQlpZiAodmFsdWUgPT0gbnVsbCkKCQkJYmFzZS5tYXAucmVtb3ZlKGF0dHJpYnV0ZU5hbWUpOwoJCWVsc2UKCQkJYmFzZS5tYXAucHV0KGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKCQlmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChhdHRyaWJ1dGVOYW1lLCBjdXJyZW50LCB2YWx1ZSk7Cgl9CgoJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYXAgdmFsdWUpIHsKCQlNYXAgY3VycmVudCA9IGJhc2UuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIChNYXApbnVsbCk7CgkJaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50LmVxdWFscyh2YWx1ZSkpCgkJCXJldHVybjsKCgkJaXNEaXJ0eSA9IHRydWU7CgkJaWYgKHZhbHVlID09IG51bGwpCgkJCWJhc2UubWFwLnJlbW92ZShhdHRyaWJ1dGVOYW1lKTsKCQllbHNlCgkJCWJhc2UubWFwLnB1dChhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7CgkJZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoYXR0cmlidXRlTmFtZSwgY3VycmVudCwgdmFsdWUpOwoJfQoJCglwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CgkJc2V0QXR0cmlidXRlKEJhc2UuUFJPUF9OQU1FLCBuYW1lKTsKCX0KCQoJcHVibGljIHZvaWQgc2V0TG9ja2VkKGJvb2xlYW4gYikgewoJCXNldEF0dHJpYnV0ZShCYXNlLlBST1BfTE9DS0VELCBiKTsKCX0KCglwdWJsaWMgdm9pZCBzZXRQcml2YXRlKGJvb2xlYW4gYikgewoJCXNldEF0dHJpYnV0ZShCYXNlLlBST1BfUFJJVkFURSwgYik7Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weSNpc0RpcnR5KCkKCSAqLwoJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKCQlyZXR1cm4gaXNEaXJ0eTsKCX0KCQoJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUaW1lc3RhbXAoSUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWlmIChlbGVtZW50ID09IG51bGwpIC8vIG5ld2x5IGNyZWF0ZWQKCQkJcmV0dXJuOwoKCQlpZiAoYmFzZS5nZXRUaW1lc3RhbXAoKSAhPSBlbGVtZW50LmdldFRpbWVzdGFtcCgpKQoJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIElFbGVtZW50V29ya2luZ0NvcHkuVElNRVNUQU1QX0VSUk9SLCBTZXJ2ZXJQbHVnaW4uZ2V0UmVzb3VyY2UoIiVlcnJvcldvcmtpbmdDb3B5VGltZXN0YW1wIiksIG51bGwpKTsKCX0KCgkvKioKCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewoJCWlmIChwcm9wZXJ0eUxpc3RlbmVycyA9PSBudWxsKQoJCQlwcm9wZXJ0eUxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoMik7CgkJcHJvcGVydHlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewoJCWlmIChwcm9wZXJ0eUxpc3RlbmVycyAhPSBudWxsKQoJCQlwcm9wZXJ0eUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwoJfQoJCgkvKioKCSAqIEZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCgkgKi8KCXB1YmxpYyB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7CgkJaWYgKHByb3BlcnR5TGlzdGVuZXJzID09IG51bGwpCgkJCXJldHVybjsKCQoJCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7CgkJdHJ5IHsKCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9wZXJ0eUxpc3RlbmVycy5pdGVyYXRvcigpOwoJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCQl0cnkgewoJCQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwoJCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJVHJhY2UudHJhY2UoIkVycm9yIGZpcmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQiLCBlKTsKCQkJCX0KCQkJfQoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKCJFcnJvciBpbiBwcm9wZXJ0eSBldmVudCIsIGUpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIHZvaWQgc2V0RGlydHkoYm9vbGVhbiBkaXJ0eSkgewoJCWlzRGlydHkgPSBkaXJ0eTsKCX0KfQ==