LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnVpLmludGVybmFsLmVkaXRvcjsKCmltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CmltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7CgppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5JVG9tY2F0U2VydmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5JVG9tY2F0U2VydmVyV29ya2luZ0NvcHk7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQuU2V0RGVidWdNb2RlQ29tbWFuZDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LmNvcmUuaW50ZXJuYWwuY29tbWFuZC5TZXRTZWN1cmVDb21tYW5kOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5pbnRlcm5hbC5jb21tYW5kLlNldFRlc3RFbnZpcm9ubWVudENvbW1hbmQ7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC51aS5pbnRlcm5hbC5Db250ZXh0SWRzOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQudWkuaW50ZXJuYWwuVG9tY2F0VUlQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IuKjsKLyoqCiAqIFRvbWNhdCBzZXJ2ZXIgZ2VuZXJhbCBlZGl0b3IgcGFnZS4KICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewoJcHJvdGVjdGVkIElUb21jYXRTZXJ2ZXJXb3JraW5nQ29weSB0b21jYXRTZXJ2ZXI7CgoJcHJvdGVjdGVkIEJ1dHRvbiBzZWN1cmU7Cglwcm90ZWN0ZWQgQnV0dG9uIGRlYnVnOwoJcHJvdGVjdGVkIEJ1dHRvbiB0ZXN0RW52aXJvbm1lbnQ7Cglwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKCglwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKCgkvKioKCSAqIFNlcnZlckdlbmVyYWxFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXByb3RlY3RlZCBTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbigpIHsKCQkvLyBkbyBub3RoaW5nCgl9CgoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoKSB7CgkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewoJCQkJaWYgKHVwZGF0aW5nKQoJCQkJCXJldHVybjsKCQkJCXVwZGF0aW5nID0gdHJ1ZTsKCQkJCWlmIChJVG9tY2F0U2VydmVyLlBST1BFUlRZX1NFQ1VSRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CgkJCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCk7CgkJCQkJU2VydmVyR2VuZXJhbEVkaXRvclNlY3Rpb24udGhpcy5zZWN1cmUuc2V0U2VsZWN0aW9uKGIuYm9vbGVhblZhbHVlKCkpOwoJCQkJfSBlbHNlIGlmIChJVG9tY2F0U2VydmVyLlBST1BFUlRZX0RFQlVHLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLmRlYnVnLnNldFNlbGVjdGlvbihiLmJvb2xlYW5WYWx1ZSgpKTsKCQkJCX0gZWxzZSBpZiAoSVRvbWNhdFNlcnZlci5QUk9QRVJUWV9URVNUX0VOVklST05NRU5ULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKCQkJCQlTZXJ2ZXJHZW5lcmFsRWRpdG9yU2VjdGlvbi50aGlzLnRlc3RFbnZpcm9ubWVudC5zZXRTZWxlY3Rpb24oYi5ib29sZWFuVmFsdWUoKSk7CgkJCQl9CgkJCQl1cGRhdGluZyA9IGZhbHNlOwoJCQl9CgkJfTsKCQlzZXJ2ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Cgl9CgkKCS8qKgoJICogQ3JlYXRlcyB0aGUgU1dUIGNvbnRyb2xzIGZvciB0aGlzIHdvcmtiZW5jaCBwYXJ0LgoJICoKCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb250cm9sCgkgKi8KCXB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewoJCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7CgkJCgkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFfEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUR8RXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVJ8U2VjdGlvbi5ERVNDUklQVElPTnxFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKCQlzZWN0aW9uLnNldFRleHQoVG9tY2F0VUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVzZXJ2ZXJFZGl0b3JHZW5lcmFsU2VjdGlvbiIpKTsKCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFRvbWNhdFVJUGx1Z2luLmdldFJlc291cmNlKCIlc2VydmVyRWRpdG9yR2VuZXJhbERlc2NyaXB0aW9uIikpOwoJCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwoKCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CgkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwoJCWxheW91dC5udW1Db2x1bW5zID0gMzsKCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNTsKCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxNTsKCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CgkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1IpOwoJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7CgkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKCQkKCQkvLyB0ZXN0IGVudmlyb25tZW50CgkJdGVzdEVudmlyb25tZW50ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBUb21jYXRVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXNlcnZlckVkaXRvclRlc3RFbnZpcm9ubWVudCIpLCBTV1QuQ0hFQ0spOwoJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKCQl0ZXN0RW52aXJvbm1lbnQuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQl0ZXN0RW52aXJvbm1lbnQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7CgkJCQlpZiAodXBkYXRpbmcpCgkJCQkJcmV0dXJuOwoJCQkJdXBkYXRpbmcgPSB0cnVlOwoJCQkJY29tbWFuZE1hbmFnZXIuZXhlY3V0ZUNvbW1hbmQobmV3IFNldFRlc3RFbnZpcm9ubWVudENvbW1hbmQodG9tY2F0U2VydmVyLCB0ZXN0RW52aXJvbm1lbnQuZ2V0U2VsZWN0aW9uKCkpKTsKCQkJCXVwZGF0aW5nID0gZmFsc2U7CgkJCX0KCQl9KTsKCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAodGVzdEVudmlyb25tZW50LCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfVEVTVF9FTlZJUk9OTUVOVCk7CgoJCS8vIHNlY3VyaXR5CgkJc2VjdXJlID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oY29tcG9zaXRlLCBUb21jYXRVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXNlcnZlckVkaXRvclNlY3VyZSIpLCBTV1QuQ0hFQ0spOwoJCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKCQlzZWN1cmUuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQlzZWN1cmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7CgkJCQlpZiAodXBkYXRpbmcpCgkJCQkJcmV0dXJuOwoJCQkJdXBkYXRpbmcgPSB0cnVlOwoJCQkJY29tbWFuZE1hbmFnZXIuZXhlY3V0ZUNvbW1hbmQobmV3IFNldFNlY3VyZUNvbW1hbmQodG9tY2F0U2VydmVyLCBzZWN1cmUuZ2V0U2VsZWN0aW9uKCkpKTsKCQkJCXVwZGF0aW5nID0gZmFsc2U7CgkJCX0KCQl9KTsKCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoc2VjdXJlLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfU0VDVVJFKTsKCQoJCS8vIGRlYnVnIG1vZGUKCQlkZWJ1ZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgVG9tY2F0VUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVzZXJ2ZXJFZGl0b3JEZWJ1Z01vZGUiKSwgU1dULkNIRUNLKTsKCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CgkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7CgkJZGVidWcuc2V0TGF5b3V0RGF0YShkYXRhKTsKCQlkZWJ1Zy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2UpIHsKCQkJCWlmICh1cGRhdGluZykKCQkJCQlyZXR1cm47CgkJCQl1cGRhdGluZyA9IHRydWU7CgkJCQljb21tYW5kTWFuYWdlci5leGVjdXRlQ29tbWFuZChuZXcgU2V0RGVidWdNb2RlQ29tbWFuZCh0b21jYXRTZXJ2ZXIsIGRlYnVnLmdldFNlbGVjdGlvbigpKSk7CgkJCQl1cGRhdGluZyA9IGZhbHNlOwoJCQl9CgkJfSk7CgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKGRlYnVnLCBDb250ZXh0SWRzLlNFUlZFUl9FRElUT1JfREVCVUdfTU9ERSk7CgkKCQlpbml0aWFsaXplKCk7Cgl9CgoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKCQlpZiAoc2VydmVyICE9IG51bGwpCgkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCglwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewoJCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwoJCQoJCWlmIChzZXJ2ZXIgIT0gbnVsbCkgewoJCQl0b21jYXRTZXJ2ZXIgPSAoSVRvbWNhdFNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIuZ2V0QWRhcHRlcihJVG9tY2F0U2VydmVyV29ya2luZ0NvcHkuY2xhc3MpOwoJCQlhZGRDaGFuZ2VMaXN0ZW5lcigpOwoJCX0KCQlpbml0aWFsaXplKCk7Cgl9CgoJLyoqCgkgKiBJbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhpcyBlZGl0b3IuCgkgKi8KCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CgkJaWYgKHNlY3VyZSA9PSBudWxsIHx8IHRvbWNhdFNlcnZlciA9PSBudWxsKQoJCQlyZXR1cm47CgkJdXBkYXRpbmcgPSB0cnVlOwoKCQl0ZXN0RW52aXJvbm1lbnQuc2V0U2VsZWN0aW9uKHRvbWNhdFNlcnZlci5pc1Rlc3RFbnZpcm9ubWVudCgpKTsKCQlzZWN1cmUuc2V0U2VsZWN0aW9uKHRvbWNhdFNlcnZlci5pc1NlY3VyZSgpKTsKCQlpZiAoc2VydmVyLmdldFJ1bnRpbWUoKSAhPSBudWxsICYmIHNlcnZlci5nZXRSdW50aW1lKCkuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLmluZGV4T2YoIjMyIikgPj0gMCB8fCByZWFkT25seSkKCQkJZGVidWcuc2V0RW5hYmxlZChmYWxzZSk7CgkJZWxzZSB7CgkJCWRlYnVnLnNldEVuYWJsZWQodHJ1ZSk7CgkJCWRlYnVnLnNldFNlbGVjdGlvbih0b21jYXRTZXJ2ZXIuaXNEZWJ1ZygpKTsKCQl9CgkJCgkJaWYgKHJlYWRPbmx5KQoJCQlzZWN1cmUuc2V0RW5hYmxlZChmYWxzZSk7CgkJZWxzZQoJCQlzZWN1cmUuc2V0RW5hYmxlZCh0cnVlKTsKCQkKCQl1cGRhdGluZyA9IGZhbHNlOwoJfQp9