LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwppbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZTsKLyoqCiAqIEEgbGFiZWwgcHJvdmlkZXIgZm9yIGFsbCBzZXJ2ZXIgcmVsYXRlZCBvYmplY3RzLgogKi8KcHVibGljIGNsYXNzIFNlcnZlckxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CglwdWJsaWMgU2VydmVyTGFiZWxQcm92aWRlcigpIHsgfQoKCXByb3RlY3RlZCBJbWFnZSBnZXRNb2R1bGVJbWFnZShTdHJpbmcgdHlwZUlkKSB7CgkJaWYgKHR5cGVJZCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCgkJSW1hZ2UgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKHR5cGVJZCk7CgkJaW50IGluZCA9IHR5cGVJZC5pbmRleE9mKCIuIik7CgkJd2hpbGUgKGltYWdlID09IG51bGwgJiYgaW5kID49IDApIHsKCQkJdHlwZUlkID0gdHlwZUlkLnN1YnN0cmluZygwLCBpbmQpOwoJCQlpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZUlkKTsKCQl9CgkJcmV0dXJuIGltYWdlOwoJfQoJCglwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgdHlwZUlkKSB7CgkJaWYgKHR5cGVJZCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQkKCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwoJCWludCBpbmQgPSB0eXBlSWQuaW5kZXhPZigiLiIpOwoJCXdoaWxlIChpbWFnZSA9PSBudWxsICYmIGluZCA+PSAwKSB7CgkJCXR5cGVJZCA9IHR5cGVJZC5zdWJzdHJpbmcoMCwgaW5kKTsKCQkJaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwoJCX0KCQlyZXR1cm4gaW1hZ2U7Cgl9CgoJLyoKCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQoJICovCglwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgZWxlbWVudCkgewoJCXRyeSB7CgkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlKSB7CgkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHJ1bnRpbWVUeXBlLmdldElkKCkpOwoJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSkgewoJCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7CgkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHNlcnZlclR5cGUuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3Ioc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKSB7CgkJCQlJU2VydmVyQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IChJU2VydmVyQ29uZmlndXJhdGlvblR5cGUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoY29uZmlnVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckNvbmZpZ3VyYXRpb24pIHsKCQkJCUlTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IChJU2VydmVyQ29uZmlndXJhdGlvbikgZWxlbWVudDsKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihjb25maWcuZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgewoJCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKCQkJCXJldHVybiBnZXRNb2R1bGVJbWFnZURlc2NyaXB0b3IobW9kdWxlLmdldFR5cGUoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKSB7CgkJCQlyZXR1cm4gKChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwpOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBpbWFnZSBkZXNjcmlwdG9yIiwgZSk7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qCgkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKCSAqLwoJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CgkJdHJ5IHsKCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUpIHsKCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7CgkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewoJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCgkJCQkJcmV0dXJuIG51bGw7CgkJCQllbHNlCgkJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKSB7CgkJCQlJU2VydmVyQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IChJU2VydmVyQ29uZmlndXJhdGlvblR5cGUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShjb25maWdUeXBlLmdldElkKCkpOwoJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyQ29uZmlndXJhdGlvbikgewoJCQkJSVNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gKElTZXJ2ZXJDb25maWd1cmF0aW9uKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoY29uZmlnLmdldFNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKCkuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gZ2V0TW9kdWxlSW1hZ2UobW9kdWxlLmdldFR5cGUoKSk7CgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgZ2V0IGltYWdlIGRlc2NyaXB0b3IiLCBlKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIHMpIHsKCQlpZiAocyA9PSBudWxsKQoJCQlyZXR1cm4gIiI7CgkJZWxzZQoJCQlyZXR1cm4gczsKCX0KCgkvKgoJICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CgkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKCQkJcmV0dXJuICIiOwoKCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFbGVtZW50KSB7CgkJCXJldHVybiBnZXRTdHJpbmcoKChJRWxlbWVudCkgZWxlbWVudCkuZ2V0TmFtZSgpKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKCQkJcmV0dXJuICgoSVJ1bnRpbWVUeXBlKSBlbGVtZW50KS5nZXROYW1lKCk7CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclR5cGUpIHsKCQkJcmV0dXJuICgoSVNlcnZlclR5cGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyQ29uZmlndXJhdGlvblR5cGUpIHsKCQkJcmV0dXJuICgoSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKSBlbGVtZW50KS5nZXROYW1lKCk7CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNsaWVudCkgewoJCQlyZXR1cm4gKChJQ2xpZW50KSBlbGVtZW50KS5nZXROYW1lKCk7CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgewoJCQlyZXR1cm4gKChJTW9kdWxlKSBlbGVtZW50KS5nZXROYW1lKCk7CgkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtiZW5jaEFkYXB0ZXIpIHsKCQkJcmV0dXJuICgoSVdvcmtiZW5jaEFkYXB0ZXIpIGVsZW1lbnQpLmdldExhYmVsKG51bGwpOwoJCX0KCgkJcmV0dXJuICIiOwoJfQoKCS8qCgkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQoJICovCglwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7IH0KCgkvKgoJICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQoJICovCglwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKgoJICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKCSAqLwoJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeyB9CgkKCS8qCgkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKCSAqLwoJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgfQp9Cg==