LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5lZGl0b3I7CgppbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwppbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuSVRvbWNhdFNlcnZlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuVG9tY2F0U2VydmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldERlYnVnTW9kZUNvbW1hbmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuU2V0U2VjdXJlQ29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5TZXRUZXN0RW52aXJvbm1lbnRDb21tYW5kOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuQ29udGV4dElkczsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLlRvbWNhdFVJUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwppbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLyoqCiAqIFRvbWNhdCBzZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewoJcHJvdGVjdGVkIFRvbWNhdFNlcnZlciB0b21jYXRTZXJ2ZXI7CgoJcHJvdGVjdGVkIEJ1dHRvbiBzZWN1cmU7Cglwcm90ZWN0ZWQgQnV0dG9uIGRlYnVnOwoJcHJvdGVjdGVkIEJ1dHRvbiB0ZXN0RW52aXJvbm1lbnQ7Cglwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKCglwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKCgkvKioKCSAqIFNlcnZlckdlbmVyYWxFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXByb3RlY3RlZCBTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbigpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7CgkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewoJCQkJaWYgKHVwZGF0aW5nKQoJCQkJCXJldHVybjsKCQkJCXVwZGF0aW5nID0gdHJ1ZTsKCQkJCWlmIChUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfU0VDVVJFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLnNlY3VyZS5zZXRTZWxlY3Rpb24oYi5ib29sZWFuVmFsdWUoKSk7CgkJCQl9IGVsc2UgaWYgKFRvbWNhdFNlcnZlci5QUk9QRVJUWV9ERUJVRy5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CgkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7CgkJCQkJU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24udGhpcy5kZWJ1Zy5zZXRTZWxlY3Rpb24oYi5ib29sZWFuVmFsdWUoKSk7CgkJCQl9IGVsc2UgaWYgKElUb21jYXRTZXJ2ZXIuUFJPUEVSVFlfVEVTVF9FTlZJUk9OTUVOVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CgkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7CgkJCQkJU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24udGhpcy50ZXN0RW52aXJvbm1lbnQuc2V0U2VsZWN0aW9uKGIuYm9vbGVhblZhbHVlKCkpOwoJCQkJfQoJCQkJdXBkYXRpbmcgPSBmYWxzZTsKCQkJfQoJCX07CgkJc2VydmVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoJCgkvKioKCSAqIENyZWF0ZXMgdGhlIFNXVCBjb250cm9scyBmb3IgdGhpcyB3b3JrYmVuY2ggcGFydC4KCSAqCgkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAoJICovCglwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKCQlzdXBlci5jcmVhdGVTZWN0aW9uKHBhcmVudCk7CgkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwoJCQoJCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQKCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKCQlzZWN0aW9uLnNldFRleHQoVG9tY2F0VUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVzZXJ2ZXJFZGl0b3JHZW5lcmFsU2VjdGlvbiIpKTsKCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlc2VydmVyRWRpdG9yR2VuZXJhbERlc2NyaXB0aW9uIikpOwoJCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwoKCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CgkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCWxheW91dC5udW1Db2x1bW5zID0gMzsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CgkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKCQlJV29ya2JlbmNoSGVscFN5c3RlbSB3aHMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKCQl3aHMuc2V0SGVscChjb21wb3NpdGUsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUik7CgkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwoJCQoJCS8vIHRlc3QgZW52aXJvbm1lbnQKCQl0ZXN0RW52aXJvbm1lbnQgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlc2VydmVyRWRpdG9yVGVzdEVudmlyb25tZW50IiksIFNXVC5DSEVDSyk7CgkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwoJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwoJCXRlc3RFbnZpcm9ubWVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwoJCXRlc3RFbnZpcm9ubWVudC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKCQkJCWlmICh1cGRhdGluZykKCQkJCQlyZXR1cm47CgkJCQl1cGRhdGluZyA9IHRydWU7CgkJCQljb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChuZXcgU2V0VGVzdEVudmlyb25tZW50Q29tbWFuZCh0b21jYXRTZXJ2ZXIsIHRlc3RFbnZpcm9ubWVudC5nZXRTZWxlY3Rpb24oKSkpOwoJCQkJdXBkYXRpbmcgPSBmYWxzZTsKCQkJfQoJCX0pOwoJCXdocy5zZXRIZWxwKHRlc3RFbnZpcm9ubWVudCwgQ29udGV4dElkcy5TRVJWRVJfRURJVE9SX1RFU1RfRU5WSVJPTk1FTlQpOwoKCQkvLyBzZWN1cml0eQoJCXNlY3VyZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgVG9tY2F0VUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVzZXJ2ZXJFZGl0b3JTZWN1cmUiKSwgU1dULkNIRUNLKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CgkJc2VjdXJlLnNldExheW91dERhdGEoZGF0YSk7CgkJc2VjdXJlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewoJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewoJCQkJaWYgKHVwZGF0aW5nKQoJCQkJCXJldHVybjsKCQkJCXVwZGF0aW5nID0gdHJ1ZTsKCQkJCWNvbW1hbmRNYW5hZ2VyLmV4ZWN1dGVDb21tYW5kKG5ldyBTZXRTZWN1cmVDb21tYW5kKHRvbWNhdFNlcnZlciwgc2VjdXJlLmdldFNlbGVjdGlvbigpKSk7CgkJCQl1cGRhdGluZyA9IGZhbHNlOwoJCQl9CgkJfSk7CgkJd2hzLnNldEhlbHAoc2VjdXJlLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfU0VDVVJFKTsKCQoJCS8vIGRlYnVnIG1vZGUKCQlkZWJ1ZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgVG9tY2F0VUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVzZXJ2ZXJFZGl0b3JEZWJ1Z01vZGUiKSwgU1dULkNIRUNLKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CgkJZGVidWcuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQlkZWJ1Zy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKCQkJCWlmICh1cGRhdGluZykKCQkJCQlyZXR1cm47CgkJCQl1cGRhdGluZyA9IHRydWU7CgkJCQljb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChuZXcgU2V0RGVidWdNb2RlQ29tbWFuZCh0b21jYXRTZXJ2ZXIsIGRlYnVnLmdldFNlbGVjdGlvbigpKSk7CgkJCQl1cGRhdGluZyA9IGZhbHNlOwoJCQl9CgkJfSk7CgkJd2hzLnNldEhlbHAoZGVidWcsIENvbnRleHRJZHMuU0VSVkVSX0VESVRPUl9ERUJVR19NT0RFKTsKCQoJCWluaXRpYWxpemUoKTsKCX0KCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCWlmIChzZXJ2ZXIgIT0gbnVsbCkKCQkJc2VydmVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwoJfQoKCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7CgkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7CgkJCgkJaWYgKHNlcnZlciAhPSBudWxsKSB7CgkJCXRvbWNhdFNlcnZlciA9IChUb21jYXRTZXJ2ZXIpIHNlcnZlci5nZXRBZGFwdGVyKFRvbWNhdFNlcnZlci5jbGFzcyk7CgkJCWFkZENoYW5nZUxpc3RlbmVyKCk7CgkJfQoJCWluaXRpYWxpemUoKTsKCX0KCgkvKioKCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKCQlpZiAoc2VjdXJlID09IG51bGwgfHwgdG9tY2F0U2VydmVyID09IG51bGwpCgkJCXJldHVybjsKCQl1cGRhdGluZyA9IHRydWU7CgoJCXRlc3RFbnZpcm9ubWVudC5zZXRTZWxlY3Rpb24odG9tY2F0U2VydmVyLmlzVGVzdEVudmlyb25tZW50KCkpOwoJCXNlY3VyZS5zZXRTZWxlY3Rpb24odG9tY2F0U2VydmVyLmlzU2VjdXJlKCkpOwoJCWlmIChzZXJ2ZXIuZ2V0UnVudGltZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkuaW5kZXhPZigiMzIiKSA+PSAwIHx8IHJlYWRPbmx5KQoJCQlkZWJ1Zy5zZXRFbmFibGVkKGZhbHNlKTsKCQllbHNlIHsKCQkJZGVidWcuc2V0RW5hYmxlZCh0cnVlKTsKCQkJZGVidWcuc2V0U2VsZWN0aW9uKHRvbWNhdFNlcnZlci5pc0RlYnVnKCkpOwoJCX0KCQkKCQlpZiAocmVhZE9ubHkpCgkJCXNlY3VyZS5zZXRFbmFibGVkKGZhbHNlKTsKCQllbHNlCgkJCXNlY3VyZS5zZXRFbmFibGVkKHRydWUpOwoJCQoJCXVwZGF0aW5nID0gZmFsc2U7Cgl9Cn0=