LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJUeXBlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKLyoqCiAqIAogKi8KcHVibGljIGNsYXNzIFNlcnZlclR5cGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVDb21wb3NpdGUgewoJcHJvdGVjdGVkIElTZXJ2ZXJUeXBlIHNlbGVjdGlvbjsKCXByb3RlY3RlZCBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Cglwcm90ZWN0ZWQgU2VydmVyVHlwZVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwoJcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbFNlbGVjdGlvbiA9IHRydWU7CgkKCXByb3RlY3RlZCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlOwoJCglwcm90ZWN0ZWQgYm9vbGVhbiBpc0xvY2FsaG9zdDsKCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9uczsKCQoJcHVibGljIGludGVyZmFjZSBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgewoJCXB1YmxpYyB2b2lkIHNlcnZlclR5cGVTZWxlY3RlZChJU2VydmVyVHlwZSB0eXBlKTsKCX0KCQoJcHVibGljIFNlcnZlclR5cGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJTW9kdWxlVHlwZSBtb2R1bGVUeXBlLCBTZXJ2ZXJUeXBlU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIyKSB7CgkJc3VwZXIocGFyZW50LCBzdHlsZSk7CgkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyMjsKCQkKCQl0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwoJCgkJY29udGVudFByb3ZpZGVyID0gbmV3IFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyKFNlcnZlclR5cGVUcmVlQ29udGVudFByb3ZpZGVyLlNUWUxFX1ZFTkRPUiwgbW9kdWxlVHlwZSk7CgkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFNlcnZlclR5cGVUcmVlTGFiZWxQcm92aWRlcigpKTsKCQl0cmVlVmlld2VyLnNldElucHV0KEFic3RyYWN0VHJlZUNvbnRlbnRQcm92aWRlci5ST09UKTsKCgkJdHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CgkJCQlPYmplY3Qgb2JqID0gZ2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgewoJCQkJCXNlbGVjdGlvbiA9IChJU2VydmVyVHlwZSkgb2JqOwoJCQkJCXNldERlc2NyaXB0aW9uKHNlbGVjdGlvbi5nZXREZXNjcmlwdGlvbigpKTsKCQkJCX0gZWxzZSB7CgkJCQkJc2VsZWN0aW9uID0gbnVsbDsKCQkJCQlzZXREZXNjcmlwdGlvbigiIik7CgkJCQl9CgkJCQlsaXN0ZW5lci5zZXJ2ZXJUeXBlU2VsZWN0ZWQoc2VsZWN0aW9uKTsKCQkJfQoJCX0pOwoJCQoJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7CgkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewoJCQkJaWYgKGUxIGluc3RhbmNlb2YgSVNlcnZlclR5cGUgJiYgIShlMiBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSkKCQkJCQlyZXR1cm4gMTsKCQkJCWlmICghKGUxIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpICYmIGUyIGluc3RhbmNlb2YgSVNlcnZlclR5cGUpCgkJCQkJcmV0dXJuIC0xOwoJCQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSAmJiBlMiBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSkKCQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7CgkJCQlJU2VydmVyVHlwZSByMSA9IChJU2VydmVyVHlwZSkgZTE7CgkJCQlJU2VydmVyVHlwZSByMiA9IChJU2VydmVyVHlwZSkgZTI7CgkJCQkvKmlmIChyMS5nZXRPcmRlcigpID4gcjIuZ2V0T3JkZXIoKSkKCQkJCQlyZXR1cm4gLTE7CgkJCQllbHNlIGlmIChyMS5nZXRPcmRlcigpIDwgcjIuZ2V0T3JkZXIoKSkKCQkJCQlyZXR1cm4gMTsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ki8KCQkJCXJldHVybiByMS5nZXROYW1lKCkuY29tcGFyZVRvKHIyLmdldE5hbWUoKSk7CgkJCX0KCQl9KTsKCX0KCQoJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwoJCWlmICh2aXNpYmxlICYmIGluaXRpYWxTZWxlY3Rpb24pIHsKCQkJaW5pdGlhbFNlbGVjdGlvbiA9IGZhbHNlOwoJCQlpZiAoY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSAhPSBudWxsKQoJCQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY29udGVudFByb3ZpZGVyLmdldEluaXRpYWxTZWxlY3Rpb24oKSksIHRydWUpOwoJCX0KCX0KCQoJcHVibGljIHZvaWQgc2V0SG9zdChib29sZWFuIG5ld0hvc3QpIHsKCQlpZiAoaXNMb2NhbGhvc3QgPT0gbmV3SG9zdCkKCQkJcmV0dXJuOwoJCQoJCWlzTG9jYWxob3N0ID0gbmV3SG9zdDsKCQlJU2VsZWN0aW9uIHNlbCA9IHRyZWVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CgkJY29udGVudFByb3ZpZGVyLnNldExvY2FsaG9zdChpc0xvY2FsaG9zdCk7CgkJdHJlZVZpZXdlci5yZWZyZXNoKCk7CgkJLy90cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7CgkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKCX0KCQoJcHVibGljIHZvaWQgc2V0SW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKGJvb2xlYW4gYikgewoJCWluY2x1ZGVJbmNvbXBhdGlibGVWZXJzaW9ucyA9IGI7CgkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwoJCWNvbnRlbnRQcm92aWRlci5zZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoYik7CgkJdHJlZVZpZXdlci5yZWZyZXNoKCk7CgkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKCX0KCglwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uTGFiZWwoKSB7CgkJcmV0dXJuIG51bGw7IC8vU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVzZXJ2ZXJUeXBlQ29tcERlc2NyaXB0aW9uIik7Cgl9CgoJcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZUxhYmVsKCkgewoJCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXNlcnZlclR5cGVDb21wRGVzY3JpcHRpb24iKTsKCX0KCglwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tYm9PcHRpb25zKCkgewoJCXJldHVybiBuZXcgU3RyaW5nW10geyBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJW5hbWUiKSwKCQkJU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2ZW5kb3IiKSwgU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2ZXJzaW9uIiksCgkJCVNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlbW9kdWxlU3VwcG9ydCIpIH07Cgl9CgoJcHJvdGVjdGVkIHZvaWQgdmlld09wdGlvblNlbGVjdGVkKGJ5dGUgb3B0aW9uKSB7CgkJSVNlbGVjdGlvbiBzZWwgPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwoJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTZXJ2ZXJUeXBlVHJlZUNvbnRlbnRQcm92aWRlcihvcHRpb24sIG1vZHVsZVR5cGUpOwoJCWNvbnRlbnRQcm92aWRlci5zZXRMb2NhbGhvc3QoaXNMb2NhbGhvc3QpOwoJCWNvbnRlbnRQcm92aWRlci5zZXRJbmNsdWRlSW5jb21wYXRpYmxlVmVyc2lvbnMoaW5jbHVkZUluY29tcGF0aWJsZVZlcnNpb25zKTsKCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwoJCXRyZWVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCk7Cgl9CgoJcHVibGljIElTZXJ2ZXJUeXBlIGdldFNlbGVjdGVkU2VydmVyVHlwZSgpIHsKCQlyZXR1cm4gc2VsZWN0aW9uOwoJfQp9