LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwud2l6YXJkLnBhZ2U7CgppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlclR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuU2VydmVyUHJlZmVyZW5jZXM7Ci8qKgogKiBBIGhlbHBlciBjbGFzcyB1c2VkIHRvIGNhY2hlIHRoZSBjcmVhdGlvbiBvZiBzZXJ2ZXIgZWxlbWVudHMuCiAqLwpwdWJsaWMgY2xhc3MgRWxlbWVudENyZWF0aW9uQ2FjaGUgewoJcHJvdGVjdGVkIE1hcCBlbGVtZW50Q2FjaGU7Cglwcm90ZWN0ZWQgTWFwIHRhc2tDYWNoZTsKCgkvKioKCSAqIEVsZW1lbnRDcmVhdGlvbkNhY2hlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBFbGVtZW50Q3JlYXRpb25DYWNoZSgpIHsKCQlzdXBlcigpOwoJCWVsZW1lbnRDYWNoZSA9IG5ldyBIYXNoTWFwKCk7CgkJdGFza0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm4gdGhlIGtleSB0byB1c2UgZm9yIHRoZSBnaXZlbiBmYWN0b3J5LgoJICoKCSAqIEBwYXJhbSB0eXBlIHRoZSBzZXJ2ZXIgdHlwZQoJICogQHBhcmFtIGhvc3QgdGhlIHNlcnZlciBob3N0CgkgKiBAcmV0dXJuIHRoZSBrZXkKCSAqLwoJcHJvdGVjdGVkIFN0cmluZyBnZXRLZXkoSVNlcnZlclR5cGUgdHlwZSwgU3RyaW5nIGhvc3QpIHsKCQlyZXR1cm4gdHlwZS5nZXRJZCgpICsgInwiICsgaG9zdCArICJ8IjsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBzZXJ2ZXIuIAoJICoKCSAqIEBwYXJhbSB0eXBlCgkgKiBAcGFyYW0gaG9zdCBhIGhvc3RuYW1lIG9yIElQCgkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IKCSAqIEByZXR1cm4gYSBzZXJ2ZXIgd29ya2luZyBjb3B5CgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW55dGhpbmcgZ29lcyB3cm9uZwoJICovCglwdWJsaWMgSVNlcnZlcldvcmtpbmdDb3B5IGdldFNlcnZlcihJU2VydmVyVHlwZSB0eXBlLCBTdHJpbmcgaG9zdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJdHJ5IHsKCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlciA9IGdldENhY2hlZFNlcnZlcih0eXBlLCBob3N0KTsKCQkJaWYgKHNlcnZlciAhPSBudWxsKQoJCQkJcmV0dXJuIHNlcnZlcjsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkKCQl0cnkgewoJCQlJRmlsZSBmaWxlID0gbnVsbDsKCQkJaWYgKFNlcnZlclByZWZlcmVuY2VzLmdldEluc3RhbmNlKCkuaXNDcmVhdGVSZXNvdXJjZXNJbldvcmtzcGFjZSgpKQoJCQkJZmlsZSA9IFNlcnZlclV0aWwuZ2V0VW51c2VkU2VydmVyRmlsZShXaXphcmRVdGlsLmdldFNlcnZlclByb2plY3QoKSwgdHlwZSk7CgkJCQoJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gdHlwZS5jcmVhdGVTZXJ2ZXIobnVsbCwgZmlsZSwgKElSdW50aW1lKW51bGwsIG1vbml0b3IpOwoJCQllbGVtZW50Q2FjaGUucHV0KGdldEtleSh0eXBlLCBob3N0KSwgc2VydmVyKTsKCQkJcmV0dXJuIHNlcnZlcjsKCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CgkJCXRocm93IGNlOwoJCX0KCX0KCgkvKioKCSAqIFJldHVybnMgYSBjYWNoZWQgc2VydmVyIHJlc291cmNlLiAKCSAqCgkgKiBAcGFyYW0gdHlwZSB0aGUgc2VydmVyIHR5cGUKCSAqIEBwYXJhbSBob3N0IGEgaG9zdG5hbWUgb3IgSVAKCSAqIEByZXR1cm4gYSB3b3JraW5nIGNvcHkKCSAqLwoJcHVibGljIElTZXJ2ZXJXb3JraW5nQ29weSBnZXRDYWNoZWRTZXJ2ZXIoSVNlcnZlclR5cGUgdHlwZSwgU3RyaW5nIGhvc3QpIHsKCQl0cnkgewoJCQlJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgZWxlbWVudENhY2hlLmdldChnZXRLZXkodHlwZSwgaG9zdCkpOwoJCQlpZiAoc2VydmVyICE9IG51bGwpCgkJCQlyZXR1cm4gc2VydmVyOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCgkJcmV0dXJuIG51bGw7Cgl9Cn0=