LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7CgppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuSUNsaWVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlDb3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS53aXphcmQuSVdpemFyZEhhbmRsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci8qKgogKiBBIHdpemFyZCBwYWdlIHVzZWQgdG8gc2VsZWN0IGEgc2VydmVyIGNsaWVudC4KICovCnB1YmxpYyBjbGFzcyBTZWxlY3RDbGllbnRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewoJcHJvdGVjdGVkIElXaXphcmRIYW5kbGUgd2l6YXJkOwoKCS8vIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIHNlbGVjdCBmcm9tCglwcm90ZWN0ZWQgSUNsaWVudFtdIGNsaWVudHM7CgoJLy8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50Cglwcm90ZWN0ZWQgSUNsaWVudCBzZWxlY3RlZENsaWVudDsKCgkvLyB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgZWxlbWVudHMKCXByb3RlY3RlZCBUYWJsZSBlbGVtZW50VGFibGU7CgoJLy8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBjbGllbnQKCXByb3RlY3RlZCBMYWJlbCBkZXNjcmlwdGlvbjsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBTZWxlY3RDbGllbnRDb21wb3NpdGUuCgkgKiAKCSAqIEBwYXJhbSBwYXJlbnQgYSBwYXJlbnQgY29tcG9zaXRlCgkgKiBAcGFyYW0gd2l6YXJkIGEgd2l6YXJkIGhhbmRsZQoJICogQHBhcmFtIGNsaWVudHMgYW4gYXJyYXkgb2YgY2xpZW50cwoJICovCglwdWJsaWMgU2VsZWN0Q2xpZW50Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBJQ2xpZW50W10gY2xpZW50cykgewoJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwoJCXRoaXMud2l6YXJkID0gd2l6YXJkOwoJCXRoaXMuY2xpZW50cyA9IGNsaWVudHM7CgkKCQl3aXphcmQuc2V0VGl0bGUoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpTZWxlY3RDbGllbnRUaXRsZSIpKTsKCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV3aXpTZWxlY3RDbGllbnREZXNjcmlwdGlvbiIpKTsKCQl3aXphcmQuc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX1dJWkJBTl9TRUxFQ1RfU0VSVkVSX0NMSUVOVCkpOwoJCQoJCWNyZWF0ZUNvbnRyb2woKTsKCX0KCgkvKioKCSAqIENsZWFycyB0aGUgc2VsZWN0ZWQgY2xpZW50LgoJICovCglwdWJsaWMgdm9pZCBjbGVhclNlbGVjdGVkQ2xpZW50KCkgewoJCXNlbGVjdGVkQ2xpZW50ID0gbnVsbDsKCX0KCgkvKioKCSAqIENyZWF0ZXMgdGhlIFVJIG9mIHRoZSBwYWdlLgoJICovCglwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250cm9sKCkgewoJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHRoaXMsIDQpOwoJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBTV1RVdGlsLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyh0aGlzLCA0KTsKCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwoJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwoJCXNldExheW91dChsYXlvdXQpOwoKCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKCQl3aHMuc2V0SGVscCh0aGlzLCBDb250ZXh0SWRzLlNFTEVDVF9DTElFTlRfV0laQVJEKTsKCQoJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5XUkFQKTsKCQlsYWJlbC5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIld2l6U2VsZWN0Q2xpZW50TWVzc2FnZSIpKTsKCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CgkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQoJCWVsZW1lbnRUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CgkJZGF0YS5oZWlnaHRIaW50ID0gODA7CgkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7CgkJZWxlbWVudFRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CgkJZWxlbWVudFRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewoJCQkJaGFuZGxlU2VsZWN0aW9uKCk7CgkJCX0KCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKCQkJCWhhbmRsZVNlbGVjdGlvbigpOwoJCQkJLy9UT0RPOiBXaXphcmRVdGlsLmRlZmF1bHRTZWxlY3QoZ2V0V2l6YXJkKCksIFNlbGVjdENsaWVudFdpemFyZFBhZ2UudGhpcyk7CgkJCX0KCQl9KTsKCQl3aHMuc2V0SGVscChlbGVtZW50VGFibGUsIENvbnRleHRJZHMuU0VMRUNUX0NMSUVOVCk7CgkKCQlpZiAoY2xpZW50cyAhPSBudWxsKSB7CgkJCWludCBzaXplID0gY2xpZW50cy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0oZWxlbWVudFRhYmxlLCBTV1QuTk9ORSk7CgkJCQlpdGVtLnNldFRleHQoMCwgU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRUZXh0KGNsaWVudHNbaV0pKTsKCQkJCWl0ZW0uc2V0SW1hZ2UoMCwgU2VydmVyVUlDb3JlLmdldExhYmVsUHJvdmlkZXIoKS5nZXRJbWFnZShjbGllbnRzW2ldKSk7CgkJCQlpdGVtLnNldERhdGEoY2xpZW50c1tpXSk7CgkJCX0KCQl9CgkKCQlkZXNjcmlwdGlvbiA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuV1JBUCk7CgkJZGVzY3JpcHRpb24uc2V0VGV4dCgiIik7CgkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwoJCWRhdGEuaGVpZ2h0SGludCA9IDcwOwoJCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEoZGF0YSk7CgkKCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOwoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSBzZWxlY3RlZCBjbGllbnQuCgkgKgoJICogQHJldHVybiBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSUNsaWVudAoJICovCglwdWJsaWMgSUNsaWVudCBnZXRTZWxlY3RlZENsaWVudCgpIHsKCQlyZXR1cm4gc2VsZWN0ZWRDbGllbnQ7Cgl9CgoJLyoqCgkgKiBIYW5kbGUgdGhlIHNlbGVjdGlvbiBvZiBhIGNsaWVudC4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKCkgewoJCWludCBpbmRleCA9IGVsZW1lbnRUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwoJCWlmIChpbmRleCA8IDApCgkJCXNlbGVjdGVkQ2xpZW50ID0gbnVsbDsKCQllbHNlCgkJCXNlbGVjdGVkQ2xpZW50ID0gY2xpZW50c1tpbmRleF07CgkJCgkJaWYgKHNlbGVjdGVkQ2xpZW50ICE9IG51bGwpCgkJCXdpemFyZC5zZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7CgkJZWxzZQoJCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CgkKCQlTdHJpbmcgZGVzYyA9IG51bGw7CgkJaWYgKHNlbGVjdGVkQ2xpZW50ICE9IG51bGwpCgkJCWRlc2MgPSBzZWxlY3RlZENsaWVudC5nZXREZXNjcmlwdGlvbigpOwoJCWlmIChkZXNjID09IG51bGwpCgkJCWRlc2MgPSAiIjsKCQlkZXNjcmlwdGlvbi5zZXRUZXh0KGRlc2MpOwoJCgkJd2l6YXJkLnVwZGF0ZSgpOwoJfQp9