LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKIKAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsKCgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKCgovKioKICogVGhlIG1haW4gcGx1Zy1pbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgogKi8KcHVibGljIGNsYXNzIFdTRExUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbgp7CiAgLy9UaGUgc2hhcmVkIGluc3RhbmNlLgogIHByaXZhdGUgc3RhdGljIFdTRExUZXN0c1BsdWdpbiBwbHVnaW47CgogIC8vUmVzb3VyY2UgYnVuZGxlLgogIHByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7CgogIHByaXZhdGUgc3RhdGljIEJ1bmRsZSBwbHVnaW5CdW5kbGU7CgogIC8qKgogICAqIFRoZSBjb25zdHJ1Y3Rvci4KICAgKi8KICBwdWJsaWMgV1NETFRlc3RzUGx1Z2luKCkKICB7CiAgICBzdXBlcigpOwogICAgcGx1Z2luID0gdGhpczsKICB9CgogIC8qKgogICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgogICAqLwogIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgogIHsKICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOwogICAgcGx1Z2luQnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUoKTsKICB9CgogIC8qKgogICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKICAgKi8KICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbgogIHsKICAgIHN1cGVyLnN0b3AoY29udGV4dCk7CiAgICBwbHVnaW4gPSBudWxsOwogICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwogICAgcGx1Z2luQnVuZGxlID0gY29udGV4dC5nZXRCdW5kbGUoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KICAgKi8KICBwdWJsaWMgc3RhdGljIFdTRExUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkKICB7CiAgICByZXR1cm4gcGx1Z2luOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKICAgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCiAgICovCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkKICB7CiAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXU0RMVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7CiAgICB0cnkKICAgIHsKICAgICAgcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7CiAgICB9CiAgICBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpCiAgICB7CiAgICAgIHJldHVybiBrZXk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCiAgICovCiAgcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkKICB7CiAgICB0cnkKICAgIHsKICAgICAgaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCiAgICAgIHsKICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuV1NETFRlc3RzUGx1Z2luUmVzb3VyY2VzIik7CiAgICAgIH0KICAgIH0KICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkKICAgIHsKICAgICAgcmVzb3VyY2VCdW5kbGUgPSBudWxsOwogICAgfQogICAgcmV0dXJuIHJlc291cmNlQnVuZGxlOwogIH0KCiAgLyoqCiAgICogR2V0IHRoZSBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCiAgICogCiAgICogQHJldHVybiB0aGUgaW5zdGFsbCBVUkwgb2YgdGhpcyBwbHVnLWluCiAgICovCiAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5zdGFsbFVSTCgpCiAgewogICAgdHJ5CiAgICB7CiAgICAgIHJldHVybiBGaWxlTG9jYXRvci5yZXNvbHZlKHBsdWdpbkJ1bmRsZS5nZXRFbnRyeSgiLyIpKS5nZXRGaWxlKCk7CiAgICB9CiAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9Cg==