LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA4IEplc3BlciBTdGVlbiBN+GxsZXIgYW5kIG90aGVycwogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqIEplc3BlciBTdGVlbiBN+GxsZXIgLSBYU0wgY29yZSBwbHVnaW4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2wuY29yZTsKCmltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwppbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwoKLyoqCiAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQogKi8KcHVibGljIGNsYXNzIFhTTENvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewoKCS8vIFRoZSBwbHVnLWluIElECglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhzbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAoKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTTFRfTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIjsgLy8kTk9OLU5MUy0xJAoJCgkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCglwcml2YXRlIHN0YXRpYyBYU0xDb3JlUGx1Z2luIHBsdWdpbjsKCQoJcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBwYXJzZXJUcmFja2VyID0gbnVsbDsKCglwcml2YXRlIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKCgkvKioKCSAqIFRoZSBjb25zdHJ1Y3RvcgoJICovCglwdWJsaWMgWFNMQ29yZVBsdWdpbigpIHsKCX0KCgkvKgoJICogKG5vbi1KYXZhZG9jKQoJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKCSAqLwoJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlzdXBlci5zdGFydChjb250ZXh0KTsKCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsKCQlwbHVnaW4gPSB0aGlzOwoJfQoKCS8qCgkgKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCgkgKi8KCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlwbHVnaW4gPSBudWxsOwoJCXN1cGVyLnN0b3AoY29udGV4dCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKCSAqCgkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKCSAqLwoJcHVibGljIHN0YXRpYyBYU0xDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7CgkJcmV0dXJuIHBsdWdpbjsKCX0KCQoJLyoKCSAqIFJldHVybiB0aGUgcmVnaXN0ZXJlZCBTQVggcGFyc2VyIGZhY3Rvcnkgb3IgbnVsbCBpZiBvbmUKCSAqIGRvZXMgbm90IGV4aXN0LgoJICovCglwdWJsaWMgU0FYUGFyc2VyRmFjdG9yeSBnZXRGYWN0b3J5KCkgewoJCWlmIChwYXJzZXJUcmFja2VyID09IG51bGwpIHsKCQkJcGFyc2VyVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihidW5kbGVDb250ZXh0LCBTQVhQYXJzZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7CgkJCXBhcnNlclRyYWNrZXIub3BlbigpOwoJCX0KCQlTQVhQYXJzZXJGYWN0b3J5IHRoZUZhY3RvcnkgPSAoU0FYUGFyc2VyRmFjdG9yeSkgcGFyc2VyVHJhY2tlci5nZXRTZXJ2aWNlKCk7CgkJaWYgKHRoZUZhY3RvcnkgIT0gbnVsbCkKCQkJdGhlRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKCQlyZXR1cm4gdGhlRmFjdG9yeTsKCX0KCQoJLyoqCgkgKiBMb2dzIHRoZSBzcGVjaWZpZWQgc3RhdHVzIHdpdGggdGhpcyBwbHVnLWluJ3MgbG9nLgoJICogCgkgKiBAcGFyYW0gc3RhdHVzIHN0YXR1cyB0byBsb2cKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewoJCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKCX0KCgkvKioKCSAqIExvZ3MgdGhlIHNwZWNpZmllZCBleGNlcHRpb24uCgkgKiAKCSAqIEBwYXJhbSBlIHRocm93YWJsZSB0byBsb2cgCgkgKi8KCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpIHsKCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKCQkJbG9nKCgoQ29yZUV4Y2VwdGlvbillKS5nZXRTdGF0dXMoKSk7CgkJfSBlbHNlIHsKCQkJbG9nKG5ld0Vycm9yU3RhdHVzKE1lc3NhZ2VzLlhTTENvcmVQbHVnaW5fY29yZUVycm9yLCBlKSk7CgkJfQoJfQoJCgkvKioKCSAqIFJldHVybnMgYSBuZXcgZXJyb3Igc3RhdHVzIGZvciB0aGlzIHBsdWctaW4gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZQoJICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHN0YXR1cwoJICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzdGF0dXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQoJICogQHJldHVybiBhIG5ldyBlcnJvciBzdGF0dXMKCSAqLwoJcHVibGljIHN0YXRpYyBJU3RhdHVzIG5ld0Vycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CgkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBtZXNzYWdlLCBleGNlcHRpb24pOwoJfQp9Cg==